From 7a50b85ffe64cae76ffe6fffeb7ae2455835476e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jan 2026 17:08:44 +0000 Subject: [PATCH 1/3] Bump the all group with 2 updates Bumps the all group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [actions/setup-node](https://github.com/actions/setup-node). Updates `actions/checkout` from 6.0.1 to 6.0.2 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/8e8c483db84b4bee98b60c0593521ed34d9990e8...de0fac2e4500dabe0009e67214ff5f5447ce83dd) Updates `actions/setup-node` from 6.1.0 to 6.2.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/395ad3262231945c25e8478fd5baf05154b1d79f...6044e13b5dc448c55e2357c09f80417699197238) Bump the all group with 15 updates Bumps the all group with 15 updates: | Package | From | To | | --- | --- | --- | | [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache) | `5.0.1` | `5.0.5` | | [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) | `2.0.1` | `2.0.3` | | [@actions/github](https://github.com/actions/toolkit/tree/HEAD/packages/github) | `6.0.1` | `9.0.0` | | [@actions/glob](https://github.com/actions/toolkit/tree/HEAD/packages/glob) | `0.5.0` | `0.5.1` | | [@actions/http-client](https://github.com/actions/toolkit/tree/HEAD/packages/http-client) | `3.0.0` | `3.0.2` | | [@actions/tool-cache](https://github.com/actions/toolkit/tree/HEAD/packages/tool-cache) | `2.0.2` | `3.0.1` | | [@eslint/compat](https://github.com/eslint/rewrite/tree/HEAD/packages/compat) | `2.0.0` | `2.0.1` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.0.3` | `25.1.0` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.51.0` | `8.54.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.51.0` | `8.54.0` | | [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) | `29.12.0` | `29.12.1` | | [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) | `5.5.4` | `5.5.5` | | [prettier](https://github.com/prettier/prettier) | `3.7.4` | `3.8.1` | | [rollup](https://github.com/rollup/rollup) | `4.54.0` | `4.57.0` | | [@rollup/rollup-linux-x64-gnu](https://github.com/rollup/rollup) | `4.54.0` | `4.57.0` | Updates `@actions/cache` from 5.0.1 to 5.0.5 - [Changelog](https://github.com/actions/toolkit/blob/main/packages/cache/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/cache) Updates `@actions/core` from 2.0.1 to 2.0.3 - [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core) Updates `@actions/github` from 6.0.1 to 9.0.0 - [Changelog](https://github.com/actions/toolkit/blob/main/packages/github/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/github) Updates `@actions/glob` from 0.5.0 to 0.5.1 - [Changelog](https://github.com/actions/toolkit/blob/main/packages/glob/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/glob) Updates `@actions/http-client` from 3.0.0 to 3.0.2 - [Changelog](https://github.com/actions/toolkit/blob/main/packages/http-client/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/http-client) Updates `@actions/tool-cache` from 2.0.2 to 3.0.1 - [Changelog](https://github.com/actions/toolkit/blob/main/packages/tool-cache/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/tool-cache) Updates `@eslint/compat` from 2.0.0 to 2.0.1 - [Release notes](https://github.com/eslint/rewrite/releases) - [Changelog](https://github.com/eslint/rewrite/blob/main/packages/compat/CHANGELOG.md) - [Commits](https://github.com/eslint/rewrite/commits/compat-v2.0.1/packages/compat) Updates `@types/node` from 25.0.3 to 25.1.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 8.51.0 to 8.54.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.54.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.51.0 to 8.54.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.54.0/packages/parser) Updates `eslint-plugin-jest` from 29.12.0 to 29.12.1 - [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases) - [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v29.12.0...v29.12.1) Updates `eslint-plugin-prettier` from 5.5.4 to 5.5.5 - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.5.4...v5.5.5) Updates `prettier` from 3.7.4 to 3.8.1 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.7.4...3.8.1) Updates `rollup` from 4.54.0 to 4.57.0 - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.54.0...v4.57.0) Updates `@rollup/rollup-linux-x64-gnu` from 4.54.0 to 4.57.0 - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.54.0...v4.57.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: actions/setup-node dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: "@actions/cache" dependency-version: 5.0.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: "@actions/core" dependency-version: 2.0.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: "@actions/github" dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: "@actions/glob" dependency-version: 0.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: "@actions/http-client" dependency-version: 3.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: "@actions/tool-cache" dependency-version: 3.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: "@eslint/compat" dependency-version: 2.0.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: "@types/node" dependency-version: 25.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.54.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: "@typescript-eslint/parser" dependency-version: 8.54.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: eslint-plugin-jest dependency-version: 29.12.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: eslint-plugin-prettier dependency-version: 5.5.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: prettier dependency-version: 3.8.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: rollup dependency-version: 4.57.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: "@rollup/rollup-linux-x64-gnu" dependency-version: 4.57.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] --- .github/workflows/check-dist.yml | 4 +- .github/workflows/ci.yml | 24 +- package-lock.json | 1065 ++++++++++++++++-------------- package.json | 20 +- 4 files changed, 602 insertions(+), 511 deletions(-) diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml index 68b7adf..4eed9db 100644 --- a/.github/workflows/check-dist.yml +++ b/.github/workflows/check-dist.yml @@ -32,11 +32,11 @@ jobs: steps: - name: Checkout id: checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Node.js id: setup-node - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version-file: .node-version cache: npm diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8867a9d..c196e7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,9 +18,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version-file: .node-version cache: npm @@ -89,7 +89,7 @@ jobs: os: ubuntu-latest set-gds-token: true steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -155,7 +155,7 @@ jobs: components: 'native-image' os: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -212,7 +212,7 @@ jobs: components: 'native-image' os: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -261,7 +261,7 @@ jobs: distribution: 'mandrel' os: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -296,7 +296,7 @@ jobs: java-package: ['', 'jdk', 'jdk+fx'] os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -336,7 +336,7 @@ jobs: contents: read pull-requests: write # for `native-image-pr-reports` option steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -359,7 +359,7 @@ jobs: contents: read pull-requests: write # for `native-image-pr-reports` option steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -386,7 +386,7 @@ jobs: java-version: ['21', '25'] os: [ubuntu-latest] steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -410,7 +410,7 @@ jobs: contents: read pull-requests: write # for `native-image-pr-reports` option steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: @@ -471,7 +471,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest, ubuntu-22.04-arm] components: [''] steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run setup-graalvm action uses: ./ with: diff --git a/package-lock.json b/package-lock.json index 2eb9312..d016949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,43 +9,43 @@ "version": "1.4.5", "license": "UPL", "dependencies": { - "@actions/cache": "^5.0.1", + "@actions/cache": "^5.0.5", "@actions/core": "^2.0.1", "@actions/exec": "^2.0.0", - "@actions/github": "^6.0.1", + "@actions/github": "^9.0.0", "@actions/glob": "^0.5.0", "@actions/http-client": "^3.0.0", "@actions/io": "^2.0.0", - "@actions/tool-cache": "^2.0.2", + "@actions/tool-cache": "^3.0.1", "@github/dependency-submission-toolkit": "^2.0.5", "@octokit/types": "^16.0.0", "semver": "^7.7.3", "uuid": "^13.0.0" }, "devDependencies": { - "@eslint/compat": "^2.0.0", + "@eslint/compat": "^2.0.1", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-typescript": "^12.3.0", "@types/jest": "^30.0.0", - "@types/node": "^25.0.3", + "@types/node": "^25.1.0", "@types/semver": "^7.7.1", - "@typescript-eslint/eslint-plugin": "^8.51.0", + "@typescript-eslint/eslint-plugin": "^8.54.0", "@typescript-eslint/parser": "^8.31.1", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.12.0", + "eslint-plugin-jest": "^29.12.1", "eslint-plugin-jsonc": "^2.21.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.5", "jest": "^30.2.0", "js-yaml": "^4.1.1", - "prettier": "^3.7.4", + "prettier": "^3.8.1", "prettier-eslint": "^16.4.2", - "rollup": "^4.54.0", + "rollup": "^4.57.0", "ts-jest": "^29.4.6", "ts-jest-resolver": "^2.0.1", "ts-node": "^10.9.2", @@ -59,15 +59,15 @@ } }, "node_modules/@actions/cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-5.0.1.tgz", - "integrity": "sha512-c+oH047Z2zmXLhjMZfEKjxZfv6Ou7T0sn5fhz6yupICXm5OOR47oZn5zxNO8MP7ttkxv5TOg3WsMrffri5Xhfw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-5.0.5.tgz", + "integrity": "sha512-jiQSg0gfd+C2KPgcmdCOq7dCuCIQQWQ4b1YfGIRaaA9w7PJbRwTOcCz4LiFEUnqZGf0ha/8OKL3BeNwetHzYsQ==", "license": "MIT", "dependencies": { "@actions/core": "^2.0.0", "@actions/exec": "^2.0.0", - "@actions/glob": "^0.5.0", - "@actions/http-client": "^3.0.0", + "@actions/glob": "^0.5.1", + "@actions/http-client": "^3.0.2", "@actions/io": "^2.0.0", "@azure/abort-controller": "^1.1.0", "@azure/core-rest-pipeline": "^1.22.0", @@ -86,13 +86,13 @@ } }, "node_modules/@actions/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.1.tgz", - "integrity": "sha512-oBfqT3GwkvLlo1fjvhQLQxuwZCGTarTE5OuZ2Wg10hvhBj7LRIlF611WT4aZS6fDhO5ZKlY7lCAZTlpmyaHaeg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.3.tgz", + "integrity": "sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==", "license": "MIT", "dependencies": { "@actions/exec": "^2.0.0", - "@actions/http-client": "^3.0.0" + "@actions/http-client": "^3.0.2" } }, "node_modules/@actions/exec": { @@ -105,75 +105,39 @@ } }, "node_modules/@actions/github": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", - "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-9.0.0.tgz", + "integrity": "sha512-yJ0RoswsAaKcvkmpCE4XxBRiy/whH2SdTBHWzs0gi4wkqTDhXMChjSdqBz/F4AeiDlP28rQqL33iHb+kjAMX6w==", "license": "MIT", "dependencies": { - "@actions/http-client": "^2.2.0", - "@octokit/core": "^5.0.1", - "@octokit/plugin-paginate-rest": "^9.2.2", - "@octokit/plugin-rest-endpoint-methods": "^10.4.0", - "@octokit/request": "^8.4.1", - "@octokit/request-error": "^5.1.1", - "undici": "^5.28.5" + "@actions/http-client": "^3.0.2", + "@octokit/core": "^7.0.6", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0", + "@octokit/request": "^10.0.7", + "@octokit/request-error": "^7.1.0", + "undici": "^6.23.0" } }, - "node_modules/@actions/github/node_modules/@actions/http-client": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", - "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", + "node_modules/@actions/github/node_modules/undici": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" + "engines": { + "node": ">=18.17" } }, "node_modules/@actions/glob": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.5.0.tgz", - "integrity": "sha512-tST2rjPvJLRZLuT9NMUtyBjvj9Yo0MiJS3ow004slMvm8GFM+Zv9HvMJ7HWzfUyJnGrJvDsYkWBaaG3YKXRtCw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.5.1.tgz", + "integrity": "sha512-+dv/t2aKQdKp9WWSp+1yIXVJzH5Q38M0Mta26pzIbeec14EcIleMB7UU6N7sNgbEuYfyuVGpE5pOKjl6j1WXkA==", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1", + "@actions/core": "^2.0.3", "minimatch": "^3.0.4" } }, - "node_modules/@actions/glob/node_modules/@actions/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", - "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", - "license": "MIT", - "dependencies": { - "@actions/exec": "^1.1.1", - "@actions/http-client": "^2.0.1" - } - }, - "node_modules/@actions/glob/node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "license": "MIT", - "dependencies": { - "@actions/io": "^1.0.1" - } - }, - "node_modules/@actions/glob/node_modules/@actions/http-client": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", - "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", - "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@actions/glob/node_modules/@actions/io": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", - "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", - "license": "MIT" - }, "node_modules/@actions/glob/node_modules/minimatch": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", @@ -190,13 +154,22 @@ } }, "node_modules/@actions/http-client": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.0.tgz", - "integrity": "sha512-1s3tXAfVMSz9a4ZEBkXXRQD4QhY3+GAsWSbaYpeknPOKEeyRiU3lH+bHiLMZdo2x/fIeQ/hscL1wCkDLVM2DZQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.2.tgz", + "integrity": "sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==", "license": "MIT", "dependencies": { "tunnel": "^0.0.6", - "undici": "^5.28.5" + "undici": "^6.23.0" + } + }, + "node_modules/@actions/http-client/node_modules/undici": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "license": "MIT", + "engines": { + "node": ">=18.17" } }, "node_modules/@actions/io": { @@ -206,53 +179,18 @@ "license": "MIT" }, "node_modules/@actions/tool-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-2.0.2.tgz", - "integrity": "sha512-fBhNNOWxuoLxztQebpOaWu6WeVmuwa77Z+DxIZ1B+OYvGkGQon6kTVg6Z32Cb13WCuw0szqonK+hh03mJV7Z6w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-3.0.1.tgz", + "integrity": "sha512-euK7sID37jMg1yWGkdXkLPI5Te7x/+2QMUPeHXogcpzUZ81mqlDZ+CgYhQo3LtB8LpVnnQyjs+hTTU0Ir4Y0RQ==", "license": "MIT", "dependencies": { - "@actions/core": "^1.11.1", - "@actions/exec": "^1.0.0", - "@actions/http-client": "^2.0.1", - "@actions/io": "^1.1.1", + "@actions/core": "^2.0.1", + "@actions/exec": "^2.0.0", + "@actions/http-client": "^3.0.2", + "@actions/io": "^2.0.0", "semver": "^6.1.0" } }, - "node_modules/@actions/tool-cache/node_modules/@actions/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", - "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", - "license": "MIT", - "dependencies": { - "@actions/exec": "^1.1.1", - "@actions/http-client": "^2.0.1" - } - }, - "node_modules/@actions/tool-cache/node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "license": "MIT", - "dependencies": { - "@actions/io": "^1.0.1" - } - }, - "node_modules/@actions/tool-cache/node_modules/@actions/http-client": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", - "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", - "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@actions/tool-cache/node_modules/@actions/io": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", - "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", - "license": "MIT" - }, "node_modules/@actions/tool-cache/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1144,9 +1082,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1163,9 +1101,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -1173,13 +1111,13 @@ } }, "node_modules/@eslint/compat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.0.tgz", - "integrity": "sha512-T9AfE1G1uv4wwq94ozgTGio5EUQBqAVe1X9qsQtSNVEYW6j3hvtZVm8Smr4qL1qDPFg+lOB2cL5RxTRMzq4CTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.1.tgz", + "integrity": "sha512-yl/JsgplclzuvGFNqwNYV4XNPhP3l62ZOP9w/47atNAdmDtIFCx6X7CSk/SlWUuBGkT4Et/5+UD+WyvX2iiIWA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.0.0" + "@eslint/core": "^1.0.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -1194,9 +1132,9 @@ } }, "node_modules/@eslint/compat/node_modules/@eslint/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.0.0.tgz", - "integrity": "sha512-PRfWP+8FOldvbApr6xL7mNCw4cJcSTq4GA7tYbgq15mRb0kWKO/wEB2jr+uwjFH3sZvEZneZyCUGTxsv4Sahyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.0.1.tgz", + "integrity": "sha512-r18fEAj9uCk+VjzGt2thsbOmychS+4kxI14spVNibUO2vqKX7obOG+ymZljAwuPZl+S3clPGwCwTDtrdqTiY6Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1352,6 +1290,35 @@ "@actions/io": "^1.0.1" } }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@actions/github": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", + "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", + "license": "MIT", + "dependencies": { + "@actions/http-client": "^2.2.0", + "@octokit/core": "^5.0.1", + "@octokit/plugin-paginate-rest": "^9.2.2", + "@octokit/plugin-rest-endpoint-methods": "^10.4.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "undici": "^5.28.5" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@actions/github/node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@github/dependency-submission-toolkit/node_modules/@actions/http-client": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", @@ -1368,12 +1335,155 @@ "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", "license": "MIT" }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", + "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/core/node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/openapi-types": { "version": "24.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", "license": "MIT" }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/plugin-paginate-rest": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "license": "MIT" + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "license": "MIT" + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/request-error": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", @@ -1386,6 +1496,20 @@ "node": ">= 18" } }, + "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/request/node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@github/dependency-submission-toolkit/node_modules/@octokit/types": { "version": "13.10.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", @@ -1395,6 +1519,18 @@ "@octokit/openapi-types": "^24.2.0" } }, + "node_modules/@github/dependency-submission-toolkit/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "license": "Apache-2.0" + }, + "node_modules/@github/dependency-submission-toolkit/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "license": "ISC" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2273,102 +2409,57 @@ } }, "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "license": "MIT", "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "node": ">= 20" } }, "node_modules/@octokit/endpoint": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "node": ">= 20" } }, "node_modules/@octokit/graphql": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "license": "MIT", "dependencies": { - "@octokit/request": "^8.4.1", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "node": ">= 20" } }, "node_modules/@octokit/openapi-types": { @@ -2378,122 +2469,61 @@ "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", - "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "license": "MIT", "dependencies": { - "@octokit/types": "^12.6.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", - "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", "license": "MIT", "dependencies": { - "@octokit/types": "^12.6.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "@octokit/core": ">=6" } }, "node_modules/@octokit/request": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", "license": "MIT", "dependencies": { - "@octokit/endpoint": "^9.0.6", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/request-error": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "node": ">= 20" } }, "node_modules/@octokit/types": { @@ -2523,9 +2553,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", - "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -2718,9 +2748,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", - "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", + "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", "cpu": [ "arm" ], @@ -2732,9 +2762,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", - "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", + "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", "cpu": [ "arm64" ], @@ -2746,9 +2776,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", - "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", + "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", "cpu": [ "arm64" ], @@ -2760,9 +2790,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", - "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", + "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", "cpu": [ "x64" ], @@ -2774,9 +2804,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", - "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", + "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", "cpu": [ "arm64" ], @@ -2788,9 +2818,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", - "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", + "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", "cpu": [ "x64" ], @@ -2802,9 +2832,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", - "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", + "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", "cpu": [ "arm" ], @@ -2816,9 +2846,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", - "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", + "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", "cpu": [ "arm" ], @@ -2830,9 +2860,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", - "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", + "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", "cpu": [ "arm64" ], @@ -2844,9 +2874,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", - "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", + "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", "cpu": [ "arm64" ], @@ -2858,9 +2888,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", - "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", + "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", + "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", "cpu": [ "loong64" ], @@ -2872,9 +2916,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", - "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", + "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", + "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", "cpu": [ "ppc64" ], @@ -2886,9 +2944,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", - "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", + "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", "cpu": [ "riscv64" ], @@ -2900,9 +2958,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", - "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", + "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", "cpu": [ "riscv64" ], @@ -2914,9 +2972,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", - "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", + "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", "cpu": [ "s390x" ], @@ -2928,9 +2986,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", - "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", + "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", "cpu": [ "x64" ], @@ -2941,9 +2999,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", - "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", + "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", "cpu": [ "x64" ], @@ -2954,10 +3012,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", + "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", - "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", + "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", "cpu": [ "arm64" ], @@ -2969,9 +3041,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", - "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", + "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", "cpu": [ "arm64" ], @@ -2983,9 +3055,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", - "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", + "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", "cpu": [ "ia32" ], @@ -2997,9 +3069,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", - "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", + "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", "cpu": [ "x64" ], @@ -3011,9 +3083,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", - "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", + "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", "cpu": [ "x64" ], @@ -3259,9 +3331,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", - "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", + "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", "dev": true, "license": "MIT", "dependencies": { @@ -3307,20 +3379,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", - "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/type-utils": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3330,7 +3402,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.51.0", + "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -3346,17 +3418,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", - "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3371,15 +3443,15 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", - "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.51.0", - "@typescript-eslint/types": "^8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3393,14 +3465,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", - "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3411,9 +3483,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", - "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, "license": "MIT", "engines": { @@ -3428,17 +3500,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", - "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.2.0" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3453,9 +3525,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", - "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, "license": "MIT", "engines": { @@ -3467,21 +3539,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", - "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.51.0", - "@typescript-eslint/tsconfig-utils": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3521,16 +3593,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", - "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3545,13 +3617,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", - "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4240,9 +4312,9 @@ "license": "MIT" }, "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "license": "Apache-2.0" }, "node_modules/brace-expansion": { @@ -4633,9 +4705,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5310,9 +5382,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "29.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.12.0.tgz", - "integrity": "sha512-dOMLGkl5vCDZo/KcsmzJkkYJUH+SDLls4PLBj8Aw86x5BHdXkygMGdfnqikJ8RUgEx3MHni09B5cebZF5+4rrQ==", + "version": "29.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.12.1.tgz", + "integrity": "sha512-Rxo7r4jSANMBkXLICJKS0gjacgyopfNAsoS0e3R9AHnjoKuQOaaPfmsDJPi8UWwygI099OV/K/JhpYRVkxD4AA==", "dev": true, "license": "MIT", "dependencies": { @@ -5394,14 +5466,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5648,6 +5720,22 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -9051,9 +9139,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "bin": { @@ -9449,9 +9537,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -9720,9 +9808,9 @@ } }, "node_modules/rollup": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", - "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", + "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", "dev": true, "license": "MIT", "dependencies": { @@ -9736,28 +9824,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.54.0", - "@rollup/rollup-android-arm64": "4.54.0", - "@rollup/rollup-darwin-arm64": "4.54.0", - "@rollup/rollup-darwin-x64": "4.54.0", - "@rollup/rollup-freebsd-arm64": "4.54.0", - "@rollup/rollup-freebsd-x64": "4.54.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", - "@rollup/rollup-linux-arm-musleabihf": "4.54.0", - "@rollup/rollup-linux-arm64-gnu": "4.54.0", - "@rollup/rollup-linux-arm64-musl": "4.54.0", - "@rollup/rollup-linux-loong64-gnu": "4.54.0", - "@rollup/rollup-linux-ppc64-gnu": "4.54.0", - "@rollup/rollup-linux-riscv64-gnu": "4.54.0", - "@rollup/rollup-linux-riscv64-musl": "4.54.0", - "@rollup/rollup-linux-s390x-gnu": "4.54.0", - "@rollup/rollup-linux-x64-gnu": "4.54.0", - "@rollup/rollup-linux-x64-musl": "4.54.0", - "@rollup/rollup-openharmony-arm64": "4.54.0", - "@rollup/rollup-win32-arm64-msvc": "4.54.0", - "@rollup/rollup-win32-ia32-msvc": "4.54.0", - "@rollup/rollup-win32-x64-gnu": "4.54.0", - "@rollup/rollup-win32-x64-msvc": "4.54.0", + "@rollup/rollup-android-arm-eabi": "4.57.0", + "@rollup/rollup-android-arm64": "4.57.0", + "@rollup/rollup-darwin-arm64": "4.57.0", + "@rollup/rollup-darwin-x64": "4.57.0", + "@rollup/rollup-freebsd-arm64": "4.57.0", + "@rollup/rollup-freebsd-x64": "4.57.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", + "@rollup/rollup-linux-arm-musleabihf": "4.57.0", + "@rollup/rollup-linux-arm64-gnu": "4.57.0", + "@rollup/rollup-linux-arm64-musl": "4.57.0", + "@rollup/rollup-linux-loong64-gnu": "4.57.0", + "@rollup/rollup-linux-loong64-musl": "4.57.0", + "@rollup/rollup-linux-ppc64-gnu": "4.57.0", + "@rollup/rollup-linux-ppc64-musl": "4.57.0", + "@rollup/rollup-linux-riscv64-gnu": "4.57.0", + "@rollup/rollup-linux-riscv64-musl": "4.57.0", + "@rollup/rollup-linux-s390x-gnu": "4.57.0", + "@rollup/rollup-linux-x64-gnu": "4.57.0", + "@rollup/rollup-linux-x64-musl": "4.57.0", + "@rollup/rollup-openbsd-x64": "4.57.0", + "@rollup/rollup-openharmony-arm64": "4.57.0", + "@rollup/rollup-win32-arm64-msvc": "4.57.0", + "@rollup/rollup-win32-ia32-msvc": "4.57.0", + "@rollup/rollup-win32-x64-gnu": "4.57.0", + "@rollup/rollup-win32-x64-msvc": "4.57.0", "fsevents": "~2.3.2" } }, @@ -10293,13 +10384,13 @@ } }, "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.4" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -10399,9 +10490,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", - "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -10935,9 +11026,9 @@ "license": "MIT" }, "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "license": "ISC" }, "node_modules/unrs-resolver": { diff --git a/package.json b/package.json index d9f3d57..8ddfd58 100644 --- a/package.json +++ b/package.json @@ -37,43 +37,43 @@ }, "license": "UPL", "dependencies": { - "@actions/cache": "^5.0.1", + "@actions/cache": "^5.0.5", "@actions/core": "^2.0.1", "@actions/exec": "^2.0.0", - "@actions/github": "^6.0.1", + "@actions/github": "^9.0.0", "@actions/glob": "^0.5.0", "@actions/http-client": "^3.0.0", "@actions/io": "^2.0.0", - "@actions/tool-cache": "^2.0.2", + "@actions/tool-cache": "^3.0.1", "@octokit/types": "^16.0.0", "@github/dependency-submission-toolkit": "^2.0.5", "semver": "^7.7.3", "uuid": "^13.0.0" }, "devDependencies": { - "@eslint/compat": "^2.0.0", + "@eslint/compat": "^2.0.1", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-typescript": "^12.3.0", "@types/jest": "^30.0.0", - "@types/node": "^25.0.3", + "@types/node": "^25.1.0", "@types/semver": "^7.7.1", - "@typescript-eslint/eslint-plugin": "^8.51.0", + "@typescript-eslint/eslint-plugin": "^8.54.0", "@typescript-eslint/parser": "^8.31.1", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.12.0", + "eslint-plugin-jest": "^29.12.1", "eslint-plugin-jsonc": "^2.21.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.5", "jest": "^30.2.0", "js-yaml": "^4.1.1", - "prettier": "^3.7.4", + "prettier": "^3.8.1", "prettier-eslint": "^16.4.2", - "rollup": "^4.54.0", + "rollup": "^4.57.0", "ts-jest": "^29.4.6", "ts-jest-resolver": "^2.0.1", "ts-node": "^10.9.2", From 93773c2ec27db89857737c6d914b008f5b078f9f Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Wed, 28 Jan 2026 18:18:05 +0100 Subject: [PATCH 2/3] Fix import. --- src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 9cf48d9..4d489d3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -10,7 +10,7 @@ import { readFileSync, readdirSync } from 'fs' import { createHash } from 'crypto' import { extname, join } from 'path' import { tmpdir } from 'os' -import { GitHub } from '@actions/github/lib/utils.js' +import { GitHub } from '@actions/github/lib/utils' export async function exec(commandLine: string, args?: string[], options?: ExecOptions | undefined): Promise { const exitCode = await e(commandLine, args, options) From c4fd6b5d6bc06cde97ab4dfb0dc53bff02c51fa6 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Wed, 28 Jan 2026 18:18:39 +0100 Subject: [PATCH 3/3] Update dist files. --- dist/cleanup.js | 185173 +++++++++++++++++++++++++-------------------- dist/main.js | 71829 ++++++++++++------ 2 files changed, 152212 insertions(+), 104790 deletions(-) diff --git a/dist/cleanup.js b/dist/cleanup.js index b9b08a3..fd95775 100644 --- a/dist/cleanup.js +++ b/dist/cleanup.js @@ -1,49 +1,48 @@ -import require$$0$3, { tmpdir } from 'os'; -import require$$0$4 from 'crypto'; -import * as require$$1$1 from 'fs'; -import require$$1__default from 'fs'; -import require$$1$6, { join, basename as basename$1 } from 'path'; -import require$$0$5 from 'http'; -import require$$1$2 from 'https'; -import require$$0$9 from 'net'; -import require$$1$3 from 'tls'; -import require$$0$7 from 'events'; -import require$$0$8 from 'assert'; -import require$$0$6 from 'util'; -import require$$0$a from 'stream'; -import require$$7 from 'buffer'; -import require$$8 from 'querystring'; -import require$$14 from 'stream/web'; -import require$$0$c from 'node:stream'; -import require$$1$4 from 'node:util'; -import require$$0$b from 'node:events'; -import require$$0$d from 'worker_threads'; -import require$$2$1 from 'perf_hooks'; -import require$$5 from 'util/types'; -import require$$4$1 from 'async_hooks'; -import require$$1$5 from 'console'; -import require$$5$1 from 'url'; -import require$$3$1 from 'zlib'; -import require$$0$e from 'string_decoder'; -import require$$0$f from 'diagnostics_channel'; +import os, { EOL, tmpdir } from 'os'; +import require$$0$3 from 'crypto'; +import * as fs from 'fs'; +import fs__default, { existsSync, readFileSync } from 'fs'; +import require$$1$7, { join, basename } from 'path'; +import require$$0$4 from 'http'; +import require$$1$1 from 'https'; +import require$$0$c from 'net'; +import require$$1$2 from 'tls'; +import require$$0$5 from 'events'; +import require$$2$1 from 'assert'; +import require$$6 from 'util'; +import require$$0$7 from 'node:assert'; +import require$$0$9 from 'node:net'; +import require$$2 from 'node:http'; +import require$$0$8 from 'node:stream'; +import require$$0$6 from 'node:buffer'; +import require$$0$a from 'node:util'; +import require$$7 from 'node:querystring'; +import require$$8 from 'node:events'; +import require$$0$b from 'node:diagnostics_channel'; +import require$$5 from 'node:tls'; +import require$$3 from 'node:zlib'; +import require$$5$1 from 'node:perf_hooks'; +import require$$8$1 from 'node:util/types'; +import require$$1$3 from 'node:worker_threads'; +import require$$1$4 from 'node:url'; +import require$$5$2 from 'node:async_hooks'; +import require$$1$5 from 'node:console'; +import require$$1$6 from 'node:dns'; +import require$$5$3 from 'string_decoder'; import require$$2$2 from 'child_process'; -import require$$6 from 'timers'; -import require$$1$7 from 'node:os'; +import require$$6$1 from 'timers'; +import require$$3$1 from 'stream'; +import require$$5$4 from 'url'; +import require$$1$8 from 'node:os'; import require$$2$3 from 'node:process'; -import require$$1$8 from 'node:http'; import require$$2$4 from 'node:https'; -import require$$3$2 from 'node:zlib'; import require$$1$9 from 'tty'; -import require$$0$g from 'node:crypto'; -import require$$2$5 from 'node:buffer'; +import require$$0$d from 'node:crypto'; +import require$$2$5 from 'buffer'; import require$$1$a from 'node:fs'; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - function getAugmentedNamespace(n) { if (Object.prototype.hasOwnProperty.call(n, '__esModule')) return n; var f = n.default; @@ -73,22 +72,22 @@ function getAugmentedNamespace(n) { return a; } -var core$2 = {}; +var core = {}; -var command$2 = {}; +var command = {}; -var utils$7 = {}; +var utils$4 = {}; -var hasRequiredUtils$7; +var hasRequiredUtils$4; -function requireUtils$7 () { - if (hasRequiredUtils$7) return utils$7; - hasRequiredUtils$7 = 1; +function requireUtils$4 () { + if (hasRequiredUtils$4) return utils$4; + hasRequiredUtils$4 = 1; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ - Object.defineProperty(utils$7, "__esModule", { value: true }); - utils$7.toCommandValue = toCommandValue; - utils$7.toCommandProperties = toCommandProperties; + Object.defineProperty(utils$4, "__esModule", { value: true }); + utils$4.toCommandValue = toCommandValue; + utils$4.toCommandProperties = toCommandProperties; /** * Sanitizes an input into a string so it can be passed into issueCommand safely * @param input input to sanitize into a string @@ -122,15 +121,15 @@ function requireUtils$7 () { }; } - return utils$7; + return utils$4; } -var hasRequiredCommand$2; +var hasRequiredCommand; -function requireCommand$2 () { - if (hasRequiredCommand$2) return command$2; - hasRequiredCommand$2 = 1; - var __createBinding = (command$2 && command$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireCommand () { + if (hasRequiredCommand) return command; + hasRequiredCommand = 1; + var __createBinding = (command && command.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -141,12 +140,12 @@ function requireCommand$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (command$2 && command$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (command && command.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (command$2 && command$2.__importStar) || (function () { + var __importStar = (command && command.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -163,11 +162,11 @@ function requireCommand$2 () { return result; }; })(); - Object.defineProperty(command$2, "__esModule", { value: true }); - command$2.issueCommand = issueCommand; - command$2.issue = issue; - const os = __importStar(require$$0$3); - const utils_1 = requireUtils$7(); + Object.defineProperty(command, "__esModule", { value: true }); + command.issueCommand = issueCommand; + command.issue = issue; + const os$1 = __importStar(os); + const utils_1 = requireUtils$4(); /** * Issues a command to the GitHub Actions runner * @@ -203,7 +202,7 @@ function requireCommand$2 () { */ function issueCommand(command, properties, message) { const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); + process.stdout.write(cmd.toString() + os$1.EOL); } function issue(name, message = '') { issueCommand(name, {}, message); @@ -257,18 +256,18 @@ function requireCommand$2 () { .replace(/,/g, '%2C'); } - return command$2; + return command; } -var fileCommand$2 = {}; +var fileCommand = {}; -var hasRequiredFileCommand$2; +var hasRequiredFileCommand; -function requireFileCommand$2 () { - if (hasRequiredFileCommand$2) return fileCommand$2; - hasRequiredFileCommand$2 = 1; +function requireFileCommand () { + if (hasRequiredFileCommand) return fileCommand; + hasRequiredFileCommand = 1; // For internal use, subject to change. - var __createBinding = (fileCommand$2 && fileCommand$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (fileCommand && fileCommand.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -279,12 +278,12 @@ function requireFileCommand$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (fileCommand$2 && fileCommand$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (fileCommand && fileCommand.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (fileCommand$2 && fileCommand$2.__importStar) || (function () { + var __importStar = (fileCommand && fileCommand.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -301,15 +300,15 @@ function requireFileCommand$2 () { return result; }; })(); - Object.defineProperty(fileCommand$2, "__esModule", { value: true }); - fileCommand$2.issueFileCommand = issueFileCommand; - fileCommand$2.prepareKeyValueMessage = prepareKeyValueMessage; + Object.defineProperty(fileCommand, "__esModule", { value: true }); + fileCommand.issueFileCommand = issueFileCommand; + fileCommand.prepareKeyValueMessage = prepareKeyValueMessage; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ - const crypto = __importStar(require$$0$4); - const fs = __importStar(require$$1__default); - const os = __importStar(require$$0$3); - const utils_1 = requireUtils$7(); + const crypto = __importStar(require$$0$3); + const fs = __importStar(fs__default); + const os$1 = __importStar(os); + const utils_1 = requireUtils$4(); function issueFileCommand(command, message) { const filePath = process.env[`GITHUB_${command}`]; if (!filePath) { @@ -318,7 +317,7 @@ function requireFileCommand$2 () { if (!fs.existsSync(filePath)) { throw new Error(`Missing file at path: ${filePath}`); } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { + fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os$1.EOL}`, { encoding: 'utf8' }); } @@ -334,26 +333,26 @@ function requireFileCommand$2 () { if (convertedValue.includes(delimiter)) { throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; + return `${key}<<${delimiter}${os$1.EOL}${convertedValue}${os$1.EOL}${delimiter}`; } - return fileCommand$2; + return fileCommand; } -var oidcUtils$2 = {}; +var oidcUtils = {}; -var lib$3 = {}; +var lib = {}; -var proxy$3 = {}; +var proxy = {}; -var hasRequiredProxy$3; +var hasRequiredProxy; -function requireProxy$3 () { - if (hasRequiredProxy$3) return proxy$3; - hasRequiredProxy$3 = 1; - Object.defineProperty(proxy$3, "__esModule", { value: true }); - proxy$3.getProxyUrl = getProxyUrl; - proxy$3.checkBypass = checkBypass; +function requireProxy () { + if (hasRequiredProxy) return proxy; + hasRequiredProxy = 1; + Object.defineProperty(proxy, "__esModule", { value: true }); + proxy.getProxyUrl = getProxyUrl; + proxy.checkBypass = checkBypass; function getProxyUrl(reqUrl) { const usingSsl = reqUrl.protocol === 'https:'; if (checkBypass(reqUrl)) { @@ -444,7 +443,7 @@ function requireProxy$3 () { } } - return proxy$3; + return proxy; } var tunnel$1 = {}; @@ -454,11 +453,11 @@ var hasRequiredTunnel$1; function requireTunnel$1 () { if (hasRequiredTunnel$1) return tunnel$1; hasRequiredTunnel$1 = 1; - var tls = require$$1$3; - var http = require$$0$5; - var https = require$$1$2; - var events = require$$0$7; - var util = require$$0$6; + var tls = require$$1$2; + var http = require$$0$4; + var https = require$$1$1; + var events = require$$0$5; + var util = require$$6; tunnel$1.httpOverHttp = httpOverHttp; @@ -727,15 +726,15 @@ function requireTunnel () { return tunnel; } -var undici = {}; +var undici$1 = {}; -var symbols$4; -var hasRequiredSymbols$4; +var symbols$9; +var hasRequiredSymbols$9; -function requireSymbols$4 () { - if (hasRequiredSymbols$4) return symbols$4; - hasRequiredSymbols$4 = 1; - symbols$4 = { +function requireSymbols$9 () { + if (hasRequiredSymbols$9) return symbols$9; + hasRequiredSymbols$9 = 1; + symbols$9 = { kClose: Symbol('close'), kDestroy: Symbol('destroy'), kDispatch: Symbol('dispatch'), @@ -745,7 +744,6 @@ function requireSymbols$4 () { kQueue: Symbol('queue'), kConnect: Symbol('connect'), kConnecting: Symbol('connecting'), - kHeadersList: Symbol('headers list'), kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), @@ -758,6 +756,7 @@ function requireSymbols$4 () { kHost: Symbol('host'), kNoRef: Symbol('no ref'), kBodyUsed: Symbol('used'), + kBody: Symbol('abstracted request body'), kRunning: Symbol('running'), kBlocking: Symbol('blocking'), kPending: Symbol('pending'), @@ -770,6 +769,8 @@ function requireSymbols$4 () { kNeedDrain: Symbol('need drain'), kReset: Symbol('reset'), kDestroyed: Symbol.for('nodejs.stream.destroyed'), + kResume: Symbol('resume'), + kOnError: Symbol('on error'), kMaxHeadersSize: Symbol('max headers size'), kRunningIdx: Symbol('running index'), kPendingIdx: Symbol('pending index'), @@ -791,75 +792,108 @@ function requireSymbols$4 () { kMaxResponseSize: Symbol('max response size'), kHTTP2Session: Symbol('http2Session'), kHTTP2SessionState: Symbol('http2Session state'), - kHTTP2BuildRequest: Symbol('http2 build request'), - kHTTP1BuildRequest: Symbol('http1 build request'), - kHTTP2CopyHeaders: Symbol('http2 copy headers'), - kHTTPConnVersion: Symbol('http connection version'), kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), - kConstruct: Symbol('constructable') + kConstruct: Symbol('constructable'), + kListeners: Symbol('listeners'), + kHTTPContext: Symbol('http context'), + kMaxConcurrentStreams: Symbol('max concurrent streams'), + kNoProxyAgent: Symbol('no proxy agent'), + kHttpProxyAgent: Symbol('http proxy agent'), + kHttpsProxyAgent: Symbol('https proxy agent') }; - return symbols$4; + return symbols$9; } -var errors$1; -var hasRequiredErrors$1; +var errors$2; +var hasRequiredErrors$2; -function requireErrors$1 () { - if (hasRequiredErrors$1) return errors$1; - hasRequiredErrors$1 = 1; +function requireErrors$2 () { + if (hasRequiredErrors$2) return errors$2; + hasRequiredErrors$2 = 1; + const kUndiciError = Symbol.for('undici.error.UND_ERR'); class UndiciError extends Error { constructor (message) { super(message); this.name = 'UndiciError'; this.code = 'UND_ERR'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kUndiciError] === true + } + + [kUndiciError] = true } + const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT'); class ConnectTimeoutError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ConnectTimeoutError); this.name = 'ConnectTimeoutError'; this.message = message || 'Connect Timeout Error'; this.code = 'UND_ERR_CONNECT_TIMEOUT'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kConnectTimeoutError] === true + } + + [kConnectTimeoutError] = true } + const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT'); class HeadersTimeoutError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, HeadersTimeoutError); this.name = 'HeadersTimeoutError'; this.message = message || 'Headers Timeout Error'; this.code = 'UND_ERR_HEADERS_TIMEOUT'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersTimeoutError] === true + } + + [kHeadersTimeoutError] = true } + const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW'); class HeadersOverflowError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, HeadersOverflowError); this.name = 'HeadersOverflowError'; this.message = message || 'Headers Overflow Error'; this.code = 'UND_ERR_HEADERS_OVERFLOW'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersOverflowError] === true + } + + [kHeadersOverflowError] = true } + const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT'); class BodyTimeoutError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, BodyTimeoutError); this.name = 'BodyTimeoutError'; this.message = message || 'Body Timeout Error'; this.code = 'UND_ERR_BODY_TIMEOUT'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kBodyTimeoutError] === true + } + + [kBodyTimeoutError] = true } + const kResponseStatusCodeError = Symbol.for('undici.error.UND_ERR_RESPONSE_STATUS_CODE'); class ResponseStatusCodeError extends UndiciError { constructor (message, statusCode, headers, body) { super(message); - Error.captureStackTrace(this, ResponseStatusCodeError); this.name = 'ResponseStatusCodeError'; this.message = message || 'Response Status Code Error'; this.code = 'UND_ERR_RESPONSE_STATUS_CODE'; @@ -868,143 +902,243 @@ function requireErrors$1 () { this.statusCode = statusCode; this.headers = headers; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseStatusCodeError] === true + } + + [kResponseStatusCodeError] = true } + const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG'); class InvalidArgumentError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, InvalidArgumentError); this.name = 'InvalidArgumentError'; this.message = message || 'Invalid Argument Error'; this.code = 'UND_ERR_INVALID_ARG'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidArgumentError] === true + } + + [kInvalidArgumentError] = true } + const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE'); class InvalidReturnValueError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, InvalidReturnValueError); this.name = 'InvalidReturnValueError'; this.message = message || 'Invalid Return Value Error'; this.code = 'UND_ERR_INVALID_RETURN_VALUE'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidReturnValueError] === true + } + + [kInvalidReturnValueError] = true + } + + const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT'); + class AbortError extends UndiciError { + constructor (message) { + super(message); + this.name = 'AbortError'; + this.message = message || 'The operation was aborted'; + this.code = 'UND_ERR_ABORT'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kAbortError] === true + } + + [kAbortError] = true } - class RequestAbortedError extends UndiciError { + const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED'); + class RequestAbortedError extends AbortError { constructor (message) { super(message); - Error.captureStackTrace(this, RequestAbortedError); this.name = 'AbortError'; this.message = message || 'Request aborted'; this.code = 'UND_ERR_ABORTED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestAbortedError] === true + } + + [kRequestAbortedError] = true } + const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO'); class InformationalError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, InformationalError); this.name = 'InformationalError'; this.message = message || 'Request information'; this.code = 'UND_ERR_INFO'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInformationalError] === true + } + + [kInformationalError] = true } + const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'); class RequestContentLengthMismatchError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, RequestContentLengthMismatchError); this.name = 'RequestContentLengthMismatchError'; this.message = message || 'Request body length does not match content-length header'; this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestContentLengthMismatchError] === true + } + + [kRequestContentLengthMismatchError] = true } + const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH'); class ResponseContentLengthMismatchError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ResponseContentLengthMismatchError); this.name = 'ResponseContentLengthMismatchError'; this.message = message || 'Response body length does not match content-length header'; this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseContentLengthMismatchError] === true + } + + [kResponseContentLengthMismatchError] = true } + const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED'); class ClientDestroyedError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ClientDestroyedError); this.name = 'ClientDestroyedError'; this.message = message || 'The client is destroyed'; this.code = 'UND_ERR_DESTROYED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientDestroyedError] === true + } + + [kClientDestroyedError] = true } + const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED'); class ClientClosedError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ClientClosedError); this.name = 'ClientClosedError'; this.message = message || 'The client is closed'; this.code = 'UND_ERR_CLOSED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientClosedError] === true + } + + [kClientClosedError] = true } + const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET'); class SocketError extends UndiciError { constructor (message, socket) { super(message); - Error.captureStackTrace(this, SocketError); this.name = 'SocketError'; this.message = message || 'Socket error'; this.code = 'UND_ERR_SOCKET'; this.socket = socket; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kSocketError] === true + } + + [kSocketError] = true } + const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED'); class NotSupportedError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, NotSupportedError); this.name = 'NotSupportedError'; this.message = message || 'Not supported error'; this.code = 'UND_ERR_NOT_SUPPORTED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kNotSupportedError] === true + } + + [kNotSupportedError] = true } + const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM'); class BalancedPoolMissingUpstreamError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, NotSupportedError); this.name = 'MissingUpstreamError'; this.message = message || 'No upstream has been added to the BalancedPool'; this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true + } + + [kBalancedPoolMissingUpstreamError] = true } + const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER'); class HTTPParserError extends Error { constructor (message, code, data) { super(message); - Error.captureStackTrace(this, HTTPParserError); this.name = 'HTTPParserError'; this.code = code ? `HPE_${code}` : undefined; this.data = data ? data.toString() : undefined; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHTTPParserError] === true + } + + [kHTTPParserError] = true } + const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE'); class ResponseExceededMaxSizeError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ResponseExceededMaxSizeError); this.name = 'ResponseExceededMaxSizeError'; this.message = message || 'Response content exceeded max size'; this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseExceededMaxSizeError] === true + } + + [kResponseExceededMaxSizeError] = true } + const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY'); class RequestRetryError extends UndiciError { constructor (message, code, { headers, data }) { super(message); - Error.captureStackTrace(this, RequestRetryError); this.name = 'RequestRetryError'; this.message = message || 'Request retry error'; this.code = 'UND_ERR_REQ_RETRY'; @@ -1012,9 +1146,52 @@ function requireErrors$1 () { this.data = data; this.headers = headers; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestRetryError] === true + } + + [kRequestRetryError] = true } - errors$1 = { + const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE'); + class ResponseError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message); + this.name = 'ResponseError'; + this.message = message || 'Response error'; + this.code = 'UND_ERR_RESPONSE'; + this.statusCode = code; + this.data = data; + this.headers = headers; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseError] === true + } + + [kResponseError] = true + } + + const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS'); + class SecureProxyConnectionError extends UndiciError { + constructor (cause, message, options) { + super(message, { cause, ...(options ?? {}) }); + this.name = 'SecureProxyConnectionError'; + this.message = message || 'Secure Proxy Connection failed'; + this.code = 'UND_ERR_PRX_TLS'; + this.cause = cause; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kSecureProxyConnectionError] === true + } + + [kSecureProxyConnectionError] = true + } + + errors$2 = { + AbortError, HTTPParserError, UndiciError, HeadersTimeoutError, @@ -1034,17 +1211,19 @@ function requireErrors$1 () { ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError, ResponseExceededMaxSizeError, - RequestRetryError + RequestRetryError, + ResponseError, + SecureProxyConnectionError }; - return errors$1; + return errors$2; } -var constants$b; -var hasRequiredConstants$b; +var constants$g; +var hasRequiredConstants$g; -function requireConstants$b () { - if (hasRequiredConstants$b) return constants$b; - hasRequiredConstants$b = 1; +function requireConstants$g () { + if (hasRequiredConstants$g) return constants$g; + hasRequiredConstants$g = 1; /** @type {Record} */ const headerNameLowerCasedRecord = {}; @@ -1158,33 +1337,247 @@ function requireConstants$b () { // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. Object.setPrototypeOf(headerNameLowerCasedRecord, null); - constants$b = { + constants$g = { wellknownHeaderNames, headerNameLowerCasedRecord }; - return constants$b; + return constants$g; } -var util$8; -var hasRequiredUtil$8; +var tree_1$1; +var hasRequiredTree$1; -function requireUtil$8 () { - if (hasRequiredUtil$8) return util$8; - hasRequiredUtil$8 = 1; +function requireTree$1 () { + if (hasRequiredTree$1) return tree_1$1; + hasRequiredTree$1 = 1; + + const { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = requireConstants$g(); + + class TstNode { + /** @type {any} */ + value = null + /** @type {null | TstNode} */ + left = null + /** @type {null | TstNode} */ + middle = null + /** @type {null | TstNode} */ + right = null + /** @type {number} */ + code + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor (key, value, index) { + if (index === undefined || index >= key.length) { + throw new TypeError('Unreachable') + } + const code = this.code = key.charCodeAt(index); + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (key.length !== ++index) { + this.middle = new TstNode(key, value, index); + } else { + this.value = value; + } + } + + /** + * @param {string} key + * @param {any} value + */ + add (key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError('Unreachable') + } + let index = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index); + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (node.code === code) { + if (length === ++index) { + node.value = value; + break + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new TstNode(key, value, index); + break + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new TstNode(key, value, index); + break + } + } else if (node.right !== null) { + node = node.right; + } else { + node.right = new TstNode(key, value, index); + break + } + } + } + + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search (key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code = key[index]; + // A-Z + // First check if it is bigger than 0x5a. + // Lowercase letters have higher char codes than uppercase ones. + // Also we assume that headers will mostly contain lowercase characters. + if (code <= 0x5a && code >= 0x41) { + // Lowercase for uppercase. + code |= 32; + } + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + // Returns Node since it is the last key. + return node + } + node = node.middle; + break + } + node = node.code < code ? node.left : node.right; + } + } + return null + } + } - const assert = require$$0$8; - const { kDestroyed, kBodyUsed } = requireSymbols$4(); - const { IncomingMessage } = require$$0$5; - const stream = require$$0$a; + class TernarySearchTree { + /** @type {TstNode | null} */ + node = null + + /** + * @param {string} key + * @param {any} value + * */ + insert (key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); + } + } + + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup (key) { + return this.node?.search(key)?.value ?? null + } + } + + const tree = new TernarySearchTree(); + + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + + tree_1$1 = { + TernarySearchTree, + tree + }; + return tree_1$1; +} + +var util$h; +var hasRequiredUtil$h; + +function requireUtil$h () { + if (hasRequiredUtil$h) return util$h; + hasRequiredUtil$h = 1; + + const assert = require$$0$7; + const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols$9(); + const { IncomingMessage } = require$$2; + const stream = require$$0$8; const net = require$$0$9; - const { InvalidArgumentError } = requireErrors$1(); - const { Blob } = require$$7; - const nodeUtil = require$$0$6; - const { stringify } = require$$8; - const { headerNameLowerCasedRecord } = requireConstants$b(); + const { Blob } = require$$0$6; + const nodeUtil = require$$0$a; + const { stringify } = require$$7; + const { EventEmitter: EE } = require$$8; + const { InvalidArgumentError } = requireErrors$2(); + const { headerNameLowerCasedRecord } = requireConstants$g(); + const { tree } = requireTree$1(); const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)); + class BodyAsyncIterable { + constructor (body) { + this[kBody] = body; + this[kBodyUsed] = false; + } + + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed'); + this[kBodyUsed] = true; + yield * this[kBody]; + } + } + + function wrapRequestBody (body) { + if (isStream(body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (bodyLength(body) === 0) { + body + .on('data', function () { + assert(false); + }); + } + + if (typeof body.readableDidRead !== 'boolean') { + body[kBodyUsed] = false; + EE.prototype.on.call(body, 'data', function () { + this[kBodyUsed] = true; + }); + } + + return body + } else if (body && typeof body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + return new BodyAsyncIterable(body) + } else if ( + body && + typeof body !== 'string' && + !ArrayBuffer.isView(body) && + isIterable(body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + return new BodyAsyncIterable(body) + } else { + return body + } + } + function nop () {} function isStream (obj) { @@ -1193,13 +1586,20 @@ function requireUtil$8 () { // based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) function isBlobLike (object) { - return (Blob && object instanceof Blob) || ( - object && - typeof object === 'object' && - (typeof object.stream === 'function' || - typeof object.arrayBuffer === 'function') && - /^(Blob|File)$/.test(object[Symbol.toStringTag]) - ) + if (object === null) { + return false + } else if (object instanceof Blob) { + return true + } else if (typeof object !== 'object') { + return false + } else { + const sTag = object[Symbol.toStringTag]; + + return (sTag === 'Blob' || sTag === 'File') && ( + ('stream' in object && typeof object.stream === 'function') || + ('arrayBuffer' in object && typeof object.arrayBuffer === 'function') + ) + } } function buildURL (url, queryParams) { @@ -1216,11 +1616,37 @@ function requireUtil$8 () { return url } + function isValidPort (port) { + const value = parseInt(port, 10); + return ( + value === Number(port) && + value >= 0 && + value <= 65535 + ) + } + + function isHttpOrHttpsPrefixed (value) { + return ( + value != null && + value[0] === 'h' && + value[1] === 't' && + value[2] === 't' && + value[3] === 'p' && + ( + value[4] === ':' || + ( + value[4] === 's' && + value[5] === ':' + ) + ) + ) + } + function parseURL (url) { if (typeof url === 'string') { url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } @@ -1231,12 +1657,8 @@ function requireUtil$8 () { throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { + if (url.port != null && url.port !== '' && isValidPort(url.port) === false) { throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') } @@ -1256,28 +1678,36 @@ function requireUtil$8 () { throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } + const port = url.port != null ? url.port : (url.protocol === 'https:' ? 443 : 80); let origin = url.origin != null ? url.origin - : `${url.protocol}//${url.hostname}:${port}`; + : `${url.protocol || ''}//${url.hostname || ''}:${port}`; let path = url.path != null ? url.path : `${url.pathname || ''}${url.search || ''}`; - if (origin.endsWith('/')) { - origin = origin.substring(0, origin.length - 1); + if (origin[origin.length - 1] === '/') { + origin = origin.slice(0, origin.length - 1); } - if (path && !path.startsWith('/')) { + if (path && path[0] !== '/') { path = `/${path}`; } // new URL(path, origin) is unsafe when `path` contains an absolute URL // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: // If first parameter is a relative URL, second param is required, and will be used as the base URL. // If first parameter is an absolute URL, a given second param will be ignored. - url = new URL(origin + path); + return new URL(`${origin}${path}`) + } + + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } return url @@ -1314,7 +1744,7 @@ function requireUtil$8 () { return null } - assert.strictEqual(typeof host, 'string'); + assert(typeof host === 'string'); const servername = getHostname(host); if (net.isIP(servername)) { @@ -1353,13 +1783,8 @@ function requireUtil$8 () { return null } - function isDestroyed (stream) { - return !stream || !!(stream.destroyed || stream[kDestroyed]) - } - - function isReadableAborted (stream) { - const state = stream && stream._readableState; - return isDestroyed(stream) && state && !state.endEmitted + function isDestroyed (body) { + return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body))) } function destroy (stream, err) { @@ -1375,9 +1800,9 @@ function requireUtil$8 () { stream.destroy(err); } else if (err) { - process.nextTick((stream, err) => { + queueMicrotask(() => { stream.emit('error', err); - }, stream, err); + }); } if (stream.destroyed !== true) { @@ -1397,29 +1822,44 @@ function requireUtil$8 () { * @returns {string} */ function headerNameToString (value) { - return headerNameLowerCasedRecord[value] || value.toLowerCase() + return typeof value === 'string' + ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() + : tree.lookup(value) ?? value.toString('latin1').toLowerCase() } - function parseHeaders (headers, obj = {}) { - // For H2 support - if (!Array.isArray(headers)) return headers + /** + * Receive the buffer as a string and return its lowercase value. + * @param {Buffer} value Header name + * @returns {string} + */ + function bufferToLowerCasedHeaderName (value) { + return tree.lookup(value) ?? value.toString('latin1').toLowerCase() + } + /** + * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers + * @param {Record} [obj] + * @returns {Record} + */ + function parseHeaders (headers, obj) { + if (obj === undefined) obj = {}; for (let i = 0; i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase(); + const key = headerNameToString(headers[i]); let val = obj[key]; - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1].map(x => x.toString('utf8')); - } else { - obj[key] = headers[i + 1].toString('utf8'); - } - } else { - if (!Array.isArray(val)) { + if (val) { + if (typeof val === 'string') { val = [val]; obj[key] = val; } val.push(headers[i + 1].toString('utf8')); + } else { + const headersValue = headers[i + 1]; + if (typeof headersValue === 'string') { + obj[key] = headersValue; + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8'); + } } } @@ -1432,22 +1872,30 @@ function requireUtil$8 () { } function parseRawHeaders (headers) { - const ret = []; + const len = headers.length; + const ret = new Array(len); + let hasContentLength = false; let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString('utf8'); + key = headers[n]; + val = headers[n + 1]; - if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) { - ret.push(key, val); + typeof key !== 'string' && (key = key.toString()); + typeof val !== 'string' && (val = val.toString('utf8')); + + kLen = key.length; + if (kLen === 14 && key[7] === '-' && (key === 'content-length' || key.toLowerCase() === 'content-length')) { hasContentLength = true; - } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); + } else if (kLen === 19 && key[7] === '-' && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { + contentDispositionIdx = n + 1; } + ret[n] = key; + ret[n + 1] = val; } // See https://github.com/nodejs/node/pull/46528 @@ -1502,30 +1950,16 @@ function requireUtil$8 () { // A body is disturbed if it has been read from and it cannot // be re-used without losing state or data. function isDisturbed (body) { - return !!(body && ( - stream.isDisturbed - ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? - : body[kBodyUsed] || - body.readableDidRead || - (body._readableState && body._readableState.dataEmitted) || - isReadableAborted(body) - )) + // TODO (fix): Why is body[kBodyUsed] needed? + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])) } function isErrored (body) { - return !!(body && ( - stream.isErrored - ? stream.isErrored(body) - : /state: 'errored'/.test(nodeUtil.inspect(body) - ))) + return !!(body && stream.isErrored(body)) } function isReadable (body) { - return !!(body && ( - stream.isReadable - ? stream.isReadable(body) - : /state: 'readable'/.test(nodeUtil.inspect(body) - ))) + return !!(body && stream.isReadable(body)) } function getSocketInfo (socket) { @@ -1541,21 +1975,9 @@ function requireUtil$8 () { } } - async function * convertIterableToBuffer (iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); - } - } - - let ReadableStream; + /** @type {globalThis['ReadableStream']} */ function ReadableStreamFrom (iterable) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)) - } + // We cannot use ReadableStream.from here because it does not return a byte stream. let iterator; return new ReadableStream( @@ -1568,18 +1990,21 @@ function requireUtil$8 () { if (done) { queueMicrotask(() => { controller.close(); + controller.byobRequest?.respond(0); }); } else { const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - controller.enqueue(new Uint8Array(buf)); + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)); + } } return controller.desiredSize > 0 }, async cancel (reason) { await iterator.return(); - } - }, - 0 + }, + type: 'bytes' + } ) } @@ -1599,20 +2024,6 @@ function requireUtil$8 () { ) } - function throwIfAborted (signal) { - if (!signal) { return } - if (typeof signal.throwIfAborted === 'function') { - signal.throwIfAborted(); - } else { - if (signal.aborted) { - // DOMException not available < v17.0.0 - const err = new Error('The operation was aborted'); - err.name = 'AbortError'; - throw err - } - } - } - function addAbortListener (signal, listener) { if ('addEventListener' in signal) { signal.addEventListener('abort', listener, { once: true }); @@ -1622,19 +2033,86 @@ function requireUtil$8 () { return () => signal.removeListener('abort', listener) } - const hasToWellFormed = !!String.prototype.toWellFormed; + const hasToWellFormed = typeof String.prototype.toWellFormed === 'function'; + const hasIsWellFormed = typeof String.prototype.isWellFormed === 'function'; /** * @param {string} val */ function toUSVString (val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed() - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val) + return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val) + } + + /** + * @param {string} val + */ + // TODO: move this to webidl + function isUSVString (val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}` + } + + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 + * @param {number} c + */ + function isTokenCharCode (c) { + switch (c) { + case 0x22: + case 0x28: + case 0x29: + case 0x2c: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x40: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x7b: + case 0x7d: + // DQUOTE and "(),/:;<=>?@[\]{}" + return false + default: + // VCHAR %x21-7E + return c >= 0x21 && c <= 0x7e + } + } + + /** + * @param {string} characters + */ + function isValidHTTPToken (characters) { + if (characters.length === 0) { + return false + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false + } } + return true + } + + // headerCharRegex have been lifted from + // https://github.com/nodejs/node/blob/main/lib/_http_common.js + + /** + * Matches if val contains an invalid field-vchar + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + */ + const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - return `${val}` + /** + * @param {string} characters + */ + function isValidHeaderValue (characters) { + return !headerCharRegex.test(characters) } // Parsed accordingly to RFC 9110 @@ -1652,17 +2130,65 @@ function requireUtil$8 () { : null } + function addListener (obj, name, listener) { + const listeners = (obj[kListeners] ??= []); + listeners.push([name, listener]); + obj.on(name, listener); + return obj + } + + function removeAllListeners (obj) { + for (const [name, listener] of obj[kListeners] ?? []) { + obj.removeListener(name, listener); + } + obj[kListeners] = null; + } + + function errorRequest (client, request, err) { + try { + request.onError(err); + assert(request.aborted); + } catch (err) { + client.emit('error', err); + } + } + const kEnumerableProperty = Object.create(null); kEnumerableProperty.enumerable = true; - util$8 = { + const normalizedMethodRecordsBase = { + delete: 'DELETE', + DELETE: 'DELETE', + get: 'GET', + GET: 'GET', + head: 'HEAD', + HEAD: 'HEAD', + options: 'OPTIONS', + OPTIONS: 'OPTIONS', + post: 'POST', + POST: 'POST', + put: 'PUT', + PUT: 'PUT' + }; + + const normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: 'patch', + PATCH: 'PATCH' + }; + + // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); + + util$h = { kEnumerableProperty, nop, isDisturbed, isErrored, isReadable, toUSVString, - isReadableAborted, + isUSVString, isBlobLike, parseOrigin, parseURL, @@ -1672,6 +2198,10 @@ function requireUtil$8 () { isAsyncIterable, isDestroyed, headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -1684,1780 +2214,1951 @@ function requireUtil$8 () { getSocketInfo, isFormDataLike, buildURL, - throwIfAborted, addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, nodeMajor, nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13), - safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'] - }; - return util$8; -} - -var timers; -var hasRequiredTimers; - -function requireTimers () { - if (hasRequiredTimers) return timers; - hasRequiredTimers = 1; - - let fastNow = Date.now(); - let fastNowTimeout; - - const fastTimers = []; - - function onTimeout () { - fastNow = Date.now(); - - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - - if (fastTimers.length > 0) { - refreshTimeout(); - } - } + safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'], + wrapRequestBody + }; + return util$h; +} + +var diagnostics$1; +var hasRequiredDiagnostics$1; + +function requireDiagnostics$1 () { + if (hasRequiredDiagnostics$1) return diagnostics$1; + hasRequiredDiagnostics$1 = 1; + const diagnosticsChannel = require$$0$b; + const util = require$$0$a; + + const undiciDebugLog = util.debuglog('undici'); + const fetchDebuglog = util.debuglog('fetch'); + const websocketDebuglog = util.debuglog('websocket'); + let isClientSet = false; + const channels = { + // Client + beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), + connected: diagnosticsChannel.channel('undici:client:connected'), + connectError: diagnosticsChannel.channel('undici:client:connectError'), + sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'), + // Request + create: diagnosticsChannel.channel('undici:request:create'), + bodySent: diagnosticsChannel.channel('undici:request:bodySent'), + headers: diagnosticsChannel.channel('undici:request:headers'), + trailers: diagnosticsChannel.channel('undici:request:trailers'), + error: diagnosticsChannel.channel('undici:request:error'), + // WebSocket + open: diagnosticsChannel.channel('undici:websocket:open'), + close: diagnosticsChannel.channel('undici:websocket:close'), + socketError: diagnosticsChannel.channel('undici:websocket:socket_error'), + ping: diagnosticsChannel.channel('undici:websocket:ping'), + pong: diagnosticsChannel.channel('undici:websocket:pong') + }; + + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; + + // Track all Client events + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connecting to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ); + }); - function refreshTimeout () { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1e3); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connected to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ); + }); - class Timeout { - constructor (callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + 'connection to %s using %s%s errored - %s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version, + error.message + ); + }); - // -2 not in timer list - // -1 in timer list but inactive - // 0 in timer list waiting for time - // > 0 in timer list waiting for time to expire - this.state = -2; + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('sending request to %s %s/%s', method, origin, path); + }); - this.refresh(); - } + // Track Request events + diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt; + debuglog( + 'received response to %s %s/%s - HTTP %d', + method, + origin, + path, + statusCode + ); + }); - refresh () { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } + diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('trailers received from %s %s/%s', method, origin, path); + }); - this.state = 0; - } + diagnosticsChannel.channel('undici:request:error').subscribe(evt => { + const { + request: { method, path, origin }, + error + } = evt; + debuglog( + 'request to %s %s/%s errored - %s', + method, + origin, + path, + error.message + ); + }); - clear () { - this.state = -1; - } + isClientSet = true; } - timers = { - setTimeout (callback, delay, opaque) { - return delay < 1e3 - ? setTimeout(callback, delay, opaque) - : new Timeout(callback, delay, opaque) - }, - clearTimeout (timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } - }; - return timers; -} - -var main = {exports: {}}; - -var sbmh; -var hasRequiredSbmh; - -function requireSbmh () { - if (hasRequiredSbmh) return sbmh; - hasRequiredSbmh = 1; - - /** - * Copyright Brian White. All rights reserved. - * - * @see https://github.com/mscdex/streamsearch - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation - * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool - */ - const EventEmitter = require$$0$b.EventEmitter; - const inherits = require$$1$4.inherits; - - function SBMH (needle) { - if (typeof needle === 'string') { - needle = Buffer.from(needle); - } + if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connecting to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ); + }); - if (!Buffer.isBuffer(needle)) { - throw new TypeError('The needle has to be a String or a Buffer.') - } + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connected to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ); + }); - const needleLength = needle.length; + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + 'connection to %s%s using %s%s errored - %s', + host, + port ? `:${port}` : '', + protocol, + version, + error.message + ); + }); - if (needleLength === 0) { - throw new Error('The needle cannot be an empty String/Buffer.') + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('sending request to %s %s/%s', method, origin, path); + }); } - if (needleLength > 256) { - throw new Error('The needle cannot have a length bigger than 256.') - } + // Track all WebSocket events + diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { + const { + address: { address, port } + } = evt; + websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : ''); + }); - this.maxMatches = Infinity; - this.matches = 0; + diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { + const { websocket, code, reason } = evt; + websocketDebuglog( + 'closed connection to %s - %s %s', + websocket.url, + code, + reason + ); + }); - this._occ = new Array(256) - .fill(needleLength); // Initialize occurrence table. - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; + diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { + websocketDebuglog('connection errored - %s', err.message); + }); - this._lookbehind = Buffer.alloc(needleLength); + diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { + websocketDebuglog('ping received'); + }); - // Populate occurrence table with analysis of the needle, - // ignoring last letter. - for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var - this._occ[needle[i]] = needleLength - 1 - i; - } + diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { + websocketDebuglog('pong received'); + }); } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function () { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; + diagnostics$1 = { + channels }; + return diagnostics$1; +} - SBMH.prototype.push = function (chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, 'binary'); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk); } - return r - }; +var request$4; +var hasRequiredRequest$3; - SBMH.prototype._sbmh_feed = function (data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; +function requireRequest$3 () { + if (hasRequiredRequest$3) return request$4; + hasRequiredRequest$3 = 1; - // Positive: points to a position in `data` - // pos == 3 points to data[3] - // Negative: points to a position in the lookbehind buffer - // pos == -2 points to lookbehind[lookbehind_size - 2] - let pos = -this._lookbehind_size; - let ch; + const { + InvalidArgumentError, + NotSupportedError + } = requireErrors$2(); + const assert = require$$0$7; + const { + isValidHTTPToken, + isValidHeaderValue, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName, + normalizedMethodRecords + } = requireUtil$h(); + const { channels } = requireDiagnostics$1(); + const { headerNameLowerCasedRecord } = requireConstants$g(); - if (pos < 0) { - // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool - // search with character lookup code that considers both the - // lookbehind buffer and the current round's haystack data. - // - // Loop until - // there is a match. - // or until - // we've moved past the position that requires the - // lookbehind buffer. In this case we switch to the - // optimized loop. - // or until - // the character to look at lies outside the haystack. - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); + // Verifies that a given path is valid does not contain control chars \x00 to \x20 + const invalidPathRegex = /[^\u0021-\u00ff]/; - if ( - ch === lastNeedleChar && - this._sbmh_memcmp(data, pos, needleLength - 1) - ) { - this._lookbehind_size = 0; - ++this.matches; - this.emit('info', true); + const kHandler = Symbol('handler'); - return (this._bufpos = pos + needleLength) - } - pos += this._occ[ch]; + class Request { + constructor (origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler) { + if (typeof path !== 'string') { + throw new InvalidArgumentError('path must be a string') + } else if ( + path[0] !== '/' && + !(path.startsWith('http://') || path.startsWith('https://')) && + method !== 'CONNECT' + ) { + throw new InvalidArgumentError('path must be an absolute URL or start with a slash') + } else if (invalidPathRegex.test(path)) { + throw new InvalidArgumentError('invalid request path') } - // No match. - - if (pos < 0) { - // There's too few data for Boyer-Moore-Horspool to run, - // so let's use a different algorithm to skip as much as - // we can. - // Forward pos until - // the trailing part of lookbehind + data - // looks like the beginning of the needle - // or until - // pos == 0 - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos; } + if (typeof method !== 'string') { + throw new InvalidArgumentError('method must be a string') + } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) { + throw new InvalidArgumentError('invalid request method') } - if (pos >= 0) { - // Discard lookbehind buffer. - this.emit('info', false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; - } else { - // Cut off part of the lookbehind buffer that has - // been processed and append the entire haystack - // into it. - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - // The cut off data is guaranteed not to contain the needle. - this.emit('info', false, this._lookbehind, 0, bytesToCutOff); - } - - this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, - this._lookbehind_size - bytesToCutOff); - this._lookbehind_size -= bytesToCutOff; - - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - - this._bufpos = len; - return len + if (upgrade && typeof upgrade !== 'string') { + throw new InvalidArgumentError('upgrade must be a string') } - } - - pos += (pos >= 0) * this._bufpos; - // Lookbehind buffer is now empty. We only need to check if the - // needle is in the haystack. - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { this.emit('info', true, data, this._bufpos, pos); } else { this.emit('info', true); } - - return (this._bufpos = pos + needleLength) - } else { - pos = len - needleLength; - } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('invalid headersTimeout') + } - // There was no match. If there's trailing haystack data that we cannot - // match yet using the Boyer-Moore-Horspool algorithm (because the trailing - // data is less than the needle size) then match using a modified - // algorithm that starts matching from the beginning instead of the end. - // Whatever trailing data is left after running this algorithm is added to - // the lookbehind buffer. - while ( - pos < len && - ( - data[pos] !== needle[0] || - ( - (Buffer.compare( - data.subarray(pos, pos + len - pos), - needle.subarray(0, len - pos) - ) !== 0) - ) - ) - ) { - ++pos; - } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; - } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('invalid bodyTimeout') + } - // Everything until pos is guaranteed not to contain needle data. - if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len); } + if (reset != null && typeof reset !== 'boolean') { + throw new InvalidArgumentError('invalid reset') + } - this._bufpos = len; - return len - }; + if (expectContinue != null && typeof expectContinue !== 'boolean') { + throw new InvalidArgumentError('invalid expectContinue') + } - SBMH.prototype._sbmh_lookup_char = function (data, pos) { - return (pos < 0) - ? this._lookbehind[this._lookbehind_size + pos] - : data[pos] - }; + this.headersTimeout = headersTimeout; - SBMH.prototype._sbmh_memcmp = function (data, pos, len) { - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false } - } - return true - }; + this.bodyTimeout = bodyTimeout; - sbmh = SBMH; - return sbmh; -} + this.throwOnError = throwOnError === true; -var PartStream_1; -var hasRequiredPartStream; + this.method = method; -function requirePartStream () { - if (hasRequiredPartStream) return PartStream_1; - hasRequiredPartStream = 1; + this.abort = null; - const inherits = require$$1$4.inherits; - const ReadableStream = require$$0$c.Readable; + if (body == null) { + this.body = null; + } else if (isStream(body)) { + this.body = body; - function PartStream (opts) { - ReadableStream.call(this, opts); - } - inherits(PartStream, ReadableStream); + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy () { + destroy(this); + }; + this.body.on('end', this.endHandler); + } - PartStream.prototype._read = function (n) {}; + this.errorHandler = err => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on('error', this.errorHandler); + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === 'string') { + this.body = body.length ? Buffer.from(body) : null; + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + } - PartStream_1 = PartStream; - return PartStream_1; -} + this.completed = false; -var getLimit; -var hasRequiredGetLimit; + this.aborted = false; -function requireGetLimit () { - if (hasRequiredGetLimit) return getLimit; - hasRequiredGetLimit = 1; + this.upgrade = upgrade || null; - getLimit = function getLimit (limits, name, defaultLimit) { - if ( - !limits || - limits[name] === undefined || - limits[name] === null - ) { return defaultLimit } + this.path = query ? buildURL(path, query) : path; - if ( - typeof limits[name] !== 'number' || - isNaN(limits[name]) - ) { throw new TypeError('Limit ' + name + ' is not a valid number') } + this.origin = origin; - return limits[name] - }; - return getLimit; -} + this.idempotent = idempotent == null + ? method === 'HEAD' || method === 'GET' + : idempotent; -var HeaderParser_1; -var hasRequiredHeaderParser; + this.blocking = blocking == null ? false : blocking; -function requireHeaderParser () { - if (hasRequiredHeaderParser) return HeaderParser_1; - hasRequiredHeaderParser = 1; + this.reset = reset == null ? null : reset; - const EventEmitter = require$$0$b.EventEmitter; - const inherits = require$$1$4.inherits; - const getLimit = requireGetLimit(); + this.host = null; - const StreamSearch = requireSbmh(); + this.contentLength = null; - const B_DCRLF = Buffer.from('\r\n\r\n'); - const RE_CRLF = /\r\n/g; - const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; // eslint-disable-line no-control-regex + this.contentType = null; - function HeaderParser (cfg) { - EventEmitter.call(this); + this.headers = []; - cfg = cfg || {}; - const self = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000); - this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024); - this.buffer = ''; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on('info', function (isMatch, data, start, end) { - if (data && !self.maxed) { - if (self.nread + end - start >= self.maxHeaderSize) { - end = self.maxHeaderSize - self.nread + start; - self.nread = self.maxHeaderSize; - self.maxed = true; - } else { self.nread += (end - start); } + // Only for H2 + this.expectContinue = expectContinue != null ? expectContinue : false; - self.buffer += data.toString('binary', start, end); + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === 'object') { + if (headers[Symbol.iterator]) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError('headers must be in key-value pair format') + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]); + } + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') } - if (isMatch) { self._finish(); } - }); - } - inherits(HeaderParser, EventEmitter); - - HeaderParser.prototype.push = function (data) { - const r = this.ss.push(data); - if (this.finished) { return r } - }; - HeaderParser.prototype.reset = function () { - this.finished = false; - this.buffer = ''; - this.header = {}; - this.ss.reset(); - }; + validateHandler(handler, method, upgrade); - HeaderParser.prototype._finish = function () { - if (this.buffer) { this._parseHeader(); } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ''; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit('header', header); - }; + this.servername = servername || getServerName(this.host); - HeaderParser.prototype._parseHeader = function () { - if (this.npairs === this.maxHeaderPairs) { return } + this[kHandler] = handler; - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } + } - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - if (lines[i].length === 0) { continue } - if (lines[i][0] === '\t' || lines[i][0] === ' ') { - // folded header content - // RFC2822 says to just remove the CRLF and not the whitespace following - // it, so we follow the RFC and include the leading whitespace ... - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue + onBodySent (chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk) + } catch (err) { + this.abort(err); } } + } - const posColon = lines[i].indexOf(':'); - if ( - posColon === -1 || - posColon === 0 - ) { - return + onRequestSent () { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent() + } catch (err) { + this.abort(err); + } } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push((m[2] || '')); - if (++this.npairs === this.maxHeaderPairs) { break } } - }; - HeaderParser_1 = HeaderParser; - return HeaderParser_1; -} + onConnect (abort) { + assert(!this.aborted); + assert(!this.completed); -var Dicer_1; -var hasRequiredDicer; + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort) + } + } -function requireDicer () { - if (hasRequiredDicer) return Dicer_1; - hasRequiredDicer = 1; + onResponseStarted () { + return this[kHandler].onResponseStarted?.() + } - const WritableStream = require$$0$c.Writable; - const inherits = require$$1$4.inherits; + onHeaders (statusCode, headers, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); - const StreamSearch = requireSbmh(); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } - const PartStream = requirePartStream(); - const HeaderParser = requireHeaderParser(); + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + } catch (err) { + this.abort(err); + } + } - const DASH = 45; - const B_ONEDASH = Buffer.from('-'); - const B_CRLF = Buffer.from('\r\n'); - const EMPTY_FN = function () {}; + onData (chunk) { + assert(!this.aborted); + assert(!this.completed); - function Dicer (cfg) { - if (!(this instanceof Dicer)) { return new Dicer(cfg) } - WritableStream.call(this, cfg); + try { + return this[kHandler].onData(chunk) + } catch (err) { + this.abort(err); + return false + } + } - if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') } + onUpgrade (statusCode, headers, socket) { + assert(!this.aborted); + assert(!this.completed); - if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary); } else { this._bparser = undefined; } + return this[kHandler].onUpgrade(statusCode, headers, socket) + } - this._headerFirst = cfg.headerFirst; + onComplete (trailers) { + this.onFinally(); - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = undefined; - this._cb = undefined; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; + assert(!this.aborted); - const self = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on('header', function (header) { - self._inHeader = false; - self._part.emit('header', header); - }); - } - inherits(Dicer, WritableStream); - - Dicer.prototype.emit = function (ev) { - if (ev === 'finish' && !this._realFinish) { - if (!this._finished) { - const self = this; - process.nextTick(function () { - self.emit('error', new Error('Unexpected end of multipart data')); - if (self._part && !self._ignoreData) { - const type = (self._isPreamble ? 'Preamble' : 'Part'); - self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data')); - self._part.push(null); - process.nextTick(function () { - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - }); - return - } - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - }); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); } - } else { WritableStream.prototype.emit.apply(this, arguments); } - }; - - Dicer.prototype._write = function (data, encoding, cb) { - // ignore unexpected data (e.g. extra trailer data after finished) - if (!this._hparser && !this._bparser) { return cb() } - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part); } else { this._ignore(); } + try { + return this[kHandler].onComplete(trailers) + } catch (err) { + // TODO (fix): This might be a bad idea? + this.onError(err); } - const r = this._hparser.push(data); - if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r); } else { return cb() } - } - - // allows for "easier" testing - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; } - this._bparser.push(data); + onError (error) { + this.onFinally(); - if (this._pause) { this._cb = cb; } else { cb(); } - }; - - Dicer.prototype.reset = function () { - this._part = undefined; - this._bparser = undefined; - this._hparser = undefined; - }; + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); + } - Dicer.prototype.setBoundary = function (boundary) { - const self = this; - this._bparser = new StreamSearch('\r\n--' + boundary); - this._bparser.on('info', function (isMatch, data, start, end) { - self._oninfo(isMatch, data, start, end); - }); - }; + if (this.aborted) { + return + } + this.aborted = true; - Dicer.prototype._ignore = function () { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on('error', EMPTY_FN); - // we must perform some kind of read on the stream even though we are - // ignoring the data, otherwise node's Readable stream will not emit 'end' - // after pushing null to the stream - this._part.resume(); + return this[kHandler].onError(error) } - }; - - Dicer.prototype._oninfo = function (isMatch, data, start, end) { - let buf; const self = this; let i = 0; let r; let shouldWriteMore = true; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && (start + i) < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; - } else { - if (this._dashes) { buf = B_ONEDASH; } - this._dashes = 0; - break - } - } - if (this._dashes === 2) { - if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)); } - this.reset(); - this._finished = true; - // no more parts will be added - if (self._parts === 0) { - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - } + onFinally () { + if (this.errorHandler) { + this.body.off('error', this.errorHandler); + this.errorHandler = null; } - if (this._dashes) { return } - } - if (this._justMatched) { this._justMatched = false; } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function (n) { - self._unpause(); - }; - if (this._isPreamble && this.listenerCount('preamble') !== 0) { - this.emit('preamble', this._part); - } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) { - this.emit('part', this._part); - } else { - this._ignore(); - } - if (!this._isPreamble) { this._inHeader = true; } - } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { shouldWriteMore = this._part.push(buf); } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { this._pause = true; } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { this._hparser.push(buf); } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end); } - } - } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { this._isPreamble = false; } else { - if (start !== end) { - ++this._parts; - this._part.on('end', function () { - if (--self._parts === 0) { - if (self._finished) { - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - } else { - self._unpause(); - } - } - }); - } + + if (this.endHandler) { + this.body.off('end', this.endHandler); + this.endHandler = null; } - this._part.push(null); - this._part = undefined; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; } - }; - - Dicer.prototype._unpause = function () { - if (!this._pause) { return } - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = undefined; - cb(); + addHeader (key, value) { + processHeader(this, key, value); + return this } - }; - - Dicer_1 = Dicer; - return Dicer_1; -} - -var decodeText_1; -var hasRequiredDecodeText; + } -function requireDecodeText () { - if (hasRequiredDecodeText) return decodeText_1; - hasRequiredDecodeText = 1; + function processHeader (request, key, val) { + if (val && (typeof val === 'object' && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`) + } else if (val === undefined) { + return + } - // Node has always utf-8 - const utf8Decoder = new TextDecoder('utf-8'); - const textDecoders = new Map([ - ['utf-8', utf8Decoder], - ['utf8', utf8Decoder] - ]); + let headerName = headerNameLowerCasedRecord[key]; - function getDecoder (charset) { - let lc; - while (true) { - switch (charset) { - case 'utf-8': - case 'utf8': - return decoders.utf8 - case 'latin1': - case 'ascii': // TODO: Make these a separate, strict decoder? - case 'us-ascii': - case 'iso-8859-1': - case 'iso8859-1': - case 'iso88591': - case 'iso_8859-1': - case 'windows-1252': - case 'iso_8859-1:1987': - case 'cp1252': - case 'x-cp1252': - return decoders.latin1 - case 'utf16le': - case 'utf-16le': - case 'ucs2': - case 'ucs-2': - return decoders.utf16le - case 'base64': - return decoders.base64 - default: - if (lc === undefined) { - lc = true; - charset = charset.toLowerCase(); - continue - } - return decoders.other.bind(charset) + if (headerName === undefined) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError('invalid header key') } } - } - const decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return '' + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === 'string') { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(''); + } else if (typeof val[i] === 'object') { + throw new InvalidArgumentError(`invalid ${key} header`) + } else { + arr.push(`${val[i]}`); + } } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); + val = arr; + } else if (typeof val === 'string') { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`) } - return data.utf8Slice(0, data.length) - }, + } else if (val === null) { + val = ''; + } else { + val = `${val}`; + } - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return '' - } - if (typeof data === 'string') { - return data + if (request.host === null && headerName === 'host') { + if (typeof val !== 'string') { + throw new InvalidArgumentError('invalid host header') } - return data.latin1Slice(0, data.length) - }, - - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return '' + // Consumed by Client + request.host = val; + } else if (request.contentLength === null && headerName === 'content-length') { + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError('invalid content-length header') } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); + } else if (request.contentType === null && headerName === 'content-type') { + request.contentType = val; + request.headers.push(key, val); + } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') { + throw new InvalidArgumentError(`invalid ${headerName} header`) + } else if (headerName === 'connection') { + const value = typeof val === 'string' ? val.toLowerCase() : null; + if (value !== 'close' && value !== 'keep-alive') { + throw new InvalidArgumentError('invalid connection header') } - return data.ucs2Slice(0, data.length) - }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return '' - } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); + if (value === 'close') { + request.reset = true; } - return data.base64Slice(0, data.length) - }, + } else if (headerName === 'expect') { + throw new NotSupportedError('expect header not supported') + } else { + request.headers.push(key, val); + } + } - other: (data, sourceEncoding) => { - if (data.length === 0) { - return '' - } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); - } + request$4 = Request; + return request$4; +} - if (textDecoders.has(this.toString())) { - try { - return textDecoders.get(this).decode(data) - } catch {} - } - return typeof data === 'string' - ? data - : data.toString() - } - }; - - function decodeText (text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding) - } - return text - } - - decodeText_1 = decodeText; - return decodeText_1; -} - -/* eslint-disable object-property-newline */ - -var parseParams_1; -var hasRequiredParseParams; - -function requireParseParams () { - if (hasRequiredParseParams) return parseParams_1; - hasRequiredParseParams = 1; - - const decodeText = requireDecodeText(); - - const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - - const EncodedLookup = { - '%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04', - '%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09', - '%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c', - '%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e', - '%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12', - '%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17', - '%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b', - '%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d', - '%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20', - '%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25', - '%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a', - '%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c', - '%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f', - '%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33', - '%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38', - '%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b', - '%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e', - '%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41', - '%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46', - '%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a', - '%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d', - '%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f', - '%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54', - '%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59', - '%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c', - '%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e', - '%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62', - '%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67', - '%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b', - '%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d', - '%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70', - '%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75', - '%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a', - '%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c', - '%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f', - '%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83', - '%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88', - '%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b', - '%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e', - '%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91', - '%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96', - '%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a', - '%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d', - '%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f', - '%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2', - '%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4', - '%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7', - '%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9', - '%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab', - '%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac', - '%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad', - '%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae', - '%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0', - '%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2', - '%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5', - '%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7', - '%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba', - '%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb', - '%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc', - '%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd', - '%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf', - '%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0', - '%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3', - '%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5', - '%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8', - '%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca', - '%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb', - '%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc', - '%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce', - '%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf', - '%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1', - '%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3', - '%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6', - '%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8', - '%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda', - '%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb', - '%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd', - '%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde', - '%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf', - '%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1', - '%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4', - '%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6', - '%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9', - '%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea', - '%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec', - '%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed', - '%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee', - '%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef', - '%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2', - '%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4', - '%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7', - '%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9', - '%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb', - '%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc', - '%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd', - '%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe', - '%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff' - }; - - function encodedReplacer (match) { - return EncodedLookup[match] - } - - const STATE_KEY = 0; - const STATE_VALUE = 1; - const STATE_CHARSET = 2; - const STATE_LANG = 3; - - function parseParams (str) { - const res = []; - let state = STATE_KEY; - let charset = ''; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ''; - const len = str.length; - - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - const char = str[i]; - if (char === '\\' && inquote) { - if (escaping) { escaping = false; } else { - escaping = true; - continue - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { inquote = true; } - continue - } else { escaping = false; } - } else { - if (escaping && inquote) { tmp += '\\'; } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { state = STATE_VALUE; } - tmp = ''; - continue - } else if (state === STATE_KEY && - (char === '*' || char === '=') && - res.length) { - state = char === '*' - ? STATE_CHARSET - : STATE_VALUE; - res[p] = [tmp, undefined]; - tmp = ''; - continue - } else if (!inquote && char === ';') { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), - 'binary', - charset); - } - charset = ''; - } else if (tmp.length) { - tmp = decodeText(tmp, 'binary', 'utf8'); - } - if (res[p] === undefined) { res[p] = tmp; } else { res[p][1] = tmp; } - tmp = ''; - ++p; - continue - } else if (!inquote && (char === ' ' || char === '\t')) { continue } - } - tmp += char; +var dispatcher$1; +var hasRequiredDispatcher$1; + +function requireDispatcher$1 () { + if (hasRequiredDispatcher$1) return dispatcher$1; + hasRequiredDispatcher$1 = 1; + const EventEmitter = require$$8; + + class Dispatcher extends EventEmitter { + dispatch () { + throw new Error('not implemented') } - if (charset && tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), - 'binary', - charset); - } else if (tmp) { - tmp = decodeText(tmp, 'binary', 'utf8'); + + close () { + throw new Error('not implemented') } - if (res[p] === undefined) { - if (tmp) { res[p] = tmp; } - } else { res[p][1] = tmp; } + destroy () { + throw new Error('not implemented') + } - return res - } + compose (...args) { + // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ... + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); - parseParams_1 = parseParams; - return parseParams_1; -} + for (const interceptor of interceptors) { + if (interceptor == null) { + continue + } -var basename; -var hasRequiredBasename; + if (typeof interceptor !== 'function') { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`) + } -function requireBasename () { - if (hasRequiredBasename) return basename; - hasRequiredBasename = 1; + dispatch = interceptor(dispatch); - basename = function basename (path) { - if (typeof path !== 'string') { return '' } - for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var - switch (path.charCodeAt(i)) { - case 0x2F: // '/' - case 0x5C: // '\' - path = path.slice(i + 1); - return (path === '..' || path === '.' ? '' : path) + if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) { + throw new TypeError('invalid interceptor') + } } + + return new ComposedDispatcher(this, dispatch) } - return (path === '..' || path === '.' ? '' : path) - }; - return basename; -} + } + + class ComposedDispatcher extends Dispatcher { + #dispatcher = null + #dispatch = null -var multipart$1; -var hasRequiredMultipart$1; + constructor (dispatcher, dispatch) { + super(); + this.#dispatcher = dispatcher; + this.#dispatch = dispatch; + } -function requireMultipart$1 () { - if (hasRequiredMultipart$1) return multipart$1; - hasRequiredMultipart$1 = 1; + dispatch (...args) { + this.#dispatch(...args); + } - // TODO: - // * support 1 nested multipart level - // (see second multipart example here: - // http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data) - // * support limits.fieldNameSize - // -- this will require modifications to utils.parseParams + close (...args) { + return this.#dispatcher.close(...args) + } - const { Readable } = require$$0$c; - const { inherits } = require$$1$4; + destroy (...args) { + return this.#dispatcher.destroy(...args) + } + } - const Dicer = requireDicer(); + dispatcher$1 = Dispatcher; + return dispatcher$1; +} - const parseParams = requireParseParams(); - const decodeText = requireDecodeText(); - const basename = requireBasename(); - const getLimit = requireGetLimit(); +var dispatcherBase$1; +var hasRequiredDispatcherBase$1; - const RE_BOUNDARY = /^boundary$/i; - const RE_FIELD = /^form-data$/i; - const RE_CHARSET = /^charset$/i; - const RE_FILENAME = /^filename$/i; - const RE_NAME = /^name$/i; +function requireDispatcherBase$1 () { + if (hasRequiredDispatcherBase$1) return dispatcherBase$1; + hasRequiredDispatcherBase$1 = 1; - Multipart.detect = /^multipart\/form-data/i; - function Multipart (boy, cfg) { - let i; - let len; - const self = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined)); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || 'utf8'; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; + const Dispatcher = requireDispatcher$1(); + const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = requireErrors$2(); + const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = requireSymbols$9(); - for (i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && - RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break - } + const kOnDestroyed = Symbol('onDestroyed'); + const kOnClosed = Symbol('onClosed'); + const kInterceptedDispatch = Symbol('Intercepted Dispatch'); + + class DispatcherBase extends Dispatcher { + constructor () { + super(); + + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; } - function checkFinished () { - if (nends === 0 && finished && !boy._done) { - finished = false; - self.end(); - } + get destroyed () { + return this[kDestroyed] } - if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') } + get closed () { + return this[kClosed] + } - const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024); - const fileSizeLimit = getLimit(limits, 'fileSize', Infinity); - const filesLimit = getLimit(limits, 'files', Infinity); - const fieldsLimit = getLimit(limits, 'fields', Infinity); - const partsLimit = getLimit(limits, 'parts', Infinity); - const headerPairsLimit = getLimit(limits, 'headerPairs', 2000); - const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024); + get interceptors () { + return this[kInterceptors] + } - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; + set interceptors (newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== 'function') { + throw new InvalidArgumentError('interceptor must be an function') + } + } + } - this._needDrain = false; - this._pause = false; - this._cb = undefined; - this._nparts = 0; - this._boy = boy; - - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; + this[kInterceptors] = newInterceptors; + } - this.parser = new Dicer(parserCfg); - this.parser.on('drain', function () { - self._needDrain = false; - if (self._cb && !self._pause) { - const cb = self._cb; - self._cb = undefined; - cb(); + close (callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data) + }); + }) } - }).on('part', function onPart (part) { - if (++self._nparts > partsLimit) { - self.parser.removeListener('part', onPart); - self.parser.on('part', skipPart); - boy.hitPartsLimit = true; - boy.emit('partsLimit'); - return skipPart(part) - } - - // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let - // us emit 'end' early since we know the part has ended if we are already - // seeing the next part - if (curField) { - const field = curField; - field.emit('end'); - field.removeAllListeners('end'); - } - - part.on('header', function (header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding; - let filename; - let nsize = 0; - - if (header['content-type']) { - parsed = parseParams(header['content-type'][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break - } - } - } - } - if (contype === undefined) { contype = 'text/plain'; } - if (charset === undefined) { charset = defCharset; } + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - if (header['content-disposition']) { - parsed = parseParams(header['content-disposition'][0]); - if (!RE_FIELD.test(parsed[0])) { return skipPart(part) } - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { filename = basename(filename); } - } - } - } else { return skipPart(part) } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return + } - if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase(); } else { encoding = '7bit'; } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return + } - let onData, - onEnd; + this[kClosed] = true; + this[kOnClosed].push(callback); - if (isPartAFile(fieldname, contype, filename)) { - // file/binary field - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit('filesLimit'); - } - return skipPart(part) - } + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; - ++nfiles; + // Should not error. + this[kClose]() + .then(() => this.destroy()) + .then(() => { + queueMicrotask(onClosed); + }); + } - if (boy.listenerCount('file') === 0) { - self.parser._ignore(); - return - } + destroy (err, callback) { + if (typeof err === 'function') { + callback = err; + err = null; + } - ++nends; - const file = new FileStream(fileOpts); - curFile = file; - file.on('end', function () { - --nends; - self._pause = false; - checkFinished(); - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err, data) => { + return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) }); - file._read = function (n) { - if (!self._pause) { return } - self._pause = false; - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }; - boy.emit('file', fieldname, file, filename, encoding, contype); - - onData = function (data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { file.push(data.slice(0, extralen)); } - file.truncated = true; - file.bytesRead = fileSizeLimit; - part.removeAllListeners('data'); - file.emit('limit'); - return - } else if (!file.push(data)) { self._pause = true; } + }) + } - file.bytesRead = nsize; - }; + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - onEnd = function () { - curFile = undefined; - file.push(null); - }; + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); } else { - // non-file field - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit('fieldsLimit'); - } - return skipPart(part) - } - - ++nfields; - ++nends; - let buffer = ''; - let truncated = false; - curField = part; - - onData = function (data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = (fieldSizeLimit - (nsize - data.length)); - buffer += data.toString('binary', 0, extralen); - truncated = true; - part.removeAllListeners('data'); - } else { buffer += data.toString('binary'); } - }; - - onEnd = function () { - curField = undefined; - if (buffer.length) { buffer = decodeText(buffer, 'binary', charset); } - boy.emit('field', fieldname, buffer, false, truncated, encoding, contype); - --nends; - checkFinished(); - }; + queueMicrotask(() => callback(null, null)); } + return + } - /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become - broken. Streams2/streams3 is a huge black box of confusion, but - somehow overriding the sync state seems to fix things again (and still - seems to work for previous node versions). - */ - part._readableState.sync = false; + if (!err) { + err = new ClientDestroyedError(); + } - part.on('data', onData); - part.on('end', onEnd); - }).on('error', function (err) { - if (curFile) { curFile.emit('error', err); } - }); - }).on('error', function (err) { - boy.emit('error', err); - }).on('finish', function () { - finished = true; - checkFinished(); - }); - } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); - Multipart.prototype.write = function (chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + + // Should not error. + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); } - }; - Multipart.prototype.end = function () { - const self = this; + [kInterceptedDispatch] (opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler) + } - if (self.parser.writable) { - self.parser.end(); - } else if (!self._boy._done) { - process.nextTick(function () { - self._boy._done = true; - self._boy.emit('finish'); - }); + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler) } - }; - function skipPart (part) { - part.resume(); - } + dispatch (opts, handler) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } + + try { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object.') + } - function FileStream (opts) { - Readable.call(this, opts); + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError() + } - this.bytesRead = 0; + if (this[kClosed]) { + throw new ClientClosedError() + } - this.truncated = false; - } + return this[kInterceptedDispatch](opts, handler) + } catch (err) { + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } - inherits(FileStream, Readable); + handler.onError(err); - FileStream.prototype._read = function (n) {}; + return false + } + } + } - multipart$1 = Multipart; - return multipart$1; + dispatcherBase$1 = DispatcherBase; + return dispatcherBase$1; } -var Decoder_1; -var hasRequiredDecoder; +var timers$1; +var hasRequiredTimers$1; + +function requireTimers$1 () { + if (hasRequiredTimers$1) return timers$1; + hasRequiredTimers$1 = 1; -function requireDecoder () { - if (hasRequiredDecoder) return Decoder_1; - hasRequiredDecoder = 1; + /** + * This module offers an optimized timer implementation designed for scenarios + * where high precision is not critical. + * + * The timer achieves faster performance by using a low-resolution approach, + * with an accuracy target of within 500ms. This makes it particularly useful + * for timers with delays of 1 second or more, where exact timing is less + * crucial. + * + * It's important to note that Node.js timers are inherently imprecise, as + * delays can occur due to the event loop being blocked by other operations. + * Consequently, timers may trigger later than their scheduled time. + */ - const RE_PLUS = /\+/g; + /** + * The fastNow variable contains the internal fast timer clock value. + * + * @type {number} + */ + let fastNow = 0; - const HEX = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ]; + /** + * RESOLUTION_MS represents the target resolution time in milliseconds. + * + * @type {number} + * @default 1000 + */ + const RESOLUTION_MS = 1e3; - function Decoder () { - this.buffer = undefined; - } - Decoder.prototype.write = function (str) { - // Replace '+' with ' ' before decoding - str = str.replace(RE_PLUS, ' '); - let res = ''; - let i = 0; let p = 0; const len = str.length; - for (; i < len; ++i) { - if (this.buffer !== undefined) { - if (!HEX[str.charCodeAt(i)]) { - res += '%' + this.buffer; - this.buffer = undefined; - --i; // retry character - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = undefined; - } - } - } else if (str[i] === '%') { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ''; - ++p; - } - } - if (p < len && this.buffer === undefined) { res += str.substring(p); } - return res - }; - Decoder.prototype.reset = function () { - this.buffer = undefined; - }; + /** + * TICK_MS defines the desired interval in milliseconds between each tick. + * The target value is set to half the resolution time, minus 1 ms, to account + * for potential event loop overhead. + * + * @type {number} + * @default 499 + */ + const TICK_MS = (RESOLUTION_MS >> 1) - 1; - Decoder_1 = Decoder; - return Decoder_1; -} + /** + * fastNowTimeout is a Node.js timer used to manage and process + * the FastTimers stored in the `fastTimers` array. + * + * @type {NodeJS.Timeout} + */ + let fastNowTimeout; -var urlencoded; -var hasRequiredUrlencoded; + /** + * The kFastTimer symbol is used to identify FastTimer instances. + * + * @type {Symbol} + */ + const kFastTimer = Symbol('kFastTimer'); -function requireUrlencoded () { - if (hasRequiredUrlencoded) return urlencoded; - hasRequiredUrlencoded = 1; + /** + * The fastTimers array contains all active FastTimers. + * + * @type {FastTimer[]} + */ + const fastTimers = []; - const Decoder = requireDecoder(); - const decodeText = requireDecodeText(); - const getLimit = requireGetLimit(); + /** + * These constants represent the various states of a FastTimer. + */ - const RE_CHARSET = /^charset$/i; + /** + * The `NOT_IN_LIST` constant indicates that the FastTimer is not included + * in the `fastTimers` array. Timers with this status will not be processed + * during the next tick by the `onTick` function. + * + * A FastTimer can be re-added to the `fastTimers` array by invoking the + * `refresh` method on the FastTimer instance. + * + * @type {-2} + */ + const NOT_IN_LIST = -2; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded (boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; + /** + * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled + * for removal from the `fastTimers` array. A FastTimer in this state will + * be removed in the next tick by the `onTick` function and will no longer + * be processed. + * + * This status is also set when the `clear` method is called on the FastTimer instance. + * + * @type {-1} + */ + const TO_BE_CLEARED = -1; - this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100); - this.fieldsLimit = getLimit(limits, 'fields', Infinity); + /** + * The `PENDING` constant signifies that the FastTimer is awaiting processing + * in the next tick by the `onTick` function. Timers with this status will have + * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick. + * + * @type {0} + */ + const PENDING = 0; - let charset; - for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var - if (Array.isArray(parsedConType[i]) && - RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break - } - } + /** + * The `ACTIVE` constant indicates that the FastTimer is active and waiting + * for its timer to expire. During the next tick, the `onTick` function will + * check if the timer has expired, and if so, it will execute the associated callback. + * + * @type {1} + */ + const ACTIVE = 1; - if (charset === undefined) { charset = cfg.defCharset || 'utf8'; } + /** + * The onTick function processes the fastTimers array. + * + * @returns {void} + */ + function onTick () { + /** + * Increment the fastNow value by the TICK_MS value, despite the actual time + * that has passed since the last tick. This approach ensures independence + * from the system clock and delays caused by a blocked event loop. + * + * @type {number} + */ + fastNow += TICK_MS; - this.decoder = new Decoder(); - this.charset = charset; - this._fields = 0; - this._state = 'key'; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ''; - this._val = ''; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } + /** + * The `idx` variable is used to iterate over the `fastTimers` array. + * Expired timers are removed by replacing them with the last element in the array. + * Consequently, `idx` is only incremented when the current element is not removed. + * + * @type {number} + */ + let idx = 0; + + /** + * The len variable will contain the length of the fastTimers array + * and will be decremented when a FastTimer should be removed from the + * fastTimers array. + * + * @type {number} + */ + let len = fastTimers.length; + + while (idx < len) { + /** + * @type {FastTimer} + */ + const timer = fastTimers[idx]; - UrlEncoded.prototype.write = function (data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit('fieldsLimit'); + // If the timer is in the ACTIVE state and the timer has expired, it will + // be processed in the next tick. + if (timer._state === PENDING) { + // Set the _idleStart value to the fastNow value minus the TICK_MS value + // to account for the time the timer was in the PENDING state. + timer._idleStart = fastNow - TICK_MS; + timer._state = ACTIVE; + } else if ( + timer._state === ACTIVE && + fastNow >= timer._idleStart + timer._idleTimeout + ) { + timer._state = TO_BE_CLEARED; + timer._idleStart = -1; + timer._onTimeout(timer._timerArg); } - return cb() - } - let idxeq; let idxamp; let i; let p = 0; const len = data.length; + if (timer._state === TO_BE_CLEARED) { + timer._state = NOT_IN_LIST; - while (p < len) { - if (this._state === 'key') { - idxeq = idxamp = undefined; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { ++p; } - if (data[i] === 0x3D/* = */) { - idxeq = i; - break - } else if (data[i] === 0x26/* & */) { - idxamp = i; - break - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; - break - } else if (this._checkingBytes) { ++this._bytesKey; } - } - - if (idxeq !== undefined) { - // key with assignment - if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)); } - this._state = 'val'; - - this._hitLimit = false; - this._checkingBytes = true; - this._val = ''; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - - p = idxeq + 1; - } else if (idxamp !== undefined) { - // key with no assignment - ++this._fields; - let key; const keyTrunc = this._keyTrunc; - if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))); } else { key = this._key; } - - this._hitLimit = false; - this._checkingBytes = true; - this._key = ''; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - - if (key.length) { - this.boy.emit('field', decodeText(key, 'binary', this.charset), - '', - keyTrunc, - false); - } - - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { return cb() } - } else if (this._hitLimit) { - // we may not have hit the actual limit if there are encoded bytes... - if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)); } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - // yep, we actually did hit the limit - this._checkingBytes = false; - this._keyTrunc = true; - } - } else { - if (p < len) { this._key += this.decoder.write(data.toString('binary', p)); } - p = len; + // Move the last element to the current index and decrement len if it is + // not the only element in the array. + if (--len !== 0) { + fastTimers[idx] = fastTimers[len]; } } else { - idxamp = undefined; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { ++p; } - if (data[i] === 0x26/* & */) { - idxamp = i; - break - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break - } else if (this._checkingBytes) { ++this._bytesVal; } - } - - if (idxamp !== undefined) { - ++this._fields; - if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)); } - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - decodeText(this._val, 'binary', this.charset), - this._keyTrunc, - this._valTrunc); - this._state = 'key'; - - this._hitLimit = false; - this._checkingBytes = true; - this._key = ''; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { return cb() } - } else if (this._hitLimit) { - // we may not have hit the actual limit if there are encoded bytes... - if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)); } - p = i; - if ((this._val === '' && this.fieldSizeLimit === 0) || - (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - // yep, we actually did hit the limit - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { this._val += this.decoder.write(data.toString('binary', p)); } - p = len; - } + ++idx; } } - cb(); - }; - UrlEncoded.prototype.end = function () { - if (this.boy._done) { return } + // Set the length of the fastTimers array to the new length and thus + // removing the excess FastTimers elements from the array. + fastTimers.length = len; - if (this._state === 'key' && this._key.length > 0) { - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - '', - this._keyTrunc, - false); - } else if (this._state === 'val') { - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - decodeText(this._val, 'binary', this.charset), - this._keyTrunc, - this._valTrunc); + // If there are still active FastTimers in the array, refresh the Timer. + // If there are no active FastTimers, the timer will be refreshed again + // when a new FastTimer is instantiated. + if (fastTimers.length !== 0) { + refreshTimeout(); } - this.boy._done = true; - this.boy.emit('finish'); - }; - - urlencoded = UrlEncoded; - return urlencoded; -} + } -var hasRequiredMain; + function refreshTimeout () { + // If the fastNowTimeout is already set, refresh it. + if (fastNowTimeout) { + fastNowTimeout.refresh(); + // fastNowTimeout is not instantiated yet, create a new Timer. + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTick, TICK_MS); -function requireMain () { - if (hasRequiredMain) return main.exports; - hasRequiredMain = 1; + // If the Timer has an unref method, call it to allow the process to exit if + // there are no other active handles. + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } + } + } - const WritableStream = require$$0$c.Writable; - const { inherits } = require$$1$4; - const Dicer = requireDicer(); + /** + * The `FastTimer` class is a data structure designed to store and manage + * timer information. + */ + class FastTimer { + [kFastTimer] = true - const MultipartParser = requireMultipart$1(); - const UrlencodedParser = requireUrlencoded(); - const parseParams = requireParseParams(); + /** + * The state of the timer, which can be one of the following: + * - NOT_IN_LIST (-2) + * - TO_BE_CLEARED (-1) + * - PENDING (0) + * - ACTIVE (1) + * + * @type {-2|-1|0|1} + * @private + */ + _state = NOT_IN_LIST - function Busboy (opts) { - if (!(this instanceof Busboy)) { return new Busboy(opts) } + /** + * The number of milliseconds to wait before calling the callback. + * + * @type {number} + * @private + */ + _idleTimeout = -1 - if (typeof opts !== 'object') { - throw new TypeError('Busboy expected an options-Object.') - } - if (typeof opts.headers !== 'object') { - throw new TypeError('Busboy expected an options-Object with headers-attribute.') - } - if (typeof opts.headers['content-type'] !== 'string') { - throw new TypeError('Missing Content-Type-header.') - } + /** + * The time in milliseconds when the timer was started. This value is used to + * calculate when the timer should expire. + * + * @type {number} + * @default -1 + * @private + */ + _idleStart = -1 - const { - headers, - ...streamOptions - } = opts; + /** + * The function to be executed when the timer expires. + * @type {Function} + * @private + */ + _onTimeout - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); + /** + * The argument to be passed to the callback when the timer expires. + * + * @type {*} + * @private + */ + _timerArg - this._done = false; - this._parser = this.getParserByHeaders(headers); - this._finished = false; - } - inherits(Busboy, WritableStream); + /** + * @constructor + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should wait + * before the specified function or code is executed. + * @param {*} arg + */ + constructor (callback, delay, arg) { + this._onTimeout = callback; + this._idleTimeout = delay; + this._timerArg = arg; - Busboy.prototype.emit = function (ev) { - if (ev === 'finish') { - if (!this._done) { - this._parser?.end(); - return - } else if (this._finished) { - return - } - this._finished = true; + this.refresh(); } - WritableStream.prototype.emit.apply(this, arguments); - }; - Busboy.prototype.getParserByHeaders = function (headers) { - const parsed = parseParams(headers['content-type']); + /** + * Sets the timer's start time to the current time, and reschedules the timer + * to call its callback at the previously specified duration adjusted to the + * current time. + * Using this on a timer that has already called its callback will reactivate + * the timer. + * + * @returns {void} + */ + refresh () { + // In the special case that the timer is not in the list of active timers, + // add it back to the array to be processed in the next tick by the onTick + // function. + if (this._state === NOT_IN_LIST) { + fastTimers.push(this); + } - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; + // If the timer is the only active timer, refresh the fastNowTimeout for + // better resolution. + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg) - } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg) + // Setting the state to PENDING will cause the timer to be reset in the + // next tick by the onTick function. + this._state = PENDING; } - throw new Error('Unsupported Content-Type.') - }; - Busboy.prototype._write = function (chunk, encoding, cb) { - this._parser.write(chunk, cb); - }; + /** + * The `clear` method cancels the timer, preventing it from executing. + * + * @returns {void} + * @private + */ + clear () { + // Set the state to TO_BE_CLEARED to mark the timer for removal in the next + // tick by the onTick function. + this._state = TO_BE_CLEARED; - main.exports = Busboy; - main.exports.default = Busboy; - main.exports.Busboy = Busboy; + // Reset the _idleStart value to -1 to indicate that the timer is no longer + // active. + this._idleStart = -1; + } + } - main.exports.Dicer = Dicer; - return main.exports; + /** + * This module exports a setTimeout and clearTimeout function that can be + * used as a drop-in replacement for the native functions. + */ + timers$1 = { + /** + * The setTimeout() method sets a timer which executes a function once the + * timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {NodeJS.Timeout|FastTimer} + */ + setTimeout (callback, delay, arg) { + // If the delay is less than or equal to the RESOLUTION_MS value return a + // native Node.js Timer instance. + return delay <= RESOLUTION_MS + ? setTimeout(callback, delay, arg) + : new FastTimer(callback, delay, arg) + }, + /** + * The clearTimeout method cancels an instantiated Timer previously created + * by calling setTimeout. + * + * @param {NodeJS.Timeout|FastTimer} timeout + */ + clearTimeout (timeout) { + // If the timeout is a FastTimer, call its own clear method. + if (timeout[kFastTimer]) { + /** + * @type {FastTimer} + */ + timeout.clear(); + // Otherwise it is an instance of a native NodeJS.Timeout, so call the + // Node.js native clearTimeout function. + } else { + clearTimeout(timeout); + } + }, + /** + * The setFastTimeout() method sets a fastTimer which executes a function once + * the timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {FastTimer} + */ + setFastTimeout (callback, delay, arg) { + return new FastTimer(callback, delay, arg) + }, + /** + * The clearTimeout method cancels an instantiated FastTimer previously + * created by calling setFastTimeout. + * + * @param {FastTimer} timeout + */ + clearFastTimeout (timeout) { + timeout.clear(); + }, + /** + * The now method returns the value of the internal fast timer clock. + * + * @returns {number} + */ + now () { + return fastNow + }, + /** + * Trigger the onTick function to process the fastTimers array. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + * @param {number} [delay=0] The delay in milliseconds to add to the now value. + */ + tick (delay = 0) { + fastNow += delay - RESOLUTION_MS + 1; + onTick(); + onTick(); + }, + /** + * Reset FastTimers. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + reset () { + fastNow = 0; + fastTimers.length = 0; + clearTimeout(fastNowTimeout); + fastNowTimeout = null; + }, + /** + * Exporting for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + kFastTimer + }; + return timers$1; } -var constants$a; -var hasRequiredConstants$a; +var connect$1; +var hasRequiredConnect$1; -function requireConstants$a () { - if (hasRequiredConstants$a) return constants$a; - hasRequiredConstants$a = 1; +function requireConnect$1 () { + if (hasRequiredConnect$1) return connect$1; + hasRequiredConnect$1 = 1; - const { MessageChannel, receiveMessageOnPort } = require$$0$d; + const net = require$$0$9; + const assert = require$$0$7; + const util = requireUtil$h(); + const { InvalidArgumentError, ConnectTimeoutError } = requireErrors$2(); + const timers = requireTimers$1(); + + function noop () {} + + let tls; // include tls conditionally since it is not always available + + // TODO: session re-use does not wait for the first + // connection to resolve the session and might therefore + // resolve the same servername multiple times even when + // re-use is enabled. + + let SessionCache; + // FIXME: remove workaround when the Node bug is fixed + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (commonjsGlobal.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map(); + this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return + } + + const ref = this._sessionCache.get(key); + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key); + } + }); + } + + get (sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); + } + }; + } else { + SessionCache = class SimpleSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map(); + } + + get (sessionKey) { + return this._sessionCache.get(sessionKey) + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + if (this._sessionCache.size >= this._maxCachedSessions) { + // remove the oldest session + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + + this._sessionCache.set(sessionKey, session); + } + }; + } + + function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + } + + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 10e3 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === 'https:') { + if (!tls) { + tls = require$$5; + } + servername = servername || options.servername || util.getServerName(host) || null; + + const sessionKey = servername || hostname; + assert(sessionKey); + + const session = customSession || sessionCache.get(sessionKey) || null; + + port = port || 443; + + socket = tls.connect({ + highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], + socket: httpSocket, // upgrade socket connection + port, + host: hostname + }); + + socket + .on('session', function (session) { + // TODO (fix): Can a session become invalid once established? Don't think so? + sessionCache.set(sessionKey, session); + }); + } else { + assert(!httpSocket, 'httpSocket can only be sent on TLS update'); + + port = port || 80; + + socket = net.connect({ + highWaterMark: 64 * 1024, // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }); + } + + // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + + const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); + + socket + .setNoDelay(true) + .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { + queueMicrotask(clearConnectTimeout); + + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }) + .on('error', function (err) { + queueMicrotask(clearConnectTimeout); + + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + + return socket + } + } + + /** + * @param {WeakRef} socketWeakRef + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + * @returns {() => void} + */ + const setupConnectTimeout = process.platform === 'win32' + ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } + + let s1 = null; + let s2 = null; + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + // Windows needs an extra setImmediate probably due to implementation differences in the socket logic + s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + clearImmediate(s2); + } + } + : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } + + let s1 = null; + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + } + }; + + /** + * @param {net.Socket} socket + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + */ + function onConnectTimeout (socket, opts) { + // The socket could be already garbage collected + if (socket == null) { + return + } + + let message = 'Connect Timeout Error'; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`; + } else { + message += ` (attempted address: ${opts.hostname}:${opts.port},`; + } + + message += ` timeout: ${opts.timeout}ms)`; + + util.destroy(socket, new ConnectTimeoutError(message)); + } + + connect$1 = buildConnector; + return connect$1; +} + +var constants$f = {}; + +var utils$3 = {}; + +var hasRequiredUtils$3; + +function requireUtils$3 () { + if (hasRequiredUtils$3) return utils$3; + hasRequiredUtils$3 = 1; + Object.defineProperty(utils$3, "__esModule", { value: true }); + utils$3.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === 'number') { + res[key] = value; + } + }); + return res; + } + utils$3.enumToMap = enumToMap; + + return utils$3; +} + +var hasRequiredConstants$f; + +function requireConstants$f () { + if (hasRequiredConstants$f) return constants$f; + hasRequiredConstants$f = 1; + (function (exports$1) { + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; + const utils_1 = requireUtils$3(); + (function (ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; + })(exports$1.ERROR || (exports$1.ERROR = {})); + (function (TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; + })(exports$1.TYPE || (exports$1.TYPE = {})); + (function (FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + // 1 << 8 is unused + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(exports$1.FLAGS || (exports$1.FLAGS = {})); + (function (LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); + var METHODS; + (function (METHODS) { + METHODS[METHODS["DELETE"] = 0] = "DELETE"; + METHODS[METHODS["GET"] = 1] = "GET"; + METHODS[METHODS["HEAD"] = 2] = "HEAD"; + METHODS[METHODS["POST"] = 3] = "POST"; + METHODS[METHODS["PUT"] = 4] = "PUT"; + /* pathological */ + METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; + METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; + METHODS[METHODS["TRACE"] = 7] = "TRACE"; + /* WebDAV */ + METHODS[METHODS["COPY"] = 8] = "COPY"; + METHODS[METHODS["LOCK"] = 9] = "LOCK"; + METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; + METHODS[METHODS["MOVE"] = 11] = "MOVE"; + METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; + METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; + METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; + METHODS[METHODS["BIND"] = 16] = "BIND"; + METHODS[METHODS["REBIND"] = 17] = "REBIND"; + METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; + METHODS[METHODS["ACL"] = 19] = "ACL"; + /* subversion */ + METHODS[METHODS["REPORT"] = 20] = "REPORT"; + METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS[METHODS["MERGE"] = 23] = "MERGE"; + /* upnp */ + METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; + METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + /* RFC-5789 */ + METHODS[METHODS["PATCH"] = 28] = "PATCH"; + METHODS[METHODS["PURGE"] = 29] = "PURGE"; + /* CalDAV */ + METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; + /* RFC-2068, section 19.6.1.2 */ + METHODS[METHODS["LINK"] = 31] = "LINK"; + METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; + /* icecast */ + METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; + /* RFC-7540, section 11.6 */ + METHODS[METHODS["PRI"] = 34] = "PRI"; + /* RFC-2326 RTSP */ + METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS[METHODS["SETUP"] = 37] = "SETUP"; + METHODS[METHODS["PLAY"] = 38] = "PLAY"; + METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; + METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; + METHODS[METHODS["RECORD"] = 44] = "RECORD"; + /* RAOP */ + METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); + exports$1.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS['M-SEARCH'], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE, + ]; + exports$1.METHODS_ICE = [ + METHODS.SOURCE, + ]; + exports$1.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST, + ]; + exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); + exports$1.H_METHOD_MAP = {}; + Object.keys(exports$1.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; + } + }); + (function (FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; + })(exports$1.FINISH || (exports$1.FINISH = {})); + exports$1.ALPHA = []; + for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { + // Upper case + exports$1.ALPHA.push(String.fromCharCode(i)); + // Lower case + exports$1.ALPHA.push(String.fromCharCode(i + 0x20)); + } + exports$1.NUM_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + }; + exports$1.HEX_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, + a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, + }; + exports$1.NUM = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + ]; + exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); + exports$1.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; + exports$1.USERINFO_CHARS = exports$1.ALPHANUM + .concat(exports$1.MARK) + .concat(['%', ';', ':', '&', '=', '+', '$', ',']); + // TODO(indutny): use RFC + exports$1.STRICT_URL_CHAR = [ + '!', '"', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + ':', ';', '<', '=', '>', + '@', '[', '\\', ']', '^', '_', + '`', + '{', '|', '}', '~', + ].concat(exports$1.ALPHANUM); + exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR + .concat(['\t', '\f']); + // All characters with 0x80 bit set to 1 + for (let i = 0x80; i <= 0xff; i++) { + exports$1.URL_CHAR.push(i); + } + exports$1.HEX = exports$1.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); + /* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ + exports$1.STRICT_TOKEN = [ + '!', '#', '$', '%', '&', '\'', + '*', '+', '-', '.', + '^', '_', '`', + '|', '~', + ].concat(exports$1.ALPHANUM); + exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([' ']); + /* + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + */ + exports$1.HEADER_CHARS = ['\t']; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports$1.HEADER_CHARS.push(i); + } + } + // ',' = \x44 + exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); + exports$1.MAJOR = exports$1.NUM_MAP; + exports$1.MINOR = exports$1.MAJOR; + var HEADER_STATE; + (function (HEADER_STATE) { + HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); + exports$1.SPECIAL_HEADERS = { + 'connection': HEADER_STATE.CONNECTION, + 'content-length': HEADER_STATE.CONTENT_LENGTH, + 'proxy-connection': HEADER_STATE.CONNECTION, + 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, + 'upgrade': HEADER_STATE.UPGRADE, + }; + + } (constants$f)); + return constants$f; +} + +var llhttpWasm$1; +var hasRequiredLlhttpWasm$1; + +function requireLlhttpWasm$1 () { + if (hasRequiredLlhttpWasm$1) return llhttpWasm$1; + hasRequiredLlhttpWasm$1 = 1; + + const { Buffer } = require$$0$6; + + llhttpWasm$1 = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv', 'base64'); + return llhttpWasm$1; +} + +var llhttp_simdWasm$1; +var hasRequiredLlhttp_simdWasm$1; - const corsSafeListedMethods = ['GET', 'HEAD', 'POST']; +function requireLlhttp_simdWasm$1 () { + if (hasRequiredLlhttp_simdWasm$1) return llhttp_simdWasm$1; + hasRequiredLlhttp_simdWasm$1 = 1; + + const { Buffer } = require$$0$6; + + llhttp_simdWasm$1 = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==', 'base64'); + return llhttp_simdWasm$1; +} + +var constants$e; +var hasRequiredConstants$e; + +function requireConstants$e () { + if (hasRequiredConstants$e) return constants$e; + hasRequiredConstants$e = 1; + + const corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST']); const corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - const nullBodyStatus = [101, 204, 205, 304]; + const nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304]); - const redirectStatus = [301, 302, 303, 307, 308]; + const redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308]); const redirectStatusSet = new Set(redirectStatus); - // https://fetch.spec.whatwg.org/#block-bad-port - const badPorts = [ + /** + * @see https://fetch.spec.whatwg.org/#block-bad-port + */ + const badPorts = /** @type {const} */ ([ '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', - '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', - '10080' - ]; - + '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679', + '6697', '10080' + ]); const badPortsSet = new Set(badPorts); - // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies - const referrerPolicy = [ + /** + * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies + */ + const referrerPolicy = /** @type {const} */ ([ '', 'no-referrer', 'no-referrer-when-downgrade', @@ -3467,29 +4168,31 @@ function requireConstants$a () { 'origin-when-cross-origin', 'strict-origin-when-cross-origin', 'unsafe-url' - ]; + ]); const referrerPolicySet = new Set(referrerPolicy); - const requestRedirect = ['follow', 'manual', 'error']; + const requestRedirect = /** @type {const} */ (['follow', 'manual', 'error']); - const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']; + const safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE']); const safeMethodsSet = new Set(safeMethods); - const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']; + const requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors']); - const requestCredentials = ['omit', 'same-origin', 'include']; + const requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include']); - const requestCache = [ + const requestCache = /** @type {const} */ ([ 'default', 'no-store', 'reload', 'no-cache', 'force-cache', 'only-if-cached' - ]; + ]); - // https://fetch.spec.whatwg.org/#request-body-header-name - const requestBodyHeader = [ + /** + * @see https://fetch.spec.whatwg.org/#request-body-header-name + */ + const requestBodyHeader = /** @type {const} */ ([ 'content-encoding', 'content-language', 'content-location', @@ -3499,18 +4202,22 @@ function requireConstants$a () { // removed in the Headers implementation. However, undici doesn't // filter out headers, so we add it here. 'content-length' - ]; + ]); - // https://fetch.spec.whatwg.org/#enumdef-requestduplex - const requestDuplex = [ + /** + * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex + */ + const requestDuplex = /** @type {const} */ ([ 'half' - ]; + ]); - // http://fetch.spec.whatwg.org/#forbidden-method - const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']; + /** + * @see http://fetch.spec.whatwg.org/#forbidden-method + */ + const forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK']); const forbiddenMethodsSet = new Set(forbiddenMethods); - const subresource = [ + const subresource = /** @type {const} */ ([ 'audio', 'audioworklet', 'font', @@ -3523,44 +4230,10 @@ function requireConstants$a () { 'video', 'xslt', '' - ]; + ]); const subresourceSet = new Set(subresource); - /** @type {globalThis['DOMException']} */ - const DOMException = globalThis.DOMException ?? (() => { - // DOMException was only made a global in Node v17.0.0, - // but fetch supports >= v16.8. - try { - atob('~'); - } catch (err) { - return Object.getPrototypeOf(err).constructor - } - })(); - - let channel; - - /** @type {globalThis['structuredClone']} */ - const structuredClone = - globalThis.structuredClone ?? - // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js - // structuredClone was added in v17.0.0, but fetch supports v16.8 - function structuredClone (value, options = undefined) { - if (arguments.length === 0) { - throw new TypeError('missing argument') - } - - if (!channel) { - channel = new MessageChannel(); - } - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options?.transfer); - return receiveMessageOnPort(channel.port2).message - }; - - constants$a = { - DOMException, - structuredClone, + constants$e = { subresource, forbiddenMethods, requestBodyHeader, @@ -3583,15 +4256,15 @@ function requireConstants$a () { forbiddenMethodsSet, referrerPolicySet }; - return constants$a; + return constants$e; } -var global$2; -var hasRequiredGlobal$1; +var global$4; +var hasRequiredGlobal$3; -function requireGlobal$1 () { - if (hasRequiredGlobal$1) return global$2; - hasRequiredGlobal$1 = 1; +function requireGlobal$3 () { + if (hasRequiredGlobal$3) return global$4; + hasRequiredGlobal$3 = 1; // In case of breaking changes, increase the version // number to avoid conflicts. @@ -3627,1193 +4300,777 @@ function requireGlobal$1 () { }); } - global$2 = { + global$4 = { getGlobalOrigin, setGlobalOrigin }; - return global$2; + return global$4; } -var util$7; -var hasRequiredUtil$7; +var dataUrl$1; +var hasRequiredDataUrl$1; -function requireUtil$7 () { - if (hasRequiredUtil$7) return util$7; - hasRequiredUtil$7 = 1; +function requireDataUrl$1 () { + if (hasRequiredDataUrl$1) return dataUrl$1; + hasRequiredDataUrl$1 = 1; - const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$a(); - const { getGlobalOrigin } = requireGlobal$1(); - const { performance } = require$$2$1; - const { isBlobLike, toUSVString, ReadableStreamFrom } = requireUtil$8(); - const assert = require$$0$8; - const { isUint8Array } = require$$5; + const assert = require$$0$7; - let supportedHashes = []; + const encoder = new TextEncoder(); - // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable - /** @type {import('crypto')|undefined} */ - let crypto; + /** + * @see https://mimesniff.spec.whatwg.org/#http-token-code-point + */ + const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+\-.^_|~A-Za-z0-9]+$/; + const HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; // eslint-disable-line + const ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; // eslint-disable-line + /** + * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point + */ + const HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/; // eslint-disable-line - try { - crypto = require('crypto'); - const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']; - supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); - /* c8 ignore next 3 */ - } catch { - } + // https://fetch.spec.whatwg.org/#data-url-processor + /** @param {URL} dataURL */ + function dataURLProcessor (dataURL) { + // 1. Assert: dataURL’s scheme is "data". + assert(dataURL.protocol === 'data:'); - function responseURL (response) { - // https://fetch.spec.whatwg.org/#responses - // A response has an associated URL. It is a pointer to the last URL - // in response’s URL list and null if response’s URL list is empty. - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString() - } + // 2. Let input be the result of running the URL + // serializer on dataURL with exclude fragment + // set to true. + let input = URLSerializer(dataURL, true); - // https://fetch.spec.whatwg.org/#concept-response-location-url - function responseLocationURL (response, requestFragment) { - // 1. If response’s status is not a redirect status, then return null. - if (!redirectStatusSet.has(response.status)) { - return null - } + // 3. Remove the leading "data:" string from input. + input = input.slice(5); - // 2. Let location be the result of extracting header list values given - // `Location` and response’s header list. - let location = response.headersList.get('location'); + // 4. Let position point at the start of input. + const position = { position: 0 }; - // 3. If location is a header value, then set location to the result of - // parsing location with response’s URL. - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); - } + // 5. Let mimeType be the result of collecting a + // sequence of code points that are not equal + // to U+002C (,), given position. + let mimeType = collectASequenceOfCodePointsFast( + ',', + input, + position + ); - // 4. If location is a URL whose fragment is null, then set location’s - // fragment to requestFragment. - if (location && !location.hash) { - location.hash = requestFragment; - } + // 6. Strip leading and trailing ASCII whitespace + // from mimeType. + // Undici implementation note: we need to store the + // length because if the mimetype has spaces removed, + // the wrong amount will be sliced from the input in + // step #9 + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); - // 5. Return location. - return location - } + // 7. If position is past the end of input, then + // return failure + if (position.position >= input.length) { + return 'failure' + } - /** @returns {URL} */ - function requestCurrentURL (request) { - return request.urlList[request.urlList.length - 1] - } + // 8. Advance position by 1. + position.position++; - function requestBadPort (request) { - // 1. Let url be request’s current URL. - const url = requestCurrentURL(request); + // 9. Let encodedBody be the remainder of input. + const encodedBody = input.slice(mimeTypeLength + 1); - // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, - // then return blocked. - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return 'blocked' - } + // 10. Let body be the percent-decoding of encodedBody. + let body = stringPercentDecode(encodedBody); - // 3. Return allowed. - return 'allowed' - } + // 11. If mimeType ends with U+003B (;), followed by + // zero or more U+0020 SPACE, followed by an ASCII + // case-insensitive match for "base64", then: + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + // 1. Let stringBody be the isomorphic decode of body. + const stringBody = isomorphicDecode(body); - function isErrorLike (object) { - return object instanceof Error || ( - object?.constructor?.name === 'Error' || - object?.constructor?.name === 'DOMException' - ) - } + // 2. Set body to the forgiving-base64 decode of + // stringBody. + body = forgivingBase64(stringBody); - // Check whether |statusText| is a ByteString and - // matches the Reason-Phrase token production. - // RFC 2616: https://tools.ietf.org/html/rfc2616 - // RFC 7230: https://tools.ietf.org/html/rfc7230 - // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" - // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 - function isValidReasonPhrase (statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if ( - !( - ( - c === 0x09 || // HTAB - (c >= 0x20 && c <= 0x7e) || // SP / VCHAR - (c >= 0x80 && c <= 0xff) - ) // obs-text - ) - ) { - return false + // 3. If body is failure, then return failure. + if (body === 'failure') { + return 'failure' } - } - return true - } - /** - * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 - * @param {number} c - */ - function isTokenCharCode (c) { - switch (c) { - case 0x22: - case 0x28: - case 0x29: - case 0x2c: - case 0x2f: - case 0x3a: - case 0x3b: - case 0x3c: - case 0x3d: - case 0x3e: - case 0x3f: - case 0x40: - case 0x5b: - case 0x5c: - case 0x5d: - case 0x7b: - case 0x7d: - // DQUOTE and "(),/:;<=>?@[\]{}" - return false - default: - // VCHAR %x21-7E - return c >= 0x21 && c <= 0x7e + // 4. Remove the last 6 code points from mimeType. + mimeType = mimeType.slice(0, -6); + + // 5. Remove trailing U+0020 SPACE code points from mimeType, + // if any. + mimeType = mimeType.replace(/(\u0020)+$/, ''); + + // 6. Remove the last U+003B (;) code point from mimeType. + mimeType = mimeType.slice(0, -1); } - } - /** - * @param {string} characters - */ - function isValidHTTPToken (characters) { - if (characters.length === 0) { - return false + // 12. If mimeType starts with U+003B (;), then prepend + // "text/plain" to mimeType. + if (mimeType.startsWith(';')) { + mimeType = 'text/plain' + mimeType; } - for (let i = 0; i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false - } + + // 13. Let mimeTypeRecord be the result of parsing + // mimeType. + let mimeTypeRecord = parseMIMEType(mimeType); + + // 14. If mimeTypeRecord is failure, then set + // mimeTypeRecord to text/plain;charset=US-ASCII. + if (mimeTypeRecord === 'failure') { + mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII'); } - return true - } - /** - * @see https://fetch.spec.whatwg.org/#header-name - * @param {string} potentialValue - */ - function isValidHeaderName (potentialValue) { - return isValidHTTPToken(potentialValue) + // 15. Return a new data: URL struct whose MIME + // type is mimeTypeRecord and body is body. + // https://fetch.spec.whatwg.org/#data-url-struct + return { mimeType: mimeTypeRecord, body } } + // https://url.spec.whatwg.org/#concept-url-serializer /** - * @see https://fetch.spec.whatwg.org/#header-value - * @param {string} potentialValue + * @param {URL} url + * @param {boolean} excludeFragment */ - function isValidHeaderValue (potentialValue) { - // - Has no leading or trailing HTTP tab or space bytes. - // - Contains no 0x00 (NUL) or HTTP newline bytes. - if ( - potentialValue.startsWith('\t') || - potentialValue.startsWith(' ') || - potentialValue.endsWith('\t') || - potentialValue.endsWith(' ') - ) { - return false + function URLSerializer (url, excludeFragment = false) { + if (!excludeFragment) { + return url.href } - if ( - potentialValue.includes('\0') || - potentialValue.includes('\r') || - potentialValue.includes('\n') - ) { - return false + const href = url.href; + const hashLength = url.hash.length; + + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + + if (!hashLength && href.endsWith('#')) { + return serialized.slice(0, -1) } - return true + return serialized } - // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect - function setRequestReferrerPolicyOnRedirect (request, actualResponse) { - // Given a request request and a response actualResponse, this algorithm - // updates request’s referrer policy according to the Referrer-Policy - // header (if any) in actualResponse. - - // 1. Let policy be the result of executing § 8.1 Parse a referrer policy - // from a Referrer-Policy header on actualResponse. + // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points + /** + * @param {(char: string) => boolean} condition + * @param {string} input + * @param {{ position: number }} position + */ + function collectASequenceOfCodePoints (condition, input, position) { + // 1. Let result be the empty string. + let result = ''; - // 8.1 Parse a referrer policy from a Referrer-Policy header - // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. - const { headersList } = actualResponse; - // 2. Let policy be the empty string. - // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. - // 4. Return policy. - const policyHeader = (headersList.get('referrer-policy') ?? '').split(','); + // 2. While position doesn’t point past the end of input and the + // code point at position within input meets the condition condition: + while (position.position < input.length && condition(input[position.position])) { + // 1. Append that code point to the end of result. + result += input[position.position]; - // Note: As the referrer-policy can contain multiple policies - // separated by comma, we need to loop through all of them - // and pick the first valid one. - // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy - let policy = ''; - if (policyHeader.length > 0) { - // The right-most policy takes precedence. - // The left-most policy is the fallback. - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break - } - } + // 2. Advance position by 1. + position.position++; } - // 2. If policy is not the empty string, then set request’s referrer policy to policy. - if (policy !== '') { - request.referrerPolicy = policy; - } + // 3. Return result. + return result } - // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check - function crossOriginResourcePolicyCheck () { - // TODO - return 'allowed' - } + /** + * A faster collectASequenceOfCodePoints that only works when comparing a single character. + * @param {string} char + * @param {string} input + * @param {{ position: number }} position + */ + function collectASequenceOfCodePointsFast (char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; - // https://fetch.spec.whatwg.org/#concept-cors-check - function corsCheck () { - // TODO - return 'success' - } + if (idx === -1) { + position.position = input.length; + return input.slice(start) + } - // https://fetch.spec.whatwg.org/#concept-tao-check - function TAOCheck () { - // TODO - return 'success' + position.position = idx; + return input.slice(start, position.position) } - function appendFetchMetadata (httpRequest) { - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header - // TODO - - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header - - // 1. Assert: r’s url is a potentially trustworthy URL. - // TODO - - // 2. Let header be a Structured Header whose value is a token. - let header = null; - - // 3. Set header’s value to r’s mode. - header = httpRequest.mode; + // https://url.spec.whatwg.org/#string-percent-decode + /** @param {string} input */ + function stringPercentDecode (input) { + // 1. Let bytes be the UTF-8 encoding of input. + const bytes = encoder.encode(input); - // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. - httpRequest.headersList.set('sec-fetch-mode', header); + // 2. Return the percent-decoding of bytes. + return percentDecode(bytes) + } - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header - // TODO + /** + * @param {number} byte + */ + function isHexCharByte (byte) { + // 0-9 A-F a-f + return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66) + } - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header - // TODO + /** + * @param {number} byte + */ + function hexByteToNumber (byte) { + return ( + // 0-9 + byte >= 0x30 && byte <= 0x39 + ? (byte - 48) + // Convert to uppercase + // ((byte & 0xDF) - 65) + 10 + : ((byte & 0xDF) - 55) + ) } - // https://fetch.spec.whatwg.org/#append-a-request-origin-header - function appendRequestOriginHeader (request) { - // 1. Let serializedOrigin be the result of byte-serializing a request origin with request. - let serializedOrigin = request.origin; + // https://url.spec.whatwg.org/#percent-decode + /** @param {Uint8Array} input */ + function percentDecode (input) { + const length = input.length; + // 1. Let output be an empty byte sequence. + /** @type {Uint8Array} */ + const output = new Uint8Array(length); + let j = 0; + // 2. For each byte byte in input: + for (let i = 0; i < length; ++i) { + const byte = input[i]; - // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list. - if (request.responseTainting === 'cors' || request.mode === 'websocket') { - if (serializedOrigin) { - request.headersList.append('origin', serializedOrigin); - } + // 1. If byte is not 0x25 (%), then append byte to output. + if (byte !== 0x25) { + output[j++] = byte; - // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: - } else if (request.method !== 'GET' && request.method !== 'HEAD') { - // 1. Switch on request’s referrer policy: - switch (request.referrerPolicy) { - case 'no-referrer': - // Set serializedOrigin to `null`. - serializedOrigin = null; - break - case 'no-referrer-when-downgrade': - case 'strict-origin': - case 'strict-origin-when-cross-origin': - // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`. - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break - case 'same-origin': - // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`. - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break - // Do nothing. - } + // 2. Otherwise, if byte is 0x25 (%) and the next two bytes + // after byte in input are not in the ranges + // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), + // and 0x61 (a) to 0x66 (f), all inclusive, append byte + // to output. + } else if ( + byte === 0x25 && + !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2])) + ) { + output[j++] = 0x25; + + // 3. Otherwise: + } else { + // 1. Let bytePoint be the two bytes after byte in input, + // decoded, and then interpreted as hexadecimal number. + // 2. Append a byte whose value is bytePoint to output. + output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2]); - if (serializedOrigin) { - // 2. Append (`Origin`, serializedOrigin) to request’s header list. - request.headersList.append('origin', serializedOrigin); + // 3. Skip the next two bytes in input. + i += 2; } } - } - function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { - // TODO - return performance.now() + // 3. Return output. + return length === j ? output : output.subarray(0, j) } - // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info - function createOpaqueTimingInfo (timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - } - } + // https://mimesniff.spec.whatwg.org/#parse-a-mime-type + /** @param {string} input */ + function parseMIMEType (input) { + // 1. Remove any leading and trailing HTTP whitespace + // from input. + input = removeHTTPWhitespace(input, true, true); - // https://html.spec.whatwg.org/multipage/origin.html#policy-container - function makePolicyContainer () { - // Note: the fetch spec doesn't make use of embedder policy or CSP list - return { - referrerPolicy: 'strict-origin-when-cross-origin' + // 2. Let position be a position variable for input, + // initially pointing at the start of input. + const position = { position: 0 }; + + // 3. Let type be the result of collecting a sequence + // of code points that are not U+002F (/) from + // input, given position. + const type = collectASequenceOfCodePointsFast( + '/', + input, + position + ); + + // 4. If type is the empty string or does not solely + // contain HTTP token code points, then return failure. + // https://mimesniff.spec.whatwg.org/#http-token-code-point + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return 'failure' } - } - // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container - function clonePolicyContainer (policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy + // 5. If position is past the end of input, then return + // failure + if (position.position > input.length) { + return 'failure' } - } - // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer - function determineRequestsReferrer (request) { - // 1. Let policy be request's referrer policy. - const policy = request.referrerPolicy; + // 6. Advance position by 1. (This skips past U+002F (/).) + position.position++; - // Note: policy cannot (shouldn't) be null or an empty string. - assert(policy); + // 7. Let subtype be the result of collecting a sequence of + // code points that are not U+003B (;) from input, given + // position. + let subtype = collectASequenceOfCodePointsFast( + ';', + input, + position + ); - // 2. Let environment be request’s client. + // 8. Remove any trailing HTTP whitespace from subtype. + subtype = removeHTTPWhitespace(subtype, false, true); - let referrerSource = null; + // 9. If subtype is the empty string or does not solely + // contain HTTP token code points, then return failure. + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return 'failure' + } - // 3. Switch on request’s referrer: - if (request.referrer === 'client') { - // Note: node isn't a browser and doesn't implement document/iframes, - // so we bypass this step and replace it with our own. + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); - const globalOrigin = getGlobalOrigin(); + // 10. Let mimeType be a new MIME type record whose type + // is type, in ASCII lowercase, and subtype is subtype, + // in ASCII lowercase. + // https://mimesniff.spec.whatwg.org/#mime-type + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; - if (!globalOrigin || globalOrigin.origin === 'null') { - return 'no-referrer' - } + // 11. While position is not past the end of input: + while (position.position < input.length) { + // 1. Advance position by 1. (This skips past U+003B (;).) + position.position++; - // note: we need to clone it as it's mutated - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - // Let referrerSource be request’s referrer. - referrerSource = request.referrer; - } + // 2. Collect a sequence of code points that are HTTP + // whitespace from input given position. + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + char => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); - // 4. Let request’s referrerURL be the result of stripping referrerSource for - // use as a referrer. - let referrerURL = stripURLForReferrer(referrerSource); + // 3. Let parameterName be the result of collecting a + // sequence of code points that are not U+003B (;) + // or U+003D (=) from input, given position. + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ';' && char !== '=', + input, + position + ); - // 5. Let referrerOrigin be the result of stripping referrerSource for use as - // a referrer, with the origin-only flag set to true. - const referrerOrigin = stripURLForReferrer(referrerSource, true); + // 4. Set parameterName to parameterName, in ASCII + // lowercase. + parameterName = parameterName.toLowerCase(); - // 6. If the result of serializing referrerURL is a string whose length is - // greater than 4096, set referrerURL to referrerOrigin. - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } + // 5. If position is not past the end of input, then: + if (position.position < input.length) { + // 1. If the code point at position within input is + // U+003B (;), then continue. + if (input[position.position] === ';') { + continue + } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && - !isURLPotentiallyTrustworthy(request.url); + // 2. Advance position by 1. (This skips past U+003D (=).) + position.position++; + } - // 8. Execute the switch statements corresponding to the value of policy: - switch (policy) { - case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) - case 'unsafe-url': return referrerURL - case 'same-origin': - return areSameOrigin ? referrerOrigin : 'no-referrer' - case 'origin-when-cross-origin': - return areSameOrigin ? referrerURL : referrerOrigin - case 'strict-origin-when-cross-origin': { - const currentURL = requestCurrentURL(request); + // 6. If position is past the end of input, then break. + if (position.position > input.length) { + break + } - // 1. If the origin of referrerURL and the origin of request’s current - // URL are the same, then return referrerURL. - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL - } + // 7. Let parameterValue be null. + let parameterValue = null; - // 2. If referrerURL is a potentially trustworthy URL and request’s - // current URL is not a potentially trustworthy URL, then return no - // referrer. - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return 'no-referrer' - } + // 8. If the code point at position within input is + // U+0022 ("), then: + if (input[position.position] === '"') { + // 1. Set parameterValue to the result of collecting + // an HTTP quoted string from input, given position + // and the extract-value flag. + parameterValue = collectAnHTTPQuotedString(input, position, true); - // 3. Return referrerOrigin. - return referrerOrigin + // 2. Collect a sequence of code points that are not + // U+003B (;) from input, given position. + collectASequenceOfCodePointsFast( + ';', + input, + position + ); + + // 9. Otherwise: + } else { + // 1. Set parameterValue to the result of collecting + // a sequence of code points that are not U+003B (;) + // from input, given position. + parameterValue = collectASequenceOfCodePointsFast( + ';', + input, + position + ); + + // 2. Remove any trailing HTTP whitespace from parameterValue. + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + + // 3. If parameterValue is the empty string, then continue. + if (parameterValue.length === 0) { + continue + } } - case 'strict-origin': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - case 'no-referrer-when-downgrade': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - default: // eslint-disable-line - return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + // 10. If all of the following are true + // - parameterName is not the empty string + // - parameterName solely contains HTTP token code points + // - parameterValue solely contains HTTP quoted-string token code points + // - mimeType’s parameters[parameterName] does not exist + // then set mimeType’s parameters[parameterName] to parameterValue. + if ( + parameterName.length !== 0 && + HTTP_TOKEN_CODEPOINTS.test(parameterName) && + (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && + !mimeType.parameters.has(parameterName) + ) { + mimeType.parameters.set(parameterName, parameterValue); + } } + + // 12. Return mimeType. + return mimeType } - /** - * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url - * @param {URL} url - * @param {boolean|undefined} originOnly - */ - function stripURLForReferrer (url, originOnly) { - // 1. Assert: url is a URL. - assert(url instanceof URL); + // https://infra.spec.whatwg.org/#forgiving-base64-decode + /** @param {string} data */ + function forgivingBase64 (data) { + // 1. Remove all ASCII whitespace from data. + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ''); // eslint-disable-line - // 2. If url’s scheme is a local scheme, then return no referrer. - if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { - return 'no-referrer' + let dataLength = data.length; + // 2. If data’s code point length divides by 4 leaving + // no remainder, then: + if (dataLength % 4 === 0) { + // 1. If data ends with one or two U+003D (=) code points, + // then remove them from data. + if (data.charCodeAt(dataLength - 1) === 0x003D) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 0x003D) { + --dataLength; + } + } } - // 3. Set url’s username to the empty string. - url.username = ''; + // 3. If data’s code point length divides by 4 leaving + // a remainder of 1, then return failure. + if (dataLength % 4 === 1) { + return 'failure' + } - // 4. Set url’s password to the empty string. - url.password = ''; + // 4. If data contains a code point that is not one of + // U+002B (+) + // U+002F (/) + // ASCII alphanumeric + // then return failure. + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { + return 'failure' + } - // 5. Set url’s fragment to null. - url.hash = ''; + const buffer = Buffer.from(data, 'base64'); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) + } - // 6. If the origin-only flag is true, then: - if (originOnly) { - // 1. Set url’s path to « the empty string ». - url.pathname = ''; + // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string + // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string + /** + * @param {string} input + * @param {{ position: number }} position + * @param {boolean?} extractValue + */ + function collectAnHTTPQuotedString (input, position, extractValue) { + // 1. Let positionStart be position. + const positionStart = position.position; - // 2. Set url’s query to null. - url.search = ''; - } + // 2. Let value be the empty string. + let value = ''; - // 7. Return url. - return url - } + // 3. Assert: the code point at position within input + // is U+0022 ("). + assert(input[position.position] === '"'); - function isURLPotentiallyTrustworthy (url) { - if (!(url instanceof URL)) { - return false - } + // 4. Advance position by 1. + position.position++; - // If child of about, return true - if (url.href === 'about:blank' || url.href === 'about:srcdoc') { - return true - } + // 5. While true: + while (true) { + // 1. Append the result of collecting a sequence of code points + // that are not U+0022 (") or U+005C (\) from input, given + // position, to value. + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== '\\', + input, + position + ); - // If scheme is data, return true - if (url.protocol === 'data:') return true + // 2. If position is past the end of input, then break. + if (position.position >= input.length) { + break + } - // If file, return true - if (url.protocol === 'file:') return true + // 3. Let quoteOrBackslash be the code point at position within + // input. + const quoteOrBackslash = input[position.position]; - return isOriginPotentiallyTrustworthy(url.origin) + // 4. Advance position by 1. + position.position++; - function isOriginPotentiallyTrustworthy (origin) { - // If origin is explicitly null, return false - if (origin == null || origin === 'null') return false + // 5. If quoteOrBackslash is U+005C (\), then: + if (quoteOrBackslash === '\\') { + // 1. If position is past the end of input, then append + // U+005C (\) to value and break. + if (position.position >= input.length) { + value += '\\'; + break + } - const originAsURL = new URL(origin); + // 2. Append the code point at position within input to value. + value += input[position.position]; - // If secure, return true - if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { - return true - } + // 3. Advance position by 1. + position.position++; - // If localhost or variants, return true - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || - (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || - (originAsURL.hostname.endsWith('.localhost'))) { - return true + // 6. Otherwise: + } else { + // 1. Assert: quoteOrBackslash is U+0022 ("). + assert(quoteOrBackslash === '"'); + + // 2. Break. + break } + } - // If any other, return false - return false + // 6. If the extract-value flag is set, then return value. + if (extractValue) { + return value } + + // 7. Return the code points from positionStart to position, + // inclusive, within input. + return input.slice(positionStart, position.position) } /** - * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist - * @param {Uint8Array} bytes - * @param {string} metadataList + * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type */ - function bytesMatch (bytes, metadataList) { - // If node is not built with OpenSSL support, we cannot check - // a request's integrity, so allow it by default (the spec will - // allow requests if an invalid hash is given, as precedence). - /* istanbul ignore if: only if node is built with --without-ssl */ - if (crypto === undefined) { - return true - } - - // 1. Let parsedMetadata be the result of parsing metadataList. - const parsedMetadata = parseMetadata(metadataList); - - // 2. If parsedMetadata is no metadata, return true. - if (parsedMetadata === 'no metadata') { - return true - } - - // 3. If response is not eligible for integrity validation, return false. - // TODO + function serializeAMimeType (mimeType) { + assert(mimeType !== 'failure'); + const { parameters, essence } = mimeType; - // 4. If parsedMetadata is the empty set, return true. - if (parsedMetadata.length === 0) { - return true - } + // 1. Let serialization be the concatenation of mimeType’s + // type, U+002F (/), and mimeType’s subtype. + let serialization = essence; - // 5. Let metadata be the result of getting the strongest - // metadata from parsedMetadata. - const strongest = getStrongestMetadata(parsedMetadata); - const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + // 2. For each name → value of mimeType’s parameters: + for (let [name, value] of parameters.entries()) { + // 1. Append U+003B (;) to serialization. + serialization += ';'; - // 6. For each item in metadata: - for (const item of metadata) { - // 1. Let algorithm be the alg component of item. - const algorithm = item.algo; + // 2. Append name to serialization. + serialization += name; - // 2. Let expectedValue be the val component of item. - const expectedValue = item.hash; + // 3. Append U+003D (=) to serialization. + serialization += '='; - // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e - // "be liberal with padding". This is annoying, and it's not even in the spec. + // 4. If value does not solely contain HTTP token code + // points or value is the empty string, then: + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + // 1. Precede each occurrence of U+0022 (") or + // U+005C (\) in value with U+005C (\). + value = value.replace(/(\\|")/g, '\\$1'); - // 3. Let actualValue be the result of applying algorithm to bytes. - let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64'); + // 2. Prepend U+0022 (") to value. + value = '"' + value; - if (actualValue[actualValue.length - 1] === '=') { - if (actualValue[actualValue.length - 2] === '=') { - actualValue = actualValue.slice(0, -2); - } else { - actualValue = actualValue.slice(0, -1); - } + // 3. Append U+0022 (") to value. + value += '"'; } - // 4. If actualValue is a case-sensitive match for expectedValue, - // return true. - if (compareBase64Mixed(actualValue, expectedValue)) { - return true - } + // 5. Append value to serialization. + serialization += value; } - // 7. Return false. - return false + // 3. Return serialization. + return serialization } - // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options - // https://www.w3.org/TR/CSP2/#source-list-syntax - // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 - const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; - /** - * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata - * @param {string} metadata + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {number} char */ - function parseMetadata (metadata) { - // 1. Let result be the empty set. - /** @type {{ algo: string, hash: string }[]} */ - const result = []; - - // 2. Let empty be equal to true. - let empty = true; + function isHTTPWhiteSpace (char) { + // "\r\n\t " + return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020 + } - // 3. For each token returned by splitting metadata on spaces: - for (const token of metadata.split(' ')) { - // 1. Set empty to false. - empty = false; + /** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} str + * @param {boolean} [leading=true] + * @param {boolean} [trailing=true] + */ + function removeHTTPWhitespace (str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isHTTPWhiteSpace) + } - // 2. Parse token as a hash-with-options. - const parsedToken = parseHashWithOptions.exec(token); + /** + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * @param {number} char + */ + function isASCIIWhitespace (char) { + // "\r\n\t\f " + return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x00c || char === 0x020 + } - // 3. If token does not parse, continue to the next token. - if ( - parsedToken === null || - parsedToken.groups === undefined || - parsedToken.groups.algo === undefined - ) { - // Note: Chromium blocks the request at this point, but Firefox - // gives a warning that an invalid integrity was given. The - // correct behavior is to ignore these, and subsequently not - // check the integrity of the resource. - continue - } + /** + * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + * @param {string} str + * @param {boolean} [leading=true] + * @param {boolean} [trailing=true] + */ + function removeASCIIWhitespace (str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace) + } - // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo.toLowerCase(); + /** + * @param {string} str + * @param {boolean} leading + * @param {boolean} trailing + * @param {(charCode: number) => boolean} predicate + * @returns + */ + function removeChars (str, leading, trailing, predicate) { + let lead = 0; + let trail = str.length - 1; - // 5. If algorithm is a hash function recognized by the user - // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm)) { - result.push(parsedToken.groups); - } + if (leading) { + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; } - // 4. Return no metadata if empty is true, otherwise return result. - if (empty === true) { - return 'no metadata' + if (trailing) { + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; } - return result + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1) } /** - * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + * @see https://infra.spec.whatwg.org/#isomorphic-decode + * @param {Uint8Array} input + * @returns {string} */ - function getStrongestMetadata (metadataList) { - // Let algorithm be the algo component of the first item in metadataList. - // Can be sha256 - let algorithm = metadataList[0].algo; - // If the algorithm is sha512, then it is the strongest - // and we can return immediately - if (algorithm[3] === '5') { - return algorithm + function isomorphicDecode (input) { + // 1. To isomorphic decode a byte sequence input, return a string whose code point + // length is equal to input’s length and whose code points have the same values + // as the values of input’s bytes, in the same order. + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input) } - - for (let i = 1; i < metadataList.length; ++i) { - const metadata = metadataList[i]; - // If the algorithm is sha512, then it is the strongest - // and we can break the loop immediately - if (metadata.algo[3] === '5') { - algorithm = 'sha512'; - break - // If the algorithm is sha384, then a potential sha256 or sha384 is ignored - } else if (algorithm[3] === '3') { - continue - // algorithm is sha256, check if algorithm is sha384 and if so, set it as - // the strongest - } else if (metadata.algo[3] === '3') { - algorithm = 'sha384'; + let result = ''; let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); } - return algorithm + return result } - function filterMetadataListByAlgorithm (metadataList, algorithm) { - if (metadataList.length === 1) { - return metadataList - } + /** + * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type + * @param {Exclude, 'failure'>} mimeType + */ + function minimizeSupportedMimeType (mimeType) { + switch (mimeType.essence) { + case 'application/ecmascript': + case 'application/javascript': + case 'application/x-ecmascript': + case 'application/x-javascript': + case 'text/ecmascript': + case 'text/javascript': + case 'text/javascript1.0': + case 'text/javascript1.1': + case 'text/javascript1.2': + case 'text/javascript1.3': + case 'text/javascript1.4': + case 'text/javascript1.5': + case 'text/jscript': + case 'text/livescript': + case 'text/x-ecmascript': + case 'text/x-javascript': + // 1. If mimeType is a JavaScript MIME type, then return "text/javascript". + return 'text/javascript' + case 'application/json': + case 'text/json': + // 2. If mimeType is a JSON MIME type, then return "application/json". + return 'application/json' + case 'image/svg+xml': + // 3. If mimeType’s essence is "image/svg+xml", then return "image/svg+xml". + return 'image/svg+xml' + case 'text/xml': + case 'application/xml': + // 4. If mimeType is an XML MIME type, then return "application/xml". + return 'application/xml' + } + + // 2. If mimeType is a JSON MIME type, then return "application/json". + if (mimeType.subtype.endsWith('+json')) { + return 'application/json' + } + + // 4. If mimeType is an XML MIME type, then return "application/xml". + if (mimeType.subtype.endsWith('+xml')) { + return 'application/xml' + } + + // 5. If mimeType is supported by the user agent, then return mimeType’s essence. + // Technically, node doesn't support any mimetypes. + + // 6. Return the empty string. + return '' + } + + dataUrl$1 = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType, + removeChars, + removeHTTPWhitespace, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS, + isomorphicDecode + }; + return dataUrl$1; +} - let pos = 0; - for (let i = 0; i < metadataList.length; ++i) { - if (metadataList[i].algo === algorithm) { - metadataList[pos++] = metadataList[i]; - } - } +var webidl_1$1; +var hasRequiredWebidl$1; - metadataList.length = pos; +function requireWebidl$1 () { + if (hasRequiredWebidl$1) return webidl_1$1; + hasRequiredWebidl$1 = 1; - return metadataList - } + const { types, inspect } = require$$0$a; + const { markAsUncloneable } = require$$1$3; + const { toUSVString } = requireUtil$h(); - /** - * Compares two base64 strings, allowing for base64url - * in the second string. - * - * @param {string} actualValue always base64 - * @param {string} expectedValue base64 or base64url - * @returns {boolean} - */ - function compareBase64Mixed (actualValue, expectedValue) { - if (actualValue.length !== expectedValue.length) { - return false - } - for (let i = 0; i < actualValue.length; ++i) { - if (actualValue[i] !== expectedValue[i]) { - if ( - (actualValue[i] === '+' && expectedValue[i] === '-') || - (actualValue[i] === '/' && expectedValue[i] === '_') - ) { - continue - } - return false - } - } - - return true - } - - // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request - function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { - // TODO - } - - /** - * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} - * @param {URL} A - * @param {URL} B - */ - function sameOrigin (A, B) { - // 1. If A and B are the same opaque origin, then return true. - if (A.origin === B.origin && A.origin === 'null') { - return true - } - - // 2. If A and B are both tuple origins and their schemes, - // hosts, and port are identical, then return true. - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true - } - - // 3. Return false. - return false - } - - function createDeferredPromise () { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - - return { promise, resolve: res, reject: rej } - } - - function isAborted (fetchParams) { - return fetchParams.controller.state === 'aborted' - } - - function isCancelled (fetchParams) { - return fetchParams.controller.state === 'aborted' || - fetchParams.controller.state === 'terminated' - } - - const normalizeMethodRecord = { - delete: 'DELETE', - DELETE: 'DELETE', - get: 'GET', - GET: 'GET', - head: 'HEAD', - HEAD: 'HEAD', - options: 'OPTIONS', - OPTIONS: 'OPTIONS', - post: 'POST', - POST: 'POST', - put: 'PUT', - PUT: 'PUT' - }; - - // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. - Object.setPrototypeOf(normalizeMethodRecord, null); - - /** - * @see https://fetch.spec.whatwg.org/#concept-method-normalize - * @param {string} method - */ - function normalizeMethod (method) { - return normalizeMethodRecord[method.toLowerCase()] ?? method - } - - // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string - function serializeJavascriptValueToJSONString (value) { - // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). - const result = JSON.stringify(value); - - // 2. If result is undefined, then throw a TypeError. - if (result === undefined) { - throw new TypeError('Value is not JSON serializable') - } - - // 3. Assert: result is a string. - assert(typeof result === 'string'); - - // 4. Return result. - return result - } - - // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object - const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - - /** - * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object - * @param {() => unknown[]} iterator - * @param {string} name name of the instance - * @param {'key'|'value'|'key+value'} kind - */ - function makeIterator (iterator, name, kind) { - const object = { - index: 0, - kind, - target: iterator - }; - - const i = { - next () { - // 1. Let interface be the interface for which the iterator prototype object exists. - - // 2. Let thisValue be the this value. - - // 3. Let object be ? ToObject(thisValue). - - // 4. If object is a platform object, then perform a security - // check, passing: - - // 5. If object is not a default iterator object for interface, - // then throw a TypeError. - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ) - } - - // 6. Let index be object’s index. - // 7. Let kind be object’s kind. - // 8. Let values be object’s target's value pairs to iterate over. - const { index, kind, target } = object; - const values = target(); - - // 9. Let len be the length of values. - const len = values.length; - - // 10. If index is greater than or equal to len, then return - // CreateIterResultObject(undefined, true). - if (index >= len) { - return { value: undefined, done: true } - } - - // 11. Let pair be the entry in values at index index. - const pair = values[index]; - - // 12. Set object’s index to index + 1. - object.index = index + 1; - - // 13. Return the iterator result for pair and kind. - return iteratorResult(pair, kind) - }, - // The class string of an iterator prototype object for a given interface is the - // result of concatenating the identifier of the interface and the string " Iterator". - [Symbol.toStringTag]: `${name} Iterator` - }; - - // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%. - Object.setPrototypeOf(i, esIteratorPrototype); - // esIteratorPrototype needs to be the prototype of i - // which is the prototype of an empty object. Yes, it's confusing. - return Object.setPrototypeOf({}, i) - } - - // https://webidl.spec.whatwg.org/#iterator-result - function iteratorResult (pair, kind) { - let result; - - // 1. Let result be a value determined by the value of kind: - switch (kind) { - case 'key': { - // 1. Let idlKey be pair’s key. - // 2. Let key be the result of converting idlKey to an - // ECMAScript value. - // 3. result is key. - result = pair[0]; - break - } - case 'value': { - // 1. Let idlValue be pair’s value. - // 2. Let value be the result of converting idlValue to - // an ECMAScript value. - // 3. result is value. - result = pair[1]; - break - } - case 'key+value': { - // 1. Let idlKey be pair’s key. - // 2. Let idlValue be pair’s value. - // 3. Let key be the result of converting idlKey to an - // ECMAScript value. - // 4. Let value be the result of converting idlValue to - // an ECMAScript value. - // 5. Let array be ! ArrayCreate(2). - // 6. Call ! CreateDataProperty(array, "0", key). - // 7. Call ! CreateDataProperty(array, "1", value). - // 8. result is array. - result = pair; - break - } - } - - // 2. Return CreateIterResultObject(result, false). - return { value: result, done: false } - } - - /** - * @see https://fetch.spec.whatwg.org/#body-fully-read - */ - async function fullyReadBody (body, processBody, processBodyError) { - // 1. If taskDestination is null, then set taskDestination to - // the result of starting a new parallel queue. - - // 2. Let successSteps given a byte sequence bytes be to queue a - // fetch task to run processBody given bytes, with taskDestination. - const successSteps = processBody; - - // 3. Let errorSteps be to queue a fetch task to run processBodyError, - // with taskDestination. - const errorSteps = processBodyError; - - // 4. Let reader be the result of getting a reader for body’s stream. - // If that threw an exception, then run errorSteps with that - // exception and return. - let reader; - - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return - } - - // 5. Read all bytes from reader, given successSteps and errorSteps. - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - - /** @type {ReadableStream} */ - let ReadableStream = globalThis.ReadableStream; - - function isReadableStreamLike (stream) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - - return stream instanceof ReadableStream || ( - stream[Symbol.toStringTag] === 'ReadableStream' && - typeof stream.tee === 'function' - ) - } - - const MAXIMUM_ARGUMENT_LENGTH = 65535; - - /** - * @see https://infra.spec.whatwg.org/#isomorphic-decode - * @param {number[]|Uint8Array} input - */ - function isomorphicDecode (input) { - // 1. To isomorphic decode a byte sequence input, return a string whose code point - // length is equal to input’s length and whose code points have the same values - // as the values of input’s bytes, in the same order. - - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input) - } - - return input.reduce((previous, current) => previous + String.fromCharCode(current), '') - } - - /** - * @param {ReadableStreamController} controller - */ - function readableStreamClose (controller) { - try { - controller.close(); - } catch (err) { - // TODO: add comment explaining why this error occurs. - if (!err.message.includes('Controller is already closed')) { - throw err - } - } - } - - /** - * @see https://infra.spec.whatwg.org/#isomorphic-encode - * @param {string} input - */ - function isomorphicEncode (input) { - // 1. Assert: input contains no code points greater than U+00FF. - for (let i = 0; i < input.length; i++) { - assert(input.charCodeAt(i) <= 0xFF); - } - - // 2. Return a byte sequence whose length is equal to input’s code - // point length and whose bytes have the same values as the - // values of input’s code points, in the same order - return input - } - - /** - * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes - * @see https://streams.spec.whatwg.org/#read-loop - * @param {ReadableStreamDefaultReader} reader - */ - async function readAllBytes (reader) { - const bytes = []; - let byteLength = 0; - - while (true) { - const { done, value: chunk } = await reader.read(); - - if (done) { - // 1. Call successSteps with bytes. - return Buffer.concat(bytes, byteLength) - } - - // 1. If chunk is not a Uint8Array object, call failureSteps - // with a TypeError and abort these steps. - if (!isUint8Array(chunk)) { - throw new TypeError('Received non-Uint8Array chunk') - } - - // 2. Append the bytes represented by chunk to bytes. - bytes.push(chunk); - byteLength += chunk.length; - - // 3. Read-loop given reader, bytes, successSteps, and failureSteps. - } - } - - /** - * @see https://fetch.spec.whatwg.org/#is-local - * @param {URL} url - */ - function urlIsLocal (url) { - assert('protocol' in url); // ensure it's a url object - - const protocol = url.protocol; - - return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' - } - - /** - * @param {string|URL} url - */ - function urlHasHttpsScheme (url) { - if (typeof url === 'string') { - return url.startsWith('https:') - } - - return url.protocol === 'https:' - } - - /** - * @see https://fetch.spec.whatwg.org/#http-scheme - * @param {URL} url - */ - function urlIsHttpHttpsScheme (url) { - assert('protocol' in url); // ensure it's a url object - - const protocol = url.protocol; - - return protocol === 'http:' || protocol === 'https:' - } - - /** - * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. - */ - const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); - - util$7 = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - parseMetadata - }; - return util$7; -} - -var symbols$3; -var hasRequiredSymbols$3; - -function requireSymbols$3 () { - if (hasRequiredSymbols$3) return symbols$3; - hasRequiredSymbols$3 = 1; - - symbols$3 = { - kUrl: Symbol('url'), - kHeaders: Symbol('headers'), - kSignal: Symbol('signal'), - kState: Symbol('state'), - kGuard: Symbol('guard'), - kRealm: Symbol('realm') - }; - return symbols$3; -} - -var webidl_1; -var hasRequiredWebidl; - -function requireWebidl () { - if (hasRequiredWebidl) return webidl_1; - hasRequiredWebidl = 1; - - const { types } = require$$0$6; - const { hasOwn, toUSVString } = requireUtil$7(); - - /** @type {import('../../types/webidl').Webidl} */ + /** @type {import('../../../types/webidl').Webidl} */ const webidl = {}; webidl.converters = {}; webidl.util = {}; @@ -4843,11 +5100,19 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#implements - webidl.brandCheck = function (V, I, opts = undefined) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError('Illegal invocation') + webidl.brandCheck = function (V, I, opts) { + if (opts?.strict !== false) { + if (!(V instanceof I)) { + const err = new TypeError('Illegal invocation'); + err.code = 'ERR_INVALID_THIS'; // node compat. + throw err + } } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag] + if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + const err = new TypeError('Illegal invocation'); + err.code = 'ERR_INVALID_THIS'; // node compat. + throw err + } } }; @@ -4856,7 +5121,7 @@ function requireWebidl () { throw webidl.errors.exception({ message: `${min} argument${min !== 1 ? 's' : ''} required, ` + `but${length ? ' only' : ''} ${length} found.`, - ...ctx + header: ctx }) } }; @@ -4888,8 +5153,9 @@ function requireWebidl () { } }; + webidl.util.markAsUncloneable = markAsUncloneable || (() => {}); // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint - webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { + webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) { let upperBound; let lowerBound; @@ -4933,7 +5199,7 @@ function requireWebidl () { // 6. If the conversion is to an IDL type associated // with the [EnforceRange] extended attribute, then: - if (opts.enforceRange === true) { + if (opts?.enforceRange === true) { // 1. If x is NaN, +∞, or −∞, then throw a TypeError. if ( Number.isNaN(x) || @@ -4942,7 +5208,7 @@ function requireWebidl () { ) { throw webidl.errors.exception({ header: 'Integer conversion', - message: `Could not convert ${V} to an integer.` + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` }) } @@ -4965,7 +5231,7 @@ function requireWebidl () { // 7. If x is not NaN and the conversion is to an IDL // type associated with the [Clamp] extended // attribute, then: - if (!Number.isNaN(x) && opts.clamp === true) { + if (!Number.isNaN(x) && opts?.clamp === true) { // 1. Set x to min(max(x, lowerBound), upperBound). x = Math.min(Math.max(x, lowerBound), upperBound); @@ -5022,21 +5288,37 @@ function requireWebidl () { return r }; + webidl.util.Stringify = function (V) { + const type = webidl.util.Type(V); + + switch (type) { + case 'Symbol': + return `Symbol(${V.description})` + case 'Object': + return inspect(V) + case 'String': + return `"${V}"` + default: + return `${V}` + } + }; + // https://webidl.spec.whatwg.org/#es-sequence webidl.sequenceConverter = function (converter) { - return (V) => { + return (V, prefix, argument, Iterable) => { // 1. If Type(V) is not Object, throw a TypeError. if (webidl.util.Type(V) !== 'Object') { throw webidl.errors.exception({ - header: 'Sequence', - message: `Value of type ${webidl.util.Type(V)} is not an Object.` + header: prefix, + message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` }) } // 2. Let method be ? GetMethod(V, @@iterator). /** @type {Generator} */ - const method = V?.[Symbol.iterator]?.(); + const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.(); const seq = []; + let index = 0; // 3. If method is undefined, throw a TypeError. if ( @@ -5044,8 +5326,8 @@ function requireWebidl () { typeof method.next !== 'function' ) { throw webidl.errors.exception({ - header: 'Sequence', - message: 'Object is not an iterator.' + header: prefix, + message: `${argument} is not iterable.` }) } @@ -5057,7 +5339,7 @@ function requireWebidl () { break } - seq.push(converter(value)); + seq.push(converter(value, prefix, `${argument}[${index++}]`)); } return seq @@ -5066,12 +5348,12 @@ function requireWebidl () { // https://webidl.spec.whatwg.org/#es-to-record webidl.recordConverter = function (keyConverter, valueConverter) { - return (O) => { + return (O, prefix, argument) => { // 1. If Type(O) is not Object, throw a TypeError. if (webidl.util.Type(O) !== 'Object') { throw webidl.errors.exception({ - header: 'Record', - message: `Value of type ${webidl.util.Type(O)} is not an Object.` + header: prefix, + message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` }) } @@ -5079,16 +5361,16 @@ function requireWebidl () { const result = {}; if (!types.isProxy(O)) { - // Object.keys only returns enumerable properties - const keys = Object.keys(O); + // 1. Let desc be ? O.[[GetOwnProperty]](key). + const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; for (const key of keys) { // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key); + const typedKey = keyConverter(key, prefix, argument); // 2. Let value be ? Get(O, key). // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key]); + const typedValue = valueConverter(O[key], prefix, argument); // 4. Set result[typedKey] to typedValue. result[typedKey] = typedValue; @@ -5109,11 +5391,11 @@ function requireWebidl () { // 2. If desc is not undefined and desc.[[Enumerable]] is true: if (desc?.enumerable) { // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key); + const typedKey = keyConverter(key, prefix, argument); // 2. Let value be ? Get(O, key). // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key]); + const typedValue = valueConverter(O[key], prefix, argument); // 4. Set result[typedKey] to typedValue. result[typedKey] = typedValue; @@ -5126,11 +5408,11 @@ function requireWebidl () { }; webidl.interfaceConverter = function (i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { + return (V, prefix, argument, opts) => { + if (opts?.strict !== false && !(V instanceof i)) { throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` + header: prefix, + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` }) } @@ -5139,7 +5421,7 @@ function requireWebidl () { }; webidl.dictionaryConverter = function (converters) { - return (dictionary) => { + return (dictionary, prefix, argument) => { const type = webidl.util.Type(dictionary); const dict = {}; @@ -5147,7 +5429,7 @@ function requireWebidl () { return dict } else if (type !== 'Object') { throw webidl.errors.exception({ - header: 'Dictionary', + header: prefix, message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` }) } @@ -5156,35 +5438,35 @@ function requireWebidl () { const { key, defaultValue, required, converter } = options; if (required === true) { - if (!hasOwn(dictionary, key)) { + if (!Object.hasOwn(dictionary, key)) { throw webidl.errors.exception({ - header: 'Dictionary', + header: prefix, message: `Missing required key "${key}".` }) } } let value = dictionary[key]; - const hasDefault = hasOwn(options, 'defaultValue'); + const hasDefault = Object.hasOwn(options, 'defaultValue'); // Only use defaultValue if value is undefined and // a defaultValue options was provided. if (hasDefault && value !== null) { - value = value ?? defaultValue; + value ??= defaultValue(); } // A key can be optional and have no default value. // When this happens, do not perform a conversion, // and do not assign the key a value. if (required || hasDefault || value !== undefined) { - value = converter(value); + value = converter(value, prefix, `${argument}.${key}`); if ( options.allowedValues && !options.allowedValues.includes(value) ) { throw webidl.errors.exception({ - header: 'Dictionary', + header: prefix, message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` }) } @@ -5198,28 +5480,31 @@ function requireWebidl () { }; webidl.nullableConverter = function (converter) { - return (V) => { + return (V, prefix, argument) => { if (V === null) { return V } - return converter(V) + return converter(V, prefix, argument) } }; // https://webidl.spec.whatwg.org/#es-DOMString - webidl.converters.DOMString = function (V, opts = {}) { + webidl.converters.DOMString = function (V, prefix, argument, opts) { // 1. If V is null and the conversion is to an IDL type // associated with the [LegacyNullToEmptyString] // extended attribute, then return the DOMString value // that represents the empty string. - if (V === null && opts.legacyNullToEmptyString) { + if (V === null && opts?.legacyNullToEmptyString) { return '' } // 2. Let x be ? ToString(V). if (typeof V === 'symbol') { - throw new TypeError('Could not convert argument of type symbol to string.') + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a DOMString.` + }) } // 3. Return the IDL DOMString value that represents the @@ -5229,10 +5514,10 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-ByteString - webidl.converters.ByteString = function (V) { + webidl.converters.ByteString = function (V, prefix, argument) { // 1. Let x be ? ToString(V). // Note: DOMString converter perform ? ToString(V) - const x = webidl.converters.DOMString(V); + const x = webidl.converters.DOMString(V, prefix, argument); // 2. If the value of any element of x is greater than // 255, then throw a TypeError. @@ -5252,6 +5537,7 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-USVString + // TODO: rewrite this so we can control the errors thrown webidl.converters.USVString = toUSVString; // https://webidl.spec.whatwg.org/#es-boolean @@ -5270,9 +5556,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-long-long - webidl.converters['long long'] = function (V) { + webidl.converters['long long'] = function (V, prefix, argument) { // 1. Let x be ? ConvertToInt(V, 64, "signed"). - const x = webidl.util.ConvertToInt(V, 64, 'signed'); + const x = webidl.util.ConvertToInt(V, 64, 'signed', undefined, prefix, argument); // 2. Return the IDL long long value that represents // the same numeric value as x. @@ -5280,9 +5566,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-unsigned-long-long - webidl.converters['unsigned long long'] = function (V) { + webidl.converters['unsigned long long'] = function (V, prefix, argument) { // 1. Let x be ? ConvertToInt(V, 64, "unsigned"). - const x = webidl.util.ConvertToInt(V, 64, 'unsigned'); + const x = webidl.util.ConvertToInt(V, 64, 'unsigned', undefined, prefix, argument); // 2. Return the IDL unsigned long long value that // represents the same numeric value as x. @@ -5290,9 +5576,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-unsigned-long - webidl.converters['unsigned long'] = function (V) { + webidl.converters['unsigned long'] = function (V, prefix, argument) { // 1. Let x be ? ConvertToInt(V, 32, "unsigned"). - const x = webidl.util.ConvertToInt(V, 32, 'unsigned'); + const x = webidl.util.ConvertToInt(V, 32, 'unsigned', undefined, prefix, argument); // 2. Return the IDL unsigned long value that // represents the same numeric value as x. @@ -5300,9 +5586,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-unsigned-short - webidl.converters['unsigned short'] = function (V, opts) { + webidl.converters['unsigned short'] = function (V, prefix, argument, opts) { // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). - const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts); + const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts, prefix, argument); // 2. Return the IDL unsigned short value that represents // the same numeric value as x. @@ -5310,7 +5596,7 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#idl-ArrayBuffer - webidl.converters.ArrayBuffer = function (V, opts = {}) { + webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) { // 1. If Type(V) is not Object, or V does not have an // [[ArrayBufferData]] internal slot, then throw a // TypeError. @@ -5321,8 +5607,8 @@ function requireWebidl () { !types.isAnyArrayBuffer(V) ) { throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, types: ['ArrayBuffer'] }) } @@ -5331,7 +5617,7 @@ function requireWebidl () { // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V) is true, then throw a // TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) { throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' @@ -5342,14 +5628,19 @@ function requireWebidl () { // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V) is true, then throw a // TypeError. - // Note: resizable ArrayBuffers are currently a proposal. + if (V.resizable || V.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } // 4. Return the IDL ArrayBuffer value that is a // reference to the same object as V. return V }; - webidl.converters.TypedArray = function (V, T, opts = {}) { + webidl.converters.TypedArray = function (V, T, prefix, name, opts) { // 1. Let T be the IDL type V is being converted to. // 2. If Type(V) is not Object, or V does not have a @@ -5361,8 +5652,8 @@ function requireWebidl () { V.constructor.name !== T.name ) { throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, types: [T.name] }) } @@ -5371,7 +5662,7 @@ function requireWebidl () { // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' @@ -5382,20 +5673,25 @@ function requireWebidl () { // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. - // Note: resizable array buffers are currently a proposal + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } // 5. Return the IDL value of type T that is a reference // to the same object as V. return V }; - webidl.converters.DataView = function (V, opts = {}) { + webidl.converters.DataView = function (V, prefix, name, opts) { // 1. If Type(V) is not Object, or V does not have a // [[DataView]] internal slot, then throw a TypeError. if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { throw webidl.errors.exception({ - header: 'DataView', - message: 'Object is not a DataView.' + header: prefix, + message: `${name} is not a DataView.` }) } @@ -5403,7 +5699,7 @@ function requireWebidl () { // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, // then throw a TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' @@ -5414,7 +5710,12 @@ function requireWebidl () { // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. - // Note: resizable ArrayBuffers are currently a proposal + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } // 4. Return the IDL DataView value that is a reference // to the same object as V. @@ -5422,20 +5723,24 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#BufferSource - webidl.converters.BufferSource = function (V, opts = {}) { + webidl.converters.BufferSource = function (V, prefix, name, opts) { if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts) + return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false }) } if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor) + return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false }) } if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts) + return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false }) } - throw new TypeError(`Could not convert ${V} to a BufferSource.`) + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, + types: ['BufferSource'] + }) }; webidl.converters['sequence'] = webidl.sequenceConverter( @@ -5451,758 +5756,1690 @@ function requireWebidl () { webidl.converters.ByteString ); - webidl_1 = { + webidl_1$1 = { webidl }; - return webidl_1; + return webidl_1$1; } -var dataURL; -var hasRequiredDataURL; +var util$g; +var hasRequiredUtil$g; -function requireDataURL () { - if (hasRequiredDataURL) return dataURL; - hasRequiredDataURL = 1; - const assert = require$$0$8; - const { atob } = require$$7; - const { isomorphicDecode } = requireUtil$7(); +function requireUtil$g () { + if (hasRequiredUtil$g) return util$g; + hasRequiredUtil$g = 1; - const encoder = new TextEncoder(); + const { Transform } = require$$0$8; + const zlib = require$$3; + const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$e(); + const { getGlobalOrigin } = requireGlobal$3(); + const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = requireDataUrl$1(); + const { performance } = require$$5$1; + const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = requireUtil$h(); + const assert = require$$0$7; + const { isUint8Array } = require$$8$1; + const { webidl } = requireWebidl$1(); - /** - * @see https://mimesniff.spec.whatwg.org/#http-token-code-point - */ - const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; // eslint-disable-line - /** - * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point - */ - const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; // eslint-disable-line + let supportedHashes = []; - // https://fetch.spec.whatwg.org/#data-url-processor - /** @param {URL} dataURL */ - function dataURLProcessor (dataURL) { - // 1. Assert: dataURL’s scheme is "data". - assert(dataURL.protocol === 'data:'); + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable + /** @type {import('crypto')} */ + let crypto; + try { + crypto = require('node:crypto'); + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + /* c8 ignore next 3 */ + } catch { - // 2. Let input be the result of running the URL - // serializer on dataURL with exclude fragment - // set to true. - let input = URLSerializer(dataURL, true); + } - // 3. Remove the leading "data:" string from input. - input = input.slice(5); + function responseURL (response) { + // https://fetch.spec.whatwg.org/#responses + // A response has an associated URL. It is a pointer to the last URL + // in response’s URL list and null if response’s URL list is empty. + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString() + } - // 4. Let position point at the start of input. - const position = { position: 0 }; + // https://fetch.spec.whatwg.org/#concept-response-location-url + function responseLocationURL (response, requestFragment) { + // 1. If response’s status is not a redirect status, then return null. + if (!redirectStatusSet.has(response.status)) { + return null + } - // 5. Let mimeType be the result of collecting a - // sequence of code points that are not equal - // to U+002C (,), given position. - let mimeType = collectASequenceOfCodePointsFast( - ',', - input, - position - ); + // 2. Let location be the result of extracting header list values given + // `Location` and response’s header list. + let location = response.headersList.get('location', true); - // 6. Strip leading and trailing ASCII whitespace - // from mimeType. - // Undici implementation note: we need to store the - // length because if the mimetype has spaces removed, - // the wrong amount will be sliced from the input in - // step #9 - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); + // 3. If location is a header value, then set location to the result of + // parsing location with response’s URL. + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + // Some websites respond location header in UTF-8 form without encoding them as ASCII + // and major browsers redirect them to correctly UTF-8 encoded addresses. + // Here, we handle that behavior in the same way. + location = normalizeBinaryStringToUtf8(location); + } + location = new URL(location, responseURL(response)); + } - // 7. If position is past the end of input, then - // return failure - if (position.position >= input.length) { - return 'failure' + // 4. If location is a URL whose fragment is null, then set location’s + // fragment to requestFragment. + if (location && !location.hash) { + location.hash = requestFragment; } - // 8. Advance position by 1. - position.position++; + // 5. Return location. + return location + } - // 9. Let encodedBody be the remainder of input. - const encodedBody = input.slice(mimeTypeLength + 1); + /** + * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2 + * @param {string} url + * @returns {boolean} + */ + function isValidEncodedURL (url) { + for (let i = 0; i < url.length; ++i) { + const code = url.charCodeAt(i); - // 10. Let body be the percent-decoding of encodedBody. - let body = stringPercentDecode(encodedBody); + if ( + code > 0x7E || // Non-US-ASCII + DEL + code < 0x20 // Control characters NUL - US + ) { + return false + } + } + return true + } - // 11. If mimeType ends with U+003B (;), followed by - // zero or more U+0020 SPACE, followed by an ASCII - // case-insensitive match for "base64", then: - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - // 1. Let stringBody be the isomorphic decode of body. - const stringBody = isomorphicDecode(body); - - // 2. Set body to the forgiving-base64 decode of - // stringBody. - body = forgivingBase64(stringBody); - - // 3. If body is failure, then return failure. - if (body === 'failure') { - return 'failure' - } + /** + * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it. + * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well. + * @param {string} value + * @returns {string} + */ + function normalizeBinaryStringToUtf8 (value) { + return Buffer.from(value, 'binary').toString('utf8') + } - // 4. Remove the last 6 code points from mimeType. - mimeType = mimeType.slice(0, -6); + /** @returns {URL} */ + function requestCurrentURL (request) { + return request.urlList[request.urlList.length - 1] + } - // 5. Remove trailing U+0020 SPACE code points from mimeType, - // if any. - mimeType = mimeType.replace(/(\u0020)+$/, ''); + function requestBadPort (request) { + // 1. Let url be request’s current URL. + const url = requestCurrentURL(request); - // 6. Remove the last U+003B (;) code point from mimeType. - mimeType = mimeType.slice(0, -1); + // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, + // then return blocked. + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return 'blocked' } - // 12. If mimeType starts with U+003B (;), then prepend - // "text/plain" to mimeType. - if (mimeType.startsWith(';')) { - mimeType = 'text/plain' + mimeType; - } + // 3. Return allowed. + return 'allowed' + } - // 13. Let mimeTypeRecord be the result of parsing - // mimeType. - let mimeTypeRecord = parseMIMEType(mimeType); + function isErrorLike (object) { + return object instanceof Error || ( + object?.constructor?.name === 'Error' || + object?.constructor?.name === 'DOMException' + ) + } - // 14. If mimeTypeRecord is failure, then set - // mimeTypeRecord to text/plain;charset=US-ASCII. - if (mimeTypeRecord === 'failure') { - mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII'); + // Check whether |statusText| is a ByteString and + // matches the Reason-Phrase token production. + // RFC 2616: https://tools.ietf.org/html/rfc2616 + // RFC 7230: https://tools.ietf.org/html/rfc7230 + // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" + // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 + function isValidReasonPhrase (statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if ( + !( + ( + c === 0x09 || // HTAB + (c >= 0x20 && c <= 0x7e) || // SP / VCHAR + (c >= 0x80 && c <= 0xff) + ) // obs-text + ) + ) { + return false + } } - - // 15. Return a new data: URL struct whose MIME - // type is mimeTypeRecord and body is body. - // https://fetch.spec.whatwg.org/#data-url-struct - return { mimeType: mimeTypeRecord, body } + return true } - // https://url.spec.whatwg.org/#concept-url-serializer /** - * @param {URL} url - * @param {boolean} excludeFragment + * @see https://fetch.spec.whatwg.org/#header-name + * @param {string} potentialValue */ - function URLSerializer (url, excludeFragment = false) { - if (!excludeFragment) { - return url.href - } - - const href = url.href; - const hashLength = url.hash.length; - - return hashLength === 0 ? href : href.substring(0, href.length - hashLength) - } + const isValidHeaderName = isValidHTTPToken; - // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points /** - * @param {(char: string) => boolean} condition - * @param {string} input - * @param {{ position: number }} position + * @see https://fetch.spec.whatwg.org/#header-value + * @param {string} potentialValue */ - function collectASequenceOfCodePoints (condition, input, position) { - // 1. Let result be the empty string. - let result = ''; + function isValidHeaderValue (potentialValue) { + // - Has no leading or trailing HTTP tab or space bytes. + // - Contains no 0x00 (NUL) or HTTP newline bytes. + return ( + potentialValue[0] === '\t' || + potentialValue[0] === ' ' || + potentialValue[potentialValue.length - 1] === '\t' || + potentialValue[potentialValue.length - 1] === ' ' || + potentialValue.includes('\n') || + potentialValue.includes('\r') || + potentialValue.includes('\0') + ) === false + } - // 2. While position doesn’t point past the end of input and the - // code point at position within input meets the condition condition: - while (position.position < input.length && condition(input[position.position])) { - // 1. Append that code point to the end of result. - result += input[position.position]; + // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect + function setRequestReferrerPolicyOnRedirect (request, actualResponse) { + // Given a request request and a response actualResponse, this algorithm + // updates request’s referrer policy according to the Referrer-Policy + // header (if any) in actualResponse. - // 2. Advance position by 1. - position.position++; - } + // 1. Let policy be the result of executing § 8.1 Parse a referrer policy + // from a Referrer-Policy header on actualResponse. - // 3. Return result. - return result - } + // 8.1 Parse a referrer policy from a Referrer-Policy header + // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. + const { headersList } = actualResponse; + // 2. Let policy be the empty string. + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. + // 4. Return policy. + const policyHeader = (headersList.get('referrer-policy', true) ?? '').split(','); - /** - * A faster collectASequenceOfCodePoints that only works when comparing a single character. - * @param {string} char - * @param {string} input - * @param {{ position: number }} position - */ - function collectASequenceOfCodePointsFast (char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; + // Note: As the referrer-policy can contain multiple policies + // separated by comma, we need to loop through all of them + // and pick the first valid one. + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy + let policy = ''; + if (policyHeader.length > 0) { + // The right-most policy takes precedence. + // The left-most policy is the fallback. + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break + } + } + } - if (idx === -1) { - position.position = input.length; - return input.slice(start) + // 2. If policy is not the empty string, then set request’s referrer policy to policy. + if (policy !== '') { + request.referrerPolicy = policy; } + } - position.position = idx; - return input.slice(start, position.position) + // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check + function crossOriginResourcePolicyCheck () { + // TODO + return 'allowed' } - // https://url.spec.whatwg.org/#string-percent-decode - /** @param {string} input */ - function stringPercentDecode (input) { - // 1. Let bytes be the UTF-8 encoding of input. - const bytes = encoder.encode(input); + // https://fetch.spec.whatwg.org/#concept-cors-check + function corsCheck () { + // TODO + return 'success' + } - // 2. Return the percent-decoding of bytes. - return percentDecode(bytes) + // https://fetch.spec.whatwg.org/#concept-tao-check + function TAOCheck () { + // TODO + return 'success' } - // https://url.spec.whatwg.org/#percent-decode - /** @param {Uint8Array} input */ - function percentDecode (input) { - // 1. Let output be an empty byte sequence. - /** @type {number[]} */ - const output = []; + function appendFetchMetadata (httpRequest) { + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header + // TODO - // 2. For each byte byte in input: - for (let i = 0; i < input.length; i++) { - const byte = input[i]; + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header - // 1. If byte is not 0x25 (%), then append byte to output. - if (byte !== 0x25) { - output.push(byte); + // 1. Assert: r’s url is a potentially trustworthy URL. + // TODO - // 2. Otherwise, if byte is 0x25 (%) and the next two bytes - // after byte in input are not in the ranges - // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), - // and 0x61 (a) to 0x66 (f), all inclusive, append byte - // to output. - } else if ( - byte === 0x25 && - !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2])) - ) { - output.push(0x25); + // 2. Let header be a Structured Header whose value is a token. + let header = null; - // 3. Otherwise: - } else { - // 1. Let bytePoint be the two bytes after byte in input, - // decoded, and then interpreted as hexadecimal number. - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); - const bytePoint = Number.parseInt(nextTwoBytes, 16); + // 3. Set header’s value to r’s mode. + header = httpRequest.mode; - // 2. Append a byte whose value is bytePoint to output. - output.push(bytePoint); + // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. + httpRequest.headersList.set('sec-fetch-mode', header, true); - // 3. Skip the next two bytes in input. - i += 2; - } - } + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header + // TODO - // 3. Return output. - return Uint8Array.from(output) + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header + // TODO } - // https://mimesniff.spec.whatwg.org/#parse-a-mime-type - /** @param {string} input */ - function parseMIMEType (input) { - // 1. Remove any leading and trailing HTTP whitespace - // from input. - input = removeHTTPWhitespace(input, true, true); + // https://fetch.spec.whatwg.org/#append-a-request-origin-header + function appendRequestOriginHeader (request) { + // 1. Let serializedOrigin be the result of byte-serializing a request origin + // with request. + // TODO: implement "byte-serializing a request origin" + let serializedOrigin = request.origin; - // 2. Let position be a position variable for input, - // initially pointing at the start of input. - const position = { position: 0 }; + // - "'client' is changed to an origin during fetching." + // This doesn't happen in undici (in most cases) because undici, by default, + // has no concept of origin. + // - request.origin can also be set to request.client.origin (client being + // an environment settings object), which is undefined without using + // setGlobalOrigin. + if (serializedOrigin === 'client' || serializedOrigin === undefined) { + return + } - // 3. Let type be the result of collecting a sequence - // of code points that are not U+002F (/) from - // input, given position. - const type = collectASequenceOfCodePointsFast( - '/', - input, - position - ); + // 2. If request’s response tainting is "cors" or request’s mode is "websocket", + // then append (`Origin`, serializedOrigin) to request’s header list. + // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: + if (request.responseTainting === 'cors' || request.mode === 'websocket') { + request.headersList.append('origin', serializedOrigin, true); + } else if (request.method !== 'GET' && request.method !== 'HEAD') { + // 1. Switch on request’s referrer policy: + switch (request.referrerPolicy) { + case 'no-referrer': + // Set serializedOrigin to `null`. + serializedOrigin = null; + break + case 'no-referrer-when-downgrade': + case 'strict-origin': + case 'strict-origin-when-cross-origin': + // If request’s origin is a tuple origin, its scheme is "https", and + // request’s current URL’s scheme is not "https", then set + // serializedOrigin to `null`. + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break + case 'same-origin': + // If request’s origin is not same origin with request’s current URL’s + // origin, then set serializedOrigin to `null`. + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break + // Do nothing. + } - // 4. If type is the empty string or does not solely - // contain HTTP token code points, then return failure. - // https://mimesniff.spec.whatwg.org/#http-token-code-point - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return 'failure' + // 2. Append (`Origin`, serializedOrigin) to request’s header list. + request.headersList.append('origin', serializedOrigin, true); } + } - // 5. If position is past the end of input, then return - // failure - if (position.position > input.length) { - return 'failure' + // https://w3c.github.io/hr-time/#dfn-coarsen-time + function coarsenTime (timestamp, crossOriginIsolatedCapability) { + // TODO + return timestamp + } + + // https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info + function clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + } } - // 6. Advance position by 1. (This skips past U+002F (/).) - position.position++; + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + } + } - // 7. Let subtype be the result of collecting a sequence of - // code points that are not U+003B (;) from input, given - // position. - let subtype = collectASequenceOfCodePointsFast( - ';', - input, - position - ); + // https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time + function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { + return coarsenTime(performance.now()) + } - // 8. Remove any trailing HTTP whitespace from subtype. - subtype = removeHTTPWhitespace(subtype, false, true); + // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info + function createOpaqueTimingInfo (timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + } + } - // 9. If subtype is the empty string or does not solely - // contain HTTP token code points, then return failure. - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return 'failure' + // https://html.spec.whatwg.org/multipage/origin.html#policy-container + function makePolicyContainer () { + // Note: the fetch spec doesn't make use of embedder policy or CSP list + return { + referrerPolicy: 'strict-origin-when-cross-origin' } + } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); + // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container + function clonePolicyContainer (policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + } + } - // 10. Let mimeType be a new MIME type record whose type - // is type, in ASCII lowercase, and subtype is subtype, - // in ASCII lowercase. - // https://mimesniff.spec.whatwg.org/#mime-type - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map} */ - parameters: new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - }; + // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer + function determineRequestsReferrer (request) { + // 1. Let policy be request's referrer policy. + const policy = request.referrerPolicy; - // 11. While position is not past the end of input: - while (position.position < input.length) { - // 1. Advance position by 1. (This skips past U+003B (;).) - position.position++; + // Note: policy cannot (shouldn't) be null or an empty string. + assert(policy); - // 2. Collect a sequence of code points that are HTTP - // whitespace from input given position. - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - char => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ); + // 2. Let environment be request’s client. - // 3. Let parameterName be the result of collecting a - // sequence of code points that are not U+003B (;) - // or U+003D (=) from input, given position. - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ';' && char !== '=', - input, - position - ); + let referrerSource = null; - // 4. Set parameterName to parameterName, in ASCII - // lowercase. - parameterName = parameterName.toLowerCase(); + // 3. Switch on request’s referrer: + if (request.referrer === 'client') { + // Note: node isn't a browser and doesn't implement document/iframes, + // so we bypass this step and replace it with our own. - // 5. If position is not past the end of input, then: - if (position.position < input.length) { - // 1. If the code point at position within input is - // U+003B (;), then continue. - if (input[position.position] === ';') { - continue - } + const globalOrigin = getGlobalOrigin(); - // 2. Advance position by 1. (This skips past U+003D (=).) - position.position++; + if (!globalOrigin || globalOrigin.origin === 'null') { + return 'no-referrer' } - // 6. If position is past the end of input, then break. - if (position.position > input.length) { - break - } + // note: we need to clone it as it's mutated + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + // Let referrerSource be request’s referrer. + referrerSource = request.referrer; + } - // 7. Let parameterValue be null. - let parameterValue = null; + // 4. Let request’s referrerURL be the result of stripping referrerSource for + // use as a referrer. + let referrerURL = stripURLForReferrer(referrerSource); - // 8. If the code point at position within input is - // U+0022 ("), then: - if (input[position.position] === '"') { - // 1. Set parameterValue to the result of collecting - // an HTTP quoted string from input, given position - // and the extract-value flag. - parameterValue = collectAnHTTPQuotedString(input, position, true); + // 5. Let referrerOrigin be the result of stripping referrerSource for use as + // a referrer, with the origin-only flag set to true. + const referrerOrigin = stripURLForReferrer(referrerSource, true); - // 2. Collect a sequence of code points that are not - // U+003B (;) from input, given position. - collectASequenceOfCodePointsFast( - ';', - input, - position - ); + // 6. If the result of serializing referrerURL is a string whose length is + // greater than 4096, set referrerURL to referrerOrigin. + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } - // 9. Otherwise: - } else { - // 1. Set parameterValue to the result of collecting - // a sequence of code points that are not U+003B (;) - // from input, given position. - parameterValue = collectASequenceOfCodePointsFast( - ';', - input, - position - ); + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && + !isURLPotentiallyTrustworthy(request.url); - // 2. Remove any trailing HTTP whitespace from parameterValue. - parameterValue = removeHTTPWhitespace(parameterValue, false, true); + // 8. Execute the switch statements corresponding to the value of policy: + switch (policy) { + case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) + case 'unsafe-url': return referrerURL + case 'same-origin': + return areSameOrigin ? referrerOrigin : 'no-referrer' + case 'origin-when-cross-origin': + return areSameOrigin ? referrerURL : referrerOrigin + case 'strict-origin-when-cross-origin': { + const currentURL = requestCurrentURL(request); - // 3. If parameterValue is the empty string, then continue. - if (parameterValue.length === 0) { - continue + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL } - } - // 10. If all of the following are true - // - parameterName is not the empty string - // - parameterName solely contains HTTP token code points - // - parameterValue solely contains HTTP quoted-string token code points - // - mimeType’s parameters[parameterName] does not exist - // then set mimeType’s parameters[parameterName] to parameterValue. - if ( - parameterName.length !== 0 && - HTTP_TOKEN_CODEPOINTS.test(parameterName) && - (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && - !mimeType.parameters.has(parameterName) - ) { - mimeType.parameters.set(parameterName, parameterValue); + // 2. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } + + // 3. Return referrerOrigin. + return referrerOrigin } - } + case 'strict-origin': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case 'no-referrer-when-downgrade': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ - // 12. Return mimeType. - return mimeType + default: // eslint-disable-line + return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + } } - // https://infra.spec.whatwg.org/#forgiving-base64-decode - /** @param {string} data */ - function forgivingBase64 (data) { - // 1. Remove all ASCII whitespace from data. - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ''); // eslint-disable-line + /** + * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url + * @param {URL} url + * @param {boolean|undefined} originOnly + */ + function stripURLForReferrer (url, originOnly) { + // 1. Assert: url is a URL. + assert(url instanceof URL); - // 2. If data’s code point length divides by 4 leaving - // no remainder, then: - if (data.length % 4 === 0) { - // 1. If data ends with one or two U+003D (=) code points, - // then remove them from data. - data = data.replace(/=?=$/, ''); - } + url = new URL(url); - // 3. If data’s code point length divides by 4 leaving - // a remainder of 1, then return failure. - if (data.length % 4 === 1) { - return 'failure' + // 2. If url’s scheme is a local scheme, then return no referrer. + if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { + return 'no-referrer' } - // 4. If data contains a code point that is not one of - // U+002B (+) - // U+002F (/) - // ASCII alphanumeric - // then return failure. - if (/[^+/0-9A-Za-z]/.test(data)) { - return 'failure' - } + // 3. Set url’s username to the empty string. + url.username = ''; + + // 4. Set url’s password to the empty string. + url.password = ''; + + // 5. Set url’s fragment to null. + url.hash = ''; - const binary = atob(data); - const bytes = new Uint8Array(binary.length); + // 6. If the origin-only flag is true, then: + if (originOnly) { + // 1. Set url’s path to « the empty string ». + url.pathname = ''; - for (let byte = 0; byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte); + // 2. Set url’s query to null. + url.search = ''; } - return bytes + // 7. Return url. + return url } - // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string - // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string - /** - * @param {string} input - * @param {{ position: number }} position - * @param {boolean?} extractValue - */ - function collectAnHTTPQuotedString (input, position, extractValue) { - // 1. Let positionStart be position. - const positionStart = position.position; + function isURLPotentiallyTrustworthy (url) { + if (!(url instanceof URL)) { + return false + } - // 2. Let value be the empty string. - let value = ''; + // If child of about, return true + if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + return true + } - // 3. Assert: the code point at position within input - // is U+0022 ("). - assert(input[position.position] === '"'); + // If scheme is data, return true + if (url.protocol === 'data:') return true - // 4. Advance position by 1. - position.position++; + // If file, return true + if (url.protocol === 'file:') return true - // 5. While true: - while (true) { - // 1. Append the result of collecting a sequence of code points - // that are not U+0022 (") or U+005C (\) from input, given - // position, to value. - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== '\\', - input, - position - ); + return isOriginPotentiallyTrustworthy(url.origin) - // 2. If position is past the end of input, then break. - if (position.position >= input.length) { - break + function isOriginPotentiallyTrustworthy (origin) { + // If origin is explicitly null, return false + if (origin == null || origin === 'null') return false + + const originAsURL = new URL(origin); + + // If secure, return true + if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { + return true } - // 3. Let quoteOrBackslash be the code point at position within - // input. - const quoteOrBackslash = input[position.position]; + // If localhost or variants, return true + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || + (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || + (originAsURL.hostname.endsWith('.localhost'))) { + return true + } - // 4. Advance position by 1. - position.position++; + // If any other, return false + return false + } + } - // 5. If quoteOrBackslash is U+005C (\), then: - if (quoteOrBackslash === '\\') { - // 1. If position is past the end of input, then append - // U+005C (\) to value and break. - if (position.position >= input.length) { - value += '\\'; - break - } + /** + * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist + * @param {Uint8Array} bytes + * @param {string} metadataList + */ + function bytesMatch (bytes, metadataList) { + // If node is not built with OpenSSL support, we cannot check + // a request's integrity, so allow it by default (the spec will + // allow requests if an invalid hash is given, as precedence). + /* istanbul ignore if: only if node is built with --without-ssl */ + if (crypto === undefined) { + return true + } - // 2. Append the code point at position within input to value. - value += input[position.position]; + // 1. Let parsedMetadata be the result of parsing metadataList. + const parsedMetadata = parseMetadata(metadataList); - // 3. Advance position by 1. - position.position++; + // 2. If parsedMetadata is no metadata, return true. + if (parsedMetadata === 'no metadata') { + return true + } - // 6. Otherwise: - } else { - // 1. Assert: quoteOrBackslash is U+0022 ("). - assert(quoteOrBackslash === '"'); + // 3. If response is not eligible for integrity validation, return false. + // TODO - // 2. Break. - break - } + // 4. If parsedMetadata is the empty set, return true. + if (parsedMetadata.length === 0) { + return true } - // 6. If the extract-value flag is set, then return value. - if (extractValue) { - return value + // 5. Let metadata be the result of getting the strongest + // metadata from parsedMetadata. + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + + // 6. For each item in metadata: + for (const item of metadata) { + // 1. Let algorithm be the alg component of item. + const algorithm = item.algo; + + // 2. Let expectedValue be the val component of item. + const expectedValue = item.hash; + + // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e + // "be liberal with padding". This is annoying, and it's not even in the spec. + + // 3. Let actualValue be the result of applying algorithm to bytes. + let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64'); + + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); + } + } + + // 4. If actualValue is a case-sensitive match for expectedValue, + // return true. + if (compareBase64Mixed(actualValue, expectedValue)) { + return true + } } - // 7. Return the code points from positionStart to position, - // inclusive, within input. - return input.slice(positionStart, position.position) + // 7. Return false. + return false } + // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options + // https://www.w3.org/TR/CSP2/#source-list-syntax + // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 + const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + /** - * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type + * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata + * @param {string} metadata */ - function serializeAMimeType (mimeType) { - assert(mimeType !== 'failure'); - const { parameters, essence } = mimeType; - - // 1. Let serialization be the concatenation of mimeType’s - // type, U+002F (/), and mimeType’s subtype. - let serialization = essence; + function parseMetadata (metadata) { + // 1. Let result be the empty set. + /** @type {{ algo: string, hash: string }[]} */ + const result = []; - // 2. For each name → value of mimeType’s parameters: - for (let [name, value] of parameters.entries()) { - // 1. Append U+003B (;) to serialization. - serialization += ';'; + // 2. Let empty be equal to true. + let empty = true; - // 2. Append name to serialization. - serialization += name; + // 3. For each token returned by splitting metadata on spaces: + for (const token of metadata.split(' ')) { + // 1. Set empty to false. + empty = false; - // 3. Append U+003D (=) to serialization. - serialization += '='; + // 2. Parse token as a hash-with-options. + const parsedToken = parseHashWithOptions.exec(token); - // 4. If value does not solely contain HTTP token code - // points or value is the empty string, then: - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - // 1. Precede each occurence of U+0022 (") or - // U+005C (\) in value with U+005C (\). - value = value.replace(/(\\|")/g, '\\$1'); + // 3. If token does not parse, continue to the next token. + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { + // Note: Chromium blocks the request at this point, but Firefox + // gives a warning that an invalid integrity was given. The + // correct behavior is to ignore these, and subsequently not + // check the integrity of the resource. + continue + } - // 2. Prepend U+0022 (") to value. - value = '"' + value; + // 4. Let algorithm be the hash-algo component of token. + const algorithm = parsedToken.groups.algo.toLowerCase(); - // 3. Append U+0022 (") to value. - value += '"'; + // 5. If algorithm is a hash function recognized by the user + // agent, add the parsed token to result. + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); } + } - // 5. Append value to serialization. - serialization += value; + // 4. Return no metadata if empty is true, otherwise return result. + if (empty === true) { + return 'no metadata' } - // 3. Return serialization. - return serialization + return result } /** - * @see https://fetch.spec.whatwg.org/#http-whitespace - * @param {string} char + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList */ - function isHTTPWhiteSpace (char) { - return char === '\r' || char === '\n' || char === '\t' || char === ' ' - } + function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo; + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } - /** - * @see https://fetch.spec.whatwg.org/#http-whitespace - * @param {string} str - */ - function removeHTTPWhitespace (str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512'; + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384'; + } + } + return algorithm + } - if (leading) { - for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++); + function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList } - if (trailing) { - for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--); + let pos = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } } - return str.slice(lead, trail + 1) + metadataList.length = pos; + + return metadataList } /** - * @see https://infra.spec.whatwg.org/#ascii-whitespace - * @param {string} char + * Compares two base64 strings, allowing for base64url + * in the second string. + * + * @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} */ - function isASCIIWhitespace (char) { - return char === '\r' || char === '\n' || char === '\t' || char === '\f' || char === ' ' + function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true + } + + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request + function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { + // TODO } /** - * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} + * @param {URL} A + * @param {URL} B */ - function removeASCIIWhitespace (str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - - if (leading) { - for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++); + function sameOrigin (A, B) { + // 1. If A and B are the same opaque origin, then return true. + if (A.origin === B.origin && A.origin === 'null') { + return true } - if (trailing) { - for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--); + // 2. If A and B are both tuple origins and their schemes, + // hosts, and port are identical, then return true. + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true } - return str.slice(lead, trail + 1) + // 3. Return false. + return false } - dataURL = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType - }; - return dataURL; -} + function createDeferredPromise () { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); -var file$1; -var hasRequiredFile$1; + return { promise, resolve: res, reject: rej } + } -function requireFile$1 () { - if (hasRequiredFile$1) return file$1; - hasRequiredFile$1 = 1; + function isAborted (fetchParams) { + return fetchParams.controller.state === 'aborted' + } - const { Blob, File: NativeFile } = require$$7; - const { types } = require$$0$6; - const { kState } = requireSymbols$3(); - const { isBlobLike } = requireUtil$7(); - const { webidl } = requireWebidl(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - const { kEnumerableProperty } = requireUtil$8(); - const encoder = new TextEncoder(); + function isCancelled (fetchParams) { + return fetchParams.controller.state === 'aborted' || + fetchParams.controller.state === 'terminated' + } - class File extends Blob { - constructor (fileBits, fileName, options = {}) { - // The File constructor is invoked with two or three parameters, depending - // on whether the optional dictionary parameter is used. When the File() - // constructor is invoked, user agents must run the following steps: - webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' }); + /** + * @see https://fetch.spec.whatwg.org/#concept-method-normalize + * @param {string} method + */ + function normalizeMethod (method) { + return normalizedMethodRecordsBase[method.toLowerCase()] ?? method + } - fileBits = webidl.converters['sequence'](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); + // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string + function serializeJavascriptValueToJSONString (value) { + // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). + const result = JSON.stringify(value); - // 1. Let bytes be the result of processing blob parts given fileBits and - // options. - // Note: Blob handles this for us + // 2. If result is undefined, then throw a TypeError. + if (result === undefined) { + throw new TypeError('Value is not JSON serializable') + } - // 2. Let n be the fileName argument to the constructor. - const n = fileName; + // 3. Assert: result is a string. + assert(typeof result === 'string'); - // 3. Process FilePropertyBag dictionary argument by running the following - // substeps: + // 4. Return result. + return result + } - // 1. If the type member is provided and is not the empty string, let t - // be set to the type dictionary member. If t contains any characters - // outside the range U+0020 to U+007E, then set t to the empty string - // and return from these substeps. - // 2. Convert every character in t to ASCII lowercase. - let t = options.type; - let d; + // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object + const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - // eslint-disable-next-line no-labels - substep: { - if (t) { - t = parseMIMEType(t); + /** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {string} name name of the instance + * @param {symbol} kInternalIterator + * @param {string | number} [keyIndex] + * @param {string | number} [valueIndex] + */ + function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target + /** @type {'key' | 'value' | 'key+value'} */ + #kind + /** @type {number} */ + #index - if (t === 'failure') { - t = ''; - // eslint-disable-next-line no-labels - break substep - } + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor (target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; + } - t = serializeAMimeType(t).toLowerCase(); + next () { + // 1. Let interface be the interface for which the iterator prototype object exists. + // 2. Let thisValue be the this value. + // 3. Let object be ? ToObject(thisValue). + // 4. If object is a platform object, then perform a security + // check, passing: + // 5. If object is not a default iterator object for interface, + // then throw a TypeError. + if (typeof this !== 'object' || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ) } - // 3. If the lastModified member is provided, let d be set to the - // lastModified dictionary member. If it is not provided, set d to the - // current date and time represented as the number of milliseconds since - // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). - d = options.lastModified; - } - - // 4. Return a new File object F such that: - // F refers to the bytes byte sequence. - // F.size is set to the number of total bytes in bytes. - // F.name is set to n. - // F.type is set to t. - // F.lastModified is set to d. + // 6. Let index be object’s index. + // 7. Let kind be object’s kind. + // 8. Let values be object’s target's value pairs to iterate over. + const index = this.#index; + const values = this.#target[kInternalIterator]; - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } + // 9. Let len be the length of values. + const len = values.length; - get name () { - webidl.brandCheck(this, File); + // 10. If index is greater than or equal to len, then return + // CreateIterResultObject(undefined, true). + if (index >= len) { + return { + value: undefined, + done: true + } + } - return this[kState].name - } + // 11. Let pair be the entry in values at index index. + const { [keyIndex]: key, [valueIndex]: value } = values[index]; - get lastModified () { - webidl.brandCheck(this, File); + // 12. Set object’s index to index + 1. + this.#index = index + 1; - return this[kState].lastModified - } + // 13. Return the iterator result for pair and kind. - get type () { - webidl.brandCheck(this, File); + // https://webidl.spec.whatwg.org/#iterator-result + + // 1. Let result be a value determined by the value of kind: + let result; + switch (this.#kind) { + case 'key': + // 1. Let idlKey be pair’s key. + // 2. Let key be the result of converting idlKey to an + // ECMAScript value. + // 3. result is key. + result = key; + break + case 'value': + // 1. Let idlValue be pair’s value. + // 2. Let value be the result of converting idlValue to + // an ECMAScript value. + // 3. result is value. + result = value; + break + case 'key+value': + // 1. Let idlKey be pair’s key. + // 2. Let idlValue be pair’s value. + // 3. Let key be the result of converting idlKey to an + // ECMAScript value. + // 4. Let value be the result of converting idlValue to + // an ECMAScript value. + // 5. Let array be ! ArrayCreate(2). + // 6. Call ! CreateDataProperty(array, "0", key). + // 7. Call ! CreateDataProperty(array, "1", value). + // 8. result is array. + result = [key, value]; + break + } - return this[kState].type + // 2. Return CreateIterResultObject(result, false). + return { + value: result, + done: false + } + } } - } - class FileLike { - constructor (blobLike, fileName, options = {}) { - // TODO: argument idl type check + // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + // @ts-ignore + delete FastIterableIterator.prototype.constructor; - // The File constructor is invoked with two or three parameters, depending - // on whether the optional dictionary parameter is used. When the File() - // constructor is invoked, user agents must run the following steps: + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); - // 1. Let bytes be the result of processing blob parts given fileBits and - // options. + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + + /** + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + * @returns {IterableIterator} + */ + return function (target, kind) { + return new FastIterableIterator(target, kind) + } + } + + /** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {string} name name of the instance + * @param {any} object class + * @param {symbol} kInternalIterator + * @param {string | number} [keyIndex] + * @param {string | number} [valueIndex] + */ + function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); + + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys () { + webidl.brandCheck(this, object); + return makeIterator(this, 'key') + } + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values () { + webidl.brandCheck(this, object); + return makeIterator(this, 'value') + } + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries () { + webidl.brandCheck(this, object); + return makeIterator(this, 'key+value') + } + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach (callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`); + if (typeof callbackfn !== 'function') { + throw new TypeError( + `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` + ) + } + for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) { + callbackfn.call(thisArg, value, key, this); + } + } + } + }; + + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value + } + }) + } + + /** + * @see https://fetch.spec.whatwg.org/#body-fully-read + */ + async function fullyReadBody (body, processBody, processBodyError) { + // 1. If taskDestination is null, then set taskDestination to + // the result of starting a new parallel queue. + + // 2. Let successSteps given a byte sequence bytes be to queue a + // fetch task to run processBody given bytes, with taskDestination. + const successSteps = processBody; + + // 3. Let errorSteps be to queue a fetch task to run processBodyError, + // with taskDestination. + const errorSteps = processBodyError; + + // 4. Let reader be the result of getting a reader for body’s stream. + // If that threw an exception, then run errorSteps with that + // exception and return. + let reader; + + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return + } + + // 5. Read all bytes from reader, given successSteps and errorSteps. + try { + successSteps(await readAllBytes(reader)); + } catch (e) { + errorSteps(e); + } + } + + function isReadableStreamLike (stream) { + return stream instanceof ReadableStream || ( + stream[Symbol.toStringTag] === 'ReadableStream' && + typeof stream.tee === 'function' + ) + } + + /** + * @param {ReadableStreamController} controller + */ + function readableStreamClose (controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + // TODO: add comment explaining why this error occurs. + if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) { + throw err + } + } + } + + const invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; // eslint-disable-line + + /** + * @see https://infra.spec.whatwg.org/#isomorphic-encode + * @param {string} input + */ + function isomorphicEncode (input) { + // 1. Assert: input contains no code points greater than U+00FF. + assert(!invalidIsomorphicEncodeValueRegex.test(input)); + + // 2. Return a byte sequence whose length is equal to input’s code + // point length and whose bytes have the same values as the + // values of input’s code points, in the same order + return input + } + + /** + * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes + * @see https://streams.spec.whatwg.org/#read-loop + * @param {ReadableStreamDefaultReader} reader + */ + async function readAllBytes (reader) { + const bytes = []; + let byteLength = 0; + + while (true) { + const { done, value: chunk } = await reader.read(); + + if (done) { + // 1. Call successSteps with bytes. + return Buffer.concat(bytes, byteLength) + } + + // 1. If chunk is not a Uint8Array object, call failureSteps + // with a TypeError and abort these steps. + if (!isUint8Array(chunk)) { + throw new TypeError('Received non-Uint8Array chunk') + } + + // 2. Append the bytes represented by chunk to bytes. + bytes.push(chunk); + byteLength += chunk.length; + + // 3. Read-loop given reader, bytes, successSteps, and failureSteps. + } + } + + /** + * @see https://fetch.spec.whatwg.org/#is-local + * @param {URL} url + */ + function urlIsLocal (url) { + assert('protocol' in url); // ensure it's a url object + + const protocol = url.protocol; + + return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' + } + + /** + * @param {string|URL} url + * @returns {boolean} + */ + function urlHasHttpsScheme (url) { + return ( + ( + typeof url === 'string' && + url[5] === ':' && + url[0] === 'h' && + url[1] === 't' && + url[2] === 't' && + url[3] === 'p' && + url[4] === 's' + ) || + url.protocol === 'https:' + ) + } + + /** + * @see https://fetch.spec.whatwg.org/#http-scheme + * @param {URL} url + */ + function urlIsHttpHttpsScheme (url) { + assert('protocol' in url); // ensure it's a url object + + const protocol = url.protocol; + + return protocol === 'http:' || protocol === 'https:' + } + + /** + * @see https://fetch.spec.whatwg.org/#simple-range-header-value + * @param {string} value + * @param {boolean} allowWhitespace + */ + function simpleRangeHeaderValue (value, allowWhitespace) { + // 1. Let data be the isomorphic decoding of value. + // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string, + // nothing more. We obviously don't need to do that if value is a string already. + const data = value; + + // 2. If data does not start with "bytes", then return failure. + if (!data.startsWith('bytes')) { + return 'failure' + } + + // 3. Let position be a position variable for data, initially pointing at the 5th code point of data. + const position = { position: 5 }; + + // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, + // from data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 5. If the code point at position within data is not U+003D (=), then return failure. + if (data.charCodeAt(position.position) !== 0x3D) { + return 'failure' + } + + // 6. Advance position by 1. + position.position++; + + // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from + // data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits, + // from data given position. + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + + return code >= 0x30 && code <= 0x39 + }, + data, + position + ); + + // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the + // empty string; otherwise null. + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + + // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, + // from data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 11. If the code point at position within data is not U+002D (-), then return failure. + if (data.charCodeAt(position.position) !== 0x2D) { + return 'failure' + } + + // 12. Advance position by 1. + position.position++; + + // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab + // or space, from data given position. + // Note from Khafra: its the same step as in #8 again lol + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 14. Let rangeEnd be the result of collecting a sequence of code points that are + // ASCII digits, from data given position. + // Note from Khafra: you wouldn't guess it, but this is also the same step as #8 + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + + return code >= 0x30 && code <= 0x39 + }, + data, + position + ); + + // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd + // is not the empty string; otherwise null. + // Note from Khafra: THE SAME STEP, AGAIN!!! + // Note: why interpret as a decimal if we only collect ascii digits? + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + + // 16. If position is not past the end of data, then return failure. + if (position.position < data.length) { + return 'failure' + } + + // 17. If rangeEndValue and rangeStartValue are null, then return failure. + if (rangeEndValue === null && rangeStartValue === null) { + return 'failure' + } + + // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is + // greater than rangeEndValue, then return failure. + // Note: ... when can they not be numbers? + if (rangeStartValue > rangeEndValue) { + return 'failure' + } + + // 19. Return (rangeStartValue, rangeEndValue). + return { rangeStartValue, rangeEndValue } + } + + /** + * @see https://fetch.spec.whatwg.org/#build-a-content-range + * @param {number} rangeStart + * @param {number} rangeEnd + * @param {number} fullLength + */ + function buildContentRange (rangeStart, rangeEnd, fullLength) { + // 1. Let contentRange be `bytes `. + let contentRange = 'bytes '; + + // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange. + contentRange += isomorphicEncode(`${rangeStart}`); + + // 3. Append 0x2D (-) to contentRange. + contentRange += '-'; + + // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange. + contentRange += isomorphicEncode(`${rangeEnd}`); + + // 5. Append 0x2F (/) to contentRange. + contentRange += '/'; + + // 6. Append fullLength, serialized and isomorphic encoded to contentRange. + contentRange += isomorphicEncode(`${fullLength}`); + + // 7. Return contentRange. + return contentRange + } + + // A Stream, which pipes the response to zlib.createInflate() or + // zlib.createInflateRaw() depending on the first byte of the Buffer. + // If the lower byte of the first byte is 0x08, then the stream is + // interpreted as a zlib stream, otherwise it's interpreted as a + // raw deflate stream. + class InflateStream extends Transform { + #zlibOptions + + /** @param {zlib.ZlibOptions} [zlibOptions] */ + constructor (zlibOptions) { + super(); + this.#zlibOptions = zlibOptions; + } + + _transform (chunk, encoding, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return + } + this._inflateStream = (chunk[0] & 0x0F) === 0x08 + ? zlib.createInflate(this.#zlibOptions) + : zlib.createInflateRaw(this.#zlibOptions); + + this._inflateStream.on('data', this.push.bind(this)); + this._inflateStream.on('end', () => this.push(null)); + this._inflateStream.on('error', (err) => this.destroy(err)); + } + + this._inflateStream.write(chunk, encoding, callback); + } + + _final (callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; + } + callback(); + } + } + + /** + * @param {zlib.ZlibOptions} [zlibOptions] + * @returns {InflateStream} + */ + function createInflate (zlibOptions) { + return new InflateStream(zlibOptions) + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type + * @param {import('./headers').HeadersList} headers + */ + function extractMimeType (headers) { + // 1. Let charset be null. + let charset = null; + + // 2. Let essence be null. + let essence = null; + + // 3. Let mimeType be null. + let mimeType = null; + + // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers. + const values = getDecodeSplit('content-type', headers); + + // 5. If values is null, then return failure. + if (values === null) { + return 'failure' + } + + // 6. For each value of values: + for (const value of values) { + // 6.1. Let temporaryMimeType be the result of parsing value. + const temporaryMimeType = parseMIMEType(value); + + // 6.2. If temporaryMimeType is failure or its essence is "*/*", then continue. + if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') { + continue + } + + // 6.3. Set mimeType to temporaryMimeType. + mimeType = temporaryMimeType; + + // 6.4. If mimeType’s essence is not essence, then: + if (mimeType.essence !== essence) { + // 6.4.1. Set charset to null. + charset = null; + + // 6.4.2. If mimeType’s parameters["charset"] exists, then set charset to + // mimeType’s parameters["charset"]. + if (mimeType.parameters.has('charset')) { + charset = mimeType.parameters.get('charset'); + } + + // 6.4.3. Set essence to mimeType’s essence. + essence = mimeType.essence; + } else if (!mimeType.parameters.has('charset') && charset !== null) { + // 6.5. Otherwise, if mimeType’s parameters["charset"] does not exist, and + // charset is non-null, set mimeType’s parameters["charset"] to charset. + mimeType.parameters.set('charset', charset); + } + } + + // 7. If mimeType is null, then return failure. + if (mimeType == null) { + return 'failure' + } + + // 8. Return mimeType. + return mimeType + } + + /** + * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split + * @param {string|null} value + */ + function gettingDecodingSplitting (value) { + // 1. Let input be the result of isomorphic decoding value. + const input = value; + + // 2. Let position be a position variable for input, initially pointing at the start of input. + const position = { position: 0 }; + + // 3. Let values be a list of strings, initially empty. + const values = []; + + // 4. Let temporaryValue be the empty string. + let temporaryValue = ''; + + // 5. While position is not past the end of input: + while (position.position < input.length) { + // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (") + // or U+002C (,) from input, given position, to temporaryValue. + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ',', + input, + position + ); + + // 5.2. If position is not past the end of input, then: + if (position.position < input.length) { + // 5.2.1. If the code point at position within input is U+0022 ("), then: + if (input.charCodeAt(position.position) === 0x22) { + // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue. + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + + // 5.2.1.2. If position is not past the end of input, then continue. + if (position.position < input.length) { + continue + } + } else { + // 5.2.2. Otherwise: + + // 5.2.2.1. Assert: the code point at position within input is U+002C (,). + assert(input.charCodeAt(position.position) === 0x2C); + + // 5.2.2.2. Advance position by 1. + position.position++; + } + } + + // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue. + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20); + + // 5.4. Append temporaryValue to values. + values.push(temporaryValue); + + // 5.6. Set temporaryValue to the empty string. + temporaryValue = ''; + } + + // 6. Return values. + return values + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split + * @param {string} name lowercase header name + * @param {import('./headers').HeadersList} list + */ + function getDecodeSplit (name, list) { + // 1. Let value be the result of getting name from list. + const value = list.get(name, true); + + // 2. If value is null, then return null. + if (value === null) { + return null + } + + // 3. Return the result of getting, decoding, and splitting value. + return gettingDecodingSplitting(value) + } + + const textDecoder = new TextDecoder(); + + /** + * @see https://encoding.spec.whatwg.org/#utf-8-decode + * @param {Buffer} buffer + */ + function utf8DecodeBytes (buffer) { + if (buffer.length === 0) { + return '' + } + + // 1. Let buffer be the result of peeking three bytes from + // ioQueue, converted to a byte sequence. + + // 2. If buffer is 0xEF 0xBB 0xBF, then read three + // bytes from ioQueue. (Do nothing with those bytes.) + if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { + buffer = buffer.subarray(3); + } + + // 3. Process a queue with an instance of UTF-8’s + // decoder, ioQueue, output, and "replacement". + const output = textDecoder.decode(buffer); + + // 4. Return output. + return output + } + + class EnvironmentSettingsObjectBase { + get baseUrl () { + return getGlobalOrigin() + } + + get origin () { + return this.baseUrl?.origin + } + + policyContainer = makePolicyContainer() + } + + class EnvironmentSettingsObject { + settingsObject = new EnvironmentSettingsObjectBase() + } + + const environmentSettingsObject = new EnvironmentSettingsObject(); + + util$g = { + isAborted, + isCancelled, + isValidEncodedURL, + createDeferredPromise, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + simpleRangeHeaderValue, + buildContentRange, + parseMetadata, + createInflate, + extractMimeType, + getDecodeSplit, + utf8DecodeBytes, + environmentSettingsObject + }; + return util$g; +} + +var symbols$8; +var hasRequiredSymbols$8; + +function requireSymbols$8 () { + if (hasRequiredSymbols$8) return symbols$8; + hasRequiredSymbols$8 = 1; + + symbols$8 = { + kUrl: Symbol('url'), + kHeaders: Symbol('headers'), + kSignal: Symbol('signal'), + kState: Symbol('state'), + kDispatcher: Symbol('dispatcher') + }; + return symbols$8; +} + +var file$2; +var hasRequiredFile$2; + +function requireFile$2 () { + if (hasRequiredFile$2) return file$2; + hasRequiredFile$2 = 1; + + const { Blob, File } = require$$0$6; + const { kState } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + + // TODO(@KhafraDev): remove + class FileLike { + constructor (blobLike, fileName, options = {}) { + // TODO: argument idl type check + + // The File constructor is invoked with two or three parameters, depending + // on whether the optional dictionary parameter is used. When the File() + // constructor is invoked, user agents must run the following steps: + + // 1. Let bytes be the result of processing blob parts given fileBits and + // options. // 2. Let n be the fileName argument to the constructor. const n = fileName; @@ -6294,145 +7531,15 @@ function requireFile$1 () { } } - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: 'File', - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob); - webidl.converters.BlobPart = function (V, opts) { - if (webidl.util.Type(V) === 'Object') { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) - } - - if ( - ArrayBuffer.isView(V) || - types.isAnyArrayBuffer(V) - ) { - return webidl.converters.BufferSource(V, opts) - } - } - - return webidl.converters.USVString(V, opts) - }; - - webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.BlobPart - ); - - // https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: 'lastModified', - converter: webidl.converters['long long'], - get defaultValue () { - return Date.now() - } - }, - { - key: 'type', - converter: webidl.converters.DOMString, - defaultValue: '' - }, - { - key: 'endings', - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - - if (value !== 'native') { - value = 'transparent'; - } - - return value - }, - defaultValue: 'transparent' - } - ]); - - /** - * @see https://www.w3.org/TR/FileAPI/#process-blob-parts - * @param {(NodeJS.TypedArray|Blob|string)[]} parts - * @param {{ type: string, endings: string }} options - */ - function processBlobParts (parts, options) { - // 1. Let bytes be an empty sequence of bytes. - /** @type {NodeJS.TypedArray[]} */ - const bytes = []; - - // 2. For each element in parts: - for (const element of parts) { - // 1. If element is a USVString, run the following substeps: - if (typeof element === 'string') { - // 1. Let s be element. - let s = element; - - // 2. If the endings member of options is "native", set s - // to the result of converting line endings to native - // of element. - if (options.endings === 'native') { - s = convertLineEndingsNative(s); - } - - // 3. Append the result of UTF-8 encoding s to bytes. - bytes.push(encoder.encode(s)); - } else if ( - types.isAnyArrayBuffer(element) || - types.isTypedArray(element) - ) { - // 2. If element is a BufferSource, get a copy of the - // bytes held by the buffer source, and append those - // bytes to bytes. - if (!element.buffer) { // ArrayBuffer - bytes.push(new Uint8Array(element)); - } else { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ); - } - } else if (isBlobLike(element)) { - // 3. If element is a Blob, append the bytes it represents - // to bytes. - bytes.push(element); - } - } - - // 3. Return bytes. - return bytes - } - - /** - * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native - * @param {string} s - */ - function convertLineEndingsNative (s) { - // 1. Let native line ending be be the code point U+000A LF. - let nativeLineEnding = '\n'; - - // 2. If the underlying platform’s conventions are to - // represent newlines as a carriage return and line feed - // sequence, set native line ending to the code point - // U+000D CR followed by the code point U+000A LF. - if (process.platform === 'win32') { - nativeLineEnding = '\r\n'; - } - - return s.replace(/\r?\n/g, nativeLineEnding) - } - // If this function is moved to ./util.js, some tools (such as // rollup) will warn about circular dependencies. See: // https://github.com/nodejs/undici/issues/1629 function isFileLike (object) { return ( - (NativeFile && object instanceof NativeFile) || - object instanceof File || ( + (object instanceof File) || + ( object && (typeof object.stream === 'function' || typeof object.arrayBuffer === 'function') && @@ -6441,29 +7548,33 @@ function requireFile$1 () { ) } - file$1 = { File, FileLike, isFileLike }; - return file$1; + file$2 = { FileLike, isFileLike }; + return file$2; } -var formdata; -var hasRequiredFormdata; +var formdata$1; +var hasRequiredFormdata$1; -function requireFormdata () { - if (hasRequiredFormdata) return formdata; - hasRequiredFormdata = 1; +function requireFormdata$1 () { + if (hasRequiredFormdata$1) return formdata$1; + hasRequiredFormdata$1 = 1; - const { isBlobLike, toUSVString, makeIterator } = requireUtil$7(); - const { kState } = requireSymbols$3(); - const { File: UndiciFile, FileLike, isFileLike } = requireFile$1(); - const { webidl } = requireWebidl(); - const { Blob, File: NativeFile } = require$$7; + const { isBlobLike, iteratorMixin } = requireUtil$g(); + const { kState } = requireSymbols$8(); + const { kEnumerableProperty } = requireUtil$h(); + const { FileLike, isFileLike } = requireFile$2(); + const { webidl } = requireWebidl$1(); + const { File: NativeFile } = require$$0$6; + const nodeUtil = require$$0$a; /** @type {globalThis['File']} */ - const File = NativeFile ?? UndiciFile; + const File = globalThis.File ?? NativeFile; // https://xhr.spec.whatwg.org/#formdata class FormData { constructor (form) { + webidl.util.markAsUncloneable(this); + if (form !== undefined) { throw webidl.errors.conversionFailed({ prefix: 'FormData constructor', @@ -6478,7 +7589,8 @@ function requireFormdata () { append (name, value, filename = undefined) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' }); + const prefix = 'FormData.append'; + webidl.argumentLengthCheck(arguments, 2, prefix); if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( @@ -6488,12 +7600,12 @@ function requireFormdata () { // 1. Let value be value if given; otherwise blobValue. - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); value = isBlobLike(value) - ? webidl.converters.Blob(value, { strict: false }) - : webidl.converters.USVString(value); + ? webidl.converters.Blob(value, prefix, 'value', { strict: false }) + : webidl.converters.USVString(value, prefix, 'value'); filename = arguments.length === 3 - ? webidl.converters.USVString(filename) + ? webidl.converters.USVString(filename, prefix, 'filename') : undefined; // 2. Let entry be the result of creating an entry with @@ -6507,9 +7619,10 @@ function requireFormdata () { delete (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' }); + const prefix = 'FormData.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // The delete(name) method steps are to remove all entries whose name // is name from this’s entry list. @@ -6519,9 +7632,10 @@ function requireFormdata () { get (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' }); + const prefix = 'FormData.get'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // 1. If there is no entry whose name is name in this’s entry list, // then return null. @@ -6538,9 +7652,10 @@ function requireFormdata () { getAll (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' }); + const prefix = 'FormData.getAll'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // 1. If there is no entry whose name is name in this’s entry list, // then return the empty list. @@ -6554,9 +7669,10 @@ function requireFormdata () { has (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' }); + const prefix = 'FormData.has'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // The has(name) method steps are to return true if there is an entry // whose name is name in this’s entry list; otherwise false. @@ -6566,7 +7682,8 @@ function requireFormdata () { set (name, value, filename = undefined) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' }); + const prefix = 'FormData.set'; + webidl.argumentLengthCheck(arguments, 2, prefix); if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( @@ -6579,12 +7696,12 @@ function requireFormdata () { // 1. Let value be value if given; otherwise blobValue. - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); value = isBlobLike(value) - ? webidl.converters.Blob(value, { strict: false }) - : webidl.converters.USVString(value); + ? webidl.converters.Blob(value, prefix, 'name', { strict: false }) + : webidl.converters.USVString(value, prefix, 'name'); filename = arguments.length === 3 - ? toUSVString(filename) + ? webidl.converters.USVString(filename, prefix, 'name') : undefined; // 2. Let entry be the result of creating an entry with name, value, and @@ -6606,60 +7723,40 @@ function requireFormdata () { } } - entries () { - webidl.brandCheck(this, FormData); - - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'key+value' - ) - } + [nodeUtil.inspect.custom] (depth, options) { + const state = this[kState].reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } - keys () { - webidl.brandCheck(this, FormData); + return a + }, { __proto__: null }); - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'key' - ) - } + options.depth ??= depth; + options.colors ??= true; - values () { - webidl.brandCheck(this, FormData); + const output = nodeUtil.formatWithOptions(options, state); - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'value' - ) + // remove [Object null prototype] + return `FormData ${output.slice(output.indexOf(']') + 2)}` } + } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach (callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, FormData); - - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' }); - - if (typeof callbackFn !== 'function') { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ) - } - - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - } - - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; + iteratorMixin('FormData', FormData, kState, 'name', 'value'); Object.defineProperties(FormData.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, [Symbol.toStringTag]: { value: 'FormData', configurable: true @@ -6675,16 +7772,11 @@ function requireFormdata () { */ function makeEntry (name, value, filename) { // 1. Set name to the result of converting name into a scalar value string. - // "To convert a string into a scalar value string, replace any surrogates - // with U+FFFD." - // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end - name = Buffer.from(name).toString('utf8'); + // Note: This operation was done by the webidl converter USVString. // 2. If value is a string, then set value to the result of converting // value into a scalar value string. - if (typeof value === 'string') { - value = Buffer.from(value).toString('utf8'); - } else { + if (typeof value === 'string') ; else { // 3. Otherwise: // 1. If value is not a File object, then set value to a new File object, @@ -6704,7 +7796,7 @@ function requireFormdata () { lastModified: value.lastModified }; - value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile + value = value instanceof NativeFile ? new File([value], filename, options) : new FileLike(value, filename, options); } @@ -6714,40 +7806,521 @@ function requireFormdata () { return { name, value } } - formdata = { FormData }; - return formdata; + formdata$1 = { FormData, makeEntry }; + return formdata$1; } -var body; -var hasRequiredBody; +var formdataParser$1; +var hasRequiredFormdataParser$1; -function requireBody () { - if (hasRequiredBody) return body; - hasRequiredBody = 1; +function requireFormdataParser$1 () { + if (hasRequiredFormdataParser$1) return formdataParser$1; + hasRequiredFormdataParser$1 = 1; + + const { isUSVString, bufferToLowerCasedHeaderName } = requireUtil$h(); + const { utf8DecodeBytes } = requireUtil$g(); + const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = requireDataUrl$1(); + const { isFileLike } = requireFile$2(); + const { makeEntry } = requireFormdata$1(); + const assert = require$$0$7; + const { File: NodeFile } = require$$0$6; + + const File = globalThis.File ?? NodeFile; + + const formDataNameBuffer = Buffer.from('form-data; name="'); + const filenameBuffer = Buffer.from('; filename'); + const dd = Buffer.from('--'); + const ddcrlf = Buffer.from('--\r\n'); + + /** + * @param {string} chars + */ + function isAsciiString (chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & -128) !== 0) { + return false + } + } + return true + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary + * @param {string} boundary + */ + function validateBoundary (boundary) { + const length = boundary.length; + + // - its length is greater or equal to 27 and lesser or equal to 70, and + if (length < 27 || length > 70) { + return false + } + + // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or + // 0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('), + // 0x2D (-) or 0x5F (_). + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + + if (!( + (cp >= 0x30 && cp <= 0x39) || + (cp >= 0x41 && cp <= 0x5a) || + (cp >= 0x61 && cp <= 0x7a) || + cp === 0x27 || + cp === 0x2d || + cp === 0x5f + )) { + return false + } + } + + return true + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser + * @param {Buffer} input + * @param {ReturnType} mimeType + */ + function multipartFormDataParser (input, mimeType) { + // 1. Assert: mimeType’s essence is "multipart/form-data". + assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data'); + + const boundaryString = mimeType.parameters.get('boundary'); + + // 2. If mimeType’s parameters["boundary"] does not exist, return failure. + // Otherwise, let boundary be the result of UTF-8 decoding mimeType’s + // parameters["boundary"]. + if (boundaryString === undefined) { + return 'failure' + } + + const boundary = Buffer.from(`--${boundaryString}`, 'utf8'); + + // 3. Let entry list be an empty entry list. + const entryList = []; + + // 4. Let position be a pointer to a byte in input, initially pointing at + // the first byte. + const position = { position: 0 }; + + // Note: undici addition, allows leading and trailing CRLFs. + while (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { + position.position += 2; + } + + let trailing = input.length; + + while (input[trailing - 1] === 0x0a && input[trailing - 2] === 0x0d) { + trailing -= 2; + } + + if (trailing !== input.length) { + input = input.subarray(0, trailing); + } + + // 5. While true: + while (true) { + // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D + // (`--`) followed by boundary, advance position by 2 + the length of + // boundary. Otherwise, return failure. + // Note: boundary is padded with 2 dashes already, no need to add 2. + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + return 'failure' + } + + // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A + // (`--` followed by CR LF) followed by the end of input, return entry list. + // Note: a body does NOT need to end with CRLF. It can end with --. + if ( + (position.position === input.length - 2 && bufferStartsWith(input, dd, position)) || + (position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) + ) { + return entryList + } + + // 5.3. If position does not point to a sequence of bytes starting with 0x0D + // 0x0A (CR LF), return failure. + if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { + return 'failure' + } + + // 5.4. Advance position by 2. (This skips past the newline.) + position.position += 2; + + // 5.5. Let name, filename and contentType be the result of parsing + // multipart/form-data headers on input and position, if the result + // is not failure. Otherwise, return failure. + const result = parseMultipartFormDataHeaders(input, position); + + if (result === 'failure') { + return 'failure' + } + + let { name, filename, contentType, encoding } = result; + + // 5.6. Advance position by 2. (This skips past the empty line that marks + // the end of the headers.) + position.position += 2; + + // 5.7. Let body be the empty byte sequence. + let body; + + // 5.8. Body loop: While position is not past the end of input: + // TODO: the steps here are completely wrong + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + + if (boundaryIndex === -1) { + return 'failure' + } + + body = input.subarray(position.position, boundaryIndex - 4); + + position.position += body.length; + + // Note: position must be advanced by the body's length before being + // decoded, otherwise the parsing will fail. + if (encoding === 'base64') { + body = Buffer.from(body.toString(), 'base64'); + } + } + + // 5.9. If position does not point to a sequence of bytes starting with + // 0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2. + if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { + return 'failure' + } else { + position.position += 2; + } + + // 5.10. If filename is not null: + let value; + + if (filename !== null) { + // 5.10.1. If contentType is null, set contentType to "text/plain". + contentType ??= 'text/plain'; + + // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string. + + // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead. + // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`. + if (!isAsciiString(contentType)) { + contentType = ''; + } + + // 5.10.3. Let value be a new File object with name filename, type contentType, and body body. + value = new File([body], filename, { type: contentType }); + } else { + // 5.11. Otherwise: + + // 5.11.1. Let value be the UTF-8 decoding without BOM of body. + value = utf8DecodeBytes(Buffer.from(body)); + } + + // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object. + assert(isUSVString(name)); + assert((typeof value === 'string' && isUSVString(value)) || isFileLike(value)); + + // 5.13. Create an entry with name and value, and append it to entry list. + entryList.push(makeEntry(name, value, filename)); + } + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers + * @param {Buffer} input + * @param {{ position: number }} position + */ + function parseMultipartFormDataHeaders (input, position) { + // 1. Let name, filename and contentType be null. + let name = null; + let filename = null; + let contentType = null; + let encoding = null; + + // 2. While true: + while (true) { + // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF): + if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { + // 2.1.1. If name is null, return failure. + if (name === null) { + return 'failure' + } + + // 2.1.2. Return name, filename and contentType. + return { name, filename, contentType, encoding } + } + + // 2.2. Let header name be the result of collecting a sequence of bytes that are + // not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position. + let headerName = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a, + input, + position + ); + + // 2.3. Remove any HTTP tab or space bytes from the start or end of header name. + headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20); + + // 2.4. If header name does not match the field-name token production, return failure. + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + return 'failure' + } - const Busboy = requireMain(); - const util = requireUtil$8(); + // 2.5. If the byte at position is not 0x3A (:), return failure. + if (input[position.position] !== 0x3a) { + return 'failure' + } + + // 2.6. Advance position by 1. + position.position++; + + // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position. + // (Do nothing with those bytes.) + collectASequenceOfBytes( + (char) => char === 0x20 || char === 0x09, + input, + position + ); + + // 2.8. Byte-lowercase header name and switch on the result: + switch (bufferToLowerCasedHeaderName(headerName)) { + case 'content-disposition': { + // 1. Set name and filename to null. + name = filename = null; + + // 2. If position does not point to a sequence of bytes starting with + // `form-data; name="`, return failure. + if (!bufferStartsWith(input, formDataNameBuffer, position)) { + return 'failure' + } + + // 3. Advance position so it points at the byte after the next 0x22 (") + // byte (the one in the sequence of bytes matched above). + position.position += 17; + + // 4. Set name to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return + // failure. + name = parseMultipartFormDataName(input, position); + + if (name === null) { + return 'failure' + } + + // 5. If position points to a sequence of bytes starting with `; filename="`: + if (bufferStartsWith(input, filenameBuffer, position)) { + // Note: undici also handles filename* + let check = position.position + filenameBuffer.length; + + if (input[check] === 0x2a) { + position.position += 1; + check += 1; + } + + if (input[check] !== 0x3d || input[check + 1] !== 0x22) { // =" + return 'failure' + } + + // 1. Advance position so it points at the byte after the next 0x22 (") byte + // (the one in the sequence of bytes matched above). + position.position += 12; + + // 2. Set filename to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return failure. + filename = parseMultipartFormDataName(input, position); + + if (filename === null) { + return 'failure' + } + } + + break + } + case 'content-type': { + // 1. Let header value be the result of collecting a sequence of bytes that are + // not 0x0A (LF) or 0x0D (CR), given position. + let headerValue = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + + // 2. Remove any HTTP tab or space bytes from the end of header value. + headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20); + + // 3. Set contentType to the isomorphic decoding of header value. + contentType = isomorphicDecode(headerValue); + + break + } + case 'content-transfer-encoding': { + let headerValue = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + + headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20); + + encoding = isomorphicDecode(headerValue); + + break + } + default: { + // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position. + // (Do nothing with those bytes.) + collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + } + } + + // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A + // (CR LF), return failure. Otherwise, advance position by 2 (past the newline). + if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) { + return 'failure' + } else { + position.position += 2; + } + } + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#parse-a-multipart-form-data-name + * @param {Buffer} input + * @param {{ position: number }} position + */ + function parseMultipartFormDataName (input, position) { + // 1. Assert: The byte at (position - 1) is 0x22 ("). + assert(input[position.position - 1] === 0x22); + + // 2. Let name be the result of collecting a sequence of bytes that are not 0x0A (LF), 0x0D (CR) or 0x22 ("), given position. + /** @type {string | Buffer} */ + let name = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d && char !== 0x22, + input, + position + ); + + // 3. If the byte at position is not 0x22 ("), return failure. Otherwise, advance position by 1. + if (input[position.position] !== 0x22) { + return null // name could be 'failure' + } else { + position.position++; + } + + // 4. Replace any occurrence of the following subsequences in name with the given byte: + // - `%0A`: 0x0A (LF) + // - `%0D`: 0x0D (CR) + // - `%22`: 0x22 (") + name = new TextDecoder().decode(name) + .replace(/%0A/ig, '\n') + .replace(/%0D/ig, '\r') + .replace(/%22/g, '"'); + + // 5. Return the UTF-8 decoding without BOM of name. + return name + } + + /** + * @param {(char: number) => boolean} condition + * @param {Buffer} input + * @param {{ position: number }} position + */ + function collectASequenceOfBytes (condition, input, position) { + let start = position.position; + + while (start < input.length && condition(input[start])) { + ++start; + } + + return input.subarray(position.position, (position.position = start)) + } + + /** + * @param {Buffer} buf + * @param {boolean} leading + * @param {boolean} trailing + * @param {(charCode: number) => boolean} predicate + * @returns {Buffer} + */ + function removeChars (buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + + if (leading) { + while (lead < buf.length && predicate(buf[lead])) lead++; + } + + { + while (trail > 0 && predicate(buf[trail])) trail--; + } + + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1) + } + + /** + * Checks if {@param buffer} starts with {@param start} + * @param {Buffer} buffer + * @param {Buffer} start + * @param {{ position: number }} position + */ + function bufferStartsWith (buffer, start, position) { + if (buffer.length < start.length) { + return false + } + + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer[position.position + i]) { + return false + } + } + + return true + } + + formdataParser$1 = { + multipartFormDataParser, + validateBoundary + }; + return formdataParser$1; +} + +var body$1; +var hasRequiredBody$1; + +function requireBody$1 () { + if (hasRequiredBody$1) return body$1; + hasRequiredBody$1 = 1; + + const util = requireUtil$h(); const { ReadableStreamFrom, isBlobLike, isReadableStreamLike, readableStreamClose, createDeferredPromise, - fullyReadBody - } = requireUtil$7(); - const { FormData } = requireFormdata(); - const { kState } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { DOMException, structuredClone } = requireConstants$a(); - const { Blob, File: NativeFile } = require$$7; - const { kBodyUsed } = requireSymbols$4(); - const assert = require$$0$8; - const { isErrored } = requireUtil$8(); - const { isUint8Array, isArrayBuffer } = require$$5; - const { File: UndiciFile } = requireFile$1(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - + fullyReadBody, + extractMimeType, + utf8DecodeBytes + } = requireUtil$g(); + const { FormData } = requireFormdata$1(); + const { kState } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { Blob } = require$$0$6; + const assert = require$$0$7; + const { isErrored, isDisturbed } = require$$0$8; + const { isArrayBuffer } = require$$8$1; + const { serializeAMimeType } = requireDataUrl$1(); + const { multipartFormDataParser } = requireFormdataParser$1(); let random; + try { const crypto = require('node:crypto'); random = (max) => crypto.randomInt(0, max); @@ -6755,19 +8328,23 @@ function requireBody () { random = (max) => Math.floor(Math.random(max)); } - let ReadableStream = globalThis.ReadableStream; - - /** @type {globalThis['File']} */ - const File = NativeFile ?? UndiciFile; const textEncoder = new TextEncoder(); - const textDecoder = new TextDecoder(); + function noop () {} + + const hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf('v18') !== 0; + let streamRegistry; + + if (hasFinalizationRegistry) { + streamRegistry = new FinalizationRegistry((weakRef) => { + const stream = weakRef.deref(); + if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { + stream.cancel('Response object has been garbage collected').catch(noop); + } + }); + } // https://fetch.spec.whatwg.org/#concept-bodyinit-extract function extractBody (object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - // 1. Let stream be null. let stream = null; @@ -6780,16 +8357,19 @@ function requireBody () { stream = object.stream(); } else { // 4. Otherwise, set stream to a new ReadableStream object, and set - // up stream. + // up stream with byte reading support. stream = new ReadableStream({ async pull (controller) { - controller.enqueue( - typeof source === 'string' ? textEncoder.encode(source) : source - ); + const buffer = typeof source === 'string' ? textEncoder.encode(source) : source; + + if (buffer.byteLength) { + controller.enqueue(buffer); + } + queueMicrotask(() => readableStreamClose(controller)); }, start () {}, - type: undefined + type: 'bytes' }); } @@ -6881,7 +8461,10 @@ function requireBody () { } } - const chunk = textEncoder.encode(`--${boundary}--`); + // CRLF is appended to the body to function with legacy servers and match other implementations. + // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030 + // https://github.com/form-data/form-data/issues/63 + const chunk = textEncoder.encode(`--${boundary}--\r\n`); blobParts.push(chunk); length += chunk.byteLength; if (hasUnknownSizeValue) { @@ -6904,7 +8487,7 @@ function requireBody () { // Set type to `multipart/form-data; boundary=`, // followed by the multipart/form-data boundary string generated // by the multipart/form-data encoding algorithm. - type = 'multipart/form-data; boundary=' + boundary; + type = `multipart/form-data; boundary=${boundary}`; } else if (isBlobLike(object)) { // Blob @@ -6956,13 +8539,17 @@ function requireBody () { // When running action is done, close stream. queueMicrotask(() => { controller.close(); + controller.byobRequest?.respond(0); }); } else { // Whenever one or more bytes are available and stream is not errored, // enqueue a Uint8Array wrapping an ArrayBuffer containing the available // bytes into stream. if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)); + const buffer = new Uint8Array(value); + if (buffer.byteLength) { + controller.enqueue(buffer); + } } } return controller.desiredSize > 0 @@ -6970,7 +8557,7 @@ function requireBody () { async cancel (reason) { await iterator.return(); }, - type: undefined + type: 'bytes' }); } @@ -6984,11 +8571,6 @@ function requireBody () { // https://fetch.spec.whatwg.org/#bodyinit-safely-extract function safelyExtractBody (object, keepalive = false) { - if (!ReadableStream) { - // istanbul ignore next - ReadableStream = require$$14.ReadableStream; - } - // To safely extract a body and a `Content-Type` value from // a byte sequence or BodyInit object object, run these steps: @@ -7005,52 +8587,25 @@ function requireBody () { return extractBody(object, keepalive) } - function cloneBody (body) { + function cloneBody (instance, body) { // To clone a body body, run these steps: // https://fetch.spec.whatwg.org/#concept-body-clone // 1. Let « out1, out2 » be the result of teeing body’s stream. const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - // This, for whatever reasons, unrefs out2Clone which allows - // the process to exit by itself. - const [, finalClone] = out2Clone.tee(); // 2. Set body’s stream to out1. body.stream = out1; // 3. Return a body whose stream is out2 and other members are copied from body. return { - stream: finalClone, + stream: out2, length: body.length, source: body.source } } - async function * consumeBody (body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - - if (util.isDisturbed(stream)) { - throw new TypeError('The body has already been consumed.') - } - - if (stream.locked) { - throw new TypeError('The stream is locked.') - } - - // Compat. - stream[kBodyUsed] = true; - - yield * stream; - } - } - } - function throwIfAborted (state) { if (state.aborted) { throw new DOMException('The operation was aborted.', 'AbortError') @@ -7065,10 +8620,10 @@ function requireBody () { // given a byte sequence bytes: return a Blob whose // contents are bytes and whose type attribute is this’s // MIME type. - return specConsumeBody(this, (bytes) => { + return consumeBody(this, (bytes) => { let mimeType = bodyMimeType(this); - if (mimeType === 'failure') { + if (mimeType === null) { mimeType = ''; } else if (mimeType) { mimeType = serializeAMimeType(mimeType); @@ -7085,7 +8640,7 @@ function requireBody () { // of running consume body with this and the following step // given a byte sequence bytes: return a new ArrayBuffer // whose contents are bytes. - return specConsumeBody(this, (bytes) => { + return consumeBody(this, (bytes) => { return new Uint8Array(bytes).buffer }, instance) }, @@ -7093,126 +8648,74 @@ function requireBody () { text () { // The text() method steps are to return the result of running // consume body with this and UTF-8 decode. - return specConsumeBody(this, utf8DecodeBytes, instance) + return consumeBody(this, utf8DecodeBytes, instance) }, json () { // The json() method steps are to return the result of running // consume body with this and parse JSON from bytes. - return specConsumeBody(this, parseJSONFromBytes, instance) + return consumeBody(this, parseJSONFromBytes, instance) }, - async formData () { - webidl.brandCheck(this, instance); - - throwIfAborted(this[kState]); - - const contentType = this.headers.get('Content-Type'); - - // If mimeType’s essence is "multipart/form-data", then: - if (/multipart\/form-data/.test(contentType)) { - const headers = {}; - for (const [key, value] of this.headers) headers[key.toLowerCase()] = value; - - const responseFormData = new FormData(); - - let busboy; - - try { - busboy = new Busboy({ - headers, - preservePath: true - }); - } catch (err) { - throw new DOMException(`${err}`, 'AbortError') - } - - busboy.on('field', (name, value) => { - responseFormData.append(name, value); - }); - busboy.on('file', (name, value, filename, encoding, mimeType) => { - const chunks = []; - - if (encoding === 'base64' || encoding.toLowerCase() === 'base64') { - let base64chunk = ''; - - value.on('data', (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ''); - - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64')); + formData () { + // The formData() method steps are to return the result of running + // consume body with this and the following step given a byte sequence bytes: + return consumeBody(this, (value) => { + // 1. Let mimeType be the result of get the MIME type with this. + const mimeType = bodyMimeType(this); + + // 2. If mimeType is non-null, then switch on mimeType’s essence and run + // the corresponding steps: + if (mimeType !== null) { + switch (mimeType.essence) { + case 'multipart/form-data': { + // 1. ... [long step] + const parsed = multipartFormDataParser(value, mimeType); + + // 2. If that fails for some reason, then throw a TypeError. + if (parsed === 'failure') { + throw new TypeError('Failed to parse body as FormData.') + } - base64chunk = base64chunk.slice(end); - }); - value.on('end', () => { - chunks.push(Buffer.from(base64chunk, 'base64')); - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } else { - value.on('data', (chunk) => { - chunks.push(chunk); - }); - value.on('end', () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } - }); + // 3. Return a new FormData object, appending each entry, + // resulting from the parsing operation, to its entry list. + const fd = new FormData(); + fd[kState] = parsed; - const busboyResolve = new Promise((resolve, reject) => { - busboy.on('finish', resolve); - busboy.on('error', (err) => reject(new TypeError(err))); - }); + return fd + } + case 'application/x-www-form-urlencoded': { + // 1. Let entries be the result of parsing bytes. + const entries = new URLSearchParams(value.toString()); - if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk); - busboy.end(); - await busboyResolve; + // 2. If entries is failure, then throw a TypeError. - return responseFormData - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then: + // 3. Return a new FormData object whose entry list is entries. + const fd = new FormData(); - // 1. Let entries be the result of parsing bytes. - let entries; - try { - let text = ''; - // application/x-www-form-urlencoded parser will keep the BOM. - // https://url.spec.whatwg.org/#concept-urlencoded-parser - // Note that streaming decoder is stateful and cannot be reused - const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true }); + for (const [name, value] of entries) { + fd.append(name, value); + } - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError('Expected Uint8Array chunk') + return fd } - text += streamingDecoder.decode(chunk, { stream: true }); } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - // istanbul ignore next: Unclear when new URLSearchParams can fail on a string. - // 2. If entries is failure, then throw a TypeError. - throw Object.assign(new TypeError(), { cause: err }) } - // 3. Return a new FormData object whose entries are entries. - const formData = new FormData(); - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData - } else { - // Wait a tick before checking if the request has been aborted. - // Otherwise, a TypeError can be thrown when an AbortError should. - await Promise.resolve(); - - throwIfAborted(this[kState]); + // 3. Throw a TypeError. + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + ) + }, instance) + }, - // Otherwise, throw a TypeError. - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: 'Could not parse content as FormData.' - }) - } + bytes () { + // The bytes() method steps are to return the result of running consume body + // with this and the following step given a byte sequence bytes: return the + // result of creating a Uint8Array from bytes in this’s relevant realm. + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes) + }, instance) } }; @@ -7229,17 +8732,17 @@ function requireBody () { * @param {(value: unknown) => unknown} convertBytesToJSValue * @param {Response|Request} instance */ - async function specConsumeBody (object, convertBytesToJSValue, instance) { + async function consumeBody (object, convertBytesToJSValue, instance) { webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - // 1. If object is unusable, then return a promise rejected // with a TypeError. - if (bodyUnusable(object[kState].body)) { - throw new TypeError('Body is unusable') + if (bodyUnusable(object)) { + throw new TypeError('Body is unusable: Body has already been read') } + throwIfAborted(object[kState]); + // 2. Let promise be a new promise. const promise = createDeferredPromise(); @@ -7261,7 +8764,7 @@ function requireBody () { // 5. If object’s body is null, then run successSteps with an // empty byte sequence. if (object[kState].body == null) { - successSteps(new Uint8Array()); + successSteps(Buffer.allocUnsafe(0)); return promise.promise } @@ -7274,39 +8777,15 @@ function requireBody () { } // https://fetch.spec.whatwg.org/#body-unusable - function bodyUnusable (body) { + function bodyUnusable (object) { + const body = object[kState].body; + // An object including the Body interface mixin is // said to be unusable if its body is non-null and // its body’s stream is disturbed or locked. return body != null && (body.stream.locked || util.isDisturbed(body.stream)) } - /** - * @see https://encoding.spec.whatwg.org/#utf-8-decode - * @param {Buffer} buffer - */ - function utf8DecodeBytes (buffer) { - if (buffer.length === 0) { - return '' - } - - // 1. Let buffer be the result of peeking three bytes from - // ioQueue, converted to a byte sequence. - - // 2. If buffer is 0xEF 0xBB 0xBF, then read three - // bytes from ioQueue. (Do nothing with those bytes.) - if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { - buffer = buffer.subarray(3); - } - - // 3. Process a queue with an instance of UTF-8’s - // decoder, ioQueue, output, and "replacement". - const output = textDecoder.decode(buffer); - - // 4. Return output. - return output - } - /** * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value * @param {Uint8Array} bytes @@ -7317,1615 +8796,1464 @@ function requireBody () { /** * @see https://fetch.spec.whatwg.org/#concept-body-mime-type - * @param {import('./response').Response|import('./request').Request} object + * @param {import('./response').Response|import('./request').Request} requestOrResponse */ - function bodyMimeType (object) { - const { headersList } = object[kState]; - const contentType = headersList.get('content-type'); + function bodyMimeType (requestOrResponse) { + // 1. Let headers be null. + // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list. + // 3. Otherwise, set headers to requestOrResponse’s response’s header list. + /** @type {import('./headers').HeadersList} */ + const headers = requestOrResponse[kState].headersList; - if (contentType === null) { - return 'failure' + // 4. Let mimeType be the result of extracting a MIME type from headers. + const mimeType = extractMimeType(headers); + + // 5. If mimeType is failure, then return null. + if (mimeType === 'failure') { + return null } - return parseMIMEType(contentType) + // 6. Return mimeType. + return mimeType } - body = { + body$1 = { extractBody, safelyExtractBody, cloneBody, - mixinBody + mixinBody, + streamRegistry, + hasFinalizationRegistry, + bodyUnusable }; - return body; + return body$1; } -var request$2; -var hasRequiredRequest$1; +var clientH1$1; +var hasRequiredClientH1$1; -function requireRequest$1 () { - if (hasRequiredRequest$1) return request$2; - hasRequiredRequest$1 = 1; +function requireClientH1$1 () { + if (hasRequiredClientH1$1) return clientH1$1; + hasRequiredClientH1$1 = 1; + + /* global WebAssembly */ + const assert = require$$0$7; + const util = requireUtil$h(); + const { channels } = requireDiagnostics$1(); + const timers = requireTimers$1(); const { - InvalidArgumentError, - NotSupportedError - } = requireErrors$1(); - const assert = require$$0$8; - const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = requireSymbols$4(); - const util = requireUtil$8(); + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError + } = requireErrors$2(); + const { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext + } = requireSymbols$9(); - // tokenRegExp and headerCharRegex have been lifted from - // https://github.com/nodejs/node/blob/main/lib/_http_common.js + const constants = requireConstants$f(); + const EMPTY_BUF = Buffer.alloc(0); + const FastBuffer = Buffer[Symbol.species]; + const addListener = util.addListener; + const removeAllListeners = util.removeAllListeners; - /** - * Verifies that the given val is a valid HTTP token - * per the rules defined in RFC 7230 - * See https://tools.ietf.org/html/rfc7230#section-3.2.6 - */ - const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; + let extractBody; - /** - * Matches if val contains an invalid field-vchar - * field-value = *( field-content / obs-fold ) - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - */ - const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + async function lazyllhttp () { + const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm$1() : undefined; - // Verifies that a given path is valid does not contain control chars \x00 to \x20 - const invalidPathRegex = /[^\u0021-\u00ff]/; + let mod; + try { + mod = await WebAssembly.compile(requireLlhttp_simdWasm$1()); + } catch (e) { + /* istanbul ignore next */ - const kHandler = Symbol('handler'); + // We could check if the error was caused by the simd option not + // being enabled, but the occurring of this other error + // * https://github.com/emscripten-core/emscripten/issues/11495 + // got me to remove that check to avoid breaking Node 12. + mod = await WebAssembly.compile(llhttpWasmData || requireLlhttpWasm$1()); + } - const channels = {}; + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ - let extractBody; + wasm_on_url: (p, at, len) => { + /* istanbul ignore next */ + return 0 + }, + wasm_on_status: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_begin: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageBegin() || 0 + }, + wasm_on_header_field: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_header_value: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert(currentParser.ptr === p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + }, + wasm_on_body: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_complete: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageComplete() || 0 + } - try { - const diagnosticsChannel = require('diagnostics_channel'); - channels.create = diagnosticsChannel.channel('undici:request:create'); - channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent'); - channels.headers = diagnosticsChannel.channel('undici:request:headers'); - channels.trailers = diagnosticsChannel.channel('undici:request:trailers'); - channels.error = diagnosticsChannel.channel('undici:request:error'); - } catch { - channels.create = { hasSubscribers: false }; - channels.bodySent = { hasSubscribers: false }; - channels.headers = { hasSubscribers: false }; - channels.trailers = { hasSubscribers: false }; - channels.error = { hasSubscribers: false }; + /* eslint-enable camelcase */ + } + }) } - class Request { - constructor (origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path !== 'string') { - throw new InvalidArgumentError('path must be a string') - } else if ( - path[0] !== '/' && - !(path.startsWith('http://') || path.startsWith('https://')) && - method !== 'CONNECT' - ) { - throw new InvalidArgumentError('path must be an absolute URL or start with a slash') - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError('invalid request path') - } + let llhttpInstance = null; + let llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); - if (typeof method !== 'string') { - throw new InvalidArgumentError('method must be a string') - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError('invalid request method') - } + let currentParser = null; + let currentBufferRef = null; + let currentBufferSize = 0; + let currentBufferPtr = null; - if (upgrade && typeof upgrade !== 'string') { - throw new InvalidArgumentError('upgrade must be a string') - } + const USE_NATIVE_TIMER = 0; + const USE_FAST_TIMER = 1; - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('invalid headersTimeout') - } + // Use fast timers for headers and body to take eventual event loop + // latency into account. + const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; + const TIMEOUT_BODY = 4 | USE_FAST_TIMER; - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('invalid bodyTimeout') - } + // Use native timers to ignore event loop latency for keep-alive + // handling. + const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; - if (reset != null && typeof reset !== 'boolean') { - throw new InvalidArgumentError('invalid reset') - } + class Parser { + constructor (client, socket, { exports: exports$1 }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - if (expectContinue != null && typeof expectContinue !== 'boolean') { - throw new InvalidArgumentError('invalid expectContinue') - } - - this.headersTimeout = headersTimeout; - - this.bodyTimeout = bodyTimeout; - - this.throwOnError = throwOnError === true; - - this.method = method; + this.llhttp = exports$1; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ''; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); - this.abort = null; + this.bytesRead = 0; - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; + this.keepAlive = ''; + this.contentLength = ''; + this.connection = ''; + this.maxResponseSize = client[kMaxResponseSize]; + } - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy () { - util.destroy(this); - }; - this.body.on('end', this.endHandler); + setTimeout (delay, type) { + // If the existing timer and the new timer are of different timer type + // (fast or native) or have different delay, we need to clear the existing + // timer and set a new one. + if ( + delay !== this.timeoutValue || + (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER) + ) { + // If a timeout is already set, clear it with clearTimeout of the fast + // timer implementation, as it can clear fast and native timers. + if (this.timeout) { + timers.clearTimeout(this.timeout); + this.timeout = null; } - this.errorHandler = err => { - if (this.abort) { - this.abort(err); + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); } else { - this.error = err; + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); + this.timeout.unref(); } - }; - this.body.on('error', this.errorHandler); - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === 'string') { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') - } - - this.completed = false; - - this.aborted = false; - - this.upgrade = upgrade || null; + } - this.path = query ? util.buildURL(path, query) : path; + this.timeoutValue = delay; + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } - this.origin = origin; + this.timeoutType = type; + } - this.idempotent = idempotent == null - ? method === 'HEAD' || method === 'GET' - : idempotent; + resume () { + if (this.socket.destroyed || !this.paused) { + return + } - this.blocking = blocking == null ? false : blocking; + assert(this.ptr != null); + assert(currentParser == null); - this.reset = reset == null ? null : reset; + this.llhttp.llhttp_resume(this.ptr); - this.host = null; + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } - this.contentLength = null; + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); // Flush parser. + this.readMore(); + } - this.contentType = null; + readMore () { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break + } + this.execute(chunk); + } + } - this.headers = ''; + execute (data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); - // Only for H2 - this.expectContinue = expectContinue != null ? expectContinue : false; + const { socket, llhttp } = this; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); } - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) { - throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') - } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + + // Call `execute` on the wasm parser. + // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, + // and finally the length of bytes to parse. + // The return value is an error code or `constants.ERROR.OK`. + try { + let ret; - if (!extractBody) { - extractBody = requireBody().extractBody; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + /* eslint-disable-next-line no-useless-catch */ + } catch (err) { + /* istanbul ignore next: difficult to make a test case for */ + throw err + } finally { + currentParser = null; + currentBufferRef = null; } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r\n`; + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ''; + /* istanbul ignore else: difficult to make a test case for */ + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')'; + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r\n`; + } catch (err) { + util.destroy(socket, err); } + } - util.validateHandler(handler, method, upgrade); + destroy () { + assert(this.ptr != null); + assert(currentParser == null); - this.servername = util.getServerName(this.host); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; - this[kHandler] = handler; + this.timeout && timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } + this.paused = false; } - onBodySent (chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk) - } catch (err) { - this.abort(err); - } - } + onStatus (buf) { + this.statusText = buf.toString(); } - onRequestSent () { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); + onMessageBegin () { + const { socket, client } = this; + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent() - } catch (err) { - this.abort(err); - } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1 } + request.onResponseStarted(); } - onConnect (abort) { - assert(!this.aborted); - assert(!this.completed); + onHeaderField (buf) { + const len = this.headers.length; - if (this.error) { - abort(this.error); + if ((len & 1) === 0) { + this.headers.push(buf); } else { - this.abort = abort; - return this[kHandler].onConnect(abort) + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } + + this.trackHeader(buf.length); } - onHeaders (statusCode, headers, resume, statusText) { - assert(!this.aborted); - assert(!this.completed); + onHeaderValue (buf) { + let len = this.headers.length; - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText) - } catch (err) { - this.abort(err); + const key = this.headers[len - 2]; + if (key.length === 10) { + const headerName = util.bufferToLowerCasedHeaderName(key); + if (headerName === 'keep-alive') { + this.keepAlive += buf.toString(); + } else if (headerName === 'connection') { + this.connection += buf.toString(); + } + } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') { + this.contentLength += buf.toString(); } - } - onData (chunk) { - assert(!this.aborted); - assert(!this.completed); + this.trackHeader(buf.length); + } - try { - return this[kHandler].onData(chunk) - } catch (err) { - this.abort(err); - return false + trackHeader (len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()); } } - onUpgrade (statusCode, headers, socket) { - assert(!this.aborted); - assert(!this.completed); + onUpgrade (head) { + const { upgrade, client, socket, headers, statusCode } = this; - return this[kHandler].onUpgrade(statusCode, headers, socket) - } + assert(upgrade); + assert(client[kSocket] === socket); + assert(!socket.destroyed); + assert(!this.paused); + assert((headers.length & 1) === 0); - onComplete (trailers) { - this.onFinally(); + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(request.upgrade || request.method === 'CONNECT'); - assert(!this.aborted); + this.statusCode = null; + this.statusText = ''; + this.shouldKeepAlive = null; - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } + this.headers = []; + this.headersSize = 0; + + socket.unshift(head); + + socket[kParser].destroy(); + socket[kParser] = null; + + socket[kClient] = null; + socket[kError] = null; + + removeAllListeners(socket); + + client[kSocket] = null; + client[kHTTPContext] = null; // TODO (fix): This is hacky... + client[kQueue][client[kRunningIdx]++] = null; + client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')); try { - return this[kHandler].onComplete(trailers) + request.onUpgrade(statusCode, headers, socket); } catch (err) { - // TODO (fix): This might be a bad idea? - this.onError(err); + util.destroy(socket, err); } + + client[kResume](); } - onError (error) { - this.onFinally(); + onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 } - if (this.aborted) { - return + const request = client[kQueue][client[kRunningIdx]]; + + /* istanbul ignore next: difficult to make a test case for */ + if (!request) { + return -1 } - this.aborted = true; - return this[kHandler].onError(error) - } + assert(!this.upgrade); + assert(this.statusCode < 200); - onFinally () { - if (this.errorHandler) { - this.body.off('error', this.errorHandler); - this.errorHandler = null; + if (statusCode === 100) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))); + return -1 } - if (this.endHandler) { - this.body.off('end', this.endHandler); - this.endHandler = null; + /* this can only happen if server is misbehaving */ + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))); + return -1 } - } - - // TODO: adjust to support H2 - addHeader (key, value) { - processHeader(this, key, value); - return this - } - static [kHTTP1BuildRequest] (origin, opts, handler) { - // TODO: Migrate header parsing here, to make Requests - // HTTP agnostic - return new Request(origin, opts, handler) - } - - static [kHTTP2BuildRequest] (origin, opts, handler) { - const headers = opts.headers; - opts = { ...opts, headers: null }; - - const request = new Request(origin, opts, handler); + assert(this.timeoutType === TIMEOUT_HEADERS); - request.headers = {}; + this.statusCode = statusCode; + this.shouldKeepAlive = ( + shouldKeepAlive || + // Override llhttp value which does not allow keepAlive for HEAD. + (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') + ); - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true); - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(request, key, headers[key], true); + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null + ? request.bodyTimeout + : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') } - return request - } + if (request.method === 'CONNECT') { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2 + } - static [kHTTP2CopyHeaders] (raw) { - const rawHeaders = raw.split('\r\n'); - const headers = {}; + if (upgrade) { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2 + } - for (const header of rawHeaders) { - const [key, value] = header.split(': '); + assert((this.headers.length & 1) === 0); + this.headers = []; + this.headersSize = 0; - if (value == null || value.length === 0) continue + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - if (headers[key]) headers[key] += `,${value}`; - else headers[key] = value; + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + } + } else { + // Stop more requests from being dispatched. + socket[kReset] = true; } - return headers - } - } + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - function processHeaderValue (key, val, skipAppend) { - if (val && typeof val === 'object') { - throw new InvalidArgumentError(`invalid ${key} header`) - } + if (request.aborted) { + return -1 + } - val = val != null ? `${val}` : ''; + if (request.method === 'HEAD') { + return 1 + } - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } + if (statusCode < 200) { + return 1 + } - return skipAppend ? val : `${key}: ${val}\r\n` - } + if (socket[kBlocking]) { + socket[kBlocking] = false; + client[kResume](); + } - function processHeader (request, key, val, skipAppend = false) { - if (val && (typeof val === 'object' && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`) - } else if (val === undefined) { - return + return pause ? constants.ERROR.PAUSED : 0 } - if ( - request.host === null && - key.length === 4 && - key.toLowerCase() === 'host' - ) { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - // Consumed by Client - request.host = val; - } else if ( - request.contentLength === null && - key.length === 14 && - key.toLowerCase() === 'content-length' - ) { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError('invalid content-length header') - } - } else if ( - request.contentType === null && - key.length === 12 && - key.toLowerCase() === 'content-type' - ) { - request.contentType = val; - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend); - else request.headers += processHeaderValue(key, val); - } else if ( - key.length === 17 && - key.toLowerCase() === 'transfer-encoding' - ) { - throw new InvalidArgumentError('invalid transfer-encoding header') - } else if ( - key.length === 10 && - key.toLowerCase() === 'connection' - ) { - const value = typeof val === 'string' ? val.toLowerCase() : null; - if (value !== 'close' && value !== 'keep-alive') { - throw new InvalidArgumentError('invalid connection header') - } else if (value === 'close') { - request.reset = true; + onBody (buf) { + const { client, socket, statusCode, maxResponseSize } = this; + + if (socket.destroyed) { + return -1 } - } else if ( - key.length === 10 && - key.toLowerCase() === 'keep-alive' - ) { - throw new InvalidArgumentError('invalid keep-alive header') - } else if ( - key.length === 7 && - key.toLowerCase() === 'upgrade' - ) { - throw new InvalidArgumentError('invalid upgrade header') - } else if ( - key.length === 6 && - key.toLowerCase() === 'expect' - ) { - throw new NotSupportedError('expect header not supported') - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError('invalid header key') - } else { - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - else request.headers[key] = processHeaderValue(key, val[i], skipAppend); - } else { - request.headers += processHeaderValue(key, val[i]); - } + + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); } - } else { - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend); - else request.headers += processHeaderValue(key, val); } - } - } - - request$2 = Request; - return request$2; -} -var dispatcher; -var hasRequiredDispatcher; + assert(statusCode >= 200); -function requireDispatcher () { - if (hasRequiredDispatcher) return dispatcher; - hasRequiredDispatcher = 1; + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()); + return -1 + } - const EventEmitter = require$$0$7; + this.bytesRead += buf.length; - class Dispatcher extends EventEmitter { - dispatch () { - throw new Error('not implemented') + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED + } } - close () { - throw new Error('not implemented') - } + onMessageComplete () { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; - destroy () { - throw new Error('not implemented') - } - } + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1 + } - dispatcher = Dispatcher; - return dispatcher; -} + if (upgrade) { + return + } -var dispatcherBase; -var hasRequiredDispatcherBase; + assert(statusCode >= 100); + assert((this.headers.length & 1) === 0); -function requireDispatcherBase () { - if (hasRequiredDispatcherBase) return dispatcherBase; - hasRequiredDispatcherBase = 1; + const request = client[kQueue][client[kRunningIdx]]; + assert(request); - const Dispatcher = requireDispatcher(); - const { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = requireErrors$1(); - const { kDestroy, kClose, kDispatch, kInterceptors } = requireSymbols$4(); + this.statusCode = null; + this.statusText = ''; + this.bytesRead = 0; + this.contentLength = ''; + this.keepAlive = ''; + this.connection = ''; - const kDestroyed = Symbol('destroyed'); - const kClosed = Symbol('closed'); - const kOnDestroyed = Symbol('onDestroyed'); - const kOnClosed = Symbol('onClosed'); - const kInterceptedDispatch = Symbol('Intercepted Dispatch'); + this.headers = []; + this.headersSize = 0; - class DispatcherBase extends Dispatcher { - constructor () { - super(); + if (statusCode < 200) { + return + } - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()); + return -1 + } - get destroyed () { - return this[kDestroyed] - } + request.onComplete(headers); - get closed () { - return this[kClosed] - } + client[kQueue][client[kRunningIdx]++] = null; - get interceptors () { - return this[kInterceptors] + if (socket[kWriting]) { + assert(client[kRunning] === 0); + // Response completed before request. + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (socket[kReset] && client[kRunning] === 0) { + // Destroy socket once all requests have completed. + // The request at the tail of the pipeline is the one + // that requested reset and no further requests should + // have been queued since then. + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + // We must wait a full event loop cycle to reuse this socket to make sure + // that non-spec compliant servers are not closing the connection even if they + // said they won't. + setImmediate(() => client[kResume]()); + } else { + client[kResume](); + } } + } - set interceptors (newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== 'function') { - throw new InvalidArgumentError('interceptor must be an function') - } - } + function onParserTimeout (parser) { + const { socket, timeoutType, client, paused } = parser.deref(); + + /* istanbul ignore else */ + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!paused, 'cannot be paused while waiting for headers'); + util.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!paused) { + util.destroy(socket, new BodyTimeoutError()); } + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util.destroy(socket, new InformationalError('socket idle timeout')); + } + } - this[kInterceptors] = newInterceptors; + async function connectH1 (client, socket) { + client[kSocket] = socket; + + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; } - close (callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data) - }); - }) + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); + + addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + + const parser = this[kParser]; + + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so for as a valid response. + parser.onMessageComplete(); + return } - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') + this[kError] = err; + + this[kClient][kOnError](err); + }); + addListener(socket, 'readable', function () { + const parser = this[kParser]; + + if (parser) { + parser.readMore(); } + }); + addListener(socket, 'end', function () { + const parser = this[kParser]; - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); + if (parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete(); return } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); + }); + addListener(socket, 'close', function () { + const client = this[kClient]; + const parser = this[kParser]; + + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete(); } - return + + this[kParser].destroy(); + this[kParser] = null; } - this[kClosed] = true; - this[kOnClosed].push(callback); + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; + client[kSocket] = null; + client[kHTTPContext] = null; // TODO (fix): This is hacky... - // Should not error. - this[kClose]() - .then(() => this.destroy()) - .then(() => { - queueMicrotask(onClosed); - }); - } + if (client.destroyed) { + assert(client[kPending] === 0); - destroy (err, callback) { - if (typeof err === 'function') { - callback = err; - err = null; - } + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err, data) => { - return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) - }); - }) + util.errorRequest(client, request, err); } - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } + client[kPendingIdx] = client[kRunningIdx]; - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return - } + assert(client[kRunning] === 0); - if (!err) { - err = new ClientDestroyedError(); - } + client.emit('disconnect', client[kUrl], [client], err); - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); + client[kResume](); + }); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); + let closed = false; + socket.on('close', () => { + closed = true; + }); + + return { + version: 'h1', + defaultPipelining: 1, + write (...args) { + return writeH1(client, ...args) + }, + resume () { + resumeH1(client); + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on('close', callback); + } + }, + get destroyed () { + return socket.destroyed + }, + busy (request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true } - }; - // Should not error. - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + // Non-idempotent request cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } - [kInterceptedDispatch] (opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler) - } + if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { + // Don't dispatch an upgrade until all preceding requests have completed. + // A misbehaving server might upgrade the connection before all pipelined + // request has completed. + return true + } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); - } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler) - } + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && + (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { + // Request with stream or iterator body can error while other requests + // are inflight and indirectly error those as well. + // Ensure this doesn't happen by waiting for inflight + // to complete before dispatching. - dispatch (opts, handler) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') + // Request with stream or iterator body cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } + } + + return false } + } + } - try { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object.') - } + function resumeH1 (client) { + const socket = client[kSocket]; - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError() + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } - if (this[kClosed]) { - throw new ClientClosedError() + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); } - - return this[kInterceptedDispatch](opts, handler) - } catch (err) { - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request.headersTimeout != null + ? request.headersTimeout + : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); } - - handler.onError(err); - - return false } } } - dispatcherBase = DispatcherBase; - return dispatcherBase; -} - -var connect; -var hasRequiredConnect; + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 + function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' + } -function requireConnect () { - if (hasRequiredConnect) return connect; - hasRequiredConnect = 1; + function writeH1 (client, request) { + const { method, path, host, upgrade, blocking, reset } = request; - const net = require$$0$9; - const assert = require$$0$8; - const util = requireUtil$8(); - const { InvalidArgumentError, ConnectTimeoutError } = requireErrors$1(); + let { body, headers, contentLength } = request; - let tls; // include tls conditionally since it is not always available + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - // TODO: session re-use does not wait for the first - // connection to resolve the session and might therefore - // resolve the same servername multiple times even when - // re-use is enabled. + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. - let SessionCache; - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (commonjsGlobal.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map(); - this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return - } + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' || + method === 'QUERY' || + method === 'PROPFIND' || + method === 'PROPPATCH' + ); - const ref = this._sessionCache.get(key); - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key); - } - }); + if (util.isFormDataLike(body)) { + if (!extractBody) { + extractBody = requireBody$1().extractBody; } - get (sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null + const [bodyStream, contentType] = extractBody(body); + if (request.contentType == null) { + headers.push('content-type', contentType); } + body = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && request.contentType == null && body.type) { + headers.push('content-type', body.type); + } - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0); + } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map(); - } + const bodyLength = util.bodyLength(body); - get (sessionKey) { - return this._sessionCache.get(sessionKey) + contentLength = bodyLength ?? contentLength; + + if (contentLength === null) { + contentLength = request.contentLength; + } + + if (contentLength === 0 && !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null; + } + + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false } - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } + process.emitWarning(new RequestContentLengthMismatchError()); + } - if (this._sessionCache.size >= this._maxCachedSessions) { - // remove the oldest session - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } + const socket = client[kSocket]; - this._sessionCache.set(sessionKey, session); + const abort = (err) => { + if (request.aborted || request.completed) { + return } + + util.errorRequest(client, request, err || new RequestAbortedError()); + + util.destroy(body); + util.destroy(socket, new InformationalError('aborted')); }; - } - function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + try { + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 10e3 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === 'https:') { - if (!tls) { - tls = require$$1$3; - } - servername = servername || options.servername || util.getServerName(host) || null; - - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; + if (request.aborted) { + return false + } - assert(sessionKey); + if (method === 'HEAD') { + // https://github.com/mcollina/undici/issues/258 + // Close after a HEAD request to interop with misbehaving servers + // that may send a body in the response. - socket = tls.connect({ - highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], - socket: httpSocket, // upgrade socket connection - port: port || 443, - host: hostname - }); + socket[kReset] = true; + } - socket - .on('session', function (session) { - // TODO (fix): Can a session become invalid once established? Don't think so? - sessionCache.set(sessionKey, session); - }); - } else { - assert(!httpSocket, 'httpSocket can only be sent on TLS update'); - socket = net.connect({ - highWaterMark: 64 * 1024, // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }); - } + if (upgrade || method === 'CONNECT') { + // On CONNECT or upgrade, block pipeline from dispatching further + // requests on this connection. - // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } + socket[kReset] = true; + } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); + if (reset != null) { + socket[kReset] = reset; + } - socket - .setNoDelay(true) - .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { - cancelTimeout(); + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }) - .on('error', function (err) { - cancelTimeout(); + if (blocking) { + socket[kBlocking] = true; + } - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); + let header = `${method} ${path} HTTP/1.1\r\n`; - return socket + if (typeof host === 'string') { + header += `host: ${host}\r\n`; + } else { + header += client[kHostHeader]; } - } - function setupTimeout (onConnectTimeout, timeout) { - if (!timeout) { - return () => {} + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; + } else if (client[kPipelining] && !socket[kReset]) { + header += 'connection: keep-alive\r\n'; + } else { + header += 'connection: close\r\n'; } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - // setImmediate is added to make sure that we priotorise socket error events over timeouts - s1 = setImmediate(() => { - if (process.platform === 'win32') { - // Windows needs an extra setImmediate probably due to implementation differences in the socket logic - s2 = setImmediate(() => onConnectTimeout()); + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0]; + const val = headers[n + 1]; + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r\n`; + } } else { - onConnectTimeout(); + header += `${key}: ${val}\r\n`; } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); + } + } + + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + + /* istanbul ignore else: assertion */ + if (!body || bodyLength === 0) { + writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBuffer(body)) { + writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload); + } else { + writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload); + } + } else if (util.isStream(body)) { + writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isIterable(body)) { + writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else { + assert(false); } - } - function onConnectTimeout (socket) { - util.destroy(socket, new ConnectTimeoutError()); + return true } - connect = buildConnector; - return connect; -} + function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); -var constants$9 = {}; + let finished = false; -var utils$6 = {}; + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); -var hasRequiredUtils$6; + const onData = function (chunk) { + if (finished) { + return + } -function requireUtils$6 () { - if (hasRequiredUtils$6) return utils$6; - hasRequiredUtils$6 = 1; - Object.defineProperty(utils$6, "__esModule", { value: true }); - utils$6.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === 'number') { - res[key] = value; - } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util.destroy(this, err); + } + }; + const onDrain = function () { + if (finished) { + return + } + + if (body.resume) { + body.resume(); + } + }; + const onClose = function () { + // 'close' might be emitted *before* 'error' for + // broken streams. Wait a tick to avoid this case. + queueMicrotask(() => { + // It's only safe to remove 'error' listener after + // 'close'. + body.removeListener('error', onFinished); }); - return res; - } - utils$6.enumToMap = enumToMap; - - return utils$6; -} -var hasRequiredConstants$9; + if (!finished) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + } + }; + const onFinished = function (err) { + if (finished) { + return + } -function requireConstants$9 () { - if (hasRequiredConstants$9) return constants$9; - hasRequiredConstants$9 = 1; - (function (exports$1) { - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; - const utils_1 = requireUtils$6(); - (function (ERROR) { - ERROR[ERROR["OK"] = 0] = "OK"; - ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; - ERROR[ERROR["STRICT"] = 2] = "STRICT"; - ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; - ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR[ERROR["USER"] = 24] = "USER"; - })(exports$1.ERROR || (exports$1.ERROR = {})); - (function (TYPE) { - TYPE[TYPE["BOTH"] = 0] = "BOTH"; - TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; - TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; - })(exports$1.TYPE || (exports$1.TYPE = {})); - (function (FLAGS) { - FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; - FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; - FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; - // 1 << 8 is unused - FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(exports$1.FLAGS || (exports$1.FLAGS = {})); - (function (LENIENT_FLAGS) { - LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); - var METHODS; - (function (METHODS) { - METHODS[METHODS["DELETE"] = 0] = "DELETE"; - METHODS[METHODS["GET"] = 1] = "GET"; - METHODS[METHODS["HEAD"] = 2] = "HEAD"; - METHODS[METHODS["POST"] = 3] = "POST"; - METHODS[METHODS["PUT"] = 4] = "PUT"; - /* pathological */ - METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; - METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; - METHODS[METHODS["TRACE"] = 7] = "TRACE"; - /* WebDAV */ - METHODS[METHODS["COPY"] = 8] = "COPY"; - METHODS[METHODS["LOCK"] = 9] = "LOCK"; - METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; - METHODS[METHODS["MOVE"] = 11] = "MOVE"; - METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; - METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; - METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; - METHODS[METHODS["BIND"] = 16] = "BIND"; - METHODS[METHODS["REBIND"] = 17] = "REBIND"; - METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; - METHODS[METHODS["ACL"] = 19] = "ACL"; - /* subversion */ - METHODS[METHODS["REPORT"] = 20] = "REPORT"; - METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS[METHODS["MERGE"] = 23] = "MERGE"; - /* upnp */ - METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; - METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - /* RFC-5789 */ - METHODS[METHODS["PATCH"] = 28] = "PATCH"; - METHODS[METHODS["PURGE"] = 29] = "PURGE"; - /* CalDAV */ - METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; - /* RFC-2068, section 19.6.1.2 */ - METHODS[METHODS["LINK"] = 31] = "LINK"; - METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; - /* icecast */ - METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; - /* RFC-7540, section 11.6 */ - METHODS[METHODS["PRI"] = 34] = "PRI"; - /* RFC-2326 RTSP */ - METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS[METHODS["SETUP"] = 37] = "SETUP"; - METHODS[METHODS["PLAY"] = 38] = "PLAY"; - METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; - METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; - METHODS[METHODS["RECORD"] = 44] = "RECORD"; - /* RAOP */ - METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); - exports$1.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS['M-SEARCH'], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE, - ]; - exports$1.METHODS_ICE = [ - METHODS.SOURCE, - ]; - exports$1.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST, - ]; - exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); - exports$1.H_METHOD_MAP = {}; - Object.keys(exports$1.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; - } - }); - (function (FINISH) { - FINISH[FINISH["SAFE"] = 0] = "SAFE"; - FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; - })(exports$1.FINISH || (exports$1.FINISH = {})); - exports$1.ALPHA = []; - for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { - // Upper case - exports$1.ALPHA.push(String.fromCharCode(i)); - // Lower case - exports$1.ALPHA.push(String.fromCharCode(i + 0x20)); - } - exports$1.NUM_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, - }; - exports$1.HEX_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, - A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, - a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, - }; - exports$1.NUM = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - ]; - exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); - exports$1.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; - exports$1.USERINFO_CHARS = exports$1.ALPHANUM - .concat(exports$1.MARK) - .concat(['%', ';', ':', '&', '=', '+', '$', ',']); - // TODO(indutny): use RFC - exports$1.STRICT_URL_CHAR = [ - '!', '"', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - ':', ';', '<', '=', '>', - '@', '[', '\\', ']', '^', '_', - '`', - '{', '|', '}', '~', - ].concat(exports$1.ALPHANUM); - exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR - .concat(['\t', '\f']); - // All characters with 0x80 bit set to 1 - for (let i = 0x80; i <= 0xff; i++) { - exports$1.URL_CHAR.push(i); - } - exports$1.HEX = exports$1.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); - /* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ - exports$1.STRICT_TOKEN = [ - '!', '#', '$', '%', '&', '\'', - '*', '+', '-', '.', - '^', '_', '`', - '|', '~', - ].concat(exports$1.ALPHANUM); - exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([' ']); - /* - * Verify that a char is a valid visible (printable) US-ASCII - * character or %x80-FF - */ - exports$1.HEADER_CHARS = ['\t']; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports$1.HEADER_CHARS.push(i); - } - } - // ',' = \x44 - exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); - exports$1.MAJOR = exports$1.NUM_MAP; - exports$1.MINOR = exports$1.MAJOR; - var HEADER_STATE; - (function (HEADER_STATE) { - HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); - exports$1.SPECIAL_HEADERS = { - 'connection': HEADER_STATE.CONNECTION, - 'content-length': HEADER_STATE.CONTENT_LENGTH, - 'proxy-connection': HEADER_STATE.CONNECTION, - 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, - 'upgrade': HEADER_STATE.UPGRADE, - }; - - } (constants$9)); - return constants$9; -} + finished = true; -var RedirectHandler_1; -var hasRequiredRedirectHandler; + assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)); -function requireRedirectHandler () { - if (hasRequiredRedirectHandler) return RedirectHandler_1; - hasRequiredRedirectHandler = 1; + socket + .off('drain', onDrain) + .off('error', onFinished); - const util = requireUtil$8(); - const { kBodyUsed } = requireSymbols$4(); - const assert = require$$0$8; - const { InvalidArgumentError } = requireErrors$1(); - const EE = require$$0$7; + body + .removeListener('data', onData) + .removeListener('end', onFinished) + .removeListener('close', onClose); - const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } - const kBody = Symbol('body'); + writer.destroy(err); - class BodyAsyncIterable { - constructor (body) { - this[kBody] = body; - this[kBodyUsed] = false; - } + if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; - async * [Symbol.asyncIterator] () { - assert(!this[kBodyUsed], 'disturbed'); - this[kBodyUsed] = true; - yield * this[kBody]; + body + .on('data', onData) + .on('end', onFinished) + .on('error', onFinished) + .on('close', onClose); + + if (body.resume) { + body.resume(); } - } - class RedirectHandler { - constructor (dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } + socket + .on('drain', onDrain) + .on('error', onFinished); - util.validateHandler(handler, opts.method, opts.upgrade); + if (body.errorEmitted ?? body.errored) { + setImmediate(() => onFinished(body.errored)); + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(() => onFinished(null)); + } - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose); + } + } - if (util.isStream(this.opts.body)) { - // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp - // so that it can be dispatched again? - // TODO (fix): Do we need 100-expect support to provide a way to do this properly? - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body - .on('data', function () { - assert(false); - }); + function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); + } else { + assert(contentLength === null, 'no body must not have content length'); + socket.write(`${header}\r\n`, 'latin1'); } + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length'); - if (typeof this.opts.body.readableDidRead !== 'boolean') { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, 'data', function () { - this[kBodyUsed] = true; - }); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; } - } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { - // TODO (fix): We can't access ReadableStream internal state - // to determine whether or not it has been disturbed. This is just - // a workaround. - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if ( - this.opts.body && - typeof this.opts.body !== 'string' && - !ArrayBuffer.isView(this.opts.body) && - util.isIterable(this.opts.body) - ) { - // TODO: Should we allow re-using iterable if !this.opts.idempotent - // or through some other flag? - this.opts.body = new BodyAsyncIterable(this.opts.body); } - } - - onConnect (abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); - } - - onUpgrade (statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); - } + request.onRequestSent(); - onError (error) { - this.handler.onError(error); + client[kResume](); + } catch (err) { + abort(err); } + } - onHeaders (statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) - ? null - : parseLocation(statusCode, headers); + async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length'); - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText) - } + const buffer = Buffer.from(await body.arrayBuffer()); - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + socket.write(buffer); + socket.uncork(); - // Remove headers referring to the original URL. - // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. - // https://tools.ietf.org/html/rfc7231#section-6.4 - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; + request.onBodySent(buffer); + request.onRequestSent(); - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - // In case of HTTP 303, always replace method to be either HEAD or GET - if (statusCode === 303 && this.opts.method !== 'HEAD') { - this.opts.method = 'GET'; - this.opts.body = null; + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; } + + client[kResume](); + } catch (err) { + abort(err); } + } - onData (chunk) { - if (this.location) ; else { - return this.handler.onData(chunk) + async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); + + let callback = null; + function onDrain () { + if (callback) { + const cb = callback; + callback = null; + cb(); } } - onComplete (trailers) { - if (this.location) { - /* - https://tools.ietf.org/html/rfc7231#section-6.4 + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); - TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections - and neither are useful if present. + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); - See comment on onData method above for more detailed informations. - */ + socket + .on('close', onDrain) + .on('drain', onDrain); - this.location = null; - this.abort = null; + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); + if (!writer.write(chunk)) { + await waitForDrain(); + } } - } - onBodySent (chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket + .off('close', onDrain) + .off('drain', onDrain); } } - function parseLocation (statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null + class AsyncWriter { + constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + + socket[kWriting] = true; } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toString().toLowerCase() === 'location') { - return headers[i + 1] + write (chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + + if (socket[kError]) { + throw socket[kError] } - } - } - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - function shouldRemoveHeader (header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === 'host' - } - if (removeContent && util.headerNameToString(header).startsWith('content-')) { - return true - } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util.headerNameToString(header); - return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' - } - return false - } + if (socket.destroyed) { + return false + } - // https://tools.ietf.org/html/rfc7231#section-6.4 - function cleanRequestHeaders (headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); + const len = Buffer.byteLength(chunk); + if (!len) { + return true + } + + // We should defer writing chunks. + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } + + process.emitWarning(new RequestContentLengthMismatchError()); + } + + socket.cork(); + + if (bytesWritten === 0) { + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1'); + } else { + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); } } - } else if (headers && typeof headers === 'object') { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); + + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1'); + } + + this.bytesWritten += len; + + const ret = socket.write(chunk); + + socket.uncork(); + + request.onBodySent(chunk); + + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } } } - } else { - assert(headers == null, 'headers must be an object or an array'); + + return ret } - return ret - } - RedirectHandler_1 = RedirectHandler; - return RedirectHandler_1; -} + end () { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); -var redirectInterceptor; -var hasRequiredRedirectInterceptor; + socket[kWriting] = false; -function requireRedirectInterceptor () { - if (hasRequiredRedirectInterceptor) return redirectInterceptor; - hasRequiredRedirectInterceptor = 1; + if (socket[kError]) { + throw socket[kError] + } - const RedirectHandler = requireRedirectHandler(); + if (socket.destroyed) { + return + } - function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept (opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; + if (bytesWritten === 0) { + if (expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD send a Content-Length in a request message when + // no Transfer-Encoding is sent and the request method defines a meaning + // for an enclosed payload body. - if (!maxRedirections) { - return dispatch(opts, handler) + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); + } else { + socket.write(`${header}\r\n`, 'latin1'); } + } else if (contentLength === null) { + socket.write('\r\n0\r\n\r\n', 'latin1'); + } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting. - return dispatch(opts, redirectHandler) + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } } - } - } - redirectInterceptor = createRedirectInterceptor; - return redirectInterceptor; -} + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } -var llhttpWasm; -var hasRequiredLlhttpWasm; + client[kResume](); + } -function requireLlhttpWasm () { - if (hasRequiredLlhttpWasm) return llhttpWasm; - hasRequiredLlhttpWasm = 1; - llhttpWasm = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8='; - return llhttpWasm; -} + destroy (err) { + const { socket, client, abort } = this; -var llhttp_simdWasm; -var hasRequiredLlhttp_simdWasm; + socket[kWriting] = false; -function requireLlhttp_simdWasm () { - if (hasRequiredLlhttp_simdWasm) return llhttp_simdWasm; - hasRequiredLlhttp_simdWasm = 1; - llhttp_simdWasm = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=='; - return llhttp_simdWasm; -} + if (err) { + assert(client[kRunning] <= 1, 'pipeline should only contain this request'); + abort(err); + } + } + } -var client; -var hasRequiredClient; + clientH1$1 = connectH1; + return clientH1$1; +} -function requireClient () { - if (hasRequiredClient) return client; - hasRequiredClient = 1; +var clientH2$1; +var hasRequiredClientH2$1; - /* global WebAssembly */ +function requireClientH2$1 () { + if (hasRequiredClientH2$1) return clientH2$1; + hasRequiredClientH2$1 = 1; - const assert = require$$0$8; - const net = require$$0$9; - const http = require$$0$5; - const { pipeline } = require$$0$a; - const util = requireUtil$8(); - const timers = requireTimers(); - const Request = requireRequest$1(); - const DispatcherBase = requireDispatcherBase(); + const assert = require$$0$7; + const { pipeline } = require$$0$8; + const util = requireUtil$h(); const { RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = requireErrors$1(); - const buildConnector = requireConnect(); + InformationalError + } = requireErrors$2(); const { kUrl, kReset, - kServerName, kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, kRunning, kPending, - kSize, - kWriting, kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, kPendingIdx, kRunningIdx, kError, - kPipelining, kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, + kOnError, + kMaxConcurrentStreams, kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = requireSymbols$4(); + kResume, + kSize, + kHTTPContext + } = requireSymbols$9(); + + const kOpenStreams = Symbol('open streams'); + + let extractBody; + + // Experimental + let h2ExperimentalWarned = false; /** @type {import('http2')} */ let http2; try { - http2 = require('http2'); + http2 = require('node:http2'); } catch { // @ts-ignore http2 = { constants: {} }; @@ -8943,1069 +10271,1344 @@ function requireClient () { } } = http2; - // Experimental - let h2ExperimentalWarned = false; + function parseH2Headers (headers) { + const result = []; - const FastBuffer = Buffer[Symbol.species]; + for (const [name, value] of Object.entries(headers)) { + // h2 may concat the header value by array + // e.g. Set-Cookie + if (Array.isArray(value)) { + for (const subvalue of value) { + // we need to provide each header value of header name + // because the headers handler expect name-value pair + result.push(Buffer.from(name), Buffer.from(subvalue)); + } + } else { + result.push(Buffer.from(name), Buffer.from(value)); + } + } - const kClosedResolve = Symbol('kClosedResolve'); + return result + } - const channels = {}; + async function connectH2 (client, socket) { + client[kSocket] = socket; - try { - const diagnosticsChannel = require('diagnostics_channel'); - channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders'); - channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect'); - channels.connectError = diagnosticsChannel.channel('undici:client:connectError'); - channels.connected = diagnosticsChannel.channel('undici:client:connected'); - } catch { - channels.sendHeaders = { hasSubscribers: false }; - channels.beforeConnect = { hasSubscribers: false }; - channels.connectError = { hasSubscribers: false }; - channels.connected = { hasSubscribers: false }; - } + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning('H2 support is experimental, expect them to change at any time.', { + code: 'UNDICI-H2' + }); + } - /** - * @type {import('../types/client').default} - */ - class Client extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor (url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super(); + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + }); - if (keepAlive !== undefined) { - throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') - } + session[kOpenStreams] = 0; + session[kClient] = client; + session[kSocket] = socket; - if (socketTimeout !== undefined) { - throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') - } + util.addListener(session, 'error', onHttp2SessionError); + util.addListener(session, 'frameError', onHttp2FrameError); + util.addListener(session, 'end', onHttp2SessionEnd); + util.addListener(session, 'goaway', onHTTP2GoAway); + util.addListener(session, 'close', function () { + const { [kClient]: client } = this; + const { [kSocket]: socket } = client; - if (requestTimeout !== undefined) { - throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') - } + const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)); - if (idleTimeout !== undefined) { - throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') - } + client[kHTTP2Session] = null; - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') - } + if (client.destroyed) { + assert(client[kPending] === 0); - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError('invalid maxHeaderSize') + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } } + }); - if (socketPath != null && typeof socketPath !== 'string') { - throw new InvalidArgumentError('invalid socketPath') - } + session.unref(); - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError('invalid connectTimeout') - } + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveTimeout') - } + util.addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveMaxTimeout') - } + this[kError] = err; - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') - } + this[kClient][kOnError](err); + }); - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') - } + util.addListener(socket, 'end', function () { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); + }); - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') - } + util.addListener(socket, 'close', function () { + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + client[kSocket] = null; - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') - } + client[kPendingIdx] = client[kRunningIdx]; - if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError('localAddress must be valid string IP address') - } + assert(client[kRunning] === 0); - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError('maxResponseSize must be a positive number') - } + client.emit('disconnect', client[kUrl], [client], err); - if ( - autoSelectFamilyAttemptTimeout != null && - (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) - ) { - throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') - } + client[kResume](); + }); - // h2 - if (allowH2 != null && typeof allowH2 !== 'boolean') { - throw new InvalidArgumentError('allowH2 must be a valid boolean value') - } + let closed = false; + socket.on('close', () => { + closed = true; + }); - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0') + return { + version: 'h2', + defaultPipelining: Infinity, + write (...args) { + return writeH2(client, ...args) + }, + resume () { + resumeH2(client); + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + // Destroying the socket will trigger the session close + socket.destroy(err).on('close', callback); + } + }, + get destroyed () { + return socket.destroyed + }, + busy () { + return false } + } + } - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }); - } + function resumeH2 (client) { + const socket = client[kSocket]; - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) - ? interceptors.Client - : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming - this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = 'h1'; + if (socket?.destroyed === false) { + if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + socket.unref(); + client[kHTTP2Session].unref(); + } else { + socket.ref(); + client[kHTTP2Session].ref(); + } + } + } - // HTTP/2 - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 - ? null - : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, // Keep track of them to decide wether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server - }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}`; + function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); - // kQueue is built up of 3 sections separated by - // the kRunningIdx and kPendingIdx indices. - // | complete | running | pending | - // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length - // kRunningIdx points to the first running element. - // kPendingIdx points to the first pending element. - // This implements a fast queue with an amortized - // time of O(1). + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; + function onHttp2FrameError (type, code, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); } + } - get pipelining () { - return this[kPipelining] - } + function onHttp2SessionEnd () { + const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket])); + this.destroy(err); + util.destroy(this[kSocket], err); + } - set pipelining (value) { - this[kPipelining] = value; - resume(this, true); - } + /** + * This is the root cause of #3011 + * We need to handle GOAWAY frames properly, and trigger the session close + * along with the socket right away + */ + function onHTTP2GoAway (code) { + // We cannot recover, so best to close the session and the socket + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)); + const client = this[kClient]; - get [kPending] () { - return this[kQueue].length - this[kPendingIdx] - } + client[kSocket] = null; + client[kHTTPContext] = null; - get [kRunning] () { - return this[kPendingIdx] - this[kRunningIdx] + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + this[kHTTP2Session] = null; } - get [kSize] () { - return this[kQueue].length - this[kRunningIdx] - } + util.destroy(this[kSocket], err); - get [kConnected] () { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed + // Fail head of pipeline. + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util.errorRequest(client, request, err); + client[kPendingIdx] = client[kRunningIdx]; } - get [kBusy] () { - const socket = this[kSocket]; - return ( - (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || - (this[kSize] >= (this[kPipelining] || 1)) || - this[kPending] > 0 - ) - } + assert(client[kRunning] === 0); - /* istanbul ignore: only used for test */ - [kConnect] (cb) { - connect(this); - this.once('connect', cb); - } + client.emit('disconnect', client[kUrl], [client], err); - [kDispatch] (opts, handler) { - const origin = opts.origin || this[kUrl].origin; + client[kResume](); + } - const request = this[kHTTPConnVersion] === 'h2' - ? Request[kHTTP2BuildRequest](origin, opts, handler) - : Request[kHTTP1BuildRequest](origin, opts, handler); + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 + function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' + } - this[kQueue].push(request); - if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - // Wait a tick in case stream/iterator is ended in the same tick. - this[kResuming] = 1; - process.nextTick(resume, this); + function writeH2 (client, request) { + const session = client[kHTTP2Session]; + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + let { body } = request; + + if (upgrade) { + util.errorRequest(client, request, new Error('Upgrade not supported for H2')); + return false + } + + const headers = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `,${val[i]}`; + } else { + headers[key] = val[i]; + } + } } else { - resume(this, true); + headers[key] = val; } + } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; + /** @type {import('node:http2').ClientHttp2Stream} */ + let stream; + + const { hostname, port } = client[kUrl]; + + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`; + headers[HTTP2_HEADER_METHOD] = method; + + const abort = (err) => { + if (request.aborted || request.completed) { + return } - return this[kNeedDrain] < 2 - } + err = err || new RequestAbortedError(); - async [kClose] () { - // TODO: for H2 we need to gracefully flush the remaining enqueued - // request and close each stream. - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null); - } else { - this[kClosedResolve] = resolve; - } - }) + util.errorRequest(client, request, err); + + if (stream != null) { + util.destroy(stream, err); + } + + // We do not destroy the socket as we can continue using the session + // the stream get's destroyed and the session remains to create new streams + util.destroy(body, err); + client[kQueue][client[kRunningIdx]++] = null; + client[kResume](); + }; + + try { + // We are already connected, streams are pending. + // We can call on connect, and wait for abort + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); } - async [kDestroy] (err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } + if (request.aborted) { + return false + } - const callback = () => { - if (this[kClosedResolve]) { - // TODO (fix): Should we error here with ClientDestroyedError? - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; + if (method === 'CONNECT') { + session.ref(); + // We are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream + stream = session.request(headers, { endStream: false, signal }); - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; - } + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + }); + } - if (!this[kSocket]) { - queueMicrotask(callback); - } else { - util.destroy(this[kSocket].on('close', callback), err); - } + stream.once('close', () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); + }); - resume(this); - }) + return true } - } - function onHttp2SessionError (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + // https://tools.ietf.org/html/rfc7540#section-8.3 + // :path and :scheme headers must be omitted when sending CONNECT - this[kSocket][kError] = err; + headers[HTTP2_HEADER_PATH] = path; + headers[HTTP2_HEADER_SCHEME] = 'https'; - onError(this[kClient], err); - } + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - function onHttp2FrameError (type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. - if (id === 0) { - this[kSocket][kError] = err; - onError(this[kClient], err); + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ); + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0); } - } - function onHttp2SessionEnd () { - util.destroy(this, new SocketError('other side closed')); - util.destroy(this[kSocket], new SocketError('other side closed')); - } + let contentLength = util.bodyLength(body); - function onHTTP2GoAway (code) { - const client = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); - client[kSocket] = null; - client[kHTTP2Session] = null; + if (util.isFormDataLike(body)) { + extractBody ??= requireBody$1().extractBody; - if (client.destroyed) { - assert(this[kPending] === 0); + const [bodyStream, contentType] = extractBody(body); + headers['content-type'] = contentType; - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - } else if (client[kRunning] > 0) { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; + body = bodyStream.stream; + contentLength = bodyStream.length; + } - errorRequest(client, request, err); + if (contentLength == null) { + contentLength = request.contentLength; } - client[kPendingIdx] = client[kRunningIdx]; + if (contentLength === 0 || !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. - assert(client[kRunning] === 0); + contentLength = null; + } - client.emit('disconnect', - client[kUrl], - [client], - err - ); + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false + } - resume(client); - } + process.emitWarning(new RequestContentLengthMismatchError()); + } - const constants = requireConstants$9(); - const createRedirectInterceptor = requireRedirectInterceptor(); - const EMPTY_BUF = Buffer.alloc(0); + if (contentLength != null) { + assert(body, 'no body must not have content length'); + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } - async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm() : undefined; + session.ref(); - let mod; - try { - mod = await WebAssembly.compile(Buffer.from(requireLlhttp_simdWasm(), 'base64')); - } catch (e) { - /* istanbul ignore next */ + const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null; + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = '100-continue'; + stream = session.request(headers, { endStream: shouldEndStream, signal }); - // We could check if the error was caused by the simd option not - // being enabled, but the occurring of this other error - // * https://github.com/emscripten-core/emscripten/issues/11495 - // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || requireLlhttpWasm(), 'base64')); + stream.once('continue', writeBodyH2); + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); } - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ + // Increment counter as we have new streams open + ++session[kOpenStreams]; - wasm_on_url: (p, at, len) => { - /* istanbul ignore next */ - return 0 - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0 - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0 + stream.once('response', headers => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers; + request.onResponseStarted(); + + // Due to the stream nature, it is possible we face a race condition + // where the stream has been assigned, but the request has been aborted + // the request remains in-flight and headers hasn't been received yet + // for those scenarios, best effort is to destroy the stream immediately + // as there's no value to keep it open. + if (request.aborted) { + const err = new RequestAbortedError(); + util.errorRequest(client, request, err); + util.destroy(stream, err); + return + } + + if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) { + stream.pause(); + } + + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); } + }); + }); - /* eslint-enable camelcase */ + stream.once('end', () => { + // When state is null, it means we haven't consumed body and the stream still do not have + // a state. + // Present specially when using pipeline or stream + if (stream.state?.state == null || stream.state.state < 6) { + request.onComplete([]); } - }) - } - let llhttpInstance = null; - let llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); + if (session[kOpenStreams] === 0) { + // Stream is closed or half-closed-remote (6), decrement counter and cleanup + // It does not have sense to continue working with the stream as we do not + // have yet RST_STREAM support on client-side - let currentParser = null; - let currentBufferRef = null; - let currentBufferSize = 0; - let currentBufferPtr = null; + session.unref(); + } - const TIMEOUT_HEADERS = 1; - const TIMEOUT_BODY = 2; - const TIMEOUT_IDLE = 3; + abort(new InformationalError('HTTP/2: stream half-closed (remote)')); + client[kQueue][client[kRunningIdx]++] = null; + client[kPendingIdx] = client[kRunningIdx]; + client[kResume](); + }); - class Parser { - constructor (client, socket, { exports: exports$1 }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + stream.once('close', () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + }); - this.llhttp = exports$1; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ''; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); + stream.once('error', function (err) { + abort(err); + }); - this.bytesRead = 0; + stream.once('frameError', (type, code) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); + }); - this.keepAlive = ''; - this.contentLength = ''; - this.connection = ''; - this.maxResponseSize = client[kMaxResponseSize]; - } + // stream.on('aborted', () => { + // // TODO(HTTP/2): Support aborted + // }) - setTimeout (value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - // istanbul ignore else: only for jest - if (this.timeout.unref) { - this.timeout.unref(); - } + // stream.on('timeout', () => { + // // TODO(HTTP/2): Support timeout + // }) + + // stream.on('push', headers => { + // // TODO(HTTP/2): Support push + // }) + + // stream.on('trailers', headers => { + // // TODO(HTTP/2): Support trailers + // }) + + return true + + function writeBodyH2 () { + /* istanbul ignore else: assertion */ + if (!body || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util.isBuffer(body)) { + writeBuffer( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable( + abort, + stream, + body.stream(), + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); + writeBlob( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } + } else if (util.isStream(body)) { + writeStream( + abort, + client[kSocket], + expectsPayload, + stream, + body, + client, + request, + contentLength + ); + } else if (util.isIterable(body)) { + writeIterable( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else { + assert(false); } } + } - resume () { - if (this.socket.destroyed || !this.paused) { - return - } - - assert(this.ptr != null); - assert(currentParser == null); + function writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + try { + if (body != null && util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length'); + h2stream.cork(); + h2stream.write(body); + h2stream.uncork(); + h2stream.end(); - this.llhttp.llhttp_resume(this.ptr); + request.onBodySent(body); + } - assert(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); - } + if (!expectsPayload) { + socket[kReset] = true; } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); // Flush parser. - this.readMore(); + request.onRequestSent(); + client[kResume](); + } catch (error) { + abort(error); } + } - readMore () { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break - } - this.execute(chunk); - } - } + function writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); - execute (data) { - assert(this.ptr != null); - assert(currentParser == null); - assert(!this.paused); + // For HTTP/2, is enough to pipe the stream + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(pipe, err); + abort(err); + } else { + util.removeAllListeners(pipe); + request.onRequestSent(); - const { socket, llhttp } = this; + if (!expectsPayload) { + socket[kReset] = true; + } - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); + client[kResume](); } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); } + ); - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - - // Call `execute` on the wasm parser. - // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, - // and finally the length of bytes to parse. - // The return value is an error code or `constants.ERROR.OK`. - try { - let ret; + util.addListener(pipe, 'data', onPipeData); - try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - /* eslint-disable-next-line no-useless-catch */ - } catch (err) { - /* istanbul ignore next: difficult to make a test case for */ - throw err - } finally { - currentParser = null; - currentBufferRef = null; - } + function onPipeData (chunk) { + request.onBodySent(chunk); + } + } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + async function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length'); - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ''; - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')'; - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) - } - } catch (err) { - util.destroy(socket, err); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() } - } - destroy () { - assert(this.ptr != null); - assert(currentParser == null); + const buffer = Buffer.from(await body.arrayBuffer()); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + h2stream.end(); - timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; + request.onBodySent(buffer); + request.onRequestSent(); - this.paused = false; - } + if (!expectsPayload) { + socket[kReset] = true; + } - onStatus (buf) { - this.statusText = buf.toString(); + client[kResume](); + } catch (err) { + abort(err); } + } - onMessageBegin () { - const { socket, client } = this; - - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } + async function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1 + let callback = null; + function onDrain () { + if (callback) { + const cb = callback; + callback = null; + cb(); } } - onHeaderField (buf) { - const len = this.headers.length; + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); - if ((len & 1) === 0) { - this.headers.push(buf); + if (socket[kError]) { + reject(socket[kError]); } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + callback = resolve; } + }); - this.trackHeader(buf.length); - } + h2stream + .on('close', onDrain) + .on('drain', onDrain); - onHeaderValue (buf) { - let len = this.headers.length; + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { + await waitForDrain(); + } } - const key = this.headers[len - 2]; - if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { - this.keepAlive += buf.toString(); - } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') { - this.connection += buf.toString(); - } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { - this.contentLength += buf.toString(); - } + h2stream.end(); - this.trackHeader(buf.length); - } + request.onRequestSent(); - trackHeader (len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()); + if (!expectsPayload) { + socket[kReset] = true; } + + client[kResume](); + } catch (err) { + abort(err); + } finally { + h2stream + .off('close', onDrain) + .off('drain', onDrain); } + } - onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode } = this; + clientH2$1 = connectH2; + return clientH2$1; +} - assert(upgrade); +var redirectHandler$1; +var hasRequiredRedirectHandler$1; - const request = client[kQueue][client[kRunningIdx]]; - assert(request); +function requireRedirectHandler$1 () { + if (hasRequiredRedirectHandler$1) return redirectHandler$1; + hasRequiredRedirectHandler$1 = 1; - assert(!socket.destroyed); - assert(socket === client[kSocket]); - assert(!this.paused); - assert(request.upgrade || request.method === 'CONNECT'); + const util = requireUtil$h(); + const { kBodyUsed } = requireSymbols$9(); + const assert = require$$0$7; + const { InvalidArgumentError } = requireErrors$2(); + const EE = require$$8; - this.statusCode = null; - this.statusText = ''; - this.shouldKeepAlive = null; + const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; + const kBody = Symbol('body'); - socket.unshift(head); + class BodyAsyncIterable { + constructor (body) { + this[kBody] = body; + this[kBodyUsed] = false; + } - socket[kParser].destroy(); - socket[kParser] = null; - - socket[kClient] = null; - socket[kError] = null; - socket - .removeListener('error', onSocketError) - .removeListener('readable', onSocketReadable) - .removeListener('end', onSocketEnd) - .removeListener('close', onSocketClose); - - client[kSocket] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')); - - try { - request.onUpgrade(statusCode, headers, socket); - } catch (err) { - util.destroy(socket, err); - } - - resume(client); + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed'); + this[kBodyUsed] = true; + yield * this[kBody]; } + } - onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; - - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 + class RedirectHandler { + constructor (dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') } - const request = client[kQueue][client[kRunningIdx]]; + util.validateHandler(handler, opts.method, opts.upgrade); - /* istanbul ignore next: difficult to make a test case for */ - if (!request) { - return -1 - } + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; + this.redirectionLimitReached = false; - assert(!this.upgrade); - assert(this.statusCode < 200); + if (util.isStream(this.opts.body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body + .on('data', function () { + assert(false); + }); + } - if (statusCode === 100) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))); - return -1 + if (typeof this.opts.body.readableDidRead !== 'boolean') { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, 'data', function () { + this[kBodyUsed] = true; + }); + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if ( + this.opts.body && + typeof this.opts.body !== 'string' && + !ArrayBuffer.isView(this.opts.body) && + util.isIterable(this.opts.body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + this.opts.body = new BodyAsyncIterable(this.opts.body); } + } - /* this can only happen if server is misbehaving */ - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))); - return -1 - } + onConnect (abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + onUpgrade (statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } - this.statusCode = statusCode; - this.shouldKeepAlive = ( - shouldKeepAlive || - // Override llhttp value which does not allow keepAlive for HEAD. - (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') - ); + onError (error) { + this.handler.onError(error); + } - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null - ? request.bodyTimeout - : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); + onHeaders (statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) + ? null + : parseLocation(statusCode, headers); + + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + if (this.request) { + this.request.abort(new Error('max redirects')); } - } - if (request.method === 'CONNECT') { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2 + this.redirectionLimitReached = true; + this.abort(new Error('max redirects')); + return } - if (upgrade) { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2 + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); } - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; - } - } else { - // Stop more requests from being dispatched. - socket[kReset] = true; + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText) } - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - - if (request.aborted) { - return -1 - } + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; - if (request.method === 'HEAD') { - return 1 - } + // Remove headers referring to the original URL. + // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. + // https://tools.ietf.org/html/rfc7231#section-6.4 + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; - if (statusCode < 200) { - return 1 + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + // In case of HTTP 303, always replace method to be either HEAD or GET + if (statusCode === 303 && this.opts.method !== 'HEAD') { + this.opts.method = 'GET'; + this.opts.body = null; } + } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client); + onData (chunk) { + if (this.location) ; else { + return this.handler.onData(chunk) } - - return pause ? constants.ERROR.PAUSED : 0 } - onBody (buf) { - const { client, socket, statusCode, maxResponseSize } = this; + onComplete (trailers) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 - if (socket.destroyed) { - return -1 - } + TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections + and neither are useful if present. - const request = client[kQueue][client[kRunningIdx]]; - assert(request); + See comment on onData method above for more detailed information. + */ - assert.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } + this.location = null; + this.abort = null; - assert(statusCode >= 200); + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()); - return -1 + onBodySent (chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); } + } + } - this.bytesRead += buf.length; + function parseLocation (statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null + } - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].length === 8 && util.headerNameToString(headers[i]) === 'location') { + return headers[i + 1] } } + } - onMessageComplete () { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + function shouldRemoveHeader (header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header); + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false + } - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1 + // https://tools.ietf.org/html/rfc7231#section-6.4 + function cleanRequestHeaders (headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); + } } - - if (upgrade) { - return + } else if (headers && typeof headers === 'object') { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); + } } + } else { + assert(headers == null, 'headers must be an object or an array'); + } + return ret + } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - - assert(statusCode >= 100); - - this.statusCode = null; - this.statusText = ''; - this.bytesRead = 0; - this.contentLength = ''; - this.keepAlive = ''; - this.connection = ''; + redirectHandler$1 = RedirectHandler; + return redirectHandler$1; +} - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; +var redirectInterceptor$1; +var hasRequiredRedirectInterceptor$1; - if (statusCode < 200) { - return - } +function requireRedirectInterceptor$1 () { + if (hasRequiredRedirectInterceptor$1) return redirectInterceptor$1; + hasRequiredRedirectInterceptor$1 = 1; - /* istanbul ignore next: should be handled by llhttp? */ - if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()); - return -1 - } + const RedirectHandler = requireRedirectHandler$1(); - request.onComplete(headers); + function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept (opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts; - client[kQueue][client[kRunningIdx]++] = null; + if (!maxRedirections) { + return dispatch(opts, handler) + } - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0); - // Response completed before request. - util.destroy(socket, new InformationalError('reset')); - return constants.ERROR.PAUSED - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError('reset')); - return constants.ERROR.PAUSED - } else if (socket[kReset] && client[kRunning] === 0) { - // Destroy socket once all requests have completed. - // The request at the tail of the pipeline is the one - // that requested reset and no further requests should - // have been queued since then. - util.destroy(socket, new InformationalError('reset')); - return constants.ERROR.PAUSED - } else if (client[kPipelining] === 1) { - // We must wait a full event loop cycle to reuse this socket to make sure - // that non-spec compliant servers are not closing the connection even if they - // said they won't. - setImmediate(resume, client); - } else { - resume(client); + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); + opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting. + return dispatch(opts, redirectHandler) } } } - function onParserTimeout (parser) { - const { socket, timeoutType, client } = parser; - - /* istanbul ignore else */ - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, 'cannot be paused while waiting for headers'); - util.destroy(socket, new HeadersTimeoutError()); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError()); - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util.destroy(socket, new InformationalError('socket idle timeout')); - } - } + redirectInterceptor$1 = createRedirectInterceptor; + return redirectInterceptor$1; +} - function onSocketReadable () { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); - } - } +var client$1; +var hasRequiredClient$1; - function onSocketError (err) { - const { [kClient]: client, [kParser]: parser } = this; +function requireClient$1 () { + if (hasRequiredClient$1) return client$1; + hasRequiredClient$1 = 1; - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + const assert = require$$0$7; + const net = require$$0$9; + const http = require$$2; + const util = requireUtil$h(); + const { channels } = requireDiagnostics$1(); + const Request = requireRequest$3(); + const DispatcherBase = requireDispatcherBase$1(); + const { + InvalidArgumentError, + InformationalError, + ClientDestroyedError + } = requireErrors$2(); + const buildConnector = requireConnect$1(); + const { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume + } = requireSymbols$9(); + const connectH1 = requireClientH1$1(); + const connectH2 = requireClientH2$1(); + let deprecatedInterceptorWarned = false; - if (client[kHTTPConnVersion] !== 'h2') { - // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded - // to the user. - if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete(); - return - } - } + const kClosedResolve = Symbol('kClosedResolve'); - this[kError] = err; + const noop = () => {}; - onError(this[kClient], err); + function getPipelining (client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1 } - function onError (client, err) { - if ( - client[kRunning] === 0 && - err.code !== 'UND_ERR_INFO' && - err.code !== 'UND_ERR_SOCKET' - ) { - // Error is not caused by running request and not a recoverable - // socket error. - - assert(client[kPendingIdx] === client[kRunningIdx]); + /** + * @type {import('../../types/client.js').default} + */ + class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor (url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2 + } = {}) { + super(); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + if (keepAlive !== undefined) { + throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') } - assert(client[kSize] === 0); - } - } - function onSocketEnd () { - const { [kParser]: parser, [kClient]: client } = this; + if (socketTimeout !== undefined) { + throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') + } - if (client[kHTTPConnVersion] !== 'h2') { - if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete(); - return + if (requestTimeout !== undefined) { + throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') } - } - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); - } + if (idleTimeout !== undefined) { + throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') + } - function onSocketClose () { - const { [kClient]: client, [kParser]: parser } = this; + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + } - if (client[kHTTPConnVersion] === 'h1' && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete(); + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError('invalid maxHeaderSize') } - this[kParser].destroy(); - this[kParser] = null; - } + if (socketPath != null && typeof socketPath !== 'string') { + throw new InvalidArgumentError('invalid socketPath') + } - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError('invalid connectTimeout') + } - client[kSocket] = null; + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveTimeout') + } - if (client.destroyed) { - assert(client[kPending] === 0); + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveMaxTimeout') + } - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') } - } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') + } - client[kPendingIdx] = client[kRunningIdx]; + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + } - assert(client[kRunning] === 0); + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } - client.emit('disconnect', client[kUrl], [client], err); + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - resume(client); - } + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + } - async function connect (client) { - assert(!client[kConnecting]); - assert(!client[kSocket]); + if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError('localAddress must be valid string IP address') + } - let { host, hostname, protocol, port } = client[kUrl]; + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError('maxResponseSize must be a positive number') + } + + if ( + autoSelectFamilyAttemptTimeout != null && + (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) + ) { + throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') + } + + // h2 + if (allowH2 != null && typeof allowH2 !== 'boolean') { + throw new InvalidArgumentError('allowH2 must be a valid boolean value') + } + + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0') + } + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }); + } + + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client; + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true; + process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', { + code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED' + }); + } + } else { + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; + } + + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming + this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; // Max peerConcurrentStreams for a Node h2 server + this[kHTTPContext] = null; + + // kQueue is built up of 3 sections separated by + // the kRunningIdx and kPendingIdx indices. + // | complete | running | pending | + // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length + // kRunningIdx points to the first running element. + // kPendingIdx points to the first pending element. + // This implements a fast queue with an amortized + // time of O(1). + + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); + } + + get pipelining () { + return this[kPipelining] + } + + set pipelining (value) { + this[kPipelining] = value; + this[kResume](true); + } + + get [kPending] () { + return this[kQueue].length - this[kPendingIdx] + } + + get [kRunning] () { + return this[kPendingIdx] - this[kRunningIdx] + } + + get [kSize] () { + return this[kQueue].length - this[kRunningIdx] + } + + get [kConnected] () { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed + } + + get [kBusy] () { + return Boolean( + this[kHTTPContext]?.busy(null) || + (this[kSize] >= (getPipelining(this) || 1)) || + this[kPending] > 0 + ) + } + + /* istanbul ignore: only used for test */ + [kConnect] (cb) { + connect(this); + this.once('connect', cb); + } + + [kDispatch] (opts, handler) { + const origin = opts.origin || this[kUrl].origin; + const request = new Request(origin, opts, handler); + + this[kQueue].push(request); + if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + // Wait a tick in case stream/iterator is ended in the same tick. + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); + } + + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + + return this[kNeedDrain] < 2 + } + + async [kClose] () { + // TODO: for H2 we need to gracefully flush the remaining enqueued + // request and close each stream. + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; + } else { + resolve(null); + } + }) + } + + async [kDestroy] (err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(this, request, err); + } + + const callback = () => { + if (this[kClosedResolve]) { + // TODO (fix): Should we error here with ClientDestroyedError? + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + + this[kResume](); + }) + } + } + + const createRedirectInterceptor = requireRedirectInterceptor$1(); + + function onError (client, err) { + if ( + client[kRunning] === 0 && + err.code !== 'UND_ERR_INFO' && + err.code !== 'UND_ERR_SOCKET' + ) { + // Error is not caused by running request and not a recoverable + // socket error. + + assert(client[kPendingIdx] === client[kRunningIdx]); + + const requests = client[kQueue].splice(client[kRunningIdx]); + + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + assert(client[kSize] === 0); + } + } + + /** + * @param {Client} client + * @returns + */ + async function connect (client) { + assert(!client[kConnecting]); + assert(!client[kHTTPContext]); + + let { host, hostname, protocol, port } = client[kUrl]; // Resolve ipv6 if (hostname[0] === '[') { @@ -10027,6 +11630,7 @@ function requireClient () { hostname, protocol, port, + version: client[kHTTPContext]?.version, servername: client[kServerName], localAddress: client[kLocalAddress] }, @@ -10053,66 +11657,28 @@ function requireClient () { }); if (client.destroyed) { - util.destroy(socket.on('error', () => {}), new ClientDestroyedError()); + util.destroy(socket.on('error', noop), new ClientDestroyedError()); return } - client[kConnecting] = false; - assert(socket); - const isH2 = socket.alpnProtocol === 'h2'; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning('H2 support is experimental, expect them to change at any time.', { - code: 'UNDICI-H2' - }); - } - - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }); - - client[kHTTPConnVersion] = 'h2'; - session[kClient] = client; - session[kSocket] = socket; - session.on('error', onHttp2SessionError); - session.on('frameError', onHttp2FrameError); - session.on('end', onHttp2SessionEnd); - session.on('goaway', onHTTP2GoAway); - session.on('close', onSocketClose); - session.unref(); - - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); + try { + client[kHTTPContext] = socket.alpnProtocol === 'h2' + ? await connectH2(client, socket) + : await connectH1(client, socket); + } catch (err) { + socket.destroy().on('error', noop); + throw err } + client[kConnecting] = false; + socket[kCounter] = 0; socket[kMaxRequests] = client[kMaxRequests]; socket[kClient] = client; socket[kError] = null; - socket - .on('error', onSocketError) - .on('readable', onSocketReadable) - .on('end', onSocketEnd) - .on('close', onSocketClose); - - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { channels.connected.publish({ connectParams: { @@ -10120,6 +11686,7 @@ function requireClient () { hostname, protocol, port, + version: client[kHTTPContext]?.version, servername: client[kServerName], localAddress: client[kLocalAddress] }, @@ -10142,6 +11709,7 @@ function requireClient () { hostname, protocol, port, + version: client[kHTTPContext]?.version, servername: client[kServerName], localAddress: client[kLocalAddress] }, @@ -10154,7 +11722,7 @@ function requireClient () { assert(client[kRunning] === 0); while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); + util.errorRequest(client, request, err); } } else { onError(client, err); @@ -10163,7 +11731,7 @@ function requireClient () { client.emit('connectionError', client[kUrl], [client], err); } - resume(client); + client[kResume](); } function emitDrain (client) { @@ -10201,32 +11769,8 @@ function requireClient () { return } - const socket = client[kSocket]; - - if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request.headersTimeout != null - ? request.headersTimeout - : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } + if (client[kHTTPContext]) { + client[kHTTPContext].resume(); } if (client[kBusy]) { @@ -10234,7 +11778,7 @@ function requireClient () { } else if (client[kNeedDrain] === 2) { if (sync) { client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); + queueMicrotask(() => emitDrain(client)); } else { emitDrain(client); } @@ -10245,7 +11789,7 @@ function requireClient () { return } - if (client[kRunning] >= (client[kPipelining] || 1)) { + if (client[kRunning] >= (getPipelining(client) || 1)) { return } @@ -10257,54 +11801,30 @@ function requireClient () { } client[kServerName] = request.servername; - - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError('servername changed')); - return - } + client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => { + client[kHTTPContext] = null; + resume(client); + }); } if (client[kConnecting]) { return } - if (!socket && !client[kHTTP2Session]) { + if (!client[kHTTPContext]) { connect(client); return } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return - } - - if (client[kRunning] > 0 && !request.idempotent) { - // Non-idempotent request cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return - } - - if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { - // Don't dispatch an upgrade until all preceding requests have completed. - // A misbehaving server might upgrade the connection before all pipelined - // request has completed. + if (client[kHTTPContext].destroyed) { return } - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && - (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - // Request with stream or iterator body can error while other requests - // are inflight and indirectly error those as well. - // Ensure this doesn't happen by waiting for inflight - // to complete before dispatching. - - // Request with stream or iterator body cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. + if (client[kHTTPContext].busy(request)) { return } - if (!request.aborted && write(client, request)) { + if (!request.aborted && client[kHTTPContext].write(request)) { client[kPendingIdx]++; } else { client[kQueue].splice(client[kPendingIdx], 1); @@ -10312,1746 +11832,1756 @@ function requireClient () { } } - // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 - function shouldSendContentLength (method) { - return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' - } - - function write (client, request) { - if (client[kHTTPConnVersion] === 'h2') { - writeH2(client, client[kHTTP2Session], request); - return - } - - const { body, method, path, host, upgrade, headers, blocking, reset } = request; + client$1 = Client; + return client$1; +} - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 +/* eslint-disable */ - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. +var fixedQueue$1; +var hasRequiredFixedQueue$1; - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ); +function requireFixedQueue$1 () { + if (hasRequiredFixedQueue$1) return fixedQueue$1; + hasRequiredFixedQueue$1 = 1; - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0); - } + // Extracted from node/lib/internal/fixed_queue.js - const bodyLength = util.bodyLength(body); + // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. + const kSize = 2048; + const kMask = kSize - 1; - let contentLength = bodyLength; + // The FixedQueue is implemented as a singly-linked list of fixed-size + // circular buffers. It looks something like this: + // + // head tail + // | | + // v v + // +-----------+ <-----\ +-----------+ <------\ +-----------+ + // | [null] | \----- | next | \------- | next | + // +-----------+ +-----------+ +-----------+ + // | item | <-- bottom | item | <-- bottom | [empty] | + // | item | | item | | [empty] | + // | item | | item | | [empty] | + // | item | | item | | [empty] | + // | item | | item | bottom --> | item | + // | item | | item | | item | + // | ... | | ... | | ... | + // | item | | item | | item | + // | item | | item | | item | + // | [empty] | <-- top | item | | item | + // | [empty] | | item | | item | + // | [empty] | | [empty] | <-- top top --> | [empty] | + // +-----------+ +-----------+ +-----------+ + // + // Or, if there is only one circular buffer, it looks something + // like either of these: + // + // head tail head tail + // | | | | + // v v v v + // +-----------+ +-----------+ + // | [null] | | [null] | + // +-----------+ +-----------+ + // | [empty] | | item | + // | [empty] | | item | + // | item | <-- bottom top --> | [empty] | + // | item | | [empty] | + // | [empty] | <-- top bottom --> | item | + // | [empty] | | item | + // +-----------+ +-----------+ + // + // Adding a value means moving `top` forward by one, removing means + // moving `bottom` forward by one. After reaching the end, the queue + // wraps around. + // + // When `top === bottom` the current queue is empty and when + // `top + 1 === bottom` it's full. This wastes a single space of storage + // but allows much quicker checks. - if (contentLength === null) { - contentLength = request.contentLength; + class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; } - if (contentLength === 0 && !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. - - contentLength = null; + isEmpty() { + return this.top === this.bottom; } - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false - } - - process.emitWarning(new RequestContentLengthMismatchError()); + isFull() { + return ((this.top + 1) & kMask) === this.bottom; } - const socket = client[kSocket]; - - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } - - errorRequest(client, request, err || new RequestAbortedError()); - - util.destroy(socket, new InformationalError('aborted')); - }); - } catch (err) { - errorRequest(client, request, err); + push(data) { + this.list[this.top] = data; + this.top = (this.top + 1) & kMask; } - if (request.aborted) { - return false + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = (this.bottom + 1) & kMask; + return nextItem; } + } - if (method === 'HEAD') { - // https://github.com/mcollina/undici/issues/258 - // Close after a HEAD request to interop with misbehaving servers - // that may send a body in the response. - - socket[kReset] = true; + fixedQueue$1 = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - if (upgrade || method === 'CONNECT') { - // On CONNECT or upgrade, block pipeline from dispatching further - // requests on this connection. - - socket[kReset] = true; + isEmpty() { + return this.head.isEmpty(); } - if (reset != null) { - socket[kReset] = reset; + push(data) { + if (this.head.isFull()) { + // Head is full: Creates a new queue, sets the old queue's `.next` to it, + // and sets it as the new main queue. + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + // If there is another queue, it forms the new tail. + this.tail = tail.next; + } + return next; } + }; + return fixedQueue$1; +} - if (blocking) { - socket[kBlocking] = true; - } +var poolStats$1; +var hasRequiredPoolStats$1; - let header = `${method} ${path} HTTP/1.1\r\n`; +function requirePoolStats$1 () { + if (hasRequiredPoolStats$1) return poolStats$1; + hasRequiredPoolStats$1 = 1; + const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$9(); + const kPool = Symbol('pool'); - if (typeof host === 'string') { - header += `host: ${host}\r\n`; - } else { - header += client[kHostHeader]; + class PoolStats { + constructor (pool) { + this[kPool] = pool; } - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; - } else if (client[kPipelining] && !socket[kReset]) { - header += 'connection: keep-alive\r\n'; - } else { - header += 'connection: close\r\n'; + get connected () { + return this[kPool][kConnected] } - if (headers) { - header += headers; + get free () { + return this[kPool][kFree] } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); + get pending () { + return this[kPool][kPending] } - /* istanbul ignore else: assertion */ - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); - } else { - assert(contentLength === null, 'no body must not have content length'); - socket.write(`${header}\r\n`, 'latin1'); - } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length'); + get queued () { + return this[kPool][kQueued] + } - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert(false); + get running () { + return this[kPool][kRunning] } - return true + get size () { + return this[kPool][kSize] + } } - function writeH2 (client, session, request) { - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; - - let headers; - if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else headers = reqHeaders; + poolStats$1 = PoolStats; + return poolStats$1; +} - if (upgrade) { - errorRequest(client, request, new Error('Upgrade not supported for H2')); - return false - } +var poolBase$1; +var hasRequiredPoolBase$1; - try { - // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event? - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } +function requirePoolBase$1 () { + if (hasRequiredPoolBase$1) return poolBase$1; + hasRequiredPoolBase$1 = 1; - errorRequest(client, request, err || new RequestAbortedError()); - }); - } catch (err) { - errorRequest(client, request, err); - } + const DispatcherBase = requireDispatcherBase$1(); + const FixedQueue = requireFixedQueue$1(); + const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$9(); + const PoolStats = requirePoolStats$1(); - if (request.aborted) { - return false - } + const kClients = Symbol('clients'); + const kNeedDrain = Symbol('needDrain'); + const kQueue = Symbol('queue'); + const kClosedResolve = Symbol('closed resolve'); + const kOnDrain = Symbol('onDrain'); + const kOnConnect = Symbol('onConnect'); + const kOnDisconnect = Symbol('onDisconnect'); + const kOnConnectionError = Symbol('onConnectionError'); + const kGetDispatcher = Symbol('get dispatcher'); + const kAddClient = Symbol('add client'); + const kRemoveClient = Symbol('remove client'); + const kStats = Symbol('stats'); - /** @type {import('node:http2').ClientHttp2Stream} */ - let stream; - const h2State = client[kHTTP2SessionState]; + class PoolBase extends DispatcherBase { + constructor () { + super(); - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; - headers[HTTP2_HEADER_METHOD] = method; + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; - if (method === 'CONNECT') { - session.ref(); - // we are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered - // We disabled endStream to allow the user to write to the stream - stream = session.request(headers, { endStream: false, signal }); + const pool = this; - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - } else { - stream.once('ready', () => { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - }); - } + this[kOnDrain] = function onDrain (origin, targets) { + const queue = pool[kQueue]; - stream.once('close', () => { - h2State.openStreams -= 1; - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) session.unref(); - }); + let needDrain = false; - return true - } + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break + } + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } - // https://tools.ietf.org/html/rfc7540#section-8.3 - // :path and :scheme headers must be omited when sending CONNECT + this[kNeedDrain] = needDrain; - headers[HTTP2_HEADER_PATH] = path; - headers[HTTP2_HEADER_SCHEME] = 'https'; - - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit('drain', origin, [pool, ...targets]); + } - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise + .all(pool[kClients].map(c => c.close())) + .then(pool[kClosedResolve]); + } + }; - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ); + this[kOnConnect] = (origin, targets) => { + pool.emit('connect', origin, [pool, ...targets]); + }; - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0); - } + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit('disconnect', origin, [pool, ...targets], err); + }; - let contentLength = util.bodyLength(body); + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit('connectionError', origin, [pool, ...targets], err); + }; - if (contentLength == null) { - contentLength = request.contentLength; + this[kStats] = new PoolStats(this); } - if (contentLength === 0 || !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. - - contentLength = null; + get [kBusy] () { + return this[kNeedDrain] } - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false - } - - process.emitWarning(new RequestContentLengthMismatchError()); + get [kConnected] () { + return this[kClients].filter(client => client[kConnected]).length } - if (contentLength != null) { - assert(body, 'no body must not have content length'); - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + get [kFree] () { + return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length } - session.ref(); - - const shouldEndStream = method === 'GET' || method === 'HEAD'; - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = '100-continue'; - stream = session.request(headers, { endStream: shouldEndStream, signal }); - - stream.once('continue', writeBodyH2); - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }); - writeBodyH2(); + get [kPending] () { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret } - // Increment counter as we have new several streams open - ++h2State.openStreams; - - stream.once('response', headers => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers; + get [kRunning] () { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret + } - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) { - stream.pause(); + get [kSize] () { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; } - }); + return ret + } - stream.once('end', () => { - request.onComplete([]); - }); + get stats () { + return this[kStats] + } - stream.on('data', (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); + async [kClose] () { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map(c => c.close())); + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); } - }); + } - stream.once('close', () => { - h2State.openStreams -= 1; - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) { - session.unref(); + async [kDestroy] (err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break + } + item.handler.onError(err); } - }); - stream.once('error', function (err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } - }); + await Promise.all(this[kClients].map(c => c.destroy(err))); + } - stream.once('frameError', (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client, request, err); + [kDispatch] (opts, handler) { + const dispatcher = this[kGetDispatcher](); - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); } - }); - // stream.on('aborted', () => { - // // TODO(HTTP/2): Support aborted - // }) + return !this[kNeedDrain] + } - // stream.on('timeout', () => { - // // TODO(HTTP/2): Support timeout - // }) + [kAddClient] (client) { + client + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]); - // stream.on('push', headers => { - // // TODO(HTTP/2): Suppor push - // }) + this[kClients].push(client); - // stream.on('trailers', headers => { - // // TODO(HTTP/2): Support trailers - // }) + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } - return true + return this + } - function writeBodyH2 () { - /* istanbul ignore else: assertion */ - if (!body) { - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length'); - stream.cork(); - stream.write(body); - stream.uncork(); - stream.end(); - request.onBodySent(body); - request.onRequestSent(); - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: '' - }); - } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: '', - socket: client[kSocket] - }); + [kRemoveClient] (client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: '' - }); - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: '', - h2stream: stream, - socket: client[kSocket] - }); - } else { - assert(false); - } + }); + + this[kNeedDrain] = this[kClients].some(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )); } } - function writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); + poolBase$1 = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; + return poolBase$1; +} - if (client[kHTTPConnVersion] === 'h2') { - // For HTTP/2, is enough to pipe the stream - const pipe = pipeline( - body, - h2stream, - (err) => { - if (err) { - util.destroy(body, err); - util.destroy(h2stream, err); - } else { - request.onRequestSent(); - } - } - ); +var pool$1; +var hasRequiredPool$1; - pipe.on('data', onPipeData); - pipe.once('end', () => { - pipe.removeListener('data', onPipeData); - util.destroy(pipe); - }); +function requirePool$1 () { + if (hasRequiredPool$1) return pool$1; + hasRequiredPool$1 = 1; - function onPipeData (chunk) { - request.onBodySent(chunk); - } + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = requirePoolBase$1(); + const Client = requireClient$1(); + const { + InvalidArgumentError + } = requireErrors$2(); + const util = requireUtil$h(); + const { kUrl, kInterceptors } = requireSymbols$9(); + const buildConnector = requireConnect$1(); - return - } + const kOptions = Symbol('options'); + const kConnections = Symbol('connections'); + const kFactory = Symbol('factory'); - let finished = false; + function defaultFactory (origin, opts) { + return new Client(origin, opts) + } - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + class Pool extends PoolBase { + constructor (origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); - const onData = function (chunk) { - if (finished) { - return + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError('invalid connections') } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function () { - if (finished) { - return + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') } - if (body.resume) { - body.resume(); - } - }; - const onAbort = function () { - if (finished) { - return - } - const err = new RequestAbortedError(); - queueMicrotask(() => onFinished(err)); - }; - const onFinished = function (err) { - if (finished) { - return + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') } - finished = true; - - assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)); + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }); + } - socket - .off('drain', onDrain) - .off('error', onFinished); + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) + ? options.interceptors.Pool + : []; + this[kConnections] = connections || null; + this[kUrl] = util.parseOrigin(origin); + this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined; + this[kFactory] = factory; - body - .removeListener('data', onData) - .removeListener('end', onFinished) - .removeListener('error', onFinished) - .removeListener('close', onAbort); + this.on('connectionError', (origin, targets, error) => { + // If a connection error occurs, we remove the client from the pool, + // and emit a connectionError event. They will not be re-used. + // Fixes https://github.com/nodejs/undici/issues/3895 + for (const target of targets) { + // Do not use kRemoveClient here, as it will close the client, + // but the client cannot be closed in this state. + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); + } - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; + [kGetDispatcher] () { + for (const client of this[kClients]) { + if (!client[kNeedDrain]) { + return client } } - writer.destroy(err); - - if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { - util.destroy(body, err); - } else { - util.destroy(body); + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher } - }; + } + } - body - .on('data', onData) - .on('end', onFinished) - .on('error', onFinished) - .on('close', onAbort); + pool$1 = Pool; + return pool$1; +} - if (body.resume) { - body.resume(); +var balancedPool$1; +var hasRequiredBalancedPool$1; + +function requireBalancedPool$1 () { + if (hasRequiredBalancedPool$1) return balancedPool$1; + hasRequiredBalancedPool$1 = 1; + + const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = requireErrors$2(); + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = requirePoolBase$1(); + const Pool = requirePool$1(); + const { kUrl, kInterceptors } = requireSymbols$9(); + const { parseOrigin } = requireUtil$h(); + const kFactory = Symbol('factory'); + + const kOptions = Symbol('options'); + const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor'); + const kCurrentWeight = Symbol('kCurrentWeight'); + const kIndex = Symbol('kIndex'); + const kWeight = Symbol('kWeight'); + const kMaxWeightPerServer = Symbol('kMaxWeightPerServer'); + const kErrorPenalty = Symbol('kErrorPenalty'); + + /** + * Calculate the greatest common divisor of two numbers by + * using the Euclidean algorithm. + * + * @param {number} a + * @param {number} b + * @returns {number} + */ + function getGreatestCommonDivisor (a, b) { + if (a === 0) return b + + while (b !== 0) { + const t = b; + b = a % b; + a = t; } + return a + } - socket - .on('drain', onDrain) - .on('error', onFinished); + function defaultFactory (origin, opts) { + return new Pool(origin, opts) } - async function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, 'blob body must have content length'); + class BalancedPool extends PoolBase { + constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); - const isH2 = client[kHTTPConnVersion] === 'h2'; - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError() - } + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; - const buffer = Buffer.from(await body.arrayBuffer()); + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); - socket.write(buffer); - socket.uncork(); + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; } - request.onBodySent(buffer); - request.onRequestSent(); - - if (!expectsPayload) { - socket[kReset] = true; + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') } - resume(client); - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err); - } - } - - async function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); + this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) + ? opts.interceptors.BalancedPool + : []; + this[kFactory] = factory; - let callback = null; - function onDrain () { - if (callback) { - const cb = callback; - callback = null; - cb(); + for (const upstream of upstreams) { + this.addUpstream(upstream); } + this._updateBalancedPoolStats(); } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null); + addUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; + if (this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + ))) { + return this } - }); + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); - if (client[kHTTPConnVersion] === 'h2') { - h2stream - .on('close', onDrain) - .on('drain', onDrain); + this[kAddClient](pool); + pool.on('connect', () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); + }); - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } + pool.on('connectionError', () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } + pool.on('disconnect', (...args) => { + const err = args[2]; + if (err && err.code === 'UND_ERR_SOCKET') { + // decrease the weight of the pool. + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); } - } catch (err) { - h2stream.destroy(err); - } finally { - request.onRequestSent(); - h2stream.end(); - h2stream - .off('close', onDrain) - .off('drain', onDrain); - } + }); - return - } + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer]; + } - socket - .on('close', onDrain) - .on('drain', onDrain); + this._updateBalancedPoolStats(); - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } + return this + } - if (!writer.write(chunk)) { - await waitForDrain(); - } + _updateBalancedPoolStats () { + let result = 0; + for (let i = 0; i < this[kClients].length; i++) { + result = getGreatestCommonDivisor(this[kClients][i][kWeight], result); } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket - .off('close', onDrain) - .off('drain', onDrain); + this[kGreatestCommonDivisor] = result; } - } - - class AsyncWriter { - constructor ({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; - } + removeUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; - write (chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + const pool = this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + )); - if (socket[kError]) { - throw socket[kError] + if (pool) { + this[kRemoveClient](pool); } - if (socket.destroyed) { - return false - } + return this + } - const len = Buffer.byteLength(chunk); - if (!len) { - return true + get upstreams () { + return this[kClients] + .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) + .map((p) => p[kUrl].origin) + } + + [kGetDispatcher] () { + // We validate that pools is greater than 0, + // otherwise we would have to wait until an upstream + // is added, which might never happen. + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError() } - // We should defer writing chunks. - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } + const dispatcher = this[kClients].find(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )); - process.emitWarning(new RequestContentLengthMismatchError()); + if (!dispatcher) { + return } - socket.cork(); - - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } + const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true); - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1'); - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); - } + if (allClientsBusy) { + return } - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1'); - } + let counter = 0; - this.bytesWritten += len; + let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]); - const ret = socket.write(chunk); + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool = this[kClients][this[kIndex]]; - socket.uncork(); + // find pool index with the largest weight + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex]; + } - request.onBodySent(chunk); + // decrease the current weight every `this[kClients].length`. + if (this[kIndex] === 0) { + // Set the current weight to the next lower weight. + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; } } + if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { + return pool + } } - return ret + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex] } + } - end () { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); + balancedPool$1 = BalancedPool; + return balancedPool$1; +} - socket[kWriting] = false; +var agent$1; +var hasRequiredAgent$1; - if (socket[kError]) { - throw socket[kError] - } +function requireAgent$1 () { + if (hasRequiredAgent$1) return agent$1; + hasRequiredAgent$1 = 1; - if (socket.destroyed) { - return - } + const { InvalidArgumentError } = requireErrors$2(); + const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$9(); + const DispatcherBase = requireDispatcherBase$1(); + const Pool = requirePool$1(); + const Client = requireClient$1(); + const util = requireUtil$h(); + const createRedirectInterceptor = requireRedirectInterceptor$1(); - if (bytesWritten === 0) { - if (expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD send a Content-Length in a request message when - // no Transfer-Encoding is sent and the request method defines a meaning - // for an enclosed payload body. + const kOnConnect = Symbol('onConnect'); + const kOnDisconnect = Symbol('onDisconnect'); + const kOnConnectionError = Symbol('onConnectionError'); + const kMaxRedirections = Symbol('maxRedirections'); + const kOnDrain = Symbol('onDrain'); + const kFactory = Symbol('factory'); + const kOptions = Symbol('options'); - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); - } else { - socket.write(`${header}\r\n`, 'latin1'); - } - } else if (contentLength === null) { - socket.write('\r\n0\r\n\r\n', 'latin1'); - } + function defaultFactory (origin, opts) { + return opts && opts.connections === 1 + ? new Client(origin, opts) + : new Pool(origin, opts) + } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } - } + class Agent extends DispatcherBase { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + super(); - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') } - resume(client); - } - - destroy (err) { - const { socket, client } = this; - - socket[kWriting] = false; - - if (err) { - assert(client[kRunning] <= 1, 'pipeline should only contain this request'); - util.destroy(socket, err); + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') } - } - } - - function errorRequest (client, request, err) { - try { - request.onError(err); - assert(request.aborted); - } catch (err) { - client.emit('error', err); - } - } - - client = Client; - return client; -} - -/* eslint-disable */ - -var fixedQueue; -var hasRequiredFixedQueue; - -function requireFixedQueue () { - if (hasRequiredFixedQueue) return fixedQueue; - hasRequiredFixedQueue = 1; - - // Extracted from node/lib/internal/fixed_queue.js - - // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. - const kSize = 2048; - const kMask = kSize - 1; - // The FixedQueue is implemented as a singly-linked list of fixed-size - // circular buffers. It looks something like this: - // - // head tail - // | | - // v v - // +-----------+ <-----\ +-----------+ <------\ +-----------+ - // | [null] | \----- | next | \------- | next | - // +-----------+ +-----------+ +-----------+ - // | item | <-- bottom | item | <-- bottom | [empty] | - // | item | | item | | [empty] | - // | item | | item | | [empty] | - // | item | | item | | [empty] | - // | item | | item | bottom --> | item | - // | item | | item | | item | - // | ... | | ... | | ... | - // | item | | item | | item | - // | item | | item | | item | - // | [empty] | <-- top | item | | item | - // | [empty] | | item | | item | - // | [empty] | | [empty] | <-- top top --> | [empty] | - // +-----------+ +-----------+ +-----------+ - // - // Or, if there is only one circular buffer, it looks something - // like either of these: - // - // head tail head tail - // | | | | - // v v v v - // +-----------+ +-----------+ - // | [null] | | [null] | - // +-----------+ +-----------+ - // | [empty] | | item | - // | [empty] | | item | - // | item | <-- bottom top --> | [empty] | - // | item | | [empty] | - // | [empty] | <-- top bottom --> | item | - // | [empty] | | item | - // +-----------+ +-----------+ - // - // Adding a value means moving `top` forward by one, removing means - // moving `bottom` forward by one. After reaching the end, the queue - // wraps around. - // - // When `top === bottom` the current queue is empty and when - // `top + 1 === bottom` it's full. This wastes a single space of storage - // but allows much quicker checks. + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } + if (connect && typeof connect !== 'function') { + connect = { ...connect }; + } - isEmpty() { - return this.top === this.bottom; - } + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) + ? options.interceptors.Agent + : [createRedirectInterceptor({ maxRedirections })]; - isFull() { - return ((this.top + 1) & kMask) === this.bottom; - } + this[kOptions] = { ...util.deepClone(options), connect }; + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = new Map(); - push(data) { - this.list[this.top] = data; - this.top = (this.top + 1) & kMask; - } + this[kOnDrain] = (origin, targets) => { + this.emit('drain', origin, [this, ...targets]); + }; - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = (this.bottom + 1) & kMask; - return nextItem; - } - } + this[kOnConnect] = (origin, targets) => { + this.emit('connect', origin, [this, ...targets]); + }; - fixedQueue = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } + this[kOnDisconnect] = (origin, targets, err) => { + this.emit('disconnect', origin, [this, ...targets], err); + }; - isEmpty() { - return this.head.isEmpty(); + this[kOnConnectionError] = (origin, targets, err) => { + this.emit('connectionError', origin, [this, ...targets], err); + }; } - push(data) { - if (this.head.isFull()) { - // Head is full: Creates a new queue, sets the old queue's `.next` to it, - // and sets it as the new main queue. - this.head = this.head.next = new FixedCircularBuffer(); + get [kRunning] () { + let ret = 0; + for (const client of this[kClients].values()) { + ret += client[kRunning]; } - this.head.push(data); + return ret } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - // If there is another queue, it forms the new tail. - this.tail = tail.next; + [kDispatch] (opts, handler) { + let key; + if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') } - return next; - } - }; - return fixedQueue; -} - -var poolStats; -var hasRequiredPoolStats; -function requirePoolStats () { - if (hasRequiredPoolStats) return poolStats; - hasRequiredPoolStats = 1; - const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$4(); - const kPool = Symbol('pool'); + let dispatcher = this[kClients].get(key); - class PoolStats { - constructor (pool) { - this[kPool] = pool; - } + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]) + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]); - get connected () { - return this[kPool][kConnected] - } + // This introduces a tiny memory leak, as dispatchers are never removed from the map. + // TODO(mcollina): remove te timer when the client/pool do not have any more + // active connections. + this[kClients].set(key, dispatcher); + } - get free () { - return this[kPool][kFree] + return dispatcher.dispatch(opts, handler) } - get pending () { - return this[kPool][kPending] - } + async [kClose] () { + const closePromises = []; + for (const client of this[kClients].values()) { + closePromises.push(client.close()); + } + this[kClients].clear(); - get queued () { - return this[kPool][kQueued] + await Promise.all(closePromises); } - get running () { - return this[kPool][kRunning] - } + async [kDestroy] (err) { + const destroyPromises = []; + for (const client of this[kClients].values()) { + destroyPromises.push(client.destroy(err)); + } + this[kClients].clear(); - get size () { - return this[kPool][kSize] + await Promise.all(destroyPromises); } } - poolStats = PoolStats; - return poolStats; + agent$1 = Agent; + return agent$1; } -var poolBase; -var hasRequiredPoolBase; - -function requirePoolBase () { - if (hasRequiredPoolBase) return poolBase; - hasRequiredPoolBase = 1; +var proxyAgent$1; +var hasRequiredProxyAgent$1; - const DispatcherBase = requireDispatcherBase(); - const FixedQueue = requireFixedQueue(); - const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$4(); - const PoolStats = requirePoolStats(); +function requireProxyAgent$1 () { + if (hasRequiredProxyAgent$1) return proxyAgent$1; + hasRequiredProxyAgent$1 = 1; - const kClients = Symbol('clients'); - const kNeedDrain = Symbol('needDrain'); - const kQueue = Symbol('queue'); - const kClosedResolve = Symbol('closed resolve'); - const kOnDrain = Symbol('onDrain'); - const kOnConnect = Symbol('onConnect'); - const kOnDisconnect = Symbol('onDisconnect'); - const kOnConnectionError = Symbol('onConnectionError'); - const kGetDispatcher = Symbol('get dispatcher'); - const kAddClient = Symbol('add client'); - const kRemoveClient = Symbol('remove client'); - const kStats = Symbol('stats'); + const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$9(); + const { URL } = require$$1$4; + const Agent = requireAgent$1(); + const Pool = requirePool$1(); + const DispatcherBase = requireDispatcherBase$1(); + const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = requireErrors$2(); + const buildConnector = requireConnect$1(); + const Client = requireClient$1(); - class PoolBase extends DispatcherBase { - constructor () { - super(); + const kAgent = Symbol('proxy agent'); + const kClient = Symbol('proxy client'); + const kProxyHeaders = Symbol('proxy headers'); + const kRequestTls = Symbol('request tls settings'); + const kProxyTls = Symbol('proxy tls settings'); + const kConnectEndpoint = Symbol('connect endpoint function'); + const kTunnelProxy = Symbol('tunnel proxy'); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; + function defaultProtocolPort (protocol) { + return protocol === 'https:' ? 443 : 80 + } - const pool = this; + function defaultFactory (origin, opts) { + return new Pool(origin, opts) + } - this[kOnDrain] = function onDrain (origin, targets) { - const queue = pool[kQueue]; + const noop = () => {}; - let needDrain = false; + function defaultAgentFactory (origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts) + } + return new Pool(origin, opts) + } - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } + class Http1ProxyWrapper extends DispatcherBase { + #client - this[kNeedDrain] = needDrain; + constructor (proxyUrl, { headers = {}, connect, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError('Proxy URL is mandatory') + } - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit('drain', origin, [pool, ...targets]); - } + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); + } + } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise - .all(pool[kClients].map(c => c.close())) - .then(pool[kClosedResolve]); + [kDispatch] (opts, handler) { + const onHeaders = handler.onHeaders; + handler.onHeaders = function (statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === 'function') { + handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)')); + } + return } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); }; - this[kOnConnect] = (origin, targets) => { - pool.emit('connect', origin, [pool, ...targets]); - }; + // Rewrite request as an HTTP1 Proxy request, without tunneling. + const { + origin, + path = '/', + headers = {} + } = opts; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit('disconnect', origin, [pool, ...targets], err); - }; + opts.path = origin + path; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit('connectionError', origin, [pool, ...targets], err); - }; + if (!('host' in headers) && !('Host' in headers)) { + const { host } = new URL(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; - this[kStats] = new PoolStats(this); + return this.#client[kDispatch](opts, handler) } - get [kBusy] () { - return this[kNeedDrain] + async [kClose] () { + return this.#client.close() } - get [kConnected] () { - return this[kClients].filter(client => client[kConnected]).length + async [kDestroy] (err) { + return this.#client.destroy(err) } + } - get [kFree] () { - return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length - } + class ProxyAgent extends DispatcherBase { + constructor (opts) { + super(); - get [kPending] () { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; + if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) { + throw new InvalidArgumentError('Proxy uri is mandatory') } - return ret - } - get [kRunning] () { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== 'function') { + throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') } - return ret - } - get [kSize] () { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; - } - return ret - } + const { proxyTunnel = true } = opts; - get stats () { - return this[kStats] - } + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; - async [kClose] () { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map(c => c.close())) - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }) - } - } + this[kProxy] = { uri: href, protocol }; + this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) + ? opts.interceptors.ProxyAgent + : []; + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; - async [kDestroy] (err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break - } - item.handler.onError(err); + if (opts.auth && opts.token) { + throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') + } else if (opts.auth) { + /* @deprecated in favour of opts.token */ + this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]['proxy-authorization'] = opts.token; + } else if (username && password) { + this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`; } - return Promise.all(this[kClients].map(c => c.destroy(err))) + const connect = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin, options) => { + const { protocol } = new URL(origin); + if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }) + } + return agentFactory(origin, options) + }; + this[kClient] = clientFactory(url, { connect }); + this[kAgent] = new Agent({ + ...opts, + factory, + connect: async (opts, callback) => { + let requestedPath = opts.host; + if (!opts.port) { + requestedPath += `:${defaultProtocolPort(opts.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedPath, + signal: opts.signal, + headers: { + ...this[kProxyHeaders], + host: opts.host + }, + servername: this[kProxyTls]?.servername || proxyHostname + }); + if (statusCode !== 200) { + socket.on('error', noop).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + } + if (opts.protocol !== 'https:') { + callback(null, socket); + return + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts.servername; + } + this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback); + } catch (err) { + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + // Throw a custom error to avoid loop in client.js#connect + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } + } + } + }); } - [kDispatch] (opts, handler) { - const dispatcher = this[kGetDispatcher](); + dispatch (opts, handler) { + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); + if (headers && !('host' in headers) && !('Host' in headers)) { + const { host } = new URL(opts.origin); + headers.host = host; } - return !this[kNeedDrain] + return this[kAgent].dispatch( + { + ...opts, + headers + }, + handler + ) } - [kAddClient] (client) { - client - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]); + /** + * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl (opts) { + if (typeof opts === 'string') { + return new URL(opts) + } else if (opts instanceof URL) { + return opts + } else { + return new URL(opts.uri) + } + } - this[kClients].push(client); + async [kClose] () { + await this[kAgent].close(); + await this[kClient].close(); + } - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); + async [kDestroy] () { + await this[kAgent].destroy(); + await this[kClient].destroy(); + } + } + + /** + * @param {string[] | Record} headers + * @returns {Record} + */ + function buildHeaders (headers) { + // When using undici.fetch, the headers list is stored + // as an array. + if (Array.isArray(headers)) { + /** @type {Record} */ + const headersPair = {}; + + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; } - return this + return headersPair } - [kRemoveClient] (client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); + return headers + } - this[kNeedDrain] = this[kClients].some(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )); + /** + * @param {Record} headers + * + * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers + * Nevertheless, it was changed and to avoid a security vulnerability by end users + * this check was created. + * It should be removed in the next major version for performance reasons + */ + function throwIfProxyAuthIsSent (headers) { + const existProxyAuth = headers && Object.keys(headers) + .find((key) => key.toLowerCase() === 'proxy-authorization'); + if (existProxyAuth) { + throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') } } - poolBase = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - return poolBase; + proxyAgent$1 = ProxyAgent; + return proxyAgent$1; } -var pool; -var hasRequiredPool; +var envHttpProxyAgent$1; +var hasRequiredEnvHttpProxyAgent$1; -function requirePool () { - if (hasRequiredPool) return pool; - hasRequiredPool = 1; +function requireEnvHttpProxyAgent$1 () { + if (hasRequiredEnvHttpProxyAgent$1) return envHttpProxyAgent$1; + hasRequiredEnvHttpProxyAgent$1 = 1; - const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = requirePoolBase(); - const Client = requireClient(); - const { - InvalidArgumentError - } = requireErrors$1(); - const util = requireUtil$8(); - const { kUrl, kInterceptors } = requireSymbols$4(); - const buildConnector = requireConnect(); + const DispatcherBase = requireDispatcherBase$1(); + const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = requireSymbols$9(); + const ProxyAgent = requireProxyAgent$1(); + const Agent = requireAgent$1(); - const kOptions = Symbol('options'); - const kConnections = Symbol('connections'); - const kFactory = Symbol('factory'); + const DEFAULT_PORTS = { + 'http:': 80, + 'https:': 443 + }; - function defaultFactory (origin, opts) { - return new Client(origin, opts) - } + let experimentalWarned = false; - class Pool extends PoolBase { - constructor (origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { + class EnvHttpProxyAgent extends DispatcherBase { + #noProxyValue = null + #noProxyEntries = null + #opts = null + + constructor (opts = {}) { super(); + this.#opts = opts; - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError('invalid connections') + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning('EnvHttpProxyAgent is experimental, expect them to change at any time.', { + code: 'UNDICI-EHPA' + }); } - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts; - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + this[kNoProxyAgent] = new Agent(agentOpts); - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }); + const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY; + if (HTTP_PROXY) { + this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }); + } else { + this[kHttpProxyAgent] = this[kNoProxyAgent]; } - this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) - ? options.interceptors.Pool - : []; - this[kConnections] = connections || null; - this[kUrl] = util.parseOrigin(origin); - this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined; - this[kFactory] = factory; + const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY; + if (HTTPS_PROXY) { + this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }); + } else { + this[kHttpsProxyAgent] = this[kHttpProxyAgent]; + } - this.on('connectionError', (origin, targets, error) => { - // If a connection error occurs, we remove the client from the pool, - // and emit a connectionError event. They will not be re-used. - // Fixes https://github.com/nodejs/undici/issues/3895 - for (const target of targets) { - // Do not use kRemoveClient here, as it will close the client, - // but the client cannot be closed in this state. - const idx = this[kClients].indexOf(target); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - } - }); + this.#parseNoProxy(); } - [kGetDispatcher] () { - let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]); + [kDispatch] (opts, handler) { + const url = new URL(opts.origin); + const agent = this.#getProxyAgentForUrl(url); + return agent.dispatch(opts, handler) + } - if (dispatcher) { - return dispatcher + async [kClose] () { + await this[kNoProxyAgent].close(); + if (!this[kHttpProxyAgent][kClosed]) { + await this[kHttpProxyAgent].close(); } - - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); + if (!this[kHttpsProxyAgent][kClosed]) { + await this[kHttpsProxyAgent].close(); } - - return dispatcher } - } - pool = Pool; - return pool; -} + async [kDestroy] (err) { + await this[kNoProxyAgent].destroy(err); + if (!this[kHttpProxyAgent][kDestroyed]) { + await this[kHttpProxyAgent].destroy(err); + } + if (!this[kHttpsProxyAgent][kDestroyed]) { + await this[kHttpsProxyAgent].destroy(err); + } + } -var balancedPool; -var hasRequiredBalancedPool; + #getProxyAgentForUrl (url) { + let { protocol, host: hostname, port } = url; -function requireBalancedPool () { - if (hasRequiredBalancedPool) return balancedPool; - hasRequiredBalancedPool = 1; + // Stripping ports in this way instead of using parsedUrl.hostname to make + // sure that the brackets around IPv6 addresses are kept. + hostname = hostname.replace(/:\d*$/, '').toLowerCase(); + port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; + if (!this.#shouldProxy(hostname, port)) { + return this[kNoProxyAgent] + } + if (protocol === 'https:') { + return this[kHttpsProxyAgent] + } + return this[kHttpProxyAgent] + } - const { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = requireErrors$1(); - const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = requirePoolBase(); - const Pool = requirePool(); - const { kUrl, kInterceptors } = requireSymbols$4(); - const { parseOrigin } = requireUtil$8(); - const kFactory = Symbol('factory'); + #shouldProxy (hostname, port) { + if (this.#noProxyChanged) { + this.#parseNoProxy(); + } - const kOptions = Symbol('options'); - const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor'); - const kCurrentWeight = Symbol('kCurrentWeight'); - const kIndex = Symbol('kIndex'); - const kWeight = Symbol('kWeight'); - const kMaxWeightPerServer = Symbol('kMaxWeightPerServer'); - const kErrorPenalty = Symbol('kErrorPenalty'); + if (this.#noProxyEntries.length === 0) { + return true // Always proxy if NO_PROXY is not set or empty. + } + if (this.#noProxyValue === '*') { + return false // Never proxy if wildcard is set. + } - function getGreatestCommonDivisor (a, b) { - if (b === 0) return a - return getGreatestCommonDivisor(b, a % b) - } + for (let i = 0; i < this.#noProxyEntries.length; i++) { + const entry = this.#noProxyEntries[i]; + if (entry.port && entry.port !== port) { + continue // Skip if ports don't match. + } + if (!/^[.*]/.test(entry.hostname)) { + // No wildcards, so don't proxy only if there is not an exact match. + if (hostname === entry.hostname) { + return false + } + } else { + // Don't proxy if the hostname ends with the no_proxy host. + if (hostname.endsWith(entry.hostname.replace(/^\*/, ''))) { + return false + } + } + } - function defaultFactory (origin, opts) { - return new Pool(origin, opts) - } + return true + } - class BalancedPool extends PoolBase { - constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super(); + #parseNoProxy () { + const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv; + const noProxySplit = noProxyValue.split(/[,\s]/); + const noProxyEntries = []; - this[kOptions] = opts; - this[kIndex] = -1; - this[kCurrentWeight] = 0; + for (let i = 0; i < noProxySplit.length; i++) { + const entry = noProxySplit[i]; + if (!entry) { + continue + } + const parsed = entry.match(/^(.+):(\d+)$/); + noProxyEntries.push({ + hostname: (parsed ? parsed[1] : entry).toLowerCase(), + port: parsed ? Number.parseInt(parsed[2], 10) : 0 + }); + } - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + this.#noProxyValue = noProxyValue; + this.#noProxyEntries = noProxyEntries; + } - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; + get #noProxyChanged () { + if (this.#opts.noProxy !== undefined) { + return false } + return this.#noProxyValue !== this.#noProxyEnv + } - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + get #noProxyEnv () { + return process.env.no_proxy ?? process.env.NO_PROXY ?? '' + } + } - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) - ? opts.interceptors.BalancedPool - : []; - this[kFactory] = factory; + envHttpProxyAgent$1 = EnvHttpProxyAgent; + return envHttpProxyAgent$1; +} - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } +var retryHandler$1; +var hasRequiredRetryHandler$1; - addUpstream (upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; +function requireRetryHandler$1 () { + if (hasRequiredRetryHandler$1) return retryHandler$1; + hasRequiredRetryHandler$1 = 1; + const assert = require$$0$7; - if (this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - ))) { - return this - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + const { kRetryHandlerDefaultRetry } = requireSymbols$9(); + const { RequestRetryError } = requireErrors$2(); + const { + isDisturbed, + parseHeaders, + parseRangeHeader, + wrapRequestBody + } = requireUtil$h(); - this[kAddClient](pool); - pool.on('connect', () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); - }); + function calculateRetryAfterHeader (retryAfter) { + const current = Date.now(); + return new Date(retryAfter).getTime() - current + } - pool.on('connectionError', () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); + class RetryHandler { + constructor (opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts; + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {}; - pool.on('disconnect', (...args) => { - const err = args[2]; - if (err && err.code === 'UND_ERR_SOCKET') { - // decrease the weight of the pool. - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); + this.dispatch = handlers.dispatch; + this.handler = handlers.handler; + this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }; + this.abort = null; + this.aborted = false; + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1000, // 30s, + minTimeout: minTimeout ?? 500, // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + 'ECONNRESET', + 'ECONNREFUSED', + 'ENOTFOUND', + 'ENETDOWN', + 'ENETUNREACH', + 'EHOSTDOWN', + 'EHOSTUNREACH', + 'EPIPE', + 'UND_ERR_SOCKET' + ] + }; + + this.retryCount = 0; + this.retryCountCheckpoint = 0; + this.start = 0; + this.end = null; + this.etag = null; + this.resume = null; + + // Handle possible onConnect duplication + this.handler.onConnect(reason => { + this.aborted = true; + if (this.abort) { + this.abort(reason); + } else { + this.reason = reason; } }); + } - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer]; + onRequestSent () { + if (this.handler.onRequestSent) { + this.handler.onRequestSent(); } - - this._updateBalancedPoolStats(); - - return this } - _updateBalancedPoolStats () { - this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0); + onUpgrade (statusCode, headers, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers, socket); + } } - removeUpstream (upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - - const pool = this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - )); - - if (pool) { - this[kRemoveClient](pool); + onConnect (abort) { + if (this.aborted) { + abort(this.reason); + } else { + this.abort = abort; } - - return this } - get upstreams () { - return this[kClients] - .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) - .map((p) => p[kUrl].origin) + onBodySent (chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk) } - [kGetDispatcher] () { - // We validate that pools is greater than 0, - // otherwise we would have to wait until an upstream - // is added, which might never happen. - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError() - } + static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { + const { statusCode, code, headers } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + minTimeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + const { counter } = state; - const dispatcher = this[kClients].find(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )); + // Any code that is not a Undici's originated and allowed to retry + if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) { + cb(err); + return + } - if (!dispatcher) { + // If a set of method are provided and the current method is not in the list + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); return } - const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true); + // If a set of status code are provided and the current status code is not in the list + if ( + statusCode != null && + Array.isArray(statusCodes) && + !statusCodes.includes(statusCode) + ) { + cb(err); + return + } - if (allClientsBusy) { + // If we reached the max number of retries + if (counter > maxRetries) { + cb(err); return } - let counter = 0; + let retryAfterHeader = headers?.['retry-after']; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = Number.isNaN(retryAfterHeader) + ? calculateRetryAfterHeader(retryAfterHeader) + : retryAfterHeader * 1e3; // Retry-After is in seconds + } - let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]); + const retryTimeout = + retryAfterHeader > 0 + ? Math.min(retryAfterHeader, maxTimeout) + : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool = this[kClients][this[kIndex]]; + setTimeout(() => cb(null), retryTimeout); + } - // find pool index with the largest weight - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex]; + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = parseHeaders(rawHeaders); + + this.retryCount += 1; + + if (statusCode >= 300) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } else { + this.abort( + new RequestRetryError('Request failed', statusCode, { + headers, + data: { + count: this.retryCount + } + }) + ); + return false } + } - // decrease the current weight every `this[kClients].length`. - if (this[kIndex] === 0) { - // Set the current weight to the next lower weight. - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + // Checkpoint for resume from where we left it + if (this.resume != null) { + this.resume = null; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; - } + // Only Partial Content 206 supposed to provide Content-Range, + // any other status code that partially consumed the payload + // should not be retry because it would result in downstream + // wrongly concatanete multiple responses. + if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { + this.abort( + new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false } - if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { - return pool + + const contentRange = parseRangeHeader(headers['content-range']); + // If no content range + if (!contentRange) { + this.abort( + new RequestRetryError('Content-Range mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false } - } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex] - } - } + // Let's start with a weak etag check + if (this.etag != null && this.etag !== headers.etag) { + this.abort( + new RequestRetryError('ETag mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false + } - balancedPool = BalancedPool; - return balancedPool; -} + const { start, size, end = size - 1 } = contentRange; -var dispatcherWeakref; -var hasRequiredDispatcherWeakref; + assert(this.start === start, 'content-range mismatch'); + assert(this.end == null || this.end === end, 'content-range mismatch'); -function requireDispatcherWeakref () { - if (hasRequiredDispatcherWeakref) return dispatcherWeakref; - hasRequiredDispatcherWeakref = 1; + this.resume = resume; + return true + } - /* istanbul ignore file: only for Node 12 */ + if (this.end == null) { + if (statusCode === 206) { + // First time we receive 206 + const range = parseRangeHeader(headers['content-range']); - const { kConnected, kSize } = requireSymbols$4(); + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } - class CompatWeakRef { - constructor (value) { - this.value = value; - } + const { start, size, end = size - 1 } = range; + assert( + start != null && Number.isFinite(start), + 'content-range mismatch' + ); + assert(end != null && Number.isFinite(end), 'invalid content-length'); - deref () { - return this.value[kConnected] === 0 && this.value[kSize] === 0 - ? undefined - : this.value - } - } + this.start = start; + this.end = end; + } - class CompatFinalizer { - constructor (finalizer) { - this.finalizer = finalizer; - } + // We make our best to checkpoint the body for further range headers + if (this.end == null) { + const contentLength = headers['content-length']; + this.end = contentLength != null ? Number(contentLength) - 1 : null; + } - register (dispatcher, key) { - if (dispatcher.on) { - dispatcher.on('disconnect', () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key); - } - }); - } - } - } + assert(Number.isFinite(this.start)); + assert( + this.end == null || Number.isFinite(this.end), + 'invalid content-length' + ); - dispatcherWeakref = function () { - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - } - } - return { - WeakRef: commonjsGlobal.WeakRef || CompatWeakRef, - FinalizationRegistry: commonjsGlobal.FinalizationRegistry || CompatFinalizer - } - }; - return dispatcherWeakref; -} + this.resume = resume; + this.etag = headers.etag != null ? headers.etag : null; -var agent; -var hasRequiredAgent; + // Weak etags are not useful for comparison nor cache + // for instance not safe to assume if the response is byte-per-byte + // equal + if (this.etag != null && this.etag.startsWith('W/')) { + this.etag = null; + } -function requireAgent () { - if (hasRequiredAgent) return agent; - hasRequiredAgent = 1; + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } - const { InvalidArgumentError } = requireErrors$1(); - const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4(); - const DispatcherBase = requireDispatcherBase(); - const Pool = requirePool(); - const Client = requireClient(); - const util = requireUtil$8(); - const createRedirectInterceptor = requireRedirectInterceptor(); - const { WeakRef, FinalizationRegistry } = requireDispatcherWeakref()(); + const err = new RequestRetryError('Request failed', statusCode, { + headers, + data: { count: this.retryCount } + }); - const kOnConnect = Symbol('onConnect'); - const kOnDisconnect = Symbol('onDisconnect'); - const kOnConnectionError = Symbol('onConnectionError'); - const kMaxRedirections = Symbol('maxRedirections'); - const kOnDrain = Symbol('onDrain'); - const kFactory = Symbol('factory'); - const kFinalizer = Symbol('finalizer'); - const kOptions = Symbol('options'); + this.abort(err); - function defaultFactory (origin, opts) { - return opts && opts.connections === 1 - ? new Client(origin, opts) - : new Pool(origin, opts) - } + return false + } - class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super(); + onData (chunk) { + this.start += chunk.length; - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + return this.handler.onData(chunk) + } - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + onComplete (rawTrailers) { + this.retryCount = 0; + return this.handler.onComplete(rawTrailers) + } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError('maxRedirections must be a positive number') + onError (err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) } - if (connect && typeof connect !== 'function') { - connect = { ...connect }; + // We reconcile in case of a mix between network errors + // and server error response + if (this.retryCount - this.retryCountCheckpoint > 0) { + // We count the difference between the last checkpoint and the current retry count + this.retryCount = + this.retryCountCheckpoint + + (this.retryCount - this.retryCountCheckpoint); + } else { + this.retryCount += 1; } - this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) - ? options.interceptors.Agent - : [createRedirectInterceptor({ maxRedirections })]; + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ); - this[kOptions] = { ...util.deepClone(options), connect }; - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = new Map(); - this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => { - const ref = this[kClients].get(key); - if (ref !== undefined && ref.deref() === undefined) { - this[kClients].delete(key); + function onRetry (err) { + if (err != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) } - }); - - const agent = this; - - this[kOnDrain] = (origin, targets) => { - agent.emit('drain', origin, [agent, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - agent.emit('connect', origin, [agent, ...targets]); - }; + if (this.start !== 0) { + const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }; - this[kOnDisconnect] = (origin, targets, err) => { - agent.emit('disconnect', origin, [agent, ...targets], err); - }; + // Weak etag check - weak etags will make comparison algorithms never match + if (this.etag != null) { + headers['if-match'] = this.etag; + } - this[kOnConnectionError] = (origin, targets, err) => { - agent.emit('connectionError', origin, [agent, ...targets], err); - }; - } + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + ...headers + } + }; + } - get [kRunning] () { - let ret = 0; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - /* istanbul ignore next: gc is undeterministic */ - if (client) { - ret += client[kRunning]; + try { + this.retryCountCheckpoint = this.retryCount; + this.dispatch(this.opts, this); + } catch (err) { + this.handler.onError(err); } } - return ret } + } - [kDispatch] (opts, handler) { - let key; - if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') - } + retryHandler$1 = RetryHandler; + return retryHandler$1; +} - const ref = this[kClients].get(key); +var retryAgent$1; +var hasRequiredRetryAgent$1; - let dispatcher = ref ? ref.deref() : null; - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]) - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]); +function requireRetryAgent$1 () { + if (hasRequiredRetryAgent$1) return retryAgent$1; + hasRequiredRetryAgent$1 = 1; - this[kClients].set(key, new WeakRef(dispatcher)); - this[kFinalizer].register(dispatcher, key); - } + const Dispatcher = requireDispatcher$1(); + const RetryHandler = requireRetryHandler$1(); - return dispatcher.dispatch(opts, handler) + class RetryAgent extends Dispatcher { + #agent = null + #options = null + constructor (agent, options = {}) { + super(options); + this.#agent = agent; + this.#options = options; } - async [kClose] () { - const closePromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - /* istanbul ignore else: gc is undeterministic */ - if (client) { - closePromises.push(client.close()); - } - } - - await Promise.all(closePromises); + dispatch (opts, handler) { + const retry = new RetryHandler({ + ...opts, + retryOptions: this.#options + }, { + dispatch: this.#agent.dispatch.bind(this.#agent), + handler + }); + return this.#agent.dispatch(opts, retry) } - async [kDestroy] (err) { - const destroyPromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - /* istanbul ignore else: gc is undeterministic */ - if (client) { - destroyPromises.push(client.destroy(err)); - } - } + close () { + return this.#agent.close() + } - await Promise.all(destroyPromises); + destroy () { + return this.#agent.destroy() } } - agent = Agent; - return agent; + retryAgent$1 = RetryAgent; + return retryAgent$1; } -var api = {}; - -var apiRequest = {exports: {}}; +var api$1 = {}; -var readable; -var hasRequiredReadable; +var apiRequest$1 = {exports: {}}; -function requireReadable () { - if (hasRequiredReadable) return readable; - hasRequiredReadable = 1; +var readable$1; +var hasRequiredReadable$1; - const assert = require$$0$8; - const { Readable } = require$$0$a; - const { RequestAbortedError, NotSupportedError, InvalidArgumentError } = requireErrors$1(); - const util = requireUtil$8(); - const { ReadableStreamFrom, toUSVString } = requireUtil$8(); +function requireReadable$1 () { + if (hasRequiredReadable$1) return readable$1; + hasRequiredReadable$1 = 1; - let Blob; + const assert = require$$0$7; + const { Readable } = require$$0$8; + const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = requireErrors$2(); + const util = requireUtil$h(); + const { ReadableStreamFrom } = requireUtil$h(); const kConsume = Symbol('kConsume'); const kReading = Symbol('kReading'); const kBody = Symbol('kBody'); - const kAbort = Symbol('abort'); + const kAbort = Symbol('kAbort'); const kContentType = Symbol('kContentType'); + const kContentLength = Symbol('kContentLength'); const noop = () => {}; - readable = class BodyReadable extends Readable { + class BodyReadable extends Readable { constructor ({ resume, abort, contentType = '', + contentLength, highWaterMark = 64 * 1024 // Same as nodejs fs streams. }) { super({ @@ -12066,6 +13596,7 @@ function requireReadable () { this[kConsume] = null; this[kBody] = null; this[kContentType] = contentType; + this[kContentLength] = contentLength; // Is stream being consumed through Readable API? // This is an optimization so that we avoid checking @@ -12075,11 +13606,6 @@ function requireReadable () { } destroy (err) { - if (this.destroyed) { - // Node < 16 - return this - } - if (!err && !this._readableState.endEmitted) { err = new RequestAbortedError(); } @@ -12091,15 +13617,18 @@ function requireReadable () { return super.destroy(err) } - emit (ev, ...args) { - if (ev === 'data') { - // Node < 16.7 - this._readableState.dataEmitted = true; - } else if (ev === 'error') { - // Node < 16 - this._readableState.errorEmitted = true; + _destroy (err, callback) { + // Workaround for Node "bug". If the stream is destroyed in same + // tick as it is created, then a user who is waiting for a + // promise (i.e micro tick) for installing a 'error' listener will + // never get a chance and will always encounter an unhandled exception. + if (!this[kReading]) { + setImmediate(() => { + callback(err); + }); + } else { + callback(err); } - return super.emit(ev, ...args) } on (ev, ...args) { @@ -12129,7 +13658,7 @@ function requireReadable () { } push (chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { + if (this[kConsume] && chunk !== null) { consumePush(this[kConsume], chunk); return this[kReading] ? super.push(chunk) : true } @@ -12151,6 +13680,11 @@ function requireReadable () { return consume(this, 'blob') } + // https://fetch.spec.whatwg.org/#dom-body-bytes + async bytes () { + return consume(this, 'bytes') + } + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer async arrayBuffer () { return consume(this, 'arrayBuffer') @@ -12180,37 +13714,35 @@ function requireReadable () { return this[kBody] } - dump (opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; - const signal = opts && opts.signal; + async dump (opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024; + const signal = opts?.signal; - if (signal) { - try { - if (typeof signal !== 'object' || !('aborted' in signal)) { - throw new InvalidArgumentError('signal must be an AbortSignal') - } - util.throwIfAborted(signal); - } catch (err) { - return Promise.reject(err) - } + if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) { + throw new InvalidArgumentError('signal must be an AbortSignal') } - if (this.closed) { - return Promise.resolve(null) + signal?.throwIfAborted(); + + if (this._readableState.closeEmitted) { + return null } - return new Promise((resolve, reject) => { - const signalListenerCleanup = signal - ? util.addAbortListener(signal, () => { - this.destroy(); - }) - : noop; + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()); + } + + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal?.addEventListener('abort', onAbort); this .on('close', function () { - signalListenerCleanup(); - if (signal && signal.aborted) { - reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' })); + signal?.removeEventListener('abort', onAbort); + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()); } else { resolve(null); } @@ -12225,7 +13757,7 @@ function requireReadable () { .resume(); }) } - }; + } // https://streams.spec.whatwg.org/#readablestream-locked function isLocked (self) { @@ -12239,33 +13771,46 @@ function requireReadable () { } async function consume (stream, type) { - if (isUnusable(stream)) { - throw new TypeError('unusable') - } - assert(!stream[kConsume]); return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream + .on('error', err => { + reject(err); + }) + .on('close', () => { + reject(new TypeError('unusable')); + }); + } else { + reject(rState.errored ?? new TypeError('unusable')); + } + } else { + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; - stream - .on('error', function (err) { - consumeFinish(this[kConsume], err); - }) - .on('close', function () { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()); - } - }); + stream + .on('error', function (err) { + consumeFinish(this[kConsume], err); + }) + .on('close', function () { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); - process.nextTick(consumeStart, stream[kConsume]); + consumeStart(stream[kConsume]); + }); + } }) } @@ -12276,8 +13821,16 @@ function requireReadable () { const { _readableState: state } = consume.stream; - for (const chunk of state.buffer) { - consumePush(consume, chunk); + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume, state.buffer[n]); + } + } else { + for (const chunk of state.buffer) { + consumePush(consume, chunk); + } } if (state.endEmitted) { @@ -12295,29 +13848,67 @@ function requireReadable () { } } + /** + * @param {Buffer[]} chunks + * @param {number} length + */ + function chunksDecode (chunks, length) { + if (chunks.length === 0 || length === 0) { + return '' + } + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer.length; + + // Skip BOM. + const start = + bufferLength > 2 && + buffer[0] === 0xef && + buffer[1] === 0xbb && + buffer[2] === 0xbf + ? 3 + : 0; + return buffer.utf8Slice(start, bufferLength) + } + + /** + * @param {Buffer[]} chunks + * @param {number} length + * @returns {Uint8Array} + */ + function chunksConcat (chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0) + } + if (chunks.length === 1) { + // fast-path + return new Uint8Array(chunks[0]) + } + const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); + + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i]; + buffer.set(chunk, offset); + offset += chunk.length; + } + + return buffer + } + function consumeEnd (consume) { const { type, body, resolve, stream, length } = consume; try { if (type === 'text') { - resolve(toUSVString(Buffer.concat(body))); + resolve(chunksDecode(body, length)); } else if (type === 'json') { - resolve(JSON.parse(Buffer.concat(body))); + resolve(JSON.parse(chunksDecode(body, length))); } else if (type === 'arrayBuffer') { - const dst = new Uint8Array(length); - - let pos = 0; - for (const buf of body) { - dst.set(buf, pos); - pos += buf.byteLength; - } - - resolve(dst.buffer); + resolve(chunksConcat(body, length).buffer); } else if (type === 'blob') { - if (!Blob) { - Blob = require('buffer').Blob; - } resolve(new Blob(body, { type: stream[kContentType] })); + } else if (type === 'bytes') { + resolve(chunksConcat(body, length)); } consumeFinish(consume); @@ -12349,142 +13940,125 @@ function requireReadable () { consume.length = 0; consume.body = null; } - return readable; + + readable$1 = { Readable: BodyReadable, chunksDecode }; + return readable$1; } -var util$6; -var hasRequiredUtil$6; +var util$f; +var hasRequiredUtil$f; -function requireUtil$6 () { - if (hasRequiredUtil$6) return util$6; - hasRequiredUtil$6 = 1; - const assert = require$$0$8; +function requireUtil$f () { + if (hasRequiredUtil$f) return util$f; + hasRequiredUtil$f = 1; + const assert = require$$0$7; const { ResponseStatusCodeError - } = requireErrors$1(); - const { toUSVString } = requireUtil$8(); + } = requireErrors$2(); + + const { chunksDecode } = requireReadable$1(); + const CHUNK_LIMIT = 128 * 1024; async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { assert(body); let chunks = []; - let limit = 0; - - for await (const chunk of body) { - chunks.push(chunk); - limit += chunk.length; - if (limit > 128 * 1024) { - chunks = null; - break - } - } - - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)); - return - } + let length = 0; try { - if (contentType.startsWith('application/json')) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)); - return - } - - if (contentType.startsWith('text/')) { - const payload = toUSVString(Buffer.concat(chunks)); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)); - return + for await (const chunk of body) { + chunks.push(chunk); + length += chunk.length; + if (length > CHUNK_LIMIT) { + chunks = []; + length = 0; + break + } } - } catch (err) { - // Process in a fallback if error - } - - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)); - } - - util$6 = { getResolveErrorBodyCallback }; - return util$6; -} - -var abortSignal$1; -var hasRequiredAbortSignal; - -function requireAbortSignal () { - if (hasRequiredAbortSignal) return abortSignal$1; - hasRequiredAbortSignal = 1; - const { addAbortListener } = requireUtil$8(); - const { RequestAbortedError } = requireErrors$1(); - - const kListener = Symbol('kListener'); - const kSignal = Symbol('kSignal'); - - function abort (self) { - if (self.abort) { - self.abort(); - } else { - self.onError(new RequestAbortedError()); + } catch { + chunks = []; + length = 0; + // Do nothing.... } - } - - function addSignal (self, signal) { - self[kSignal] = null; - self[kListener] = null; - if (!signal) { - return - } + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`; - if (signal.aborted) { - abort(self); + if (statusCode === 204 || !contentType || !length) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))); return } - self[kSignal] = signal; - self[kListener] = () => { - abort(self); - }; - - addAbortListener(self[kSignal], self[kListener]); - } + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + let payload; - function removeSignal (self) { - if (!self[kSignal]) { - return + try { + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)); + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length); + } + } catch { + // process in a callback to avoid throwing in the microtask queue + } finally { + Error.stackTraceLimit = stackTraceLimit; } + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))); + } - if ('removeEventListener' in self[kSignal]) { - self[kSignal].removeEventListener('abort', self[kListener]); - } else { - self[kSignal].removeListener('abort', self[kListener]); - } + const isContentTypeApplicationJson = (contentType) => { + return ( + contentType.length > 15 && + contentType[11] === '/' && + contentType[0] === 'a' && + contentType[1] === 'p' && + contentType[2] === 'p' && + contentType[3] === 'l' && + contentType[4] === 'i' && + contentType[5] === 'c' && + contentType[6] === 'a' && + contentType[7] === 't' && + contentType[8] === 'i' && + contentType[9] === 'o' && + contentType[10] === 'n' && + contentType[12] === 'j' && + contentType[13] === 's' && + contentType[14] === 'o' && + contentType[15] === 'n' + ) + }; - self[kSignal] = null; - self[kListener] = null; - } + const isContentTypeText = (contentType) => { + return ( + contentType.length > 4 && + contentType[4] === '/' && + contentType[0] === 't' && + contentType[1] === 'e' && + contentType[2] === 'x' && + contentType[3] === 't' + ) + }; - abortSignal$1 = { - addSignal, - removeSignal + util$f = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText }; - return abortSignal$1; + return util$f; } -var hasRequiredApiRequest; +var hasRequiredApiRequest$1; -function requireApiRequest () { - if (hasRequiredApiRequest) return apiRequest.exports; - hasRequiredApiRequest = 1; +function requireApiRequest$1 () { + if (hasRequiredApiRequest$1) return apiRequest$1.exports; + hasRequiredApiRequest$1 = 1; - const Readable = requireReadable(); - const { - InvalidArgumentError, - RequestAbortedError - } = requireErrors$1(); - const util = requireUtil$8(); - const { getResolveErrorBodyCallback } = requireUtil$6(); - const { AsyncResource } = require$$4$1; - const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$7; + const { Readable } = requireReadable$1(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$2(); + const util = requireUtil$h(); + const { getResolveErrorBodyCallback } = requireUtil$f(); + const { AsyncResource } = require$$5$2; class RequestHandler extends AsyncResource { constructor (opts, callback) { @@ -12523,6 +14097,7 @@ function requireApiRequest () { throw err } + this.method = method; this.responseHeaders = responseHeaders || null; this.opaque = opaque || null; this.callback = callback; @@ -12534,6 +14109,9 @@ function requireApiRequest () { this.onInfo = onInfo || null; this.throwOnError = throwOnError; this.highWaterMark = highWaterMark; + this.signal = signal; + this.reason = null; + this.removeAbortListener = null; if (util.isStream(body)) { body.on('error', (err) => { @@ -12541,14 +14119,36 @@ function requireApiRequest () { }); } - addSignal(this, signal); + if (this.signal) { + if (this.signal.aborted) { + this.reason = this.signal.reason ?? new RequestAbortedError(); + } else { + this.removeAbortListener = util.addAbortListener(this.signal, () => { + this.reason = this.signal.reason ?? new RequestAbortedError(); + if (this.res) { + util.destroy(this.res.on('error', util.nop), this.reason); + } else if (this.abort) { + this.abort(this.reason); + } + + if (this.removeAbortListener) { + this.res?.off('close', this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } + }); + } + } } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = context; } @@ -12567,14 +14167,27 @@ function requireApiRequest () { const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers; const contentType = parsedHeaders['content-type']; - const body = new Readable({ resume, abort, contentType, highWaterMark }); + const contentLength = parsedHeaders['content-length']; + const res = new Readable({ + resume, + abort, + contentType, + contentLength: this.method !== 'HEAD' && contentLength + ? Number(contentLength) + : null, + highWaterMark + }); + + if (this.removeAbortListener) { + res.on('close', this.removeAbortListener); + } this.callback = null; - this.res = body; + this.res = res; if (callback !== null) { if (this.throwOnError && statusCode >= 400) { this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body, contentType, statusCode, statusMessage, headers } + { callback, body: res, contentType, statusCode, statusMessage, headers } ); } else { this.runInAsyncScope(callback, null, null, { @@ -12582,7 +14195,7 @@ function requireApiRequest () { headers, trailers: this.trailers, opaque, - body, + body: res, context }); } @@ -12590,25 +14203,17 @@ function requireApiRequest () { } onData (chunk) { - const { res } = this; - return res.push(chunk) + return this.res.push(chunk) } onComplete (trailers) { - const { res } = this; - - removeSignal(this); - util.parseHeaders(trailers, this.trailers); - - res.push(null); + this.res.push(null); } onError (err) { const { res, callback, body, opaque } = this; - removeSignal(this); - if (callback) { // TODO: Does this need queueMicrotask? this.callback = null; @@ -12629,6 +14234,12 @@ function requireApiRequest () { this.body = null; util.destroy(body, err); } + + if (this.removeAbortListener) { + res?.off('close', this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } } } @@ -12647,41 +14258,104 @@ function requireApiRequest () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiRequest.exports = request; - apiRequest.exports.RequestHandler = RequestHandler; - return apiRequest.exports; + apiRequest$1.exports = request; + apiRequest$1.exports.RequestHandler = RequestHandler; + return apiRequest$1.exports; } -var apiStream; -var hasRequiredApiStream; - -function requireApiStream () { - if (hasRequiredApiStream) return apiStream; - hasRequiredApiStream = 1; - - const { finished, PassThrough } = require$$0$a; - const { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = requireErrors$1(); - const util = requireUtil$8(); - const { getResolveErrorBodyCallback } = requireUtil$6(); - const { AsyncResource } = require$$4$1; - const { addSignal, removeSignal } = requireAbortSignal(); +var abortSignal$2; +var hasRequiredAbortSignal$1; - class StreamHandler extends AsyncResource { - constructor (opts, factory, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } +function requireAbortSignal$1 () { + if (hasRequiredAbortSignal$1) return abortSignal$2; + hasRequiredAbortSignal$1 = 1; + const { addAbortListener } = requireUtil$h(); + const { RequestAbortedError } = requireErrors$2(); - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; + const kListener = Symbol('kListener'); + const kSignal = Symbol('kSignal'); + + function abort (self) { + if (self.abort) { + self.abort(self[kSignal]?.reason); + } else { + self.reason = self[kSignal]?.reason ?? new RequestAbortedError(); + } + removeSignal(self); + } + + function addSignal (self, signal) { + self.reason = null; + + self[kSignal] = null; + self[kListener] = null; + + if (!signal) { + return + } + + if (signal.aborted) { + abort(self); + return + } + + self[kSignal] = signal; + self[kListener] = () => { + abort(self); + }; + + addAbortListener(self[kSignal], self[kListener]); + } + + function removeSignal (self) { + if (!self[kSignal]) { + return + } + + if ('removeEventListener' in self[kSignal]) { + self[kSignal].removeEventListener('abort', self[kListener]); + } else { + self[kSignal].removeListener('abort', self[kListener]); + } + + self[kSignal] = null; + self[kListener] = null; + } + + abortSignal$2 = { + addSignal, + removeSignal + }; + return abortSignal$2; +} + +var apiStream$1; +var hasRequiredApiStream$1; + +function requireApiStream$1 () { + if (hasRequiredApiStream$1) return apiStream$1; + hasRequiredApiStream$1 = 1; + + const assert = require$$0$7; + const { finished, PassThrough } = require$$0$8; + const { InvalidArgumentError, InvalidReturnValueError } = requireErrors$2(); + const util = requireUtil$h(); + const { getResolveErrorBodyCallback } = requireUtil$f(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal$1(); + + class StreamHandler extends AsyncResource { + constructor (opts, factory, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; try { if (typeof callback !== 'function') { @@ -12734,10 +14408,13 @@ function requireApiStream () { } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = context; } @@ -12812,7 +14489,7 @@ function requireApiStream () { const needDrain = res.writableNeedDrain !== undefined ? res.writableNeedDrain - : res._writableState && res._writableState.needDrain; + : res._writableState?.needDrain; return needDrain !== true } @@ -12876,36 +14553,36 @@ function requireApiStream () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiStream = stream; - return apiStream; + apiStream$1 = stream; + return apiStream$1; } -var apiPipeline; -var hasRequiredApiPipeline; +var apiPipeline$1; +var hasRequiredApiPipeline$1; -function requireApiPipeline () { - if (hasRequiredApiPipeline) return apiPipeline; - hasRequiredApiPipeline = 1; +function requireApiPipeline$1 () { + if (hasRequiredApiPipeline$1) return apiPipeline$1; + hasRequiredApiPipeline$1 = 1; const { Readable, Duplex, PassThrough - } = require$$0$a; + } = require$$0$8; const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError - } = requireErrors$1(); - const util = requireUtil$8(); - const { AsyncResource } = require$$4$1; - const { addSignal, removeSignal } = requireAbortSignal(); - const assert = require$$0$8; + } = requireErrors$2(); + const util = requireUtil$h(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal$1(); + const assert = require$$0$7; const kResume = Symbol('resume'); @@ -12992,7 +14669,7 @@ function requireApiPipeline () { read: () => { const { body } = this; - if (body && body.resume) { + if (body?.resume) { body.resume(); } }, @@ -13039,12 +14716,14 @@ function requireApiPipeline () { onConnect (abort, context) { const { ret, res } = this; - assert(!res, 'pipeline cannot be retried'); - - if (ret.destroyed) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(!res, 'pipeline cannot be retried'); + assert(!ret.destroyed); + this.abort = abort; this.context = context; } @@ -13138,22 +14817,22 @@ function requireApiPipeline () { } } - apiPipeline = pipeline; - return apiPipeline; + apiPipeline$1 = pipeline; + return apiPipeline$1; } -var apiUpgrade; -var hasRequiredApiUpgrade; +var apiUpgrade$1; +var hasRequiredApiUpgrade$1; -function requireApiUpgrade () { - if (hasRequiredApiUpgrade) return apiUpgrade; - hasRequiredApiUpgrade = 1; +function requireApiUpgrade$1 () { + if (hasRequiredApiUpgrade$1) return apiUpgrade$1; + hasRequiredApiUpgrade$1 = 1; - const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors$1(); - const { AsyncResource } = require$$4$1; - const util = requireUtil$8(); - const { addSignal, removeSignal } = requireAbortSignal(); - const assert = require$$0$8; + const { InvalidArgumentError, SocketError } = requireErrors$2(); + const { AsyncResource } = require$$5$2; + const util = requireUtil$h(); + const { addSignal, removeSignal } = requireAbortSignal$1(); + const assert = require$$0$7; class UpgradeHandler extends AsyncResource { constructor (opts, callback) { @@ -13183,10 +14862,13 @@ function requireApiUpgrade () { } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = null; } @@ -13196,9 +14878,9 @@ function requireApiUpgrade () { } onUpgrade (statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; + assert(statusCode === 101); - assert.strictEqual(statusCode, 101); + const { callback, opaque, context } = this; removeSignal(this); @@ -13246,26 +14928,27 @@ function requireApiUpgrade () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiUpgrade = upgrade; - return apiUpgrade; + apiUpgrade$1 = upgrade; + return apiUpgrade$1; } -var apiConnect; -var hasRequiredApiConnect; +var apiConnect$1; +var hasRequiredApiConnect$1; -function requireApiConnect () { - if (hasRequiredApiConnect) return apiConnect; - hasRequiredApiConnect = 1; +function requireApiConnect$1 () { + if (hasRequiredApiConnect$1) return apiConnect$1; + hasRequiredApiConnect$1 = 1; - const { AsyncResource } = require$$4$1; - const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors$1(); - const util = requireUtil$8(); - const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$7; + const { AsyncResource } = require$$5$2; + const { InvalidArgumentError, SocketError } = requireErrors$2(); + const util = requireUtil$h(); + const { addSignal, removeSignal } = requireAbortSignal$1(); class ConnectHandler extends AsyncResource { constructor (opts, callback) { @@ -13294,10 +14977,13 @@ function requireApiConnect () { } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = context; } @@ -13358,38 +15044,43 @@ function requireApiConnect () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiConnect = connect; - return apiConnect; + apiConnect$1 = connect; + return apiConnect$1; } -var hasRequiredApi; +var hasRequiredApi$1; -function requireApi () { - if (hasRequiredApi) return api; - hasRequiredApi = 1; +function requireApi$1 () { + if (hasRequiredApi$1) return api$1; + hasRequiredApi$1 = 1; - api.request = requireApiRequest(); - api.stream = requireApiStream(); - api.pipeline = requireApiPipeline(); - api.upgrade = requireApiUpgrade(); - api.connect = requireApiConnect(); - return api; + api$1.request = requireApiRequest$1(); + api$1.stream = requireApiStream$1(); + api$1.pipeline = requireApiPipeline$1(); + api$1.upgrade = requireApiUpgrade$1(); + api$1.connect = requireApiConnect$1(); + return api$1; } -var mockErrors; -var hasRequiredMockErrors; +var mockErrors$1; +var hasRequiredMockErrors$1; -function requireMockErrors () { - if (hasRequiredMockErrors) return mockErrors; - hasRequiredMockErrors = 1; +function requireMockErrors$1 () { + if (hasRequiredMockErrors$1) return mockErrors$1; + hasRequiredMockErrors$1 = 1; - const { UndiciError } = requireErrors$1(); + const { UndiciError } = requireErrors$2(); + const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED'); + + /** + * The request does not match any registered mock dispatches. + */ class MockNotMatchedError extends UndiciError { constructor (message) { super(message); @@ -13398,22 +15089,28 @@ function requireMockErrors () { this.message = message || 'The request does not match any registered mock dispatches'; this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kMockNotMatchedError] === true + } + + [kMockNotMatchedError] = true } - mockErrors = { + mockErrors$1 = { MockNotMatchedError }; - return mockErrors; + return mockErrors$1; } -var mockSymbols; -var hasRequiredMockSymbols; +var mockSymbols$1; +var hasRequiredMockSymbols$1; -function requireMockSymbols () { - if (hasRequiredMockSymbols) return mockSymbols; - hasRequiredMockSymbols = 1; +function requireMockSymbols$1 () { + if (hasRequiredMockSymbols$1) return mockSymbols$1; + hasRequiredMockSymbols$1 = 1; - mockSymbols = { + mockSymbols$1 = { kAgent: Symbol('agent'), kOptions: Symbol('options'), kFactory: Symbol('factory'), @@ -13434,31 +15131,31 @@ function requireMockSymbols () { kGetNetConnect: Symbol('get net connect'), kConnected: Symbol('connected') }; - return mockSymbols; + return mockSymbols$1; } -var mockUtils; -var hasRequiredMockUtils; +var mockUtils$1; +var hasRequiredMockUtils$1; -function requireMockUtils () { - if (hasRequiredMockUtils) return mockUtils; - hasRequiredMockUtils = 1; +function requireMockUtils$1 () { + if (hasRequiredMockUtils$1) return mockUtils$1; + hasRequiredMockUtils$1 = 1; - const { MockNotMatchedError } = requireMockErrors(); + const { MockNotMatchedError } = requireMockErrors$1(); const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect - } = requireMockSymbols(); - const { buildURL, nop } = requireUtil$8(); - const { STATUS_CODES } = require$$0$5; + } = requireMockSymbols$1(); + const { buildURL } = requireUtil$h(); + const { STATUS_CODES } = require$$2; const { types: { isPromise } - } = require$$0$6; + } = require$$0$a; function matchValue (match, value) { if (typeof match === 'string') { @@ -13562,6 +15259,10 @@ function requireMockUtils () { function getResponseData (data) { if (Buffer.isBuffer(data)) { return data + } else if (data instanceof Uint8Array) { + return data + } else if (data instanceof ArrayBuffer) { + return data } else if (typeof data === 'object') { return JSON.stringify(data) } else { @@ -13582,19 +15283,20 @@ function requireMockUtils () { // Match method matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`) + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`) } // Match body matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`) + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`) } // Match headers matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`) + const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers; + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`) } return matchedMockDispatches[0] @@ -13632,11 +15334,21 @@ function requireMockUtils () { } function generateKeyValues (data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []) + const keys = Object.keys(data); + const result = []; + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + const value = data[key]; + const name = Buffer.from(`${key}`); + if (Array.isArray(value)) { + for (let j = 0; j < value.length; ++j) { + result.push(name, Buffer.from(`${value[j]}`)); + } + } else { + result.push(name, Buffer.from(`${value}`)); + } + } + return result } /** @@ -13718,10 +15430,10 @@ function requireMockUtils () { const responseHeaders = generateKeyValues(headers); const responseTrailers = generateKeyValues(trailers); - handler.abort = nop; - handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); - handler.onData(Buffer.from(responseData)); - handler.onComplete(responseTrailers); + handler.onConnect?.(err => handler.onError(err), null); + handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler.onData?.(Buffer.from(responseData)); + handler.onComplete?.(responseTrailers); deleteMockDispatch(mockDispatches, key); } @@ -13777,7 +15489,7 @@ function requireMockUtils () { } } - mockUtils = { + mockUtils$1 = { getResponseData, getMockDispatch, addMockDispatch, @@ -13791,20 +15503,21 @@ function requireMockUtils () { buildMockDispatch, checkNetConnect, buildMockOptions, - getHeaderByName + getHeaderByName, + buildHeadersFromArray }; - return mockUtils; + return mockUtils$1; } -var mockInterceptor = {}; +var mockInterceptor$1 = {}; -var hasRequiredMockInterceptor; +var hasRequiredMockInterceptor$1; -function requireMockInterceptor () { - if (hasRequiredMockInterceptor) return mockInterceptor; - hasRequiredMockInterceptor = 1; +function requireMockInterceptor$1 () { + if (hasRequiredMockInterceptor$1) return mockInterceptor$1; + hasRequiredMockInterceptor$1 = 1; - const { getResponseData, buildKey, addMockDispatch } = requireMockUtils(); + const { getResponseData, buildKey, addMockDispatch } = requireMockUtils$1(); const { kDispatches, kDispatchKey, @@ -13812,9 +15525,9 @@ function requireMockInterceptor () { kDefaultTrailers, kContentLength, kMockDispatch - } = requireMockSymbols(); - const { InvalidArgumentError } = requireErrors$1(); - const { buildURL } = requireUtil$8(); + } = requireMockSymbols$1(); + const { InvalidArgumentError } = requireErrors$2(); + const { buildURL } = requireUtil$h(); /** * Defines the scope API for an interceptor reply @@ -13878,7 +15591,7 @@ function requireMockInterceptor () { if (opts.query) { opts.path = buildURL(opts.path, opts.query); } else { - // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811 + // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811 const parsedURL = new URL(opts.path, 'data://'); opts.path = parsedURL.pathname + parsedURL.search; } @@ -13894,7 +15607,7 @@ function requireMockInterceptor () { this[kContentLength] = false; } - createMockScopeDispatchData (statusCode, data, responseOptions = {}) { + createMockScopeDispatchData ({ statusCode, data, responseOptions }) { const responseData = getResponseData(data); const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}; const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; @@ -13903,14 +15616,11 @@ function requireMockInterceptor () { return { statusCode, data, headers, trailers } } - validateReplyParameters (statusCode, data, responseOptions) { - if (typeof statusCode === 'undefined') { + validateReplyParameters (replyParameters) { + if (typeof replyParameters.statusCode === 'undefined') { throw new InvalidArgumentError('statusCode must be defined') } - if (typeof data === 'undefined') { - throw new InvalidArgumentError('data must be defined') - } - if (typeof responseOptions !== 'object') { + if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) { throw new InvalidArgumentError('responseOptions must be an object') } } @@ -13918,28 +15628,28 @@ function requireMockInterceptor () { /** * Mock an undici request with a defined reply. */ - reply (replyData) { + reply (replyOptionsCallbackOrStatusCode) { // Values of reply aren't available right now as they // can only be available when the reply callback is invoked. - if (typeof replyData === 'function') { + if (typeof replyOptionsCallbackOrStatusCode === 'function') { // We'll first wrap the provided callback in another function, // this function will properly resolve the data from the callback // when invoked. const wrappedDefaultsCallback = (opts) => { // Our reply options callback contains the parameter for statusCode, data and options. - const resolvedData = replyData(opts); + const resolvedData = replyOptionsCallbackOrStatusCode(opts); // Check if it is in the right format - if (typeof resolvedData !== 'object') { + if (typeof resolvedData !== 'object' || resolvedData === null) { throw new InvalidArgumentError('reply options callback must return an object') } - const { statusCode, data = '', responseOptions = {} } = resolvedData; - this.validateReplyParameters(statusCode, data, responseOptions); + const replyParameters = { data: '', responseOptions: {}, ...resolvedData }; + this.validateReplyParameters(replyParameters); // Since the values can be obtained immediately we return them // from this higher order function that will be resolved later. return { - ...this.createMockScopeDispatchData(statusCode, data, responseOptions) + ...this.createMockScopeDispatchData(replyParameters) } }; @@ -13952,11 +15662,15 @@ function requireMockInterceptor () { // we should have 1-3 parameters. So we spread the arguments of // this function to obtain the parameters, since replyData will always // just be the statusCode. - const [statusCode, data = '', responseOptions = {}] = [...arguments]; - this.validateReplyParameters(statusCode, data, responseOptions); + const replyParameters = { + statusCode: replyOptionsCallbackOrStatusCode, + data: arguments[1] === undefined ? '' : arguments[1], + responseOptions: arguments[2] === undefined ? {} : arguments[2] + }; + this.validateReplyParameters(replyParameters); // Send in-already provided data like usual - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); + const dispatchData = this.createMockScopeDispatchData(replyParameters); const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); return new MockScope(newMockDispatch) } @@ -14006,21 +15720,21 @@ function requireMockInterceptor () { } } - mockInterceptor.MockInterceptor = MockInterceptor; - mockInterceptor.MockScope = MockScope; - return mockInterceptor; + mockInterceptor$1.MockInterceptor = MockInterceptor; + mockInterceptor$1.MockScope = MockScope; + return mockInterceptor$1; } -var mockClient; -var hasRequiredMockClient; +var mockClient$1; +var hasRequiredMockClient$1; -function requireMockClient () { - if (hasRequiredMockClient) return mockClient; - hasRequiredMockClient = 1; +function requireMockClient$1 () { + if (hasRequiredMockClient$1) return mockClient$1; + hasRequiredMockClient$1 = 1; - const { promisify } = require$$0$6; - const Client = requireClient(); - const { buildMockDispatch } = requireMockUtils(); + const { promisify } = require$$0$a; + const Client = requireClient$1(); + const { buildMockDispatch } = requireMockUtils$1(); const { kDispatches, kMockAgent, @@ -14029,10 +15743,10 @@ function requireMockClient () { kOrigin, kOriginalDispatch, kConnected - } = requireMockSymbols(); - const { MockInterceptor } = requireMockInterceptor(); - const Symbols = requireSymbols$4(); - const { InvalidArgumentError } = requireErrors$1(); + } = requireMockSymbols$1(); + const { MockInterceptor } = requireMockInterceptor$1(); + const Symbols = requireSymbols$9(); + const { InvalidArgumentError } = requireErrors$2(); /** * MockClient provides an API that extends the Client to influence the mockDispatches. @@ -14074,20 +15788,20 @@ function requireMockClient () { } } - mockClient = MockClient; - return mockClient; + mockClient$1 = MockClient; + return mockClient$1; } -var mockPool; -var hasRequiredMockPool; +var mockPool$1; +var hasRequiredMockPool$1; -function requireMockPool () { - if (hasRequiredMockPool) return mockPool; - hasRequiredMockPool = 1; +function requireMockPool$1 () { + if (hasRequiredMockPool$1) return mockPool$1; + hasRequiredMockPool$1 = 1; - const { promisify } = require$$0$6; - const Pool = requirePool(); - const { buildMockDispatch } = requireMockUtils(); + const { promisify } = require$$0$a; + const Pool = requirePool$1(); + const { buildMockDispatch } = requireMockUtils$1(); const { kDispatches, kMockAgent, @@ -14096,10 +15810,10 @@ function requireMockPool () { kOrigin, kOriginalDispatch, kConnected - } = requireMockSymbols(); - const { MockInterceptor } = requireMockInterceptor(); - const Symbols = requireSymbols$4(); - const { InvalidArgumentError } = requireErrors$1(); + } = requireMockSymbols$1(); + const { MockInterceptor } = requireMockInterceptor$1(); + const Symbols = requireSymbols$9(); + const { InvalidArgumentError } = requireErrors$2(); /** * MockPool provides an API that extends the Pool to influence the mockDispatches. @@ -14141,16 +15855,16 @@ function requireMockPool () { } } - mockPool = MockPool; - return mockPool; + mockPool$1 = MockPool; + return mockPool$1; } -var pluralizer; -var hasRequiredPluralizer; +var pluralizer$1; +var hasRequiredPluralizer$1; -function requirePluralizer () { - if (hasRequiredPluralizer) return pluralizer; - hasRequiredPluralizer = 1; +function requirePluralizer$1 () { + if (hasRequiredPluralizer$1) return pluralizer$1; + hasRequiredPluralizer$1 = 1; const singulars = { pronoun: 'it', @@ -14166,7 +15880,7 @@ function requirePluralizer () { this: 'these' }; - pluralizer = class Pluralizer { + pluralizer$1 = class Pluralizer { constructor (singular, plural) { this.singular = singular; this.plural = plural; @@ -14179,23 +15893,26 @@ function requirePluralizer () { return { ...keys, count, noun } } }; - return pluralizer; + return pluralizer$1; } -var pendingInterceptorsFormatter; -var hasRequiredPendingInterceptorsFormatter; +var pendingInterceptorsFormatter$1; +var hasRequiredPendingInterceptorsFormatter$1; -function requirePendingInterceptorsFormatter () { - if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter; - hasRequiredPendingInterceptorsFormatter = 1; +function requirePendingInterceptorsFormatter$1 () { + if (hasRequiredPendingInterceptorsFormatter$1) return pendingInterceptorsFormatter$1; + hasRequiredPendingInterceptorsFormatter$1 = 1; - const { Transform } = require$$0$a; + const { Transform } = require$$0$8; const { Console } = require$$1$5; + const PERSISTENT = process.versions.icu ? '✅' : 'Y '; + const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '; + /** * Gets the output of `console.table(…)` as a string. */ - pendingInterceptorsFormatter = class PendingInterceptorsFormatter { + pendingInterceptorsFormatter$1 = class PendingInterceptorsFormatter { constructor ({ disableColors } = {}) { this.transform = new Transform({ transform (chunk, _enc, cb) { @@ -14218,7 +15935,7 @@ function requirePendingInterceptorsFormatter () { Origin: origin, Path: path, 'Status code': statusCode, - Persistent: persist ? '✅' : '❌', + Persistent: persist ? PERSISTENT : NOT_PERSISTENT, Invocations: timesInvoked, Remaining: persist ? Infinity : times - timesInvoked })); @@ -14227,18 +15944,18 @@ function requirePendingInterceptorsFormatter () { return this.transform.read().toString() } }; - return pendingInterceptorsFormatter; + return pendingInterceptorsFormatter$1; } -var mockAgent; -var hasRequiredMockAgent; +var mockAgent$1; +var hasRequiredMockAgent$1; -function requireMockAgent () { - if (hasRequiredMockAgent) return mockAgent; - hasRequiredMockAgent = 1; +function requireMockAgent$1 () { + if (hasRequiredMockAgent$1) return mockAgent$1; + hasRequiredMockAgent$1 = 1; - const { kClients } = requireSymbols$4(); - const Agent = requireAgent(); + const { kClients } = requireSymbols$9(); + const Agent = requireAgent$1(); const { kAgent, kMockAgentSet, @@ -14249,24 +15966,14 @@ function requireMockAgent () { kGetNetConnect, kOptions, kFactory - } = requireMockSymbols(); - const MockClient = requireMockClient(); - const MockPool = requireMockPool(); - const { matchValue, buildMockOptions } = requireMockUtils(); - const { InvalidArgumentError, UndiciError } = requireErrors$1(); - const Dispatcher = requireDispatcher(); - const Pluralizer = requirePluralizer(); - const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter(); - - class FakeWeakRef { - constructor (value) { - this.value = value; - } - - deref () { - return this.value - } - } + } = requireMockSymbols$1(); + const MockClient = requireMockClient$1(); + const MockPool = requireMockPool$1(); + const { matchValue, buildMockOptions } = requireMockUtils$1(); + const { InvalidArgumentError, UndiciError } = requireErrors$2(); + const Dispatcher = requireDispatcher$1(); + const Pluralizer = requirePluralizer$1(); + const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter$1(); class MockAgent extends Dispatcher { constructor (opts) { @@ -14276,10 +15983,10 @@ function requireMockAgent () { this[kIsMockActive] = true; // Instantiate Agent and encapsulate - if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) { + if ((opts?.agent && typeof opts.agent.dispatch !== 'function')) { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } - const agent = opts && opts.agent ? opts.agent : new Agent(opts); + const agent = opts?.agent ? opts.agent : new Agent(opts); this[kAgent] = agent; this[kClients] = agent[kClients]; @@ -14340,7 +16047,7 @@ function requireMockAgent () { } [kMockAgentSet] (origin, dispatcher) { - this[kClients].set(origin, new FakeWeakRef(dispatcher)); + this[kClients].set(origin, dispatcher); } [kFactory] (origin) { @@ -14352,9 +16059,9 @@ function requireMockAgent () { [kMockAgentGet] (origin) { // First check if we can immediately find it - const ref = this[kClients].get(origin); - if (ref) { - return ref.deref() + const client = this[kClients].get(origin); + if (client) { + return client } // If the origin is not a string create a dummy parent pool and return to user @@ -14365,8 +16072,7 @@ function requireMockAgent () { } // If we match, create a pool and assign the same dispatches - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref(); + for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) { if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { const dispatcher = this[kFactory](origin); this[kMockAgentSet](origin, dispatcher); @@ -14384,7 +16090,7 @@ function requireMockAgent () { const mockAgentClients = this[kClients]; return Array.from(mockAgentClients.entries()) - .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin }))) + .flatMap(([origin, scope]) => scope[kDispatches].map(dispatch => ({ ...dispatch, origin }))) .filter(({ pending }) => pending) } @@ -14405,653 +16111,692 @@ ${pendingInterceptorsFormatter.format(pending)} } } - mockAgent = MockAgent; - return mockAgent; + mockAgent$1 = MockAgent; + return mockAgent$1; } -var proxyAgent; -var hasRequiredProxyAgent; - -function requireProxyAgent () { - if (hasRequiredProxyAgent) return proxyAgent; - hasRequiredProxyAgent = 1; +var global$3; +var hasRequiredGlobal$2; - const { kProxy, kClose, kDestroy, kInterceptors } = requireSymbols$4(); - const { URL } = require$$5$1; - const Agent = requireAgent(); - const Pool = requirePool(); - const DispatcherBase = requireDispatcherBase(); - const { InvalidArgumentError, RequestAbortedError } = requireErrors$1(); - const buildConnector = requireConnect(); +function requireGlobal$2 () { + if (hasRequiredGlobal$2) return global$3; + hasRequiredGlobal$2 = 1; - const kAgent = Symbol('proxy agent'); - const kClient = Symbol('proxy client'); - const kProxyHeaders = Symbol('proxy headers'); - const kRequestTls = Symbol('request tls settings'); - const kProxyTls = Symbol('proxy tls settings'); - const kConnectEndpoint = Symbol('connect endpoint function'); + // We include a version number for the Dispatcher API. In case of breaking changes, + // this version number must be increased to avoid conflicts. + const globalDispatcher = Symbol.for('undici.globalDispatcher.1'); + const { InvalidArgumentError } = requireErrors$2(); + const Agent = requireAgent$1(); - function defaultProtocolPort (protocol) { - return protocol === 'https:' ? 443 : 80 + if (getGlobalDispatcher() === undefined) { + setGlobalDispatcher(new Agent()); } - function buildProxyOptions (opts) { - if (typeof opts === 'string') { - opts = { uri: opts }; - } - - if (!opts || !opts.uri) { - throw new InvalidArgumentError('Proxy opts.uri is mandatory') - } - - return { - uri: opts.uri, - protocol: opts.protocol || 'https' + function setGlobalDispatcher (agent) { + if (!agent || typeof agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument agent must implement Agent') } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }); } - function defaultFactory (origin, opts) { - return new Pool(origin, opts) + function getGlobalDispatcher () { + return globalThis[globalDispatcher] } - class ProxyAgent extends DispatcherBase { - constructor (opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) - ? opts.interceptors.ProxyAgent - : []; + global$3 = { + setGlobalDispatcher, + getGlobalDispatcher + }; + return global$3; +} - if (typeof opts === 'string') { - opts = { uri: opts }; - } +var decoratorHandler$1; +var hasRequiredDecoratorHandler$1; - if (!opts || !opts.uri) { - throw new InvalidArgumentError('Proxy opts.uri is mandatory') - } +function requireDecoratorHandler$1 () { + if (hasRequiredDecoratorHandler$1) return decoratorHandler$1; + hasRequiredDecoratorHandler$1 = 1; - const { clientFactory = defaultFactory } = opts; + decoratorHandler$1 = class DecoratorHandler { + #handler - if (typeof clientFactory !== 'function') { - throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') + constructor (handler) { + if (typeof handler !== 'object' || handler === null) { + throw new TypeError('handler must be an object') } + this.#handler = handler; + } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; + onConnect (...args) { + return this.#handler.onConnect?.(...args) + } - const resolvedUrl = new URL(opts.uri); - const { origin, port, host, username, password } = resolvedUrl; + onError (...args) { + return this.#handler.onError?.(...args) + } - if (opts.auth && opts.token) { - throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') - } else if (opts.auth) { - /* @deprecated in favour of opts.token */ - this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]['proxy-authorization'] = opts.token; - } else if (username && password) { - this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`; - } + onUpgrade (...args) { + return this.#handler.onUpgrade?.(...args) + } - const connect = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts, callback) => { - let requestedHost = opts.host; - if (!opts.port) { - requestedHost += `:${defaultProtocolPort(opts.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts.signal, - headers: { - ...this[kProxyHeaders], - host - } - }); - if (statusCode !== 200) { - socket.on('error', () => {}).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - } - if (opts.protocol !== 'https:') { - callback(null, socket); - return - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts.servername; - } - this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } - } - }); + onResponseStarted (...args) { + return this.#handler.onResponseStarted?.(...args) } - dispatch (opts, handler) { - const { host } = new URL(opts.origin); - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - return this[kAgent].dispatch( - { - ...opts, - headers: { - ...headers, - host - } - }, - handler - ) + onHeaders (...args) { + return this.#handler.onHeaders?.(...args) } - async [kClose] () { - await this[kAgent].close(); - await this[kClient].close(); + onData (...args) { + return this.#handler.onData?.(...args) } - async [kDestroy] () { - await this[kAgent].destroy(); - await this[kClient].destroy(); + onComplete (...args) { + return this.#handler.onComplete?.(...args) } - } - /** - * @param {string[] | Record} headers - * @returns {Record} - */ - function buildHeaders (headers) { - // When using undici.fetch, the headers list is stored - // as an array. - if (Array.isArray(headers)) { - /** @type {Record} */ - const headersPair = {}; + onBodySent (...args) { + return this.#handler.onBodySent?.(...args) + } + }; + return decoratorHandler$1; +} - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } +var redirect$1; +var hasRequiredRedirect$1; - return headersPair - } +function requireRedirect$1 () { + if (hasRequiredRedirect$1) return redirect$1; + hasRequiredRedirect$1 = 1; + const RedirectHandler = requireRedirectHandler$1(); - return headers - } + redirect$1 = opts => { + const globalMaxRedirections = opts?.maxRedirections; + return dispatch => { + return function redirectInterceptor (opts, handler) { + const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts; - /** - * @param {Record} headers - * - * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers - * Nevertheless, it was changed and to avoid a security vulnerability by end users - * this check was created. - * It should be removed in the next major version for performance reasons - */ - function throwIfProxyAuthIsSent (headers) { - const existProxyAuth = headers && Object.keys(headers) - .find((key) => key.toLowerCase() === 'proxy-authorization'); - if (existProxyAuth) { - throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') + if (!maxRedirections) { + return dispatch(opts, handler) + } + + const redirectHandler = new RedirectHandler( + dispatch, + maxRedirections, + opts, + handler + ); + + return dispatch(baseOpts, redirectHandler) + } } - } + }; + return redirect$1; +} - proxyAgent = ProxyAgent; - return proxyAgent; +var retry$1; +var hasRequiredRetry$1; + +function requireRetry$1 () { + if (hasRequiredRetry$1) return retry$1; + hasRequiredRetry$1 = 1; + const RetryHandler = requireRetryHandler$1(); + + retry$1 = globalOpts => { + return dispatch => { + return function retryInterceptor (opts, handler) { + return dispatch( + opts, + new RetryHandler( + { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, + { + handler, + dispatch + } + ) + ) + } + } + }; + return retry$1; } -var RetryHandler_1; -var hasRequiredRetryHandler; +var dump$1; +var hasRequiredDump$1; -function requireRetryHandler () { - if (hasRequiredRetryHandler) return RetryHandler_1; - hasRequiredRetryHandler = 1; - const assert = require$$0$8; +function requireDump$1 () { + if (hasRequiredDump$1) return dump$1; + hasRequiredDump$1 = 1; - const { kRetryHandlerDefaultRetry } = requireSymbols$4(); - const { RequestRetryError } = requireErrors$1(); - const { isDisturbed, parseHeaders, parseRangeHeader } = requireUtil$8(); + const util = requireUtil$h(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$2(); + const DecoratorHandler = requireDecoratorHandler$1(); - function calculateRetryAfterHeader (retryAfter) { - const current = Date.now(); - const diff = new Date(retryAfter).getTime() - current; + class DumpHandler extends DecoratorHandler { + #maxSize = 1024 * 1024 + #abort = null + #dumped = false + #aborted = false + #size = 0 + #reason = null + #handler = null - return diff - } + constructor ({ maxSize }, handler) { + super(handler); - class RetryHandler { - constructor (opts, handlers) { - const { retryOptions, ...dispatchOpts } = opts; - const { - // Retry scoped - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - // Response scoped - methods, - errorCodes, - retryAfter, - statusCodes - } = retryOptions ?? {}; + if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { + throw new InvalidArgumentError('maxSize must be a number greater than 0') + } - this.dispatch = handlers.dispatch; - this.handler = handlers.handler; - this.opts = dispatchOpts; - this.abort = null; - this.aborted = false; - this.retryOpts = { - retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1000, // 30s, - timeout: minTimeout ?? 500, // .5s - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - // What errors we should retry - methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], - // Indicates which errors to retry - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - // List of errors to retry - errorCodes: errorCodes ?? [ - 'ECONNRESET', - 'ECONNREFUSED', - 'ENOTFOUND', - 'ENETDOWN', - 'ENETUNREACH', - 'EHOSTDOWN', - 'EHOSTUNREACH', - 'EPIPE' - ] - }; + this.#maxSize = maxSize ?? this.#maxSize; + this.#handler = handler; + } - this.retryCount = 0; - this.start = 0; - this.end = null; - this.etag = null; - this.resume = null; + onConnect (abort) { + this.#abort = abort; - // Handle possible onConnect duplication - this.handler.onConnect(reason => { - this.aborted = true; - if (this.abort) { - this.abort(reason); - } else { - this.reason = reason; - } - }); + this.#handler.onConnect(this.#customAbort.bind(this)); } - onRequestSent () { - if (this.handler.onRequestSent) { - this.handler.onRequestSent(); - } + #customAbort (reason) { + this.#aborted = true; + this.#reason = reason; } - onUpgrade (statusCode, headers, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers, socket); + // TODO: will require adjustment after new hooks are out + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = util.parseHeaders(rawHeaders); + const contentLength = headers['content-length']; + + if (contentLength != null && contentLength > this.#maxSize) { + throw new RequestAbortedError( + `Response size (${contentLength}) larger than maxSize (${ + this.#maxSize + })` + ) + } + + if (this.#aborted) { + return true } + + return this.#handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) } - onConnect (abort) { - if (this.aborted) { - abort(this.reason); - } else { - this.abort = abort; + onError (err) { + if (this.#dumped) { + return } + + err = this.#reason ?? err; + + this.#handler.onError(err); } - onBodySent (chunk) { - if (this.handler.onBodySent) return this.handler.onBodySent(chunk) + onData (chunk) { + this.#size = this.#size + chunk.length; + + if (this.#size >= this.#maxSize) { + this.#dumped = true; + + if (this.#aborted) { + this.#handler.onError(this.#reason); + } else { + this.#handler.onComplete([]); + } + } + + return true } - static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { - const { statusCode, code, headers } = err; - const { method, retryOptions } = opts; - const { - maxRetries, - timeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions; - let { counter, currentTimeout } = state; - - currentTimeout = - currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; - - // Any code that is not a Undici's originated and allowed to retry - if ( - code && - code !== 'UND_ERR_REQ_RETRY' && - code !== 'UND_ERR_SOCKET' && - !errorCodes.includes(code) - ) { - cb(err); - return - } - - // If a set of method are provided and the current method is not in the list - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err); - return - } - - // If a set of status code are provided and the current status code is not in the list - if ( - statusCode != null && - Array.isArray(statusCodes) && - !statusCodes.includes(statusCode) - ) { - cb(err); + onComplete (trailers) { + if (this.#dumped) { return } - // If we reached the max number of retries - if (counter > maxRetries) { - cb(err); + if (this.#aborted) { + this.#handler.onError(this.reason); return } - let retryAfterHeader = headers != null && headers['retry-after']; - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader); - retryAfterHeader = isNaN(retryAfterHeader) - ? calculateRetryAfterHeader(retryAfterHeader) - : retryAfterHeader * 1e3; // Retry-After is in seconds - } - - const retryTimeout = - retryAfterHeader > 0 - ? Math.min(retryAfterHeader, maxTimeout) - : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); - - state.currentTimeout = retryTimeout; - - setTimeout(() => cb(null), retryTimeout); + this.#handler.onComplete(trailers); } + } - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const headers = parseHeaders(rawHeaders); - - this.retryCount += 1; + function createDumpInterceptor ( + { maxSize: defaultMaxSize } = { + maxSize: 1024 * 1024 + } + ) { + return dispatch => { + return function Intercept (opts, handler) { + const { dumpMaxSize = defaultMaxSize } = + opts; - if (statusCode >= 300) { - this.abort( - new RequestRetryError('Request failed', statusCode, { - headers, - count: this.retryCount - }) + const dumpHandler = new DumpHandler( + { maxSize: dumpMaxSize }, + handler ); - return false + + return dispatch(opts, dumpHandler) } + } + } - // Checkpoint for resume from where we left it - if (this.resume != null) { - this.resume = null; + dump$1 = createDumpInterceptor; + return dump$1; +} - if (statusCode !== 206) { - return true - } +var dns$1; +var hasRequiredDns$1; - const contentRange = parseRangeHeader(headers['content-range']); - // If no content range - if (!contentRange) { - this.abort( - new RequestRetryError('Content-Range mismatch', statusCode, { - headers, - count: this.retryCount - }) - ); - return false - } +function requireDns$1 () { + if (hasRequiredDns$1) return dns$1; + hasRequiredDns$1 = 1; + const { isIP } = require$$0$9; + const { lookup } = require$$1$6; + const DecoratorHandler = requireDecoratorHandler$1(); + const { InvalidArgumentError, InformationalError } = requireErrors$2(); + const maxInt = Math.pow(2, 31) - 1; - // Let's start with a weak etag check - if (this.etag != null && this.etag !== headers.etag) { - this.abort( - new RequestRetryError('ETag mismatch', statusCode, { - headers, - count: this.retryCount - }) - ); - return false - } + class DNSInstance { + #maxTTL = 0 + #maxItems = 0 + #records = new Map() + dualStack = true + affinity = null + lookup = null + pick = null - const { start, size, end = size } = contentRange; + constructor (opts) { + this.#maxTTL = opts.maxTTL; + this.#maxItems = opts.maxItems; + this.dualStack = opts.dualStack; + this.affinity = opts.affinity; + this.lookup = opts.lookup ?? this.#defaultLookup; + this.pick = opts.pick ?? this.#defaultPick; + } - assert(this.start === start, 'content-range mismatch'); - assert(this.end == null || this.end === end, 'content-range mismatch'); + get full () { + return this.#records.size === this.#maxItems + } - this.resume = resume; - return true + runLookup (origin, opts, cb) { + const ips = this.#records.get(origin.hostname); + + // If full, we just return the origin + if (ips == null && this.full) { + cb(null, origin.origin); + return } - if (this.end == null) { - if (statusCode === 206) { - // First time we receive 206 - const range = parseRangeHeader(headers['content-range']); + const newOpts = { + affinity: this.affinity, + dualStack: this.dualStack, + lookup: this.lookup, + pick: this.pick, + ...opts.dns, + maxTTL: this.#maxTTL, + maxItems: this.#maxItems + }; - if (range == null) { - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) + // If no IPs we lookup + if (ips == null) { + this.lookup(origin, newOpts, (err, addresses) => { + if (err || addresses == null || addresses.length === 0) { + cb(err ?? new InformationalError('No DNS entries found')); + return } - const { start, size, end = size } = range; + this.setRecords(origin, addresses); + const records = this.#records.get(origin.hostname); - assert( - start != null && Number.isFinite(start) && this.start !== start, - 'content-range mismatch' + const ip = this.pick( + origin, + records, + newOpts.affinity ); - assert(Number.isFinite(start)); - assert( - end != null && Number.isFinite(end) && this.end !== end, - 'invalid content-length' + + let port; + if (typeof ip.port === 'number') { + port = `:${ip.port}`; + } else if (origin.port !== '') { + port = `:${origin.port}`; + } else { + port = ''; + } + + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` ); + }); + } else { + // If there's IPs we pick + const ip = this.pick( + origin, + ips, + newOpts.affinity + ); - this.start = start; - this.end = end; + // If no IPs we lookup - deleting old records + if (ip == null) { + this.#records.delete(origin.hostname); + this.runLookup(origin, opts, cb); + return } - // We make our best to checkpoint the body for further range headers - if (this.end == null) { - const contentLength = headers['content-length']; - this.end = contentLength != null ? Number(contentLength) : null; + let port; + if (typeof ip.port === 'number') { + port = `:${ip.port}`; + } else if (origin.port !== '') { + port = `:${origin.port}`; + } else { + port = ''; } - assert(Number.isFinite(this.start)); - assert( - this.end == null || Number.isFinite(this.end), - 'invalid content-length' + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` ); - - this.resume = resume; - this.etag = headers.etag != null ? headers.etag : null; - - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) } + } - const err = new RequestRetryError('Request failed', statusCode, { - headers, - count: this.retryCount - }); + #defaultLookup (origin, opts, cb) { + lookup( + origin.hostname, + { + all: true, + family: this.dualStack === false ? this.affinity : 0, + order: 'ipv4first' + }, + (err, addresses) => { + if (err) { + return cb(err) + } - this.abort(err); + const results = new Map(); - return false + for (const addr of addresses) { + // On linux we found duplicates, we attempt to remove them with + // the latest record + results.set(`${addr.address}:${addr.family}`, addr); + } + + cb(null, results.values()); + } + ); } - onData (chunk) { - this.start += chunk.length; + #defaultPick (origin, hostnameRecords, affinity) { + let ip = null; + const { records, offset } = hostnameRecords; - return this.handler.onData(chunk) - } + let family; + if (this.dualStack) { + if (affinity == null) { + // Balance between ip families + if (offset == null || offset === maxInt) { + hostnameRecords.offset = 0; + affinity = 4; + } else { + hostnameRecords.offset++; + affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4; + } + } - onComplete (rawTrailers) { - this.retryCount = 0; - return this.handler.onComplete(rawTrailers) - } + if (records[affinity] != null && records[affinity].ips.length > 0) { + family = records[affinity]; + } else { + family = records[affinity === 4 ? 6 : 4]; + } + } else { + family = records[affinity]; + } - onError (err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) + // If no IPs we return null + if (family == null || family.ips.length === 0) { + return ip } - this.retryOpts.retry( - err, - { - state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, - onRetry.bind(this) - ); + if (family.offset == null || family.offset === maxInt) { + family.offset = 0; + } else { + family.offset++; + } - function onRetry (err) { - if (err != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) - } + const position = family.offset % family.ips.length; + ip = family.ips[position] ?? null; - if (this.start !== 0) { - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - range: `bytes=${this.start}-${this.end ?? ''}` - } - }; - } + if (ip == null) { + return ip + } - try { - this.dispatch(this.opts, this); - } catch (err) { - this.handler.onError(err); - } + if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms + // We delete expired records + // It is possible that they have different TTL, so we manage them individually + family.ips.splice(position, 1); + return this.pick(origin, hostnameRecords, affinity) } + + return ip } - } - RetryHandler_1 = RetryHandler; - return RetryHandler_1; -} + setRecords (origin, addresses) { + const timestamp = Date.now(); + const records = { records: { 4: null, 6: null } }; + for (const record of addresses) { + record.timestamp = timestamp; + if (typeof record.ttl === 'number') { + // The record TTL is expected to be in ms + record.ttl = Math.min(record.ttl, this.#maxTTL); + } else { + record.ttl = this.#maxTTL; + } -var global$1; -var hasRequiredGlobal; + const familyRecords = records.records[record.family] ?? { ips: [] }; -function requireGlobal () { - if (hasRequiredGlobal) return global$1; - hasRequiredGlobal = 1; + familyRecords.ips.push(record); + records.records[record.family] = familyRecords; + } - // We include a version number for the Dispatcher API. In case of breaking changes, - // this version number must be increased to avoid conflicts. - const globalDispatcher = Symbol.for('undici.globalDispatcher.1'); - const { InvalidArgumentError } = requireErrors$1(); - const Agent = requireAgent(); + this.#records.set(origin.hostname, records); + } - if (getGlobalDispatcher() === undefined) { - setGlobalDispatcher(new Agent()); + getHandler (meta, opts) { + return new DNSDispatchHandler(this, meta, opts) + } } - function setGlobalDispatcher (agent) { - if (!agent || typeof agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument agent must implement Agent') + class DNSDispatchHandler extends DecoratorHandler { + #state = null + #opts = null + #dispatch = null + #handler = null + #origin = null + + constructor (state, { origin, handler, dispatch }, opts) { + super(handler); + this.#origin = origin; + this.#handler = handler; + this.#opts = { ...opts }; + this.#state = state; + this.#dispatch = dispatch; } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher () { - return globalThis[globalDispatcher] - } + onError (err) { + switch (err.code) { + case 'ETIMEDOUT': + case 'ECONNREFUSED': { + if (this.#state.dualStack) { + // We delete the record and retry + this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => { + if (err) { + return this.#handler.onError(err) + } - global$1 = { - setGlobalDispatcher, - getGlobalDispatcher - }; - return global$1; -} + const dispatchOpts = { + ...this.#opts, + origin: newOrigin + }; -var DecoratorHandler_1; -var hasRequiredDecoratorHandler; + this.#dispatch(dispatchOpts, this); + }); -function requireDecoratorHandler () { - if (hasRequiredDecoratorHandler) return DecoratorHandler_1; - hasRequiredDecoratorHandler = 1; + // if dual-stack disabled, we error out + return + } - DecoratorHandler_1 = class DecoratorHandler { - constructor (handler) { - this.handler = handler; + this.#handler.onError(err); + return + } + case 'ENOTFOUND': + this.#state.deleteRecord(this.#origin); + // eslint-disable-next-line no-fallthrough + default: + this.#handler.onError(err); + break + } } + } - onConnect (...args) { - return this.handler.onConnect(...args) + dns$1 = interceptorOpts => { + if ( + interceptorOpts?.maxTTL != null && + (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0) + ) { + throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number') } - onError (...args) { - return this.handler.onError(...args) + if ( + interceptorOpts?.maxItems != null && + (typeof interceptorOpts?.maxItems !== 'number' || + interceptorOpts?.maxItems < 1) + ) { + throw new InvalidArgumentError( + 'Invalid maxItems. Must be a positive number and greater than zero' + ) } - onUpgrade (...args) { - return this.handler.onUpgrade(...args) + if ( + interceptorOpts?.affinity != null && + interceptorOpts?.affinity !== 4 && + interceptorOpts?.affinity !== 6 + ) { + throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6') } - onHeaders (...args) { - return this.handler.onHeaders(...args) + if ( + interceptorOpts?.dualStack != null && + typeof interceptorOpts?.dualStack !== 'boolean' + ) { + throw new InvalidArgumentError('Invalid dualStack. Must be a boolean') } - onData (...args) { - return this.handler.onData(...args) + if ( + interceptorOpts?.lookup != null && + typeof interceptorOpts?.lookup !== 'function' + ) { + throw new InvalidArgumentError('Invalid lookup. Must be a function') } - onComplete (...args) { - return this.handler.onComplete(...args) + if ( + interceptorOpts?.pick != null && + typeof interceptorOpts?.pick !== 'function' + ) { + throw new InvalidArgumentError('Invalid pick. Must be a function') } - onBodySent (...args) { - return this.handler.onBodySent(...args) + const dualStack = interceptorOpts?.dualStack ?? true; + let affinity; + if (dualStack) { + affinity = interceptorOpts?.affinity ?? null; + } else { + affinity = interceptorOpts?.affinity ?? 4; + } + + const opts = { + maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms + lookup: interceptorOpts?.lookup ?? null, + pick: interceptorOpts?.pick ?? null, + dualStack, + affinity, + maxItems: interceptorOpts?.maxItems ?? Infinity + }; + + const instance = new DNSInstance(opts); + + return dispatch => { + return function dnsInterceptor (origDispatchOpts, handler) { + const origin = + origDispatchOpts.origin.constructor === URL + ? origDispatchOpts.origin + : new URL(origDispatchOpts.origin); + + if (isIP(origin.hostname) !== 0) { + return dispatch(origDispatchOpts, handler) + } + + instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { + if (err) { + return handler.onError(err) + } + + let dispatchOpts = null; + dispatchOpts = { + ...origDispatchOpts, + servername: origin.hostname, // For SNI on TLS + origin: newOrigin, + headers: { + host: origin.hostname, + ...origDispatchOpts.headers + } + }; + + dispatch( + dispatchOpts, + instance.getHandler({ origin, dispatch, handler }, origDispatchOpts) + ); + }); + + return true + } } }; - return DecoratorHandler_1; + return dns$1; } -var headers; -var hasRequiredHeaders; +var headers$1; +var hasRequiredHeaders$1; -function requireHeaders () { - if (hasRequiredHeaders) return headers; - hasRequiredHeaders = 1; +function requireHeaders$1 () { + if (hasRequiredHeaders$1) return headers$1; + hasRequiredHeaders$1 = 1; - const { kHeadersList, kConstruct } = requireSymbols$4(); - const { kGuard } = requireSymbols$3(); - const { kEnumerableProperty } = requireUtil$8(); + const { kConstruct } = requireSymbols$9(); + const { kEnumerableProperty } = requireUtil$h(); const { - makeIterator, + iteratorMixin, isValidHeaderName, isValidHeaderValue - } = requireUtil$7(); - const util = require$$0$6; - const { webidl } = requireWebidl(); - const assert = require$$0$8; + } = requireUtil$g(); + const { webidl } = requireWebidl$1(); + const assert = require$$0$7; + const util = require$$0$a; const kHeadersMap = Symbol('headers map'); const kHeadersSortedMap = Symbol('headers map sorted'); @@ -15142,21 +16887,27 @@ function requireHeaders () { // 3. If headers’s guard is "immutable", then throw a TypeError. // 4. Otherwise, if headers’s guard is "request" and name is a // forbidden header name, return. + // 5. Otherwise, if headers’s guard is "request-no-cors": + // TODO // Note: undici does not implement forbidden header names - if (headers[kGuard] === 'immutable') { + if (getHeadersGuard(headers) === 'immutable') { throw new TypeError('immutable') - } else if (headers[kGuard] === 'request-no-cors') ; + } // 6. Otherwise, if headers’s guard is "response" and name is a // forbidden response-header name, return. // 7. Append (name, value) to headers’s header list. - return headers[kHeadersList].append(name, value) + return getHeadersList(headers).append(name, value, false) // 8. If headers’s guard is "request-no-cors", then remove // privileged no-CORS request headers from headers } + function compareHeaderName (a, b) { + return a[0] < b[0] ? -1 : 1 + } + class HeadersList { /** @type {[string, string][]|null} */ cookies = null @@ -15172,14 +16923,17 @@ function requireHeaders () { } } - // https://fetch.spec.whatwg.org/#header-list-contains - contains (name) { + /** + * @see https://fetch.spec.whatwg.org/#header-list-contains + * @param {string} name + * @param {boolean} isLowerCase + */ + contains (name, isLowerCase) { // A header list list contains a header name name if list // contains a header whose name is a byte-case-insensitive // match for name. - name = name.toLowerCase(); - return this[kHeadersMap].has(name) + return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase()) } clear () { @@ -15188,13 +16942,18 @@ function requireHeaders () { this.cookies = null; } - // https://fetch.spec.whatwg.org/#concept-header-list-append - append (name, value) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-append + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + append (name, value, isLowerCase) { this[kHeadersSortedMap] = null; // 1. If list contains name, then set name to the first such // header’s name. - const lowercaseName = name.toLowerCase(); + const lowercaseName = isLowerCase ? name : name.toLowerCase(); const exists = this[kHeadersMap].get(lowercaseName); // 2. Append (name, value) to list. @@ -15209,15 +16968,19 @@ function requireHeaders () { } if (lowercaseName === 'set-cookie') { - this.cookies ??= []; - this.cookies.push(value); + (this.cookies ??= []).push(value); } } - // https://fetch.spec.whatwg.org/#concept-header-list-set - set (name, value) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-set + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + set (name, value, isLowerCase) { this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); + const lowercaseName = isLowerCase ? name : name.toLowerCase(); if (lowercaseName === 'set-cookie') { this.cookies = [value]; @@ -15230,11 +16993,14 @@ function requireHeaders () { this[kHeadersMap].set(lowercaseName, { name, value }); } - // https://fetch.spec.whatwg.org/#concept-header-list-delete - delete (name) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-delete + * @param {string} name + * @param {boolean} isLowerCase + */ + delete (name, isLowerCase) { this[kHeadersSortedMap] = null; - - name = name.toLowerCase(); + if (!isLowerCase) name = name.toLowerCase(); if (name === 'set-cookie') { this.cookies = null; @@ -15243,20 +17009,23 @@ function requireHeaders () { this[kHeadersMap].delete(name); } - // https://fetch.spec.whatwg.org/#concept-header-list-get - get (name) { - const value = this[kHeadersMap].get(name.toLowerCase()); - + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get + * @param {string} name + * @param {boolean} isLowerCase + * @returns {string | null} + */ + get (name, isLowerCase) { // 1. If list does not contain name, then return null. // 2. Return the values of all headers in list whose name // is a byte-case-insensitive match for name, // separated from each other by 0x2C 0x20, in order. - return value === undefined ? null : value.value + return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null } * [Symbol.iterator] () { // use the lowercased name - for (const [name, { value }] of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { yield [name, value]; } } @@ -15264,7 +17033,7 @@ function requireHeaders () { get entries () { const headers = {}; - if (this[kHeadersMap].size) { + if (this[kHeadersMap].size !== 0) { for (const { name, value } of this[kHeadersMap].values()) { headers[name] = value; } @@ -15272,24 +17041,125 @@ function requireHeaders () { return headers } + + rawValues () { + return this[kHeadersMap].values() + } + + get entriesList () { + const headers = []; + + if (this[kHeadersMap].size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) { + if (lowerName === 'set-cookie') { + for (const cookie of this.cookies) { + headers.push([name, cookie]); + } + } else { + headers.push([name, value]); + } + } + } + + return headers + } + + // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set + toSortedArray () { + const size = this[kHeadersMap].size; + const array = new Array(size); + // In most cases, you will use the fast-path. + // fast-path: Use binary insertion sort for small arrays. + if (size <= 32) { + if (size === 0) { + // If empty, it is an empty array. To avoid the first index assignment. + return array + } + // Improve performance by unrolling loop and avoiding double-loop. + // Double-loop-less version of the binary insertion sort. + const iterator = this[kHeadersMap][Symbol.iterator](); + const firstValue = iterator.next().value; + // set [name, value] to first index. + array[0] = [firstValue[0], firstValue[1].value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(firstValue[1].value !== null); + for ( + let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value; + i < size; + ++i + ) { + // get next value + value = iterator.next().value; + // set [name, value] to current index. + x = array[i] = [value[0], value[1].value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(x[1] !== null); + left = 0; + right = i; + // binary search + while (left < right) { + // middle index + pivot = left + ((right - left) >> 1); + // compare header name + if (array[pivot][0] <= x[0]) { + left = pivot + 1; + } else { + right = pivot; + } + } + if (i !== pivot) { + j = i; + while (j > left) { + array[j] = array[--j]; + } + array[left] = x; + } + } + /* c8 ignore next 4 */ + if (!iterator.next().done) { + // This is for debugging and will never be called. + throw new TypeError('Unreachable') + } + return array + } else { + // This case would be a rare occurrence. + // slow-path: fallback + let i = 0; + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + array[i++] = [name, value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(value !== null); + } + return array.sort(compareHeaderName) + } + } } // https://fetch.spec.whatwg.org/#headers-class class Headers { + #guard + #headersList + constructor (init = undefined) { + webidl.util.markAsUncloneable(this); + if (init === kConstruct) { return } - this[kHeadersList] = new HeadersList(); + + this.#headersList = new HeadersList(); // The new Headers(init) constructor steps are: // 1. Set this’s guard to "none". - this[kGuard] = 'none'; + this.#guard = 'none'; // 2. If init is given, then fill this with init. if (init !== undefined) { - init = webidl.converters.HeadersInit(init); + init = webidl.converters.HeadersInit(init, 'Headers contructor', 'init'); fill(this, init); } } @@ -15298,10 +17168,11 @@ function requireHeaders () { append (name, value) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' }); + webidl.argumentLengthCheck(arguments, 2, 'Headers.append'); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); + const prefix = 'Headers.append'; + name = webidl.converters.ByteString(name, prefix, 'name'); + value = webidl.converters.ByteString(value, prefix, 'value'); return appendHeader(this, name, value) } @@ -15310,9 +17181,10 @@ function requireHeaders () { delete (name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' }); + webidl.argumentLengthCheck(arguments, 1, 'Headers.delete'); - name = webidl.converters.ByteString(name); + const prefix = 'Headers.delete'; + name = webidl.converters.ByteString(name, prefix, 'name'); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { @@ -15333,34 +17205,35 @@ function requireHeaders () { // 5. Otherwise, if this’s guard is "response" and name is // a forbidden response-header name, return. // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { + if (this.#guard === 'immutable') { throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') ; + } // 6. If this’s header list does not contain name, then // return. - if (!this[kHeadersList].contains(name)) { + if (!this.#headersList.contains(name, false)) { return } // 7. Delete name from this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this. - this[kHeadersList].delete(name); + this.#headersList.delete(name, false); } // https://fetch.spec.whatwg.org/#dom-headers-get get (name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' }); + webidl.argumentLengthCheck(arguments, 1, 'Headers.get'); - name = webidl.converters.ByteString(name); + const prefix = 'Headers.get'; + name = webidl.converters.ByteString(name, prefix, 'name'); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.get', + prefix, value: name, type: 'header name' }) @@ -15368,21 +17241,22 @@ function requireHeaders () { // 2. Return the result of getting name from this’s header // list. - return this[kHeadersList].get(name) + return this.#headersList.get(name, false) } // https://fetch.spec.whatwg.org/#dom-headers-has has (name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' }); + webidl.argumentLengthCheck(arguments, 1, 'Headers.has'); - name = webidl.converters.ByteString(name); + const prefix = 'Headers.has'; + name = webidl.converters.ByteString(name, prefix, 'name'); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.has', + prefix, value: name, type: 'header name' }) @@ -15390,17 +17264,18 @@ function requireHeaders () { // 2. Return true if this’s header list contains name; // otherwise false. - return this[kHeadersList].contains(name) + return this.#headersList.contains(name, false) } // https://fetch.spec.whatwg.org/#dom-headers-set set (name, value) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' }); + webidl.argumentLengthCheck(arguments, 2, 'Headers.set'); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); + const prefix = 'Headers.set'; + name = webidl.converters.ByteString(name, prefix, 'name'); + value = webidl.converters.ByteString(value, prefix, 'value'); // 1. Normalize value. value = headerValueNormalize(value); @@ -15409,13 +17284,13 @@ function requireHeaders () { // header value, then throw a TypeError. if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.set', + prefix, value: name, type: 'header name' }) } else if (!isValidHeaderValue(value)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.set', + prefix, value, type: 'header value' }) @@ -15430,14 +17305,14 @@ function requireHeaders () { // 6. Otherwise, if this’s guard is "response" and name is a // forbidden response-header name, return. // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { + if (this.#guard === 'immutable') { throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') ; + } // 7. Set (name, value) in this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this - this[kHeadersList].set(name, value); + this.#headersList.set(name, value, false); } // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie @@ -15448,7 +17323,7 @@ function requireHeaders () { // 2. Return the values of all headers in this’s header list whose name is // a byte-case-insensitive match for `Set-Cookie`, in order. - const list = this[kHeadersList].cookies; + const list = this.#headersList.cookies; if (list) { return [...list] @@ -15459,8 +17334,8 @@ function requireHeaders () { // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine get [kHeadersSortedMap] () { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap] + if (this.#headersList[kHeadersSortedMap]) { + return this.#headersList[kHeadersSortedMap] } // 1. Let headers be an empty list of headers with the key being the name @@ -15469,12 +17344,19 @@ function requireHeaders () { // 2. Let names be the result of convert header names to a sorted-lowercase // set with all the names of the headers in list. - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); - const cookies = this[kHeadersList].cookies; + const names = this.#headersList.toSortedArray(); + + const cookies = this.#headersList.cookies; + + // fast-path + if (cookies === null || cookies.length === 1) { + // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray` + return (this.#headersList[kHeadersSortedMap] = names) + } // 3. For each name of names: for (let i = 0; i < names.length; ++i) { - const [name, value] = names[i]; + const { 0: name, 1: value } = names[i]; // 1. If name is `set-cookie`, then: if (name === 'set-cookie') { // 1. Let values be a list of all values of headers in list whose name @@ -15491,95 +17373,47 @@ function requireHeaders () { // 1. Let value be the result of getting name from list. // 2. Assert: value is non-null. - assert(value !== null); + // Note: This operation was done by `HeadersList#toSortedArray`. // 3. Append (name, value) to headers. headers.push([name, value]); } } - this[kHeadersList][kHeadersSortedMap] = headers; - // 4. Return headers. - return headers + return (this.#headersList[kHeadersSortedMap] = headers) } - keys () { - webidl.brandCheck(this, Headers); - - if (this[kGuard] === 'immutable') { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, 'Headers', - 'key') - } + [util.inspect.custom] (depth, options) { + options.depth ??= depth; - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'key' - ) + return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}` } - values () { - webidl.brandCheck(this, Headers); - - if (this[kGuard] === 'immutable') { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, 'Headers', - 'value') - } - - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'value' - ) + static getHeadersGuard (o) { + return o.#guard } - entries () { - webidl.brandCheck(this, Headers); - - if (this[kGuard] === 'immutable') { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, 'Headers', - 'key+value') - } - - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'key+value' - ) + static setHeadersGuard (o, guard) { + o.#guard = guard; } - /** - * @param {(value: string, key: string, self: Headers) => void} callbackFn - * @param {unknown} thisArg - */ - forEach (callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, Headers); - - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' }); - - if (typeof callbackFn !== 'function') { - throw new TypeError( - "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." - ) - } - - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } + static getHeadersList (o) { + return o.#headersList } - [Symbol.for('nodejs.util.inspect.custom')] () { - webidl.brandCheck(this, Headers); - - return this[kHeadersList] + static setHeadersList (o, list) { + o.#headersList = list; } } - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers; + Reflect.deleteProperty(Headers, 'getHeadersGuard'); + Reflect.deleteProperty(Headers, 'setHeadersGuard'); + Reflect.deleteProperty(Headers, 'getHeadersList'); + Reflect.deleteProperty(Headers, 'setHeadersList'); + + iteratorMixin('Headers', Headers, kHeadersSortedMap, 0, 1); Object.defineProperties(Headers.prototype, { append: kEnumerableProperty, @@ -15588,11 +17422,6 @@ function requireHeaders () { has: kEnumerableProperty, set: kEnumerableProperty, getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, [Symbol.toStringTag]: { value: 'Headers', configurable: true @@ -15602,13 +17431,25 @@ function requireHeaders () { } }); - webidl.converters.HeadersInit = function (V) { + webidl.converters.HeadersInit = function (V, prefix, argument) { if (webidl.util.Type(V) === 'Object') { - if (V[Symbol.iterator]) { - return webidl.converters['sequence>'](V) + const iterator = Reflect.get(V, Symbol.iterator); + + // A work-around to ensure we send the properly-cased Headers when V is a Headers object. + // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please. + if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object + try { + return getHeadersList(V).entriesList + } catch { + // fall-through + } + } + + if (typeof iterator === 'function') { + return webidl.converters['sequence>'](V, prefix, argument, iterator.bind(V)) } - return webidl.converters['record'](V) + return webidl.converters['record'](V, prefix, argument) } throw webidl.errors.conversionFailed({ @@ -15618,24 +17459,31 @@ function requireHeaders () { }) }; - headers = { + headers$1 = { fill, + // for test. + compareHeaderName, Headers, - HeadersList + HeadersList, + getHeadersGuard, + setHeadersGuard, + setHeadersList, + getHeadersList }; - return headers; + return headers$1; } -var response$1; -var hasRequiredResponse$1; +var response$2; +var hasRequiredResponse$2; -function requireResponse$1 () { - if (hasRequiredResponse$1) return response$1; - hasRequiredResponse$1 = 1; +function requireResponse$2 () { + if (hasRequiredResponse$2) return response$2; + hasRequiredResponse$2 = 1; - const { Headers, HeadersList, fill } = requireHeaders(); - const { extractBody, cloneBody, mixinBody } = requireBody(); - const util = requireUtil$8(); + const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = requireHeaders$1(); + const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = requireBody$1(); + const util = requireUtil$h(); + const nodeUtil = require$$0$a; const { kEnumerableProperty } = util; const { isValidReasonPhrase, @@ -15644,47 +17492,38 @@ function requireResponse$1 () { isBlobLike, serializeJavascriptValueToJSONString, isErrorLike, - isomorphicEncode - } = requireUtil$7(); + isomorphicEncode, + environmentSettingsObject: relevantRealm + } = requireUtil$g(); const { redirectStatusSet, - nullBodyStatus, - DOMException - } = requireConstants$a(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { FormData } = requireFormdata(); - const { getGlobalOrigin } = requireGlobal$1(); - const { URLSerializer } = requireDataURL(); - const { kHeadersList, kConstruct } = requireSymbols$4(); - const assert = require$$0$8; - const { types } = require$$0$6; + nullBodyStatus + } = requireConstants$e(); + const { kState, kHeaders } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { FormData } = requireFormdata$1(); + const { URLSerializer } = requireDataUrl$1(); + const { kConstruct } = requireSymbols$9(); + const assert = require$$0$7; + const { types } = require$$0$a; - const ReadableStream = globalThis.ReadableStream || require$$14.ReadableStream; const textEncoder = new TextEncoder('utf-8'); // https://fetch.spec.whatwg.org/#response-class class Response { // Creates network error Response. static error () { - // TODO - const relevantRealm = { settingsObject: {} }; - // The static error() method steps are to return the result of creating a // Response object, given a new network error, "immutable", and this’s // relevant Realm. - const responseObject = new Response(); - responseObject[kState] = makeNetworkError(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; - responseObject[kHeaders][kGuard] = 'immutable'; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeNetworkError(), 'immutable'); + return responseObject } // https://fetch.spec.whatwg.org/#dom-response-json static json (data, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' }); + webidl.argumentLengthCheck(arguments, 1, 'Response.json'); if (init !== null) { init = webidl.converters.ResponseInit(init); @@ -15700,11 +17539,7 @@ function requireResponse$1 () { // 3. Let responseObject be the result of creating a Response object, given a new response, // "response", and this’s relevant Realm. - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = 'response'; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeResponse({}), 'response'); // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }); @@ -15715,9 +17550,7 @@ function requireResponse$1 () { // Creates a redirect Response that redirects to url with status status. static redirect (url, status = 302) { - const relevantRealm = { settingsObject: {} }; - - webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' }); + webidl.argumentLengthCheck(arguments, 1, 'Response.redirect'); url = webidl.converters.USVString(url); status = webidl.converters['unsigned short'](status); @@ -15728,24 +17561,19 @@ function requireResponse$1 () { // TODO: base-URL? let parsedURL; try { - parsedURL = new URL(url, getGlobalOrigin()); + parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl); } catch (err) { - throw Object.assign(new TypeError('Failed to parse URL from ' + url), { - cause: err - }) + throw new TypeError(`Failed to parse URL from ${url}`, { cause: err }) } // 3. If status is not a redirect status, then throw a RangeError. if (!redirectStatusSet.has(status)) { - throw new RangeError('Invalid status code ' + status) + throw new RangeError(`Invalid status code ${status}`) } // 4. Let responseObject be the result of creating a Response object, // given a new response, "immutable", and this’s relevant Realm. - const responseObject = new Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = 'immutable'; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeResponse({}), 'immutable'); // 5. Set responseObject’s response’s status to status. responseObject[kState].status = status; @@ -15754,7 +17582,7 @@ function requireResponse$1 () { const value = isomorphicEncode(URLSerializer(parsedURL)); // 7. Append `Location`/value to responseObject’s response’s header list. - responseObject[kState].headersList.append('location', value); + responseObject[kState].headersList.append('location', value, true); // 8. Return responseObject. return responseObject @@ -15762,15 +17590,17 @@ function requireResponse$1 () { // https://fetch.spec.whatwg.org/#dom-response constructor (body = null, init = {}) { + webidl.util.markAsUncloneable(this); + if (body === kConstruct) { + return + } + if (body !== null) { body = webidl.converters.BodyInit(body); } init = webidl.converters.ResponseInit(init); - // TODO - this[kRealm] = { settingsObject: {} }; - // 1. Set this’s response to a new response. this[kState] = makeResponse({}); @@ -15778,9 +17608,8 @@ function requireResponse$1 () { // Realm, whose header list is this’s response’s header list and guard // is "response". this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kGuard] = 'response'; - this[kHeaders][kHeadersList] = this[kState].headersList; - this[kHeaders][kRealm] = this[kRealm]; + setHeadersGuard(this[kHeaders], 'response'); + setHeadersList(this[kHeaders], this[kState].headersList); // 3. Let bodyWithType be null. let bodyWithType = null; @@ -15881,7 +17710,7 @@ function requireResponse$1 () { webidl.brandCheck(this, Response); // 1. If this is unusable, then throw a TypeError. - if (this.bodyUsed || (this.body && this.body.locked)) { + if (bodyUnusable(this)) { throw webidl.errors.exception({ header: 'Response.clone', message: 'Body has already been consumed.' @@ -15891,16 +17720,36 @@ function requireResponse$1 () { // 2. Let clonedResponse be the result of cloning this’s response. const clonedResponse = cloneResponse(this[kState]); + // Note: To re-register because of a new stream. + if (hasFinalizationRegistry && this[kState].body?.stream) { + streamRegistry.register(this, new WeakRef(this[kState].body.stream)); + } + // 3. Return the result of creating a Response object, given // clonedResponse, this’s headers’s guard, and this’s relevant Realm. - const clonedResponseObject = new Response(); - clonedResponseObject[kState] = clonedResponse; - clonedResponseObject[kRealm] = this[kRealm]; - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders])) + } + + [nodeUtil.inspect.custom] (depth, options) { + if (options.depth === null) { + options.depth = 2; + } - return clonedResponseObject + options.colors ??= true; + + const properties = { + status: this.status, + statusText: this.statusText, + headers: this.headers, + body: this.body, + bodyUsed: this.bodyUsed, + ok: this.ok, + redirected: this.redirected, + type: this.type, + url: this.url + }; + + return `Response ${nodeUtil.formatWithOptions(options, properties)}` } } @@ -15949,7 +17798,7 @@ function requireResponse$1 () { // 3. If response’s body is non-null, then set newResponse’s body to the // result of cloning response’s body. if (response.body != null) { - newResponse.body = cloneBody(response.body); + newResponse.body = cloneBody(newResponse, response.body); } // 4. Return newResponse. @@ -15968,10 +17817,10 @@ function requireResponse$1 () { cacheState: '', statusText: '', ...init, - headersList: init.headersList - ? new HeadersList(init.headersList) + headersList: init?.headersList + ? new HeadersList(init?.headersList) : new HeadersList(), - urlList: init.urlList ? [...init.urlList] : [] + urlList: init?.urlList ? [...init.urlList] : [] } } @@ -15987,6 +17836,16 @@ function requireResponse$1 () { }) } + // @see https://fetch.spec.whatwg.org/#concept-network-error + function isNetworkError (response) { + return ( + // A network error is a response whose type is "error", + response.type === 'error' && + // status is 0 + response.status === 0 + ) + } + function makeFilteredResponse (response, state) { state = { internalResponse: response, @@ -16110,7 +17969,7 @@ function requireResponse$1 () { if (nullBodyStatus.includes(response.status)) { throw webidl.errors.exception({ header: 'Response constructor', - message: 'Invalid response status code ' + response.status + message: `Invalid response status code ${response.status}` }) } @@ -16119,12 +17978,37 @@ function requireResponse$1 () { // 3. If body's type is non-null and response's header list does not contain // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. - if (body.type != null && !response[kState].headersList.contains('Content-Type')) { - response[kState].headersList.append('content-type', body.type); + if (body.type != null && !response[kState].headersList.contains('content-type', true)) { + response[kState].headersList.append('content-type', body.type, true); } } } + /** + * @see https://fetch.spec.whatwg.org/#response-create + * @param {any} innerResponse + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @returns {Response} + */ + function fromInnerResponse (innerResponse, guard) { + const response = new Response(kConstruct); + response[kState] = innerResponse; + response[kHeaders] = new Headers(kConstruct); + setHeadersList(response[kHeaders], innerResponse.headersList); + setHeadersGuard(response[kHeaders], guard); + + if (hasFinalizationRegistry && innerResponse.body?.stream) { + // If the target (response) is reclaimed, the cleanup callback may be called at some point with + // the held value provided for it (innerResponse.body.stream). The held value can be any value: + // a primitive or an object, even undefined. If the held value is an object, the registry keeps + // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry + streamRegistry.register(response, new WeakRef(innerResponse.body.stream)); + } + + return response + } + webidl.converters.ReadableStream = webidl.interfaceConverter( ReadableStream ); @@ -16138,34 +18022,34 @@ function requireResponse$1 () { ); // https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit - webidl.converters.XMLHttpRequestBodyInit = function (V) { + webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) { if (typeof V === 'string') { - return webidl.converters.USVString(V) + return webidl.converters.USVString(V, prefix, name) } if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) + return webidl.converters.Blob(V, prefix, name, { strict: false }) } - if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { - return webidl.converters.BufferSource(V) + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { + return webidl.converters.BufferSource(V, prefix, name) } if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }) + return webidl.converters.FormData(V, prefix, name, { strict: false }) } if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V) + return webidl.converters.URLSearchParams(V, prefix, name) } - return webidl.converters.DOMString(V) + return webidl.converters.DOMString(V, prefix, name) }; // https://fetch.spec.whatwg.org/#bodyinit - webidl.converters.BodyInit = function (V) { + webidl.converters.BodyInit = function (V, prefix, argument) { if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V) + return webidl.converters.ReadableStream(V, prefix, argument) } // Note: the spec doesn't include async iterables, @@ -16174,19 +18058,19 @@ function requireResponse$1 () { return V } - return webidl.converters.XMLHttpRequestBodyInit(V) + return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument) }; webidl.converters.ResponseInit = webidl.dictionaryConverter([ { key: 'status', converter: webidl.converters['unsigned short'], - defaultValue: 200 + defaultValue: () => 200 }, { key: 'statusText', converter: webidl.converters.ByteString, - defaultValue: '' + defaultValue: () => '' }, { key: 'headers', @@ -16194,37 +18078,92 @@ function requireResponse$1 () { } ]); - response$1 = { + response$2 = { + isNetworkError, makeNetworkError, makeResponse, makeAppropriateNetworkError, filterResponse, Response, - cloneResponse + cloneResponse, + fromInnerResponse }; - return response$1; + return response$2; +} + +var dispatcherWeakref$1; +var hasRequiredDispatcherWeakref$1; + +function requireDispatcherWeakref$1 () { + if (hasRequiredDispatcherWeakref$1) return dispatcherWeakref$1; + hasRequiredDispatcherWeakref$1 = 1; + + const { kConnected, kSize } = requireSymbols$9(); + + class CompatWeakRef { + constructor (value) { + this.value = value; + } + + deref () { + return this.value[kConnected] === 0 && this.value[kSize] === 0 + ? undefined + : this.value + } + } + + class CompatFinalizer { + constructor (finalizer) { + this.finalizer = finalizer; + } + + register (dispatcher, key) { + if (dispatcher.on) { + dispatcher.on('disconnect', () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key); + } + }); + } + } + + unregister (key) {} + } + + dispatcherWeakref$1 = function () { + // FIXME: remove workaround when the Node bug is backported to v18 + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (process.env.NODE_V8_COVERAGE && process.version.startsWith('v18')) { + process._rawDebug('Using compatibility WeakRef and FinalizationRegistry'); + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + } + } + return { WeakRef, FinalizationRegistry } + }; + return dispatcherWeakref$1; } /* globals AbortController */ -var request$1; -var hasRequiredRequest; +var request$3; +var hasRequiredRequest$2; -function requireRequest () { - if (hasRequiredRequest) return request$1; - hasRequiredRequest = 1; +function requireRequest$2 () { + if (hasRequiredRequest$2) return request$3; + hasRequiredRequest$2 = 1; - const { extractBody, mixinBody, cloneBody } = requireBody(); - const { Headers, fill: fillHeaders, HeadersList } = requireHeaders(); - const { FinalizationRegistry } = requireDispatcherWeakref()(); - const util = requireUtil$8(); + const { extractBody, mixinBody, cloneBody, bodyUnusable } = requireBody$1(); + const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = requireHeaders$1(); + const { FinalizationRegistry } = requireDispatcherWeakref$1()(); + const util = requireUtil$h(); + const nodeUtil = require$$0$a; const { isValidHTTPToken, sameOrigin, - normalizeMethod, - makePolicyContainer, - normalizeMethodRecord - } = requireUtil$7(); + environmentSettingsObject + } = requireUtil$g(); const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -16234,17 +18173,14 @@ function requireRequest () { requestCredentials, requestCache, requestDuplex - } = requireConstants$a(); - const { kEnumerableProperty } = util; - const { kHeaders, kSignal, kState, kGuard, kRealm } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { getGlobalOrigin } = requireGlobal$1(); - const { URLSerializer } = requireDataURL(); - const { kHeadersList, kConstruct } = requireSymbols$4(); - const assert = require$$0$8; - const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$0$7; - - let TransformStream = globalThis.TransformStream; + } = requireConstants$e(); + const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util; + const { kHeaders, kSignal, kState, kDispatcher } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { URLSerializer } = requireDataUrl$1(); + const { kConstruct } = requireSymbols$9(); + const assert = require$$0$7; + const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$8; const kAbortController = Symbol('abortController'); @@ -16252,29 +18188,62 @@ function requireRequest () { signal.removeEventListener('abort', abort); }); + const dependentControllerMap = new WeakMap(); + + function buildAbort (acRef) { + return abort + + function abort () { + const ac = acRef.deref(); + if (ac !== undefined) { + // Currently, there is a problem with FinalizationRegistry. + // https://github.com/nodejs/node/issues/49344 + // https://github.com/nodejs/node/issues/47748 + // In the case of abort, the first step is to unregister from it. + // If the controller can refer to it, it is still registered. + // It will be removed in the future. + requestFinalizer.unregister(abort); + + // Unsubscribe a listener. + // FinalizationRegistry will no longer be called, so this must be done. + this.removeEventListener('abort', abort); + + ac.abort(this.reason); + + const controllerList = dependentControllerMap.get(ac.signal); + + if (controllerList !== undefined) { + if (controllerList.size !== 0) { + for (const ref of controllerList) { + const ctrl = ref.deref(); + if (ctrl !== undefined) { + ctrl.abort(this.reason); + } + } + controllerList.clear(); + } + dependentControllerMap.delete(ac.signal); + } + } + } + } + + let patchMethodWarning = false; + // https://fetch.spec.whatwg.org/#request-class class Request { // https://fetch.spec.whatwg.org/#dom-request constructor (input, init = {}) { + webidl.util.markAsUncloneable(this); if (input === kConstruct) { return } - webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' }); + const prefix = 'Request constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - - // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin () { - return this.baseUrl?.origin - }, - policyContainer: makePolicyContainer() - } - }; + input = webidl.converters.RequestInfo(input, prefix, 'input'); + init = webidl.converters.RequestInit(init, prefix, 'init'); // 1. Let request be null. let request = null; @@ -16283,13 +18252,15 @@ function requireRequest () { let fallbackMode = null; // 3. Let baseURL be this’s relevant settings object’s API base URL. - const baseUrl = this[kRealm].settingsObject.baseUrl; + const baseUrl = environmentSettingsObject.settingsObject.baseUrl; // 4. Let signal be null. let signal = null; // 5. If input is a string, then: if (typeof input === 'string') { + this[kDispatcher] = init.dispatcher; + // 1. Let parsedURL be the result of parsing input with baseURL. // 2. If parsedURL is failure, then throw a TypeError. let parsedURL; @@ -16313,6 +18284,8 @@ function requireRequest () { // 5. Set fallbackMode to "cors". fallbackMode = 'cors'; } else { + this[kDispatcher] = init.dispatcher || input[kDispatcher]; + // 6. Otherwise: // 7. Assert: input is a Request object. @@ -16326,7 +18299,7 @@ function requireRequest () { } // 7. Let origin be this’s relevant settings object’s origin. - const origin = this[kRealm].settingsObject.origin; + const origin = environmentSettingsObject.settingsObject.origin; // 8. Let window be "client". let window = 'client'; @@ -16362,7 +18335,7 @@ function requireRequest () { // unsafe-request flag Set. unsafeRequest: request.unsafeRequest, // client This’s relevant settings object. - client: this[kRealm].settingsObject, + client: environmentSettingsObject.settingsObject, // window window. window, // priority request’s priority. @@ -16451,7 +18424,7 @@ function requireRequest () { // then set request’s referrer to "client". if ( (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') || - (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) + (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) ) { request.referrer = 'client'; } else { @@ -16527,21 +18500,40 @@ function requireRequest () { // 1. Let method be init["method"]. let method = init.method; - // 2. If method is not a method or method is a forbidden method, then - // throw a TypeError. - if (!isValidHTTPToken(method)) { - throw new TypeError(`'${method}' is not a valid HTTP method.`) - } + const mayBeNormalized = normalizedMethodRecords[method]; + + if (mayBeNormalized !== undefined) { + // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones + request.method = mayBeNormalized; + } else { + // 2. If method is not a method or method is a forbidden method, then + // throw a TypeError. + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`) + } + + const upperCase = method.toUpperCase(); + + if (forbiddenMethodsSet.has(upperCase)) { + throw new TypeError(`'${method}' HTTP method is unsupported.`) + } - if (forbiddenMethodsSet.has(method.toUpperCase())) { - throw new TypeError(`'${method}' HTTP method is unsupported.`) + // 3. Normalize method. + // https://fetch.spec.whatwg.org/#concept-method-normalize + // Note: must be in uppercase + method = normalizedMethodRecordsBase[upperCase] ?? method; + + // 4. Set request’s method to method. + request.method = method; } - // 3. Normalize method. - method = normalizeMethodRecord[method] ?? normalizeMethod(method); + if (!patchMethodWarning && request.method === 'patch') { + process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', { + code: 'UNDICI-FETCH-patch' + }); - // 4. Set request’s method to method. - request.method = method; + patchMethodWarning = true; + } } // 26. If init["signal"] exists, then set signal to it. @@ -16558,7 +18550,6 @@ function requireRequest () { // (https://dom.spec.whatwg.org/#dom-abortsignal-any) const ac = new AbortController(); this[kSignal] = ac.signal; - this[kSignal][kRealm] = this[kRealm]; // 29. If signal is not null, then make this’s signal follow signal. if (signal != null) { @@ -16582,12 +18573,7 @@ function requireRequest () { this[kAbortController] = ac; const acRef = new WeakRef(ac); - const abort = function () { - const ac = acRef.deref(); - if (ac !== undefined) { - ac.abort(this.reason); - } - }; + const abort = buildAbort(acRef); // Third-party AbortControllers may not work with these. // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619. @@ -16595,14 +18581,18 @@ function requireRequest () { // If the max amount of listeners is equal to the default, increase it // This is only available in node >= v19.9.0 if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal); + setMaxListeners(1500, signal); } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { - setMaxListeners(100, signal); + setMaxListeners(1500, signal); } } catch {} util.addAbortListener(signal, abort); - requestFinalizer.register(ac, { signal, abort }); + // The third argument must be a registry key to be unregistered. + // Without it, you cannot unregister. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry + // abort is used as the unregister key. (because it is unique) + requestFinalizer.register(ac, { signal, abort }, abort); } } @@ -16610,9 +18600,8 @@ function requireRequest () { // Realm, whose header list is request’s header list and guard is // "request". this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kHeadersList] = request.headersList; - this[kHeaders][kGuard] = 'request'; - this[kHeaders][kRealm] = this[kRealm]; + setHeadersList(this[kHeaders], request.headersList); + setHeadersGuard(this[kHeaders], 'request'); // 31. If this’s request’s mode is "no-cors", then: if (mode === 'no-cors') { @@ -16625,13 +18614,13 @@ function requireRequest () { } // 2. Set this’s headers’s guard to "request-no-cors". - this[kHeaders][kGuard] = 'request-no-cors'; + setHeadersGuard(this[kHeaders], 'request-no-cors'); } // 32. If init is not empty, then: if (initHasKey) { /** @type {HeadersList} */ - const headersList = this[kHeaders][kHeadersList]; + const headersList = getHeadersList(this[kHeaders]); // 1. Let headers be a copy of this’s headers and its associated header // list. // 2. If init["headers"] exists, then set headers to init["headers"]. @@ -16643,8 +18632,8 @@ function requireRequest () { // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. if (headers instanceof HeadersList) { - for (const [key, val] of headers) { - headersList.append(key, val); + for (const { name, value } of headers.rawValues()) { + headersList.append(name, value, false); } // Note: Copy the `set-cookie` meta-data. headersList.cookies = headers.cookies; @@ -16685,7 +18674,7 @@ function requireRequest () { // 3, If Content-Type is non-null and this’s headers’s header list does // not contain `Content-Type`, then append `Content-Type`/Content-Type to // this’s headers. - if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) { + if (contentType && !getHeadersList(this[kHeaders]).contains('content-type', true)) { this[kHeaders].append('content-type', contentType); } } @@ -16721,17 +18710,13 @@ function requireRequest () { // 40. If initBody is null and inputBody is non-null, then: if (initBody == null && inputBody != null) { // 1. If input is unusable, then throw a TypeError. - if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + if (bodyUnusable(input)) { throw new TypeError( 'Cannot construct a Request with a Request object that has already been used.' ) } // 2. Set finalBody to the result of creating a proxy for inputBody. - if (!TransformStream) { - TransformStream = require$$14.TransformStream; - } - // https://streams.spec.whatwg.org/#readablestream-create-a-proxy const identityTransform = new TransformStream(); inputBody.stream.pipeThrough(identityTransform); @@ -16885,7 +18870,7 @@ function requireRequest () { } // Returns a boolean indicating whether or not request is for a history - // navigation (a.k.a. back-foward navigation). + // navigation (a.k.a. back-forward navigation). get isHistoryNavigation () { webidl.brandCheck(this, Request); @@ -16927,7 +18912,7 @@ function requireRequest () { webidl.brandCheck(this, Request); // 1. If this is unusable, then throw a TypeError. - if (this.bodyUsed || this.body?.locked) { + if (bodyUnusable(this)) { throw new TypeError('unusable') } @@ -16936,80 +18921,103 @@ function requireRequest () { // 3. Let clonedRequestObject be the result of creating a Request object, // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. - const clonedRequestObject = new Request(kConstruct); - clonedRequestObject[kState] = clonedRequest; - clonedRequestObject[kRealm] = this[kRealm]; - clonedRequestObject[kHeaders] = new Headers(kConstruct); - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - // 4. Make clonedRequestObject’s signal follow this’s signal. const ac = new AbortController(); if (this.signal.aborted) { ac.abort(this.signal.reason); } else { + let list = dependentControllerMap.get(this.signal); + if (list === undefined) { + list = new Set(); + dependentControllerMap.set(this.signal, list); + } + const acRef = new WeakRef(ac); + list.add(acRef); util.addAbortListener( - this.signal, - () => { - ac.abort(this.signal.reason); - } + ac.signal, + buildAbort(acRef) ); } - clonedRequestObject[kSignal] = ac.signal; // 4. Return clonedRequestObject. - return clonedRequestObject + return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders])) + } + + [nodeUtil.inspect.custom] (depth, options) { + if (options.depth === null) { + options.depth = 2; + } + + options.colors ??= true; + + const properties = { + method: this.method, + url: this.url, + headers: this.headers, + destination: this.destination, + referrer: this.referrer, + referrerPolicy: this.referrerPolicy, + mode: this.mode, + credentials: this.credentials, + cache: this.cache, + redirect: this.redirect, + integrity: this.integrity, + keepalive: this.keepalive, + isReloadNavigation: this.isReloadNavigation, + isHistoryNavigation: this.isHistoryNavigation, + signal: this.signal + }; + + return `Request ${nodeUtil.formatWithOptions(options, properties)}` } } mixinBody(Request); + // https://fetch.spec.whatwg.org/#requests function makeRequest (init) { - // https://fetch.spec.whatwg.org/#requests - const request = { - method: 'GET', - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: '', - window: 'client', - keepalive: false, - serviceWorkers: 'all', - initiator: '', - destination: '', - priority: null, - origin: 'client', - policyContainer: 'client', - referrer: 'client', - referrerPolicy: '', - mode: 'no-cors', - useCORSPreflightFlag: false, - credentials: 'same-origin', - useCredentials: false, - cache: 'default', - redirect: 'follow', - integrity: '', - cryptoGraphicsNonceMetadata: '', - parserMetadata: '', - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: 'basic', - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, + return { + method: init.method ?? 'GET', + localURLsOnly: init.localURLsOnly ?? false, + unsafeRequest: init.unsafeRequest ?? false, + body: init.body ?? null, + client: init.client ?? null, + reservedClient: init.reservedClient ?? null, + replacesClientId: init.replacesClientId ?? '', + window: init.window ?? 'client', + keepalive: init.keepalive ?? false, + serviceWorkers: init.serviceWorkers ?? 'all', + initiator: init.initiator ?? '', + destination: init.destination ?? '', + priority: init.priority ?? null, + origin: init.origin ?? 'client', + policyContainer: init.policyContainer ?? 'client', + referrer: init.referrer ?? 'client', + referrerPolicy: init.referrerPolicy ?? '', + mode: init.mode ?? 'no-cors', + useCORSPreflightFlag: init.useCORSPreflightFlag ?? false, + credentials: init.credentials ?? 'same-origin', + useCredentials: init.useCredentials ?? false, + cache: init.cache ?? 'default', + redirect: init.redirect ?? 'follow', + integrity: init.integrity ?? '', + cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '', + parserMetadata: init.parserMetadata ?? '', + reloadNavigation: init.reloadNavigation ?? false, + historyNavigation: init.historyNavigation ?? false, + userActivation: init.userActivation ?? false, + taintedOrigin: init.taintedOrigin ?? false, + redirectCount: init.redirectCount ?? 0, + responseTainting: init.responseTainting ?? 'basic', + preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false, + done: init.done ?? false, + timingAllowFailed: init.timingAllowFailed ?? false, + urlList: init.urlList, + url: init.urlList[0], headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() - }; - request.url = request.urlList[0]; - return request + } } // https://fetch.spec.whatwg.org/#concept-request-clone @@ -17022,13 +19030,30 @@ function requireRequest () { // 2. If request’s body is non-null, set newRequest’s body to the // result of cloning request’s body. if (request.body != null) { - newRequest.body = cloneBody(request.body); + newRequest.body = cloneBody(newRequest, request.body); } // 3. Return newRequest. return newRequest } + /** + * @see https://fetch.spec.whatwg.org/#request-create + * @param {any} innerRequest + * @param {AbortSignal} signal + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @returns {Request} + */ + function fromInnerRequest (innerRequest, signal, guard) { + const request = new Request(kConstruct); + request[kState] = innerRequest; + request[kSignal] = signal; + request[kHeaders] = new Headers(kConstruct); + setHeadersList(request[kHeaders], innerRequest.headersList); + setHeadersGuard(request[kHeaders], guard); + return request + } + Object.defineProperties(Request.prototype, { method: kEnumerableProperty, url: kEnumerableProperty, @@ -17061,16 +19086,16 @@ function requireRequest () { ); // https://fetch.spec.whatwg.org/#requestinfo - webidl.converters.RequestInfo = function (V) { + webidl.converters.RequestInfo = function (V, prefix, argument) { if (typeof V === 'string') { - return webidl.converters.USVString(V) + return webidl.converters.USVString(V, prefix, argument) } if (V instanceof Request) { - return webidl.converters.Request(V) + return webidl.converters.Request(V, prefix, argument) } - return webidl.converters.USVString(V) + return webidl.converters.USVString(V, prefix, argument) }; webidl.converters.AbortSignal = webidl.interfaceConverter( @@ -17140,6 +19165,8 @@ function requireRequest () { converter: webidl.nullableConverter( (signal) => webidl.converters.AbortSignal( signal, + 'RequestInit', + 'signal', { strict: false } ) ) @@ -17152,30 +19179,34 @@ function requireRequest () { key: 'duplex', converter: webidl.converters.DOMString, allowedValues: requestDuplex + }, + { + key: 'dispatcher', // undici specific option + converter: webidl.converters.any } ]); - request$1 = { Request, makeRequest }; - return request$1; + request$3 = { Request, makeRequest, fromInnerRequest, cloneRequest }; + return request$3; } -var fetch_1; -var hasRequiredFetch; +var fetch_1$1; +var hasRequiredFetch$1; -function requireFetch () { - if (hasRequiredFetch) return fetch_1; - hasRequiredFetch = 1; +function requireFetch$1 () { + if (hasRequiredFetch$1) return fetch_1$1; + hasRequiredFetch$1 = 1; const { - Response, makeNetworkError, makeAppropriateNetworkError, filterResponse, - makeResponse - } = requireResponse$1(); - const { Headers } = requireHeaders(); - const { Request, makeRequest } = requireRequest(); - const zlib = require$$3$1; + makeResponse, + fromInnerResponse + } = requireResponse$2(); + const { HeadersList } = requireHeaders$1(); + const { Request, cloneRequest } = requireRequest$2(); + const zlib = require$$3; const { bytesMatch, makePolicyContainer, @@ -17204,33 +19235,38 @@ function requireFetch () { isomorphicEncode, urlIsLocal, urlIsHttpHttpsScheme, - urlHasHttpsScheme - } = requireUtil$7(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const assert = require$$0$8; - const { safelyExtractBody } = requireBody(); + urlHasHttpsScheme, + clampAndCoarsenConnectionTimingInfo, + simpleRangeHeaderValue, + buildContentRange, + createInflate, + extractMimeType + } = requireUtil$g(); + const { kState, kDispatcher } = requireSymbols$8(); + const assert = require$$0$7; + const { safelyExtractBody, extractBody } = requireBody$1(); const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, - subresourceSet, - DOMException - } = requireConstants$a(); - const { kHeadersList } = requireSymbols$4(); - const EE = require$$0$7; - const { Readable, pipeline } = require$$0$a; - const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = requireUtil$8(); - const { dataURLProcessor, serializeAMimeType } = requireDataURL(); - const { TransformStream } = require$$14; - const { getGlobalDispatcher } = requireGlobal(); - const { webidl } = requireWebidl(); - const { STATUS_CODES } = require$$0$5; + subresourceSet + } = requireConstants$e(); + const EE = require$$8; + const { Readable, pipeline, finished } = require$$0$8; + const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = requireUtil$h(); + const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = requireDataUrl$1(); + const { getGlobalDispatcher } = requireGlobal$2(); + const { webidl } = requireWebidl$1(); + const { STATUS_CODES } = require$$2; const GET_OR_HEAD = ['GET', 'HEAD']; + const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined' + ? 'node' + : 'undici'; + /** @type {import('buffer').resolveObjectURL} */ let resolveObjectURL; - let ReadableStream = globalThis.ReadableStream; class Fetch extends EE { constructor (dispatcher) { @@ -17240,12 +19276,6 @@ function requireFetch () { this.connection = null; this.dump = false; this.state = 'ongoing'; - // 2 terminated listeners get added per request, - // but only 1 gets removed. If there are 20 redirects, - // 21 listeners will be added. - // See https://github.com/nodejs/undici/issues/1711 - // TODO (fix): Find and fix root cause for leaked listener. - this.setMaxListeners(21); } terminate (reason) { @@ -17285,12 +19315,16 @@ function requireFetch () { } } + function handleFetchDone (response) { + finalizeAndReportTiming(response, 'fetch'); + } + // https://fetch.spec.whatwg.org/#fetch-method - function fetch (input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }); + function fetch (input, init = undefined) { + webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch'); // 1. Let p be a new promise. - const p = createDeferredPromise(); + let p = createDeferredPromise(); // 2. Let requestObject be the result of invoking the initial value of // Request as constructor with input and init as arguments. If this throws @@ -17330,7 +19364,6 @@ function requireFetch () { let responseObject = null; // 8. Let relevantRealm be this’s relevant Realm. - const relevantRealm = null; // 9. Let locallyAborted be false. let locallyAborted = false; @@ -17351,16 +19384,17 @@ function requireFetch () { // 3. Abort controller with requestObject’s signal’s abort reason. controller.abort(requestObject.signal.reason); + const realResponse = responseObject?.deref(); + // 4. Abort the fetch() call with p, request, responseObject, // and requestObject’s signal’s abort reason. - abortFetch(p, request, responseObject, requestObject.signal.reason); + abortFetch(p, request, realResponse, requestObject.signal.reason); } ); // 12. Let handleFetchDone given response response be to finalize and // report timing with response, globalObject, and "fetch". - const handleFetchDone = (response) => - finalizeAndReportTiming(response, 'fetch'); + // see function handleFetchDone // 13. Set controller to the result of calling fetch given request, // with processResponseEndOfBody set to handleFetchDone, and processResponse @@ -17369,7 +19403,7 @@ function requireFetch () { const processResponse = (response) => { // 1. If locallyAborted is true, terminate these substeps. if (locallyAborted) { - return Promise.resolve() + return } // 2. If response’s aborted flag is set, then: @@ -17382,36 +19416,30 @@ function requireFetch () { // deserializedError. abortFetch(p, request, responseObject, controller.serializedAbortReason); - return Promise.resolve() + return } // 3. If response is a network error, then reject p with a TypeError // and terminate these substeps. if (response.type === 'error') { - p.reject( - Object.assign(new TypeError('fetch failed'), { cause: response.error }) - ); - return Promise.resolve() + p.reject(new TypeError('fetch failed', { cause: response.error })); + return } // 4. Set responseObject to the result of creating a Response object, // given response, "immutable", and relevantRealm. - responseObject = new Response(); - responseObject[kState] = response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = 'immutable'; - responseObject[kHeaders][kRealm] = relevantRealm; + responseObject = new WeakRef(fromInnerResponse(response, 'immutable')); // 5. Resolve p with responseObject. - p.resolve(responseObject); + p.resolve(responseObject.deref()); + p = null; }; controller = fetching({ request, processResponseEndOfBody: handleFetchDone, processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici + dispatcher: requestObject[kDispatcher] // undici }); // 14. Return p. @@ -17474,7 +19502,7 @@ function requireFetch () { // global, and cacheState. markResourceTiming( timingInfo, - originalURL, + originalURL.href, initiatorType, globalThis, cacheState @@ -17482,23 +19510,15 @@ function requireFetch () { } // https://w3c.github.io/resource-timing/#dfn-mark-resource-timing - function markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) { - if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState); - } - } + const markResourceTiming = performance.markResourceTiming; // https://fetch.spec.whatwg.org/#abort-fetch function abortFetch (p, request, responseObject, error) { - // Note: AbortSignal.reason was added in node v17.2.0 - // which would give us an undefined error to reject with. - // Remove this once node v16 is no longer supported. - if (!error) { - error = new DOMException('The operation was aborted.', 'AbortError'); - } - // 1. Reject promise with error. - p.reject(error); + if (p) { + // We might have already resolved the promise at this stage + p.reject(error); + } // 2. If request’s body is not null and is readable, then cancel request’s // body with error. @@ -17542,8 +19562,11 @@ function requireFetch () { processResponseEndOfBody, processResponseConsumeBody, useParallelQueue = false, - dispatcher // undici + dispatcher = getGlobalDispatcher() // undici }) { + // Ensure that the dispatcher is set accordingly + assert(dispatcher); + // 1. Let taskDestination be null. let taskDestination = null; @@ -17568,9 +19591,9 @@ function requireFetch () { // 5. Let timingInfo be a new fetch timing info whose start time and // post-redirect start time are the coarsened shared current time given // crossOriginIsolatedCapability. - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime + startTime: currentTime }); // 6. Let fetchParams be a new fetch params whose @@ -17616,8 +19639,7 @@ function requireFetch () { // 9. If request’s origin is "client", then set request’s origin to request’s // client’s origin. if (request.origin === 'client') { - // TODO: What if request.client is null? - request.origin = request.client?.origin; + request.origin = request.client.origin; } // 10. If all of the following conditions are true: @@ -17639,7 +19661,7 @@ function requireFetch () { } // 12. If request’s header list does not contain `Accept`, then: - if (!request.headersList.contains('accept')) { + if (!request.headersList.contains('accept', true)) { // 1. Let value be `*/*`. const value = '*/*'; @@ -17656,14 +19678,14 @@ function requireFetch () { // TODO // 3. Append `Accept`/value to request’s header list. - request.headersList.append('accept', value); + request.headersList.append('accept', value, true); } // 13. If request’s header list does not contain `Accept-Language`, then // user agents should append `Accept-Language`/an appropriate value to // request’s header list. - if (!request.headersList.contains('accept-language')) { - request.headersList.append('accept-language', '*'); + if (!request.headersList.contains('accept-language', true)) { + request.headersList.append('accept-language', '*', true); } // 14. If request’s priority is null, then use request’s initiator and @@ -17867,7 +19889,7 @@ function requireFetch () { response.type === 'opaque' && internalResponse.status === 206 && internalResponse.rangeRequested && - !request.headers.contains('range') + !request.headers.contains('range', true) ) { response = internalResponse = makeNetworkError(); } @@ -17952,7 +19974,7 @@ function requireFetch () { } case 'blob:': { if (!resolveObjectURL) { - resolveObjectURL = require$$7.resolveObjectURL; + resolveObjectURL = require$$0$6.resolveObjectURL; } // 1. Let blobURLEntry be request’s current URL’s blob URL entry. @@ -17964,38 +19986,118 @@ function requireFetch () { return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.')) } - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); + const blob = resolveObjectURL(blobURLEntry.toString()); // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s // object is not a Blob object, then return a network error. - if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) { + if (request.method !== 'GET' || !isBlobLike(blob)) { return Promise.resolve(makeNetworkError('invalid method')) } - // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object. - const bodyWithType = safelyExtractBody(blobURLEntryObject); + // 3. Let blob be blobURLEntry’s object. + // Note: done above - // 4. Let body be bodyWithType’s body. - const body = bodyWithType[0]; + // 4. Let response be a new response. + const response = makeResponse(); - // 5. Let length be body’s length, serialized and isomorphic encoded. - const length = isomorphicEncode(`${body.length}`); + // 5. Let fullLength be blob’s size. + const fullLength = blob.size; - // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence. - const type = bodyWithType[1] ?? ''; + // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded. + const serializedFullLength = isomorphicEncode(`${fullLength}`); - // 7. Return a new response whose status message is `OK`, header list is - // « (`Content-Length`, length), (`Content-Type`, type) », and body is body. - const response = makeResponse({ - statusText: 'OK', - headersList: [ - ['content-length', { name: 'Content-Length', value: length }], - ['content-type', { name: 'Content-Type', value: type }] - ] - }); + // 7. Let type be blob’s type. + const type = blob.type; + + // 8. If request’s header list does not contain `Range`: + // 9. Otherwise: + if (!request.headersList.contains('range', true)) { + // 1. Let bodyWithType be the result of safely extracting blob. + // Note: in the FileAPI a blob "object" is a Blob *or* a MediaSource. + // In node, this can only ever be a Blob. Therefore we can safely + // use extractBody directly. + const bodyWithType = extractBody(blob); + + // 2. Set response’s status message to `OK`. + response.statusText = 'OK'; + + // 3. Set response’s body to bodyWithType’s body. + response.body = bodyWithType[0]; + + // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ». + response.headersList.set('content-length', serializedFullLength, true); + response.headersList.set('content-type', type, true); + } else { + // 1. Set response’s range-requested flag. + response.rangeRequested = true; + + // 2. Let rangeHeader be the result of getting `Range` from request’s header list. + const rangeHeader = request.headersList.get('range', true); + + // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true. + const rangeValue = simpleRangeHeaderValue(rangeHeader, true); + + // 4. If rangeValue is failure, then return a network error. + if (rangeValue === 'failure') { + return Promise.resolve(makeNetworkError('failed to fetch the data URL')) + } + + // 5. Let (rangeStart, rangeEnd) be rangeValue. + let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; + + // 6. If rangeStart is null: + // 7. Otherwise: + if (rangeStart === null) { + // 1. Set rangeStart to fullLength − rangeEnd. + rangeStart = fullLength - rangeEnd; + + // 2. Set rangeEnd to rangeStart + rangeEnd − 1. + rangeEnd = rangeStart + rangeEnd - 1; + } else { + // 1. If rangeStart is greater than or equal to fullLength, then return a network error. + if (rangeStart >= fullLength) { + return Promise.resolve(makeNetworkError('Range start is greater than the blob\'s size.')) + } + + // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set + // rangeEnd to fullLength − 1. + if (rangeEnd === null || rangeEnd >= fullLength) { + rangeEnd = fullLength - 1; + } + } + + // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart, + // rangeEnd + 1, and type. + const slicedBlob = blob.slice(rangeStart, rangeEnd, type); + + // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob. + // Note: same reason as mentioned above as to why we use extractBody + const slicedBodyWithType = extractBody(slicedBlob); + + // 10. Set response’s body to slicedBodyWithType’s body. + response.body = slicedBodyWithType[0]; + + // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded. + const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); + + // 12. Let contentRange be the result of invoking build a content range given rangeStart, + // rangeEnd, and fullLength. + const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); + + // 13. Set response’s status to 206. + response.status = 206; - response.body = body; + // 14. Set response’s status message to `Partial Content`. + response.statusText = 'Partial Content'; + // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength), + // (`Content-Type`, type), (`Content-Range`, contentRange) ». + response.headersList.set('content-length', serializedSlicedLength, true); + response.headersList.set('content-type', type, true); + response.headersList.set('content-range', contentRange, true); + } + + // 10. Return response. return Promise.resolve(response) } case 'data:': { @@ -18057,92 +20159,128 @@ function requireFetch () { // https://fetch.spec.whatwg.org/#fetch-finale function fetchFinale (fetchParams, response) { - // 1. If response is a network error, then: - if (response.type === 'error') { - // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ». - response.urlList = [fetchParams.request.urlList[0]]; - - // 2. Set response’s timing info to the result of creating an opaque timing - // info for fetchParams’s timing info. - response.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }); - } + // 1. Let timingInfo be fetchParams’s timing info. + let timingInfo = fetchParams.timingInfo; - // 2. Let processResponseEndOfBody be the following steps: + // 2. If response is not a network error and fetchParams’s request’s client is a secure context, + // then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting + // `Server-Timing` from response’s internal response’s header list. + // TODO + + // 3. Let processResponseEndOfBody be the following steps: const processResponseEndOfBody = () => { - // 1. Set fetchParams’s request’s done flag. - fetchParams.request.done = true; + // 1. Let unsafeEndTime be the unsafe shared current time. + const unsafeEndTime = Date.now(); // ? - // If fetchParams’s process response end-of-body is not null, - // then queue a fetch task to run fetchParams’s process response - // end-of-body given response with fetchParams’s task destination. - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); + // 2. If fetchParams’s request’s destination is "document", then set fetchParams’s controller’s + // full timing info to fetchParams’s timing info. + if (fetchParams.request.destination === 'document') { + fetchParams.controller.fullTimingInfo = timingInfo; } - }; - // 3. If fetchParams’s process response is non-null, then queue a fetch task - // to run fetchParams’s process response given response, with fetchParams’s - // task destination. - if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response)); - } + // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global: + fetchParams.controller.reportTimingSteps = () => { + // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return. + if (fetchParams.request.url.protocol !== 'https:') { + return + } - // 4. If response’s body is null, then run processResponseEndOfBody. - if (response.body == null) { - processResponseEndOfBody(); - } else { - // 5. Otherwise: + // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global. + timingInfo.endTime = unsafeEndTime; + + // 3. Let cacheState be response’s cache state. + let cacheState = response.cacheState; + + // 4. Let bodyInfo be response’s body info. + const bodyInfo = response.bodyInfo; + + // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an + // opaque timing info for timingInfo and set cacheState to the empty string. + if (!response.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo(timingInfo); - // 1. Let transformStream be a new a TransformStream. + cacheState = ''; + } + + // 6. Let responseStatus be 0. + let responseStatus = 0; + + // 7. If fetchParams’s request’s mode is not "navigate" or response’s has-cross-origin-redirects is false: + if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) { + // 1. Set responseStatus to response’s status. + responseStatus = response.status; + + // 2. Let mimeType be the result of extracting a MIME type from response’s header list. + const mimeType = extractMimeType(response.headersList); - // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, - // enqueues chunk in transformStream. - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk); + // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType. + if (mimeType !== 'failure') { + bodyInfo.contentType = minimizeSupportedMimeType(mimeType); + } + } + + // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo, + // fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo, + // and responseStatus. + if (fetchParams.request.initiatorType != null) { + // TODO: update markresourcetiming + markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus); + } }; - // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm - // and flushAlgorithm set to processResponseEndOfBody. - const transformStream = new TransformStream({ - start () {}, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size () { - return 1 + // 4. Let processResponseEndOfBodyTask be the following steps: + const processResponseEndOfBodyTask = () => { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true; + + // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process + // response end-of-body given response. + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); } - }, { - size () { - return 1 + + // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s + // global object is fetchParams’s task destination, then run fetchParams’s controller’s report + // timing steps given fetchParams’s request’s client’s global object. + if (fetchParams.request.initiatorType != null) { + fetchParams.controller.reportTimingSteps(); } - }); + }; - // 4. Set response’s body to the result of piping response’s body through transformStream. - response.body = { stream: response.body.stream.pipeThrough(transformStream) }; - } + // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination + queueMicrotask(() => processResponseEndOfBodyTask()); + }; - // 6. If fetchParams’s process response consume body is non-null, then: - if (fetchParams.processResponseConsumeBody != null) { - // 1. Let processBody given nullOrBytes be this step: run fetchParams’s - // process response consume body given response and nullOrBytes. - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); + // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s + // process response given response, with fetchParams’s task destination. + if (fetchParams.processResponse != null) { + queueMicrotask(() => { + fetchParams.processResponse(response); + fetchParams.processResponse = null; + }); + } - // 2. Let processBodyError be this step: run fetchParams’s process - // response consume body given response and failure. - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); + // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response. + const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response); - // 3. If response’s body is null, then queue a fetch task to run processBody - // given null, with fetchParams’s task destination. - if (response.body == null) { - queueMicrotask(() => processBody(null)); - } else { - // 4. Otherwise, fully read response’s body given processBody, processBodyError, - // and fetchParams’s task destination. - return fullyReadBody(response.body, processBody, processBodyError) - } - return Promise.resolve() + // 6. If internalResponse’s body is null, then run processResponseEndOfBody. + // 7. Otherwise: + if (internalResponse.body == null) { + processResponseEndOfBody(); + } else { + // mcollina: all the following steps of the specs are skipped. + // The internal transform stream is not needed. + // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541 + + // 1. Let transformStream be a new TransformStream. + // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream. + // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm + // set to processResponseEndOfBody. + // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream. + + finished(internalResponse.body.stream, () => { + processResponseEndOfBody(); + }); } } @@ -18217,7 +20355,7 @@ function requireFetch () { // encouraged to, transmit an RST_STREAM frame. // See, https://github.com/whatwg/fetch/issues/1288 if (request.redirect !== 'manual') { - fetchParams.controller.connection.destroy(); + fetchParams.controller.connection.destroy(undefined, false); } // 2. Switch on request’s redirect mode: @@ -18348,14 +20486,14 @@ function requireFetch () { // delete headerName from request’s header list. if (!sameOrigin(requestCurrentURL(request), locationURL)) { // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name - request.headersList.delete('authorization'); + request.headersList.delete('authorization', true); // https://fetch.spec.whatwg.org/#authentication-entries request.headersList.delete('proxy-authorization', true); // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. - request.headersList.delete('cookie'); - request.headersList.delete('host'); + request.headersList.delete('cookie', true); + request.headersList.delete('host', true); } // 14. If request’s body is non-null, then set request’s body to the first return @@ -18421,7 +20559,7 @@ function requireFetch () { // Otherwise: // 1. Set httpRequest to a clone of request. - httpRequest = makeRequest(request); + httpRequest = cloneRequest(request); // 2. Set httpFetchParams to a copy of fetchParams. httpFetchParams = { ...fetchParams }; @@ -18462,7 +20600,7 @@ function requireFetch () { // `Content-Length`/contentLengthHeaderValue to httpRequest’s header // list. if (contentLengthHeaderValue != null) { - httpRequest.headersList.append('content-length', contentLengthHeaderValue); + httpRequest.headersList.append('content-length', contentLengthHeaderValue, true); } // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, @@ -18476,7 +20614,7 @@ function requireFetch () { // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, // to httpRequest’s header list. if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href)); + httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true); } // 12. Append a request `Origin` header for httpRequest. @@ -18488,8 +20626,8 @@ function requireFetch () { // 14. If httpRequest’s header list does not contain `User-Agent`, then // user agents should append `User-Agent`/default `User-Agent` value to // httpRequest’s header list. - if (!httpRequest.headersList.contains('user-agent')) { - httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node'); + if (!httpRequest.headersList.contains('user-agent', true)) { + httpRequest.headersList.append('user-agent', defaultUserAgent); } // 15. If httpRequest’s cache mode is "default" and httpRequest’s header @@ -18498,11 +20636,11 @@ function requireFetch () { // httpRequest’s cache mode to "no-store". if ( httpRequest.cache === 'default' && - (httpRequest.headersList.contains('if-modified-since') || - httpRequest.headersList.contains('if-none-match') || - httpRequest.headersList.contains('if-unmodified-since') || - httpRequest.headersList.contains('if-match') || - httpRequest.headersList.contains('if-range')) + (httpRequest.headersList.contains('if-modified-since', true) || + httpRequest.headersList.contains('if-none-match', true) || + httpRequest.headersList.contains('if-unmodified-since', true) || + httpRequest.headersList.contains('if-match', true) || + httpRequest.headersList.contains('if-range', true)) ) { httpRequest.cache = 'no-store'; } @@ -18514,44 +20652,44 @@ function requireFetch () { if ( httpRequest.cache === 'no-cache' && !httpRequest.preventNoCacheCacheControlHeaderModification && - !httpRequest.headersList.contains('cache-control') + !httpRequest.headersList.contains('cache-control', true) ) { - httpRequest.headersList.append('cache-control', 'max-age=0'); + httpRequest.headersList.append('cache-control', 'max-age=0', true); } // 17. If httpRequest’s cache mode is "no-store" or "reload", then: if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { // 1. If httpRequest’s header list does not contain `Pragma`, then append // `Pragma`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.contains('pragma')) { - httpRequest.headersList.append('pragma', 'no-cache'); + if (!httpRequest.headersList.contains('pragma', true)) { + httpRequest.headersList.append('pragma', 'no-cache', true); } // 2. If httpRequest’s header list does not contain `Cache-Control`, // then append `Cache-Control`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.contains('cache-control')) { - httpRequest.headersList.append('cache-control', 'no-cache'); + if (!httpRequest.headersList.contains('cache-control', true)) { + httpRequest.headersList.append('cache-control', 'no-cache', true); } } // 18. If httpRequest’s header list contains `Range`, then append // `Accept-Encoding`/`identity` to httpRequest’s header list. - if (httpRequest.headersList.contains('range')) { - httpRequest.headersList.append('accept-encoding', 'identity'); + if (httpRequest.headersList.contains('range', true)) { + httpRequest.headersList.append('accept-encoding', 'identity', true); } // 19. Modify httpRequest’s header list per HTTP. Do not append a given // header if httpRequest’s header list contains that header’s name. // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 - if (!httpRequest.headersList.contains('accept-encoding')) { + if (!httpRequest.headersList.contains('accept-encoding', true)) { if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate'); + httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true); } else { - httpRequest.headersList.append('accept-encoding', 'gzip, deflate'); + httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true); } } - httpRequest.headersList.delete('host'); + httpRequest.headersList.delete('host', true); // 21. If there’s a proxy-authentication entry, use it as appropriate. // TODO: proxy-authentication @@ -18568,7 +20706,7 @@ function requireFetch () { // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", // then: - if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') ; + if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') ; // 9. If aborted, then return the appropriate network error for fetchParams. // TODO @@ -18577,7 +20715,7 @@ function requireFetch () { if (response == null) { // 1. If httpRequest’s cache mode is "only-if-cached", then return a // network error. - if (httpRequest.mode === 'only-if-cached') { + if (httpRequest.cache === 'only-if-cached') { return makeNetworkError('only if cached') } @@ -18615,7 +20753,7 @@ function requireFetch () { // 12. If httpRequest’s header list contains `Range`, then set response’s // range-requested flag. - if (httpRequest.headersList.contains('range')) { + if (httpRequest.headersList.contains('range', true)) { response.rangeRequested = true; } @@ -18697,10 +20835,12 @@ function requireFetch () { fetchParams.controller.connection = { abort: null, destroyed: false, - destroy (err) { + destroy (err, abort = true) { if (!this.destroyed) { this.destroyed = true; - this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')); + if (abort) { + this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')); + } } } }; @@ -18869,14 +21009,18 @@ function requireFetch () { // 11. Let pullAlgorithm be an action that resumes the ongoing fetch // if it is suspended. - const pullAlgorithm = () => { - fetchParams.controller.resume(); + const pullAlgorithm = async () => { + await fetchParams.controller.resume(); }; // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s // controller with reason, given reason. const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason); + // If the aborted fetch was already terminated, then we do not + // need to do anything. + if (!isCancelled(fetchParams)) { + fetchParams.controller.abort(reason); + } }; // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by @@ -18888,13 +21032,8 @@ function requireFetch () { // TODO // 15. Let stream be a new ReadableStream. - // 16. Set up stream with pullAlgorithm set to pullAlgorithm, - // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to - // highWaterMark, and sizeAlgorithm set to sizeAlgorithm. - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - + // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm, + // cancelAlgorithm set to cancelAlgorithm. const stream = new ReadableStream( { async start (controller) { @@ -18905,20 +21044,15 @@ function requireFetch () { }, async cancel (reason) { await cancelAlgorithm(reason); - } - }, - { - highWaterMark: 0, - size () { - return 1 - } + }, + type: 'bytes' } ); // 17. Run these steps, but abort when the ongoing fetch is terminated: // 1. Set response’s body to a new body whose stream is stream. - response.body = { stream }; + response.body = { stream, source: null, length: null }; // 2. If response is not a network error and request’s cache mode is // not "no-store", then update response in httpCache for request. @@ -18937,6 +21071,7 @@ function requireFetch () { // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: + fetchParams.controller.onAborted = onAborted; fetchParams.controller.on('terminated', onAborted); fetchParams.controller.resume = async () => { // 1. While true @@ -18991,7 +21126,10 @@ function requireFetch () { // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes // into stream. - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); + const buffer = new Uint8Array(bytes); + if (buffer.byteLength) { + fetchParams.controller.controller.enqueue(buffer); + } // 8. If stream is errored, then terminate the ongoing fetch. if (isErrored(stream)) { @@ -19001,7 +21139,7 @@ function requireFetch () { // 9. If stream doesn’t need more data ask the user agent to suspend // the ongoing fetch. - if (!fetchParams.controller.controller.desiredSize) { + if (fetchParams.controller.controller.desiredSize <= 0) { return } } @@ -19040,7 +21178,7 @@ function requireFetch () { // 20. Return response. return response - async function dispatch ({ body }) { + function dispatch ({ body }) { const url = requestCurrentURL(request); /** @type {import('../..').Agent} */ const agent = fetchParams.controller.dispatcher; @@ -19050,7 +21188,7 @@ function requireFetch () { path: url.pathname + url.search, origin: url.origin, method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, + body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body, headers: request.headersList.entries, maxRedirections: 0, upgrade: request.mode === 'websocket' ? 'websocket' : undefined @@ -19063,67 +21201,71 @@ function requireFetch () { // TODO (fix): Do we need connection here? const { connection } = fetchParams.controller; + // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen + // connection timing info with connection’s timing info, timingInfo’s post-redirect start + // time, and fetchParams’s cross-origin isolated capability. + // TODO: implement connection timing + timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability); + if (connection.destroyed) { abort(new DOMException('The operation was aborted.', 'AbortError')); } else { fetchParams.controller.on('terminated', abort); this.abort = connection.abort = abort; } + + // Set timingInfo’s final network-request start time to the coarsened shared current time given + // fetchParams’s cross-origin isolated capability. + timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + + onResponseStarted () { + // Set timingInfo’s final network-response start time to the coarsened shared current + // time given fetchParams’s cross-origin isolated capability, immediately after the + // user agent’s HTTP parser receives the first byte of the response (e.g., frame header + // bytes for HTTP/2 or response status line for HTTP/1.x). + timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); }, - onHeaders (status, headersList, resume, statusText) { + onHeaders (status, rawHeaders, resume, statusText) { if (status < 200) { return } - let codings = []; let location = ''; - const headers = new Headers(); - - // For H2, the headers are a plain JS object - // We distinguish between them and iterate accordingly - if (Array.isArray(headersList)) { - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString('latin1'); - const val = headersList[n + 1].toString('latin1'); - if (key.toLowerCase() === 'content-encoding') { - // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 - // "All content-coding values are case-insensitive..." - codings = val.toLowerCase().split(',').map((x) => x.trim()); - } else if (key.toLowerCase() === 'location') { - location = val; - } - - headers[kHeadersList].append(key, val); - } - } else { - const keys = Object.keys(headersList); - for (const key of keys) { - const val = headersList[key]; - if (key.toLowerCase() === 'content-encoding') { - // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 - // "All content-coding values are case-insensitive..." - codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse(); - } else if (key.toLowerCase() === 'location') { - location = val; - } + const headersList = new HeadersList(); - headers[kHeadersList].append(key, val); - } + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true); } + location = headersList.get('location', true); this.body = new Readable({ read: resume }); const decoders = []; - const willFollow = request.redirect === 'follow' && - location && + const willFollow = location && request.redirect === 'follow' && redirectStatusSet.has(status); // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { - for (const coding of codings) { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + const contentEncoding = headersList.get('content-encoding', true); + // "All content-coding values are case-insensitive..." + /** @type {string[]} */ + const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []; + + // Limit the number of content-encodings to prevent resource exhaustion. + // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). + const maxContentEncodings = 5; + if (codings.length > maxContentEncodings) { + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)); + return true + } + + for (let i = codings.length - 1; i >= 0; --i) { + const coding = codings[i].trim(); // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 if (coding === 'x-gzip' || coding === 'gzip') { decoders.push(zlib.createGunzip({ @@ -19135,9 +21277,15 @@ function requireFetch () { finishFlush: zlib.constants.Z_SYNC_FLUSH })); } else if (coding === 'deflate') { - decoders.push(zlib.createInflate()); + decoders.push(createInflate({ + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); } else if (coding === 'br') { - decoders.push(zlib.createBrotliDecompress()); + decoders.push(zlib.createBrotliDecompress({ + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH + })); } else { decoders.length = 0; break @@ -19145,13 +21293,19 @@ function requireFetch () { } } + const onError = this.onError.bind(this); + resolve({ status, statusText, - headersList: headers[kHeadersList], + headersList, body: decoders.length - ? pipeline(this.body, ...decoders, () => { }) - : this.body.on('error', () => {}) + ? pipeline(this.body, ...decoders, (err) => { + if (err) { + this.onError(err); + } + }).on('error', onError) + : this.body.on('error', onError) }); return true @@ -19185,6 +21339,10 @@ function requireFetch () { fetchParams.controller.off('terminated', this.abort); } + if (fetchParams.controller.onAborted) { + fetchParams.controller.off('terminated', fetchParams.controller.onAborted); + } + fetchParams.controller.ended = true; this.body.push(null); @@ -19202,24 +21360,21 @@ function requireFetch () { reject(error); }, - onUpgrade (status, headersList, socket) { + onUpgrade (status, rawHeaders, socket) { if (status !== 101) { return } - const headers = new Headers(); - - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString('latin1'); - const val = headersList[n + 1].toString('latin1'); + const headersList = new HeadersList(); - headers[kHeadersList].append(key, val); + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true); } resolve({ status, statusText: STATUS_CODES[status], - headersList: headers[kHeadersList], + headersList, socket }); @@ -19230,23 +21385,23 @@ function requireFetch () { } } - fetch_1 = { + fetch_1$1 = { fetch, Fetch, fetching, finalizeAndReportTiming }; - return fetch_1; + return fetch_1$1; } -var symbols$2; -var hasRequiredSymbols$2; +var symbols$7; +var hasRequiredSymbols$7; -function requireSymbols$2 () { - if (hasRequiredSymbols$2) return symbols$2; - hasRequiredSymbols$2 = 1; +function requireSymbols$7 () { + if (hasRequiredSymbols$7) return symbols$7; + hasRequiredSymbols$7 = 1; - symbols$2 = { + symbols$7 = { kState: Symbol('FileReader state'), kResult: Symbol('FileReader result'), kError: Symbol('FileReader error'), @@ -19254,17 +21409,17 @@ function requireSymbols$2 () { kEvents: Symbol('FileReader events'), kAborted: Symbol('FileReader aborted') }; - return symbols$2; + return symbols$7; } -var progressevent; -var hasRequiredProgressevent; +var progressevent$1; +var hasRequiredProgressevent$1; -function requireProgressevent () { - if (hasRequiredProgressevent) return progressevent; - hasRequiredProgressevent = 1; +function requireProgressevent$1 () { + if (hasRequiredProgressevent$1) return progressevent$1; + hasRequiredProgressevent$1 = 1; - const { webidl } = requireWebidl(); + const { webidl } = requireWebidl$1(); const kState = Symbol('ProgressEvent state'); @@ -19273,7 +21428,7 @@ function requireProgressevent () { */ class ProgressEvent extends Event { constructor (type, eventInitDict = {}) { - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, 'ProgressEvent constructor', 'type'); eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); super(type, eventInitDict); @@ -19308,47 +21463,47 @@ function requireProgressevent () { { key: 'lengthComputable', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'loaded', converter: webidl.converters['unsigned long long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'total', converter: webidl.converters['unsigned long long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'bubbles', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'cancelable', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'composed', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]); - progressevent = { + progressevent$1 = { ProgressEvent }; - return progressevent; + return progressevent$1; } -var encoding; -var hasRequiredEncoding; +var encoding$1; +var hasRequiredEncoding$1; -function requireEncoding () { - if (hasRequiredEncoding) return encoding; - hasRequiredEncoding = 1; +function requireEncoding$1 () { + if (hasRequiredEncoding$1) return encoding$1; + hasRequiredEncoding$1 = 1; /** * @see https://encoding.spec.whatwg.org/#concept-encoding-get @@ -19635,18 +21790,18 @@ function requireEncoding () { } } - encoding = { + encoding$1 = { getEncoding }; - return encoding; + return encoding$1; } -var util$5; -var hasRequiredUtil$5; +var util$e; +var hasRequiredUtil$e; -function requireUtil$5 () { - if (hasRequiredUtil$5) return util$5; - hasRequiredUtil$5 = 1; +function requireUtil$e () { + if (hasRequiredUtil$e) return util$e; + hasRequiredUtil$e = 1; const { kState, @@ -19654,14 +21809,13 @@ function requireUtil$5 () { kResult, kAborted, kLastProgressEventFired - } = requireSymbols$2(); - const { ProgressEvent } = requireProgressevent(); - const { getEncoding } = requireEncoding(); - const { DOMException } = requireConstants$a(); - const { serializeAMimeType, parseMIMEType } = requireDataURL(); - const { types } = require$$0$6; - const { StringDecoder } = require$$0$e; - const { btoa } = require$$7; + } = requireSymbols$7(); + const { ProgressEvent } = requireProgressevent$1(); + const { getEncoding } = requireEncoding$1(); + const { serializeAMimeType, parseMIMEType } = requireDataUrl$1(); + const { types } = require$$0$a; + const { StringDecoder } = require$$5$3; + const { btoa } = require$$0$6; /** @type {PropertyDescriptor} */ const staticPropertyDescriptors = { @@ -20033,35 +22187,35 @@ function requireUtil$5 () { }, new Uint8Array(size)) } - util$5 = { + util$e = { staticPropertyDescriptors, readOperation, fireAProgressEvent }; - return util$5; + return util$e; } -var filereader; -var hasRequiredFilereader; +var filereader$1; +var hasRequiredFilereader$1; -function requireFilereader () { - if (hasRequiredFilereader) return filereader; - hasRequiredFilereader = 1; +function requireFilereader$1 () { + if (hasRequiredFilereader$1) return filereader$1; + hasRequiredFilereader$1 = 1; const { staticPropertyDescriptors, readOperation, fireAProgressEvent - } = requireUtil$5(); + } = requireUtil$e(); const { kState, kError, kResult, kEvents, kAborted - } = requireSymbols$2(); - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$8(); + } = requireSymbols$7(); + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$h(); class FileReader extends EventTarget { constructor () { @@ -20087,7 +22241,7 @@ function requireFilereader () { readAsArrayBuffer (blob) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsArrayBuffer'); blob = webidl.converters.Blob(blob, { strict: false }); @@ -20103,7 +22257,7 @@ function requireFilereader () { readAsBinaryString (blob) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsBinaryString'); blob = webidl.converters.Blob(blob, { strict: false }); @@ -20120,12 +22274,12 @@ function requireFilereader () { readAsText (blob, encoding = undefined) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsText'); blob = webidl.converters.Blob(blob, { strict: false }); if (encoding !== undefined) { - encoding = webidl.converters.DOMString(encoding); + encoding = webidl.converters.DOMString(encoding, 'FileReader.readAsText', 'encoding'); } // The readAsText(blob, encoding) method, when invoked, @@ -20140,7 +22294,7 @@ function requireFilereader () { readAsDataURL (blob) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsDataURL'); blob = webidl.converters.Blob(blob, { strict: false }); @@ -20387,35 +22541,35 @@ function requireFilereader () { DONE: staticPropertyDescriptors }); - filereader = { + filereader$1 = { FileReader }; - return filereader; + return filereader$1; } -var symbols$1; -var hasRequiredSymbols$1; +var symbols$6; +var hasRequiredSymbols$6; -function requireSymbols$1 () { - if (hasRequiredSymbols$1) return symbols$1; - hasRequiredSymbols$1 = 1; +function requireSymbols$6 () { + if (hasRequiredSymbols$6) return symbols$6; + hasRequiredSymbols$6 = 1; - symbols$1 = { - kConstruct: requireSymbols$4().kConstruct + symbols$6 = { + kConstruct: requireSymbols$9().kConstruct }; - return symbols$1; + return symbols$6; } -var util$4; -var hasRequiredUtil$4; +var util$d; +var hasRequiredUtil$d; -function requireUtil$4 () { - if (hasRequiredUtil$4) return util$4; - hasRequiredUtil$4 = 1; +function requireUtil$d () { + if (hasRequiredUtil$d) return util$d; + hasRequiredUtil$d = 1; - const assert = require$$0$8; - const { URLSerializer } = requireDataURL(); - const { isValidHeaderName } = requireUtil$7(); + const assert = require$$0$7; + const { URLSerializer } = requireDataUrl$1(); + const { isValidHeaderName } = requireUtil$g(); /** * @see https://url.spec.whatwg.org/#concept-url-equals @@ -20436,7 +22590,7 @@ function requireUtil$4 () { * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 * @param {string} header */ - function fieldValues (header) { + function getFieldValues (header) { assert(header !== null); const values = []; @@ -20444,44 +22598,38 @@ function requireUtil$4 () { for (let value of header.split(',')) { value = value.trim(); - if (!value.length) { - continue - } else if (!isValidHeaderName(value)) { - continue + if (isValidHeaderName(value)) { + values.push(value); } - - values.push(value); } return values } - util$4 = { + util$d = { urlEquals, - fieldValues + getFieldValues }; - return util$4; + return util$d; } -var cache$3; -var hasRequiredCache$3; +var cache$4; +var hasRequiredCache$4; -function requireCache$3 () { - if (hasRequiredCache$3) return cache$3; - hasRequiredCache$3 = 1; +function requireCache$4 () { + if (hasRequiredCache$4) return cache$4; + hasRequiredCache$4 = 1; - const { kConstruct } = requireSymbols$1(); - const { urlEquals, fieldValues: getFieldValues } = requireUtil$4(); - const { kEnumerableProperty, isDisturbed } = requireUtil$8(); - const { kHeadersList } = requireSymbols$4(); - const { webidl } = requireWebidl(); - const { Response, cloneResponse } = requireResponse$1(); - const { Request } = requireRequest(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const { fetching } = requireFetch(); - const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$7(); - const assert = require$$0$8; - const { getGlobalDispatcher } = requireGlobal(); + const { kConstruct } = requireSymbols$6(); + const { urlEquals, getFieldValues } = requireUtil$d(); + const { kEnumerableProperty, isDisturbed } = requireUtil$h(); + const { webidl } = requireWebidl$1(); + const { Response, cloneResponse, fromInnerResponse } = requireResponse$2(); + const { Request, fromInnerRequest } = requireRequest$2(); + const { kState } = requireSymbols$8(); + const { fetching } = requireFetch$1(); + const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$g(); + const assert = require$$0$7; /** * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation @@ -20509,17 +22657,20 @@ function requireCache$3 () { webidl.illegalConstructor(); } + webidl.util.markAsUncloneable(this); this.#relevantRequestResponseList = arguments[1]; } async match (request, options = {}) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); + const prefix = 'Cache.match'; + webidl.argumentLengthCheck(arguments, 1, prefix); - const p = await this.matchAll(request, options); + request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); + + const p = this.#internalMatchAll(request, options, 1); if (p.length === 0) { return @@ -20531,76 +22682,20 @@ function requireCache$3 () { async matchAll (request = undefined, options = {}) { webidl.brandCheck(this, Cache); - if (request !== undefined) request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - - // 1. - let r = null; - - // 2. - if (request !== undefined) { - if (request instanceof Request) { - // 2.1.1 - r = request[kState]; + const prefix = 'Cache.matchAll'; + if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { - // 2.2.1 - r = new Request(request)[kState]; - } - } - - // 5. - // 5.1 - const responses = []; - - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options); - - // 5.3.2 - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } - } - - // 5.4 - // We don't implement CORs so we don't need to loop over the responses, yay! - - // 5.5.1 - const responseList = []; - - // 5.5.2 - for (const response of responses) { - // 5.5.2.1 - const responseObject = new Response(response.body?.source ?? null); - const body = responseObject[kState].body; - responseObject[kState] = response; - responseObject[kState].body = body; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = 'immutable'; - - responseList.push(responseObject); - } - - // 6. - return Object.freeze(responseList) + return this.#internalMatchAll(request, options) } async add (request) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' }); - request = webidl.converters.RequestInfo(request); + const prefix = 'Cache.add'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); // 1. const requests = [request]; @@ -20614,9 +22709,9 @@ function requireCache$3 () { async addAll (requests) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' }); - requests = webidl.converters['sequence'](requests); + const prefix = 'Cache.addAll'; + webidl.argumentLengthCheck(arguments, 1, prefix); // 1. const responsePromises = []; @@ -20625,7 +22720,17 @@ function requireCache$3 () { const requestList = []; // 3. - for (const request of requests) { + for (let request of requests) { + if (request === undefined) { + throw webidl.errors.conversionFailed({ + prefix, + argument: 'Argument 1', + types: ['undefined is not allowed'] + }) + } + + request = webidl.converters.RequestInfo(request); + if (typeof request === 'string') { continue } @@ -20636,7 +22741,7 @@ function requireCache$3 () { // 3.2 if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { throw webidl.errors.exception({ - header: 'Cache.addAll', + header: prefix, message: 'Expected http/s scheme when method is not GET.' }) } @@ -20654,7 +22759,7 @@ function requireCache$3 () { // 5.2 if (!urlIsHttpHttpsScheme(r.url)) { throw webidl.errors.exception({ - header: 'Cache.addAll', + header: prefix, message: 'Expected http/s scheme.' }) } @@ -20672,7 +22777,6 @@ function requireCache$3 () { // 5.7 fetchControllers.push(fetching({ request: r, - dispatcher: getGlobalDispatcher(), processResponse (response) { // 1. if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { @@ -20775,10 +22879,12 @@ function requireCache$3 () { async put (request, response) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' }); - request = webidl.converters.RequestInfo(request); - response = webidl.converters.Response(response); + const prefix = 'Cache.put'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + response = webidl.converters.Response(response, prefix, 'response'); // 1. let innerRequest = null; @@ -20793,7 +22899,7 @@ function requireCache$3 () { // 4. if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Expected an http/s scheme when method is not GET' }) } @@ -20804,7 +22910,7 @@ function requireCache$3 () { // 6. if (innerResponse.status === 206) { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Got 206 status' }) } @@ -20819,7 +22925,7 @@ function requireCache$3 () { // 7.2.1 if (fieldValue === '*') { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Got * vary field value' }) } @@ -20829,7 +22935,7 @@ function requireCache$3 () { // 8. if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Response body is locked or disturbed' }) } @@ -20904,10 +23010,12 @@ function requireCache$3 () { async delete (request, options = {}) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); + const prefix = 'Cache.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); /** * @type {Request} @@ -20964,13 +23072,15 @@ function requireCache$3 () { * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys * @param {any} request * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {readonly Request[]} + * @returns {Promise} */ async keys (request = undefined, options = {}) { webidl.brandCheck(this, Cache); - if (request !== undefined) request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); + const prefix = 'Cache.keys'; + + if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); // 1. let r = null; @@ -21023,12 +23133,11 @@ function requireCache$3 () { // 5.4.2 for (const request of requests) { - const requestObject = new Request('https://a'); - requestObject[kState] = request; - requestObject[kHeaders][kHeadersList] = request.headersList; - requestObject[kHeaders][kGuard] = 'immutable'; - requestObject[kRealm] = request.client; - + const requestObject = fromInnerRequest( + request, + new AbortController().signal, + 'immutable' + ); // 5.4.2.1 requestList.push(requestObject); } @@ -21253,6 +23362,68 @@ function requireCache$3 () { return true } + + #internalMatchAll (request, options, maxResponses = Infinity) { + // 1. + let r = null; + + // 2. + if (request !== undefined) { + if (request instanceof Request) { + // 2.1.1 + r = request[kState]; + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] + } + } else if (typeof request === 'string') { + // 2.2.1 + r = new Request(request)[kState]; + } + } + + // 5. + // 5.1 + const responses = []; + + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options); + + // 5.3.2 + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + + // 5.4 + // We don't implement CORs so we don't need to loop over the responses, yay! + + // 5.5.1 + const responseList = []; + + // 5.5.2 + for (const response of responses) { + // 5.5.2.1 + const responseObject = fromInnerResponse(response, 'immutable'); + + responseList.push(responseObject.clone()); + + if (responseList.length >= maxResponses) { + break + } + } + + // 6. + return Object.freeze(responseList) + } } Object.defineProperties(Cache.prototype, { @@ -21273,17 +23444,17 @@ function requireCache$3 () { { key: 'ignoreSearch', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'ignoreMethod', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'ignoreVary', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]; @@ -21303,23 +23474,23 @@ function requireCache$3 () { webidl.converters.RequestInfo ); - cache$3 = { + cache$4 = { Cache }; - return cache$3; + return cache$4; } -var cachestorage; -var hasRequiredCachestorage; +var cachestorage$1; +var hasRequiredCachestorage$1; -function requireCachestorage () { - if (hasRequiredCachestorage) return cachestorage; - hasRequiredCachestorage = 1; +function requireCachestorage$1 () { + if (hasRequiredCachestorage$1) return cachestorage$1; + hasRequiredCachestorage$1 = 1; - const { kConstruct } = requireSymbols$1(); - const { Cache } = requireCache$3(); - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$8(); + const { kConstruct } = requireSymbols$6(); + const { Cache } = requireCache$4(); + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$h(); class CacheStorage { /** @@ -21332,11 +23503,13 @@ function requireCachestorage () { if (arguments[0] !== kConstruct) { webidl.illegalConstructor(); } + + webidl.util.markAsUncloneable(this); } async match (request, options = {}) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.match' }); + webidl.argumentLengthCheck(arguments, 1, 'CacheStorage.match'); request = webidl.converters.RequestInfo(request); options = webidl.converters.MultiCacheQueryOptions(options); @@ -21373,9 +23546,11 @@ function requireCachestorage () { */ async has (cacheName) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }); - cacheName = webidl.converters.DOMString(cacheName); + const prefix = 'CacheStorage.has'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); // 2.1.1 // 2.2 @@ -21389,9 +23564,11 @@ function requireCachestorage () { */ async open (cacheName) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }); - cacheName = webidl.converters.DOMString(cacheName); + const prefix = 'CacheStorage.open'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); // 2.1 if (this.#caches.has(cacheName)) { @@ -21421,16 +23598,18 @@ function requireCachestorage () { */ async delete (cacheName) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }); - cacheName = webidl.converters.DOMString(cacheName); + const prefix = 'CacheStorage.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); return this.#caches.delete(cacheName) } /** * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {string[]} + * @returns {Promise} */ async keys () { webidl.brandCheck(this, CacheStorage); @@ -21455,18 +23634,18 @@ function requireCachestorage () { keys: kEnumerableProperty }); - cachestorage = { + cachestorage$1 = { CacheStorage }; - return cachestorage; + return cachestorage$1; } -var constants$8; -var hasRequiredConstants$8; +var constants$d; +var hasRequiredConstants$d; -function requireConstants$8 () { - if (hasRequiredConstants$8) return constants$8; - hasRequiredConstants$8 = 1; +function requireConstants$d () { + if (hasRequiredConstants$d) return constants$d; + hasRequiredConstants$d = 1; // https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size const maxAttributeValueSize = 1024; @@ -21474,40 +23653,37 @@ function requireConstants$8 () { // https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size const maxNameValuePairSize = 4096; - constants$8 = { + constants$d = { maxAttributeValueSize, maxNameValuePairSize }; - return constants$8; + return constants$d; } -var util$3; -var hasRequiredUtil$3; +var util$c; +var hasRequiredUtil$c; -function requireUtil$3 () { - if (hasRequiredUtil$3) return util$3; - hasRequiredUtil$3 = 1; +function requireUtil$c () { + if (hasRequiredUtil$c) return util$c; + hasRequiredUtil$c = 1; /** * @param {string} value * @returns {boolean} */ function isCTLExcludingHtab (value) { - if (value.length === 0) { - return false - } - - for (const char of value) { - const code = char.charCodeAt(0); + for (let i = 0; i < value.length; ++i) { + const code = value.charCodeAt(i); if ( - (code >= 0x00 || code <= 0x08) || - (code >= 0x0A || code <= 0x1F) || + (code >= 0x00 && code <= 0x08) || + (code >= 0x0A && code <= 0x1F) || code === 0x7F ) { - return false + return true } } + return false } /** @@ -21520,28 +23696,29 @@ function requireUtil$3 () { * @param {string} name */ function validateCookieName (name) { - for (const char of name) { - const code = char.charCodeAt(0); + for (let i = 0; i < name.length; ++i) { + const code = name.charCodeAt(i); if ( - (code <= 0x20 || code > 0x7F) || - char === '(' || - char === ')' || - char === '>' || - char === '<' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' + code < 0x21 || // exclude CTLs (0-31), SP and HT + code > 0x7E || // exclude non-ascii and DEL + code === 0x22 || // " + code === 0x28 || // ( + code === 0x29 || // ) + code === 0x3C || // < + code === 0x3E || // > + code === 0x40 || // @ + code === 0x2C || // , + code === 0x3B || // ; + code === 0x3A || // : + code === 0x5C || // \ + code === 0x2F || // / + code === 0x5B || // [ + code === 0x5D || // ] + code === 0x3F || // ? + code === 0x3D || // = + code === 0x7B || // { + code === 0x7D // } ) { throw new Error('Invalid cookie name') } @@ -21557,18 +23734,30 @@ function requireUtil$3 () { * @param {string} value */ function validateCookieValue (value) { - for (const char of value) { - const code = char.charCodeAt(0); + let len = value.length; + let i = 0; + + // if the value is wrapped in DQUOTE + if (value[0] === '"') { + if (len === 1 || value[len - 1] !== '"') { + throw new Error('Invalid cookie value') + } + --len; + ++i; + } + + while (i < len) { + const code = value.charCodeAt(i++); if ( code < 0x21 || // exclude CTLs (0-31) - code === 0x22 || - code === 0x2C || - code === 0x3B || - code === 0x5C || - code > 0x7E // non-ascii + code > 0x7E || // non-ascii and DEL (127) + code === 0x22 || // " + code === 0x2C || // , + code === 0x3B || // ; + code === 0x5C // \ ) { - throw new Error('Invalid header value') + throw new Error('Invalid cookie value') } } } @@ -21578,10 +23767,14 @@ function requireUtil$3 () { * @param {string} path */ function validateCookiePath (path) { - for (const char of path) { - const code = char.charCodeAt(0); + for (let i = 0; i < path.length; ++i) { + const code = path.charCodeAt(i); - if (code < 0x21 || char === ';') { + if ( + code < 0x20 || // exclude CTLs (0-31) + code === 0x7F || // DEL + code === 0x3B // ; + ) { throw new Error('Invalid cookie path') } } @@ -21602,6 +23795,18 @@ function requireUtil$3 () { } } + const IMFDays = [ + 'Sun', 'Mon', 'Tue', 'Wed', + 'Thu', 'Fri', 'Sat' + ]; + + const IMFMonths = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ]; + + const IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0')); + /** * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 * @param {number|Date} date @@ -21648,25 +23853,7 @@ function requireUtil$3 () { date = new Date(date); } - const days = [ - 'Sun', 'Mon', 'Tue', 'Wed', - 'Thu', 'Fri', 'Sat' - ]; - - const months = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' - ]; - - const dayName = days[date.getUTCDay()]; - const day = date.getUTCDate().toString().padStart(2, '0'); - const month = months[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - const hour = date.getUTCHours().toString().padStart(2, '0'); - const minute = date.getUTCMinutes().toString().padStart(2, '0'); - const second = date.getUTCSeconds().toString().padStart(2, '0'); - - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT` + return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT` } /** @@ -21752,7 +23939,7 @@ function requireUtil$3 () { return out.join('; ') } - util$3 = { + util$c = { isCTLExcludingHtab, validateCookieName, validateCookiePath, @@ -21760,20 +23947,20 @@ function requireUtil$3 () { toIMFDate, stringify }; - return util$3; + return util$c; } -var parse$1; -var hasRequiredParse$1; +var parse$2; +var hasRequiredParse$2; -function requireParse$1 () { - if (hasRequiredParse$1) return parse$1; - hasRequiredParse$1 = 1; +function requireParse$2 () { + if (hasRequiredParse$2) return parse$2; + hasRequiredParse$2 = 1; - const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$8(); - const { isCTLExcludingHtab } = requireUtil$3(); - const { collectASequenceOfCodePointsFast } = requireDataURL(); - const assert = require$$0$8; + const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$d(); + const { isCTLExcludingHtab } = requireUtil$c(); + const { collectASequenceOfCodePointsFast } = requireDataUrl$1(); + const assert = require$$0$7; /** * @description Parses the field-value attributes of a set-cookie header string. @@ -22081,24 +24268,24 @@ function requireParse$1 () { return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) } - parse$1 = { + parse$2 = { parseSetCookie, parseUnparsedAttributes }; - return parse$1; + return parse$2; } -var cookies; -var hasRequiredCookies; +var cookies$1; +var hasRequiredCookies$1; -function requireCookies () { - if (hasRequiredCookies) return cookies; - hasRequiredCookies = 1; +function requireCookies$1 () { + if (hasRequiredCookies$1) return cookies$1; + hasRequiredCookies$1 = 1; - const { parseSetCookie } = requireParse$1(); - const { stringify } = requireUtil$3(); - const { webidl } = requireWebidl(); - const { Headers } = requireHeaders(); + const { parseSetCookie } = requireParse$2(); + const { stringify } = requireUtil$c(); + const { webidl } = requireWebidl$1(); + const { Headers } = requireHeaders$1(); /** * @typedef {Object} Cookie @@ -22119,7 +24306,7 @@ function requireCookies () { * @returns {Record} */ function getCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }); + webidl.argumentLengthCheck(arguments, 1, 'getCookies'); webidl.brandCheck(headers, Headers, { strict: false }); @@ -22146,11 +24333,12 @@ function requireCookies () { * @returns {void} */ function deleteCookie (headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }); - webidl.brandCheck(headers, Headers, { strict: false }); - name = webidl.converters.DOMString(name); + const prefix = 'deleteCookie'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + name = webidl.converters.DOMString(name, prefix, 'name'); attributes = webidl.converters.DeleteCookieAttributes(attributes); // Matches behavior of @@ -22168,7 +24356,7 @@ function requireCookies () { * @returns {Cookie[]} */ function getSetCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }); + webidl.argumentLengthCheck(arguments, 1, 'getSetCookies'); webidl.brandCheck(headers, Headers, { strict: false }); @@ -22187,7 +24375,7 @@ function requireCookies () { * @returns {void} */ function setCookie (headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }); + webidl.argumentLengthCheck(arguments, 2, 'setCookie'); webidl.brandCheck(headers, Headers, { strict: false }); @@ -22196,7 +24384,7 @@ function requireCookies () { const str = stringify(cookie); if (str) { - headers.append('Set-Cookie', stringify(cookie)); + headers.append('Set-Cookie', str); } } @@ -22204,12 +24392,12 @@ function requireCookies () { { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'path', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'domain', - defaultValue: null + defaultValue: () => null } ]); @@ -22231,32 +24419,32 @@ function requireCookies () { return new Date(value) }), key: 'expires', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters['long long']), key: 'maxAge', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'domain', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'path', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.boolean), key: 'secure', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.boolean), key: 'httpOnly', - defaultValue: null + defaultValue: () => null }, { converter: webidl.converters.USVString, @@ -22266,108 +24454,30 @@ function requireCookies () { { converter: webidl.sequenceConverter(webidl.converters.DOMString), key: 'unparsed', - defaultValue: [] + defaultValue: () => new Array(0) } ]); - cookies = { + cookies$1 = { getCookies, deleteCookie, getSetCookies, setCookie }; - return cookies; -} - -var constants$7; -var hasRequiredConstants$7; - -function requireConstants$7 () { - if (hasRequiredConstants$7) return constants$7; - hasRequiredConstants$7 = 1; - - // This is a Globally Unique Identifier unique used - // to validate that the endpoint accepts websocket - // connections. - // See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 - const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; - - /** @type {PropertyDescriptor} */ - const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - - const states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - - const opcodes = { - CONTINUATION: 0x0, - TEXT: 0x1, - BINARY: 0x2, - CLOSE: 0x8, - PING: 0x9, - PONG: 0xA - }; - - const maxUnsigned16Bit = 2 ** 16 - 1; // 65535 - - const parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - - const emptyBuffer = Buffer.allocUnsafe(0); - - constants$7 = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer - }; - return constants$7; + return cookies$1; } -var symbols; -var hasRequiredSymbols; +var events$1; +var hasRequiredEvents$1; -function requireSymbols () { - if (hasRequiredSymbols) return symbols; - hasRequiredSymbols = 1; +function requireEvents$1 () { + if (hasRequiredEvents$1) return events$1; + hasRequiredEvents$1 = 1; - symbols = { - kWebSocketURL: Symbol('url'), - kReadyState: Symbol('ready state'), - kController: Symbol('controller'), - kResponse: Symbol('response'), - kBinaryType: Symbol('binary type'), - kSentClose: Symbol('sent close'), - kReceivedClose: Symbol('received close'), - kByteParser: Symbol('byte parser') - }; - return symbols; -} - -var events; -var hasRequiredEvents; - -function requireEvents () { - if (hasRequiredEvents) return events; - hasRequiredEvents = 1; - - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$8(); - const { MessagePort } = require$$0$d; + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$h(); + const { kConstruct } = requireSymbols$9(); + const { MessagePort } = require$$1$3; /** * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent @@ -22376,14 +24486,22 @@ function requireEvents () { #eventInit constructor (type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' }); + if (type === kConstruct) { + super(arguments[1], arguments[2]); + webidl.util.markAsUncloneable(this); + return + } - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict); + const prefix = 'MessageEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + type = webidl.converters.DOMString(type, prefix, 'type'); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict'); super(type, eventInitDict); this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); } get data () { @@ -22432,14 +24550,28 @@ function requireEvents () { ) { webidl.brandCheck(this, MessageEvent); - webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' }); + webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent'); return new MessageEvent(type, { bubbles, cancelable, data, origin, lastEventId, source, ports }) } + + static createFastMessageEvent (type, init) { + const messageEvent = new MessageEvent(kConstruct, type, init); + messageEvent.#eventInit = init; + messageEvent.#eventInit.data ??= null; + messageEvent.#eventInit.origin ??= ''; + messageEvent.#eventInit.lastEventId ??= ''; + messageEvent.#eventInit.source ??= null; + messageEvent.#eventInit.ports ??= []; + return messageEvent + } } + const { createFastMessageEvent } = MessageEvent; + delete MessageEvent.createFastMessageEvent; + /** * @see https://websockets.spec.whatwg.org/#the-closeevent-interface */ @@ -22447,14 +24579,16 @@ function requireEvents () { #eventInit constructor (type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' }); + const prefix = 'CloseEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, prefix, 'type'); eventInitDict = webidl.converters.CloseEventInit(eventInitDict); super(type, eventInitDict); this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); } get wasClean () { @@ -22481,11 +24615,13 @@ function requireEvents () { #eventInit constructor (type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' }); + const prefix = 'ErrorEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); super(type, eventInitDict); + webidl.util.markAsUncloneable(this); - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, prefix, 'type'); eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); this.#eventInit = eventInitDict; @@ -22567,17 +24703,17 @@ function requireEvents () { { key: 'bubbles', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'cancelable', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'composed', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]; @@ -22586,31 +24722,29 @@ function requireEvents () { { key: 'data', converter: webidl.converters.any, - defaultValue: null + defaultValue: () => null }, { key: 'origin', converter: webidl.converters.USVString, - defaultValue: '' + defaultValue: () => '' }, { key: 'lastEventId', converter: webidl.converters.DOMString, - defaultValue: '' + defaultValue: () => '' }, { key: 'source', // Node doesn't implement WindowProxy or ServiceWorker, so the only // valid value for source is a MessagePort. converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null + defaultValue: () => null }, { key: 'ports', converter: webidl.converters['sequence'], - get defaultValue () { - return [] - } + defaultValue: () => new Array(0) } ]); @@ -22619,17 +24753,17 @@ function requireEvents () { { key: 'wasClean', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'code', converter: webidl.converters['unsigned short'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'reason', converter: webidl.converters.USVString, - defaultValue: '' + defaultValue: () => '' } ]); @@ -22638,22 +24772,22 @@ function requireEvents () { { key: 'message', converter: webidl.converters.DOMString, - defaultValue: '' + defaultValue: () => '' }, { key: 'filename', converter: webidl.converters.USVString, - defaultValue: '' + defaultValue: () => '' }, { key: 'lineno', converter: webidl.converters['unsigned long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'colno', converter: webidl.converters['unsigned long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'error', @@ -22661,29 +24795,137 @@ function requireEvents () { } ]); - events = { + events$1 = { MessageEvent, CloseEvent, - ErrorEvent + ErrorEvent, + createFastMessageEvent }; - return events; + return events$1; } -var util$2; -var hasRequiredUtil$2; +var constants$c; +var hasRequiredConstants$c; -function requireUtil$2 () { - if (hasRequiredUtil$2) return util$2; - hasRequiredUtil$2 = 1; +function requireConstants$c () { + if (hasRequiredConstants$c) return constants$c; + hasRequiredConstants$c = 1; - const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols(); - const { states, opcodes } = requireConstants$7(); - const { MessageEvent, ErrorEvent } = requireEvents(); + // This is a Globally Unique Identifier unique used + // to validate that the endpoint accepts websocket + // connections. + // See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 + const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; + + /** @type {PropertyDescriptor} */ + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + + const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + + const sentCloseFrameState = { + NOT_SENT: 0, + PROCESSING: 1, + SENT: 2 + }; + + const opcodes = { + CONTINUATION: 0x0, + TEXT: 0x1, + BINARY: 0x2, + CLOSE: 0x8, + PING: 0x9, + PONG: 0xA + }; + + const maxUnsigned16Bit = 2 ** 16 - 1; // 65535 + + const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + + const emptyBuffer = Buffer.allocUnsafe(0); + + const sendHints = { + string: 1, + typedArray: 2, + arrayBuffer: 3, + blob: 4 + }; + + constants$c = { + uid, + sentCloseFrameState, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer, + sendHints + }; + return constants$c; +} + +var symbols$5; +var hasRequiredSymbols$5; + +function requireSymbols$5 () { + if (hasRequiredSymbols$5) return symbols$5; + hasRequiredSymbols$5 = 1; + + symbols$5 = { + kWebSocketURL: Symbol('url'), + kReadyState: Symbol('ready state'), + kController: Symbol('controller'), + kResponse: Symbol('response'), + kBinaryType: Symbol('binary type'), + kSentClose: Symbol('sent close'), + kReceivedClose: Symbol('received close'), + kByteParser: Symbol('byte parser') + }; + return symbols$5; +} + +var util$b; +var hasRequiredUtil$b; + +function requireUtil$b () { + if (hasRequiredUtil$b) return util$b; + hasRequiredUtil$b = 1; + + const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols$5(); + const { states, opcodes } = requireConstants$c(); + const { ErrorEvent, createFastMessageEvent } = requireEvents$1(); + const { isUtf8 } = require$$0$6; + const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = requireDataUrl$1(); /* globals Blob */ /** * @param {import('./websocket').WebSocket} ws + * @returns {boolean} + */ + function isConnecting (ws) { + // If the WebSocket connection is not yet established, and the connection + // is not yet closed, then the WebSocket connection is in the CONNECTING state. + return ws[kReadyState] === states.CONNECTING + } + + /** + * @param {import('./websocket').WebSocket} ws + * @returns {boolean} */ function isEstablished (ws) { // If the server's response is validated as provided for above, it is @@ -22694,6 +24936,7 @@ function requireUtil$2 () { /** * @param {import('./websocket').WebSocket} ws + * @returns {boolean} */ function isClosing (ws) { // Upon either sending or receiving a Close control frame, it is said @@ -22704,6 +24947,7 @@ function requireUtil$2 () { /** * @param {import('./websocket').WebSocket} ws + * @returns {boolean} */ function isClosed (ws) { return ws[kReadyState] === states.CLOSED @@ -22713,15 +24957,16 @@ function requireUtil$2 () { * @see https://dom.spec.whatwg.org/#concept-event-fire * @param {string} e * @param {EventTarget} target + * @param {(...args: ConstructorParameters) => Event} eventFactory * @param {EventInit | undefined} eventInitDict */ - function fireEvent (e, target, eventConstructor = Event, eventInitDict) { + function fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { // 1. If eventConstructor is not given, then let eventConstructor be Event. // 2. Let event be the result of creating an event given eventConstructor, // in the relevant realm of target. // 3. Initialize event’s type attribute to e. - const event = new eventConstructor(e, eventInitDict); // eslint-disable-line new-cap + const event = eventFactory(e, eventInitDict); // 4. Initialize any other IDL attributes of event as described in the // invocation of this algorithm. @@ -22750,7 +24995,7 @@ function requireUtil$2 () { // -> type indicates that the data is Text // a new DOMString containing data try { - dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data); + dataForEvent = utf8Decode(data); } catch { failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.'); return @@ -22765,19 +25010,26 @@ function requireUtil$2 () { // -> type indicates that the data is Binary and binary type is "arraybuffer" // a new ArrayBuffer object, created in the relevant Realm of the // WebSocket object, whose contents are data - dataForEvent = new Uint8Array(data).buffer; + dataForEvent = toArrayBuffer(data); } } // 3. Fire an event named message at the WebSocket object, using MessageEvent, // with the origin attribute initialized to the serialization of the WebSocket // object’s url's origin, and the data attribute initialized to dataForEvent. - fireEvent('message', ws, MessageEvent, { + fireEvent('message', ws, createFastMessageEvent, { origin: ws[kWebSocketURL].origin, data: dataForEvent }); } + function toArrayBuffer (buffer) { + if (buffer.byteLength === buffer.buffer.byteLength) { + return buffer.buffer + } + return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) + } + /** * @see https://datatracker.ietf.org/doc/html/rfc6455 * @see https://datatracker.ietf.org/doc/html/rfc2616 @@ -22795,31 +25047,29 @@ function requireUtil$2 () { return false } - for (const char of protocol) { - const code = char.charCodeAt(0); + for (let i = 0; i < protocol.length; ++i) { + const code = protocol.charCodeAt(i); if ( - code < 0x21 || + code < 0x21 || // CTL, contains SP (0x20) and HT (0x09) code > 0x7E || - char === '(' || - char === ')' || - char === '<' || - char === '>' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' || - code === 32 || // SP - code === 9 // HT + code === 0x22 || // " + code === 0x28 || // ( + code === 0x29 || // ) + code === 0x2C || // , + code === 0x2F || // / + code === 0x3A || // : + code === 0x3B || // ; + code === 0x3C || // < + code === 0x3D || // = + code === 0x3E || // > + code === 0x3F || // ? + code === 0x40 || // @ + code === 0x5B || // [ + code === 0x5C || // \ + code === 0x5D || // ] + code === 0x7B || // { + code === 0x7D // } ) { return false } @@ -22858,13 +25108,99 @@ function requireUtil$2 () { } if (reason) { - fireEvent('error', ws, ErrorEvent, { - error: new Error(reason) + // TODO: process.nextTick + fireEvent('error', ws, (type, init) => new ErrorEvent(type, init), { + error: new Error(reason), + message: reason }); } } - util$2 = { + /** + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5 + * @param {number} opcode + */ + function isControlFrame (opcode) { + return ( + opcode === opcodes.CLOSE || + opcode === opcodes.PING || + opcode === opcodes.PONG + ) + } + + function isContinuationFrame (opcode) { + return opcode === opcodes.CONTINUATION + } + + function isTextBinaryFrame (opcode) { + return opcode === opcodes.TEXT || opcode === opcodes.BINARY + } + + function isValidOpcode (opcode) { + return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode) + } + + /** + * Parses a Sec-WebSocket-Extensions header value. + * @param {string} extensions + * @returns {Map} + */ + // TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 + function parseExtensions (extensions) { + const position = { position: 0 }; + const extensionList = new Map(); + + while (position.position < extensions.length) { + const pair = collectASequenceOfCodePointsFast(';', extensions, position); + const [name, value = ''] = pair.split('='); + + extensionList.set( + removeHTTPWhitespace(name, true, false), + removeHTTPWhitespace(value, false, true) + ); + + position.position++; + } + + return extensionList + } + + /** + * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2 + * @description "client-max-window-bits = 1*DIGIT" + * @param {string} value + */ + function isValidClientWindowBits (value) { + for (let i = 0; i < value.length; i++) { + const byte = value.charCodeAt(i); + + if (byte < 0x30 || byte > 0x39) { + return false + } + } + + return true + } + + // https://nodejs.org/api/intl.html#detecting-internationalization-support + const hasIntl = typeof process.versions.icu === 'string'; + const fatalDecoder = hasIntl ? new TextDecoder('utf-8', { fatal: true }) : undefined; + + /** + * Converts a Buffer to utf-8, even on platforms without icu. + * @param {Buffer} buffer + */ + const utf8Decode = hasIntl + ? fatalDecoder.decode.bind(fatalDecoder) + : function (buffer) { + if (isUtf8(buffer)) { + return buffer.toString('utf-8') + } + throw new TypeError('Invalid utf-8 received.') + }; + + util$b = { + isConnecting, isEstablished, isClosing, isClosed, @@ -22872,43 +25208,151 @@ function requireUtil$2 () { isValidSubprotocol, isValidStatusCode, failWebsocketConnection, - websocketMessageReceived + websocketMessageReceived, + utf8Decode, + isControlFrame, + isContinuationFrame, + isTextBinaryFrame, + isValidOpcode, + parseExtensions, + isValidClientWindowBits }; - return util$2; + return util$b; } -var connection; -var hasRequiredConnection; +var frame$1; +var hasRequiredFrame$1; -function requireConnection () { - if (hasRequiredConnection) return connection; - hasRequiredConnection = 1; +function requireFrame$1 () { + if (hasRequiredFrame$1) return frame$1; + hasRequiredFrame$1 = 1; + + const { maxUnsigned16Bit } = requireConstants$c(); - const diagnosticsChannel = require$$0$f; - const { uid, states } = requireConstants$7(); + const BUFFER_SIZE = 16386; + + /** @type {import('crypto')} */ + let crypto; + let buffer = null; + let bufIdx = BUFFER_SIZE; + + try { + crypto = require('node:crypto'); + /* c8 ignore next 3 */ + } catch { + crypto = { + // not full compatibility, but minimum. + randomFillSync: function randomFillSync (buffer, _offset, _size) { + for (let i = 0; i < buffer.length; ++i) { + buffer[i] = Math.random() * 255 | 0; + } + return buffer + } + }; + } + + function generateMask () { + if (bufIdx === BUFFER_SIZE) { + bufIdx = 0; + crypto.randomFillSync((buffer ??= Buffer.allocUnsafe(BUFFER_SIZE)), 0, BUFFER_SIZE); + } + return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]] + } + + class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor (data) { + this.frameData = data; + } + + createFrame (opcode) { + const frameData = this.frameData; + const maskKey = generateMask(); + const bodyLength = frameData?.byteLength ?? 0; + + /** @type {number} */ + let payloadLength = bodyLength; // 0-125 + let offset = 6; + + if (bodyLength > maxUnsigned16Bit) { + offset += 8; // payload length is next 8 bytes + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; // payload length is next 2 bytes + payloadLength = 126; + } + + const buffer = Buffer.allocUnsafe(bodyLength + offset); + + // Clear first 2 bytes, everything else is overwritten + buffer[0] = buffer[1] = 0; + buffer[0] |= 0x80; // FIN + buffer[0] = (buffer[0] & 0xF0) + opcode; // opcode + + /*! ws. MIT License. Einar Otto Stangvik */ + buffer[offset - 4] = maskKey[0]; + buffer[offset - 3] = maskKey[1]; + buffer[offset - 2] = maskKey[2]; + buffer[offset - 1] = maskKey[3]; + + buffer[1] = payloadLength; + + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + // Clear extended payload length + buffer[2] = buffer[3] = 0; + buffer.writeUIntBE(bodyLength, 4, 6); + } + + buffer[1] |= 0x80; // MASK + + // mask body + for (let i = 0; i < bodyLength; ++i) { + buffer[offset + i] = frameData[i] ^ maskKey[i & 3]; + } + + return buffer + } + } + + frame$1 = { + WebsocketFrameSend + }; + return frame$1; +} + +var connection$1; +var hasRequiredConnection$1; + +function requireConnection$1 () { + if (hasRequiredConnection$1) return connection$1; + hasRequiredConnection$1 = 1; + + const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = requireConstants$c(); const { kReadyState, kSentClose, kByteParser, - kReceivedClose - } = requireSymbols(); - const { fireEvent, failWebsocketConnection } = requireUtil$2(); - const { CloseEvent } = requireEvents(); - const { makeRequest } = requireRequest(); - const { fetching } = requireFetch(); - const { Headers } = requireHeaders(); - const { getGlobalDispatcher } = requireGlobal(); - const { kHeadersList } = requireSymbols$4(); - - const channels = {}; - channels.open = diagnosticsChannel.channel('undici:websocket:open'); - channels.close = diagnosticsChannel.channel('undici:websocket:close'); - channels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error'); + kReceivedClose, + kResponse + } = requireSymbols$5(); + const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = requireUtil$b(); + const { channels } = requireDiagnostics$1(); + const { CloseEvent } = requireEvents$1(); + const { makeRequest } = requireRequest$2(); + const { fetching } = requireFetch$1(); + const { Headers, getHeadersList } = requireHeaders$1(); + const { getDecodeSplit } = requireUtil$g(); + const { WebsocketFrameSend } = requireFrame$1(); /** @type {import('crypto')} */ let crypto; try { - crypto = require('crypto'); + crypto = require('node:crypto'); + /* c8 ignore next 3 */ } catch { } @@ -22918,10 +25362,10 @@ function requireConnection () { * @param {URL} url * @param {string|string[]} protocols * @param {import('./websocket').WebSocket} ws - * @param {(response: any) => void} onEstablish + * @param {(response: any, extensions: string[] | undefined) => void} onEstablish * @param {Partial} options */ - function establishWebSocketConnection (url, protocols, ws, onEstablish, options) { + function establishWebSocketConnection (url, protocols, client, ws, onEstablish, options) { // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s // scheme is "ws", and to "https" otherwise. const requestURL = url; @@ -22934,6 +25378,7 @@ function requireConnection () { // and redirect mode is "error". const request = makeRequest({ urlList: [requestURL], + client, serviceWorkers: 'none', referrer: 'no-referrer', mode: 'websocket', @@ -22944,7 +25389,7 @@ function requireConnection () { // Note: undici extension, allow setting custom headers. if (options.headers) { - const headersList = new Headers(options.headers)[kHeadersList]; + const headersList = getHeadersList(new Headers(options.headers)); request.headersList = headersList; } @@ -22977,19 +25422,18 @@ function requireConnection () { // 9. Let permessageDeflate be a user-agent defined // "permessage-deflate" extension header value. // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673 - // TODO: enable once permessage-deflate is supported - const permessageDeflate = ''; // 'permessage-deflate; 15' + const permessageDeflate = 'permessage-deflate; client_max_window_bits'; // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to // request’s header list. - // request.headersList.append('sec-websocket-extensions', permessageDeflate) + request.headersList.append('sec-websocket-extensions', permessageDeflate); // 11. Fetch request with useParallelQueue set to true, and // processResponse given response being these steps: const controller = fetching({ request, useParallelQueue: true, - dispatcher: options.dispatcher ?? getGlobalDispatcher(), + dispatcher: options.dispatcher, processResponse (response) { // 1. If response is a network error or its status is not 101, // fail the WebSocket connection. @@ -23053,10 +25497,15 @@ function requireConnection () { // header field to determine which extensions are requested is // discussed in Section 9.1.) const secExtension = response.headersList.get('Sec-WebSocket-Extensions'); + let extensions; - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.'); - return + if (secExtension !== null) { + extensions = parseExtensions(secExtension); + + if (!extensions.has('permessage-deflate')) { + failWebsocketConnection(ws, 'Sec-WebSocket-Extensions header does not match.'); + return + } } // 6. If the response includes a |Sec-WebSocket-Protocol| header field @@ -23066,9 +25515,18 @@ function requireConnection () { // the WebSocket Connection_. const secProtocol = response.headersList.get('Sec-WebSocket-Protocol'); - if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) { - failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.'); - return + if (secProtocol !== null) { + const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList); + + // The client can request that the server use a specific subprotocol by + // including the |Sec-WebSocket-Protocol| field in its handshake. If it + // is specified, the server needs to include the same field and one of + // the selected subprotocol values in its response for the connection to + // be established. + if (!requestProtocols.includes(secProtocol)) { + failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.'); + return + } } response.socket.on('data', onSocketData); @@ -23083,13 +25541,72 @@ function requireConnection () { }); } - onEstablish(response); + onEstablish(response, extensions); } }); return controller } + function closeWebSocketConnection (ws, code, reason, reasonByteLength) { + if (isClosing(ws) || isClosed(ws)) ; else if (!isEstablished(ws)) { + // If the WebSocket connection is not yet established + // Fail the WebSocket connection and set this's ready state + // to CLOSING (2). + failWebsocketConnection(ws, 'Connection was closed before it was established.'); + ws[kReadyState] = states.CLOSING; + } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) { + // If the WebSocket closing handshake has not yet been started + // Start the WebSocket closing handshake and set this's ready + // state to CLOSING (2). + // - If neither code nor reason is present, the WebSocket Close + // message must not have a body. + // - If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + // - If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + + ws[kSentClose] = sentCloseFrameState.PROCESSING; + + const frame = new WebsocketFrameSend(); + + // If neither code nor reason is present, the WebSocket Close + // message must not have a body. + + // If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + if (code !== undefined && reason === undefined) { + frame.frameData = Buffer.allocUnsafe(2); + frame.frameData.writeUInt16BE(code, 0); + } else if (code !== undefined && reason !== undefined) { + // If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame.frameData.writeUInt16BE(code, 0); + // the body MAY contain UTF-8-encoded data with value /reason/ + frame.frameData.write(reason, 2, 'utf-8'); + } else { + frame.frameData = emptyBuffer; + } + + /** @type {import('stream').Duplex} */ + const socket = ws[kResponse].socket; + + socket.write(frame.createFrame(opcodes.CLOSE)); + + ws[kSentClose] = sentCloseFrameState.SENT; + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + ws[kReadyState] = states.CLOSING; + } else { + // Otherwise + // Set this's ready state to CLOSING (2). + ws[kReadyState] = states.CLOSING; + } + } + /** * @param {Buffer} chunk */ @@ -23105,21 +25622,26 @@ function requireConnection () { */ function onSocketClose () { const { ws } = this; + const { [kResponse]: response } = ws; + + response.socket.off('data', onSocketData); + response.socket.off('close', onSocketClose); + response.socket.off('error', onSocketError); // If the TCP connection was closed after the // WebSocket closing handshake was completed, the WebSocket connection // is said to have been closed _cleanly_. - const wasClean = ws[kSentClose] && ws[kReceivedClose]; + const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose]; let code = 1005; let reason = ''; const result = ws[kByteParser].closingInfo; - if (result) { + if (result && !result.error) { code = result.code ?? 1005; reason = result.reason; - } else if (!ws[kSentClose]) { + } else if (!ws[kReceivedClose]) { // If _The WebSocket // Connection is Closed_ and no Close control frame was received by the // endpoint (such as could occur if the underlying transport connection @@ -23145,7 +25667,8 @@ function requireConnection () { // attribute initialized to the result of applying UTF-8 // decode without BOM to the WebSocket connection close // reason. - fireEvent('close', ws, CloseEvent, { + // TODO: process.nextTick + fireEvent('close', ws, (type, init) => new CloseEvent(type, init), { wasClean, code, reason }); @@ -23170,129 +25693,144 @@ function requireConnection () { this.destroy(); } - connection = { - establishWebSocketConnection + connection$1 = { + establishWebSocketConnection, + closeWebSocketConnection }; - return connection; + return connection$1; } -var frame; -var hasRequiredFrame; +var permessageDeflate$1; +var hasRequiredPermessageDeflate$1; -function requireFrame () { - if (hasRequiredFrame) return frame; - hasRequiredFrame = 1; +function requirePermessageDeflate$1 () { + if (hasRequiredPermessageDeflate$1) return permessageDeflate$1; + hasRequiredPermessageDeflate$1 = 1; - const { maxUnsigned16Bit } = requireConstants$7(); + const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$3; + const { isValidClientWindowBits } = requireUtil$b(); - /** @type {import('crypto')} */ - let crypto; - try { - crypto = require('crypto'); - } catch { + const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]); + const kBuffer = Symbol('kBuffer'); + const kLength = Symbol('kLength'); - } + class PerMessageDeflate { + /** @type {import('node:zlib').InflateRaw} */ + #inflate - class WebsocketFrameSend { - /** - * @param {Buffer|undefined} data - */ - constructor (data) { - this.frameData = data; - this.maskKey = crypto.randomBytes(4); + #options = {} + + constructor (extensions) { + this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover'); + this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits'); } - createFrame (opcode) { - const bodyLength = this.frameData?.byteLength ?? 0; + decompress (chunk, fin, callback) { + // An endpoint uses the following algorithm to decompress a message. + // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the + // payload of the message. + // 2. Decompress the resulting data using DEFLATE. - /** @type {number} */ - let payloadLength = bodyLength; // 0-125 - let offset = 6; + if (!this.#inflate) { + let windowBits = Z_DEFAULT_WINDOWBITS; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; // payload length is next 8 bytes - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; // payload length is next 2 bytes - payloadLength = 126; - } + if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS + if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) { + callback(new Error('Invalid server_max_window_bits')); + return + } - const buffer = Buffer.allocUnsafe(bodyLength + offset); + windowBits = Number.parseInt(this.#options.serverMaxWindowBits); + } - // Clear first 2 bytes, everything else is overwritten - buffer[0] = buffer[1] = 0; - buffer[0] |= 0x80; // FIN - buffer[0] = (buffer[0] & 0xF0) + opcode; // opcode + this.#inflate = createInflateRaw({ windowBits }); + this.#inflate[kBuffer] = []; + this.#inflate[kLength] = 0; - /*! ws. MIT License. Einar Otto Stangvik */ - buffer[offset - 4] = this.maskKey[0]; - buffer[offset - 3] = this.maskKey[1]; - buffer[offset - 2] = this.maskKey[2]; - buffer[offset - 1] = this.maskKey[3]; + this.#inflate.on('data', (data) => { + this.#inflate[kBuffer].push(data); + this.#inflate[kLength] += data.length; + }); - buffer[1] = payloadLength; + this.#inflate.on('error', (err) => { + this.#inflate = null; + callback(err); + }); + } - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - // Clear extended payload length - buffer[2] = buffer[3] = 0; - buffer.writeUIntBE(bodyLength, 4, 6); + this.#inflate.write(chunk); + if (fin) { + this.#inflate.write(tail); } - buffer[1] |= 0x80; // MASK + this.#inflate.flush(() => { + const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]); - // mask body - for (let i = 0; i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; - } + this.#inflate[kBuffer].length = 0; + this.#inflate[kLength] = 0; - return buffer + callback(null, full); + }); } } - frame = { - WebsocketFrameSend - }; - return frame; + permessageDeflate$1 = { PerMessageDeflate }; + return permessageDeflate$1; } -var receiver; -var hasRequiredReceiver; +var receiver$1; +var hasRequiredReceiver$1; -function requireReceiver () { - if (hasRequiredReceiver) return receiver; - hasRequiredReceiver = 1; +function requireReceiver$1 () { + if (hasRequiredReceiver$1) return receiver$1; + hasRequiredReceiver$1 = 1; - const { Writable } = require$$0$a; - const diagnosticsChannel = require$$0$f; - const { parserStates, opcodes, states, emptyBuffer } = requireConstants$7(); - const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols(); - const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = requireUtil$2(); - const { WebsocketFrameSend } = requireFrame(); + const { Writable } = require$$0$8; + const assert = require$$0$7; + const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = requireConstants$c(); + const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols$5(); + const { channels } = requireDiagnostics$1(); + const { + isValidStatusCode, + isValidOpcode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isTextBinaryFrame, + isContinuationFrame + } = requireUtil$b(); + const { WebsocketFrameSend } = requireFrame$1(); + const { closeWebSocketConnection } = requireConnection$1(); + const { PerMessageDeflate } = requirePermessageDeflate$1(); // This code was influenced by ws released under the MIT license. // Copyright (c) 2011 Einar Otto Stangvik // Copyright (c) 2013 Arnout Kazemier and contributors // Copyright (c) 2016 Luigi Pinca and contributors - const channels = {}; - channels.ping = diagnosticsChannel.channel('undici:websocket:ping'); - channels.pong = diagnosticsChannel.channel('undici:websocket:pong'); - class ByteParser extends Writable { #buffers = [] #byteOffset = 0 + #loop = false #state = parserStates.INFO #info = {} #fragments = [] - constructor (ws) { + /** @type {Map} */ + #extensions + + constructor (ws, extensions) { super(); this.ws = ws; + this.#extensions = extensions == null ? new Map() : extensions; + + if (this.#extensions.has('permessage-deflate')) { + this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions)); + } } /** @@ -23302,6 +25840,7 @@ function requireReceiver () { _write (chunk, _, callback) { this.#buffers.push(chunk); this.#byteOffset += chunk.length; + this.#loop = true; this.run(callback); } @@ -23312,7 +25851,7 @@ function requireReceiver () { * or not enough bytes are buffered to parse. */ run (callback) { - while (true) { + while (this.#loop) { if (this.#state === parserStates.INFO) { // If there aren't enough bytes to parse the payload length, etc. if (this.#byteOffset < 2) { @@ -23320,132 +25859,95 @@ function requireReceiver () { } const buffer = this.consume(2); + const fin = (buffer[0] & 0x80) !== 0; + const opcode = buffer[0] & 0x0F; + const masked = (buffer[1] & 0x80) === 0x80; - this.#info.fin = (buffer[0] & 0x80) !== 0; - this.#info.opcode = buffer[0] & 0x0F; + const fragmented = !fin && opcode !== opcodes.CONTINUATION; + const payloadLength = buffer[1] & 0x7F; + + const rsv1 = buffer[0] & 0x40; + const rsv2 = buffer[0] & 0x20; + const rsv3 = buffer[0] & 0x10; + + if (!isValidOpcode(opcode)) { + failWebsocketConnection(this.ws, 'Invalid opcode received'); + return callback() + } - // If we receive a fragmented message, we use the type of the first - // frame to parse the full message as binary/text, when it's terminated - this.#info.originalOpcode ??= this.#info.opcode; + if (masked) { + failWebsocketConnection(this.ws, 'Frame cannot be masked'); + return callback() + } - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; + // MUST be 0 unless an extension is negotiated that defines meanings + // for non-zero values. If a nonzero value is received and none of + // the negotiated extensions defines the meaning of such a nonzero + // value, the receiving endpoint MUST _Fail the WebSocket + // Connection_. + // This document allocates the RSV1 bit of the WebSocket header for + // PMCEs and calls the bit the "Per-Message Compressed" bit. On a + // WebSocket connection where a PMCE is in use, this bit indicates + // whether a message is compressed or not. + if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) { + failWebsocketConnection(this.ws, 'Expected RSV1 to be clear.'); + return + } - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + if (rsv2 !== 0 || rsv3 !== 0) { + failWebsocketConnection(this.ws, 'RSV1, RSV2, RSV3 must be clear'); + return + } + + if (fragmented && !isTextBinaryFrame(opcode)) { // Only text and binary frames can be fragmented failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.'); return } - const payloadLength = buffer[1] & 0x7F; - - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; + // If we are already parsing a text/binary frame and do not receive either + // a continuation frame or close frame, fail the connection. + if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { + failWebsocketConnection(this.ws, 'Expected continuation frame'); + return } - if (this.#info.fragmented && payloadLength > 125) { + if (this.#info.fragmented && fragmented) { // A fragmented frame can't be fragmented itself failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.'); return - } else if ( - (this.#info.opcode === opcodes.PING || - this.#info.opcode === opcodes.PONG || - this.#info.opcode === opcodes.CLOSE) && - payloadLength > 125 - ) { - // Control frames can have a payload length of 125 bytes MAX - failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.'); - return - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.'); - return - } - - const body = this.consume(payloadLength); - - this.#info.closeInfo = this.parseCloseBody(false, body); - - if (!this.ws[kSentClose]) { - // If an endpoint receives a Close frame and did not previously send a - // Close frame, the endpoint MUST send a Close frame in response. (When - // sending a Close frame in response, the endpoint typically echos the - // status code it received.) - const body = Buffer.allocUnsafe(2); - body.writeUInt16BE(this.#info.closeInfo.code, 0); - const closeFrame = new WebsocketFrameSend(body); - - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = true; - } - } - ); - } - - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; - - this.end(); + } + // "All control frames MUST have a payload length of 125 bytes or less + // and MUST NOT be fragmented." + if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { + failWebsocketConnection(this.ws, 'Control frame either too large or fragmented'); return - } else if (this.#info.opcode === opcodes.PING) { - // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in - // response, unless it already received a Close frame. - // A Pong frame sent in response to a Ping frame must have identical - // "Application data" - - const body = this.consume(payloadLength); - - if (!this.ws[kReceivedClose]) { - const frame = new WebsocketFrameSend(body); - - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); - - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body - }); - } - } - - this.#state = parserStates.INFO; - - if (this.#byteOffset > 0) { - continue - } else { - callback(); - return - } - } else if (this.#info.opcode === opcodes.PONG) { - // A Pong frame MAY be sent unsolicited. This serves as a - // unidirectional heartbeat. A response to an unsolicited Pong frame is - // not expected. + } - const body = this.consume(payloadLength); + if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { + failWebsocketConnection(this.ws, 'Unexpected continuation frame'); + return + } - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body - }); - } + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; + } - if (this.#byteOffset > 0) { - continue - } else { - callback(); - return - } + if (isTextBinaryFrame(opcode)) { + this.#info.binaryType = opcode; + this.#info.compressed = rsv1 !== 0; } + + this.#info.opcode = opcode; + this.#info.masked = masked; + this.#info.fin = fin; + this.#info.fragmented = fragmented; } else if (this.#state === parserStates.PAYLOADLENGTH_16) { if (this.#byteOffset < 2) { return callback() @@ -23463,7 +25965,7 @@ function requireReceiver () { const buffer = this.consume(8); const upper = buffer.readUInt32BE(0); - // 2^31 is the maxinimum bytes an arraybuffer can contain + // 2^31 is the maximum bytes an arraybuffer can contain // on 32-bit systems. Although, on 64-bit systems, this is // 2^53-1 bytes. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length @@ -23480,47 +25982,69 @@ function requireReceiver () { this.#state = parserStates.READ_DATA; } else if (this.#state === parserStates.READ_DATA) { if (this.#byteOffset < this.#info.payloadLength) { - // If there is still more data in this chunk that needs to be read return callback() - } else if (this.#byteOffset >= this.#info.payloadLength) { - // If the server sent multiple frames in a single chunk + } + + const body = this.consume(this.#info.payloadLength); + + if (isControlFrame(this.#info.opcode)) { + this.#loop = this.parseControlFrame(body); + this.#state = parserStates.INFO; + } else { + if (!this.#info.compressed) { + this.#fragments.push(body); + + // If the frame is not fragmented, a message has been received. + // If the frame is fragmented, it will terminate with a fin bit set + // and an opcode of 0 (continuation), therefore we handle that when + // parsing continuation frames, not here. + if (!this.#info.fragmented && this.#info.fin) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage); + this.#fragments.length = 0; + } - const body = this.consume(this.#info.payloadLength); + this.#state = parserStates.INFO; + } else { + this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => { + if (error) { + closeWebSocketConnection(this.ws, 1007, error.message, error.message.length); + return + } - this.#fragments.push(body); + this.#fragments.push(data); - // If the frame is unfragmented, or a fragmented frame was terminated, - // a message was received - if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) { - const fullMessage = Buffer.concat(this.#fragments); + if (!this.#info.fin) { + this.#state = parserStates.INFO; + this.#loop = true; + this.run(callback); + return + } - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); + websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)); - this.#info = {}; - this.#fragments.length = 0; - } + this.#loop = true; + this.#state = parserStates.INFO; + this.#fragments.length = 0; + this.run(callback); + }); - this.#state = parserStates.INFO; + this.#loop = false; + break + } } } - - if (this.#byteOffset > 0) { - continue - } else { - callback(); - break - } } } /** * Take n bytes from the buffered Buffers * @param {number} n - * @returns {Buffer|null} + * @returns {Buffer} */ consume (n) { if (n > this.#byteOffset) { - return null + throw new Error('Called consume() before buffers satiated.') } else if (n === 0) { return emptyBuffer } @@ -23555,7 +26079,9 @@ function requireReceiver () { return buffer } - parseCloseBody (onlyCode, data) { + parseCloseBody (data) { + assert(data.length !== 1); + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 /** @type {number|undefined} */ let code; @@ -23567,12 +26093,8 @@ function requireReceiver () { code = data.readUInt16BE(0); } - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null - } - - return { code } + if (code !== undefined && !isValidStatusCode(code)) { + return { code: 1002, reason: 'Invalid status code', error: true } } // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6 @@ -23584,18 +26106,97 @@ function requireReceiver () { reason = reason.subarray(3); } - if (code !== undefined && !isValidStatusCode(code)) { - return null - } - try { - // TODO: optimize this - reason = new TextDecoder('utf-8', { fatal: true }).decode(reason); + reason = utf8Decode(reason); } catch { - return null + return { code: 1007, reason: 'Invalid UTF-8', error: true } + } + + return { code, reason, error: false } + } + + /** + * Parses control frames. + * @param {Buffer} body + */ + parseControlFrame (body) { + const { opcode, payloadLength } = this.#info; + + if (opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.'); + return false + } + + this.#info.closeInfo = this.parseCloseBody(body); + + if (this.#info.closeInfo.error) { + const { code, reason } = this.#info.closeInfo; + + closeWebSocketConnection(this.ws, code, reason, reason.length); + failWebsocketConnection(this.ws, reason); + return false + } + + if (this.ws[kSentClose] !== sentCloseFrameState.SENT) { + // If an endpoint receives a Close frame and did not previously send a + // Close frame, the endpoint MUST send a Close frame in response. (When + // sending a Close frame in response, the endpoint typically echos the + // status code it received.) + let body = emptyBuffer; + if (this.#info.closeInfo.code) { + body = Buffer.allocUnsafe(2); + body.writeUInt16BE(this.#info.closeInfo.code, 0); + } + const closeFrame = new WebsocketFrameSend(body); + + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = sentCloseFrameState.SENT; + } + } + ); + } + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + + return false + } else if (opcode === opcodes.PING) { + // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in + // response, unless it already received a Close frame. + // A Pong frame sent in response to a Ping frame must have identical + // "Application data" + + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body); + + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); + + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }); + } + } + } else if (opcode === opcodes.PONG) { + // A Pong frame MAY be sent unsolicited. This serves as a + // unidirectional heartbeat. A response to an unsolicited Pong frame is + // not expected. + + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }); + } } - return { code, reason } + return true } get closingInfo () { @@ -23603,24 +26204,135 @@ function requireReceiver () { } } - receiver = { + receiver$1 = { ByteParser }; - return receiver; + return receiver$1; } -var websocket; -var hasRequiredWebsocket; +var sender$1; +var hasRequiredSender$1; -function requireWebsocket () { - if (hasRequiredWebsocket) return websocket; - hasRequiredWebsocket = 1; +function requireSender$1 () { + if (hasRequiredSender$1) return sender$1; + hasRequiredSender$1 = 1; - const { webidl } = requireWebidl(); - const { DOMException } = requireConstants$a(); - const { URLSerializer } = requireDataURL(); - const { getGlobalOrigin } = requireGlobal$1(); - const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = requireConstants$7(); + const { WebsocketFrameSend } = requireFrame$1(); + const { opcodes, sendHints } = requireConstants$c(); + const FixedQueue = requireFixedQueue$1(); + + /** @type {typeof Uint8Array} */ + const FastBuffer = Buffer[Symbol.species]; + + /** + * @typedef {object} SendQueueNode + * @property {Promise | null} promise + * @property {((...args: any[]) => any)} callback + * @property {Buffer | null} frame + */ + + class SendQueue { + /** + * @type {FixedQueue} + */ + #queue = new FixedQueue() + + /** + * @type {boolean} + */ + #running = false + + /** @type {import('node:net').Socket} */ + #socket + + constructor (socket) { + this.#socket = socket; + } + + add (item, cb, hint) { + if (hint !== sendHints.blob) { + const frame = createFrame(item, hint); + if (!this.#running) { + // fast-path + this.#socket.write(frame, cb); + } else { + /** @type {SendQueueNode} */ + const node = { + promise: null, + callback: cb, + frame + }; + this.#queue.push(node); + } + return + } + + /** @type {SendQueueNode} */ + const node = { + promise: item.arrayBuffer().then((ab) => { + node.promise = null; + node.frame = createFrame(ab, hint); + }), + callback: cb, + frame: null + }; + + this.#queue.push(node); + + if (!this.#running) { + this.#run(); + } + } + + async #run () { + this.#running = true; + const queue = this.#queue; + while (!queue.isEmpty()) { + const node = queue.shift(); + // wait pending promise + if (node.promise !== null) { + await node.promise; + } + // write + this.#socket.write(node.frame, node.callback); + // cleanup + node.callback = node.frame = null; + } + this.#running = false; + } + } + + function createFrame (data, hint) { + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY) + } + + function toBuffer (data, hint) { + switch (hint) { + case sendHints.string: + return Buffer.from(data) + case sendHints.arrayBuffer: + case sendHints.blob: + return new FastBuffer(data) + case sendHints.typedArray: + return new FastBuffer(data.buffer, data.byteOffset, data.byteLength) + } + } + + sender$1 = { SendQueue }; + return sender$1; +} + +var websocket$1; +var hasRequiredWebsocket$1; + +function requireWebsocket$1 () { + if (hasRequiredWebsocket$1) return websocket$1; + hasRequiredWebsocket$1 = 1; + + const { webidl } = requireWebidl$1(); + const { URLSerializer } = requireDataUrl$1(); + const { environmentSettingsObject } = requireUtil$g(); + const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = requireConstants$c(); const { kWebSocketURL, kReadyState, @@ -23629,16 +26341,21 @@ function requireWebsocket () { kResponse, kSentClose, kByteParser - } = requireSymbols(); - const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = requireUtil$2(); - const { establishWebSocketConnection } = requireConnection(); - const { WebsocketFrameSend } = requireFrame(); - const { ByteParser } = requireReceiver(); - const { kEnumerableProperty, isBlobLike } = requireUtil$8(); - const { getGlobalDispatcher } = requireGlobal(); - const { types } = require$$0$6; - - let experimentalWarned = false; + } = requireSymbols$5(); + const { + isConnecting, + isEstablished, + isClosing, + isValidSubprotocol, + fireEvent + } = requireUtil$b(); + const { establishWebSocketConnection, closeWebSocketConnection } = requireConnection$1(); + const { ByteParser } = requireReceiver$1(); + const { kEnumerableProperty, isBlobLike } = requireUtil$h(); + const { getGlobalDispatcher } = requireGlobal$2(); + const { types } = require$$0$a; + const { ErrorEvent, CloseEvent } = requireEvents$1(); + const { SendQueue } = requireSender$1(); // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -23653,6 +26370,9 @@ function requireWebsocket () { #protocol = '' #extensions = '' + /** @type {SendQueue} */ + #sendQueue + /** * @param {string} url * @param {string|string[]} protocols @@ -23660,22 +26380,18 @@ function requireWebsocket () { constructor (url, protocols = []) { super(); - webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' }); + webidl.util.markAsUncloneable(this); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning('WebSockets are experimental, expect them to change at any time.', { - code: 'UNDICI-WS' - }); - } + const prefix = 'WebSocket constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols); + const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options'); - url = webidl.converters.USVString(url); + url = webidl.converters.USVString(url, prefix, 'url'); protocols = options.protocols; // 1. Let baseURL be this's relevant settings object's API base URL. - const baseURL = getGlobalOrigin(); + const baseURL = environmentSettingsObject.settingsObject.baseUrl; // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. let urlRecord; @@ -23731,6 +26447,7 @@ function requireWebsocket () { this[kWebSocketURL] = new URL(urlRecord.href); // 11. Let client be this's relevant settings object. + const client = environmentSettingsObject.settingsObject; // 12. Run this step in parallel: @@ -23739,8 +26456,9 @@ function requireWebsocket () { this[kController] = establishWebSocketConnection( urlRecord, protocols, + client, this, - (response) => this.#onConnectionEstablished(response), + (response, extensions) => this.#onConnectionEstablished(response, extensions), options ); @@ -23749,6 +26467,8 @@ function requireWebsocket () { // be CONNECTING (0). this[kReadyState] = WebSocket.CONNECTING; + this[kSentClose] = sentCloseFrameState.NOT_SENT; + // The extensions attribute must initially return the empty string. // The protocol attribute must initially return the empty string. @@ -23766,12 +26486,14 @@ function requireWebsocket () { close (code = undefined, reason = undefined) { webidl.brandCheck(this, WebSocket); + const prefix = 'WebSocket.close'; + if (code !== undefined) { - code = webidl.converters['unsigned short'](code, { clamp: true }); + code = webidl.converters['unsigned short'](code, prefix, 'code', { clamp: true }); } if (reason !== undefined) { - reason = webidl.converters.USVString(reason); + reason = webidl.converters.USVString(reason, prefix, 'reason'); } // 1. If code is present, but is neither an integer equal to 1000 nor an @@ -23801,62 +26523,7 @@ function requireWebsocket () { } // 3. Run the first matching steps from the following list: - if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) ; else if (!isEstablished(this)) { - // If the WebSocket connection is not yet established - // Fail the WebSocket connection and set this's ready state - // to CLOSING (2). - failWebsocketConnection(this, 'Connection was closed before it was established.'); - this[kReadyState] = WebSocket.CLOSING; - } else if (!isClosing(this)) { - // If the WebSocket closing handshake has not yet been started - // Start the WebSocket closing handshake and set this's ready - // state to CLOSING (2). - // - If neither code nor reason is present, the WebSocket Close - // message must not have a body. - // - If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - // - If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. - - const frame = new WebsocketFrameSend(); - - // If neither code nor reason is present, the WebSocket Close - // message must not have a body. - - // If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - if (code !== undefined && reason === undefined) { - frame.frameData = Buffer.allocUnsafe(2); - frame.frameData.writeUInt16BE(code, 0); - } else if (code !== undefined && reason !== undefined) { - // If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); - frame.frameData.writeUInt16BE(code, 0); - // the body MAY contain UTF-8-encoded data with value /reason/ - frame.frameData.write(reason, 2, 'utf-8'); - } else { - frame.frameData = emptyBuffer; - } - - /** @type {import('stream').Duplex} */ - const socket = this[kResponse].socket; - - socket.write(frame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true; - } - }); - - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - this[kReadyState] = states.CLOSING; - } else { - // Otherwise - // Set this's ready state to CLOSING (2). - this[kReadyState] = WebSocket.CLOSING; - } + closeWebSocketConnection(this, code, reason, reasonByteLength); } /** @@ -23866,13 +26533,14 @@ function requireWebsocket () { send (data) { webidl.brandCheck(this, WebSocket); - webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' }); + const prefix = 'WebSocket.send'; + webidl.argumentLengthCheck(arguments, 1, prefix); - data = webidl.converters.WebSocketSendData(data); + data = webidl.converters.WebSocketSendData(data, prefix, 'data'); // 1. If this's ready state is CONNECTING, then throw an // "InvalidStateError" DOMException. - if (this[kReadyState] === WebSocket.CONNECTING) { + if (isConnecting(this)) { throw new DOMException('Sent before connected.', 'InvalidStateError') } @@ -23884,9 +26552,6 @@ function requireWebsocket () { return } - /** @type {import('stream').Duplex} */ - const socket = this[kResponse].socket; - // If data is a string if (typeof data === 'string') { // If the WebSocket connection is established and the WebSocket @@ -23900,14 +26565,12 @@ function requireWebsocket () { // the bufferedAmount attribute by the number of bytes needed to // express the argument as UTF-8. - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.TEXT); + const length = Buffer.byteLength(data); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); + this.#bufferedAmount += length; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= length; + }, sendHints.string); } else if (types.isArrayBuffer(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -23921,14 +26584,10 @@ function requireWebsocket () { // increase the bufferedAmount attribute by the length of the // ArrayBuffer in bytes. - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.BINARY); - - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.arrayBuffer); } else if (ArrayBuffer.isView(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -23942,15 +26601,10 @@ function requireWebsocket () { // not throw an exception must increase the bufferedAmount attribute // by the length of data’s buffer in bytes. - const ab = Buffer.from(data, data.byteOffset, data.byteLength); - - const frame = new WebsocketFrameSend(ab); - const buffer = frame.createFrame(opcodes.BINARY); - - this.#bufferedAmount += ab.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength; - }); + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.typedArray); } else if (isBlobLike(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -23963,18 +26617,10 @@ function requireWebsocket () { // an exception must increase the bufferedAmount attribute by the size // of the Blob object’s raw data, in bytes. - const frame = new WebsocketFrameSend(); - - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab); - frame.frameData = value; - const buffer = frame.createFrame(opcodes.BINARY); - - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - }); + this.#bufferedAmount += data.size; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.size; + }, sendHints.blob); } } @@ -24113,19 +26759,20 @@ function requireWebsocket () { /** * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol */ - #onConnectionEstablished (response) { + #onConnectionEstablished (response, parsedExtensions) { // processResponse is called when the "response’s header list has been received and initialized." // once this happens, the connection is open this[kResponse] = response; - const parser = new ByteParser(this); - parser.on('drain', function onParserDrain () { - this.ws[kResponse].socket.resume(); - }); + const parser = new ByteParser(this, parsedExtensions); + parser.on('drain', onParserDrain); + parser.on('error', onParserError.bind(this)); response.socket.ws = this; this[kByteParser] = parser; + this.#sendQueue = new SendQueue(response.socket); + // 1. Change the ready state to OPEN (1). this[kReadyState] = states.OPEN; @@ -24197,29 +26844,25 @@ function requireWebsocket () { webidl.converters.DOMString ); - webidl.converters['DOMString or sequence'] = function (V) { + webidl.converters['DOMString or sequence'] = function (V, prefix, argument) { if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { return webidl.converters['sequence'](V) } - return webidl.converters.DOMString(V) + return webidl.converters.DOMString(V, prefix, argument) }; - // This implements the propsal made in https://github.com/whatwg/websockets/issues/42 + // This implements the proposal made in https://github.com/whatwg/websockets/issues/42 webidl.converters.WebSocketInit = webidl.dictionaryConverter([ { key: 'protocols', converter: webidl.converters['DOMString or sequence'], - get defaultValue () { - return [] - } + defaultValue: () => new Array(0) }, { key: 'dispatcher', - converter: (V) => V, - get defaultValue () { - return getGlobalDispatcher() - } + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() }, { key: 'headers', @@ -24241,7 +26884,7 @@ function requireWebsocket () { return webidl.converters.Blob(V, { strict: false }) } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { return webidl.converters.BufferSource(V) } } @@ -24249,63 +26892,1028 @@ function requireWebsocket () { return webidl.converters.USVString(V) }; - websocket = { + function onParserDrain () { + this.ws[kResponse].socket.resume(); + } + + function onParserError (err) { + let message; + let code; + + if (err instanceof CloseEvent) { + message = err.reason; + code = err.code; + } else { + message = err.message; + } + + fireEvent('error', this, () => new ErrorEvent('error', { error: err, message })); + + closeWebSocketConnection(this, code); + } + + websocket$1 = { WebSocket }; - return websocket; + return websocket$1; } -var hasRequiredUndici; +var util$a; +var hasRequiredUtil$a; -function requireUndici () { - if (hasRequiredUndici) return undici; - hasRequiredUndici = 1; +function requireUtil$a () { + if (hasRequiredUtil$a) return util$a; + hasRequiredUtil$a = 1; - const Client = requireClient(); - const Dispatcher = requireDispatcher(); - const errors = requireErrors$1(); - const Pool = requirePool(); - const BalancedPool = requireBalancedPool(); - const Agent = requireAgent(); - const util = requireUtil$8(); - const { InvalidArgumentError } = errors; - const api = requireApi(); - const buildConnector = requireConnect(); - const MockClient = requireMockClient(); - const MockAgent = requireMockAgent(); - const MockPool = requireMockPool(); - const mockErrors = requireMockErrors(); - const ProxyAgent = requireProxyAgent(); - const RetryHandler = requireRetryHandler(); - const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal(); - const DecoratorHandler = requireDecoratorHandler(); - const RedirectHandler = requireRedirectHandler(); - const createRedirectInterceptor = requireRedirectInterceptor(); + /** + * Checks if the given value is a valid LastEventId. + * @param {string} value + * @returns {boolean} + */ + function isValidLastEventId (value) { + // LastEventId should not contain U+0000 NULL + return value.indexOf('\u0000') === -1 + } - let hasCrypto; - try { - require('crypto'); - hasCrypto = true; - } catch { - hasCrypto = false; + /** + * Checks if the given value is a base 10 digit. + * @param {string} value + * @returns {boolean} + */ + function isASCIINumber (value) { + if (value.length === 0) return false + for (let i = 0; i < value.length; i++) { + if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false + } + return true } - Object.assign(Dispatcher.prototype, api); + // https://github.com/nodejs/undici/issues/2664 + function delay (ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms).unref(); + }) + } - undici.Dispatcher = Dispatcher; - undici.Client = Client; - undici.Pool = Pool; - undici.BalancedPool = BalancedPool; - undici.Agent = Agent; - undici.ProxyAgent = ProxyAgent; - undici.RetryHandler = RetryHandler; + util$a = { + isValidLastEventId, + isASCIINumber, + delay + }; + return util$a; +} - undici.DecoratorHandler = DecoratorHandler; - undici.RedirectHandler = RedirectHandler; - undici.createRedirectInterceptor = createRedirectInterceptor; +var eventsourceStream$1; +var hasRequiredEventsourceStream$1; - undici.buildConnector = buildConnector; - undici.errors = errors; +function requireEventsourceStream$1 () { + if (hasRequiredEventsourceStream$1) return eventsourceStream$1; + hasRequiredEventsourceStream$1 = 1; + const { Transform } = require$$0$8; + const { isASCIINumber, isValidLastEventId } = requireUtil$a(); + + /** + * @type {number[]} BOM + */ + const BOM = [0xEF, 0xBB, 0xBF]; + /** + * @type {10} LF + */ + const LF = 0x0A; + /** + * @type {13} CR + */ + const CR = 0x0D; + /** + * @type {58} COLON + */ + const COLON = 0x3A; + /** + * @type {32} SPACE + */ + const SPACE = 0x20; + + /** + * @typedef {object} EventSourceStreamEvent + * @type {object} + * @property {string} [event] The event type. + * @property {string} [data] The data of the message. + * @property {string} [id] A unique ID for the event. + * @property {string} [retry] The reconnection time, in milliseconds. + */ + + /** + * @typedef eventSourceSettings + * @type {object} + * @property {string} lastEventId The last event ID received from the server. + * @property {string} origin The origin of the event source. + * @property {number} reconnectionTime The reconnection time, in milliseconds. + */ + + class EventSourceStream extends Transform { + /** + * @type {eventSourceSettings} + */ + state = null + + /** + * Leading byte-order-mark check. + * @type {boolean} + */ + checkBOM = true + + /** + * @type {boolean} + */ + crlfCheck = false + + /** + * @type {boolean} + */ + eventEndCheck = false + + /** + * @type {Buffer} + */ + buffer = null + + pos = 0 + + event = { + data: undefined, + event: undefined, + id: undefined, + retry: undefined + } + + /** + * @param {object} options + * @param {eventSourceSettings} options.eventSourceSettings + * @param {Function} [options.push] + */ + constructor (options = {}) { + // Enable object mode as EventSourceStream emits objects of shape + // EventSourceStreamEvent + options.readableObjectMode = true; + + super(options); + + this.state = options.eventSourceSettings || {}; + if (options.push) { + this.push = options.push; + } + } + + /** + * @param {Buffer} chunk + * @param {string} _encoding + * @param {Function} callback + * @returns {void} + */ + _transform (chunk, _encoding, callback) { + if (chunk.length === 0) { + callback(); + return + } + + // Cache the chunk in the buffer, as the data might not be complete while + // processing it + // TODO: Investigate if there is a more performant way to handle + // incoming chunks + // see: https://github.com/nodejs/undici/issues/2630 + if (this.buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.buffer = chunk; + } + + // Strip leading byte-order-mark if we opened the stream and started + // the processing of the incoming data + if (this.checkBOM) { + switch (this.buffer.length) { + case 1: + // Check if the first byte is the same as the first byte of the BOM + if (this.buffer[0] === BOM[0]) { + // If it is, we need to wait for more data + callback(); + return + } + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + + // The buffer only contains one byte so we need to wait for more data + callback(); + return + case 2: + // Check if the first two bytes are the same as the first two bytes + // of the BOM + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] + ) { + // If it is, we need to wait for more data, because the third byte + // is needed to determine if it is the BOM or not + callback(); + return + } + + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + break + case 3: + // Check if the first three bytes are the same as the first three + // bytes of the BOM + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] && + this.buffer[2] === BOM[2] + ) { + // If it is, we can drop the buffered data, as it is only the BOM + this.buffer = Buffer.alloc(0); + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + + // Await more data + callback(); + return + } + // If it is not the BOM, we can start processing the data + this.checkBOM = false; + break + default: + // The buffer is longer than 3 bytes, so we can drop the BOM if it is + // present + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] && + this.buffer[2] === BOM[2] + ) { + // Remove the BOM from the buffer + this.buffer = this.buffer.subarray(3); + } + + // Set the checkBOM flag to false as we don't need to check for the + this.checkBOM = false; + break + } + } + + while (this.pos < this.buffer.length) { + // If the previous line ended with an end-of-line, we need to check + // if the next character is also an end-of-line. + if (this.eventEndCheck) { + // If the the current character is an end-of-line, then the event + // is finished and we can process it + + // If the previous line ended with a carriage return, we need to + // check if the current character is a line feed and remove it + // from the buffer. + if (this.crlfCheck) { + // If the current character is a line feed, we can remove it + // from the buffer and reset the crlfCheck flag + if (this.buffer[this.pos] === LF) { + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.crlfCheck = false; + + // It is possible that the line feed is not the end of the + // event. We need to check if the next character is an + // end-of-line character to determine if the event is + // finished. We simply continue the loop to check the next + // character. + + // As we removed the line feed from the buffer and set the + // crlfCheck flag to false, we basically don't make any + // distinction between a line feed and a carriage return. + continue + } + this.crlfCheck = false; + } + + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + // If the current character is a carriage return, we need to + // set the crlfCheck flag to true, as we need to check if the + // next character is a line feed so we can remove it from the + // buffer + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + if ( + this.event.data !== undefined || this.event.event || this.event.id || this.event.retry) { + this.processEvent(this.event); + } + this.clearEvent(); + continue + } + // If the current character is not an end-of-line, then the event + // is not finished and we have to reset the eventEndCheck flag + this.eventEndCheck = false; + continue + } + + // If the current character is an end-of-line, we can process the + // line + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + // If the current character is a carriage return, we need to + // set the crlfCheck flag to true, as we need to check if the + // next character is a line feed + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + + // In any case, we can process the line as we reached an + // end-of-line character + this.parseLine(this.buffer.subarray(0, this.pos), this.event); + + // Remove the processed line from the buffer + this.buffer = this.buffer.subarray(this.pos + 1); + // Reset the position as we removed the processed line from the buffer + this.pos = 0; + // A line was processed and this could be the end of the event. We need + // to check if the next line is empty to determine if the event is + // finished. + this.eventEndCheck = true; + continue + } + + this.pos++; + } + + callback(); + } + + /** + * @param {Buffer} line + * @param {EventStreamEvent} event + */ + parseLine (line, event) { + // If the line is empty (a blank line) + // Dispatch the event, as defined below. + // This will be handled in the _transform method + if (line.length === 0) { + return + } + + // If the line starts with a U+003A COLON character (:) + // Ignore the line. + const colonPosition = line.indexOf(COLON); + if (colonPosition === 0) { + return + } + + let field = ''; + let value = ''; + + // If the line contains a U+003A COLON character (:) + if (colonPosition !== -1) { + // Collect the characters on the line before the first U+003A COLON + // character (:), and let field be that string. + // TODO: Investigate if there is a more performant way to extract the + // field + // see: https://github.com/nodejs/undici/issues/2630 + field = line.subarray(0, colonPosition).toString('utf8'); + + // Collect the characters on the line after the first U+003A COLON + // character (:), and let value be that string. + // If value starts with a U+0020 SPACE character, remove it from value. + let valueStart = colonPosition + 1; + if (line[valueStart] === SPACE) { + ++valueStart; + } + // TODO: Investigate if there is a more performant way to extract the + // value + // see: https://github.com/nodejs/undici/issues/2630 + value = line.subarray(valueStart).toString('utf8'); + + // Otherwise, the string is not empty but does not contain a U+003A COLON + // character (:) + } else { + // Process the field using the steps described below, using the whole + // line as the field name, and the empty string as the field value. + field = line.toString('utf8'); + value = ''; + } + + // Modify the event with the field name and value. The value is also + // decoded as UTF-8 + switch (field) { + case 'data': + if (event[field] === undefined) { + event[field] = value; + } else { + event[field] += `\n${value}`; + } + break + case 'retry': + if (isASCIINumber(value)) { + event[field] = value; + } + break + case 'id': + if (isValidLastEventId(value)) { + event[field] = value; + } + break + case 'event': + if (value.length > 0) { + event[field] = value; + } + break + } + } + + /** + * @param {EventSourceStreamEvent} event + */ + processEvent (event) { + if (event.retry && isASCIINumber(event.retry)) { + this.state.reconnectionTime = parseInt(event.retry, 10); + } + + if (event.id && isValidLastEventId(event.id)) { + this.state.lastEventId = event.id; + } + + // only dispatch event, when data is provided + if (event.data !== undefined) { + this.push({ + type: event.event || 'message', + options: { + data: event.data, + lastEventId: this.state.lastEventId, + origin: this.state.origin + } + }); + } + } + + clearEvent () { + this.event = { + data: undefined, + event: undefined, + id: undefined, + retry: undefined + }; + } + } + + eventsourceStream$1 = { + EventSourceStream + }; + return eventsourceStream$1; +} + +var eventsource$1; +var hasRequiredEventsource$1; + +function requireEventsource$1 () { + if (hasRequiredEventsource$1) return eventsource$1; + hasRequiredEventsource$1 = 1; + + const { pipeline } = require$$0$8; + const { fetching } = requireFetch$1(); + const { makeRequest } = requireRequest$2(); + const { webidl } = requireWebidl$1(); + const { EventSourceStream } = requireEventsourceStream$1(); + const { parseMIMEType } = requireDataUrl$1(); + const { createFastMessageEvent } = requireEvents$1(); + const { isNetworkError } = requireResponse$2(); + const { delay } = requireUtil$a(); + const { kEnumerableProperty } = requireUtil$h(); + const { environmentSettingsObject } = requireUtil$g(); + + let experimentalWarned = false; + + /** + * A reconnection time, in milliseconds. This must initially be an implementation-defined value, + * probably in the region of a few seconds. + * + * In Comparison: + * - Chrome uses 3000ms. + * - Deno uses 5000ms. + * + * @type {3000} + */ + const defaultReconnectionTime = 3000; + + /** + * The readyState attribute represents the state of the connection. + * @enum + * @readonly + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev + */ + + /** + * The connection has not yet been established, or it was closed and the user + * agent is reconnecting. + * @type {0} + */ + const CONNECTING = 0; + + /** + * The user agent has an open connection and is dispatching events as it + * receives them. + * @type {1} + */ + const OPEN = 1; + + /** + * The connection is not open, and the user agent is not trying to reconnect. + * @type {2} + */ + const CLOSED = 2; + + /** + * Requests for the element will have their mode set to "cors" and their credentials mode set to "same-origin". + * @type {'anonymous'} + */ + const ANONYMOUS = 'anonymous'; + + /** + * Requests for the element will have their mode set to "cors" and their credentials mode set to "include". + * @type {'use-credentials'} + */ + const USE_CREDENTIALS = 'use-credentials'; + + /** + * The EventSource interface is used to receive server-sent events. It + * connects to a server over HTTP and receives events in text/event-stream + * format without closing the connection. + * @extends {EventTarget} + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events + * @api public + */ + class EventSource extends EventTarget { + #events = { + open: null, + error: null, + message: null + } + + #url = null + #withCredentials = false + + #readyState = CONNECTING + + #request = null + #controller = null + + #dispatcher + + /** + * @type {import('./eventsource-stream').eventSourceSettings} + */ + #state + + /** + * Creates a new EventSource object. + * @param {string} url + * @param {EventSourceInit} [eventSourceInitDict] + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface + */ + constructor (url, eventSourceInitDict = {}) { + // 1. Let ev be a new EventSource object. + super(); + + webidl.util.markAsUncloneable(this); + + const prefix = 'EventSource constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning('EventSource is experimental, expect them to change at any time.', { + code: 'UNDICI-ES' + }); + } + + url = webidl.converters.USVString(url, prefix, 'url'); + eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict'); + + this.#dispatcher = eventSourceInitDict.dispatcher; + this.#state = { + lastEventId: '', + reconnectionTime: defaultReconnectionTime + }; + + // 2. Let settings be ev's relevant settings object. + // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object + const settings = environmentSettingsObject; + + let urlRecord; + + try { + // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings. + urlRecord = new URL(url, settings.settingsObject.baseUrl); + this.#state.origin = urlRecord.origin; + } catch (e) { + // 4. If urlRecord is failure, then throw a "SyntaxError" DOMException. + throw new DOMException(e, 'SyntaxError') + } + + // 5. Set ev's url to urlRecord. + this.#url = urlRecord.href; + + // 6. Let corsAttributeState be Anonymous. + let corsAttributeState = ANONYMOUS; + + // 7. If the value of eventSourceInitDict's withCredentials member is true, + // then set corsAttributeState to Use Credentials and set ev's + // withCredentials attribute to true. + if (eventSourceInitDict.withCredentials) { + corsAttributeState = USE_CREDENTIALS; + this.#withCredentials = true; + } + + // 8. Let request be the result of creating a potential-CORS request given + // urlRecord, the empty string, and corsAttributeState. + const initRequest = { + redirect: 'follow', + keepalive: true, + // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes + mode: 'cors', + credentials: corsAttributeState === 'anonymous' + ? 'same-origin' + : 'omit', + referrer: 'no-referrer' + }; + + // 9. Set request's client to settings. + initRequest.client = environmentSettingsObject.settingsObject; + + // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list. + initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]; + + // 11. Set request's cache mode to "no-store". + initRequest.cache = 'no-store'; + + // 12. Set request's initiator type to "other". + initRequest.initiator = 'other'; + + initRequest.urlList = [new URL(this.#url)]; + + // 13. Set ev's request to request. + this.#request = makeRequest(initRequest); + + this.#connect(); + } + + /** + * Returns the state of this EventSource object's connection. It can have the + * values described below. + * @returns {0|1|2} + * @readonly + */ + get readyState () { + return this.#readyState + } + + /** + * Returns the URL providing the event stream. + * @readonly + * @returns {string} + */ + get url () { + return this.#url + } + + /** + * Returns a boolean indicating whether the EventSource object was + * instantiated with CORS credentials set (true), or not (false, the default). + */ + get withCredentials () { + return this.#withCredentials + } + + #connect () { + if (this.#readyState === CLOSED) return + + this.#readyState = CONNECTING; + + const fetchParams = { + request: this.#request, + dispatcher: this.#dispatcher + }; + + // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection. + const processEventSourceEndOfBody = (response) => { + if (isNetworkError(response)) { + this.dispatchEvent(new Event('error')); + this.close(); + } + + this.#reconnect(); + }; + + // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody... + fetchParams.processResponseEndOfBody = processEventSourceEndOfBody; + + // and processResponse set to the following steps given response res: + fetchParams.processResponse = (response) => { + // 1. If res is an aborted network error, then fail the connection. + + if (isNetworkError(response)) { + // 1. When a user agent is to fail the connection, the user agent + // must queue a task which, if the readyState attribute is set to a + // value other than CLOSED, sets the readyState attribute to CLOSED + // and fires an event named error at the EventSource object. Once the + // user agent has failed the connection, it does not attempt to + // reconnect. + if (response.aborted) { + this.close(); + this.dispatchEvent(new Event('error')); + return + // 2. Otherwise, if res is a network error, then reestablish the + // connection, unless the user agent knows that to be futile, in + // which case the user agent may fail the connection. + } else { + this.#reconnect(); + return + } + } + + // 3. Otherwise, if res's status is not 200, or if res's `Content-Type` + // is not `text/event-stream`, then fail the connection. + const contentType = response.headersList.get('content-type', true); + const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'; + const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'; + if ( + response.status !== 200 || + contentTypeValid === false + ) { + this.close(); + this.dispatchEvent(new Event('error')); + return + } + + // 4. Otherwise, announce the connection and interpret res's body + // line by line. + + // When a user agent is to announce the connection, the user agent + // must queue a task which, if the readyState attribute is set to a + // value other than CLOSED, sets the readyState attribute to OPEN + // and fires an event named open at the EventSource object. + // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + this.#readyState = OPEN; + this.dispatchEvent(new Event('open')); + + // If redirected to a different origin, set the origin to the new origin. + this.#state.origin = response.urlList[response.urlList.length - 1].origin; + + const eventSourceStream = new EventSourceStream({ + eventSourceSettings: this.#state, + push: (event) => { + this.dispatchEvent(createFastMessageEvent( + event.type, + event.options + )); + } + }); + + pipeline(response.body.stream, + eventSourceStream, + (error) => { + if ( + error?.aborted === false + ) { + this.close(); + this.dispatchEvent(new Event('error')); + } + }); + }; + + this.#controller = fetching(fetchParams); + } + + /** + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + * @returns {Promise} + */ + async #reconnect () { + // When a user agent is to reestablish the connection, the user agent must + // run the following steps. These steps are run in parallel, not as part of + // a task. (The tasks that it queues, of course, are run like normal tasks + // and not themselves in parallel.) + + // 1. Queue a task to run the following steps: + + // 1. If the readyState attribute is set to CLOSED, abort the task. + if (this.#readyState === CLOSED) return + + // 2. Set the readyState attribute to CONNECTING. + this.#readyState = CONNECTING; + + // 3. Fire an event named error at the EventSource object. + this.dispatchEvent(new Event('error')); + + // 2. Wait a delay equal to the reconnection time of the event source. + await delay(this.#state.reconnectionTime); + + // 5. Queue a task to run the following steps: + + // 1. If the EventSource object's readyState attribute is not set to + // CONNECTING, then return. + if (this.#readyState !== CONNECTING) return + + // 2. Let request be the EventSource object's request. + // 3. If the EventSource object's last event ID string is not the empty + // string, then: + // 1. Let lastEventIDValue be the EventSource object's last event ID + // string, encoded as UTF-8. + // 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header + // list. + if (this.#state.lastEventId.length) { + this.#request.headersList.set('last-event-id', this.#state.lastEventId, true); + } + + // 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section. + this.#connect(); + } + + /** + * Closes the connection, if any, and sets the readyState attribute to + * CLOSED. + */ + close () { + webidl.brandCheck(this, EventSource); + + if (this.#readyState === CLOSED) return + this.#readyState = CLOSED; + this.#controller.abort(); + this.#request = null; + } + + get onopen () { + return this.#events.open + } + + set onopen (fn) { + if (this.#events.open) { + this.removeEventListener('open', this.#events.open); + } + + if (typeof fn === 'function') { + this.#events.open = fn; + this.addEventListener('open', fn); + } else { + this.#events.open = null; + } + } + + get onmessage () { + return this.#events.message + } + + set onmessage (fn) { + if (this.#events.message) { + this.removeEventListener('message', this.#events.message); + } + + if (typeof fn === 'function') { + this.#events.message = fn; + this.addEventListener('message', fn); + } else { + this.#events.message = null; + } + } + + get onerror () { + return this.#events.error + } + + set onerror (fn) { + if (this.#events.error) { + this.removeEventListener('error', this.#events.error); + } + + if (typeof fn === 'function') { + this.#events.error = fn; + this.addEventListener('error', fn); + } else { + this.#events.error = null; + } + } + } + + const constantsPropertyDescriptors = { + CONNECTING: { + __proto__: null, + configurable: false, + enumerable: true, + value: CONNECTING, + writable: false + }, + OPEN: { + __proto__: null, + configurable: false, + enumerable: true, + value: OPEN, + writable: false + }, + CLOSED: { + __proto__: null, + configurable: false, + enumerable: true, + value: CLOSED, + writable: false + } + }; + + Object.defineProperties(EventSource, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors); + + Object.defineProperties(EventSource.prototype, { + close: kEnumerableProperty, + onerror: kEnumerableProperty, + onmessage: kEnumerableProperty, + onopen: kEnumerableProperty, + readyState: kEnumerableProperty, + url: kEnumerableProperty, + withCredentials: kEnumerableProperty + }); + + webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ + { + key: 'withCredentials', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'dispatcher', // undici only + converter: webidl.converters.any + } + ]); + + eventsource$1 = { + EventSource, + defaultReconnectionTime + }; + return eventsource$1; +} + +var hasRequiredUndici$1; + +function requireUndici$1 () { + if (hasRequiredUndici$1) return undici$1; + hasRequiredUndici$1 = 1; + + const Client = requireClient$1(); + const Dispatcher = requireDispatcher$1(); + const Pool = requirePool$1(); + const BalancedPool = requireBalancedPool$1(); + const Agent = requireAgent$1(); + const ProxyAgent = requireProxyAgent$1(); + const EnvHttpProxyAgent = requireEnvHttpProxyAgent$1(); + const RetryAgent = requireRetryAgent$1(); + const errors = requireErrors$2(); + const util = requireUtil$h(); + const { InvalidArgumentError } = errors; + const api = requireApi$1(); + const buildConnector = requireConnect$1(); + const MockClient = requireMockClient$1(); + const MockAgent = requireMockAgent$1(); + const MockPool = requireMockPool$1(); + const mockErrors = requireMockErrors$1(); + const RetryHandler = requireRetryHandler$1(); + const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal$2(); + const DecoratorHandler = requireDecoratorHandler$1(); + const RedirectHandler = requireRedirectHandler$1(); + const createRedirectInterceptor = requireRedirectInterceptor$1(); + + Object.assign(Dispatcher.prototype, api); + + undici$1.Dispatcher = Dispatcher; + undici$1.Client = Client; + undici$1.Pool = Pool; + undici$1.BalancedPool = BalancedPool; + undici$1.Agent = Agent; + undici$1.ProxyAgent = ProxyAgent; + undici$1.EnvHttpProxyAgent = EnvHttpProxyAgent; + undici$1.RetryAgent = RetryAgent; + undici$1.RetryHandler = RetryHandler; + + undici$1.DecoratorHandler = DecoratorHandler; + undici$1.RedirectHandler = RedirectHandler; + undici$1.createRedirectInterceptor = createRedirectInterceptor; + undici$1.interceptors = { + redirect: requireRedirect$1(), + retry: requireRetry$1(), + dump: requireDump$1(), + dns: requireDns$1() + }; + + undici$1.buildConnector = buildConnector; + undici$1.errors = errors; + undici$1.util = { + parseHeaders: util.parseHeaders, + headerNameToString: util.headerNameToString + }; function makeDispatcher (fn) { return (url, opts, handler) => { @@ -24356,86 +27964,82 @@ function requireUndici () { } } - undici.setGlobalDispatcher = setGlobalDispatcher; - undici.getGlobalDispatcher = getGlobalDispatcher; + undici$1.setGlobalDispatcher = setGlobalDispatcher; + undici$1.getGlobalDispatcher = getGlobalDispatcher; - if (util.nodeMajor > 16 || (util.nodeMajor === 16 && util.nodeMinor >= 8)) { - let fetchImpl = null; - undici.fetch = async function fetch (resource) { - if (!fetchImpl) { - fetchImpl = requireFetch().fetch; + const fetchImpl = requireFetch$1().fetch; + undici$1.fetch = async function fetch (init, options = undefined) { + try { + return await fetchImpl(init, options) + } catch (err) { + if (err && typeof err === 'object') { + Error.captureStackTrace(err); } - try { - return await fetchImpl(...arguments) - } catch (err) { - if (typeof err === 'object') { - Error.captureStackTrace(err, this); - } + throw err + } + }; + undici$1.Headers = requireHeaders$1().Headers; + undici$1.Response = requireResponse$2().Response; + undici$1.Request = requireRequest$2().Request; + undici$1.FormData = requireFormdata$1().FormData; + undici$1.File = globalThis.File ?? require$$0$6.File; + undici$1.FileReader = requireFilereader$1().FileReader; - throw err - } - }; - undici.Headers = requireHeaders().Headers; - undici.Response = requireResponse$1().Response; - undici.Request = requireRequest().Request; - undici.FormData = requireFormdata().FormData; - undici.File = requireFile$1().File; - undici.FileReader = requireFilereader().FileReader; + const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$3(); - const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$1(); + undici$1.setGlobalOrigin = setGlobalOrigin; + undici$1.getGlobalOrigin = getGlobalOrigin; - undici.setGlobalOrigin = setGlobalOrigin; - undici.getGlobalOrigin = getGlobalOrigin; + const { CacheStorage } = requireCachestorage$1(); + const { kConstruct } = requireSymbols$6(); - const { CacheStorage } = requireCachestorage(); - const { kConstruct } = requireSymbols$1(); + // Cache & CacheStorage are tightly coupled with fetch. Even if it may run + // in an older version of Node, it doesn't have any use without fetch. + undici$1.caches = new CacheStorage(kConstruct); - // Cache & CacheStorage are tightly coupled with fetch. Even if it may run - // in an older version of Node, it doesn't have any use without fetch. - undici.caches = new CacheStorage(kConstruct); - } + const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies$1(); - if (util.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies(); + undici$1.deleteCookie = deleteCookie; + undici$1.getCookies = getCookies; + undici$1.getSetCookies = getSetCookies; + undici$1.setCookie = setCookie; - undici.deleteCookie = deleteCookie; - undici.getCookies = getCookies; - undici.getSetCookies = getSetCookies; - undici.setCookie = setCookie; + const { parseMIMEType, serializeAMimeType } = requireDataUrl$1(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); + undici$1.parseMIMEType = parseMIMEType; + undici$1.serializeAMimeType = serializeAMimeType; - undici.parseMIMEType = parseMIMEType; - undici.serializeAMimeType = serializeAMimeType; - } + const { CloseEvent, ErrorEvent, MessageEvent } = requireEvents$1(); + undici$1.WebSocket = requireWebsocket$1().WebSocket; + undici$1.CloseEvent = CloseEvent; + undici$1.ErrorEvent = ErrorEvent; + undici$1.MessageEvent = MessageEvent; - if (util.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = requireWebsocket(); + undici$1.request = makeDispatcher(api.request); + undici$1.stream = makeDispatcher(api.stream); + undici$1.pipeline = makeDispatcher(api.pipeline); + undici$1.connect = makeDispatcher(api.connect); + undici$1.upgrade = makeDispatcher(api.upgrade); - undici.WebSocket = WebSocket; - } + undici$1.MockClient = MockClient; + undici$1.MockPool = MockPool; + undici$1.MockAgent = MockAgent; + undici$1.mockErrors = mockErrors; - undici.request = makeDispatcher(api.request); - undici.stream = makeDispatcher(api.stream); - undici.pipeline = makeDispatcher(api.pipeline); - undici.connect = makeDispatcher(api.connect); - undici.upgrade = makeDispatcher(api.upgrade); + const { EventSource } = requireEventsource$1(); - undici.MockClient = MockClient; - undici.MockPool = MockPool; - undici.MockAgent = MockAgent; - undici.mockErrors = mockErrors; - return undici; + undici$1.EventSource = EventSource; + return undici$1; } -var hasRequiredLib$3; +var hasRequiredLib; -function requireLib$3 () { - if (hasRequiredLib$3) return lib$3; - hasRequiredLib$3 = 1; +function requireLib () { + if (hasRequiredLib) return lib; + hasRequiredLib = 1; /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (lib$3 && lib$3.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (lib && lib.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -24446,12 +28050,12 @@ function requireLib$3 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (lib$3 && lib$3.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (lib && lib.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (lib$3 && lib$3.__importStar) || (function () { + var __importStar = (lib && lib.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -24468,7 +28072,7 @@ function requireLib$3 () { return result; }; })(); - var __awaiter = (lib$3 && lib$3.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (lib && lib.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -24477,15 +28081,15 @@ function requireLib$3 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(lib$3, "__esModule", { value: true }); - lib$3.HttpClient = lib$3.HttpClientResponse = lib$3.HttpClientError = lib$3.MediaTypes = lib$3.Headers = lib$3.HttpCodes = void 0; - lib$3.getProxyUrl = getProxyUrl; - lib$3.isHttps = isHttps; - const http = __importStar(require$$0$5); - const https = __importStar(require$$1$2); - const pm = __importStar(requireProxy$3()); + Object.defineProperty(lib, "__esModule", { value: true }); + lib.HttpClient = lib.HttpClientResponse = lib.HttpClientError = lib.MediaTypes = lib.Headers = lib.HttpCodes = void 0; + lib.getProxyUrl = getProxyUrl; + lib.isHttps = isHttps; + const http = __importStar(require$$0$4); + const https = __importStar(require$$1$1); + const pm = __importStar(requireProxy()); const tunnel = __importStar(requireTunnel()); - const undici_1 = requireUndici(); + const undici_1 = requireUndici$1(); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -24515,16 +28119,16 @@ function requireLib$3 () { HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib$3.HttpCodes = HttpCodes = {})); + })(HttpCodes || (lib.HttpCodes = HttpCodes = {})); var Headers; (function (Headers) { Headers["Accept"] = "accept"; Headers["ContentType"] = "content-type"; - })(Headers || (lib$3.Headers = Headers = {})); + })(Headers || (lib.Headers = Headers = {})); var MediaTypes; (function (MediaTypes) { MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib$3.MediaTypes = MediaTypes = {})); + })(MediaTypes || (lib.MediaTypes = MediaTypes = {})); /** * Returns the proxy URL, depending upon the supplied url and proxy environment variables. * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com @@ -24556,7 +28160,7 @@ function requireLib$3 () { Object.setPrototypeOf(this, HttpClientError.prototype); } } - lib$3.HttpClientError = HttpClientError; + lib.HttpClientError = HttpClientError; class HttpClientResponse { constructor(message) { this.message = message; @@ -24588,7 +28192,7 @@ function requireLib$3 () { }); } } - lib$3.HttpClientResponse = HttpClientResponse; + lib.HttpClientResponse = HttpClientResponse; function isHttps(requestUrl) { const parsedUrl = new URL(requestUrl); return parsedUrl.protocol === 'https:'; @@ -24603,7 +28207,7 @@ function requireLib$3 () { this._maxRetries = 1; this._keepAlive = false; this._disposed = false; - this.userAgent = userAgent; + this.userAgent = this._getUserAgentWithOrchestrationId(userAgent); this.handlers = handlers || []; this.requestOptions = requestOptions; if (requestOptions) { @@ -25083,6 +28687,17 @@ function requireLib$3 () { } return proxyAgent; } + _getUserAgentWithOrchestrationId(userAgent) { + const baseUserAgent = userAgent || 'actions/http-client'; + const orchId = process.env['ACTIONS_ORCHESTRATION_ID']; + if (orchId) { + // Sanitize the orchestration ID to ensure it contains only valid characters + // Valid characters: 0-9, a-z, _, -, . + const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, '_'); + return `${baseUserAgent} actions_orchestration_id/${sanitizedId}`; + } + return baseUserAgent; + } _performExponentialBackoff(retryNumber) { return __awaiter(this, void 0, void 0, function* () { retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); @@ -25156,20 +28771,20 @@ function requireLib$3 () { }); } } - lib$3.HttpClient = HttpClient; + lib.HttpClient = HttpClient; const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - return lib$3; + return lib; } -var auth$3 = {}; +var auth$1 = {}; -var hasRequiredAuth$2; +var hasRequiredAuth; -function requireAuth$2 () { - if (hasRequiredAuth$2) return auth$3; - hasRequiredAuth$2 = 1; - var __awaiter = (auth$3 && auth$3.__awaiter) || function (thisArg, _arguments, P, generator) { +function requireAuth () { + if (hasRequiredAuth) return auth$1; + hasRequiredAuth = 1; + var __awaiter = (auth$1 && auth$1.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25178,8 +28793,8 @@ function requireAuth$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(auth$3, "__esModule", { value: true }); - auth$3.PersonalAccessTokenCredentialHandler = auth$3.BearerCredentialHandler = auth$3.BasicCredentialHandler = void 0; + Object.defineProperty(auth$1, "__esModule", { value: true }); + auth$1.PersonalAccessTokenCredentialHandler = auth$1.BearerCredentialHandler = auth$1.BasicCredentialHandler = void 0; class BasicCredentialHandler { constructor(username, password) { this.username = username; @@ -25201,7 +28816,7 @@ function requireAuth$2 () { }); } } - auth$3.BasicCredentialHandler = BasicCredentialHandler; + auth$1.BasicCredentialHandler = BasicCredentialHandler; class BearerCredentialHandler { constructor(token) { this.token = token; @@ -25224,7 +28839,7 @@ function requireAuth$2 () { }); } } - auth$3.BearerCredentialHandler = BearerCredentialHandler; + auth$1.BearerCredentialHandler = BearerCredentialHandler; class PersonalAccessTokenCredentialHandler { constructor(token) { this.token = token; @@ -25247,17 +28862,17 @@ function requireAuth$2 () { }); } } - auth$3.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; + auth$1.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - return auth$3; + return auth$1; } -var hasRequiredOidcUtils$2; +var hasRequiredOidcUtils; -function requireOidcUtils$2 () { - if (hasRequiredOidcUtils$2) return oidcUtils$2; - hasRequiredOidcUtils$2 = 1; - var __awaiter = (oidcUtils$2 && oidcUtils$2.__awaiter) || function (thisArg, _arguments, P, generator) { +function requireOidcUtils () { + if (hasRequiredOidcUtils) return oidcUtils; + hasRequiredOidcUtils = 1; + var __awaiter = (oidcUtils && oidcUtils.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25266,11 +28881,11 @@ function requireOidcUtils$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(oidcUtils$2, "__esModule", { value: true }); - oidcUtils$2.OidcClient = void 0; - const http_client_1 = requireLib$3(); - const auth_1 = requireAuth$2(); - const core_1 = requireCore$2(); + Object.defineProperty(oidcUtils, "__esModule", { value: true }); + oidcUtils.OidcClient = void 0; + const http_client_1 = requireLib(); + const auth_1 = requireAuth(); + const core_1 = requireCore(); class OidcClient { static createHttpClient(allowRetry = true, maxRetry = 10) { const requestOptions = { @@ -25331,20 +28946,20 @@ function requireOidcUtils$2 () { }); } } - oidcUtils$2.OidcClient = OidcClient; + oidcUtils.OidcClient = OidcClient; - return oidcUtils$2; + return oidcUtils; } -var summary$2 = {}; +var summary = {}; -var hasRequiredSummary$2; +var hasRequiredSummary; -function requireSummary$2 () { - if (hasRequiredSummary$2) return summary$2; - hasRequiredSummary$2 = 1; +function requireSummary () { + if (hasRequiredSummary) return summary; + hasRequiredSummary = 1; (function (exports$1) { - var __awaiter = (summary$2 && summary$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (summary && summary.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25355,8 +28970,8 @@ function requireSummary$2 () { }; Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; - const os_1 = require$$0$3; - const fs_1 = require$$1__default; + const os_1 = os; + const fs_1 = fs__default; const { access, appendFile, writeFile } = fs_1.promises; exports$1.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; exports$1.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; @@ -25626,18 +29241,18 @@ function requireSummary$2 () { exports$1.markdownSummary = _summary; exports$1.summary = _summary; - } (summary$2)); - return summary$2; + } (summary)); + return summary; } -var pathUtils$2 = {}; +var pathUtils = {}; -var hasRequiredPathUtils$2; +var hasRequiredPathUtils; -function requirePathUtils$2 () { - if (hasRequiredPathUtils$2) return pathUtils$2; - hasRequiredPathUtils$2 = 1; - var __createBinding = (pathUtils$2 && pathUtils$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requirePathUtils () { + if (hasRequiredPathUtils) return pathUtils; + hasRequiredPathUtils = 1; + var __createBinding = (pathUtils && pathUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -25648,12 +29263,12 @@ function requirePathUtils$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (pathUtils$2 && pathUtils$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (pathUtils && pathUtils.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (pathUtils$2 && pathUtils$2.__importStar) || (function () { + var __importStar = (pathUtils && pathUtils.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -25670,11 +29285,11 @@ function requirePathUtils$2 () { return result; }; })(); - Object.defineProperty(pathUtils$2, "__esModule", { value: true }); - pathUtils$2.toPosixPath = toPosixPath; - pathUtils$2.toWin32Path = toWin32Path; - pathUtils$2.toPlatformPath = toPlatformPath; - const path = __importStar(require$$1$6); + Object.defineProperty(pathUtils, "__esModule", { value: true }); + pathUtils.toPosixPath = toPosixPath; + pathUtils.toWin32Path = toWin32Path; + pathUtils.toPlatformPath = toPlatformPath; + const path = __importStar(require$$1$7); /** * toPosixPath converts the given path to the posix form. On Windows, \\ will be * replaced with /. @@ -25707,26 +29322,26 @@ function requirePathUtils$2 () { return pth.replace(/[/\\]/g, path.sep); } - return pathUtils$2; + return pathUtils; } -var platform$2 = {}; +var platform = {}; -var exec$2 = {}; +var exec = {}; -var toolrunner$2 = {}; +var toolrunner = {}; -var io$2 = {}; +var io = {}; -var ioUtil$2 = {}; +var ioUtil = {}; -var hasRequiredIoUtil$2; +var hasRequiredIoUtil; -function requireIoUtil$2 () { - if (hasRequiredIoUtil$2) return ioUtil$2; - hasRequiredIoUtil$2 = 1; +function requireIoUtil () { + if (hasRequiredIoUtil) return ioUtil; + hasRequiredIoUtil = 1; (function (exports$1) { - var __createBinding = (ioUtil$2 && ioUtil$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (ioUtil && ioUtil.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -25737,12 +29352,12 @@ function requireIoUtil$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (ioUtil$2 && ioUtil$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (ioUtil && ioUtil.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (ioUtil$2 && ioUtil$2.__importStar) || (function () { + var __importStar = (ioUtil && ioUtil.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -25759,7 +29374,7 @@ function requireIoUtil$2 () { return result; }; })(); - var __awaiter = (ioUtil$2 && ioUtil$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (ioUtil && ioUtil.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25777,8 +29392,8 @@ function requireIoUtil$2 () { exports$1.isRooted = isRooted; exports$1.tryGetExecutablePath = tryGetExecutablePath; exports$1.getCmdPath = getCmdPath; - const fs = __importStar(require$$1__default); - const path = __importStar(require$$1$6); + const fs = __importStar(fs__default); + const path = __importStar(require$$1$7); _a = fs.promises // export const {open} = 'fs' , exports$1.chmod = _a.chmod, exports$1.copyFile = _a.copyFile, exports$1.lstat = _a.lstat, exports$1.mkdir = _a.mkdir, exports$1.open = _a.open, exports$1.readdir = _a.readdir, exports$1.rename = _a.rename, exports$1.rm = _a.rm, exports$1.rmdir = _a.rmdir, exports$1.stat = _a.stat, exports$1.symlink = _a.symlink, exports$1.unlink = _a.unlink; @@ -25949,16 +29564,16 @@ function requireIoUtil$2 () { return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; } - } (ioUtil$2)); - return ioUtil$2; + } (ioUtil)); + return ioUtil; } -var hasRequiredIo$2; +var hasRequiredIo; -function requireIo$2 () { - if (hasRequiredIo$2) return io$2; - hasRequiredIo$2 = 1; - var __createBinding = (io$2 && io$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireIo () { + if (hasRequiredIo) return io; + hasRequiredIo = 1; + var __createBinding = (io && io.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -25969,12 +29584,12 @@ function requireIo$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (io$2 && io$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (io && io.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (io$2 && io$2.__importStar) || (function () { + var __importStar = (io && io.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -25991,7 +29606,7 @@ function requireIo$2 () { return result; }; })(); - var __awaiter = (io$2 && io$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (io && io.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -26000,16 +29615,16 @@ function requireIo$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(io$2, "__esModule", { value: true }); - io$2.cp = cp; - io$2.mv = mv; - io$2.rmRF = rmRF; - io$2.mkdirP = mkdirP; - io$2.which = which; - io$2.findInPath = findInPath; - const assert_1 = require$$0$8; - const path = __importStar(require$$1$6); - const ioUtil = __importStar(requireIoUtil$2()); + Object.defineProperty(io, "__esModule", { value: true }); + io.cp = cp; + io.mv = mv; + io.rmRF = rmRF; + io.mkdirP = mkdirP; + io.which = which; + io.findInPath = findInPath; + const assert_1 = require$$2$1; + const path = __importStar(require$$1$7); + const ioUtil = __importStar(requireIoUtil()); /** * Copies a file or folder. * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js @@ -26269,15 +29884,15 @@ function requireIo$2 () { }); } - return io$2; + return io; } -var hasRequiredToolrunner$2; +var hasRequiredToolrunner; -function requireToolrunner$2 () { - if (hasRequiredToolrunner$2) return toolrunner$2; - hasRequiredToolrunner$2 = 1; - var __createBinding = (toolrunner$2 && toolrunner$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireToolrunner () { + if (hasRequiredToolrunner) return toolrunner; + hasRequiredToolrunner = 1; + var __createBinding = (toolrunner && toolrunner.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -26288,12 +29903,12 @@ function requireToolrunner$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (toolrunner$2 && toolrunner$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (toolrunner && toolrunner.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (toolrunner$2 && toolrunner$2.__importStar) || (function () { + var __importStar = (toolrunner && toolrunner.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -26310,7 +29925,7 @@ function requireToolrunner$2 () { return result; }; })(); - var __awaiter = (toolrunner$2 && toolrunner$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (toolrunner && toolrunner.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -26319,16 +29934,16 @@ function requireToolrunner$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(toolrunner$2, "__esModule", { value: true }); - toolrunner$2.ToolRunner = void 0; - toolrunner$2.argStringToArray = argStringToArray; - const os = __importStar(require$$0$3); - const events = __importStar(require$$0$7); + Object.defineProperty(toolrunner, "__esModule", { value: true }); + toolrunner.ToolRunner = void 0; + toolrunner.argStringToArray = argStringToArray; + const os$1 = __importStar(os); + const events = __importStar(require$$0$5); const child = __importStar(require$$2$2); - const path = __importStar(require$$1$6); - const io = __importStar(requireIo$2()); - const ioUtil = __importStar(requireIoUtil$2()); - const timers_1 = require$$6; + const path = __importStar(require$$1$7); + const io = __importStar(requireIo()); + const ioUtil = __importStar(requireIoUtil()); + const timers_1 = require$$6$1; /* eslint-disable @typescript-eslint/unbound-method */ const IS_WINDOWS = process.platform === 'win32'; /* @@ -26390,13 +30005,13 @@ function requireToolrunner$2 () { _processLineBuffer(data, strBuffer, onLine) { try { let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); + let n = s.indexOf(os$1.EOL); while (n > -1) { const line = s.substring(0, n); onLine(line); // the rest of the string ... - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); + s = s.substring(n + os$1.EOL.length); + n = s.indexOf(os$1.EOL); } return s; } @@ -26687,7 +30302,7 @@ function requireToolrunner$2 () { } const optionsNonNull = this._cloneExecOptions(this.options); if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os$1.EOL); } const state = new ExecState(optionsNonNull, this.toolPath); state.on('debug', (message) => { @@ -26780,7 +30395,7 @@ function requireToolrunner$2 () { }); } } - toolrunner$2.ToolRunner = ToolRunner; + toolrunner.ToolRunner = ToolRunner; /** * Convert an arg string to an array of args. Handles escaping * @@ -26901,15 +30516,15 @@ function requireToolrunner$2 () { } } - return toolrunner$2; + return toolrunner; } -var hasRequiredExec$2; +var hasRequiredExec; -function requireExec$2 () { - if (hasRequiredExec$2) return exec$2; - hasRequiredExec$2 = 1; - var __createBinding = (exec$2 && exec$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireExec () { + if (hasRequiredExec) return exec; + hasRequiredExec = 1; + var __createBinding = (exec && exec.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -26920,12 +30535,12 @@ function requireExec$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (exec$2 && exec$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (exec && exec.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (exec$2 && exec$2.__importStar) || (function () { + var __importStar = (exec && exec.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -26942,7 +30557,7 @@ function requireExec$2 () { return result; }; })(); - var __awaiter = (exec$2 && exec$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (exec && exec.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -26951,11 +30566,11 @@ function requireExec$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(exec$2, "__esModule", { value: true }); - exec$2.exec = exec; - exec$2.getExecOutput = getExecOutput; - const string_decoder_1 = require$$0$e; - const tr = __importStar(requireToolrunner$2()); + Object.defineProperty(exec, "__esModule", { value: true }); + exec.exec = exec$1; + exec.getExecOutput = getExecOutput; + const string_decoder_1 = require$$5$3; + const tr = __importStar(requireToolrunner()); /** * Exec a command. * Output will be streamed to the live console. @@ -26966,7 +30581,7 @@ function requireExec$2 () { * @param options optional exec options. See ExecOptions * @returns Promise exit code */ - function exec(commandLine, args, options) { + function exec$1(commandLine, args, options) { return __awaiter(this, void 0, void 0, function* () { const commandArgs = tr.argStringToArray(commandLine); if (commandArgs.length === 0) { @@ -27012,7 +30627,7 @@ function requireExec$2 () { } }; const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); + const exitCode = yield exec$1(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); //flush any remaining characters stdout += stdoutDecoder.end(); stderr += stderrDecoder.end(); @@ -27024,16 +30639,16 @@ function requireExec$2 () { }); } - return exec$2; + return exec; } -var hasRequiredPlatform$2; +var hasRequiredPlatform; -function requirePlatform$2 () { - if (hasRequiredPlatform$2) return platform$2; - hasRequiredPlatform$2 = 1; +function requirePlatform () { + if (hasRequiredPlatform) return platform; + hasRequiredPlatform = 1; (function (exports$1) { - var __createBinding = (platform$2 && platform$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (platform && platform.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27044,12 +30659,12 @@ function requirePlatform$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (platform$2 && platform$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (platform && platform.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (platform$2 && platform$2.__importStar) || (function () { + var __importStar = (platform && platform.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -27066,7 +30681,7 @@ function requirePlatform$2 () { return result; }; })(); - var __awaiter = (platform$2 && platform$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (platform && platform.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -27075,14 +30690,14 @@ function requirePlatform$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - var __importDefault = (platform$2 && platform$2.__importDefault) || function (mod) { + var __importDefault = (platform && platform.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0; exports$1.getDetails = getDetails; - const os_1 = __importDefault(require$$0$3); - const exec = __importStar(requireExec$2()); + const os_1 = __importDefault(os); + const exec = __importStar(requireExec()); const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { silent: true @@ -27136,17 +30751,17 @@ function requirePlatform$2 () { }); } - } (platform$2)); - return platform$2; + } (platform)); + return platform; } -var hasRequiredCore$2; +var hasRequiredCore; -function requireCore$2 () { - if (hasRequiredCore$2) return core$2; - hasRequiredCore$2 = 1; +function requireCore () { + if (hasRequiredCore) return core; + hasRequiredCore = 1; (function (exports$1) { - var __createBinding = (core$2 && core$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (core && core.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27157,12 +30772,12 @@ function requireCore$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (core$2 && core$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (core && core.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (core$2 && core$2.__importStar) || (function () { + var __importStar = (core && core.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -27179,7 +30794,7 @@ function requireCore$2 () { return result; }; })(); - var __awaiter = (core$2 && core$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (core && core.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -27211,12 +30826,12 @@ function requireCore$2 () { exports$1.saveState = saveState; exports$1.getState = getState; exports$1.getIDToken = getIDToken; - const command_1 = requireCommand$2(); - const file_command_1 = requireFileCommand$2(); - const utils_1 = requireUtils$7(); - const os = __importStar(require$$0$3); - const path = __importStar(require$$1$6); - const oidc_utils_1 = requireOidcUtils$2(); + const command_1 = requireCommand(); + const file_command_1 = requireFileCommand(); + const utils_1 = requireUtils$4(); + const os$1 = __importStar(os); + const path = __importStar(require$$1$7); + const oidc_utils_1 = requireOidcUtils(); /** * The code to exit an action */ @@ -27364,7 +30979,7 @@ function requireCore$2 () { if (filePath) { return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value)); } - process.stdout.write(os.EOL); + process.stdout.write(os$1.EOL); (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value)); } /** @@ -27432,7 +31047,7 @@ function requireCore$2 () { * @param message info message */ function info(message) { - process.stdout.write(message + os.EOL); + process.stdout.write(message + os$1.EOL); } /** * Begin an output group. @@ -27505,30 +31120,30 @@ function requireCore$2 () { /** * Summary exports */ - var summary_1 = requireSummary$2(); + var summary_1 = requireSummary(); Object.defineProperty(exports$1, "summary", { enumerable: true, get: function () { return summary_1.summary; } }); /** * @deprecated use core.summary */ - var summary_2 = requireSummary$2(); + var summary_2 = requireSummary(); Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } }); /** * Path exports */ - var path_utils_1 = requirePathUtils$2(); + var path_utils_1 = requirePathUtils(); Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } }); Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } }); Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }); /** * Platform utilities exports */ - exports$1.platform = __importStar(requirePlatform$2()); + exports$1.platform = __importStar(requirePlatform()); - } (core$2)); - return core$2; + } (core)); + return core; } -var coreExports = requireCore$2(); +var coreExports = requireCore(); const ACTION_VERSION = '1.4.5'; const INPUT_GITHUB_TOKEN = 'github-token'; @@ -27585,7 +31200,7 @@ function determineGraalVMArchitecture() { } } -var cache$2 = {}; +var cache$3 = {}; var cacheUtils = {}; @@ -27593,65 +31208,98 @@ var glob = {}; var internalGlobber = {}; -var core$1 = {}; - -var command$1 = {}; - -var utils$5 = {}; +var internalGlobOptionsHelper = {}; -var hasRequiredUtils$5; +var hasRequiredInternalGlobOptionsHelper; -function requireUtils$5 () { - if (hasRequiredUtils$5) return utils$5; - hasRequiredUtils$5 = 1; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - Object.defineProperty(utils$5, "__esModule", { value: true }); - utils$5.toCommandProperties = utils$5.toCommandValue = void 0; - /** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ - function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; - } - else if (typeof input === 'string' || input instanceof String) { - return input; +function requireInternalGlobOptionsHelper () { + if (hasRequiredInternalGlobOptionsHelper) return internalGlobOptionsHelper; + hasRequiredInternalGlobOptionsHelper = 1; + var __createBinding = (internalGlobOptionsHelper && internalGlobOptionsHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; } - return JSON.stringify(input); - } - utils$5.toCommandValue = toCommandValue; + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = (internalGlobOptionsHelper && internalGlobOptionsHelper.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = (internalGlobOptionsHelper && internalGlobOptionsHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); + Object.defineProperty(internalGlobOptionsHelper, "__esModule", { value: true }); + internalGlobOptionsHelper.getOptions = getOptions; + const core = __importStar(requireCore()); /** - * - * @param annotationProperties - * @returns The command properties to send with the actual annotation command - * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 + * Returns a copy with defaults filled in. */ - function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; - } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn + function getOptions(copy) { + const result = { + followSymbolicLinks: true, + implicitDescendants: true, + matchDirectories: true, + omitBrokenSymbolicLinks: true, + excludeHiddenFiles: false }; + if (copy) { + if (typeof copy.followSymbolicLinks === 'boolean') { + result.followSymbolicLinks = copy.followSymbolicLinks; + core.debug(`followSymbolicLinks '${result.followSymbolicLinks}'`); + } + if (typeof copy.implicitDescendants === 'boolean') { + result.implicitDescendants = copy.implicitDescendants; + core.debug(`implicitDescendants '${result.implicitDescendants}'`); + } + if (typeof copy.matchDirectories === 'boolean') { + result.matchDirectories = copy.matchDirectories; + core.debug(`matchDirectories '${result.matchDirectories}'`); + } + if (typeof copy.omitBrokenSymbolicLinks === 'boolean') { + result.omitBrokenSymbolicLinks = copy.omitBrokenSymbolicLinks; + core.debug(`omitBrokenSymbolicLinks '${result.omitBrokenSymbolicLinks}'`); + } + if (typeof copy.excludeHiddenFiles === 'boolean') { + result.excludeHiddenFiles = copy.excludeHiddenFiles; + core.debug(`excludeHiddenFiles '${result.excludeHiddenFiles}'`); + } + } + return result; } - utils$5.toCommandProperties = toCommandProperties; - return utils$5; + return internalGlobOptionsHelper; } -var hasRequiredCommand$1; +var internalPatternHelper = {}; + +var internalPathHelper = {}; + +var hasRequiredInternalPathHelper; -function requireCommand$1 () { - if (hasRequiredCommand$1) return command$1; - hasRequiredCommand$1 = 1; - var __createBinding = (command$1 && command$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireInternalPathHelper () { + if (hasRequiredInternalPathHelper) return internalPathHelper; + hasRequiredInternalPathHelper = 1; + var __createBinding = (internalPathHelper && internalPathHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27662,102 +31310,239 @@ function requireCommand$1 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (command$1 && command$1.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (internalPathHelper && internalPathHelper.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (command$1 && command$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; + var __importStar = (internalPathHelper && internalPathHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); + var __importDefault = (internalPathHelper && internalPathHelper.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; }; - Object.defineProperty(command$1, "__esModule", { value: true }); - command$1.issue = command$1.issueCommand = void 0; - const os = __importStar(require$$0$3); - const utils_1 = requireUtils$5(); + Object.defineProperty(internalPathHelper, "__esModule", { value: true }); + internalPathHelper.dirname = dirname; + internalPathHelper.ensureAbsoluteRoot = ensureAbsoluteRoot; + internalPathHelper.hasAbsoluteRoot = hasAbsoluteRoot; + internalPathHelper.hasRoot = hasRoot; + internalPathHelper.normalizeSeparators = normalizeSeparators; + internalPathHelper.safeTrimTrailingSeparator = safeTrimTrailingSeparator; + const path = __importStar(require$$1$7); + const assert_1 = __importDefault(require$$2$1); + const IS_WINDOWS = process.platform === 'win32'; /** - * Commands + * Similar to path.dirname except normalizes the path separators and slightly better handling for Windows UNC paths. * - * Command Format: - * ::name key=value,key=value::message + * For example, on Linux/macOS: + * - `/ => /` + * - `/hello => /` * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value + * For example, on Windows: + * - `C:\ => C:\` + * - `C:\hello => C:\` + * - `C: => C:` + * - `C:hello => C:` + * - `\ => \` + * - `\hello => \` + * - `\\hello => \\hello` + * - `\\hello\world => \\hello\world` */ - function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); - } - command$1.issueCommand = issueCommand; - function issue(name, message = '') { - issueCommand(name, {}, message); + function dirname(p) { + // Normalize slashes and trim unnecessary trailing slash + p = safeTrimTrailingSeparator(p); + // Windows UNC root, e.g. \\hello or \\hello\world + if (IS_WINDOWS && /^\\\\[^\\]+(\\[^\\]+)?$/.test(p)) { + return p; + } + // Get dirname + let result = path.dirname(p); + // Trim trailing slash for Windows UNC root, e.g. \\hello\world\ + if (IS_WINDOWS && /^\\\\[^\\]+\\[^\\]+\\$/.test(result)) { + result = safeTrimTrailingSeparator(result); + } + return result; } - command$1.issue = issue; - const CMD_STRING = '::'; - class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; - } - this.command = command; - this.properties = properties; - this.message = message; + /** + * Roots the path if not already rooted. On Windows, relative roots like `\` + * or `C:` are expanded based on the current working directory. + */ + function ensureAbsoluteRoot(root, itemPath) { + (0, assert_1.default)(root, `ensureAbsoluteRoot parameter 'root' must not be empty`); + (0, assert_1.default)(itemPath, `ensureAbsoluteRoot parameter 'itemPath' must not be empty`); + // Already rooted + if (hasAbsoluteRoot(itemPath)) { + return itemPath; } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; + // Windows + if (IS_WINDOWS) { + // Check for itemPath like C: or C:foo + if (itemPath.match(/^[A-Z]:[^\\/]|^[A-Z]:$/i)) { + let cwd = process.cwd(); + (0, assert_1.default)(cwd.match(/^[A-Z]:\\/i), `Expected current directory to start with an absolute drive root. Actual '${cwd}'`); + // Drive letter matches cwd? Expand to cwd + if (itemPath[0].toUpperCase() === cwd[0].toUpperCase()) { + // Drive only, e.g. C: + if (itemPath.length === 2) { + // Preserve specified drive letter case (upper or lower) + return `${itemPath[0]}:\\${cwd.substr(3)}`; + } + // Drive + path, e.g. C:foo + else { + if (!cwd.endsWith('\\')) { + cwd += '\\'; } + // Preserve specified drive letter case (upper or lower) + return `${itemPath[0]}:\\${cwd.substr(3)}${itemPath.substr(2)}`; } } + // Different drive + else { + return `${itemPath[0]}:\\${itemPath.substr(2)}`; + } } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; + // Check for itemPath like \ or \foo + else if (normalizeSeparators(itemPath).match(/^\\$|^\\[^\\]/)) { + const cwd = process.cwd(); + (0, assert_1.default)(cwd.match(/^[A-Z]:\\/i), `Expected current directory to start with an absolute drive root. Actual '${cwd}'`); + return `${cwd[0]}:\\${itemPath.substr(1)}`; + } + } + (0, assert_1.default)(hasAbsoluteRoot(root), `ensureAbsoluteRoot parameter 'root' must have an absolute root`); + // Otherwise ensure root ends with a separator + if (root.endsWith('/') || (IS_WINDOWS && root.endsWith('\\'))) ; + else { + // Append separator + root += path.sep; } + return root + itemPath; } - function escapeData(s) { - return (0, utils_1.toCommandValue)(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); + /** + * On Linux/macOS, true if path starts with `/`. On Windows, true for paths like: + * `\\hello\share` and `C:\hello` (and using alternate separator). + */ + function hasAbsoluteRoot(itemPath) { + (0, assert_1.default)(itemPath, `hasAbsoluteRoot parameter 'itemPath' must not be empty`); + // Normalize separators + itemPath = normalizeSeparators(itemPath); + // Windows + if (IS_WINDOWS) { + // E.g. \\hello\share or C:\hello + return itemPath.startsWith('\\\\') || /^[A-Z]:\\/i.test(itemPath); + } + // E.g. /hello + return itemPath.startsWith('/'); } - function escapeProperty(s) { - return (0, utils_1.toCommandValue)(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); + /** + * On Linux/macOS, true if path starts with `/`. On Windows, true for paths like: + * `\`, `\hello`, `\\hello\share`, `C:`, and `C:\hello` (and using alternate separator). + */ + function hasRoot(itemPath) { + (0, assert_1.default)(itemPath, `isRooted parameter 'itemPath' must not be empty`); + // Normalize separators + itemPath = normalizeSeparators(itemPath); + // Windows + if (IS_WINDOWS) { + // E.g. \ or \hello or \\hello + // E.g. C: or C:\hello + return itemPath.startsWith('\\') || /^[A-Z]:/i.test(itemPath); + } + // E.g. /hello + return itemPath.startsWith('/'); + } + /** + * Removes redundant slashes and converts `/` to `\` on Windows + */ + function normalizeSeparators(p) { + p = p || ''; + // Windows + if (IS_WINDOWS) { + // Convert slashes on Windows + p = p.replace(/\//g, '\\'); + // Remove redundant slashes + const isUnc = /^\\\\+[^\\]/.test(p); // e.g. \\hello + return (isUnc ? '\\' : '') + p.replace(/\\\\+/g, '\\'); // preserve leading \\ for UNC + } + // Remove redundant slashes + return p.replace(/\/\/+/g, '/'); + } + /** + * Normalizes the path separators and trims the trailing separator (when safe). + * For example, `/foo/ => /foo` but `/ => /` + */ + function safeTrimTrailingSeparator(p) { + // Short-circuit if empty + if (!p) { + return ''; + } + // Normalize separators + p = normalizeSeparators(p); + // No trailing slash + if (!p.endsWith(path.sep)) { + return p; + } + // Check '/' on Linux/macOS and '\' on Windows + if (p === path.sep) { + return p; + } + // On Windows check if drive root. E.g. C:\ + if (IS_WINDOWS && /^[A-Z]:\\$/i.test(p)) { + return p; + } + // Otherwise trim trailing slash + return p.substr(0, p.length - 1); } - return command$1; + return internalPathHelper; } -var fileCommand$1 = {}; +var internalMatchKind = {}; -var hasRequiredFileCommand$1; +var hasRequiredInternalMatchKind; -function requireFileCommand$1 () { - if (hasRequiredFileCommand$1) return fileCommand$1; - hasRequiredFileCommand$1 = 1; - // For internal use, subject to change. - var __createBinding = (fileCommand$1 && fileCommand$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireInternalMatchKind () { + if (hasRequiredInternalMatchKind) return internalMatchKind; + hasRequiredInternalMatchKind = 1; + Object.defineProperty(internalMatchKind, "__esModule", { value: true }); + internalMatchKind.MatchKind = void 0; + /** + * Indicates whether a pattern matches a path + */ + var MatchKind; + (function (MatchKind) { + /** Not matched */ + MatchKind[MatchKind["None"] = 0] = "None"; + /** Matched if the path is a directory */ + MatchKind[MatchKind["Directory"] = 1] = "Directory"; + /** Matched if the path is a regular file */ + MatchKind[MatchKind["File"] = 2] = "File"; + /** Matched */ + MatchKind[MatchKind["All"] = 3] = "All"; + })(MatchKind || (internalMatchKind.MatchKind = MatchKind = {})); + + return internalMatchKind; +} + +var hasRequiredInternalPatternHelper; + +function requireInternalPatternHelper () { + if (hasRequiredInternalPatternHelper) return internalPatternHelper; + hasRequiredInternalPatternHelper = 1; + var __createBinding = (internalPatternHelper && internalPatternHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27768,70907 +31553,90824 @@ function requireFileCommand$1 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (fileCommand$1 && fileCommand$1.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (internalPatternHelper && internalPatternHelper.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (fileCommand$1 && fileCommand$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(fileCommand$1, "__esModule", { value: true }); - fileCommand$1.prepareKeyValueMessage = fileCommand$1.issueFileCommand = void 0; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - const crypto = __importStar(require$$0$4); - const fs = __importStar(require$$1__default); - const os = __importStar(require$$0$3); - const utils_1 = requireUtils$5(); - function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { - encoding: 'utf8' - }); - } - fileCommand$1.issueFileCommand = issueFileCommand; - function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${crypto.randomUUID()}`; - const convertedValue = (0, utils_1.toCommandValue)(value); - // These should realistically never happen, but just in case someone finds a - // way to exploit uuid generation let's not allow keys or values that contain - // the delimiter. - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); + var __importStar = (internalPatternHelper && internalPatternHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); + Object.defineProperty(internalPatternHelper, "__esModule", { value: true }); + internalPatternHelper.getSearchPaths = getSearchPaths; + internalPatternHelper.match = match; + internalPatternHelper.partialMatch = partialMatch; + const pathHelper = __importStar(requireInternalPathHelper()); + const internal_match_kind_1 = requireInternalMatchKind(); + const IS_WINDOWS = process.platform === 'win32'; + /** + * Given an array of patterns, returns an array of paths to search. + * Duplicates and paths under other included paths are filtered out. + */ + function getSearchPaths(patterns) { + // Ignore negate patterns + patterns = patterns.filter(x => !x.negate); + // Create a map of all search paths + const searchPathMap = {}; + for (const pattern of patterns) { + const key = IS_WINDOWS + ? pattern.searchPath.toUpperCase() + : pattern.searchPath; + searchPathMap[key] = 'candidate'; } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); + const result = []; + for (const pattern of patterns) { + // Check if already included + const key = IS_WINDOWS + ? pattern.searchPath.toUpperCase() + : pattern.searchPath; + if (searchPathMap[key] === 'included') { + continue; + } + // Check for an ancestor search path + let foundAncestor = false; + let tempKey = key; + let parent = pathHelper.dirname(tempKey); + while (parent !== tempKey) { + if (searchPathMap[parent]) { + foundAncestor = true; + break; + } + tempKey = parent; + parent = pathHelper.dirname(tempKey); + } + // Include the search pattern in the result + if (!foundAncestor) { + result.push(pattern.searchPath); + searchPathMap[key] = 'included'; + } + } + return result; + } + /** + * Matches the patterns against the path + */ + function match(patterns, itemPath) { + let result = internal_match_kind_1.MatchKind.None; + for (const pattern of patterns) { + if (pattern.negate) { + result &= ~pattern.match(itemPath); + } + else { + result |= pattern.match(itemPath); + } } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; + return result; + } + /** + * Checks whether to descend further into the directory + */ + function partialMatch(patterns, itemPath) { + return patterns.some(x => !x.negate && x.partialMatch(itemPath)); } - fileCommand$1.prepareKeyValueMessage = prepareKeyValueMessage; - return fileCommand$1; + return internalPatternHelper; } -var oidcUtils$1 = {}; +var internalPattern = {}; -var lib$2 = {}; +var commonjs$h = {}; -var proxy$2 = {}; +var commonjs$g = {}; -var hasRequiredProxy$2; +var commonjs$f = {}; -function requireProxy$2 () { - if (hasRequiredProxy$2) return proxy$2; - hasRequiredProxy$2 = 1; - Object.defineProperty(proxy$2, "__esModule", { value: true }); - proxy$2.checkBypass = proxy$2.getProxyUrl = void 0; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - try { - return new DecodedURL(proxyVar); - } - catch (_a) { - if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://')) - return new DecodedURL(`http://${proxyVar}`); - } - } - else { - return undefined; - } +var hasRequiredCommonjs$h; + +function requireCommonjs$h () { + if (hasRequiredCommonjs$h) return commonjs$f; + hasRequiredCommonjs$h = 1; + (function (exports$1) { + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.range = exports$1.balanced = void 0; + const balanced = (a, b, str) => { + const ma = a instanceof RegExp ? maybeMatch(a, str) : a; + const mb = b instanceof RegExp ? maybeMatch(b, str) : b; + const r = ma !== null && mb != null && (0, exports$1.range)(ma, mb, str); + return (r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + ma.length, r[1]), + post: str.slice(r[1] + mb.length), + }); + }; + exports$1.balanced = balanced; + const maybeMatch = (reg, str) => { + const m = str.match(reg); + return m ? m[0] : null; + }; + const range = (a, b, str) => { + let begs, beg, left, right = undefined, result; + let ai = str.indexOf(a); + let bi = str.indexOf(b, ai + 1); + let i = ai; + if (ai >= 0 && bi > 0) { + if (a === b) { + return [ai, bi]; + } + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i === ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } + else if (begs.length === 1) { + const r = begs.pop(); + if (r !== undefined) + result = [r, bi]; + } + else { + beg = begs.pop(); + if (beg !== undefined && beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length && right !== undefined) { + result = [left, right]; + } + } + return result; + }; + exports$1.range = range; + + } (commonjs$f)); + return commonjs$f; +} + +var hasRequiredCommonjs$g; + +function requireCommonjs$g () { + if (hasRequiredCommonjs$g) return commonjs$g; + hasRequiredCommonjs$g = 1; + Object.defineProperty(commonjs$g, "__esModule", { value: true }); + commonjs$g.expand = expand; + const balanced_match_1 = requireCommonjs$h(); + const escSlash = '\0SLASH' + Math.random() + '\0'; + const escOpen = '\0OPEN' + Math.random() + '\0'; + const escClose = '\0CLOSE' + Math.random() + '\0'; + const escComma = '\0COMMA' + Math.random() + '\0'; + const escPeriod = '\0PERIOD' + Math.random() + '\0'; + const escSlashPattern = new RegExp(escSlash, 'g'); + const escOpenPattern = new RegExp(escOpen, 'g'); + const escClosePattern = new RegExp(escClose, 'g'); + const escCommaPattern = new RegExp(escComma, 'g'); + const escPeriodPattern = new RegExp(escPeriod, 'g'); + const slashPattern = /\\\\/g; + const openPattern = /\\{/g; + const closePattern = /\\}/g; + const commaPattern = /\\,/g; + const periodPattern = /\\./g; + function numeric(str) { + return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); } - proxy$2.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); + function escapeBraces(str) { + return str + .replace(slashPattern, escSlash) + .replace(openPattern, escOpen) + .replace(closePattern, escClose) + .replace(commaPattern, escComma) + .replace(periodPattern, escPeriod); + } + function unescapeBraces(str) { + return str + .replace(escSlashPattern, '\\') + .replace(escOpenPattern, '{') + .replace(escClosePattern, '}') + .replace(escCommaPattern, ',') + .replace(escPeriodPattern, '.'); + } + /** + * Basically just str.split(","), but handling cases + * where we have nested braced sections, which should be + * treated as individual members, like {a,{b,c},d} + */ + function parseCommaParts(str) { + if (!str) { + return ['']; } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; + const parts = []; + const m = (0, balanced_match_1.balanced)('{', '}', str); + if (!m) { + return str.split(','); } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; + const { pre, body, post } = m; + const p = pre.split(','); + p[p.length - 1] += '{' + body + '}'; + const postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + parts.push.apply(parts, p); + return parts; + } + function expand(str) { + if (!str) { + return []; } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperNoProxyItem === '*' || - upperReqHosts.some(x => x === upperNoProxyItem || - x.endsWith(`.${upperNoProxyItem}`) || - (upperNoProxyItem.startsWith('.') && - x.endsWith(`${upperNoProxyItem}`)))) { - return true; - } + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.slice(0, 2) === '{}') { + str = '\\{\\}' + str.slice(2); } - return false; + return expand_(escapeBraces(str), true).map(unescapeBraces); } - proxy$2.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return (hostLower === 'localhost' || - hostLower.startsWith('127.') || - hostLower.startsWith('[::1]') || - hostLower.startsWith('[0:0:0:0:0:0:0:1]')); + function embrace(str) { + return '{' + str + '}'; } - class DecodedURL extends URL { - constructor(url, base) { - super(url, base); - this._decodedUsername = decodeURIComponent(super.username); - this._decodedPassword = decodeURIComponent(super.password); - } - get username() { - return this._decodedUsername; + function isPadded(el) { + return /^-?0\d/.test(el); + } + function lte(i, y) { + return i <= y; + } + function gte(i, y) { + return i >= y; + } + function expand_(str, isTop) { + /** @type {string[]} */ + const expansions = []; + const m = (0, balanced_match_1.balanced)('{', '}', str); + if (!m) + return [str]; + // no need to expand pre, since it is guaranteed to be free of brace-sets + const pre = m.pre; + const post = m.post.length ? expand_(m.post, false) : ['']; + if (/\$$/.test(m.pre)) { + for (let k = 0; k < post.length; k++) { + const expansion = pre + '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } } - get password() { - return this._decodedPassword; + else { + const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + const isSequence = isNumericSequence || isAlphaSequence; + const isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,(?!,).*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand_(str); + } + return [str]; + } + let n; + if (isSequence) { + n = m.body.split(/\.\./); + } + else { + n = parseCommaParts(m.body); + if (n.length === 1 && n[0] !== undefined) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand_(n[0], false).map(embrace); + //XXX is this necessary? Can't seem to hit it in tests. + /* c8 ignore start */ + if (n.length === 1) { + return post.map(p => m.pre + n[0] + p); + } + /* c8 ignore stop */ + } + } + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + let N; + if (isSequence && n[0] !== undefined && n[1] !== undefined) { + const x = numeric(n[0]); + const y = numeric(n[1]); + const width = Math.max(n[0].length, n[1].length); + let incr = n.length === 3 && n[2] !== undefined ? Math.abs(numeric(n[2])) : 1; + let test = lte; + const reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + const pad = n.some(isPadded); + N = []; + for (let i = x; test(i, y); i += incr) { + let c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') { + c = ''; + } + } + else { + c = String(i); + if (pad) { + const need = width - c.length; + if (need > 0) { + const z = new Array(need + 1).join('0'); + if (i < 0) { + c = '-' + z + c.slice(1); + } + else { + c = z + c; + } + } + } + } + N.push(c); + } + } + else { + N = []; + for (let j = 0; j < n.length; j++) { + N.push.apply(N, expand_(n[j], false)); + } + } + for (let j = 0; j < N.length; j++) { + for (let k = 0; k < post.length; k++) { + const expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) { + expansions.push(expansion); + } + } + } } + return expansions; } - return proxy$2; + return commonjs$g; } -var hasRequiredLib$2; +var assertValidPattern = {}; -function requireLib$2 () { - if (hasRequiredLib$2) return lib$2; - hasRequiredLib$2 = 1; - /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (lib$2 && lib$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; +var hasRequiredAssertValidPattern; + +function requireAssertValidPattern () { + if (hasRequiredAssertValidPattern) return assertValidPattern; + hasRequiredAssertValidPattern = 1; + Object.defineProperty(assertValidPattern, "__esModule", { value: true }); + assertValidPattern.assertValidPattern = void 0; + const MAX_PATTERN_LENGTH = 1024 * 64; + const assertValidPattern$1 = (pattern) => { + if (typeof pattern !== 'string') { + throw new TypeError('invalid pattern'); + } + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError('pattern is too long'); } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (lib$2 && lib$2.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (lib$2 && lib$2.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; }; - var __awaiter = (lib$2 && lib$2.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + assertValidPattern.assertValidPattern = assertValidPattern$1; + + return assertValidPattern; +} + +var ast = {}; + +var braceExpressions = {}; + +var hasRequiredBraceExpressions; + +function requireBraceExpressions () { + if (hasRequiredBraceExpressions) return braceExpressions; + hasRequiredBraceExpressions = 1; + // translate the various posix character classes into unicode properties + // this works across all unicode locales + Object.defineProperty(braceExpressions, "__esModule", { value: true }); + braceExpressions.parseClass = void 0; + // { : [, /u flag required, negated] + const posixClasses = { + '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true], + '[:alpha:]': ['\\p{L}\\p{Nl}', true], + '[:ascii:]': ['\\x' + '00-\\x' + '7f', false], + '[:blank:]': ['\\p{Zs}\\t', true], + '[:cntrl:]': ['\\p{Cc}', true], + '[:digit:]': ['\\p{Nd}', true], + '[:graph:]': ['\\p{Z}\\p{C}', true, true], + '[:lower:]': ['\\p{Ll}', true], + '[:print:]': ['\\p{C}', true], + '[:punct:]': ['\\p{P}', true], + '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true], + '[:upper:]': ['\\p{Lu}', true], + '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true], + '[:xdigit:]': ['A-Fa-f0-9', false], }; - Object.defineProperty(lib$2, "__esModule", { value: true }); - lib$2.HttpClient = lib$2.isHttps = lib$2.HttpClientResponse = lib$2.HttpClientError = lib$2.getProxyUrl = lib$2.MediaTypes = lib$2.Headers = lib$2.HttpCodes = void 0; - const http = __importStar(require$$0$5); - const https = __importStar(require$$1$2); - const pm = __importStar(requireProxy$2()); - const tunnel = __importStar(requireTunnel()); - const undici_1 = requireUndici(); - var HttpCodes; - (function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib$2.HttpCodes = HttpCodes = {})); - var Headers; - (function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; - })(Headers || (lib$2.Headers = Headers = {})); - var MediaTypes; - (function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib$2.MediaTypes = MediaTypes = {})); - /** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; - } - lib$2.getProxyUrl = getProxyUrl; - const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } - } - lib$2.HttpClientError = HttpClientError; - class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); - } - readBodyBuffer() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - this.message.on('data', (chunk) => { - chunks.push(chunk); - }); - this.message.on('end', () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); + // only need to escape a few things inside of brace expressions + // escapes: [ \ ] - + const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&'); + // escape all regexp magic characters + const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + // everything has already been escaped, we just have to join + const rangesToString = (ranges) => ranges.join(''); + // takes a glob string at a posix brace expression, and returns + // an equivalent regular expression source, and boolean indicating + // whether the /u flag needs to be applied, and the number of chars + // consumed to parse the character class. + // This also removes out of order ranges, and returns ($.) if the + // entire class just no good. + const parseClass = (glob, position) => { + const pos = position; + /* c8 ignore start */ + if (glob.charAt(pos) !== '[') { + throw new Error('not in a brace expression'); } - } - lib$2.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; - } - lib$2.isHttps = isHttps; - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } + /* c8 ignore stop */ + const ranges = []; + const negs = []; + let i = pos + 1; + let sawStart = false; + let uflag = false; + let escaping = false; + let negate = false; + let endPos = pos; + let rangeStart = ''; + WHILE: while (i < glob.length) { + const c = glob.charAt(i); + if ((c === '!' || c === '^') && i === pos + 1) { + negate = true; + i++; + continue; } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); - } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); - } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); - } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); - } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); + if (c === ']' && sawStart && !escaping) { + endPos = i + 1; + break; + } + sawStart = true; + if (c === '\\') { + if (!escaping) { + escaping = true; + i++; + continue; } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); + // escaped \ char, fall through and treat like normal char } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); + if (c === '[' && !escaping) { + // either a posix class, a collation equivalent, or just a [ + for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { + if (glob.startsWith(cls, i)) { + // invalid, [a-[] is fine, but not [a-[:alpha]] + if (rangeStart) { + return ['$.', false, glob.length - pos, true]; } + i += cls.length; + if (neg) + negs.push(unip); + else + ranges.push(unip); + uflag = uflag || u; + continue WHILE; } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); + // now it's just a normal character, effectively + escaping = false; + if (rangeStart) { + // throw this range away if it's not valid, but others + // can still match. + if (c > rangeStart) { + ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c)); } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); + else if (c === rangeStart) { + ranges.push(braceEscape(c)); } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); + rangeStart = ''; + i++; + continue; } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); + // now might be the start of a range. + // can be either c-d or c-] or c] or c] at this point + if (glob.startsWith('-]', i + 1)) { + ranges.push(braceEscape(c + '-')); + i += 2; + continue; } - else { - req.end(); + if (glob.startsWith('-', i + 1)) { + rangeStart = c; + i += 2; + continue; } + // not the start of a range, just a single character + ranges.push(braceEscape(c)); + i++; } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); + if (endPos < i) { + // didn't see the end of the class, not a valid class, + // but might still be valid as a literal match. + return ['', false, 0, false]; } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; - } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); + // if we got no ranges and no negates, then we have a range that + // cannot possibly match anything, and that poisons the whole glob + if (!ranges.length && !negs.length) { + return ['$.', false, glob.length - pos, true]; } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; + // if we got one positive range, and it's a single character, then that's + // not actually a magic pattern, it's just that one literal character. + // we should not treat that as "magic", we should just return the literal + // character. [_] is a perfectly valid way to escape glob magic chars. + if (negs.length === 0 && + ranges.length === 1 && + /^\\?.$/.test(ranges[0]) && + !negate) { + const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; + return [regexpEscape(r), false, endPos - pos, false]; } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); + const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; + const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; + const comb = ranges.length && negs.length + ? '(' + sranges + '|' + snegs + ')' + : ranges.length + ? sranges + : snegs; + return [comb, uflag, endPos - pos, true]; + }; + braceExpressions.parseClass = parseClass; + + return braceExpressions; +} + +var _unescape = {}; + +var hasRequired_unescape; + +function require_unescape () { + if (hasRequired_unescape) return _unescape; + hasRequired_unescape = 1; + Object.defineProperty(_unescape, "__esModule", { value: true }); + _unescape.unescape = void 0; + /** + * Un-escape a string that has been escaped with {@link escape}. + * + * If the {@link windowsPathsNoEscape} option is used, then square-brace + * escapes are removed, but not backslash escapes. For example, it will turn + * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`, + * becuase `\` is a path separator in `windowsPathsNoEscape` mode. + * + * When `windowsPathsNoEscape` is not set, then both brace escapes and + * backslash escapes are removed. + * + * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped + * or unescaped. + */ + const unescape = (s, { windowsPathsNoEscape = false, } = {}) => { + return windowsPathsNoEscape + ? s.replace(/\[([^\/\\])\]/g, '$1') + : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1'); + }; + _unescape.unescape = unescape; + + return _unescape; +} + +var hasRequiredAst; + +function requireAst () { + if (hasRequiredAst) return ast; + hasRequiredAst = 1; + // parse a single path portion + Object.defineProperty(ast, "__esModule", { value: true }); + ast.AST = void 0; + const brace_expressions_js_1 = requireBraceExpressions(); + const unescape_js_1 = require_unescape(); + const types = new Set(['!', '?', '+', '*', '@']); + const isExtglobType = (c) => types.has(c); + // Patterns that get prepended to bind to the start of either the + // entire string, or just a single path portion, to prevent dots + // and/or traversal patterns, when needed. + // Exts don't need the ^ or / bit, because the root binds that already. + const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))'; + const startNoDot = '(?!\\.)'; + // characters that indicate a start of pattern needs the "no dots" bit, + // because a dot *might* be matched. ( is not in the list, because in + // the case of a child extglob, it will handle the prevention itself. + const addPatternStart = new Set(['[', '.']); + // cases where traversal is A-OK, no dot prevention needed + const justDots = new Set(['..', '.']); + const reSpecials = new Set('().*{}+?[]^$\\!'); + const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + // any single thing other than / + const qmark = '[^/]'; + // * => any number of characters + const star = qmark + '*?'; + // use + when we need to ensure that *something* matches, because the * is + // the only thing in the path portion. + const starNoEmpty = qmark + '+?'; + // remove the \ chars that we added if we end up doing a nonmagic compare + // const deslash = (s: string) => s.replace(/\\(.)/g, '$1') + class AST { + type; + #root; + #hasMagic; + #uflag = false; + #parts = []; + #parent; + #parentIndex; + #negs; + #filledNegs = false; + #options; + #toString; + // set to true if it's an extglob with no children + // (which really means one child of '') + #emptyExt = false; + constructor(type, parent, options = {}) { + this.type = type; + // extglobs are inherently magical + if (type) + this.#hasMagic = true; + this.#parent = parent; + this.#root = this.#parent ? this.#parent.#root : this; + this.#options = this.#root === this ? options : this.#root.#options; + this.#negs = this.#root === this ? [] : this.#root.#negs; + if (type === '!' && !this.#root.#filledNegs) + this.#negs.push(this); + this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + get hasMagic() { + /* c8 ignore start */ + if (this.#hasMagic !== undefined) + return this.#hasMagic; + /* c8 ignore stop */ + for (const p of this.#parts) { + if (typeof p === 'string') + continue; + if (p.type || p.hasMagic) + return (this.#hasMagic = true); } - return additionalHeaders[header] || clientHeader || _default; + // note: will be undefined until we generate the regexp src and find out + return this.#hasMagic; } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; + // reconstructs the pattern + toString() { + if (this.#toString !== undefined) + return this.#toString; + if (!this.type) { + return (this.#toString = this.#parts.map(p => String(p)).join('')); } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + else { + return (this.#toString = + this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')'); } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + #fillNegs() { + /* c8 ignore start */ + if (this !== this.#root) + throw new Error('should only call on root'); + if (this.#filledNegs) + return this; + /* c8 ignore stop */ + // call toString() once to fill this out + this.toString(); + this.#filledNegs = true; + let n; + while ((n = this.#negs.pop())) { + if (n.type !== '!') + continue; + // walk up the tree, appending everthing that comes AFTER parentIndex + let p = n; + let pp = p.#parent; + while (pp) { + for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) { + for (const part of n.#parts) { + /* c8 ignore start */ + if (typeof part === 'string') { + throw new Error('string part in extglob AST??'); + } + /* c8 ignore stop */ + part.copyIn(pp.#parts[i]); + } + } + p = pp; + pp = p.#parent; } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if tunneling agent isn't assigned create a new agent - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); } - return agent; + return this; } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; + push(...parts) { + for (const p of parts) { + if (p === '') + continue; + /* c8 ignore start */ + if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { + throw new Error('invalid part: ' + p); + } + /* c8 ignore stop */ + this.#parts.push(p); } - // if agent is already assigned use that agent. - if (proxyAgent) { - return proxyAgent; + } + toJSON() { + const ret = this.type === null + ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) + : [this.type, ...this.#parts.map(p => p.toJSON())]; + if (this.isStart() && !this.type) + ret.unshift([]); + if (this.isEnd() && + (this === this.#root || + (this.#root.#filledNegs && this.#parent?.type === '!'))) { + ret.push({}); } - const usingSsl = parsedUrl.protocol === 'https:'; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}` - }))); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); + return ret; + } + isStart() { + if (this.#root === this) + return true; + // if (this.type) return !!this.#parent?.isStart() + if (!this.#parent?.isStart()) + return false; + if (this.#parentIndex === 0) + return true; + // if everything AHEAD of this is a negation, then it's still the "start" + const p = this.#parent; + for (let i = 0; i < this.#parentIndex; i++) { + const pp = p.#parts[i]; + if (!(pp instanceof AST && pp.type === '!')) { + return false; + } } - return proxyAgent; + return true; } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); + isEnd() { + if (this.#root === this) + return true; + if (this.#parent?.type === '!') + return true; + if (!this.#parent?.isEnd()) + return false; + if (!this.type) + return this.#parent?.isEnd(); + // if not root, it'll always have a parent + /* c8 ignore start */ + const pl = this.#parent ? this.#parent.#parts.length : 0; + /* c8 ignore stop */ + return this.#parentIndex === pl - 1; } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); + copyIn(part) { + if (typeof part === 'string') + this.push(part); + else + this.push(part.clone(this)); + } + clone(parent) { + const c = new AST(this.type, parent); + for (const p of this.#parts) { + c.copyIn(p); + } + return c; + } + static #parseAST(str, ast, pos, opt) { + let escaping = false; + let inBrace = false; + let braceStart = -1; + let braceNeg = false; + if (ast.type === null) { + // outside of a extglob, append until we find a start + let i = pos; + let acc = ''; + while (i < str.length) { + const c = str.charAt(i++); + // still accumulate escapes at this point, but we do ignore + // starts that are escaped + if (escaping || c === '\\') { + escaping = !escaping; + acc += c; + continue; } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; + if (inBrace) { + if (i === braceStart + 1) { + if (c === '^' || c === '!') { + braceNeg = true; } } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; + else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; } - response.headers = res.message.headers; + acc += c; + continue; } - catch (err) { - // Invalid resource (contents not json); leaving result obj null + else if (c === '[') { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; + if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { + ast.push(acc); + acc = ''; + const ext = new AST(c, ast); + i = AST.#parseAST(str, ext, i, opt); + ast.push(ext); + continue; + } + acc += c; + } + ast.push(acc); + return i; + } + // some kind of extglob, pos is at the ( + // find the next | or ) + let i = pos + 1; + let part = new AST(null, ast); + const parts = []; + let acc = ''; + while (i < str.length) { + const c = str.charAt(i++); + // still accumulate escapes at this point, but we do ignore + // starts that are escaped + if (escaping || c === '\\') { + escaping = !escaping; + acc += c; + continue; + } + if (inBrace) { + if (i === braceStart + 1) { + if (c === '^' || c === '!') { + braceNeg = true; } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); } - else { - resolve(response); + else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; } - })); - }); - } - } - lib$2.HttpClient = HttpClient; - const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - - return lib$2; -} - -var auth$2 = {}; - -var hasRequiredAuth$1; - -function requireAuth$1 () { - if (hasRequiredAuth$1) return auth$2; - hasRequiredAuth$1 = 1; - var __awaiter = (auth$2 && auth$2.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(auth$2, "__esModule", { value: true }); - auth$2.PersonalAccessTokenCredentialHandler = auth$2.BearerCredentialHandler = auth$2.BasicCredentialHandler = void 0; - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); + acc += c; + continue; + } + else if (c === '[') { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; + } + if (isExtglobType(c) && str.charAt(i) === '(') { + part.push(acc); + acc = ''; + const ext = new AST(c, part); + part.push(ext); + i = AST.#parseAST(str, ext, i, opt); + continue; + } + if (c === '|') { + part.push(acc); + acc = ''; + parts.push(part); + part = new AST(null, ast); + continue; + } + if (c === ')') { + if (acc === '' && ast.#parts.length === 0) { + ast.#emptyExt = true; + } + part.push(acc); + acc = ''; + ast.push(...parts, part); + return i; + } + acc += c; } - options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; + // unfinished extglob + // if we got here, it was a malformed extglob! not an extglob, but + // maybe something else in there. + ast.type = null; + ast.#hasMagic = undefined; + ast.#parts = [str.substring(pos - 1)]; + return i; } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); + static fromGlob(pattern, options = {}) { + const ast = new AST(null, undefined, options); + AST.#parseAST(pattern, ast, 0, options); + return ast; } - } - auth$2.BasicCredentialHandler = BasicCredentialHandler; - class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); + // returns the regular expression if there's magic, or the unescaped + // string if not. + toMMPattern() { + // should only be called on root + /* c8 ignore start */ + if (this !== this.#root) + return this.#root.toMMPattern(); + /* c8 ignore stop */ + const glob = this.toString(); + const [re, body, hasMagic, uflag] = this.toRegExpSource(); + // if we're in nocase mode, and not nocaseMagicOnly, then we do + // still need a regular expression if we have to case-insensitively + // match capital/lowercase characters. + const anyMagic = hasMagic || + this.#hasMagic || + (this.#options.nocase && + !this.#options.nocaseMagicOnly && + glob.toUpperCase() !== glob.toLowerCase()); + if (!anyMagic) { + return body; } - options.headers['Authorization'] = `Bearer ${this.token}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); + const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : ''); + return Object.assign(new RegExp(`^${re}$`, flags), { + _src: re, + _glob: glob, }); } - } - auth$2.BearerCredentialHandler = BearerCredentialHandler; - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; + get options() { + return this.#options; } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); + // returns the string match, the regexp source, whether there's magic + // in the regexp (so a regular expression is required) and whether or + // not the uflag is needed for the regular expression (for posix classes) + // TODO: instead of injecting the start/end at this point, just return + // the BODY of the regexp, along with the start/end portions suitable + // for binding the start/end in either a joined full-path makeRe context + // (where we bind to (^|/), or a standalone matchPart context (where + // we bind to ^, and not /). Otherwise slashes get duped! + // + // In part-matching mode, the start is: + // - if not isStart: nothing + // - if traversal possible, but not allowed: ^(?!\.\.?$) + // - if dots allowed or not possible: ^ + // - if dots possible and not allowed: ^(?!\.) + // end is: + // - if not isEnd(): nothing + // - else: $ + // + // In full-path matching mode, we put the slash at the START of the + // pattern, so start is: + // - if first pattern: same as part-matching mode + // - if not isStart(): nothing + // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/)) + // - if dots allowed or not possible: / + // - if dots possible and not allowed: /(?!\.) + // end is: + // - if last pattern, same as part-matching mode + // - else nothing + // + // Always put the (?:$|/) on negated tails, though, because that has to be + // there to bind the end of the negated pattern portion, and it's easier to + // just stick it in now rather than try to inject it later in the middle of + // the pattern. + // + // We can just always return the same end, and leave it up to the caller + // to know whether it's going to be used joined or in parts. + // And, if the start is adjusted slightly, can do the same there: + // - if not isStart: nothing + // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$) + // - if dots allowed or not possible: (?:/|^) + // - if dots possible and not allowed: (?:/|^)(?!\.) + // + // But it's better to have a simpler binding without a conditional, for + // performance, so probably better to return both start options. + // + // Then the caller just ignores the end if it's not the first pattern, + // and the start always gets applied. + // + // But that's always going to be $ if it's the ending pattern, or nothing, + // so the caller can just attach $ at the end of the pattern when building. + // + // So the todo is: + // - better detect what kind of start is needed + // - return both flavors of starting pattern + // - attach $ at the end of the pattern when creating the actual RegExp + // + // Ah, but wait, no, that all only applies to the root when the first pattern + // is not an extglob. If the first pattern IS an extglob, then we need all + // that dot prevention biz to live in the extglob portions, because eg + // +(*|.x*) can match .xy but not .yx. + // + // So, return the two flavors if it's #root and the first child is not an + // AST, otherwise leave it to the child AST to handle it, and there, + // use the (?:^|/) style of start binding. + // + // Even simplified further: + // - Since the start for a join is eg /(?!\.) and the start for a part + // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root + // or start or whatever) and prepend ^ or / at the Regexp construction. + toRegExpSource(allowDot) { + const dot = allowDot ?? !!this.#options.dot; + if (this.#root === this) + this.#fillNegs(); + if (!this.type) { + const noEmpty = this.isStart() && this.isEnd(); + const src = this.#parts + .map(p => { + const [re, _, hasMagic, uflag] = typeof p === 'string' + ? AST.#parseGlob(p, this.#hasMagic, noEmpty) + : p.toRegExpSource(allowDot); + this.#hasMagic = this.#hasMagic || hasMagic; + this.#uflag = this.#uflag || uflag; + return re; + }) + .join(''); + let start = ''; + if (this.isStart()) { + if (typeof this.#parts[0] === 'string') { + // this is the string that will match the start of the pattern, + // so we need to protect against dots and such. + // '.' and '..' cannot match unless the pattern is that exactly, + // even if it starts with . or dot:true is set. + const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); + if (!dotTravAllowed) { + const aps = addPatternStart; + // check if we have a possibility of matching . or .., + // and prevent that. + const needNoTrav = + // dots are allowed, and the pattern starts with [ or . + (dot && aps.has(src.charAt(0))) || + // the pattern starts with \., and then [ or . + (src.startsWith('\\.') && aps.has(src.charAt(2))) || + // the pattern starts with \.\., and then [ or . + (src.startsWith('\\.\\.') && aps.has(src.charAt(4))); + // no need to prevent dots if it can't match a dot, or if a + // sub-pattern will be preventing it anyway. + const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); + start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; + } + } + } + // append the "end of path portion" pattern to negation tails + let end = ''; + if (this.isEnd() && + this.#root.#filledNegs && + this.#parent?.type === '!') { + end = '(?:$|\\/)'; + } + const final = start + src + end; + return [ + final, + (0, unescape_js_1.unescape)(src), + (this.#hasMagic = !!this.#hasMagic), + this.#uflag, + ]; } - options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } - } - auth$2.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - - return auth$2; -} - -var hasRequiredOidcUtils$1; - -function requireOidcUtils$1 () { - if (hasRequiredOidcUtils$1) return oidcUtils$1; - hasRequiredOidcUtils$1 = 1; - var __awaiter = (oidcUtils$1 && oidcUtils$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(oidcUtils$1, "__esModule", { value: true }); - oidcUtils$1.OidcClient = void 0; - const http_client_1 = requireLib$2(); - const auth_1 = requireAuth$1(); - const core_1 = requireCore$1(); - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; - if (!token) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); + // We need to calculate the body *twice* if it's a repeat pattern + // at the start, once in nodot mode, then again in dot mode, so a + // pattern like *(?) can match 'x.y' + const repeated = this.type === '*' || this.type === '+'; + // some kind of extglob + const start = this.type === '!' ? '(?:(?!(?:' : '(?:'; + let body = this.#partsToRegExp(dot); + if (this.isStart() && this.isEnd() && !body && this.type !== '!') { + // invalid extglob, has to at least be *something* present, if it's + // the entire path portion. + const s = this.toString(); + this.#parts = [s]; + this.type = null; + this.#hasMagic = undefined; + return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; - if (!runtimeUrl) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); + // XXX abstract out this map method + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot + ? '' + : this.#partsToRegExp(true); + if (bodyDotAllowed === body) { + bodyDotAllowed = ''; } - return runtimeUrl; + if (bodyDotAllowed) { + body = `(?:${body})(?:${bodyDotAllowed})*?`; + } + // an empty !() is exactly equivalent to a starNoEmpty + let final = ''; + if (this.type === '!' && this.#emptyExt) { + final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; + } + else { + const close = this.type === '!' + ? // !() must match something,but !(x) can match '' + '))' + + (this.isStart() && !dot && !allowDot ? startNoDot : '') + + star + + ')' + : this.type === '@' + ? ')' + : this.type === '?' + ? ')?' + : this.type === '+' && bodyDotAllowed + ? ')' + : this.type === '*' && bodyDotAllowed + ? `)?` + : `)${this.type}`; + final = start + body + close; + } + return [ + final, + (0, unescape_js_1.unescape)(body), + (this.#hasMagic = !!this.#hasMagic), + this.#uflag, + ]; } - static getCall(id_token_url) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient - .getJson(id_token_url) - .catch(error => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n - Error Message: ${error.message}`); - }); - const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; - if (!id_token) { - throw new Error('Response json body do not have ID Token field'); + #partsToRegExp(dot) { + return this.#parts + .map(p => { + // extglob ASTs should only contain parent ASTs + /* c8 ignore start */ + if (typeof p === 'string') { + throw new Error('string type in extglob ast??'); } - return id_token; - }); + /* c8 ignore stop */ + // can ignore hasMagic, because extglobs are already always magic + const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot); + this.#uflag = this.#uflag || uflag; + return re; + }) + .filter(p => !(this.isStart() && this.isEnd()) || !!p) + .join('|'); } - static getIDToken(audience) { - return __awaiter(this, void 0, void 0, function* () { - try { - // New ID Token is requested from action service - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; + static #parseGlob(glob, hasMagic, noEmpty = false) { + let escaping = false; + let re = ''; + let uflag = false; + for (let i = 0; i < glob.length; i++) { + const c = glob.charAt(i); + if (escaping) { + escaping = false; + re += (reSpecials.has(c) ? '\\' : '') + c; + continue; + } + if (c === '\\') { + if (i === glob.length - 1) { + re += '\\\\'; } - (0, core_1.debug)(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - (0, core_1.setSecret)(id_token); - return id_token; + else { + escaping = true; + } + continue; } - catch (error) { - throw new Error(`Error message: ${error.message}`); + if (c === '[') { + const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); + if (consumed) { + re += src; + uflag = uflag || needUflag; + i += consumed - 1; + hasMagic = hasMagic || magic; + continue; + } } - }); + if (c === '*') { + if (noEmpty && glob === '*') + re += starNoEmpty; + else + re += star; + hasMagic = true; + continue; + } + if (c === '?') { + re += qmark; + hasMagic = true; + continue; + } + re += regExpEscape(c); + } + return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; } } - oidcUtils$1.OidcClient = OidcClient; + ast.AST = AST; - return oidcUtils$1; + return ast; } -var summary$1 = {}; +var _escape = {}; + +var hasRequired_escape; + +function require_escape () { + if (hasRequired_escape) return _escape; + hasRequired_escape = 1; + Object.defineProperty(_escape, "__esModule", { value: true }); + _escape.escape = void 0; + /** + * Escape all magic characters in a glob pattern. + * + * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} + * option is used, then characters are escaped by wrapping in `[]`, because + * a magic character wrapped in a character class can only be satisfied by + * that exact character. In this mode, `\` is _not_ escaped, because it is + * not interpreted as a magic character, but instead as a path separator. + */ + const escape = (s, { windowsPathsNoEscape = false, } = {}) => { + // don't need to escape +@! because we escape the parens + // that make those magic, and escaping ! as [!] isn't valid, + // because [!]] is a valid glob class meaning not ']'. + return windowsPathsNoEscape + ? s.replace(/[?*()[\]]/g, '[$&]') + : s.replace(/[?*()[\]\\]/g, '\\$&'); + }; + _escape.escape = escape; + + return _escape; +} -var hasRequiredSummary$1; +var hasRequiredCommonjs$f; -function requireSummary$1 () { - if (hasRequiredSummary$1) return summary$1; - hasRequiredSummary$1 = 1; +function requireCommonjs$f () { + if (hasRequiredCommonjs$f) return commonjs$h; + hasRequiredCommonjs$f = 1; (function (exports$1) { - var __awaiter = (summary$1 && summary$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; - const os_1 = require$$0$3; - const fs_1 = require$$1__default; - const { access, appendFile, writeFile } = fs_1.promises; - exports$1.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; - exports$1.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; - class Summary { - constructor() { - this._buffer = ''; - } - /** - * Finds the summary file path from the environment, rejects if env var is not found or file does not exist - * Also checks r/w permissions. - * - * @returns step summary file path - */ - filePath() { - return __awaiter(this, void 0, void 0, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports$1.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for $${exports$1.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } - catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - /** - * Wraps content in an HTML tag, adding any HTML attributes - * - * @param {string} tag HTML tag to wrap - * @param {string | null} content content within the tag - * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add - * - * @returns {string} content wrapped in HTML element - */ - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs) - .map(([key, value]) => ` ${key}="${value}"`) - .join(''); - if (!content) { - return `<${tag}${htmlAttrs}>`; - } - return `<${tag}${htmlAttrs}>${content}`; - } - /** - * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. - * - * @param {SummaryWriteOptions} [options] (optional) options for write operation - * - * @returns {Promise} summary instance - */ - write(options) { - return __awaiter(this, void 0, void 0, function* () { - const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); - return this.emptyBuffer(); - }); - } - /** - * Clears the summary buffer and wipes the summary file - * - * @returns {Summary} summary instance - */ - clear() { - return __awaiter(this, void 0, void 0, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - /** - * Returns the current summary buffer as a string - * - * @returns {string} string of summary buffer - */ - stringify() { - return this._buffer; - } - /** - * If the summary buffer is empty - * - * @returns {boolen} true if the buffer is empty - */ - isEmptyBuffer() { - return this._buffer.length === 0; + exports$1.unescape = exports$1.escape = exports$1.AST = exports$1.Minimatch = exports$1.match = exports$1.makeRe = exports$1.braceExpand = exports$1.defaults = exports$1.filter = exports$1.GLOBSTAR = exports$1.sep = exports$1.minimatch = void 0; + const brace_expansion_1 = requireCommonjs$g(); + const assert_valid_pattern_js_1 = requireAssertValidPattern(); + const ast_js_1 = requireAst(); + const escape_js_1 = require_escape(); + const unescape_js_1 = require_unescape(); + const minimatch = (p, pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false; } - /** - * Resets the summary buffer without writing to summary file - * - * @returns {Summary} summary instance - */ - emptyBuffer() { - this._buffer = ''; - return this; + return new Minimatch(pattern, options).match(p); + }; + exports$1.minimatch = minimatch; + // Optimized checking for the most common glob patterns. + const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; + const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); + const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); + const starDotExtTestNocase = (ext) => { + ext = ext.toLowerCase(); + return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); + }; + const starDotExtTestNocaseDot = (ext) => { + ext = ext.toLowerCase(); + return (f) => f.toLowerCase().endsWith(ext); + }; + const starDotStarRE = /^\*+\.\*+$/; + const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); + const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); + const dotStarRE = /^\.\*+$/; + const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); + const starRE = /^\*+$/; + const starTest = (f) => f.length !== 0 && !f.startsWith('.'); + const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; + const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; + const qmarksTestNocase = ([$0, ext = '']) => { + const noext = qmarksTestNoExt([$0]); + if (!ext) + return noext; + ext = ext.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext); + }; + const qmarksTestNocaseDot = ([$0, ext = '']) => { + const noext = qmarksTestNoExtDot([$0]); + if (!ext) + return noext; + ext = ext.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext); + }; + const qmarksTestDot = ([$0, ext = '']) => { + const noext = qmarksTestNoExtDot([$0]); + return !ext ? noext : (f) => noext(f) && f.endsWith(ext); + }; + const qmarksTest = ([$0, ext = '']) => { + const noext = qmarksTestNoExt([$0]); + return !ext ? noext : (f) => noext(f) && f.endsWith(ext); + }; + const qmarksTestNoExt = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && !f.startsWith('.'); + }; + const qmarksTestNoExtDot = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && f !== '.' && f !== '..'; + }; + /* c8 ignore start */ + const defaultPlatform = (typeof process === 'object' && process + ? (typeof process.env === 'object' && + process.env && + process.env.__MINIMATCH_TESTING_PLATFORM__) || + process.platform + : 'posix'); + const path = { + win32: { sep: '\\' }, + posix: { sep: '/' }, + }; + /* c8 ignore stop */ + exports$1.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; + exports$1.minimatch.sep = exports$1.sep; + exports$1.GLOBSTAR = Symbol('globstar **'); + exports$1.minimatch.GLOBSTAR = exports$1.GLOBSTAR; + // any single thing other than / + // don't need to escape / when using new RegExp() + const qmark = '[^/]'; + // * => any number of characters + const star = qmark + '*?'; + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; + const filter = (pattern, options = {}) => (p) => (0, exports$1.minimatch)(p, pattern, options); + exports$1.filter = filter; + exports$1.minimatch.filter = exports$1.filter; + const ext = (a, b = {}) => Object.assign({}, a, b); + const defaults = (def) => { + if (!def || typeof def !== 'object' || !Object.keys(def).length) { + return exports$1.minimatch; } - /** - * Adds raw text to the summary buffer - * - * @param {string} text content to add - * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) - * - * @returns {Summary} summary instance - */ - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; + const orig = exports$1.minimatch; + const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); + return Object.assign(m, { + Minimatch: class Minimatch extends orig.Minimatch { + constructor(pattern, options = {}) { + super(pattern, ext(def, options)); + } + static defaults(options) { + return orig.defaults(ext(def, options)).Minimatch; + } + }, + AST: class AST extends orig.AST { + /* c8 ignore start */ + constructor(type, parent, options = {}) { + super(type, parent, ext(def, options)); + } + /* c8 ignore stop */ + static fromGlob(pattern, options = {}) { + return orig.AST.fromGlob(pattern, ext(def, options)); + } + }, + unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), + escape: (s, options = {}) => orig.escape(s, ext(def, options)), + filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), + defaults: (options) => orig.defaults(ext(def, options)), + makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), + braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), + match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), + sep: orig.sep, + GLOBSTAR: exports$1.GLOBSTAR, + }); + }; + exports$1.defaults = defaults; + exports$1.minimatch.defaults = exports$1.defaults; + // Brace expansion: + // a{b,c}d -> abd acd + // a{b,}c -> abc ac + // a{0..3}d -> a0d a1d a2d a3d + // a{b,c{d,e}f}g -> abg acdfg acefg + // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg + // + // Invalid sets are not expanded. + // a{2..}b -> a{2..}b + // a{b}c -> a{b}c + const braceExpand = (pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + // Thanks to Yeting Li for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern]; } - /** - * Adds the operating system-specific end-of-line marker to the buffer - * - * @returns {Summary} summary instance - */ - addEOL() { - return this.addRaw(os_1.EOL); + return (0, brace_expansion_1.expand)(pattern); + }; + exports$1.braceExpand = braceExpand; + exports$1.minimatch.braceExpand = exports$1.braceExpand; + // parse a component of the expanded set. + // At this point, no pattern may contain "/" in it + // so we're going to return a 2d array, where each entry is the full + // pattern, split on '/', and then turned into a regular expression. + // A regexp is made at the end which joins each array with an + // escaped /, and another full one which joins each regexp with |. + // + // Following the lead of Bash 4.1, note that "**" only has special meaning + // when it is the *only* thing in a path portion. Otherwise, any series + // of * is equivalent to a single *. Globstar behavior is enabled by + // default, and can be disabled by setting options.noglobstar. + const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); + exports$1.makeRe = makeRe; + exports$1.minimatch.makeRe = exports$1.makeRe; + const match = (list, pattern, options = {}) => { + const mm = new Minimatch(pattern, options); + list = list.filter(f => mm.match(f)); + if (mm.options.nonull && !list.length) { + list.push(pattern); } - /** - * Adds an HTML codeblock to the summary buffer - * - * @param {string} code content to render within fenced code block - * @param {string} lang (optional) language to syntax highlight code - * - * @returns {Summary} summary instance - */ - addCodeBlock(code, lang) { - const attrs = Object.assign({}, (lang && { lang })); - const element = this.wrap('pre', this.wrap('code', code), attrs); - return this.addRaw(element).addEOL(); + return list; + }; + exports$1.match = match; + exports$1.minimatch.match = exports$1.match; + // replace stuff like \* with * + const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; + const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + class Minimatch { + options; + set; + pattern; + windowsPathsNoEscape; + nonegate; + negate; + comment; + empty; + preserveMultipleSlashes; + partial; + globSet; + globParts; + nocase; + isWindows; + platform; + windowsNoMagicRoot; + regexp; + constructor(pattern, options = {}) { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + options = options || {}; + this.options = options; + this.pattern = pattern; + this.platform = options.platform || defaultPlatform; + this.isWindows = this.platform === 'win32'; + this.windowsPathsNoEscape = + !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + if (this.windowsPathsNoEscape) { + this.pattern = this.pattern.replace(/\\/g, '/'); + } + this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; + this.regexp = null; + this.negate = false; + this.nonegate = !!options.nonegate; + this.comment = false; + this.empty = false; + this.partial = !!options.partial; + this.nocase = !!this.options.nocase; + this.windowsNoMagicRoot = + options.windowsNoMagicRoot !== undefined + ? options.windowsNoMagicRoot + : !!(this.isWindows && this.nocase); + this.globSet = []; + this.globParts = []; + this.set = []; + // make the set of regexps etc. + this.make(); } - /** - * Adds an HTML list to the summary buffer - * - * @param {string[]} items list of items to render - * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) - * - * @returns {Summary} summary instance - */ - addList(items, ordered = false) { - const tag = ordered ? 'ol' : 'ul'; - const listItems = items.map(item => this.wrap('li', item)).join(''); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); + hasMagic() { + if (this.options.magicalBraces && this.set.length > 1) { + return true; + } + for (const pattern of this.set) { + for (const part of pattern) { + if (typeof part !== 'string') + return true; + } + } + return false; } - /** - * Adds an HTML table to the summary buffer - * - * @param {SummaryTableCell[]} rows table rows - * - * @returns {Summary} summary instance - */ - addTable(rows) { - const tableBody = rows - .map(row => { - const cells = row - .map(cell => { - if (typeof cell === 'string') { - return this.wrap('td', cell); + debug(..._) { } + make() { + const pattern = this.pattern; + const options = this.options; + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + // step 1: figure out negation, etc. + this.parseNegate(); + // step 2: expand braces + this.globSet = [...new Set(this.braceExpand())]; + if (options.debug) { + this.debug = (...args) => console.error(...args); + } + this.debug(this.pattern, this.globSet); + // step 3: now we have a set, so turn each one into a series of + // path-portion matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + // + // First, we preprocess to make the glob pattern sets a bit simpler + // and deduped. There are some perf-killing patterns that can cause + // problems with a glob walk, but we can simplify them down a bit. + const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); + this.globParts = this.preprocess(rawGlobParts); + this.debug(this.pattern, this.globParts); + // glob --> regexps + let set = this.globParts.map((s, _, __) => { + if (this.isWindows && this.windowsNoMagicRoot) { + // check if it's a drive or unc path. + const isUNC = s[0] === '' && + s[1] === '' && + (s[2] === '?' || !globMagic.test(s[2])) && + !globMagic.test(s[3]); + const isDrive = /^[a-z]:/i.test(s[0]); + if (isUNC) { + return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; } - const { header, data, colspan, rowspan } = cell; - const tag = header ? 'th' : 'td'; - const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); - return this.wrap(tag, data, attrs); - }) - .join(''); - return this.wrap('tr', cells); - }) - .join(''); - const element = this.wrap('table', tableBody); - return this.addRaw(element).addEOL(); - } - /** - * Adds a collapsable HTML details element to the summary buffer - * - * @param {string} label text for the closed state - * @param {string} content collapsable content - * - * @returns {Summary} summary instance - */ - addDetails(label, content) { - const element = this.wrap('details', this.wrap('summary', label) + content); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML image tag to the summary buffer - * - * @param {string} src path to the image you to embed - * @param {string} alt text description of the image - * @param {SummaryImageOptions} options (optional) addition image attributes - * - * @returns {Summary} summary instance - */ - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); - const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML section heading element - * - * @param {string} text heading text - * @param {number | string} [level=1] (optional) the heading level, default: 1 - * - * @returns {Summary} summary instance - */ - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) - ? tag - : 'h1'; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); + else if (isDrive) { + return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; + } + } + return s.map(ss => this.parse(ss)); + }); + this.debug(this.pattern, set); + // filter out everything that didn't compile properly. + this.set = set.filter(s => s.indexOf(false) === -1); + // do not treat the ? in UNC paths as magic + if (this.isWindows) { + for (let i = 0; i < this.set.length; i++) { + const p = this.set[i]; + if (p[0] === '' && + p[1] === '' && + this.globParts[i][2] === '?' && + typeof p[3] === 'string' && + /^[a-z]:$/i.test(p[3])) { + p[2] = '?'; + } + } + } + this.debug(this.pattern, this.set); } - /** - * Adds an HTML thematic break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap('hr', null); - return this.addRaw(element).addEOL(); + // various transforms to equivalent pattern sets that are + // faster to process in a filesystem walk. The goal is to + // eliminate what we can, and push all ** patterns as far + // to the right as possible, even if it increases the number + // of patterns that we have to process. + preprocess(globParts) { + // if we're not in globstar mode, then turn all ** into * + if (this.options.noglobstar) { + for (let i = 0; i < globParts.length; i++) { + for (let j = 0; j < globParts[i].length; j++) { + if (globParts[i][j] === '**') { + globParts[i][j] = '*'; + } + } + } + } + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + // aggressive optimization for the purpose of fs walking + globParts = this.firstPhasePreProcess(globParts); + globParts = this.secondPhasePreProcess(globParts); + } + else if (optimizationLevel >= 1) { + // just basic optimizations to remove some .. parts + globParts = this.levelOneOptimize(globParts); + } + else { + // just collapse multiple ** portions into one + globParts = this.adjascentGlobstarOptimize(globParts); + } + return globParts; } - /** - * Adds an HTML line break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap('br', null); - return this.addRaw(element).addEOL(); + // just get rid of adjascent ** portions + adjascentGlobstarOptimize(globParts) { + return globParts.map(parts => { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let i = gs; + while (parts[i + 1] === '**') { + i++; + } + if (i !== gs) { + parts.splice(gs, i - gs); + } + } + return parts; + }); } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, (cite && { cite })); - const element = this.wrap('blockquote', text, attrs); - return this.addRaw(element).addEOL(); + // get rid of adjascent ** and resolve .. portions + levelOneOptimize(globParts) { + return globParts.map(parts => { + parts = parts.reduce((set, part) => { + const prev = set[set.length - 1]; + if (part === '**' && prev === '**') { + return set; + } + if (part === '..') { + if (prev && prev !== '..' && prev !== '.' && prev !== '**') { + set.pop(); + return set; + } + } + set.push(part); + return set; + }, []); + return parts.length === 0 ? [''] : parts; + }); } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap('a', text, { href }); - return this.addRaw(element).addEOL(); - } - } - const _summary = new Summary(); - /** - * @deprecated use `core.summary` - */ - exports$1.markdownSummary = _summary; - exports$1.summary = _summary; - - } (summary$1)); - return summary$1; -} - -var pathUtils$1 = {}; - -var hasRequiredPathUtils$1; - -function requirePathUtils$1 () { - if (hasRequiredPathUtils$1) return pathUtils$1; - hasRequiredPathUtils$1 = 1; - var __createBinding = (pathUtils$1 && pathUtils$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (pathUtils$1 && pathUtils$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (pathUtils$1 && pathUtils$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(pathUtils$1, "__esModule", { value: true }); - pathUtils$1.toPlatformPath = pathUtils$1.toWin32Path = pathUtils$1.toPosixPath = void 0; - const path = __importStar(require$$1$6); - /** - * toPosixPath converts the given path to the posix form. On Windows, \\ will be - * replaced with /. - * - * @param pth. Path to transform. - * @return string Posix path. - */ - function toPosixPath(pth) { - return pth.replace(/[\\]/g, '/'); - } - pathUtils$1.toPosixPath = toPosixPath; - /** - * toWin32Path converts the given path to the win32 form. On Linux, / will be - * replaced with \\. - * - * @param pth. Path to transform. - * @return string Win32 path. - */ - function toWin32Path(pth) { - return pth.replace(/[/]/g, '\\'); - } - pathUtils$1.toWin32Path = toWin32Path; - /** - * toPlatformPath converts the given path to a platform-specific path. It does - * this by replacing instances of / and \ with the platform-specific path - * separator. - * - * @param pth The path to platformize. - * @return string The platform-specific path. - */ - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - pathUtils$1.toPlatformPath = toPlatformPath; - - return pathUtils$1; -} - -var platform$1 = {}; - -var exec$1 = {}; - -var toolrunner$1 = {}; - -var io$1 = {}; - -var ioUtil$1 = {}; - -var hasRequiredIoUtil$1; - -function requireIoUtil$1 () { - if (hasRequiredIoUtil$1) return ioUtil$1; - hasRequiredIoUtil$1 = 1; - (function (exports$1) { - var __createBinding = (ioUtil$1 && ioUtil$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (ioUtil$1 && ioUtil$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (ioUtil$1 && ioUtil$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (ioUtil$1 && ioUtil$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getCmdPath = exports$1.tryGetExecutablePath = exports$1.isRooted = exports$1.isDirectory = exports$1.exists = exports$1.READONLY = exports$1.UV_FS_O_EXLOCK = exports$1.IS_WINDOWS = exports$1.unlink = exports$1.symlink = exports$1.stat = exports$1.rmdir = exports$1.rm = exports$1.rename = exports$1.readlink = exports$1.readdir = exports$1.open = exports$1.mkdir = exports$1.lstat = exports$1.copyFile = exports$1.chmod = void 0; - const fs = __importStar(require$$1__default); - const path = __importStar(require$$1$6); - _a = fs.promises - // export const {open} = 'fs' - , exports$1.chmod = _a.chmod, exports$1.copyFile = _a.copyFile, exports$1.lstat = _a.lstat, exports$1.mkdir = _a.mkdir, exports$1.open = _a.open, exports$1.readdir = _a.readdir, exports$1.readlink = _a.readlink, exports$1.rename = _a.rename, exports$1.rm = _a.rm, exports$1.rmdir = _a.rmdir, exports$1.stat = _a.stat, exports$1.symlink = _a.symlink, exports$1.unlink = _a.unlink; - // export const {open} = 'fs' - exports$1.IS_WINDOWS = process.platform === 'win32'; - // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 - exports$1.UV_FS_O_EXLOCK = 0x10000000; - exports$1.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - try { - yield exports$1.stat(fsPath); - } - catch (err) { - if (err.code === 'ENOENT') { - return false; - } - throw err; - } - return true; - }); - } - exports$1.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports$1.stat(fsPath) : yield exports$1.lstat(fsPath); - return stats.isDirectory(); - }); - } - exports$1.isDirectory = isDirectory; - /** - * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: - * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). - */ - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports$1.IS_WINDOWS) { - return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello - ); // e.g. C: or C:\hello - } - return p.startsWith('/'); - } - exports$1.isRooted = isRooted; - /** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = undefined; - try { - // test file exists - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } + levelTwoFileOptimize(parts) { + if (!Array.isArray(parts)) { + parts = this.slashSplit(parts); } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // on Windows, test for valid extension - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { - return filePath; + let didSomething = false; + do { + didSomething = false; + //
// -> 
/
+		            if (!this.preserveMultipleSlashes) {
+		                for (let i = 1; i < parts.length - 1; i++) {
+		                    const p = parts[i];
+		                    // don't squeeze out UNC patterns
+		                    if (i === 1 && p === '' && parts[0] === '')
+		                        continue;
+		                    if (p === '.' || p === '') {
+		                        didSomething = true;
+		                        parts.splice(i, 1);
+		                        i--;
+		                    }
 		                }
-		            }
-		            else {
-		                if (isUnixExecutable(stats)) {
-		                    return filePath;
+		                if (parts[0] === '.' &&
+		                    parts.length === 2 &&
+		                    (parts[1] === '.' || parts[1] === '')) {
+		                    didSomething = true;
+		                    parts.pop();
 		                }
 		            }
-		        }
-		        // try each extension
-		        const originalFilePath = filePath;
-		        for (const extension of extensions) {
-		            filePath = originalFilePath + extension;
-		            stats = undefined;
-		            try {
-		                stats = yield exports$1.stat(filePath);
-		            }
-		            catch (err) {
-		                if (err.code !== 'ENOENT') {
-		                    // eslint-disable-next-line no-console
-		                    console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
+		            // 
/

/../ ->

/
+		            let dd = 0;
+		            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
+		                const p = parts[dd - 1];
+		                if (p && p !== '.' && p !== '..' && p !== '**') {
+		                    didSomething = true;
+		                    parts.splice(dd - 1, 2);
+		                    dd -= 2;
 		                }
 		            }
-		            if (stats && stats.isFile()) {
-		                if (exports$1.IS_WINDOWS) {
-		                    // preserve the case of the actual file (since an extension was appended)
-		                    try {
-		                        const directory = path.dirname(filePath);
-		                        const upperName = path.basename(filePath).toUpperCase();
-		                        for (const actualName of yield exports$1.readdir(directory)) {
-		                            if (upperName === actualName.toUpperCase()) {
-		                                filePath = path.join(directory, actualName);
-		                                break;
-		                            }
+		        } while (didSomething);
+		        return parts.length === 0 ? [''] : parts;
+		    }
+		    // First phase: single-pattern processing
+		    // 
 is 1 or more portions
+		    //  is 1 or more portions
+		    // 

is any portion other than ., .., '', or ** + // is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/} + //

// -> 
/
+		    // 
/

/../ ->

/
+		    // **/**/ -> **/
+		    //
+		    // **/*/ -> */**/ <== not valid because ** doesn't follow
+		    // this WOULD be allowed if ** did follow symlinks, or * didn't
+		    firstPhasePreProcess(globParts) {
+		        let didSomething = false;
+		        do {
+		            didSomething = false;
+		            // 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + //

/**/**/ -> 
/**/
+		                        gss++;
+		                    }
+		                    // eg, if gs is 2 and gss is 4, that means we have 3 **
+		                    // parts, and can remove 2 of them.
+		                    if (gss > gs) {
+		                        parts.splice(gs + 1, gss - gs);
+		                    }
+		                    let next = parts[gs + 1];
+		                    const p = parts[gs + 2];
+		                    const p2 = parts[gs + 3];
+		                    if (next !== '..')
+		                        continue;
+		                    if (!p ||
+		                        p === '.' ||
+		                        p === '..' ||
+		                        !p2 ||
+		                        p2 === '.' ||
+		                        p2 === '..') {
+		                        continue;
+		                    }
+		                    didSomething = true;
+		                    // edit parts in place, and push the new one
+		                    parts.splice(gs, 1);
+		                    const other = parts.slice(0);
+		                    other[gs] = '**';
+		                    globParts.push(other);
+		                    gs--;
+		                }
+		                // 
// -> 
/
+		                if (!this.preserveMultipleSlashes) {
+		                    for (let i = 1; i < parts.length - 1; i++) {
+		                        const p = parts[i];
+		                        // don't squeeze out UNC patterns
+		                        if (i === 1 && p === '' && parts[0] === '')
+		                            continue;
+		                        if (p === '.' || p === '') {
+		                            didSomething = true;
+		                            parts.splice(i, 1);
+		                            i--;
 		                        }
 		                    }
-		                    catch (err) {
-		                        // eslint-disable-next-line no-console
-		                        console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);
+		                    if (parts[0] === '.' &&
+		                        parts.length === 2 &&
+		                        (parts[1] === '.' || parts[1] === '')) {
+		                        didSomething = true;
+		                        parts.pop();
 		                    }
-		                    return filePath;
 		                }
-		                else {
-		                    if (isUnixExecutable(stats)) {
-		                        return filePath;
+		                // 
/

/../ ->

/
+		                let dd = 0;
+		                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
+		                    const p = parts[dd - 1];
+		                    if (p && p !== '.' && p !== '..' && p !== '**') {
+		                        didSomething = true;
+		                        const needDot = dd === 1 && parts[dd + 1] === '**';
+		                        const splin = needDot ? ['.'] : [];
+		                        parts.splice(dd - 1, 2, ...splin);
+		                        if (parts.length === 0)
+		                            parts.push('');
+		                        dd -= 2;
 		                    }
 		                }
 		            }
+		        } while (didSomething);
+		        return globParts;
+		    }
+		    // second phase: multi-pattern dedupes
+		    // {
/*/,
/

/} ->

/*/
+		    // {
/,
/} -> 
/
+		    // {
/**/,
/} -> 
/**/
+		    //
+		    // {
/**/,
/**/

/} ->

/**/
+		    // ^-- not valid because ** doens't follow symlinks
+		    secondPhasePreProcess(globParts) {
+		        for (let i = 0; i < globParts.length - 1; i++) {
+		            for (let j = i + 1; j < globParts.length; j++) {
+		                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
+		                if (matched) {
+		                    globParts[i] = [];
+		                    globParts[j] = matched;
+		                    break;
+		                }
+		            }
 		        }
-		        return '';
-		    });
-		}
-		exports$1.tryGetExecutablePath = tryGetExecutablePath;
-		function normalizeSeparators(p) {
-		    p = p || '';
-		    if (exports$1.IS_WINDOWS) {
-		        // convert slashes on Windows
-		        p = p.replace(/\//g, '\\');
-		        // remove redundant slashes
-		        return p.replace(/\\\\+/g, '\\');
+		        return globParts.filter(gs => gs.length);
 		    }
-		    // remove redundant slashes
-		    return p.replace(/\/\/+/g, '/');
-		}
-		// on Mac/Linux, test the execute bit
-		//     R   W  X  R  W X R W X
-		//   256 128 64 32 16 8 4 2 1
-		function isUnixExecutable(stats) {
-		    return ((stats.mode & 1) > 0 ||
-		        ((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||
-		        ((stats.mode & 64) > 0 && stats.uid === process.getuid()));
-		}
-		// Get the path of cmd.exe in windows
-		function getCmdPath() {
-		    var _a;
-		    return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`;
-		}
-		exports$1.getCmdPath = getCmdPath;
-		
-	} (ioUtil$1));
-	return ioUtil$1;
-}
-
-var hasRequiredIo$1;
-
-function requireIo$1 () {
-	if (hasRequiredIo$1) return io$1;
-	hasRequiredIo$1 = 1;
-	var __createBinding = (io$1 && io$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (io$1 && io$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (io$1 && io$1.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (io$1 && io$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(io$1, "__esModule", { value: true });
-	io$1.findInPath = io$1.which = io$1.mkdirP = io$1.rmRF = io$1.mv = io$1.cp = void 0;
-	const assert_1 = require$$0$8;
-	const path = __importStar(require$$1$6);
-	const ioUtil = __importStar(requireIoUtil$1());
-	/**
-	 * Copies a file or folder.
-	 * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
-	 *
-	 * @param     source    source path
-	 * @param     dest      destination path
-	 * @param     options   optional. See CopyOptions.
-	 */
-	function cp(source, dest, options = {}) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const { force, recursive, copySourceDirectory } = readCopyOptions(options);
-	        const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;
-	        // Dest is an existing file, but not forcing
-	        if (destStat && destStat.isFile() && !force) {
-	            return;
-	        }
-	        // If dest is an existing directory, should copy inside.
-	        const newDest = destStat && destStat.isDirectory() && copySourceDirectory
-	            ? path.join(dest, path.basename(source))
-	            : dest;
-	        if (!(yield ioUtil.exists(source))) {
-	            throw new Error(`no such file or directory: ${source}`);
-	        }
-	        const sourceStat = yield ioUtil.stat(source);
-	        if (sourceStat.isDirectory()) {
-	            if (!recursive) {
-	                throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);
-	            }
-	            else {
-	                yield cpDirRecursive(source, newDest, 0, force);
-	            }
-	        }
-	        else {
-	            if (path.relative(source, newDest) === '') {
-	                // a file cannot be copied to itself
-	                throw new Error(`'${newDest}' and '${source}' are the same file`);
-	            }
-	            yield copyFile(source, newDest, force);
-	        }
-	    });
-	}
-	io$1.cp = cp;
-	/**
-	 * Moves a path.
-	 *
-	 * @param     source    source path
-	 * @param     dest      destination path
-	 * @param     options   optional. See MoveOptions.
-	 */
-	function mv(source, dest, options = {}) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        if (yield ioUtil.exists(dest)) {
-	            let destExists = true;
-	            if (yield ioUtil.isDirectory(dest)) {
-	                // If dest is directory copy src into dest
-	                dest = path.join(dest, path.basename(source));
-	                destExists = yield ioUtil.exists(dest);
-	            }
-	            if (destExists) {
-	                if (options.force == null || options.force) {
-	                    yield rmRF(dest);
-	                }
-	                else {
-	                    throw new Error('Destination already exists');
-	                }
-	            }
-	        }
-	        yield mkdirP(path.dirname(dest));
-	        yield ioUtil.rename(source, dest);
-	    });
-	}
-	io$1.mv = mv;
-	/**
-	 * Remove a path recursively with force
-	 *
-	 * @param inputPath path to remove
-	 */
-	function rmRF(inputPath) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        if (ioUtil.IS_WINDOWS) {
-	            // Check for invalid characters
-	            // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
-	            if (/[*"<>|]/.test(inputPath)) {
-	                throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows');
-	            }
-	        }
-	        try {
-	            // note if path does not exist, error is silent
-	            yield ioUtil.rm(inputPath, {
-	                force: true,
-	                maxRetries: 3,
-	                recursive: true,
-	                retryDelay: 300
-	            });
-	        }
-	        catch (err) {
-	            throw new Error(`File was unable to be removed ${err}`);
-	        }
-	    });
-	}
-	io$1.rmRF = rmRF;
-	/**
-	 * Make a directory.  Creates the full path with folders in between
-	 * Will throw if it fails
-	 *
-	 * @param   fsPath        path to create
-	 * @returns Promise
-	 */
-	function mkdirP(fsPath) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        assert_1.ok(fsPath, 'a path argument must be provided');
-	        yield ioUtil.mkdir(fsPath, { recursive: true });
-	    });
-	}
-	io$1.mkdirP = mkdirP;
-	/**
-	 * Returns path of a tool had the tool actually been invoked.  Resolves via paths.
-	 * If you check and the tool does not exist, it will throw.
-	 *
-	 * @param     tool              name of the tool
-	 * @param     check             whether to check if tool exists
-	 * @returns   Promise   path to tool
-	 */
-	function which(tool, check) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        if (!tool) {
-	            throw new Error("parameter 'tool' is required");
-	        }
-	        // recursive when check=true
-	        if (check) {
-	            const result = yield which(tool, false);
-	            if (!result) {
-	                if (ioUtil.IS_WINDOWS) {
-	                    throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);
-	                }
-	                else {
-	                    throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);
-	                }
-	            }
-	            return result;
-	        }
-	        const matches = yield findInPath(tool);
-	        if (matches && matches.length > 0) {
-	            return matches[0];
-	        }
-	        return '';
-	    });
-	}
-	io$1.which = which;
-	/**
-	 * Returns a list of all occurrences of the given tool on the system path.
-	 *
-	 * @returns   Promise  the paths of the tool
-	 */
-	function findInPath(tool) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        if (!tool) {
-	            throw new Error("parameter 'tool' is required");
-	        }
-	        // build the list of extensions to try
-	        const extensions = [];
-	        if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) {
-	            for (const extension of process.env['PATHEXT'].split(path.delimiter)) {
-	                if (extension) {
-	                    extensions.push(extension);
-	                }
-	            }
-	        }
-	        // if it's rooted, return it if exists. otherwise return empty.
-	        if (ioUtil.isRooted(tool)) {
-	            const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);
-	            if (filePath) {
-	                return [filePath];
-	            }
-	            return [];
-	        }
-	        // if any path separators, return empty
-	        if (tool.includes(path.sep)) {
-	            return [];
-	        }
-	        // build the list of directories
-	        //
-	        // Note, technically "where" checks the current directory on Windows. From a toolkit perspective,
-	        // it feels like we should not do this. Checking the current directory seems like more of a use
-	        // case of a shell, and the which() function exposed by the toolkit should strive for consistency
-	        // across platforms.
-	        const directories = [];
-	        if (process.env.PATH) {
-	            for (const p of process.env.PATH.split(path.delimiter)) {
-	                if (p) {
-	                    directories.push(p);
-	                }
-	            }
-	        }
-	        // find all matches
-	        const matches = [];
-	        for (const directory of directories) {
-	            const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions);
-	            if (filePath) {
-	                matches.push(filePath);
-	            }
-	        }
-	        return matches;
-	    });
-	}
-	io$1.findInPath = findInPath;
-	function readCopyOptions(options) {
-	    const force = options.force == null ? true : options.force;
-	    const recursive = Boolean(options.recursive);
-	    const copySourceDirectory = options.copySourceDirectory == null
-	        ? true
-	        : Boolean(options.copySourceDirectory);
-	    return { force, recursive, copySourceDirectory };
-	}
-	function cpDirRecursive(sourceDir, destDir, currentDepth, force) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        // Ensure there is not a run away recursive copy
-	        if (currentDepth >= 255)
-	            return;
-	        currentDepth++;
-	        yield mkdirP(destDir);
-	        const files = yield ioUtil.readdir(sourceDir);
-	        for (const fileName of files) {
-	            const srcFile = `${sourceDir}/${fileName}`;
-	            const destFile = `${destDir}/${fileName}`;
-	            const srcFileStat = yield ioUtil.lstat(srcFile);
-	            if (srcFileStat.isDirectory()) {
-	                // Recurse
-	                yield cpDirRecursive(srcFile, destFile, currentDepth, force);
-	            }
-	            else {
-	                yield copyFile(srcFile, destFile, force);
-	            }
-	        }
-	        // Change the mode for the newly created directory
-	        yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);
-	    });
-	}
-	// Buffered file copy
-	function copyFile(srcFile, destFile, force) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {
-	            // unlink/re-link it
-	            try {
-	                yield ioUtil.lstat(destFile);
-	                yield ioUtil.unlink(destFile);
-	            }
-	            catch (e) {
-	                // Try to override file permission
-	                if (e.code === 'EPERM') {
-	                    yield ioUtil.chmod(destFile, '0666');
-	                    yield ioUtil.unlink(destFile);
-	                }
-	                // other errors = it doesn't exist, no work to do
-	            }
-	            // Copy over symlink
-	            const symlinkFull = yield ioUtil.readlink(srcFile);
-	            yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);
-	        }
-	        else if (!(yield ioUtil.exists(destFile)) || force) {
-	            yield ioUtil.copyFile(srcFile, destFile);
-	        }
-	    });
-	}
-	
-	return io$1;
-}
-
-var hasRequiredToolrunner$1;
-
-function requireToolrunner$1 () {
-	if (hasRequiredToolrunner$1) return toolrunner$1;
-	hasRequiredToolrunner$1 = 1;
-	var __createBinding = (toolrunner$1 && toolrunner$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (toolrunner$1 && toolrunner$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (toolrunner$1 && toolrunner$1.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (toolrunner$1 && toolrunner$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(toolrunner$1, "__esModule", { value: true });
-	toolrunner$1.argStringToArray = toolrunner$1.ToolRunner = void 0;
-	const os = __importStar(require$$0$3);
-	const events = __importStar(require$$0$7);
-	const child = __importStar(require$$2$2);
-	const path = __importStar(require$$1$6);
-	const io = __importStar(requireIo$1());
-	const ioUtil = __importStar(requireIoUtil$1());
-	const timers_1 = require$$6;
-	/* eslint-disable @typescript-eslint/unbound-method */
-	const IS_WINDOWS = process.platform === 'win32';
-	/*
-	 * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way.
-	 */
-	class ToolRunner extends events.EventEmitter {
-	    constructor(toolPath, args, options) {
-	        super();
-	        if (!toolPath) {
-	            throw new Error("Parameter 'toolPath' cannot be null or empty.");
-	        }
-	        this.toolPath = toolPath;
-	        this.args = args || [];
-	        this.options = options || {};
-	    }
-	    _debug(message) {
-	        if (this.options.listeners && this.options.listeners.debug) {
-	            this.options.listeners.debug(message);
-	        }
-	    }
-	    _getCommandString(options, noPrefix) {
-	        const toolPath = this._getSpawnFileName();
-	        const args = this._getSpawnArgs(options);
-	        let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool
-	        if (IS_WINDOWS) {
-	            // Windows + cmd file
-	            if (this._isCmdFile()) {
-	                cmd += toolPath;
-	                for (const a of args) {
-	                    cmd += ` ${a}`;
-	                }
-	            }
-	            // Windows + verbatim
-	            else if (options.windowsVerbatimArguments) {
-	                cmd += `"${toolPath}"`;
-	                for (const a of args) {
-	                    cmd += ` ${a}`;
-	                }
-	            }
-	            // Windows (regular)
-	            else {
-	                cmd += this._windowsQuoteCmdArg(toolPath);
-	                for (const a of args) {
-	                    cmd += ` ${this._windowsQuoteCmdArg(a)}`;
-	                }
-	            }
-	        }
-	        else {
-	            // OSX/Linux - this can likely be improved with some form of quoting.
-	            // creating processes on Unix is fundamentally different than Windows.
-	            // on Unix, execvp() takes an arg array.
-	            cmd += toolPath;
-	            for (const a of args) {
-	                cmd += ` ${a}`;
-	            }
-	        }
-	        return cmd;
-	    }
-	    _processLineBuffer(data, strBuffer, onLine) {
-	        try {
-	            let s = strBuffer + data.toString();
-	            let n = s.indexOf(os.EOL);
-	            while (n > -1) {
-	                const line = s.substring(0, n);
-	                onLine(line);
-	                // the rest of the string ...
-	                s = s.substring(n + os.EOL.length);
-	                n = s.indexOf(os.EOL);
-	            }
-	            return s;
-	        }
-	        catch (err) {
-	            // streaming lines to console is best effort.  Don't fail a build.
-	            this._debug(`error processing line. Failed with error ${err}`);
-	            return '';
-	        }
-	    }
-	    _getSpawnFileName() {
-	        if (IS_WINDOWS) {
-	            if (this._isCmdFile()) {
-	                return process.env['COMSPEC'] || 'cmd.exe';
-	            }
-	        }
-	        return this.toolPath;
-	    }
-	    _getSpawnArgs(options) {
-	        if (IS_WINDOWS) {
-	            if (this._isCmdFile()) {
-	                let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;
-	                for (const a of this.args) {
-	                    argline += ' ';
-	                    argline += options.windowsVerbatimArguments
-	                        ? a
-	                        : this._windowsQuoteCmdArg(a);
-	                }
-	                argline += '"';
-	                return [argline];
-	            }
-	        }
-	        return this.args;
-	    }
-	    _endsWith(str, end) {
-	        return str.endsWith(end);
-	    }
-	    _isCmdFile() {
-	        const upperToolPath = this.toolPath.toUpperCase();
-	        return (this._endsWith(upperToolPath, '.CMD') ||
-	            this._endsWith(upperToolPath, '.BAT'));
-	    }
-	    _windowsQuoteCmdArg(arg) {
-	        // for .exe, apply the normal quoting rules that libuv applies
-	        if (!this._isCmdFile()) {
-	            return this._uvQuoteCmdArg(arg);
-	        }
-	        // otherwise apply quoting rules specific to the cmd.exe command line parser.
-	        // the libuv rules are generic and are not designed specifically for cmd.exe
-	        // command line parser.
-	        //
-	        // for a detailed description of the cmd.exe command line parser, refer to
-	        // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912
-	        // need quotes for empty arg
-	        if (!arg) {
-	            return '""';
-	        }
-	        // determine whether the arg needs to be quoted
-	        const cmdSpecialChars = [
-	            ' ',
-	            '\t',
-	            '&',
-	            '(',
-	            ')',
-	            '[',
-	            ']',
-	            '{',
-	            '}',
-	            '^',
-	            '=',
-	            ';',
-	            '!',
-	            "'",
-	            '+',
-	            ',',
-	            '`',
-	            '~',
-	            '|',
-	            '<',
-	            '>',
-	            '"'
-	        ];
-	        let needsQuotes = false;
-	        for (const char of arg) {
-	            if (cmdSpecialChars.some(x => x === char)) {
-	                needsQuotes = true;
-	                break;
-	            }
-	        }
-	        // short-circuit if quotes not needed
-	        if (!needsQuotes) {
-	            return arg;
-	        }
-	        // the following quoting rules are very similar to the rules that by libuv applies.
-	        //
-	        // 1) wrap the string in quotes
-	        //
-	        // 2) double-up quotes - i.e. " => ""
-	        //
-	        //    this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately
-	        //    doesn't work well with a cmd.exe command line.
-	        //
-	        //    note, replacing " with "" also works well if the arg is passed to a downstream .NET console app.
-	        //    for example, the command line:
-	        //          foo.exe "myarg:""my val"""
-	        //    is parsed by a .NET console app into an arg array:
-	        //          [ "myarg:\"my val\"" ]
-	        //    which is the same end result when applying libuv quoting rules. although the actual
-	        //    command line from libuv quoting rules would look like:
-	        //          foo.exe "myarg:\"my val\""
-	        //
-	        // 3) double-up slashes that precede a quote,
-	        //    e.g.  hello \world    => "hello \world"
-	        //          hello\"world    => "hello\\""world"
-	        //          hello\\"world   => "hello\\\\""world"
-	        //          hello world\    => "hello world\\"
-	        //
-	        //    technically this is not required for a cmd.exe command line, or the batch argument parser.
-	        //    the reasons for including this as a .cmd quoting rule are:
-	        //
-	        //    a) this is optimized for the scenario where the argument is passed from the .cmd file to an
-	        //       external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.
-	        //
-	        //    b) it's what we've been doing previously (by deferring to node default behavior) and we
-	        //       haven't heard any complaints about that aspect.
-	        //
-	        // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be
-	        // escaped when used on the command line directly - even though within a .cmd file % can be escaped
-	        // by using %%.
-	        //
-	        // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts
-	        // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.
-	        //
-	        // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would
-	        // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the
-	        // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args
-	        // to an external program.
-	        //
-	        // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.
-	        // % can be escaped within a .cmd file.
-	        let reverse = '"';
-	        let quoteHit = true;
-	        for (let i = arg.length; i > 0; i--) {
-	            // walk the string in reverse
-	            reverse += arg[i - 1];
-	            if (quoteHit && arg[i - 1] === '\\') {
-	                reverse += '\\'; // double the slash
-	            }
-	            else if (arg[i - 1] === '"') {
-	                quoteHit = true;
-	                reverse += '"'; // double the quote
-	            }
-	            else {
-	                quoteHit = false;
-	            }
-	        }
-	        reverse += '"';
-	        return reverse
-	            .split('')
-	            .reverse()
-	            .join('');
-	    }
-	    _uvQuoteCmdArg(arg) {
-	        // Tool runner wraps child_process.spawn() and needs to apply the same quoting as
-	        // Node in certain cases where the undocumented spawn option windowsVerbatimArguments
-	        // is used.
-	        //
-	        // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,
-	        // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),
-	        // pasting copyright notice from Node within this function:
-	        //
-	        //      Copyright Joyent, Inc. and other Node contributors. All rights reserved.
-	        //
-	        //      Permission is hereby granted, free of charge, to any person obtaining a copy
-	        //      of this software and associated documentation files (the "Software"), to
-	        //      deal in the Software without restriction, including without limitation the
-	        //      rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-	        //      sell copies of the Software, and to permit persons to whom the Software is
-	        //      furnished to do so, subject to the following conditions:
-	        //
-	        //      The above copyright notice and this permission notice shall be included in
-	        //      all copies or substantial portions of the Software.
-	        //
-	        //      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-	        //      IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-	        //      FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-	        //      AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-	        //      LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-	        //      FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-	        //      IN THE SOFTWARE.
-	        if (!arg) {
-	            // Need double quotation for empty argument
-	            return '""';
-	        }
-	        if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) {
-	            // No quotation needed
-	            return arg;
-	        }
-	        if (!arg.includes('"') && !arg.includes('\\')) {
-	            // No embedded double quotes or backslashes, so I can just wrap
-	            // quote marks around the whole thing.
-	            return `"${arg}"`;
-	        }
-	        // Expected input/output:
-	        //   input : hello"world
-	        //   output: "hello\"world"
-	        //   input : hello""world
-	        //   output: "hello\"\"world"
-	        //   input : hello\world
-	        //   output: hello\world
-	        //   input : hello\\world
-	        //   output: hello\\world
-	        //   input : hello\"world
-	        //   output: "hello\\\"world"
-	        //   input : hello\\"world
-	        //   output: "hello\\\\\"world"
-	        //   input : hello world\
-	        //   output: "hello world\\" - note the comment in libuv actually reads "hello world\"
-	        //                             but it appears the comment is wrong, it should be "hello world\\"
-	        let reverse = '"';
-	        let quoteHit = true;
-	        for (let i = arg.length; i > 0; i--) {
-	            // walk the string in reverse
-	            reverse += arg[i - 1];
-	            if (quoteHit && arg[i - 1] === '\\') {
-	                reverse += '\\';
-	            }
-	            else if (arg[i - 1] === '"') {
-	                quoteHit = true;
-	                reverse += '\\';
-	            }
-	            else {
-	                quoteHit = false;
-	            }
-	        }
-	        reverse += '"';
-	        return reverse
-	            .split('')
-	            .reverse()
-	            .join('');
-	    }
-	    _cloneExecOptions(options) {
-	        options = options || {};
-	        const result = {
-	            cwd: options.cwd || process.cwd(),
-	            env: options.env || process.env,
-	            silent: options.silent || false,
-	            windowsVerbatimArguments: options.windowsVerbatimArguments || false,
-	            failOnStdErr: options.failOnStdErr || false,
-	            ignoreReturnCode: options.ignoreReturnCode || false,
-	            delay: options.delay || 10000
-	        };
-	        result.outStream = options.outStream || process.stdout;
-	        result.errStream = options.errStream || process.stderr;
-	        return result;
-	    }
-	    _getSpawnOptions(options, toolPath) {
-	        options = options || {};
-	        const result = {};
-	        result.cwd = options.cwd;
-	        result.env = options.env;
-	        result['windowsVerbatimArguments'] =
-	            options.windowsVerbatimArguments || this._isCmdFile();
-	        if (options.windowsVerbatimArguments) {
-	            result.argv0 = `"${toolPath}"`;
-	        }
-	        return result;
-	    }
-	    /**
-	     * Exec a tool.
-	     * Output will be streamed to the live console.
-	     * Returns promise with return code
-	     *
-	     * @param     tool     path to tool to exec
-	     * @param     options  optional exec options.  See ExecOptions
-	     * @returns   number
-	     */
-	    exec() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            // root the tool path if it is unrooted and contains relative pathing
-	            if (!ioUtil.isRooted(this.toolPath) &&
-	                (this.toolPath.includes('/') ||
-	                    (IS_WINDOWS && this.toolPath.includes('\\')))) {
-	                // prefer options.cwd if it is specified, however options.cwd may also need to be rooted
-	                this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath);
-	            }
-	            // if the tool is only a file name, then resolve it from the PATH
-	            // otherwise verify it exists (add extension on Windows if necessary)
-	            this.toolPath = yield io.which(this.toolPath, true);
-	            return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
-	                this._debug(`exec tool: ${this.toolPath}`);
-	                this._debug('arguments:');
-	                for (const arg of this.args) {
-	                    this._debug(`   ${arg}`);
-	                }
-	                const optionsNonNull = this._cloneExecOptions(this.options);
-	                if (!optionsNonNull.silent && optionsNonNull.outStream) {
-	                    optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL);
-	                }
-	                const state = new ExecState(optionsNonNull, this.toolPath);
-	                state.on('debug', (message) => {
-	                    this._debug(message);
-	                });
-	                if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) {
-	                    return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`));
-	                }
-	                const fileName = this._getSpawnFileName();
-	                const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));
-	                let stdbuffer = '';
-	                if (cp.stdout) {
-	                    cp.stdout.on('data', (data) => {
-	                        if (this.options.listeners && this.options.listeners.stdout) {
-	                            this.options.listeners.stdout(data);
-	                        }
-	                        if (!optionsNonNull.silent && optionsNonNull.outStream) {
-	                            optionsNonNull.outStream.write(data);
-	                        }
-	                        stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => {
-	                            if (this.options.listeners && this.options.listeners.stdline) {
-	                                this.options.listeners.stdline(line);
-	                            }
-	                        });
-	                    });
-	                }
-	                let errbuffer = '';
-	                if (cp.stderr) {
-	                    cp.stderr.on('data', (data) => {
-	                        state.processStderr = true;
-	                        if (this.options.listeners && this.options.listeners.stderr) {
-	                            this.options.listeners.stderr(data);
-	                        }
-	                        if (!optionsNonNull.silent &&
-	                            optionsNonNull.errStream &&
-	                            optionsNonNull.outStream) {
-	                            const s = optionsNonNull.failOnStdErr
-	                                ? optionsNonNull.errStream
-	                                : optionsNonNull.outStream;
-	                            s.write(data);
-	                        }
-	                        errbuffer = this._processLineBuffer(data, errbuffer, (line) => {
-	                            if (this.options.listeners && this.options.listeners.errline) {
-	                                this.options.listeners.errline(line);
-	                            }
-	                        });
-	                    });
-	                }
-	                cp.on('error', (err) => {
-	                    state.processError = err.message;
-	                    state.processExited = true;
-	                    state.processClosed = true;
-	                    state.CheckComplete();
-	                });
-	                cp.on('exit', (code) => {
-	                    state.processExitCode = code;
-	                    state.processExited = true;
-	                    this._debug(`Exit code ${code} received from tool '${this.toolPath}'`);
-	                    state.CheckComplete();
-	                });
-	                cp.on('close', (code) => {
-	                    state.processExitCode = code;
-	                    state.processExited = true;
-	                    state.processClosed = true;
-	                    this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);
-	                    state.CheckComplete();
-	                });
-	                state.on('done', (error, exitCode) => {
-	                    if (stdbuffer.length > 0) {
-	                        this.emit('stdline', stdbuffer);
-	                    }
-	                    if (errbuffer.length > 0) {
-	                        this.emit('errline', errbuffer);
-	                    }
-	                    cp.removeAllListeners();
-	                    if (error) {
-	                        reject(error);
-	                    }
-	                    else {
-	                        resolve(exitCode);
-	                    }
-	                });
-	                if (this.options.input) {
-	                    if (!cp.stdin) {
-	                        throw new Error('child process missing stdin');
-	                    }
-	                    cp.stdin.end(this.options.input);
-	                }
-	            }));
-	        });
-	    }
-	}
-	toolrunner$1.ToolRunner = ToolRunner;
-	/**
-	 * Convert an arg string to an array of args. Handles escaping
-	 *
-	 * @param    argString   string of arguments
-	 * @returns  string[]    array of arguments
-	 */
-	function argStringToArray(argString) {
-	    const args = [];
-	    let inQuotes = false;
-	    let escaped = false;
-	    let arg = '';
-	    function append(c) {
-	        // we only escape double quotes.
-	        if (escaped && c !== '"') {
-	            arg += '\\';
-	        }
-	        arg += c;
-	        escaped = false;
-	    }
-	    for (let i = 0; i < argString.length; i++) {
-	        const c = argString.charAt(i);
-	        if (c === '"') {
-	            if (!escaped) {
-	                inQuotes = !inQuotes;
-	            }
-	            else {
-	                append(c);
-	            }
-	            continue;
-	        }
-	        if (c === '\\' && escaped) {
-	            append(c);
-	            continue;
-	        }
-	        if (c === '\\' && inQuotes) {
-	            escaped = true;
-	            continue;
-	        }
-	        if (c === ' ' && !inQuotes) {
-	            if (arg.length > 0) {
-	                args.push(arg);
-	                arg = '';
-	            }
-	            continue;
-	        }
-	        append(c);
-	    }
-	    if (arg.length > 0) {
-	        args.push(arg.trim());
-	    }
-	    return args;
-	}
-	toolrunner$1.argStringToArray = argStringToArray;
-	class ExecState extends events.EventEmitter {
-	    constructor(options, toolPath) {
-	        super();
-	        this.processClosed = false; // tracks whether the process has exited and stdio is closed
-	        this.processError = '';
-	        this.processExitCode = 0;
-	        this.processExited = false; // tracks whether the process has exited
-	        this.processStderr = false; // tracks whether stderr was written to
-	        this.delay = 10000; // 10 seconds
-	        this.done = false;
-	        this.timeout = null;
-	        if (!toolPath) {
-	            throw new Error('toolPath must not be empty');
-	        }
-	        this.options = options;
-	        this.toolPath = toolPath;
-	        if (options.delay) {
-	            this.delay = options.delay;
-	        }
-	    }
-	    CheckComplete() {
-	        if (this.done) {
-	            return;
-	        }
-	        if (this.processClosed) {
-	            this._setResult();
-	        }
-	        else if (this.processExited) {
-	            this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this);
-	        }
-	    }
-	    _debug(message) {
-	        this.emit('debug', message);
-	    }
-	    _setResult() {
-	        // determine whether there is an error
-	        let error;
-	        if (this.processExited) {
-	            if (this.processError) {
-	                error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`);
-	            }
-	            else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) {
-	                error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`);
-	            }
-	            else if (this.processStderr && this.options.failOnStdErr) {
-	                error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`);
-	            }
-	        }
-	        // clear the timeout
-	        if (this.timeout) {
-	            clearTimeout(this.timeout);
-	            this.timeout = null;
-	        }
-	        this.done = true;
-	        this.emit('done', error, this.processExitCode);
-	    }
-	    static HandleTimeout(state) {
-	        if (state.done) {
-	            return;
-	        }
-	        if (!state.processClosed && state.processExited) {
-	            const message = `The STDIO streams did not close within ${state.delay /
-	                1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;
-	            state._debug(message);
-	        }
-	        state._setResult();
-	    }
-	}
-	
-	return toolrunner$1;
-}
-
-var hasRequiredExec$1;
-
-function requireExec$1 () {
-	if (hasRequiredExec$1) return exec$1;
-	hasRequiredExec$1 = 1;
-	var __createBinding = (exec$1 && exec$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (exec$1 && exec$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (exec$1 && exec$1.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (exec$1 && exec$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(exec$1, "__esModule", { value: true });
-	exec$1.getExecOutput = exec$1.exec = void 0;
-	const string_decoder_1 = require$$0$e;
-	const tr = __importStar(requireToolrunner$1());
-	/**
-	 * Exec a command.
-	 * Output will be streamed to the live console.
-	 * Returns promise with return code
-	 *
-	 * @param     commandLine        command to execute (can include additional args). Must be correctly escaped.
-	 * @param     args               optional arguments for tool. Escaping is handled by the lib.
-	 * @param     options            optional exec options.  See ExecOptions
-	 * @returns   Promise    exit code
-	 */
-	function exec(commandLine, args, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const commandArgs = tr.argStringToArray(commandLine);
-	        if (commandArgs.length === 0) {
-	            throw new Error(`Parameter 'commandLine' cannot be null or empty.`);
-	        }
-	        // Path to tool to execute should be first arg
-	        const toolPath = commandArgs[0];
-	        args = commandArgs.slice(1).concat(args || []);
-	        const runner = new tr.ToolRunner(toolPath, args, options);
-	        return runner.exec();
-	    });
-	}
-	exec$1.exec = exec;
-	/**
-	 * Exec a command and get the output.
-	 * Output will be streamed to the live console.
-	 * Returns promise with the exit code and collected stdout and stderr
-	 *
-	 * @param     commandLine           command to execute (can include additional args). Must be correctly escaped.
-	 * @param     args                  optional arguments for tool. Escaping is handled by the lib.
-	 * @param     options               optional exec options.  See ExecOptions
-	 * @returns   Promise   exit code, stdout, and stderr
-	 */
-	function getExecOutput(commandLine, args, options) {
-	    var _a, _b;
-	    return __awaiter(this, void 0, void 0, function* () {
-	        let stdout = '';
-	        let stderr = '';
-	        //Using string decoder covers the case where a mult-byte character is split
-	        const stdoutDecoder = new string_decoder_1.StringDecoder('utf8');
-	        const stderrDecoder = new string_decoder_1.StringDecoder('utf8');
-	        const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout;
-	        const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr;
-	        const stdErrListener = (data) => {
-	            stderr += stderrDecoder.write(data);
-	            if (originalStdErrListener) {
-	                originalStdErrListener(data);
-	            }
-	        };
-	        const stdOutListener = (data) => {
-	            stdout += stdoutDecoder.write(data);
-	            if (originalStdoutListener) {
-	                originalStdoutListener(data);
-	            }
-	        };
-	        const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener });
-	        const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners }));
-	        //flush any remaining characters
-	        stdout += stdoutDecoder.end();
-	        stderr += stderrDecoder.end();
-	        return {
-	            exitCode,
-	            stdout,
-	            stderr
-	        };
-	    });
-	}
-	exec$1.getExecOutput = getExecOutput;
-	
-	return exec$1;
-}
-
-var hasRequiredPlatform$1;
-
-function requirePlatform$1 () {
-	if (hasRequiredPlatform$1) return platform$1;
-	hasRequiredPlatform$1 = 1;
-	(function (exports$1) {
-		var __createBinding = (platform$1 && platform$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    var desc = Object.getOwnPropertyDescriptor(m, k);
-		    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-		      desc = { enumerable: true, get: function() { return m[k]; } };
-		    }
-		    Object.defineProperty(o, k2, desc);
-		}) : (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    o[k2] = m[k];
-		}));
-		var __setModuleDefault = (platform$1 && platform$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-		    Object.defineProperty(o, "default", { enumerable: true, value: v });
-		}) : function(o, v) {
-		    o["default"] = v;
-		});
-		var __importStar = (platform$1 && platform$1.__importStar) || function (mod) {
-		    if (mod && mod.__esModule) return mod;
-		    var result = {};
-		    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-		    __setModuleDefault(result, mod);
-		    return result;
-		};
-		var __awaiter = (platform$1 && platform$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-		    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-		    return new (P || (P = Promise))(function (resolve, reject) {
-		        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-		        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-		        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-		        step((generator = generator.apply(thisArg, _arguments || [])).next());
-		    });
-		};
-		var __importDefault = (platform$1 && platform$1.__importDefault) || function (mod) {
-		    return (mod && mod.__esModule) ? mod : { "default": mod };
-		};
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.getDetails = exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0;
-		const os_1 = __importDefault(require$$0$3);
-		const exec = __importStar(requireExec$1());
-		const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () {
-		    const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, {
-		        silent: true
-		    });
-		    const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, {
-		        silent: true
-		    });
-		    return {
-		        name: name.trim(),
-		        version: version.trim()
-		    };
-		});
-		const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () {
-		    var _a, _b, _c, _d;
-		    const { stdout } = yield exec.getExecOutput('sw_vers', undefined, {
-		        silent: true
-		    });
-		    const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
-		    const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : '';
-		    return {
-		        name,
-		        version
-		    };
-		});
-		const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () {
-		    const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], {
-		        silent: true
-		    });
-		    const [name, version] = stdout.trim().split('\n');
-		    return {
-		        name,
-		        version
-		    };
-		});
-		exports$1.platform = os_1.default.platform();
-		exports$1.arch = os_1.default.arch();
-		exports$1.isWindows = exports$1.platform === 'win32';
-		exports$1.isMacOS = exports$1.platform === 'darwin';
-		exports$1.isLinux = exports$1.platform === 'linux';
-		function getDetails() {
-		    return __awaiter(this, void 0, void 0, function* () {
-		        return Object.assign(Object.assign({}, (yield (exports$1.isWindows
-		            ? getWindowsInfo()
-		            : exports$1.isMacOS
-		                ? getMacOsInfo()
-		                : getLinuxInfo()))), { platform: exports$1.platform,
-		            arch: exports$1.arch,
-		            isWindows: exports$1.isWindows,
-		            isMacOS: exports$1.isMacOS,
-		            isLinux: exports$1.isLinux });
-		    });
-		}
-		exports$1.getDetails = getDetails;
-		
-	} (platform$1));
-	return platform$1;
-}
-
-var hasRequiredCore$1;
-
-function requireCore$1 () {
-	if (hasRequiredCore$1) return core$1;
-	hasRequiredCore$1 = 1;
-	(function (exports$1) {
-		var __createBinding = (core$1 && core$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    var desc = Object.getOwnPropertyDescriptor(m, k);
-		    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-		      desc = { enumerable: true, get: function() { return m[k]; } };
-		    }
-		    Object.defineProperty(o, k2, desc);
-		}) : (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    o[k2] = m[k];
-		}));
-		var __setModuleDefault = (core$1 && core$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-		    Object.defineProperty(o, "default", { enumerable: true, value: v });
-		}) : function(o, v) {
-		    o["default"] = v;
-		});
-		var __importStar = (core$1 && core$1.__importStar) || function (mod) {
-		    if (mod && mod.__esModule) return mod;
-		    var result = {};
-		    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-		    __setModuleDefault(result, mod);
-		    return result;
-		};
-		var __awaiter = (core$1 && core$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-		    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-		    return new (P || (P = Promise))(function (resolve, reject) {
-		        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-		        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-		        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-		        step((generator = generator.apply(thisArg, _arguments || [])).next());
-		    });
-		};
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.platform = exports$1.toPlatformPath = exports$1.toWin32Path = exports$1.toPosixPath = exports$1.markdownSummary = exports$1.summary = exports$1.getIDToken = exports$1.getState = exports$1.saveState = exports$1.group = exports$1.endGroup = exports$1.startGroup = exports$1.info = exports$1.notice = exports$1.warning = exports$1.error = exports$1.debug = exports$1.isDebug = exports$1.setFailed = exports$1.setCommandEcho = exports$1.setOutput = exports$1.getBooleanInput = exports$1.getMultilineInput = exports$1.getInput = exports$1.addPath = exports$1.setSecret = exports$1.exportVariable = exports$1.ExitCode = void 0;
-		const command_1 = requireCommand$1();
-		const file_command_1 = requireFileCommand$1();
-		const utils_1 = requireUtils$5();
-		const os = __importStar(require$$0$3);
-		const path = __importStar(require$$1$6);
-		const oidc_utils_1 = requireOidcUtils$1();
-		/**
-		 * The code to exit an action
-		 */
-		var ExitCode;
-		(function (ExitCode) {
-		    /**
-		     * A code indicating that the action was successful
-		     */
-		    ExitCode[ExitCode["Success"] = 0] = "Success";
-		    /**
-		     * A code indicating that the action was a failure
-		     */
-		    ExitCode[ExitCode["Failure"] = 1] = "Failure";
-		})(ExitCode || (exports$1.ExitCode = ExitCode = {}));
-		//-----------------------------------------------------------------------
-		// Variables
-		//-----------------------------------------------------------------------
-		/**
-		 * Sets env variable for this action and future actions in the job
-		 * @param name the name of the variable to set
-		 * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify
-		 */
-		// eslint-disable-next-line @typescript-eslint/no-explicit-any
-		function exportVariable(name, val) {
-		    const convertedVal = (0, utils_1.toCommandValue)(val);
-		    process.env[name] = convertedVal;
-		    const filePath = process.env['GITHUB_ENV'] || '';
-		    if (filePath) {
-		        return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val));
-		    }
-		    (0, command_1.issueCommand)('set-env', { name }, convertedVal);
-		}
-		exports$1.exportVariable = exportVariable;
-		/**
-		 * Registers a secret which will get masked from logs
-		 * @param secret value of the secret
-		 */
-		function setSecret(secret) {
-		    (0, command_1.issueCommand)('add-mask', {}, secret);
-		}
-		exports$1.setSecret = setSecret;
-		/**
-		 * Prepends inputPath to the PATH (for this action and future actions)
-		 * @param inputPath
-		 */
-		function addPath(inputPath) {
-		    const filePath = process.env['GITHUB_PATH'] || '';
-		    if (filePath) {
-		        (0, file_command_1.issueFileCommand)('PATH', inputPath);
-		    }
-		    else {
-		        (0, command_1.issueCommand)('add-path', {}, inputPath);
-		    }
-		    process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
-		}
-		exports$1.addPath = addPath;
-		/**
-		 * Gets the value of an input.
-		 * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.
-		 * Returns an empty string if the value is not defined.
-		 *
-		 * @param     name     name of the input to get
-		 * @param     options  optional. See InputOptions.
-		 * @returns   string
-		 */
-		function getInput(name, options) {
-		    const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
-		    if (options && options.required && !val) {
-		        throw new Error(`Input required and not supplied: ${name}`);
-		    }
-		    if (options && options.trimWhitespace === false) {
-		        return val;
-		    }
-		    return val.trim();
-		}
-		exports$1.getInput = getInput;
-		/**
-		 * Gets the values of an multiline input.  Each value is also trimmed.
-		 *
-		 * @param     name     name of the input to get
-		 * @param     options  optional. See InputOptions.
-		 * @returns   string[]
-		 *
-		 */
-		function getMultilineInput(name, options) {
-		    const inputs = getInput(name, options)
-		        .split('\n')
-		        .filter(x => x !== '');
-		    if (options && options.trimWhitespace === false) {
-		        return inputs;
-		    }
-		    return inputs.map(input => input.trim());
-		}
-		exports$1.getMultilineInput = getMultilineInput;
-		/**
-		 * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification.
-		 * Support boolean input list: `true | True | TRUE | false | False | FALSE` .
-		 * The return value is also in boolean type.
-		 * ref: https://yaml.org/spec/1.2/spec.html#id2804923
-		 *
-		 * @param     name     name of the input to get
-		 * @param     options  optional. See InputOptions.
-		 * @returns   boolean
-		 */
-		function getBooleanInput(name, options) {
-		    const trueValue = ['true', 'True', 'TRUE'];
-		    const falseValue = ['false', 'False', 'FALSE'];
-		    const val = getInput(name, options);
-		    if (trueValue.includes(val))
-		        return true;
-		    if (falseValue.includes(val))
-		        return false;
-		    throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` +
-		        `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
-		}
-		exports$1.getBooleanInput = getBooleanInput;
-		/**
-		 * Sets the value of an output.
-		 *
-		 * @param     name     name of the output to set
-		 * @param     value    value to store. Non-string values will be converted to a string via JSON.stringify
-		 */
-		// eslint-disable-next-line @typescript-eslint/no-explicit-any
-		function setOutput(name, value) {
-		    const filePath = process.env['GITHUB_OUTPUT'] || '';
-		    if (filePath) {
-		        return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value));
-		    }
-		    process.stdout.write(os.EOL);
-		    (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value));
-		}
-		exports$1.setOutput = setOutput;
-		/**
-		 * Enables or disables the echoing of commands into stdout for the rest of the step.
-		 * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.
-		 *
-		 */
-		function setCommandEcho(enabled) {
-		    (0, command_1.issue)('echo', enabled ? 'on' : 'off');
-		}
-		exports$1.setCommandEcho = setCommandEcho;
-		//-----------------------------------------------------------------------
-		// Results
-		//-----------------------------------------------------------------------
-		/**
-		 * Sets the action status to failed.
-		 * When the action exits it will be with an exit code of 1
-		 * @param message add error issue message
-		 */
-		function setFailed(message) {
-		    process.exitCode = ExitCode.Failure;
-		    error(message);
-		}
-		exports$1.setFailed = setFailed;
-		//-----------------------------------------------------------------------
-		// Logging Commands
-		//-----------------------------------------------------------------------
-		/**
-		 * Gets whether Actions Step Debug is on or not
-		 */
-		function isDebug() {
-		    return process.env['RUNNER_DEBUG'] === '1';
-		}
-		exports$1.isDebug = isDebug;
-		/**
-		 * Writes debug message to user log
-		 * @param message debug message
-		 */
-		function debug(message) {
-		    (0, command_1.issueCommand)('debug', {}, message);
-		}
-		exports$1.debug = debug;
-		/**
-		 * Adds an error issue
-		 * @param message error issue message. Errors will be converted to string via toString()
-		 * @param properties optional properties to add to the annotation.
-		 */
-		function error(message, properties = {}) {
-		    (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
-		}
-		exports$1.error = error;
-		/**
-		 * Adds a warning issue
-		 * @param message warning issue message. Errors will be converted to string via toString()
-		 * @param properties optional properties to add to the annotation.
-		 */
-		function warning(message, properties = {}) {
-		    (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
-		}
-		exports$1.warning = warning;
-		/**
-		 * Adds a notice issue
-		 * @param message notice issue message. Errors will be converted to string via toString()
-		 * @param properties optional properties to add to the annotation.
-		 */
-		function notice(message, properties = {}) {
-		    (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
-		}
-		exports$1.notice = notice;
-		/**
-		 * Writes info to log with console.log.
-		 * @param message info message
-		 */
-		function info(message) {
-		    process.stdout.write(message + os.EOL);
-		}
-		exports$1.info = info;
-		/**
-		 * Begin an output group.
-		 *
-		 * Output until the next `groupEnd` will be foldable in this group
-		 *
-		 * @param name The name of the output group
-		 */
-		function startGroup(name) {
-		    (0, command_1.issue)('group', name);
-		}
-		exports$1.startGroup = startGroup;
-		/**
-		 * End an output group.
-		 */
-		function endGroup() {
-		    (0, command_1.issue)('endgroup');
-		}
-		exports$1.endGroup = endGroup;
-		/**
-		 * Wrap an asynchronous function call in a group.
-		 *
-		 * Returns the same type as the function itself.
-		 *
-		 * @param name The name of the group
-		 * @param fn The function to wrap in the group
-		 */
-		function group(name, fn) {
-		    return __awaiter(this, void 0, void 0, function* () {
-		        startGroup(name);
-		        let result;
-		        try {
-		            result = yield fn();
-		        }
-		        finally {
-		            endGroup();
-		        }
-		        return result;
-		    });
-		}
-		exports$1.group = group;
-		//-----------------------------------------------------------------------
-		// Wrapper action state
-		//-----------------------------------------------------------------------
-		/**
-		 * Saves state for current action, the state can only be retrieved by this action's post job execution.
-		 *
-		 * @param     name     name of the state to store
-		 * @param     value    value to store. Non-string values will be converted to a string via JSON.stringify
-		 */
-		// eslint-disable-next-line @typescript-eslint/no-explicit-any
-		function saveState(name, value) {
-		    const filePath = process.env['GITHUB_STATE'] || '';
-		    if (filePath) {
-		        return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value));
-		    }
-		    (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value));
-		}
-		exports$1.saveState = saveState;
-		/**
-		 * Gets the value of an state set by this action's main execution.
-		 *
-		 * @param     name     name of the state to get
-		 * @returns   string
-		 */
-		function getState(name) {
-		    return process.env[`STATE_${name}`] || '';
-		}
-		exports$1.getState = getState;
-		function getIDToken(aud) {
-		    return __awaiter(this, void 0, void 0, function* () {
-		        return yield oidc_utils_1.OidcClient.getIDToken(aud);
-		    });
-		}
-		exports$1.getIDToken = getIDToken;
-		/**
-		 * Summary exports
-		 */
-		var summary_1 = requireSummary$1();
-		Object.defineProperty(exports$1, "summary", { enumerable: true, get: function () { return summary_1.summary; } });
-		/**
-		 * @deprecated use core.summary
-		 */
-		var summary_2 = requireSummary$1();
-		Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } });
-		/**
-		 * Path exports
-		 */
-		var path_utils_1 = requirePathUtils$1();
-		Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } });
-		Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } });
-		Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } });
-		/**
-		 * Platform utilities exports
-		 */
-		exports$1.platform = __importStar(requirePlatform$1());
-		
-	} (core$1));
-	return core$1;
-}
-
-var internalGlobOptionsHelper = {};
-
-var hasRequiredInternalGlobOptionsHelper;
-
-function requireInternalGlobOptionsHelper () {
-	if (hasRequiredInternalGlobOptionsHelper) return internalGlobOptionsHelper;
-	hasRequiredInternalGlobOptionsHelper = 1;
-	var __createBinding = (internalGlobOptionsHelper && internalGlobOptionsHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalGlobOptionsHelper && internalGlobOptionsHelper.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalGlobOptionsHelper && internalGlobOptionsHelper.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	Object.defineProperty(internalGlobOptionsHelper, "__esModule", { value: true });
-	internalGlobOptionsHelper.getOptions = void 0;
-	const core = __importStar(requireCore$1());
-	/**
-	 * Returns a copy with defaults filled in.
-	 */
-	function getOptions(copy) {
-	    const result = {
-	        followSymbolicLinks: true,
-	        implicitDescendants: true,
-	        matchDirectories: true,
-	        omitBrokenSymbolicLinks: true,
-	        excludeHiddenFiles: false
-	    };
-	    if (copy) {
-	        if (typeof copy.followSymbolicLinks === 'boolean') {
-	            result.followSymbolicLinks = copy.followSymbolicLinks;
-	            core.debug(`followSymbolicLinks '${result.followSymbolicLinks}'`);
-	        }
-	        if (typeof copy.implicitDescendants === 'boolean') {
-	            result.implicitDescendants = copy.implicitDescendants;
-	            core.debug(`implicitDescendants '${result.implicitDescendants}'`);
-	        }
-	        if (typeof copy.matchDirectories === 'boolean') {
-	            result.matchDirectories = copy.matchDirectories;
-	            core.debug(`matchDirectories '${result.matchDirectories}'`);
-	        }
-	        if (typeof copy.omitBrokenSymbolicLinks === 'boolean') {
-	            result.omitBrokenSymbolicLinks = copy.omitBrokenSymbolicLinks;
-	            core.debug(`omitBrokenSymbolicLinks '${result.omitBrokenSymbolicLinks}'`);
-	        }
-	        if (typeof copy.excludeHiddenFiles === 'boolean') {
-	            result.excludeHiddenFiles = copy.excludeHiddenFiles;
-	            core.debug(`excludeHiddenFiles '${result.excludeHiddenFiles}'`);
-	        }
-	    }
-	    return result;
-	}
-	internalGlobOptionsHelper.getOptions = getOptions;
-	
-	return internalGlobOptionsHelper;
-}
-
-var internalPatternHelper = {};
-
-var internalPathHelper = {};
-
-var hasRequiredInternalPathHelper;
-
-function requireInternalPathHelper () {
-	if (hasRequiredInternalPathHelper) return internalPathHelper;
-	hasRequiredInternalPathHelper = 1;
-	var __createBinding = (internalPathHelper && internalPathHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalPathHelper && internalPathHelper.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalPathHelper && internalPathHelper.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __importDefault = (internalPathHelper && internalPathHelper.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(internalPathHelper, "__esModule", { value: true });
-	internalPathHelper.safeTrimTrailingSeparator = internalPathHelper.normalizeSeparators = internalPathHelper.hasRoot = internalPathHelper.hasAbsoluteRoot = internalPathHelper.ensureAbsoluteRoot = internalPathHelper.dirname = void 0;
-	const path = __importStar(require$$1$6);
-	const assert_1 = __importDefault(require$$0$8);
-	const IS_WINDOWS = process.platform === 'win32';
-	/**
-	 * Similar to path.dirname except normalizes the path separators and slightly better handling for Windows UNC paths.
-	 *
-	 * For example, on Linux/macOS:
-	 * - `/               => /`
-	 * - `/hello          => /`
-	 *
-	 * For example, on Windows:
-	 * - `C:\             => C:\`
-	 * - `C:\hello        => C:\`
-	 * - `C:              => C:`
-	 * - `C:hello         => C:`
-	 * - `\               => \`
-	 * - `\hello          => \`
-	 * - `\\hello         => \\hello`
-	 * - `\\hello\world   => \\hello\world`
-	 */
-	function dirname(p) {
-	    // Normalize slashes and trim unnecessary trailing slash
-	    p = safeTrimTrailingSeparator(p);
-	    // Windows UNC root, e.g. \\hello or \\hello\world
-	    if (IS_WINDOWS && /^\\\\[^\\]+(\\[^\\]+)?$/.test(p)) {
-	        return p;
-	    }
-	    // Get dirname
-	    let result = path.dirname(p);
-	    // Trim trailing slash for Windows UNC root, e.g. \\hello\world\
-	    if (IS_WINDOWS && /^\\\\[^\\]+\\[^\\]+\\$/.test(result)) {
-	        result = safeTrimTrailingSeparator(result);
-	    }
-	    return result;
-	}
-	internalPathHelper.dirname = dirname;
-	/**
-	 * Roots the path if not already rooted. On Windows, relative roots like `\`
-	 * or `C:` are expanded based on the current working directory.
-	 */
-	function ensureAbsoluteRoot(root, itemPath) {
-	    (0, assert_1.default)(root, `ensureAbsoluteRoot parameter 'root' must not be empty`);
-	    (0, assert_1.default)(itemPath, `ensureAbsoluteRoot parameter 'itemPath' must not be empty`);
-	    // Already rooted
-	    if (hasAbsoluteRoot(itemPath)) {
-	        return itemPath;
-	    }
-	    // Windows
-	    if (IS_WINDOWS) {
-	        // Check for itemPath like C: or C:foo
-	        if (itemPath.match(/^[A-Z]:[^\\/]|^[A-Z]:$/i)) {
-	            let cwd = process.cwd();
-	            (0, assert_1.default)(cwd.match(/^[A-Z]:\\/i), `Expected current directory to start with an absolute drive root. Actual '${cwd}'`);
-	            // Drive letter matches cwd? Expand to cwd
-	            if (itemPath[0].toUpperCase() === cwd[0].toUpperCase()) {
-	                // Drive only, e.g. C:
-	                if (itemPath.length === 2) {
-	                    // Preserve specified drive letter case (upper or lower)
-	                    return `${itemPath[0]}:\\${cwd.substr(3)}`;
-	                }
-	                // Drive + path, e.g. C:foo
-	                else {
-	                    if (!cwd.endsWith('\\')) {
-	                        cwd += '\\';
-	                    }
-	                    // Preserve specified drive letter case (upper or lower)
-	                    return `${itemPath[0]}:\\${cwd.substr(3)}${itemPath.substr(2)}`;
-	                }
-	            }
-	            // Different drive
-	            else {
-	                return `${itemPath[0]}:\\${itemPath.substr(2)}`;
-	            }
-	        }
-	        // Check for itemPath like \ or \foo
-	        else if (normalizeSeparators(itemPath).match(/^\\$|^\\[^\\]/)) {
-	            const cwd = process.cwd();
-	            (0, assert_1.default)(cwd.match(/^[A-Z]:\\/i), `Expected current directory to start with an absolute drive root. Actual '${cwd}'`);
-	            return `${cwd[0]}:\\${itemPath.substr(1)}`;
-	        }
-	    }
-	    (0, assert_1.default)(hasAbsoluteRoot(root), `ensureAbsoluteRoot parameter 'root' must have an absolute root`);
-	    // Otherwise ensure root ends with a separator
-	    if (root.endsWith('/') || (IS_WINDOWS && root.endsWith('\\'))) ;
-	    else {
-	        // Append separator
-	        root += path.sep;
-	    }
-	    return root + itemPath;
-	}
-	internalPathHelper.ensureAbsoluteRoot = ensureAbsoluteRoot;
-	/**
-	 * On Linux/macOS, true if path starts with `/`. On Windows, true for paths like:
-	 * `\\hello\share` and `C:\hello` (and using alternate separator).
-	 */
-	function hasAbsoluteRoot(itemPath) {
-	    (0, assert_1.default)(itemPath, `hasAbsoluteRoot parameter 'itemPath' must not be empty`);
-	    // Normalize separators
-	    itemPath = normalizeSeparators(itemPath);
-	    // Windows
-	    if (IS_WINDOWS) {
-	        // E.g. \\hello\share or C:\hello
-	        return itemPath.startsWith('\\\\') || /^[A-Z]:\\/i.test(itemPath);
-	    }
-	    // E.g. /hello
-	    return itemPath.startsWith('/');
-	}
-	internalPathHelper.hasAbsoluteRoot = hasAbsoluteRoot;
-	/**
-	 * On Linux/macOS, true if path starts with `/`. On Windows, true for paths like:
-	 * `\`, `\hello`, `\\hello\share`, `C:`, and `C:\hello` (and using alternate separator).
-	 */
-	function hasRoot(itemPath) {
-	    (0, assert_1.default)(itemPath, `isRooted parameter 'itemPath' must not be empty`);
-	    // Normalize separators
-	    itemPath = normalizeSeparators(itemPath);
-	    // Windows
-	    if (IS_WINDOWS) {
-	        // E.g. \ or \hello or \\hello
-	        // E.g. C: or C:\hello
-	        return itemPath.startsWith('\\') || /^[A-Z]:/i.test(itemPath);
-	    }
-	    // E.g. /hello
-	    return itemPath.startsWith('/');
-	}
-	internalPathHelper.hasRoot = hasRoot;
-	/**
-	 * Removes redundant slashes and converts `/` to `\` on Windows
-	 */
-	function normalizeSeparators(p) {
-	    p = p || '';
-	    // Windows
-	    if (IS_WINDOWS) {
-	        // Convert slashes on Windows
-	        p = p.replace(/\//g, '\\');
-	        // Remove redundant slashes
-	        const isUnc = /^\\\\+[^\\]/.test(p); // e.g. \\hello
-	        return (isUnc ? '\\' : '') + p.replace(/\\\\+/g, '\\'); // preserve leading \\ for UNC
-	    }
-	    // Remove redundant slashes
-	    return p.replace(/\/\/+/g, '/');
-	}
-	internalPathHelper.normalizeSeparators = normalizeSeparators;
-	/**
-	 * Normalizes the path separators and trims the trailing separator (when safe).
-	 * For example, `/foo/ => /foo` but `/ => /`
-	 */
-	function safeTrimTrailingSeparator(p) {
-	    // Short-circuit if empty
-	    if (!p) {
-	        return '';
-	    }
-	    // Normalize separators
-	    p = normalizeSeparators(p);
-	    // No trailing slash
-	    if (!p.endsWith(path.sep)) {
-	        return p;
-	    }
-	    // Check '/' on Linux/macOS and '\' on Windows
-	    if (p === path.sep) {
-	        return p;
-	    }
-	    // On Windows check if drive root. E.g. C:\
-	    if (IS_WINDOWS && /^[A-Z]:\\$/i.test(p)) {
-	        return p;
-	    }
-	    // Otherwise trim trailing slash
-	    return p.substr(0, p.length - 1);
-	}
-	internalPathHelper.safeTrimTrailingSeparator = safeTrimTrailingSeparator;
-	
-	return internalPathHelper;
-}
-
-var internalMatchKind = {};
-
-var hasRequiredInternalMatchKind;
-
-function requireInternalMatchKind () {
-	if (hasRequiredInternalMatchKind) return internalMatchKind;
-	hasRequiredInternalMatchKind = 1;
-	Object.defineProperty(internalMatchKind, "__esModule", { value: true });
-	internalMatchKind.MatchKind = void 0;
-	/**
-	 * Indicates whether a pattern matches a path
-	 */
-	var MatchKind;
-	(function (MatchKind) {
-	    /** Not matched */
-	    MatchKind[MatchKind["None"] = 0] = "None";
-	    /** Matched if the path is a directory */
-	    MatchKind[MatchKind["Directory"] = 1] = "Directory";
-	    /** Matched if the path is a regular file */
-	    MatchKind[MatchKind["File"] = 2] = "File";
-	    /** Matched */
-	    MatchKind[MatchKind["All"] = 3] = "All";
-	})(MatchKind || (internalMatchKind.MatchKind = MatchKind = {}));
-	
-	return internalMatchKind;
-}
-
-var hasRequiredInternalPatternHelper;
-
-function requireInternalPatternHelper () {
-	if (hasRequiredInternalPatternHelper) return internalPatternHelper;
-	hasRequiredInternalPatternHelper = 1;
-	var __createBinding = (internalPatternHelper && internalPatternHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalPatternHelper && internalPatternHelper.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalPatternHelper && internalPatternHelper.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	Object.defineProperty(internalPatternHelper, "__esModule", { value: true });
-	internalPatternHelper.partialMatch = internalPatternHelper.match = internalPatternHelper.getSearchPaths = void 0;
-	const pathHelper = __importStar(requireInternalPathHelper());
-	const internal_match_kind_1 = requireInternalMatchKind();
-	const IS_WINDOWS = process.platform === 'win32';
-	/**
-	 * Given an array of patterns, returns an array of paths to search.
-	 * Duplicates and paths under other included paths are filtered out.
-	 */
-	function getSearchPaths(patterns) {
-	    // Ignore negate patterns
-	    patterns = patterns.filter(x => !x.negate);
-	    // Create a map of all search paths
-	    const searchPathMap = {};
-	    for (const pattern of patterns) {
-	        const key = IS_WINDOWS
-	            ? pattern.searchPath.toUpperCase()
-	            : pattern.searchPath;
-	        searchPathMap[key] = 'candidate';
-	    }
-	    const result = [];
-	    for (const pattern of patterns) {
-	        // Check if already included
-	        const key = IS_WINDOWS
-	            ? pattern.searchPath.toUpperCase()
-	            : pattern.searchPath;
-	        if (searchPathMap[key] === 'included') {
-	            continue;
-	        }
-	        // Check for an ancestor search path
-	        let foundAncestor = false;
-	        let tempKey = key;
-	        let parent = pathHelper.dirname(tempKey);
-	        while (parent !== tempKey) {
-	            if (searchPathMap[parent]) {
-	                foundAncestor = true;
-	                break;
-	            }
-	            tempKey = parent;
-	            parent = pathHelper.dirname(tempKey);
-	        }
-	        // Include the search pattern in the result
-	        if (!foundAncestor) {
-	            result.push(pattern.searchPath);
-	            searchPathMap[key] = 'included';
-	        }
-	    }
-	    return result;
-	}
-	internalPatternHelper.getSearchPaths = getSearchPaths;
-	/**
-	 * Matches the patterns against the path
-	 */
-	function match(patterns, itemPath) {
-	    let result = internal_match_kind_1.MatchKind.None;
-	    for (const pattern of patterns) {
-	        if (pattern.negate) {
-	            result &= ~pattern.match(itemPath);
-	        }
-	        else {
-	            result |= pattern.match(itemPath);
-	        }
-	    }
-	    return result;
-	}
-	internalPatternHelper.match = match;
-	/**
-	 * Checks whether to descend further into the directory
-	 */
-	function partialMatch(patterns, itemPath) {
-	    return patterns.some(x => !x.negate && x.partialMatch(itemPath));
-	}
-	internalPatternHelper.partialMatch = partialMatch;
-	
-	return internalPatternHelper;
-}
-
-var internalPattern = {};
-
-var commonjs$h = {};
-
-var commonjs$g = {};
-
-var commonjs$f = {};
-
-var hasRequiredCommonjs$h;
-
-function requireCommonjs$h () {
-	if (hasRequiredCommonjs$h) return commonjs$f;
-	hasRequiredCommonjs$h = 1;
-	(function (exports$1) {
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.range = exports$1.balanced = void 0;
-		const balanced = (a, b, str) => {
-		    const ma = a instanceof RegExp ? maybeMatch(a, str) : a;
-		    const mb = b instanceof RegExp ? maybeMatch(b, str) : b;
-		    const r = ma !== null && mb != null && (0, exports$1.range)(ma, mb, str);
-		    return (r && {
-		        start: r[0],
-		        end: r[1],
-		        pre: str.slice(0, r[0]),
-		        body: str.slice(r[0] + ma.length, r[1]),
-		        post: str.slice(r[1] + mb.length),
-		    });
-		};
-		exports$1.balanced = balanced;
-		const maybeMatch = (reg, str) => {
-		    const m = str.match(reg);
-		    return m ? m[0] : null;
-		};
-		const range = (a, b, str) => {
-		    let begs, beg, left, right = undefined, result;
-		    let ai = str.indexOf(a);
-		    let bi = str.indexOf(b, ai + 1);
-		    let i = ai;
-		    if (ai >= 0 && bi > 0) {
-		        if (a === b) {
-		            return [ai, bi];
-		        }
-		        begs = [];
-		        left = str.length;
-		        while (i >= 0 && !result) {
-		            if (i === ai) {
-		                begs.push(i);
-		                ai = str.indexOf(a, i + 1);
-		            }
-		            else if (begs.length === 1) {
-		                const r = begs.pop();
-		                if (r !== undefined)
-		                    result = [r, bi];
-		            }
-		            else {
-		                beg = begs.pop();
-		                if (beg !== undefined && beg < left) {
-		                    left = beg;
-		                    right = bi;
-		                }
-		                bi = str.indexOf(b, i + 1);
-		            }
-		            i = ai < bi && ai >= 0 ? ai : bi;
-		        }
-		        if (begs.length && right !== undefined) {
-		            result = [left, right];
-		        }
-		    }
-		    return result;
-		};
-		exports$1.range = range;
-		
-	} (commonjs$f));
-	return commonjs$f;
-}
-
-var hasRequiredCommonjs$g;
-
-function requireCommonjs$g () {
-	if (hasRequiredCommonjs$g) return commonjs$g;
-	hasRequiredCommonjs$g = 1;
-	Object.defineProperty(commonjs$g, "__esModule", { value: true });
-	commonjs$g.expand = expand;
-	const balanced_match_1 = requireCommonjs$h();
-	const escSlash = '\0SLASH' + Math.random() + '\0';
-	const escOpen = '\0OPEN' + Math.random() + '\0';
-	const escClose = '\0CLOSE' + Math.random() + '\0';
-	const escComma = '\0COMMA' + Math.random() + '\0';
-	const escPeriod = '\0PERIOD' + Math.random() + '\0';
-	const escSlashPattern = new RegExp(escSlash, 'g');
-	const escOpenPattern = new RegExp(escOpen, 'g');
-	const escClosePattern = new RegExp(escClose, 'g');
-	const escCommaPattern = new RegExp(escComma, 'g');
-	const escPeriodPattern = new RegExp(escPeriod, 'g');
-	const slashPattern = /\\\\/g;
-	const openPattern = /\\{/g;
-	const closePattern = /\\}/g;
-	const commaPattern = /\\,/g;
-	const periodPattern = /\\./g;
-	function numeric(str) {
-	    return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);
-	}
-	function escapeBraces(str) {
-	    return str
-	        .replace(slashPattern, escSlash)
-	        .replace(openPattern, escOpen)
-	        .replace(closePattern, escClose)
-	        .replace(commaPattern, escComma)
-	        .replace(periodPattern, escPeriod);
-	}
-	function unescapeBraces(str) {
-	    return str
-	        .replace(escSlashPattern, '\\')
-	        .replace(escOpenPattern, '{')
-	        .replace(escClosePattern, '}')
-	        .replace(escCommaPattern, ',')
-	        .replace(escPeriodPattern, '.');
-	}
-	/**
-	 * Basically just str.split(","), but handling cases
-	 * where we have nested braced sections, which should be
-	 * treated as individual members, like {a,{b,c},d}
-	 */
-	function parseCommaParts(str) {
-	    if (!str) {
-	        return [''];
-	    }
-	    const parts = [];
-	    const m = (0, balanced_match_1.balanced)('{', '}', str);
-	    if (!m) {
-	        return str.split(',');
-	    }
-	    const { pre, body, post } = m;
-	    const p = pre.split(',');
-	    p[p.length - 1] += '{' + body + '}';
-	    const postParts = parseCommaParts(post);
-	    if (post.length) {
-	        p[p.length - 1] += postParts.shift();
-	        p.push.apply(p, postParts);
-	    }
-	    parts.push.apply(parts, p);
-	    return parts;
-	}
-	function expand(str) {
-	    if (!str) {
-	        return [];
-	    }
-	    // I don't know why Bash 4.3 does this, but it does.
-	    // Anything starting with {} will have the first two bytes preserved
-	    // but *only* at the top level, so {},a}b will not expand to anything,
-	    // but a{},b}c will be expanded to [a}c,abc].
-	    // One could argue that this is a bug in Bash, but since the goal of
-	    // this module is to match Bash's rules, we escape a leading {}
-	    if (str.slice(0, 2) === '{}') {
-	        str = '\\{\\}' + str.slice(2);
-	    }
-	    return expand_(escapeBraces(str), true).map(unescapeBraces);
-	}
-	function embrace(str) {
-	    return '{' + str + '}';
-	}
-	function isPadded(el) {
-	    return /^-?0\d/.test(el);
-	}
-	function lte(i, y) {
-	    return i <= y;
-	}
-	function gte(i, y) {
-	    return i >= y;
-	}
-	function expand_(str, isTop) {
-	    /** @type {string[]} */
-	    const expansions = [];
-	    const m = (0, balanced_match_1.balanced)('{', '}', str);
-	    if (!m)
-	        return [str];
-	    // no need to expand pre, since it is guaranteed to be free of brace-sets
-	    const pre = m.pre;
-	    const post = m.post.length ? expand_(m.post, false) : [''];
-	    if (/\$$/.test(m.pre)) {
-	        for (let k = 0; k < post.length; k++) {
-	            const expansion = pre + '{' + m.body + '}' + post[k];
-	            expansions.push(expansion);
-	        }
-	    }
-	    else {
-	        const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-	        const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-	        const isSequence = isNumericSequence || isAlphaSequence;
-	        const isOptions = m.body.indexOf(',') >= 0;
-	        if (!isSequence && !isOptions) {
-	            // {a},b}
-	            if (m.post.match(/,(?!,).*\}/)) {
-	                str = m.pre + '{' + m.body + escClose + m.post;
-	                return expand_(str);
-	            }
-	            return [str];
-	        }
-	        let n;
-	        if (isSequence) {
-	            n = m.body.split(/\.\./);
-	        }
-	        else {
-	            n = parseCommaParts(m.body);
-	            if (n.length === 1 && n[0] !== undefined) {
-	                // x{{a,b}}y ==> x{a}y x{b}y
-	                n = expand_(n[0], false).map(embrace);
-	                //XXX is this necessary? Can't seem to hit it in tests.
-	                /* c8 ignore start */
-	                if (n.length === 1) {
-	                    return post.map(p => m.pre + n[0] + p);
-	                }
-	                /* c8 ignore stop */
-	            }
-	        }
-	        // at this point, n is the parts, and we know it's not a comma set
-	        // with a single entry.
-	        let N;
-	        if (isSequence && n[0] !== undefined && n[1] !== undefined) {
-	            const x = numeric(n[0]);
-	            const y = numeric(n[1]);
-	            const width = Math.max(n[0].length, n[1].length);
-	            let incr = n.length === 3 && n[2] !== undefined ? Math.abs(numeric(n[2])) : 1;
-	            let test = lte;
-	            const reverse = y < x;
-	            if (reverse) {
-	                incr *= -1;
-	                test = gte;
-	            }
-	            const pad = n.some(isPadded);
-	            N = [];
-	            for (let i = x; test(i, y); i += incr) {
-	                let c;
-	                if (isAlphaSequence) {
-	                    c = String.fromCharCode(i);
-	                    if (c === '\\') {
-	                        c = '';
-	                    }
-	                }
-	                else {
-	                    c = String(i);
-	                    if (pad) {
-	                        const need = width - c.length;
-	                        if (need > 0) {
-	                            const z = new Array(need + 1).join('0');
-	                            if (i < 0) {
-	                                c = '-' + z + c.slice(1);
-	                            }
-	                            else {
-	                                c = z + c;
-	                            }
-	                        }
-	                    }
-	                }
-	                N.push(c);
-	            }
-	        }
-	        else {
-	            N = [];
-	            for (let j = 0; j < n.length; j++) {
-	                N.push.apply(N, expand_(n[j], false));
-	            }
-	        }
-	        for (let j = 0; j < N.length; j++) {
-	            for (let k = 0; k < post.length; k++) {
-	                const expansion = pre + N[j] + post[k];
-	                if (!isTop || isSequence || expansion) {
-	                    expansions.push(expansion);
-	                }
-	            }
-	        }
-	    }
-	    return expansions;
-	}
-	
-	return commonjs$g;
-}
-
-var assertValidPattern = {};
-
-var hasRequiredAssertValidPattern;
-
-function requireAssertValidPattern () {
-	if (hasRequiredAssertValidPattern) return assertValidPattern;
-	hasRequiredAssertValidPattern = 1;
-	Object.defineProperty(assertValidPattern, "__esModule", { value: true });
-	assertValidPattern.assertValidPattern = void 0;
-	const MAX_PATTERN_LENGTH = 1024 * 64;
-	const assertValidPattern$1 = (pattern) => {
-	    if (typeof pattern !== 'string') {
-	        throw new TypeError('invalid pattern');
-	    }
-	    if (pattern.length > MAX_PATTERN_LENGTH) {
-	        throw new TypeError('pattern is too long');
-	    }
-	};
-	assertValidPattern.assertValidPattern = assertValidPattern$1;
-	
-	return assertValidPattern;
-}
-
-var ast = {};
-
-var braceExpressions = {};
-
-var hasRequiredBraceExpressions;
-
-function requireBraceExpressions () {
-	if (hasRequiredBraceExpressions) return braceExpressions;
-	hasRequiredBraceExpressions = 1;
-	// translate the various posix character classes into unicode properties
-	// this works across all unicode locales
-	Object.defineProperty(braceExpressions, "__esModule", { value: true });
-	braceExpressions.parseClass = void 0;
-	// { : [, /u flag required, negated]
-	const posixClasses = {
-	    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
-	    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
-	    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
-	    '[:blank:]': ['\\p{Zs}\\t', true],
-	    '[:cntrl:]': ['\\p{Cc}', true],
-	    '[:digit:]': ['\\p{Nd}', true],
-	    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
-	    '[:lower:]': ['\\p{Ll}', true],
-	    '[:print:]': ['\\p{C}', true],
-	    '[:punct:]': ['\\p{P}', true],
-	    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
-	    '[:upper:]': ['\\p{Lu}', true],
-	    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
-	    '[:xdigit:]': ['A-Fa-f0-9', false],
-	};
-	// only need to escape a few things inside of brace expressions
-	// escapes: [ \ ] -
-	const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
-	// escape all regexp magic characters
-	const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-	// everything has already been escaped, we just have to join
-	const rangesToString = (ranges) => ranges.join('');
-	// takes a glob string at a posix brace expression, and returns
-	// an equivalent regular expression source, and boolean indicating
-	// whether the /u flag needs to be applied, and the number of chars
-	// consumed to parse the character class.
-	// This also removes out of order ranges, and returns ($.) if the
-	// entire class just no good.
-	const parseClass = (glob, position) => {
-	    const pos = position;
-	    /* c8 ignore start */
-	    if (glob.charAt(pos) !== '[') {
-	        throw new Error('not in a brace expression');
-	    }
-	    /* c8 ignore stop */
-	    const ranges = [];
-	    const negs = [];
-	    let i = pos + 1;
-	    let sawStart = false;
-	    let uflag = false;
-	    let escaping = false;
-	    let negate = false;
-	    let endPos = pos;
-	    let rangeStart = '';
-	    WHILE: while (i < glob.length) {
-	        const c = glob.charAt(i);
-	        if ((c === '!' || c === '^') && i === pos + 1) {
-	            negate = true;
-	            i++;
-	            continue;
-	        }
-	        if (c === ']' && sawStart && !escaping) {
-	            endPos = i + 1;
-	            break;
-	        }
-	        sawStart = true;
-	        if (c === '\\') {
-	            if (!escaping) {
-	                escaping = true;
-	                i++;
-	                continue;
-	            }
-	            // escaped \ char, fall through and treat like normal char
-	        }
-	        if (c === '[' && !escaping) {
-	            // either a posix class, a collation equivalent, or just a [
-	            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
-	                if (glob.startsWith(cls, i)) {
-	                    // invalid, [a-[] is fine, but not [a-[:alpha]]
-	                    if (rangeStart) {
-	                        return ['$.', false, glob.length - pos, true];
-	                    }
-	                    i += cls.length;
-	                    if (neg)
-	                        negs.push(unip);
-	                    else
-	                        ranges.push(unip);
-	                    uflag = uflag || u;
-	                    continue WHILE;
-	                }
-	            }
-	        }
-	        // now it's just a normal character, effectively
-	        escaping = false;
-	        if (rangeStart) {
-	            // throw this range away if it's not valid, but others
-	            // can still match.
-	            if (c > rangeStart) {
-	                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
-	            }
-	            else if (c === rangeStart) {
-	                ranges.push(braceEscape(c));
-	            }
-	            rangeStart = '';
-	            i++;
-	            continue;
-	        }
-	        // now might be the start of a range.
-	        // can be either c-d or c-] or c] or c] at this point
-	        if (glob.startsWith('-]', i + 1)) {
-	            ranges.push(braceEscape(c + '-'));
-	            i += 2;
-	            continue;
-	        }
-	        if (glob.startsWith('-', i + 1)) {
-	            rangeStart = c;
-	            i += 2;
-	            continue;
-	        }
-	        // not the start of a range, just a single character
-	        ranges.push(braceEscape(c));
-	        i++;
-	    }
-	    if (endPos < i) {
-	        // didn't see the end of the class, not a valid class,
-	        // but might still be valid as a literal match.
-	        return ['', false, 0, false];
-	    }
-	    // if we got no ranges and no negates, then we have a range that
-	    // cannot possibly match anything, and that poisons the whole glob
-	    if (!ranges.length && !negs.length) {
-	        return ['$.', false, glob.length - pos, true];
-	    }
-	    // if we got one positive range, and it's a single character, then that's
-	    // not actually a magic pattern, it's just that one literal character.
-	    // we should not treat that as "magic", we should just return the literal
-	    // character. [_] is a perfectly valid way to escape glob magic chars.
-	    if (negs.length === 0 &&
-	        ranges.length === 1 &&
-	        /^\\?.$/.test(ranges[0]) &&
-	        !negate) {
-	        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
-	        return [regexpEscape(r), false, endPos - pos, false];
-	    }
-	    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
-	    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
-	    const comb = ranges.length && negs.length
-	        ? '(' + sranges + '|' + snegs + ')'
-	        : ranges.length
-	            ? sranges
-	            : snegs;
-	    return [comb, uflag, endPos - pos, true];
-	};
-	braceExpressions.parseClass = parseClass;
-	
-	return braceExpressions;
-}
-
-var _unescape = {};
-
-var hasRequired_unescape;
-
-function require_unescape () {
-	if (hasRequired_unescape) return _unescape;
-	hasRequired_unescape = 1;
-	Object.defineProperty(_unescape, "__esModule", { value: true });
-	_unescape.unescape = void 0;
-	/**
-	 * Un-escape a string that has been escaped with {@link escape}.
-	 *
-	 * If the {@link windowsPathsNoEscape} option is used, then square-brace
-	 * escapes are removed, but not backslash escapes.  For example, it will turn
-	 * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
-	 * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
-	 *
-	 * When `windowsPathsNoEscape` is not set, then both brace escapes and
-	 * backslash escapes are removed.
-	 *
-	 * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
-	 * or unescaped.
-	 */
-	const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
-	    return windowsPathsNoEscape
-	        ? s.replace(/\[([^\/\\])\]/g, '$1')
-	        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
-	};
-	_unescape.unescape = unescape;
-	
-	return _unescape;
-}
-
-var hasRequiredAst;
-
-function requireAst () {
-	if (hasRequiredAst) return ast;
-	hasRequiredAst = 1;
-	// parse a single path portion
-	Object.defineProperty(ast, "__esModule", { value: true });
-	ast.AST = void 0;
-	const brace_expressions_js_1 = requireBraceExpressions();
-	const unescape_js_1 = require_unescape();
-	const types = new Set(['!', '?', '+', '*', '@']);
-	const isExtglobType = (c) => types.has(c);
-	// Patterns that get prepended to bind to the start of either the
-	// entire string, or just a single path portion, to prevent dots
-	// and/or traversal patterns, when needed.
-	// Exts don't need the ^ or / bit, because the root binds that already.
-	const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
-	const startNoDot = '(?!\\.)';
-	// characters that indicate a start of pattern needs the "no dots" bit,
-	// because a dot *might* be matched. ( is not in the list, because in
-	// the case of a child extglob, it will handle the prevention itself.
-	const addPatternStart = new Set(['[', '.']);
-	// cases where traversal is A-OK, no dot prevention needed
-	const justDots = new Set(['..', '.']);
-	const reSpecials = new Set('().*{}+?[]^$\\!');
-	const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-	// any single thing other than /
-	const qmark = '[^/]';
-	// * => any number of characters
-	const star = qmark + '*?';
-	// use + when we need to ensure that *something* matches, because the * is
-	// the only thing in the path portion.
-	const starNoEmpty = qmark + '+?';
-	// remove the \ chars that we added if we end up doing a nonmagic compare
-	// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
-	class AST {
-	    type;
-	    #root;
-	    #hasMagic;
-	    #uflag = false;
-	    #parts = [];
-	    #parent;
-	    #parentIndex;
-	    #negs;
-	    #filledNegs = false;
-	    #options;
-	    #toString;
-	    // set to true if it's an extglob with no children
-	    // (which really means one child of '')
-	    #emptyExt = false;
-	    constructor(type, parent, options = {}) {
-	        this.type = type;
-	        // extglobs are inherently magical
-	        if (type)
-	            this.#hasMagic = true;
-	        this.#parent = parent;
-	        this.#root = this.#parent ? this.#parent.#root : this;
-	        this.#options = this.#root === this ? options : this.#root.#options;
-	        this.#negs = this.#root === this ? [] : this.#root.#negs;
-	        if (type === '!' && !this.#root.#filledNegs)
-	            this.#negs.push(this);
-	        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
-	    }
-	    get hasMagic() {
-	        /* c8 ignore start */
-	        if (this.#hasMagic !== undefined)
-	            return this.#hasMagic;
-	        /* c8 ignore stop */
-	        for (const p of this.#parts) {
-	            if (typeof p === 'string')
-	                continue;
-	            if (p.type || p.hasMagic)
-	                return (this.#hasMagic = true);
-	        }
-	        // note: will be undefined until we generate the regexp src and find out
-	        return this.#hasMagic;
-	    }
-	    // reconstructs the pattern
-	    toString() {
-	        if (this.#toString !== undefined)
-	            return this.#toString;
-	        if (!this.type) {
-	            return (this.#toString = this.#parts.map(p => String(p)).join(''));
-	        }
-	        else {
-	            return (this.#toString =
-	                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
-	        }
-	    }
-	    #fillNegs() {
-	        /* c8 ignore start */
-	        if (this !== this.#root)
-	            throw new Error('should only call on root');
-	        if (this.#filledNegs)
-	            return this;
-	        /* c8 ignore stop */
-	        // call toString() once to fill this out
-	        this.toString();
-	        this.#filledNegs = true;
-	        let n;
-	        while ((n = this.#negs.pop())) {
-	            if (n.type !== '!')
-	                continue;
-	            // walk up the tree, appending everthing that comes AFTER parentIndex
-	            let p = n;
-	            let pp = p.#parent;
-	            while (pp) {
-	                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
-	                    for (const part of n.#parts) {
-	                        /* c8 ignore start */
-	                        if (typeof part === 'string') {
-	                            throw new Error('string part in extglob AST??');
-	                        }
-	                        /* c8 ignore stop */
-	                        part.copyIn(pp.#parts[i]);
-	                    }
-	                }
-	                p = pp;
-	                pp = p.#parent;
-	            }
-	        }
-	        return this;
-	    }
-	    push(...parts) {
-	        for (const p of parts) {
-	            if (p === '')
-	                continue;
-	            /* c8 ignore start */
-	            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
-	                throw new Error('invalid part: ' + p);
-	            }
-	            /* c8 ignore stop */
-	            this.#parts.push(p);
-	        }
-	    }
-	    toJSON() {
-	        const ret = this.type === null
-	            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
-	            : [this.type, ...this.#parts.map(p => p.toJSON())];
-	        if (this.isStart() && !this.type)
-	            ret.unshift([]);
-	        if (this.isEnd() &&
-	            (this === this.#root ||
-	                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
-	            ret.push({});
-	        }
-	        return ret;
-	    }
-	    isStart() {
-	        if (this.#root === this)
-	            return true;
-	        // if (this.type) return !!this.#parent?.isStart()
-	        if (!this.#parent?.isStart())
-	            return false;
-	        if (this.#parentIndex === 0)
-	            return true;
-	        // if everything AHEAD of this is a negation, then it's still the "start"
-	        const p = this.#parent;
-	        for (let i = 0; i < this.#parentIndex; i++) {
-	            const pp = p.#parts[i];
-	            if (!(pp instanceof AST && pp.type === '!')) {
-	                return false;
-	            }
-	        }
-	        return true;
-	    }
-	    isEnd() {
-	        if (this.#root === this)
-	            return true;
-	        if (this.#parent?.type === '!')
-	            return true;
-	        if (!this.#parent?.isEnd())
-	            return false;
-	        if (!this.type)
-	            return this.#parent?.isEnd();
-	        // if not root, it'll always have a parent
-	        /* c8 ignore start */
-	        const pl = this.#parent ? this.#parent.#parts.length : 0;
-	        /* c8 ignore stop */
-	        return this.#parentIndex === pl - 1;
-	    }
-	    copyIn(part) {
-	        if (typeof part === 'string')
-	            this.push(part);
-	        else
-	            this.push(part.clone(this));
-	    }
-	    clone(parent) {
-	        const c = new AST(this.type, parent);
-	        for (const p of this.#parts) {
-	            c.copyIn(p);
-	        }
-	        return c;
-	    }
-	    static #parseAST(str, ast, pos, opt) {
-	        let escaping = false;
-	        let inBrace = false;
-	        let braceStart = -1;
-	        let braceNeg = false;
-	        if (ast.type === null) {
-	            // outside of a extglob, append until we find a start
-	            let i = pos;
-	            let acc = '';
-	            while (i < str.length) {
-	                const c = str.charAt(i++);
-	                // still accumulate escapes at this point, but we do ignore
-	                // starts that are escaped
-	                if (escaping || c === '\\') {
-	                    escaping = !escaping;
-	                    acc += c;
-	                    continue;
-	                }
-	                if (inBrace) {
-	                    if (i === braceStart + 1) {
-	                        if (c === '^' || c === '!') {
-	                            braceNeg = true;
-	                        }
-	                    }
-	                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
-	                        inBrace = false;
-	                    }
-	                    acc += c;
-	                    continue;
-	                }
-	                else if (c === '[') {
-	                    inBrace = true;
-	                    braceStart = i;
-	                    braceNeg = false;
-	                    acc += c;
-	                    continue;
-	                }
-	                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
-	                    ast.push(acc);
-	                    acc = '';
-	                    const ext = new AST(c, ast);
-	                    i = AST.#parseAST(str, ext, i, opt);
-	                    ast.push(ext);
-	                    continue;
-	                }
-	                acc += c;
-	            }
-	            ast.push(acc);
-	            return i;
-	        }
-	        // some kind of extglob, pos is at the (
-	        // find the next | or )
-	        let i = pos + 1;
-	        let part = new AST(null, ast);
-	        const parts = [];
-	        let acc = '';
-	        while (i < str.length) {
-	            const c = str.charAt(i++);
-	            // still accumulate escapes at this point, but we do ignore
-	            // starts that are escaped
-	            if (escaping || c === '\\') {
-	                escaping = !escaping;
-	                acc += c;
-	                continue;
-	            }
-	            if (inBrace) {
-	                if (i === braceStart + 1) {
-	                    if (c === '^' || c === '!') {
-	                        braceNeg = true;
-	                    }
-	                }
-	                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
-	                    inBrace = false;
-	                }
-	                acc += c;
-	                continue;
-	            }
-	            else if (c === '[') {
-	                inBrace = true;
-	                braceStart = i;
-	                braceNeg = false;
-	                acc += c;
-	                continue;
-	            }
-	            if (isExtglobType(c) && str.charAt(i) === '(') {
-	                part.push(acc);
-	                acc = '';
-	                const ext = new AST(c, part);
-	                part.push(ext);
-	                i = AST.#parseAST(str, ext, i, opt);
-	                continue;
-	            }
-	            if (c === '|') {
-	                part.push(acc);
-	                acc = '';
-	                parts.push(part);
-	                part = new AST(null, ast);
-	                continue;
-	            }
-	            if (c === ')') {
-	                if (acc === '' && ast.#parts.length === 0) {
-	                    ast.#emptyExt = true;
-	                }
-	                part.push(acc);
-	                acc = '';
-	                ast.push(...parts, part);
-	                return i;
-	            }
-	            acc += c;
-	        }
-	        // unfinished extglob
-	        // if we got here, it was a malformed extglob! not an extglob, but
-	        // maybe something else in there.
-	        ast.type = null;
-	        ast.#hasMagic = undefined;
-	        ast.#parts = [str.substring(pos - 1)];
-	        return i;
-	    }
-	    static fromGlob(pattern, options = {}) {
-	        const ast = new AST(null, undefined, options);
-	        AST.#parseAST(pattern, ast, 0, options);
-	        return ast;
-	    }
-	    // returns the regular expression if there's magic, or the unescaped
-	    // string if not.
-	    toMMPattern() {
-	        // should only be called on root
-	        /* c8 ignore start */
-	        if (this !== this.#root)
-	            return this.#root.toMMPattern();
-	        /* c8 ignore stop */
-	        const glob = this.toString();
-	        const [re, body, hasMagic, uflag] = this.toRegExpSource();
-	        // if we're in nocase mode, and not nocaseMagicOnly, then we do
-	        // still need a regular expression if we have to case-insensitively
-	        // match capital/lowercase characters.
-	        const anyMagic = hasMagic ||
-	            this.#hasMagic ||
-	            (this.#options.nocase &&
-	                !this.#options.nocaseMagicOnly &&
-	                glob.toUpperCase() !== glob.toLowerCase());
-	        if (!anyMagic) {
-	            return body;
-	        }
-	        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
-	        return Object.assign(new RegExp(`^${re}$`, flags), {
-	            _src: re,
-	            _glob: glob,
-	        });
-	    }
-	    get options() {
-	        return this.#options;
-	    }
-	    // returns the string match, the regexp source, whether there's magic
-	    // in the regexp (so a regular expression is required) and whether or
-	    // not the uflag is needed for the regular expression (for posix classes)
-	    // TODO: instead of injecting the start/end at this point, just return
-	    // the BODY of the regexp, along with the start/end portions suitable
-	    // for binding the start/end in either a joined full-path makeRe context
-	    // (where we bind to (^|/), or a standalone matchPart context (where
-	    // we bind to ^, and not /).  Otherwise slashes get duped!
-	    //
-	    // In part-matching mode, the start is:
-	    // - if not isStart: nothing
-	    // - if traversal possible, but not allowed: ^(?!\.\.?$)
-	    // - if dots allowed or not possible: ^
-	    // - if dots possible and not allowed: ^(?!\.)
-	    // end is:
-	    // - if not isEnd(): nothing
-	    // - else: $
-	    //
-	    // In full-path matching mode, we put the slash at the START of the
-	    // pattern, so start is:
-	    // - if first pattern: same as part-matching mode
-	    // - if not isStart(): nothing
-	    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
-	    // - if dots allowed or not possible: /
-	    // - if dots possible and not allowed: /(?!\.)
-	    // end is:
-	    // - if last pattern, same as part-matching mode
-	    // - else nothing
-	    //
-	    // Always put the (?:$|/) on negated tails, though, because that has to be
-	    // there to bind the end of the negated pattern portion, and it's easier to
-	    // just stick it in now rather than try to inject it later in the middle of
-	    // the pattern.
-	    //
-	    // We can just always return the same end, and leave it up to the caller
-	    // to know whether it's going to be used joined or in parts.
-	    // And, if the start is adjusted slightly, can do the same there:
-	    // - if not isStart: nothing
-	    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
-	    // - if dots allowed or not possible: (?:/|^)
-	    // - if dots possible and not allowed: (?:/|^)(?!\.)
-	    //
-	    // But it's better to have a simpler binding without a conditional, for
-	    // performance, so probably better to return both start options.
-	    //
-	    // Then the caller just ignores the end if it's not the first pattern,
-	    // and the start always gets applied.
-	    //
-	    // But that's always going to be $ if it's the ending pattern, or nothing,
-	    // so the caller can just attach $ at the end of the pattern when building.
-	    //
-	    // So the todo is:
-	    // - better detect what kind of start is needed
-	    // - return both flavors of starting pattern
-	    // - attach $ at the end of the pattern when creating the actual RegExp
-	    //
-	    // Ah, but wait, no, that all only applies to the root when the first pattern
-	    // is not an extglob. If the first pattern IS an extglob, then we need all
-	    // that dot prevention biz to live in the extglob portions, because eg
-	    // +(*|.x*) can match .xy but not .yx.
-	    //
-	    // So, return the two flavors if it's #root and the first child is not an
-	    // AST, otherwise leave it to the child AST to handle it, and there,
-	    // use the (?:^|/) style of start binding.
-	    //
-	    // Even simplified further:
-	    // - Since the start for a join is eg /(?!\.) and the start for a part
-	    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
-	    // or start or whatever) and prepend ^ or / at the Regexp construction.
-	    toRegExpSource(allowDot) {
-	        const dot = allowDot ?? !!this.#options.dot;
-	        if (this.#root === this)
-	            this.#fillNegs();
-	        if (!this.type) {
-	            const noEmpty = this.isStart() && this.isEnd();
-	            const src = this.#parts
-	                .map(p => {
-	                const [re, _, hasMagic, uflag] = typeof p === 'string'
-	                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
-	                    : p.toRegExpSource(allowDot);
-	                this.#hasMagic = this.#hasMagic || hasMagic;
-	                this.#uflag = this.#uflag || uflag;
-	                return re;
-	            })
-	                .join('');
-	            let start = '';
-	            if (this.isStart()) {
-	                if (typeof this.#parts[0] === 'string') {
-	                    // this is the string that will match the start of the pattern,
-	                    // so we need to protect against dots and such.
-	                    // '.' and '..' cannot match unless the pattern is that exactly,
-	                    // even if it starts with . or dot:true is set.
-	                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
-	                    if (!dotTravAllowed) {
-	                        const aps = addPatternStart;
-	                        // check if we have a possibility of matching . or ..,
-	                        // and prevent that.
-	                        const needNoTrav = 
-	                        // dots are allowed, and the pattern starts with [ or .
-	                        (dot && aps.has(src.charAt(0))) ||
-	                            // the pattern starts with \., and then [ or .
-	                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
-	                            // the pattern starts with \.\., and then [ or .
-	                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
-	                        // no need to prevent dots if it can't match a dot, or if a
-	                        // sub-pattern will be preventing it anyway.
-	                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
-	                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
-	                    }
-	                }
-	            }
-	            // append the "end of path portion" pattern to negation tails
-	            let end = '';
-	            if (this.isEnd() &&
-	                this.#root.#filledNegs &&
-	                this.#parent?.type === '!') {
-	                end = '(?:$|\\/)';
-	            }
-	            const final = start + src + end;
-	            return [
-	                final,
-	                (0, unescape_js_1.unescape)(src),
-	                (this.#hasMagic = !!this.#hasMagic),
-	                this.#uflag,
-	            ];
-	        }
-	        // We need to calculate the body *twice* if it's a repeat pattern
-	        // at the start, once in nodot mode, then again in dot mode, so a
-	        // pattern like *(?) can match 'x.y'
-	        const repeated = this.type === '*' || this.type === '+';
-	        // some kind of extglob
-	        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
-	        let body = this.#partsToRegExp(dot);
-	        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
-	            // invalid extglob, has to at least be *something* present, if it's
-	            // the entire path portion.
-	            const s = this.toString();
-	            this.#parts = [s];
-	            this.type = null;
-	            this.#hasMagic = undefined;
-	            return [s, (0, unescape_js_1.unescape)(this.toString()), false, false];
-	        }
-	        // XXX abstract out this map method
-	        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
-	            ? ''
-	            : this.#partsToRegExp(true);
-	        if (bodyDotAllowed === body) {
-	            bodyDotAllowed = '';
-	        }
-	        if (bodyDotAllowed) {
-	            body = `(?:${body})(?:${bodyDotAllowed})*?`;
-	        }
-	        // an empty !() is exactly equivalent to a starNoEmpty
-	        let final = '';
-	        if (this.type === '!' && this.#emptyExt) {
-	            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
-	        }
-	        else {
-	            const close = this.type === '!'
-	                ? // !() must match something,but !(x) can match ''
-	                    '))' +
-	                        (this.isStart() && !dot && !allowDot ? startNoDot : '') +
-	                        star +
-	                        ')'
-	                : this.type === '@'
-	                    ? ')'
-	                    : this.type === '?'
-	                        ? ')?'
-	                        : this.type === '+' && bodyDotAllowed
-	                            ? ')'
-	                            : this.type === '*' && bodyDotAllowed
-	                                ? `)?`
-	                                : `)${this.type}`;
-	            final = start + body + close;
-	        }
-	        return [
-	            final,
-	            (0, unescape_js_1.unescape)(body),
-	            (this.#hasMagic = !!this.#hasMagic),
-	            this.#uflag,
-	        ];
-	    }
-	    #partsToRegExp(dot) {
-	        return this.#parts
-	            .map(p => {
-	            // extglob ASTs should only contain parent ASTs
-	            /* c8 ignore start */
-	            if (typeof p === 'string') {
-	                throw new Error('string type in extglob ast??');
-	            }
-	            /* c8 ignore stop */
-	            // can ignore hasMagic, because extglobs are already always magic
-	            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
-	            this.#uflag = this.#uflag || uflag;
-	            return re;
-	        })
-	            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
-	            .join('|');
-	    }
-	    static #parseGlob(glob, hasMagic, noEmpty = false) {
-	        let escaping = false;
-	        let re = '';
-	        let uflag = false;
-	        for (let i = 0; i < glob.length; i++) {
-	            const c = glob.charAt(i);
-	            if (escaping) {
-	                escaping = false;
-	                re += (reSpecials.has(c) ? '\\' : '') + c;
-	                continue;
-	            }
-	            if (c === '\\') {
-	                if (i === glob.length - 1) {
-	                    re += '\\\\';
-	                }
-	                else {
-	                    escaping = true;
-	                }
-	                continue;
-	            }
-	            if (c === '[') {
-	                const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i);
-	                if (consumed) {
-	                    re += src;
-	                    uflag = uflag || needUflag;
-	                    i += consumed - 1;
-	                    hasMagic = hasMagic || magic;
-	                    continue;
-	                }
-	            }
-	            if (c === '*') {
-	                if (noEmpty && glob === '*')
-	                    re += starNoEmpty;
-	                else
-	                    re += star;
-	                hasMagic = true;
-	                continue;
-	            }
-	            if (c === '?') {
-	                re += qmark;
-	                hasMagic = true;
-	                continue;
-	            }
-	            re += regExpEscape(c);
-	        }
-	        return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag];
-	    }
-	}
-	ast.AST = AST;
-	
-	return ast;
-}
-
-var _escape = {};
-
-var hasRequired_escape;
-
-function require_escape () {
-	if (hasRequired_escape) return _escape;
-	hasRequired_escape = 1;
-	Object.defineProperty(_escape, "__esModule", { value: true });
-	_escape.escape = void 0;
-	/**
-	 * Escape all magic characters in a glob pattern.
-	 *
-	 * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
-	 * option is used, then characters are escaped by wrapping in `[]`, because
-	 * a magic character wrapped in a character class can only be satisfied by
-	 * that exact character.  In this mode, `\` is _not_ escaped, because it is
-	 * not interpreted as a magic character, but instead as a path separator.
-	 */
-	const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
-	    // don't need to escape +@! because we escape the parens
-	    // that make those magic, and escaping ! as [!] isn't valid,
-	    // because [!]] is a valid glob class meaning not ']'.
-	    return windowsPathsNoEscape
-	        ? s.replace(/[?*()[\]]/g, '[$&]')
-	        : s.replace(/[?*()[\]\\]/g, '\\$&');
-	};
-	_escape.escape = escape;
-	
-	return _escape;
-}
-
-var hasRequiredCommonjs$f;
-
-function requireCommonjs$f () {
-	if (hasRequiredCommonjs$f) return commonjs$h;
-	hasRequiredCommonjs$f = 1;
-	(function (exports$1) {
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.unescape = exports$1.escape = exports$1.AST = exports$1.Minimatch = exports$1.match = exports$1.makeRe = exports$1.braceExpand = exports$1.defaults = exports$1.filter = exports$1.GLOBSTAR = exports$1.sep = exports$1.minimatch = void 0;
-		const brace_expansion_1 = requireCommonjs$g();
-		const assert_valid_pattern_js_1 = requireAssertValidPattern();
-		const ast_js_1 = requireAst();
-		const escape_js_1 = require_escape();
-		const unescape_js_1 = require_unescape();
-		const minimatch = (p, pattern, options = {}) => {
-		    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-		    // shortcut: comments match nothing.
-		    if (!options.nocomment && pattern.charAt(0) === '#') {
-		        return false;
-		    }
-		    return new Minimatch(pattern, options).match(p);
-		};
-		exports$1.minimatch = minimatch;
-		// Optimized checking for the most common glob patterns.
-		const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
-		const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
-		const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
-		const starDotExtTestNocase = (ext) => {
-		    ext = ext.toLowerCase();
-		    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
-		};
-		const starDotExtTestNocaseDot = (ext) => {
-		    ext = ext.toLowerCase();
-		    return (f) => f.toLowerCase().endsWith(ext);
-		};
-		const starDotStarRE = /^\*+\.\*+$/;
-		const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
-		const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
-		const dotStarRE = /^\.\*+$/;
-		const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
-		const starRE = /^\*+$/;
-		const starTest = (f) => f.length !== 0 && !f.startsWith('.');
-		const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
-		const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
-		const qmarksTestNocase = ([$0, ext = '']) => {
-		    const noext = qmarksTestNoExt([$0]);
-		    if (!ext)
-		        return noext;
-		    ext = ext.toLowerCase();
-		    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
-		};
-		const qmarksTestNocaseDot = ([$0, ext = '']) => {
-		    const noext = qmarksTestNoExtDot([$0]);
-		    if (!ext)
-		        return noext;
-		    ext = ext.toLowerCase();
-		    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
-		};
-		const qmarksTestDot = ([$0, ext = '']) => {
-		    const noext = qmarksTestNoExtDot([$0]);
-		    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
-		};
-		const qmarksTest = ([$0, ext = '']) => {
-		    const noext = qmarksTestNoExt([$0]);
-		    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
-		};
-		const qmarksTestNoExt = ([$0]) => {
-		    const len = $0.length;
-		    return (f) => f.length === len && !f.startsWith('.');
-		};
-		const qmarksTestNoExtDot = ([$0]) => {
-		    const len = $0.length;
-		    return (f) => f.length === len && f !== '.' && f !== '..';
-		};
-		/* c8 ignore start */
-		const defaultPlatform = (typeof process === 'object' && process
-		    ? (typeof process.env === 'object' &&
-		        process.env &&
-		        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
-		        process.platform
-		    : 'posix');
-		const path = {
-		    win32: { sep: '\\' },
-		    posix: { sep: '/' },
-		};
-		/* c8 ignore stop */
-		exports$1.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
-		exports$1.minimatch.sep = exports$1.sep;
-		exports$1.GLOBSTAR = Symbol('globstar **');
-		exports$1.minimatch.GLOBSTAR = exports$1.GLOBSTAR;
-		// any single thing other than /
-		// don't need to escape / when using new RegExp()
-		const qmark = '[^/]';
-		// * => any number of characters
-		const star = qmark + '*?';
-		// ** when dots are allowed.  Anything goes, except .. and .
-		// not (^ or / followed by one or two dots followed by $ or /),
-		// followed by anything, any number of times.
-		const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
-		// not a ^ or / followed by a dot,
-		// followed by anything, any number of times.
-		const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
-		const filter = (pattern, options = {}) => (p) => (0, exports$1.minimatch)(p, pattern, options);
-		exports$1.filter = filter;
-		exports$1.minimatch.filter = exports$1.filter;
-		const ext = (a, b = {}) => Object.assign({}, a, b);
-		const defaults = (def) => {
-		    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
-		        return exports$1.minimatch;
-		    }
-		    const orig = exports$1.minimatch;
-		    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
-		    return Object.assign(m, {
-		        Minimatch: class Minimatch extends orig.Minimatch {
-		            constructor(pattern, options = {}) {
-		                super(pattern, ext(def, options));
-		            }
-		            static defaults(options) {
-		                return orig.defaults(ext(def, options)).Minimatch;
-		            }
-		        },
-		        AST: class AST extends orig.AST {
-		            /* c8 ignore start */
-		            constructor(type, parent, options = {}) {
-		                super(type, parent, ext(def, options));
-		            }
-		            /* c8 ignore stop */
-		            static fromGlob(pattern, options = {}) {
-		                return orig.AST.fromGlob(pattern, ext(def, options));
-		            }
-		        },
-		        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
-		        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
-		        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
-		        defaults: (options) => orig.defaults(ext(def, options)),
-		        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
-		        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
-		        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
-		        sep: orig.sep,
-		        GLOBSTAR: exports$1.GLOBSTAR,
-		    });
-		};
-		exports$1.defaults = defaults;
-		exports$1.minimatch.defaults = exports$1.defaults;
-		// Brace expansion:
-		// a{b,c}d -> abd acd
-		// a{b,}c -> abc ac
-		// a{0..3}d -> a0d a1d a2d a3d
-		// a{b,c{d,e}f}g -> abg acdfg acefg
-		// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-		//
-		// Invalid sets are not expanded.
-		// a{2..}b -> a{2..}b
-		// a{b}c -> a{b}c
-		const braceExpand = (pattern, options = {}) => {
-		    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-		    // Thanks to Yeting Li  for
-		    // improving this regexp to avoid a ReDOS vulnerability.
-		    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
-		        // shortcut. no need to expand.
-		        return [pattern];
-		    }
-		    return (0, brace_expansion_1.expand)(pattern);
-		};
-		exports$1.braceExpand = braceExpand;
-		exports$1.minimatch.braceExpand = exports$1.braceExpand;
-		// parse a component of the expanded set.
-		// At this point, no pattern may contain "/" in it
-		// so we're going to return a 2d array, where each entry is the full
-		// pattern, split on '/', and then turned into a regular expression.
-		// A regexp is made at the end which joins each array with an
-		// escaped /, and another full one which joins each regexp with |.
-		//
-		// Following the lead of Bash 4.1, note that "**" only has special meaning
-		// when it is the *only* thing in a path portion.  Otherwise, any series
-		// of * is equivalent to a single *.  Globstar behavior is enabled by
-		// default, and can be disabled by setting options.noglobstar.
-		const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
-		exports$1.makeRe = makeRe;
-		exports$1.minimatch.makeRe = exports$1.makeRe;
-		const match = (list, pattern, options = {}) => {
-		    const mm = new Minimatch(pattern, options);
-		    list = list.filter(f => mm.match(f));
-		    if (mm.options.nonull && !list.length) {
-		        list.push(pattern);
-		    }
-		    return list;
-		};
-		exports$1.match = match;
-		exports$1.minimatch.match = exports$1.match;
-		// replace stuff like \* with *
-		const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
-		const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-		class Minimatch {
-		    options;
-		    set;
-		    pattern;
-		    windowsPathsNoEscape;
-		    nonegate;
-		    negate;
-		    comment;
-		    empty;
-		    preserveMultipleSlashes;
-		    partial;
-		    globSet;
-		    globParts;
-		    nocase;
-		    isWindows;
-		    platform;
-		    windowsNoMagicRoot;
-		    regexp;
-		    constructor(pattern, options = {}) {
-		        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-		        options = options || {};
-		        this.options = options;
-		        this.pattern = pattern;
-		        this.platform = options.platform || defaultPlatform;
-		        this.isWindows = this.platform === 'win32';
-		        this.windowsPathsNoEscape =
-		            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
-		        if (this.windowsPathsNoEscape) {
-		            this.pattern = this.pattern.replace(/\\/g, '/');
-		        }
-		        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
-		        this.regexp = null;
-		        this.negate = false;
-		        this.nonegate = !!options.nonegate;
-		        this.comment = false;
-		        this.empty = false;
-		        this.partial = !!options.partial;
-		        this.nocase = !!this.options.nocase;
-		        this.windowsNoMagicRoot =
-		            options.windowsNoMagicRoot !== undefined
-		                ? options.windowsNoMagicRoot
-		                : !!(this.isWindows && this.nocase);
-		        this.globSet = [];
-		        this.globParts = [];
-		        this.set = [];
-		        // make the set of regexps etc.
-		        this.make();
-		    }
-		    hasMagic() {
-		        if (this.options.magicalBraces && this.set.length > 1) {
-		            return true;
-		        }
-		        for (const pattern of this.set) {
-		            for (const part of pattern) {
-		                if (typeof part !== 'string')
-		                    return true;
-		            }
-		        }
-		        return false;
-		    }
-		    debug(..._) { }
-		    make() {
-		        const pattern = this.pattern;
-		        const options = this.options;
-		        // empty patterns and comments match nothing.
-		        if (!options.nocomment && pattern.charAt(0) === '#') {
-		            this.comment = true;
-		            return;
-		        }
-		        if (!pattern) {
-		            this.empty = true;
-		            return;
-		        }
-		        // step 1: figure out negation, etc.
-		        this.parseNegate();
-		        // step 2: expand braces
-		        this.globSet = [...new Set(this.braceExpand())];
-		        if (options.debug) {
-		            this.debug = (...args) => console.error(...args);
-		        }
-		        this.debug(this.pattern, this.globSet);
-		        // step 3: now we have a set, so turn each one into a series of
-		        // path-portion matching patterns.
-		        // These will be regexps, except in the case of "**", which is
-		        // set to the GLOBSTAR object for globstar behavior,
-		        // and will not contain any / characters
-		        //
-		        // First, we preprocess to make the glob pattern sets a bit simpler
-		        // and deduped.  There are some perf-killing patterns that can cause
-		        // problems with a glob walk, but we can simplify them down a bit.
-		        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
-		        this.globParts = this.preprocess(rawGlobParts);
-		        this.debug(this.pattern, this.globParts);
-		        // glob --> regexps
-		        let set = this.globParts.map((s, _, __) => {
-		            if (this.isWindows && this.windowsNoMagicRoot) {
-		                // check if it's a drive or unc path.
-		                const isUNC = s[0] === '' &&
-		                    s[1] === '' &&
-		                    (s[2] === '?' || !globMagic.test(s[2])) &&
-		                    !globMagic.test(s[3]);
-		                const isDrive = /^[a-z]:/i.test(s[0]);
-		                if (isUNC) {
-		                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
-		                }
-		                else if (isDrive) {
-		                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
-		                }
-		            }
-		            return s.map(ss => this.parse(ss));
-		        });
-		        this.debug(this.pattern, set);
-		        // filter out everything that didn't compile properly.
-		        this.set = set.filter(s => s.indexOf(false) === -1);
-		        // do not treat the ? in UNC paths as magic
-		        if (this.isWindows) {
-		            for (let i = 0; i < this.set.length; i++) {
-		                const p = this.set[i];
-		                if (p[0] === '' &&
-		                    p[1] === '' &&
-		                    this.globParts[i][2] === '?' &&
-		                    typeof p[3] === 'string' &&
-		                    /^[a-z]:$/i.test(p[3])) {
-		                    p[2] = '?';
-		                }
-		            }
-		        }
-		        this.debug(this.pattern, this.set);
-		    }
-		    // various transforms to equivalent pattern sets that are
-		    // faster to process in a filesystem walk.  The goal is to
-		    // eliminate what we can, and push all ** patterns as far
-		    // to the right as possible, even if it increases the number
-		    // of patterns that we have to process.
-		    preprocess(globParts) {
-		        // if we're not in globstar mode, then turn all ** into *
-		        if (this.options.noglobstar) {
-		            for (let i = 0; i < globParts.length; i++) {
-		                for (let j = 0; j < globParts[i].length; j++) {
-		                    if (globParts[i][j] === '**') {
-		                        globParts[i][j] = '*';
-		                    }
-		                }
-		            }
-		        }
-		        const { optimizationLevel = 1 } = this.options;
-		        if (optimizationLevel >= 2) {
-		            // aggressive optimization for the purpose of fs walking
-		            globParts = this.firstPhasePreProcess(globParts);
-		            globParts = this.secondPhasePreProcess(globParts);
-		        }
-		        else if (optimizationLevel >= 1) {
-		            // just basic optimizations to remove some .. parts
-		            globParts = this.levelOneOptimize(globParts);
-		        }
-		        else {
-		            // just collapse multiple ** portions into one
-		            globParts = this.adjascentGlobstarOptimize(globParts);
-		        }
-		        return globParts;
-		    }
-		    // just get rid of adjascent ** portions
-		    adjascentGlobstarOptimize(globParts) {
-		        return globParts.map(parts => {
-		            let gs = -1;
-		            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
-		                let i = gs;
-		                while (parts[i + 1] === '**') {
-		                    i++;
-		                }
-		                if (i !== gs) {
-		                    parts.splice(gs, i - gs);
-		                }
-		            }
-		            return parts;
-		        });
-		    }
-		    // get rid of adjascent ** and resolve .. portions
-		    levelOneOptimize(globParts) {
-		        return globParts.map(parts => {
-		            parts = parts.reduce((set, part) => {
-		                const prev = set[set.length - 1];
-		                if (part === '**' && prev === '**') {
-		                    return set;
-		                }
-		                if (part === '..') {
-		                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
-		                        set.pop();
-		                        return set;
-		                    }
-		                }
-		                set.push(part);
-		                return set;
-		            }, []);
-		            return parts.length === 0 ? [''] : parts;
-		        });
-		    }
-		    levelTwoFileOptimize(parts) {
-		        if (!Array.isArray(parts)) {
-		            parts = this.slashSplit(parts);
-		        }
-		        let didSomething = false;
-		        do {
-		            didSomething = false;
-		            // 
// -> 
/
-		            if (!this.preserveMultipleSlashes) {
-		                for (let i = 1; i < parts.length - 1; i++) {
-		                    const p = parts[i];
-		                    // don't squeeze out UNC patterns
-		                    if (i === 1 && p === '' && parts[0] === '')
-		                        continue;
-		                    if (p === '.' || p === '') {
-		                        didSomething = true;
-		                        parts.splice(i, 1);
-		                        i--;
-		                    }
-		                }
-		                if (parts[0] === '.' &&
-		                    parts.length === 2 &&
-		                    (parts[1] === '.' || parts[1] === '')) {
-		                    didSomething = true;
-		                    parts.pop();
-		                }
-		            }
-		            // 
/

/../ ->

/
-		            let dd = 0;
-		            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
-		                const p = parts[dd - 1];
-		                if (p && p !== '.' && p !== '..' && p !== '**') {
-		                    didSomething = true;
-		                    parts.splice(dd - 1, 2);
-		                    dd -= 2;
-		                }
-		            }
-		        } while (didSomething);
-		        return parts.length === 0 ? [''] : parts;
-		    }
-		    // First phase: single-pattern processing
-		    // 
 is 1 or more portions
-		    //  is 1 or more portions
-		    // 

is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/} - //

// -> 
/
-		    // 
/

/../ ->

/
-		    // **/**/ -> **/
-		    //
-		    // **/*/ -> */**/ <== not valid because ** doesn't follow
-		    // this WOULD be allowed if ** did follow symlinks, or * didn't
-		    firstPhasePreProcess(globParts) {
-		        let didSomething = false;
-		        do {
-		            didSomething = false;
-		            // 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

/**/**/ -> 
/**/
-		                        gss++;
-		                    }
-		                    // eg, if gs is 2 and gss is 4, that means we have 3 **
-		                    // parts, and can remove 2 of them.
-		                    if (gss > gs) {
-		                        parts.splice(gs + 1, gss - gs);
-		                    }
-		                    let next = parts[gs + 1];
-		                    const p = parts[gs + 2];
-		                    const p2 = parts[gs + 3];
-		                    if (next !== '..')
-		                        continue;
-		                    if (!p ||
-		                        p === '.' ||
-		                        p === '..' ||
-		                        !p2 ||
-		                        p2 === '.' ||
-		                        p2 === '..') {
-		                        continue;
-		                    }
-		                    didSomething = true;
-		                    // edit parts in place, and push the new one
-		                    parts.splice(gs, 1);
-		                    const other = parts.slice(0);
-		                    other[gs] = '**';
-		                    globParts.push(other);
-		                    gs--;
-		                }
-		                // 
// -> 
/
-		                if (!this.preserveMultipleSlashes) {
-		                    for (let i = 1; i < parts.length - 1; i++) {
-		                        const p = parts[i];
-		                        // don't squeeze out UNC patterns
-		                        if (i === 1 && p === '' && parts[0] === '')
-		                            continue;
-		                        if (p === '.' || p === '') {
-		                            didSomething = true;
-		                            parts.splice(i, 1);
-		                            i--;
-		                        }
-		                    }
-		                    if (parts[0] === '.' &&
-		                        parts.length === 2 &&
-		                        (parts[1] === '.' || parts[1] === '')) {
-		                        didSomething = true;
-		                        parts.pop();
-		                    }
-		                }
-		                // 
/

/../ ->

/
-		                let dd = 0;
-		                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
-		                    const p = parts[dd - 1];
-		                    if (p && p !== '.' && p !== '..' && p !== '**') {
-		                        didSomething = true;
-		                        const needDot = dd === 1 && parts[dd + 1] === '**';
-		                        const splin = needDot ? ['.'] : [];
-		                        parts.splice(dd - 1, 2, ...splin);
-		                        if (parts.length === 0)
-		                            parts.push('');
-		                        dd -= 2;
-		                    }
-		                }
-		            }
-		        } while (didSomething);
-		        return globParts;
-		    }
-		    // second phase: multi-pattern dedupes
-		    // {
/*/,
/

/} ->

/*/
-		    // {
/,
/} -> 
/
-		    // {
/**/,
/} -> 
/**/
-		    //
-		    // {
/**/,
/**/

/} ->

/**/
-		    // ^-- not valid because ** doens't follow symlinks
-		    secondPhasePreProcess(globParts) {
-		        for (let i = 0; i < globParts.length - 1; i++) {
-		            for (let j = i + 1; j < globParts.length; j++) {
-		                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
-		                if (matched) {
-		                    globParts[i] = [];
-		                    globParts[j] = matched;
-		                    break;
-		                }
-		            }
-		        }
-		        return globParts.filter(gs => gs.length);
-		    }
-		    partsMatch(a, b, emptyGSMatch = false) {
-		        let ai = 0;
-		        let bi = 0;
-		        let result = [];
-		        let which = '';
-		        while (ai < a.length && bi < b.length) {
-		            if (a[ai] === b[bi]) {
-		                result.push(which === 'b' ? b[bi] : a[ai]);
-		                ai++;
-		                bi++;
-		            }
-		            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
-		                result.push(a[ai]);
-		                ai++;
-		            }
-		            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
-		                result.push(b[bi]);
-		                bi++;
-		            }
-		            else if (a[ai] === '*' &&
-		                b[bi] &&
-		                (this.options.dot || !b[bi].startsWith('.')) &&
-		                b[bi] !== '**') {
-		                if (which === 'b')
-		                    return false;
-		                which = 'a';
-		                result.push(a[ai]);
-		                ai++;
-		                bi++;
-		            }
-		            else if (b[bi] === '*' &&
-		                a[ai] &&
-		                (this.options.dot || !a[ai].startsWith('.')) &&
-		                a[ai] !== '**') {
-		                if (which === 'a')
-		                    return false;
-		                which = 'b';
-		                result.push(b[bi]);
-		                ai++;
-		                bi++;
-		            }
-		            else {
-		                return false;
-		            }
-		        }
-		        // if we fall out of the loop, it means they two are identical
-		        // as long as their lengths match
-		        return a.length === b.length && result;
-		    }
-		    parseNegate() {
-		        if (this.nonegate)
-		            return;
-		        const pattern = this.pattern;
-		        let negate = false;
-		        let negateOffset = 0;
-		        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
-		            negate = !negate;
-		            negateOffset++;
-		        }
-		        if (negateOffset)
-		            this.pattern = pattern.slice(negateOffset);
-		        this.negate = negate;
-		    }
-		    // set partial to true to test if, for example,
-		    // "/a/b" matches the start of "/*/b/*/d"
-		    // Partial means, if you run out of file before you run
-		    // out of pattern, then that's fine, as long as all
-		    // the parts match.
-		    matchOne(file, pattern, partial = false) {
-		        const options = this.options;
-		        // UNC paths like //?/X:/... can match X:/... and vice versa
-		        // Drive letters in absolute drive or unc paths are always compared
-		        // case-insensitively.
-		        if (this.isWindows) {
-		            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
-		            const fileUNC = !fileDrive &&
-		                file[0] === '' &&
-		                file[1] === '' &&
-		                file[2] === '?' &&
-		                /^[a-z]:$/i.test(file[3]);
-		            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
-		            const patternUNC = !patternDrive &&
-		                pattern[0] === '' &&
-		                pattern[1] === '' &&
-		                pattern[2] === '?' &&
-		                typeof pattern[3] === 'string' &&
-		                /^[a-z]:$/i.test(pattern[3]);
-		            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
-		            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
-		            if (typeof fdi === 'number' && typeof pdi === 'number') {
-		                const [fd, pd] = [file[fdi], pattern[pdi]];
-		                if (fd.toLowerCase() === pd.toLowerCase()) {
-		                    pattern[pdi] = fd;
-		                    if (pdi > fdi) {
-		                        pattern = pattern.slice(pdi);
-		                    }
-		                    else if (fdi > pdi) {
-		                        file = file.slice(fdi);
-		                    }
-		                }
-		            }
-		        }
-		        // resolve and reduce . and .. portions in the file as well.
-		        // dont' need to do the second phase, because it's only one string[]
-		        const { optimizationLevel = 1 } = this.options;
-		        if (optimizationLevel >= 2) {
-		            file = this.levelTwoFileOptimize(file);
-		        }
-		        this.debug('matchOne', this, { file, pattern });
-		        this.debug('matchOne', file.length, pattern.length);
-		        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
-		            this.debug('matchOne loop');
-		            var p = pattern[pi];
-		            var f = file[fi];
-		            this.debug(pattern, p, f);
-		            // should be impossible.
-		            // some invalid regexp stuff in the set.
-		            /* c8 ignore start */
-		            if (p === false) {
-		                return false;
-		            }
-		            /* c8 ignore stop */
-		            if (p === exports$1.GLOBSTAR) {
-		                this.debug('GLOBSTAR', [pattern, p, f]);
-		                // "**"
-		                // a/**/b/**/c would match the following:
-		                // a/b/x/y/z/c
-		                // a/x/y/z/b/c
-		                // a/b/x/b/x/c
-		                // a/b/c
-		                // To do this, take the rest of the pattern after
-		                // the **, and see if it would match the file remainder.
-		                // If so, return success.
-		                // If not, the ** "swallows" a segment, and try again.
-		                // This is recursively awful.
-		                //
-		                // a/**/b/**/c matching a/b/x/y/z/c
-		                // - a matches a
-		                // - doublestar
-		                //   - matchOne(b/x/y/z/c, b/**/c)
-		                //     - b matches b
-		                //     - doublestar
-		                //       - matchOne(x/y/z/c, c) -> no
-		                //       - matchOne(y/z/c, c) -> no
-		                //       - matchOne(z/c, c) -> no
-		                //       - matchOne(c, c) yes, hit
-		                var fr = fi;
-		                var pr = pi + 1;
-		                if (pr === pl) {
-		                    this.debug('** at the end');
-		                    // a ** at the end will just swallow the rest.
-		                    // We have found a match.
-		                    // however, it will not swallow /.x, unless
-		                    // options.dot is set.
-		                    // . and .. are *never* matched by **, for explosively
-		                    // exponential reasons.
-		                    for (; fi < fl; fi++) {
-		                        if (file[fi] === '.' ||
-		                            file[fi] === '..' ||
-		                            (!options.dot && file[fi].charAt(0) === '.'))
-		                            return false;
-		                    }
-		                    return true;
-		                }
-		                // ok, let's see if we can swallow whatever we can.
-		                while (fr < fl) {
-		                    var swallowee = file[fr];
-		                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
-		                    // XXX remove this slice.  Just pass the start index.
-		                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-		                        this.debug('globstar found match!', fr, fl, swallowee);
-		                        // found a match.
-		                        return true;
-		                    }
-		                    else {
-		                        // can't swallow "." or ".." ever.
-		                        // can only swallow ".foo" when explicitly asked.
-		                        if (swallowee === '.' ||
-		                            swallowee === '..' ||
-		                            (!options.dot && swallowee.charAt(0) === '.')) {
-		                            this.debug('dot detected!', file, fr, pattern, pr);
-		                            break;
-		                        }
-		                        // ** swallows a segment, and continue.
-		                        this.debug('globstar swallow a segment, and continue');
-		                        fr++;
-		                    }
-		                }
-		                // no match was found.
-		                // However, in partial mode, we can't say this is necessarily over.
-		                /* c8 ignore start */
-		                if (partial) {
-		                    // ran out of file
-		                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
-		                    if (fr === fl) {
-		                        return true;
-		                    }
-		                }
-		                /* c8 ignore stop */
-		                return false;
-		            }
-		            // something other than **
-		            // non-magic patterns just have to match exactly
-		            // patterns with magic have been turned into regexps.
-		            let hit;
-		            if (typeof p === 'string') {
-		                hit = f === p;
-		                this.debug('string match', p, f, hit);
-		            }
-		            else {
-		                hit = p.test(f);
-		                this.debug('pattern match', p, f, hit);
-		            }
-		            if (!hit)
-		                return false;
-		        }
-		        // Note: ending in / means that we'll get a final ""
-		        // at the end of the pattern.  This can only match a
-		        // corresponding "" at the end of the file.
-		        // If the file ends in /, then it can only match a
-		        // a pattern that ends in /, unless the pattern just
-		        // doesn't have any more for it. But, a/b/ should *not*
-		        // match "a/b/*", even though "" matches against the
-		        // [^/]*? pattern, except in partial mode, where it might
-		        // simply not be reached yet.
-		        // However, a/b/ should still satisfy a/*
-		        // now either we fell off the end of the pattern, or we're done.
-		        if (fi === fl && pi === pl) {
-		            // ran out of pattern and filename at the same time.
-		            // an exact hit!
-		            return true;
-		        }
-		        else if (fi === fl) {
-		            // ran out of file, but still had pattern left.
-		            // this is ok if we're doing the match as part of
-		            // a glob fs traversal.
-		            return partial;
-		        }
-		        else if (pi === pl) {
-		            // ran out of pattern, still have file left.
-		            // this is only acceptable if we're on the very last
-		            // empty segment of a file with a trailing slash.
-		            // a/* should match a/b/
-		            return fi === fl - 1 && file[fi] === '';
-		            /* c8 ignore start */
-		        }
-		        else {
-		            // should be unreachable.
-		            throw new Error('wtf?');
-		        }
-		        /* c8 ignore stop */
-		    }
-		    braceExpand() {
-		        return (0, exports$1.braceExpand)(this.pattern, this.options);
-		    }
-		    parse(pattern) {
-		        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
-		        const options = this.options;
-		        // shortcuts
-		        if (pattern === '**')
-		            return exports$1.GLOBSTAR;
-		        if (pattern === '')
-		            return '';
-		        // far and away, the most common glob pattern parts are
-		        // *, *.*, and *.  Add a fast check method for those.
-		        let m;
-		        let fastTest = null;
-		        if ((m = pattern.match(starRE))) {
-		            fastTest = options.dot ? starTestDot : starTest;
-		        }
-		        else if ((m = pattern.match(starDotExtRE))) {
-		            fastTest = (options.nocase
-		                ? options.dot
-		                    ? starDotExtTestNocaseDot
-		                    : starDotExtTestNocase
-		                : options.dot
-		                    ? starDotExtTestDot
-		                    : starDotExtTest)(m[1]);
-		        }
-		        else if ((m = pattern.match(qmarksRE))) {
-		            fastTest = (options.nocase
-		                ? options.dot
-		                    ? qmarksTestNocaseDot
-		                    : qmarksTestNocase
-		                : options.dot
-		                    ? qmarksTestDot
-		                    : qmarksTest)(m);
-		        }
-		        else if ((m = pattern.match(starDotStarRE))) {
-		            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
-		        }
-		        else if ((m = pattern.match(dotStarRE))) {
-		            fastTest = dotStarTest;
-		        }
-		        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
-		        if (fastTest && typeof re === 'object') {
-		            // Avoids overriding in frozen environments
-		            Reflect.defineProperty(re, 'test', { value: fastTest });
-		        }
-		        return re;
-		    }
-		    makeRe() {
-		        if (this.regexp || this.regexp === false)
-		            return this.regexp;
-		        // at this point, this.set is a 2d array of partial
-		        // pattern strings, or "**".
-		        //
-		        // It's better to use .match().  This function shouldn't
-		        // be used, really, but it's pretty convenient sometimes,
-		        // when you just want to work with a regex.
-		        const set = this.set;
-		        if (!set.length) {
-		            this.regexp = false;
-		            return this.regexp;
-		        }
-		        const options = this.options;
-		        const twoStar = options.noglobstar
-		            ? star
-		            : options.dot
-		                ? twoStarDot
-		                : twoStarNoDot;
-		        const flags = new Set(options.nocase ? ['i'] : []);
-		        // regexpify non-globstar patterns
-		        // if ** is only item, then we just do one twoStar
-		        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
-		        // if ** is last, append (\/twoStar|) to previous
-		        // if ** is in the middle, append (\/|\/twoStar\/) to previous
-		        // then filter out GLOBSTAR symbols
-		        let re = set
-		            .map(pattern => {
-		            const pp = pattern.map(p => {
-		                if (p instanceof RegExp) {
-		                    for (const f of p.flags.split(''))
-		                        flags.add(f);
-		                }
-		                return typeof p === 'string'
-		                    ? regExpEscape(p)
-		                    : p === exports$1.GLOBSTAR
-		                        ? exports$1.GLOBSTAR
-		                        : p._src;
-		            });
-		            pp.forEach((p, i) => {
-		                const next = pp[i + 1];
-		                const prev = pp[i - 1];
-		                if (p !== exports$1.GLOBSTAR || prev === exports$1.GLOBSTAR) {
-		                    return;
-		                }
-		                if (prev === undefined) {
-		                    if (next !== undefined && next !== exports$1.GLOBSTAR) {
-		                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
-		                    }
-		                    else {
-		                        pp[i] = twoStar;
-		                    }
-		                }
-		                else if (next === undefined) {
-		                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
-		                }
-		                else if (next !== exports$1.GLOBSTAR) {
-		                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
-		                    pp[i + 1] = exports$1.GLOBSTAR;
-		                }
-		            });
-		            return pp.filter(p => p !== exports$1.GLOBSTAR).join('/');
-		        })
-		            .join('|');
-		        // need to wrap in parens if we had more than one thing with |,
-		        // otherwise only the first will be anchored to ^ and the last to $
-		        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
-		        // must match entire pattern
-		        // ending in a * or ** will make it less strict.
-		        re = '^' + open + re + close + '$';
-		        // can match anything, as long as it's not this.
-		        if (this.negate)
-		            re = '^(?!' + re + ').+$';
-		        try {
-		            this.regexp = new RegExp(re, [...flags].join(''));
-		            /* c8 ignore start */
-		        }
-		        catch (ex) {
-		            // should be impossible
-		            this.regexp = false;
-		        }
-		        /* c8 ignore stop */
-		        return this.regexp;
-		    }
-		    slashSplit(p) {
-		        // if p starts with // on windows, we preserve that
-		        // so that UNC paths aren't broken.  Otherwise, any number of
-		        // / characters are coalesced into one, unless
-		        // preserveMultipleSlashes is set to true.
-		        if (this.preserveMultipleSlashes) {
-		            return p.split('/');
-		        }
-		        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
-		            // add an extra '' for the one we lose
-		            return ['', ...p.split(/\/+/)];
-		        }
-		        else {
-		            return p.split(/\/+/);
-		        }
-		    }
-		    match(f, partial = this.partial) {
-		        this.debug('match', f, this.pattern);
-		        // short-circuit in the case of busted things.
-		        // comments, etc.
-		        if (this.comment) {
-		            return false;
-		        }
-		        if (this.empty) {
-		            return f === '';
-		        }
-		        if (f === '/' && partial) {
-		            return true;
-		        }
-		        const options = this.options;
-		        // windows: need to use /, not \
-		        if (this.isWindows) {
-		            f = f.split('\\').join('/');
-		        }
-		        // treat the test path as a set of pathparts.
-		        const ff = this.slashSplit(f);
-		        this.debug(this.pattern, 'split', ff);
-		        // just ONE of the pattern sets in this.set needs to match
-		        // in order for it to be valid.  If negating, then just one
-		        // match means that we have failed.
-		        // Either way, return on the first hit.
-		        const set = this.set;
-		        this.debug(this.pattern, 'set', set);
-		        // Find the basename of the path by looking for the last non-empty segment
-		        let filename = ff[ff.length - 1];
-		        if (!filename) {
-		            for (let i = ff.length - 2; !filename && i >= 0; i--) {
-		                filename = ff[i];
-		            }
-		        }
-		        for (let i = 0; i < set.length; i++) {
-		            const pattern = set[i];
-		            let file = ff;
-		            if (options.matchBase && pattern.length === 1) {
-		                file = [filename];
-		            }
-		            const hit = this.matchOne(file, pattern, partial);
-		            if (hit) {
-		                if (options.flipNegate) {
-		                    return true;
-		                }
-		                return !this.negate;
-		            }
-		        }
-		        // didn't get any hits.  this is success if it's a negative
-		        // pattern, failure otherwise.
-		        if (options.flipNegate) {
-		            return false;
-		        }
-		        return this.negate;
-		    }
-		    static defaults(def) {
-		        return exports$1.minimatch.defaults(def).Minimatch;
-		    }
-		}
-		exports$1.Minimatch = Minimatch;
-		/* c8 ignore start */
-		var ast_js_2 = requireAst();
-		Object.defineProperty(exports$1, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
-		var escape_js_2 = require_escape();
-		Object.defineProperty(exports$1, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
-		var unescape_js_2 = require_unescape();
-		Object.defineProperty(exports$1, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
-		/* c8 ignore stop */
-		exports$1.minimatch.AST = ast_js_1.AST;
-		exports$1.minimatch.Minimatch = Minimatch;
-		exports$1.minimatch.escape = escape_js_1.escape;
-		exports$1.minimatch.unescape = unescape_js_1.unescape;
-		
-	} (commonjs$h));
-	return commonjs$h;
-}
-
-var internalPath = {};
-
-var hasRequiredInternalPath;
-
-function requireInternalPath () {
-	if (hasRequiredInternalPath) return internalPath;
-	hasRequiredInternalPath = 1;
-	var __createBinding = (internalPath && internalPath.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalPath && internalPath.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalPath && internalPath.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __importDefault = (internalPath && internalPath.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(internalPath, "__esModule", { value: true });
-	internalPath.Path = void 0;
-	const path = __importStar(require$$1$6);
-	const pathHelper = __importStar(requireInternalPathHelper());
-	const assert_1 = __importDefault(require$$0$8);
-	const IS_WINDOWS = process.platform === 'win32';
-	/**
-	 * Helper class for parsing paths into segments
-	 */
-	class Path {
-	    /**
-	     * Constructs a Path
-	     * @param itemPath Path or array of segments
-	     */
-	    constructor(itemPath) {
-	        this.segments = [];
-	        // String
-	        if (typeof itemPath === 'string') {
-	            (0, assert_1.default)(itemPath, `Parameter 'itemPath' must not be empty`);
-	            // Normalize slashes and trim unnecessary trailing slash
-	            itemPath = pathHelper.safeTrimTrailingSeparator(itemPath);
-	            // Not rooted
-	            if (!pathHelper.hasRoot(itemPath)) {
-	                this.segments = itemPath.split(path.sep);
-	            }
-	            // Rooted
-	            else {
-	                // Add all segments, while not at the root
-	                let remaining = itemPath;
-	                let dir = pathHelper.dirname(remaining);
-	                while (dir !== remaining) {
-	                    // Add the segment
-	                    const basename = path.basename(remaining);
-	                    this.segments.unshift(basename);
-	                    // Truncate the last segment
-	                    remaining = dir;
-	                    dir = pathHelper.dirname(remaining);
-	                }
-	                // Remainder is the root
-	                this.segments.unshift(remaining);
-	            }
-	        }
-	        // Array
-	        else {
-	            // Must not be empty
-	            (0, assert_1.default)(itemPath.length > 0, `Parameter 'itemPath' must not be an empty array`);
-	            // Each segment
-	            for (let i = 0; i < itemPath.length; i++) {
-	                let segment = itemPath[i];
-	                // Must not be empty
-	                (0, assert_1.default)(segment, `Parameter 'itemPath' must not contain any empty segments`);
-	                // Normalize slashes
-	                segment = pathHelper.normalizeSeparators(itemPath[i]);
-	                // Root segment
-	                if (i === 0 && pathHelper.hasRoot(segment)) {
-	                    segment = pathHelper.safeTrimTrailingSeparator(segment);
-	                    (0, assert_1.default)(segment === pathHelper.dirname(segment), `Parameter 'itemPath' root segment contains information for multiple segments`);
-	                    this.segments.push(segment);
-	                }
-	                // All other segments
-	                else {
-	                    // Must not contain slash
-	                    (0, assert_1.default)(!segment.includes(path.sep), `Parameter 'itemPath' contains unexpected path separators`);
-	                    this.segments.push(segment);
-	                }
-	            }
-	        }
-	    }
-	    /**
-	     * Converts the path to it's string representation
-	     */
-	    toString() {
-	        // First segment
-	        let result = this.segments[0];
-	        // All others
-	        let skipSlash = result.endsWith(path.sep) || (IS_WINDOWS && /^[A-Z]:$/i.test(result));
-	        for (let i = 1; i < this.segments.length; i++) {
-	            if (skipSlash) {
-	                skipSlash = false;
-	            }
-	            else {
-	                result += path.sep;
-	            }
-	            result += this.segments[i];
-	        }
-	        return result;
-	    }
-	}
-	internalPath.Path = Path;
-	
-	return internalPath;
-}
-
-var hasRequiredInternalPattern;
-
-function requireInternalPattern () {
-	if (hasRequiredInternalPattern) return internalPattern;
-	hasRequiredInternalPattern = 1;
-	var __createBinding = (internalPattern && internalPattern.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalPattern && internalPattern.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalPattern && internalPattern.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __importDefault = (internalPattern && internalPattern.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(internalPattern, "__esModule", { value: true });
-	internalPattern.Pattern = void 0;
-	const os = __importStar(require$$0$3);
-	const path = __importStar(require$$1$6);
-	const pathHelper = __importStar(requireInternalPathHelper());
-	const assert_1 = __importDefault(require$$0$8);
-	const minimatch_1 = requireCommonjs$f();
-	const internal_match_kind_1 = requireInternalMatchKind();
-	const internal_path_1 = requireInternalPath();
-	const IS_WINDOWS = process.platform === 'win32';
-	class Pattern {
-	    constructor(patternOrNegate, isImplicitPattern = false, segments, homedir) {
-	        /**
-	         * Indicates whether matches should be excluded from the result set
-	         */
-	        this.negate = false;
-	        // Pattern overload
-	        let pattern;
-	        if (typeof patternOrNegate === 'string') {
-	            pattern = patternOrNegate.trim();
-	        }
-	        // Segments overload
-	        else {
-	            // Convert to pattern
-	            segments = segments || [];
-	            (0, assert_1.default)(segments.length, `Parameter 'segments' must not empty`);
-	            const root = Pattern.getLiteral(segments[0]);
-	            (0, assert_1.default)(root && pathHelper.hasAbsoluteRoot(root), `Parameter 'segments' first element must be a root path`);
-	            pattern = new internal_path_1.Path(segments).toString().trim();
-	            if (patternOrNegate) {
-	                pattern = `!${pattern}`;
-	            }
-	        }
-	        // Negate
-	        while (pattern.startsWith('!')) {
-	            this.negate = !this.negate;
-	            pattern = pattern.substr(1).trim();
-	        }
-	        // Normalize slashes and ensures absolute root
-	        pattern = Pattern.fixupPattern(pattern, homedir);
-	        // Segments
-	        this.segments = new internal_path_1.Path(pattern).segments;
-	        // Trailing slash indicates the pattern should only match directories, not regular files
-	        this.trailingSeparator = pathHelper
-	            .normalizeSeparators(pattern)
-	            .endsWith(path.sep);
-	        pattern = pathHelper.safeTrimTrailingSeparator(pattern);
-	        // Search path (literal path prior to the first glob segment)
-	        let foundGlob = false;
-	        const searchSegments = this.segments
-	            .map(x => Pattern.getLiteral(x))
-	            .filter(x => !foundGlob && !(foundGlob = x === ''));
-	        this.searchPath = new internal_path_1.Path(searchSegments).toString();
-	        // Root RegExp (required when determining partial match)
-	        this.rootRegExp = new RegExp(Pattern.regExpEscape(searchSegments[0]), IS_WINDOWS ? 'i' : '');
-	        this.isImplicitPattern = isImplicitPattern;
-	        // Create minimatch
-	        const minimatchOptions = {
-	            dot: true,
-	            nobrace: true,
-	            nocase: IS_WINDOWS,
-	            nocomment: true,
-	            noext: true,
-	            nonegate: true
-	        };
-	        pattern = IS_WINDOWS ? pattern.replace(/\\/g, '/') : pattern;
-	        this.minimatch = new minimatch_1.Minimatch(pattern, minimatchOptions);
-	    }
-	    /**
-	     * Matches the pattern against the specified path
-	     */
-	    match(itemPath) {
-	        // Last segment is globstar?
-	        if (this.segments[this.segments.length - 1] === '**') {
-	            // Normalize slashes
-	            itemPath = pathHelper.normalizeSeparators(itemPath);
-	            // Append a trailing slash. Otherwise Minimatch will not match the directory immediately
-	            // preceding the globstar. For example, given the pattern `/foo/**`, Minimatch returns
-	            // false for `/foo` but returns true for `/foo/`. Append a trailing slash to handle that quirk.
-	            if (!itemPath.endsWith(path.sep) && this.isImplicitPattern === false) {
-	                // Note, this is safe because the constructor ensures the pattern has an absolute root.
-	                // For example, formats like C: and C:foo on Windows are resolved to an absolute root.
-	                itemPath = `${itemPath}${path.sep}`;
-	            }
-	        }
-	        else {
-	            // Normalize slashes and trim unnecessary trailing slash
-	            itemPath = pathHelper.safeTrimTrailingSeparator(itemPath);
-	        }
-	        // Match
-	        if (this.minimatch.match(itemPath)) {
-	            return this.trailingSeparator ? internal_match_kind_1.MatchKind.Directory : internal_match_kind_1.MatchKind.All;
-	        }
-	        return internal_match_kind_1.MatchKind.None;
-	    }
-	    /**
-	     * Indicates whether the pattern may match descendants of the specified path
-	     */
-	    partialMatch(itemPath) {
-	        // Normalize slashes and trim unnecessary trailing slash
-	        itemPath = pathHelper.safeTrimTrailingSeparator(itemPath);
-	        // matchOne does not handle root path correctly
-	        if (pathHelper.dirname(itemPath) === itemPath) {
-	            return this.rootRegExp.test(itemPath);
-	        }
-	        return this.minimatch.matchOne(itemPath.split(IS_WINDOWS ? /\\+/ : /\/+/), this.minimatch.set[0], true);
-	    }
-	    /**
-	     * Escapes glob patterns within a path
-	     */
-	    static globEscape(s) {
-	        return (IS_WINDOWS ? s : s.replace(/\\/g, '\\\\')) // escape '\' on Linux/macOS
-	            .replace(/(\[)(?=[^/]+\])/g, '[[]') // escape '[' when ']' follows within the path segment
-	            .replace(/\?/g, '[?]') // escape '?'
-	            .replace(/\*/g, '[*]'); // escape '*'
-	    }
-	    /**
-	     * Normalizes slashes and ensures absolute root
-	     */
-	    static fixupPattern(pattern, homedir) {
-	        // Empty
-	        (0, assert_1.default)(pattern, 'pattern cannot be empty');
-	        // Must not contain `.` segment, unless first segment
-	        // Must not contain `..` segment
-	        const literalSegments = new internal_path_1.Path(pattern).segments.map(x => Pattern.getLiteral(x));
-	        (0, assert_1.default)(literalSegments.every((x, i) => (x !== '.' || i === 0) && x !== '..'), `Invalid pattern '${pattern}'. Relative pathing '.' and '..' is not allowed.`);
-	        // Must not contain globs in root, e.g. Windows UNC path \\foo\b*r
-	        (0, assert_1.default)(!pathHelper.hasRoot(pattern) || literalSegments[0], `Invalid pattern '${pattern}'. Root segment must not contain globs.`);
-	        // Normalize slashes
-	        pattern = pathHelper.normalizeSeparators(pattern);
-	        // Replace leading `.` segment
-	        if (pattern === '.' || pattern.startsWith(`.${path.sep}`)) {
-	            pattern = Pattern.globEscape(process.cwd()) + pattern.substr(1);
-	        }
-	        // Replace leading `~` segment
-	        else if (pattern === '~' || pattern.startsWith(`~${path.sep}`)) {
-	            homedir = homedir || os.homedir();
-	            (0, assert_1.default)(homedir, 'Unable to determine HOME directory');
-	            (0, assert_1.default)(pathHelper.hasAbsoluteRoot(homedir), `Expected HOME directory to be a rooted path. Actual '${homedir}'`);
-	            pattern = Pattern.globEscape(homedir) + pattern.substr(1);
-	        }
-	        // Replace relative drive root, e.g. pattern is C: or C:foo
-	        else if (IS_WINDOWS &&
-	            (pattern.match(/^[A-Z]:$/i) || pattern.match(/^[A-Z]:[^\\]/i))) {
-	            let root = pathHelper.ensureAbsoluteRoot('C:\\dummy-root', pattern.substr(0, 2));
-	            if (pattern.length > 2 && !root.endsWith('\\')) {
-	                root += '\\';
-	            }
-	            pattern = Pattern.globEscape(root) + pattern.substr(2);
-	        }
-	        // Replace relative root, e.g. pattern is \ or \foo
-	        else if (IS_WINDOWS && (pattern === '\\' || pattern.match(/^\\[^\\]/))) {
-	            let root = pathHelper.ensureAbsoluteRoot('C:\\dummy-root', '\\');
-	            if (!root.endsWith('\\')) {
-	                root += '\\';
-	            }
-	            pattern = Pattern.globEscape(root) + pattern.substr(1);
-	        }
-	        // Otherwise ensure absolute root
-	        else {
-	            pattern = pathHelper.ensureAbsoluteRoot(Pattern.globEscape(process.cwd()), pattern);
-	        }
-	        return pathHelper.normalizeSeparators(pattern);
-	    }
-	    /**
-	     * Attempts to unescape a pattern segment to create a literal path segment.
-	     * Otherwise returns empty string.
-	     */
-	    static getLiteral(segment) {
-	        let literal = '';
-	        for (let i = 0; i < segment.length; i++) {
-	            const c = segment[i];
-	            // Escape
-	            if (c === '\\' && !IS_WINDOWS && i + 1 < segment.length) {
-	                literal += segment[++i];
-	                continue;
-	            }
-	            // Wildcard
-	            else if (c === '*' || c === '?') {
-	                return '';
-	            }
-	            // Character set
-	            else if (c === '[' && i + 1 < segment.length) {
-	                let set = '';
-	                let closed = -1;
-	                for (let i2 = i + 1; i2 < segment.length; i2++) {
-	                    const c2 = segment[i2];
-	                    // Escape
-	                    if (c2 === '\\' && !IS_WINDOWS && i2 + 1 < segment.length) {
-	                        set += segment[++i2];
-	                        continue;
-	                    }
-	                    // Closed
-	                    else if (c2 === ']') {
-	                        closed = i2;
-	                        break;
-	                    }
-	                    // Otherwise
-	                    else {
-	                        set += c2;
-	                    }
-	                }
-	                // Closed?
-	                if (closed >= 0) {
-	                    // Cannot convert
-	                    if (set.length > 1) {
-	                        return '';
-	                    }
-	                    // Convert to literal
-	                    if (set) {
-	                        literal += set;
-	                        i = closed;
-	                        continue;
-	                    }
-	                }
-	                // Otherwise fall thru
-	            }
-	            // Append
-	            literal += c;
-	        }
-	        return literal;
-	    }
-	    /**
-	     * Escapes regexp special characters
-	     * https://javascript.info/regexp-escaping
-	     */
-	    static regExpEscape(s) {
-	        return s.replace(/[[\\^$.|?*+()]/g, '\\$&');
-	    }
-	}
-	internalPattern.Pattern = Pattern;
-	
-	return internalPattern;
-}
-
-var internalSearchState = {};
-
-var hasRequiredInternalSearchState;
-
-function requireInternalSearchState () {
-	if (hasRequiredInternalSearchState) return internalSearchState;
-	hasRequiredInternalSearchState = 1;
-	Object.defineProperty(internalSearchState, "__esModule", { value: true });
-	internalSearchState.SearchState = void 0;
-	class SearchState {
-	    constructor(path, level) {
-	        this.path = path;
-	        this.level = level;
-	    }
-	}
-	internalSearchState.SearchState = SearchState;
-	
-	return internalSearchState;
-}
-
-var hasRequiredInternalGlobber;
-
-function requireInternalGlobber () {
-	if (hasRequiredInternalGlobber) return internalGlobber;
-	hasRequiredInternalGlobber = 1;
-	var __createBinding = (internalGlobber && internalGlobber.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalGlobber && internalGlobber.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalGlobber && internalGlobber.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (internalGlobber && internalGlobber.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	var __asyncValues = (internalGlobber && internalGlobber.__asyncValues) || function (o) {
-	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-	    var m = o[Symbol.asyncIterator], i;
-	    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
-	    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
-	    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
-	};
-	var __await = (internalGlobber && internalGlobber.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); };
-	var __asyncGenerator = (internalGlobber && internalGlobber.__asyncGenerator) || function (thisArg, _arguments, generator) {
-	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-	    var g = generator.apply(thisArg, _arguments || []), i, q = [];
-	    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
-	    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
-	    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
-	    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
-	    function fulfill(value) { resume("next", value); }
-	    function reject(value) { resume("throw", value); }
-	    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
-	};
-	Object.defineProperty(internalGlobber, "__esModule", { value: true });
-	internalGlobber.DefaultGlobber = void 0;
-	const core = __importStar(requireCore$1());
-	const fs = __importStar(require$$1__default);
-	const globOptionsHelper = __importStar(requireInternalGlobOptionsHelper());
-	const path = __importStar(require$$1$6);
-	const patternHelper = __importStar(requireInternalPatternHelper());
-	const internal_match_kind_1 = requireInternalMatchKind();
-	const internal_pattern_1 = requireInternalPattern();
-	const internal_search_state_1 = requireInternalSearchState();
-	const IS_WINDOWS = process.platform === 'win32';
-	class DefaultGlobber {
-	    constructor(options) {
-	        this.patterns = [];
-	        this.searchPaths = [];
-	        this.options = globOptionsHelper.getOptions(options);
-	    }
-	    getSearchPaths() {
-	        // Return a copy
-	        return this.searchPaths.slice();
-	    }
-	    glob() {
-	        var _a, e_1, _b, _c;
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const result = [];
-	            try {
-	                for (var _d = true, _e = __asyncValues(this.globGenerator()), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
-	                    _c = _f.value;
-	                    _d = false;
-	                    const itemPath = _c;
-	                    result.push(itemPath);
-	                }
-	            }
-	            catch (e_1_1) { e_1 = { error: e_1_1 }; }
-	            finally {
-	                try {
-	                    if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
-	                }
-	                finally { if (e_1) throw e_1.error; }
-	            }
-	            return result;
-	        });
-	    }
-	    globGenerator() {
-	        return __asyncGenerator(this, arguments, function* globGenerator_1() {
-	            // Fill in defaults options
-	            const options = globOptionsHelper.getOptions(this.options);
-	            // Implicit descendants?
-	            const patterns = [];
-	            for (const pattern of this.patterns) {
-	                patterns.push(pattern);
-	                if (options.implicitDescendants &&
-	                    (pattern.trailingSeparator ||
-	                        pattern.segments[pattern.segments.length - 1] !== '**')) {
-	                    patterns.push(new internal_pattern_1.Pattern(pattern.negate, true, pattern.segments.concat('**')));
-	                }
-	            }
-	            // Push the search paths
-	            const stack = [];
-	            for (const searchPath of patternHelper.getSearchPaths(patterns)) {
-	                core.debug(`Search path '${searchPath}'`);
-	                // Exists?
-	                try {
-	                    // Intentionally using lstat. Detection for broken symlink
-	                    // will be performed later (if following symlinks).
-	                    yield __await(fs.promises.lstat(searchPath));
-	                }
-	                catch (err) {
-	                    if (err.code === 'ENOENT') {
-	                        continue;
-	                    }
-	                    throw err;
-	                }
-	                stack.unshift(new internal_search_state_1.SearchState(searchPath, 1));
-	            }
-	            // Search
-	            const traversalChain = []; // used to detect cycles
-	            while (stack.length) {
-	                // Pop
-	                const item = stack.pop();
-	                // Match?
-	                const match = patternHelper.match(patterns, item.path);
-	                const partialMatch = !!match || patternHelper.partialMatch(patterns, item.path);
-	                if (!match && !partialMatch) {
-	                    continue;
-	                }
-	                // Stat
-	                const stats = yield __await(DefaultGlobber.stat(item, options, traversalChain)
-	                // Broken symlink, or symlink cycle detected, or no longer exists
-	                );
-	                // Broken symlink, or symlink cycle detected, or no longer exists
-	                if (!stats) {
-	                    continue;
-	                }
-	                // Hidden file or directory?
-	                if (options.excludeHiddenFiles && path.basename(item.path).match(/^\./)) {
-	                    continue;
-	                }
-	                // Directory
-	                if (stats.isDirectory()) {
-	                    // Matched
-	                    if (match & internal_match_kind_1.MatchKind.Directory && options.matchDirectories) {
-	                        yield yield __await(item.path);
-	                    }
-	                    // Descend?
-	                    else if (!partialMatch) {
-	                        continue;
-	                    }
-	                    // Push the child items in reverse
-	                    const childLevel = item.level + 1;
-	                    const childItems = (yield __await(fs.promises.readdir(item.path))).map(x => new internal_search_state_1.SearchState(path.join(item.path, x), childLevel));
-	                    stack.push(...childItems.reverse());
-	                }
-	                // File
-	                else if (match & internal_match_kind_1.MatchKind.File) {
-	                    yield yield __await(item.path);
-	                }
-	            }
-	        });
-	    }
-	    /**
-	     * Constructs a DefaultGlobber
-	     */
-	    static create(patterns, options) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const result = new DefaultGlobber(options);
-	            if (IS_WINDOWS) {
-	                patterns = patterns.replace(/\r\n/g, '\n');
-	                patterns = patterns.replace(/\r/g, '\n');
-	            }
-	            const lines = patterns.split('\n').map(x => x.trim());
-	            for (const line of lines) {
-	                // Empty or comment
-	                if (!line || line.startsWith('#')) {
-	                    continue;
-	                }
-	                // Pattern
-	                else {
-	                    result.patterns.push(new internal_pattern_1.Pattern(line));
-	                }
-	            }
-	            result.searchPaths.push(...patternHelper.getSearchPaths(result.patterns));
-	            return result;
-	        });
-	    }
-	    static stat(item, options, traversalChain) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            // Note:
-	            // `stat` returns info about the target of a symlink (or symlink chain)
-	            // `lstat` returns info about a symlink itself
-	            let stats;
-	            if (options.followSymbolicLinks) {
-	                try {
-	                    // Use `stat` (following symlinks)
-	                    stats = yield fs.promises.stat(item.path);
-	                }
-	                catch (err) {
-	                    if (err.code === 'ENOENT') {
-	                        if (options.omitBrokenSymbolicLinks) {
-	                            core.debug(`Broken symlink '${item.path}'`);
-	                            return undefined;
-	                        }
-	                        throw new Error(`No information found for the path '${item.path}'. This may indicate a broken symbolic link.`);
-	                    }
-	                    throw err;
-	                }
-	            }
-	            else {
-	                // Use `lstat` (not following symlinks)
-	                stats = yield fs.promises.lstat(item.path);
-	            }
-	            // Note, isDirectory() returns false for the lstat of a symlink
-	            if (stats.isDirectory() && options.followSymbolicLinks) {
-	                // Get the realpath
-	                const realPath = yield fs.promises.realpath(item.path);
-	                // Fixup the traversal chain to match the item level
-	                while (traversalChain.length >= item.level) {
-	                    traversalChain.pop();
-	                }
-	                // Test for a cycle
-	                if (traversalChain.some((x) => x === realPath)) {
-	                    core.debug(`Symlink cycle detected for path '${item.path}' and realpath '${realPath}'`);
-	                    return undefined;
-	                }
-	                // Update the traversal chain
-	                traversalChain.push(realPath);
-	            }
-	            return stats;
-	        });
-	    }
-	}
-	internalGlobber.DefaultGlobber = DefaultGlobber;
-	
-	return internalGlobber;
-}
-
-var internalHashFiles = {};
-
-var hasRequiredInternalHashFiles;
-
-function requireInternalHashFiles () {
-	if (hasRequiredInternalHashFiles) return internalHashFiles;
-	hasRequiredInternalHashFiles = 1;
-	var __createBinding = (internalHashFiles && internalHashFiles.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (internalHashFiles && internalHashFiles.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (internalHashFiles && internalHashFiles.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (internalHashFiles && internalHashFiles.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	var __asyncValues = (internalHashFiles && internalHashFiles.__asyncValues) || function (o) {
-	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-	    var m = o[Symbol.asyncIterator], i;
-	    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
-	    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
-	    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
-	};
-	Object.defineProperty(internalHashFiles, "__esModule", { value: true });
-	internalHashFiles.hashFiles = void 0;
-	const crypto = __importStar(require$$0$4);
-	const core = __importStar(requireCore$1());
-	const fs = __importStar(require$$1__default);
-	const stream = __importStar(require$$0$a);
-	const util = __importStar(require$$0$6);
-	const path = __importStar(require$$1$6);
-	function hashFiles(globber, currentWorkspace, verbose = false) {
-	    var _a, e_1, _b, _c;
-	    var _d;
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const writeDelegate = verbose ? core.info : core.debug;
-	        let hasMatch = false;
-	        const githubWorkspace = currentWorkspace
-	            ? currentWorkspace
-	            : (_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd();
-	        const result = crypto.createHash('sha256');
-	        let count = 0;
-	        try {
-	            for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
-	                _c = _g.value;
-	                _e = false;
-	                const file = _c;
-	                writeDelegate(file);
-	                if (!file.startsWith(`${githubWorkspace}${path.sep}`)) {
-	                    writeDelegate(`Ignore '${file}' since it is not under GITHUB_WORKSPACE.`);
-	                    continue;
-	                }
-	                if (fs.statSync(file).isDirectory()) {
-	                    writeDelegate(`Skip directory '${file}'.`);
-	                    continue;
-	                }
-	                const hash = crypto.createHash('sha256');
-	                const pipeline = util.promisify(stream.pipeline);
-	                yield pipeline(fs.createReadStream(file), hash);
-	                result.write(hash.digest());
-	                count++;
-	                if (!hasMatch) {
-	                    hasMatch = true;
-	                }
-	            }
-	        }
-	        catch (e_1_1) { e_1 = { error: e_1_1 }; }
-	        finally {
-	            try {
-	                if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);
-	            }
-	            finally { if (e_1) throw e_1.error; }
-	        }
-	        result.end();
-	        if (hasMatch) {
-	            writeDelegate(`Found ${count} files to hash.`);
-	            return result.digest('hex');
-	        }
-	        else {
-	            writeDelegate(`No matches found for glob`);
-	            return '';
-	        }
-	    });
-	}
-	internalHashFiles.hashFiles = hashFiles;
-	
-	return internalHashFiles;
-}
-
-var hasRequiredGlob;
-
-function requireGlob () {
-	if (hasRequiredGlob) return glob;
-	hasRequiredGlob = 1;
-	var __awaiter = (glob && glob.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(glob, "__esModule", { value: true });
-	glob.hashFiles = glob.create = void 0;
-	const internal_globber_1 = requireInternalGlobber();
-	const internal_hash_files_1 = requireInternalHashFiles();
-	/**
-	 * Constructs a globber
-	 *
-	 * @param patterns  Patterns separated by newlines
-	 * @param options   Glob options
-	 */
-	function create(patterns, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        return yield internal_globber_1.DefaultGlobber.create(patterns, options);
-	    });
-	}
-	glob.create = create;
-	/**
-	 * Computes the sha256 hash of a glob
-	 *
-	 * @param patterns  Patterns separated by newlines
-	 * @param currentWorkspace  Workspace used when matching files
-	 * @param options   Glob options
-	 * @param verbose   Enables verbose logging
-	 */
-	function hashFiles(patterns, currentWorkspace = '', options, verbose = false) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        let followSymbolicLinks = true;
-	        if (options && typeof options.followSymbolicLinks === 'boolean') {
-	            followSymbolicLinks = options.followSymbolicLinks;
-	        }
-	        const globber = yield create(patterns, { followSymbolicLinks });
-	        return (0, internal_hash_files_1.hashFiles)(globber, currentWorkspace, verbose);
-	    });
-	}
-	glob.hashFiles = hashFiles;
-	
-	return glob;
-}
-
-var semver$3 = {exports: {}};
-
-var hasRequiredSemver$3;
-
-function requireSemver$3 () {
-	if (hasRequiredSemver$3) return semver$3.exports;
-	hasRequiredSemver$3 = 1;
-	(function (module, exports$1) {
-		exports$1 = module.exports = SemVer;
-
-		var debug;
-		/* istanbul ignore next */
-		if (typeof process === 'object' &&
-		    process.env &&
-		    process.env.NODE_DEBUG &&
-		    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
-		  debug = function () {
-		    var args = Array.prototype.slice.call(arguments, 0);
-		    args.unshift('SEMVER');
-		    console.log.apply(console, args);
-		  };
-		} else {
-		  debug = function () {};
-		}
-
-		// Note: this is the semver.org version of the spec that it implements
-		// Not necessarily the package version of this code.
-		exports$1.SEMVER_SPEC_VERSION = '2.0.0';
-
-		var MAX_LENGTH = 256;
-		var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
-		  /* istanbul ignore next */ 9007199254740991;
-
-		// Max safe segment length for coercion.
-		var MAX_SAFE_COMPONENT_LENGTH = 16;
-
-		var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
-
-		// The actual regexps go on exports.re
-		var re = exports$1.re = [];
-		var safeRe = exports$1.safeRe = [];
-		var src = exports$1.src = [];
-		var t = exports$1.tokens = {};
-		var R = 0;
-
-		function tok (n) {
-		  t[n] = R++;
-		}
-
-		var LETTERDASHNUMBER = '[a-zA-Z0-9-]';
-
-		// Replace some greedy regex tokens to prevent regex dos issues. These regex are
-		// used internally via the safeRe object since all inputs in this library get
-		// normalized first to trim and collapse all extra whitespace. The original
-		// regexes are exported for userland consumption and lower level usage. A
-		// future breaking change could export the safer regex only with a note that
-		// all input should have extra whitespace removed.
-		var safeRegexReplacements = [
-		  ['\\s', 1],
-		  ['\\d', MAX_LENGTH],
-		  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
-		];
-
-		function makeSafeRe (value) {
-		  for (var i = 0; i < safeRegexReplacements.length; i++) {
-		    var token = safeRegexReplacements[i][0];
-		    var max = safeRegexReplacements[i][1];
-		    value = value
-		      .split(token + '*').join(token + '{0,' + max + '}')
-		      .split(token + '+').join(token + '{1,' + max + '}');
-		  }
-		  return value
-		}
-
-		// The following Regular Expressions can be used for tokenizing,
-		// validating, and parsing SemVer version strings.
-
-		// ## Numeric Identifier
-		// A single `0`, or a non-zero digit followed by zero or more digits.
-
-		tok('NUMERICIDENTIFIER');
-		src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*';
-		tok('NUMERICIDENTIFIERLOOSE');
-		src[t.NUMERICIDENTIFIERLOOSE] = '\\d+';
-
-		// ## Non-numeric Identifier
-		// Zero or more digits, followed by a letter or hyphen, and then zero or
-		// more letters, digits, or hyphens.
-
-		tok('NONNUMERICIDENTIFIER');
-		src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*';
-
-		// ## Main Version
-		// Three dot-separated numeric identifiers.
-
-		tok('MAINVERSION');
-		src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
-		                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
-		                   '(' + src[t.NUMERICIDENTIFIER] + ')';
-
-		tok('MAINVERSIONLOOSE');
-		src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
-		                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
-		                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')';
-
-		// ## Pre-release Version Identifier
-		// A numeric identifier, or a non-numeric identifier.
-
-		tok('PRERELEASEIDENTIFIER');
-		src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
-		                            '|' + src[t.NONNUMERICIDENTIFIER] + ')';
-
-		tok('PRERELEASEIDENTIFIERLOOSE');
-		src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
-		                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')';
-
-		// ## Pre-release Version
-		// Hyphen, followed by one or more dot-separated pre-release version
-		// identifiers.
-
-		tok('PRERELEASE');
-		src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
-		                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))';
-
-		tok('PRERELEASELOOSE');
-		src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
-		                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))';
-
-		// ## Build Metadata Identifier
-		// Any combination of digits, letters, or hyphens.
-
-		tok('BUILDIDENTIFIER');
-		src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+';
-
-		// ## Build Metadata
-		// Plus sign, followed by one or more period-separated build metadata
-		// identifiers.
-
-		tok('BUILD');
-		src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] +
-		             '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))';
-
-		// ## Full Version String
-		// A main version, followed optionally by a pre-release version and
-		// build metadata.
-
-		// Note that the only major, minor, patch, and pre-release sections of
-		// the version string are capturing groups.  The build metadata is not a
-		// capturing group, because it should not ever be used in version
-		// comparison.
-
-		tok('FULL');
-		tok('FULLPLAIN');
-		src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
-		                  src[t.PRERELEASE] + '?' +
-		                  src[t.BUILD] + '?';
-
-		src[t.FULL] = '^' + src[t.FULLPLAIN] + '$';
-
-		// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
-		// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
-		// common in the npm registry.
-		tok('LOOSEPLAIN');
-		src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
-		                  src[t.PRERELEASELOOSE] + '?' +
-		                  src[t.BUILD] + '?';
-
-		tok('LOOSE');
-		src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$';
-
-		tok('GTLT');
-		src[t.GTLT] = '((?:<|>)?=?)';
-
-		// Something like "2.*" or "1.2.x".
-		// Note that "x.x" is a valid xRange identifer, meaning "any version"
-		// Only the first item is strictly required.
-		tok('XRANGEIDENTIFIERLOOSE');
-		src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
-		tok('XRANGEIDENTIFIER');
-		src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*';
-
-		tok('XRANGEPLAIN');
-		src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
-		                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
-		                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
-		                   '(?:' + src[t.PRERELEASE] + ')?' +
-		                   src[t.BUILD] + '?' +
-		                   ')?)?';
-
-		tok('XRANGEPLAINLOOSE');
-		src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
-		                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
-		                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
-		                        '(?:' + src[t.PRERELEASELOOSE] + ')?' +
-		                        src[t.BUILD] + '?' +
-		                        ')?)?';
-
-		tok('XRANGE');
-		src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$';
-		tok('XRANGELOOSE');
-		src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$';
-
-		// Coercion.
-		// Extract anything that could conceivably be a part of a valid semver
-		tok('COERCE');
-		src[t.COERCE] = '(^|[^\\d])' +
-		              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
-		              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
-		              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
-		              '(?:$|[^\\d])';
-		tok('COERCERTL');
-		re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g');
-		safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g');
-
-		// Tilde ranges.
-		// Meaning is "reasonably at or greater than"
-		tok('LONETILDE');
-		src[t.LONETILDE] = '(?:~>?)';
-
-		tok('TILDETRIM');
-		src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+';
-		re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g');
-		safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g');
-		var tildeTrimReplace = '$1~';
-
-		tok('TILDE');
-		src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$';
-		tok('TILDELOOSE');
-		src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$';
-
-		// Caret ranges.
-		// Meaning is "at least and backwards compatible with"
-		tok('LONECARET');
-		src[t.LONECARET] = '(?:\\^)';
-
-		tok('CARETTRIM');
-		src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+';
-		re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g');
-		safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g');
-		var caretTrimReplace = '$1^';
-
-		tok('CARET');
-		src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$';
-		tok('CARETLOOSE');
-		src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$';
-
-		// A simple gt/lt/eq thing, or just "" to indicate "any version"
-		tok('COMPARATORLOOSE');
-		src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$';
-		tok('COMPARATOR');
-		src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$';
-
-		// An expression to strip any whitespace between the gtlt and the thing
-		// it modifies, so that `> 1.2.3` ==> `>1.2.3`
-		tok('COMPARATORTRIM');
-		src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
-		                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')';
-
-		// this one has to use the /g flag
-		re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g');
-		safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g');
-		var comparatorTrimReplace = '$1$2$3';
-
-		// Something like `1.2.3 - 1.2.4`
-		// Note that these all use the loose form, because they'll be
-		// checked against either the strict or loose comparator form
-		// later.
-		tok('HYPHENRANGE');
-		src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
-		                   '\\s+-\\s+' +
-		                   '(' + src[t.XRANGEPLAIN] + ')' +
-		                   '\\s*$';
-
-		tok('HYPHENRANGELOOSE');
-		src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
-		                        '\\s+-\\s+' +
-		                        '(' + src[t.XRANGEPLAINLOOSE] + ')' +
-		                        '\\s*$';
-
-		// Star ranges basically just allow anything at all.
-		tok('STAR');
-		src[t.STAR] = '(<|>)?=?\\s*\\*';
-
-		// Compile to actual regexp objects.
-		// All are flag-free, unless they were created above with a flag.
-		for (var i = 0; i < R; i++) {
-		  debug(i, src[i]);
-		  if (!re[i]) {
-		    re[i] = new RegExp(src[i]);
-
-		    // Replace all greedy whitespace to prevent regex dos issues. These regex are
-		    // used internally via the safeRe object since all inputs in this library get
-		    // normalized first to trim and collapse all extra whitespace. The original
-		    // regexes are exported for userland consumption and lower level usage. A
-		    // future breaking change could export the safer regex only with a note that
-		    // all input should have extra whitespace removed.
-		    safeRe[i] = new RegExp(makeSafeRe(src[i]));
-		  }
-		}
-
-		exports$1.parse = parse;
-		function parse (version, options) {
-		  if (!options || typeof options !== 'object') {
-		    options = {
-		      loose: !!options,
-		      includePrerelease: false
-		    };
-		  }
-
-		  if (version instanceof SemVer) {
-		    return version
-		  }
-
-		  if (typeof version !== 'string') {
-		    return null
-		  }
-
-		  if (version.length > MAX_LENGTH) {
-		    return null
-		  }
-
-		  var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL];
-		  if (!r.test(version)) {
-		    return null
-		  }
-
-		  try {
-		    return new SemVer(version, options)
-		  } catch (er) {
-		    return null
-		  }
-		}
-
-		exports$1.valid = valid;
-		function valid (version, options) {
-		  var v = parse(version, options);
-		  return v ? v.version : null
-		}
-
-		exports$1.clean = clean;
-		function clean (version, options) {
-		  var s = parse(version.trim().replace(/^[=v]+/, ''), options);
-		  return s ? s.version : null
-		}
-
-		exports$1.SemVer = SemVer;
-
-		function SemVer (version, options) {
-		  if (!options || typeof options !== 'object') {
-		    options = {
-		      loose: !!options,
-		      includePrerelease: false
-		    };
-		  }
-		  if (version instanceof SemVer) {
-		    if (version.loose === options.loose) {
-		      return version
-		    } else {
-		      version = version.version;
-		    }
-		  } else if (typeof version !== 'string') {
-		    throw new TypeError('Invalid Version: ' + version)
-		  }
-
-		  if (version.length > MAX_LENGTH) {
-		    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
-		  }
-
-		  if (!(this instanceof SemVer)) {
-		    return new SemVer(version, options)
-		  }
-
-		  debug('SemVer', version, options);
-		  this.options = options;
-		  this.loose = !!options.loose;
-
-		  var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]);
-
-		  if (!m) {
-		    throw new TypeError('Invalid Version: ' + version)
-		  }
-
-		  this.raw = version;
-
-		  // these are actually numbers
-		  this.major = +m[1];
-		  this.minor = +m[2];
-		  this.patch = +m[3];
-
-		  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
-		    throw new TypeError('Invalid major version')
-		  }
-
-		  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
-		    throw new TypeError('Invalid minor version')
-		  }
-
-		  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
-		    throw new TypeError('Invalid patch version')
-		  }
-
-		  // numberify any prerelease numeric ids
-		  if (!m[4]) {
-		    this.prerelease = [];
-		  } else {
-		    this.prerelease = m[4].split('.').map(function (id) {
-		      if (/^[0-9]+$/.test(id)) {
-		        var num = +id;
-		        if (num >= 0 && num < MAX_SAFE_INTEGER) {
-		          return num
-		        }
-		      }
-		      return id
-		    });
-		  }
-
-		  this.build = m[5] ? m[5].split('.') : [];
-		  this.format();
-		}
-
-		SemVer.prototype.format = function () {
-		  this.version = this.major + '.' + this.minor + '.' + this.patch;
-		  if (this.prerelease.length) {
-		    this.version += '-' + this.prerelease.join('.');
-		  }
-		  return this.version
-		};
-
-		SemVer.prototype.toString = function () {
-		  return this.version
-		};
-
-		SemVer.prototype.compare = function (other) {
-		  debug('SemVer.compare', this.version, this.options, other);
-		  if (!(other instanceof SemVer)) {
-		    other = new SemVer(other, this.options);
-		  }
-
-		  return this.compareMain(other) || this.comparePre(other)
-		};
-
-		SemVer.prototype.compareMain = function (other) {
-		  if (!(other instanceof SemVer)) {
-		    other = new SemVer(other, this.options);
-		  }
-
-		  return compareIdentifiers(this.major, other.major) ||
-		         compareIdentifiers(this.minor, other.minor) ||
-		         compareIdentifiers(this.patch, other.patch)
-		};
-
-		SemVer.prototype.comparePre = function (other) {
-		  if (!(other instanceof SemVer)) {
-		    other = new SemVer(other, this.options);
-		  }
-
-		  // NOT having a prerelease is > having one
-		  if (this.prerelease.length && !other.prerelease.length) {
-		    return -1
-		  } else if (!this.prerelease.length && other.prerelease.length) {
-		    return 1
-		  } else if (!this.prerelease.length && !other.prerelease.length) {
-		    return 0
-		  }
-
-		  var i = 0;
-		  do {
-		    var a = this.prerelease[i];
-		    var b = other.prerelease[i];
-		    debug('prerelease compare', i, a, b);
-		    if (a === undefined && b === undefined) {
-		      return 0
-		    } else if (b === undefined) {
-		      return 1
-		    } else if (a === undefined) {
-		      return -1
-		    } else if (a === b) {
-		      continue
-		    } else {
-		      return compareIdentifiers(a, b)
-		    }
-		  } while (++i)
-		};
-
-		SemVer.prototype.compareBuild = function (other) {
-		  if (!(other instanceof SemVer)) {
-		    other = new SemVer(other, this.options);
-		  }
-
-		  var i = 0;
-		  do {
-		    var a = this.build[i];
-		    var b = other.build[i];
-		    debug('prerelease compare', i, a, b);
-		    if (a === undefined && b === undefined) {
-		      return 0
-		    } else if (b === undefined) {
-		      return 1
-		    } else if (a === undefined) {
-		      return -1
-		    } else if (a === b) {
-		      continue
-		    } else {
-		      return compareIdentifiers(a, b)
-		    }
-		  } while (++i)
-		};
-
-		// preminor will bump the version up to the next minor release, and immediately
-		// down to pre-release. premajor and prepatch work the same way.
-		SemVer.prototype.inc = function (release, identifier) {
-		  switch (release) {
-		    case 'premajor':
-		      this.prerelease.length = 0;
-		      this.patch = 0;
-		      this.minor = 0;
-		      this.major++;
-		      this.inc('pre', identifier);
-		      break
-		    case 'preminor':
-		      this.prerelease.length = 0;
-		      this.patch = 0;
-		      this.minor++;
-		      this.inc('pre', identifier);
-		      break
-		    case 'prepatch':
-		      // If this is already a prerelease, it will bump to the next version
-		      // drop any prereleases that might already exist, since they are not
-		      // relevant at this point.
-		      this.prerelease.length = 0;
-		      this.inc('patch', identifier);
-		      this.inc('pre', identifier);
-		      break
-		    // If the input is a non-prerelease version, this acts the same as
-		    // prepatch.
-		    case 'prerelease':
-		      if (this.prerelease.length === 0) {
-		        this.inc('patch', identifier);
-		      }
-		      this.inc('pre', identifier);
-		      break
-
-		    case 'major':
-		      // If this is a pre-major version, bump up to the same major version.
-		      // Otherwise increment major.
-		      // 1.0.0-5 bumps to 1.0.0
-		      // 1.1.0 bumps to 2.0.0
-		      if (this.minor !== 0 ||
-		          this.patch !== 0 ||
-		          this.prerelease.length === 0) {
-		        this.major++;
-		      }
-		      this.minor = 0;
-		      this.patch = 0;
-		      this.prerelease = [];
-		      break
-		    case 'minor':
-		      // If this is a pre-minor version, bump up to the same minor version.
-		      // Otherwise increment minor.
-		      // 1.2.0-5 bumps to 1.2.0
-		      // 1.2.1 bumps to 1.3.0
-		      if (this.patch !== 0 || this.prerelease.length === 0) {
-		        this.minor++;
-		      }
-		      this.patch = 0;
-		      this.prerelease = [];
-		      break
-		    case 'patch':
-		      // If this is not a pre-release version, it will increment the patch.
-		      // If it is a pre-release it will bump up to the same patch version.
-		      // 1.2.0-5 patches to 1.2.0
-		      // 1.2.0 patches to 1.2.1
-		      if (this.prerelease.length === 0) {
-		        this.patch++;
-		      }
-		      this.prerelease = [];
-		      break
-		    // This probably shouldn't be used publicly.
-		    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
-		    case 'pre':
-		      if (this.prerelease.length === 0) {
-		        this.prerelease = [0];
-		      } else {
-		        var i = this.prerelease.length;
-		        while (--i >= 0) {
-		          if (typeof this.prerelease[i] === 'number') {
-		            this.prerelease[i]++;
-		            i = -2;
-		          }
-		        }
-		        if (i === -1) {
-		          // didn't increment anything
-		          this.prerelease.push(0);
-		        }
-		      }
-		      if (identifier) {
-		        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
-		        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
-		        if (this.prerelease[0] === identifier) {
-		          if (isNaN(this.prerelease[1])) {
-		            this.prerelease = [identifier, 0];
-		          }
-		        } else {
-		          this.prerelease = [identifier, 0];
-		        }
-		      }
-		      break
-
-		    default:
-		      throw new Error('invalid increment argument: ' + release)
-		  }
-		  this.format();
-		  this.raw = this.version;
-		  return this
-		};
-
-		exports$1.inc = inc;
-		function inc (version, release, loose, identifier) {
-		  if (typeof (loose) === 'string') {
-		    identifier = loose;
-		    loose = undefined;
-		  }
-
-		  try {
-		    return new SemVer(version, loose).inc(release, identifier).version
-		  } catch (er) {
-		    return null
-		  }
-		}
-
-		exports$1.diff = diff;
-		function diff (version1, version2) {
-		  if (eq(version1, version2)) {
-		    return null
-		  } else {
-		    var v1 = parse(version1);
-		    var v2 = parse(version2);
-		    var prefix = '';
-		    if (v1.prerelease.length || v2.prerelease.length) {
-		      prefix = 'pre';
-		      var defaultResult = 'prerelease';
-		    }
-		    for (var key in v1) {
-		      if (key === 'major' || key === 'minor' || key === 'patch') {
-		        if (v1[key] !== v2[key]) {
-		          return prefix + key
-		        }
-		      }
-		    }
-		    return defaultResult // may be undefined
-		  }
-		}
-
-		exports$1.compareIdentifiers = compareIdentifiers;
-
-		var numeric = /^[0-9]+$/;
-		function compareIdentifiers (a, b) {
-		  var anum = numeric.test(a);
-		  var bnum = numeric.test(b);
-
-		  if (anum && bnum) {
-		    a = +a;
-		    b = +b;
-		  }
-
-		  return a === b ? 0
-		    : (anum && !bnum) ? -1
-		    : (bnum && !anum) ? 1
-		    : a < b ? -1
-		    : 1
-		}
-
-		exports$1.rcompareIdentifiers = rcompareIdentifiers;
-		function rcompareIdentifiers (a, b) {
-		  return compareIdentifiers(b, a)
-		}
-
-		exports$1.major = major;
-		function major (a, loose) {
-		  return new SemVer(a, loose).major
-		}
-
-		exports$1.minor = minor;
-		function minor (a, loose) {
-		  return new SemVer(a, loose).minor
-		}
-
-		exports$1.patch = patch;
-		function patch (a, loose) {
-		  return new SemVer(a, loose).patch
-		}
-
-		exports$1.compare = compare;
-		function compare (a, b, loose) {
-		  return new SemVer(a, loose).compare(new SemVer(b, loose))
-		}
-
-		exports$1.compareLoose = compareLoose;
-		function compareLoose (a, b) {
-		  return compare(a, b, true)
-		}
-
-		exports$1.compareBuild = compareBuild;
-		function compareBuild (a, b, loose) {
-		  var versionA = new SemVer(a, loose);
-		  var versionB = new SemVer(b, loose);
-		  return versionA.compare(versionB) || versionA.compareBuild(versionB)
-		}
-
-		exports$1.rcompare = rcompare;
-		function rcompare (a, b, loose) {
-		  return compare(b, a, loose)
-		}
-
-		exports$1.sort = sort;
-		function sort (list, loose) {
-		  return list.sort(function (a, b) {
-		    return exports$1.compareBuild(a, b, loose)
-		  })
-		}
-
-		exports$1.rsort = rsort;
-		function rsort (list, loose) {
-		  return list.sort(function (a, b) {
-		    return exports$1.compareBuild(b, a, loose)
-		  })
-		}
-
-		exports$1.gt = gt;
-		function gt (a, b, loose) {
-		  return compare(a, b, loose) > 0
-		}
-
-		exports$1.lt = lt;
-		function lt (a, b, loose) {
-		  return compare(a, b, loose) < 0
-		}
-
-		exports$1.eq = eq;
-		function eq (a, b, loose) {
-		  return compare(a, b, loose) === 0
-		}
-
-		exports$1.neq = neq;
-		function neq (a, b, loose) {
-		  return compare(a, b, loose) !== 0
-		}
-
-		exports$1.gte = gte;
-		function gte (a, b, loose) {
-		  return compare(a, b, loose) >= 0
-		}
-
-		exports$1.lte = lte;
-		function lte (a, b, loose) {
-		  return compare(a, b, loose) <= 0
-		}
-
-		exports$1.cmp = cmp;
-		function cmp (a, op, b, loose) {
-		  switch (op) {
-		    case '===':
-		      if (typeof a === 'object')
-		        a = a.version;
-		      if (typeof b === 'object')
-		        b = b.version;
-		      return a === b
-
-		    case '!==':
-		      if (typeof a === 'object')
-		        a = a.version;
-		      if (typeof b === 'object')
-		        b = b.version;
-		      return a !== b
-
-		    case '':
-		    case '=':
-		    case '==':
-		      return eq(a, b, loose)
-
-		    case '!=':
-		      return neq(a, b, loose)
-
-		    case '>':
-		      return gt(a, b, loose)
-
-		    case '>=':
-		      return gte(a, b, loose)
-
-		    case '<':
-		      return lt(a, b, loose)
-
-		    case '<=':
-		      return lte(a, b, loose)
-
-		    default:
-		      throw new TypeError('Invalid operator: ' + op)
-		  }
-		}
-
-		exports$1.Comparator = Comparator;
-		function Comparator (comp, options) {
-		  if (!options || typeof options !== 'object') {
-		    options = {
-		      loose: !!options,
-		      includePrerelease: false
-		    };
-		  }
-
-		  if (comp instanceof Comparator) {
-		    if (comp.loose === !!options.loose) {
-		      return comp
-		    } else {
-		      comp = comp.value;
-		    }
-		  }
-
-		  if (!(this instanceof Comparator)) {
-		    return new Comparator(comp, options)
-		  }
-
-		  comp = comp.trim().split(/\s+/).join(' ');
-		  debug('comparator', comp, options);
-		  this.options = options;
-		  this.loose = !!options.loose;
-		  this.parse(comp);
-
-		  if (this.semver === ANY) {
-		    this.value = '';
-		  } else {
-		    this.value = this.operator + this.semver.version;
-		  }
-
-		  debug('comp', this);
-		}
-
-		var ANY = {};
-		Comparator.prototype.parse = function (comp) {
-		  var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR];
-		  var m = comp.match(r);
-
-		  if (!m) {
-		    throw new TypeError('Invalid comparator: ' + comp)
-		  }
-
-		  this.operator = m[1] !== undefined ? m[1] : '';
-		  if (this.operator === '=') {
-		    this.operator = '';
-		  }
-
-		  // if it literally is just '>' or '' then allow anything.
-		  if (!m[2]) {
-		    this.semver = ANY;
-		  } else {
-		    this.semver = new SemVer(m[2], this.options.loose);
-		  }
-		};
-
-		Comparator.prototype.toString = function () {
-		  return this.value
-		};
-
-		Comparator.prototype.test = function (version) {
-		  debug('Comparator.test', version, this.options.loose);
-
-		  if (this.semver === ANY || version === ANY) {
-		    return true
-		  }
-
-		  if (typeof version === 'string') {
-		    try {
-		      version = new SemVer(version, this.options);
-		    } catch (er) {
-		      return false
-		    }
-		  }
-
-		  return cmp(version, this.operator, this.semver, this.options)
-		};
-
-		Comparator.prototype.intersects = function (comp, options) {
-		  if (!(comp instanceof Comparator)) {
-		    throw new TypeError('a Comparator is required')
-		  }
-
-		  if (!options || typeof options !== 'object') {
-		    options = {
-		      loose: !!options,
-		      includePrerelease: false
-		    };
-		  }
-
-		  var rangeTmp;
-
-		  if (this.operator === '') {
-		    if (this.value === '') {
-		      return true
-		    }
-		    rangeTmp = new Range(comp.value, options);
-		    return satisfies(this.value, rangeTmp, options)
-		  } else if (comp.operator === '') {
-		    if (comp.value === '') {
-		      return true
-		    }
-		    rangeTmp = new Range(this.value, options);
-		    return satisfies(comp.semver, rangeTmp, options)
-		  }
-
-		  var sameDirectionIncreasing =
-		    (this.operator === '>=' || this.operator === '>') &&
-		    (comp.operator === '>=' || comp.operator === '>');
-		  var sameDirectionDecreasing =
-		    (this.operator === '<=' || this.operator === '<') &&
-		    (comp.operator === '<=' || comp.operator === '<');
-		  var sameSemVer = this.semver.version === comp.semver.version;
-		  var differentDirectionsInclusive =
-		    (this.operator === '>=' || this.operator === '<=') &&
-		    (comp.operator === '>=' || comp.operator === '<=');
-		  var oppositeDirectionsLessThan =
-		    cmp(this.semver, '<', comp.semver, options) &&
-		    ((this.operator === '>=' || this.operator === '>') &&
-		    (comp.operator === '<=' || comp.operator === '<'));
-		  var oppositeDirectionsGreaterThan =
-		    cmp(this.semver, '>', comp.semver, options) &&
-		    ((this.operator === '<=' || this.operator === '<') &&
-		    (comp.operator === '>=' || comp.operator === '>'));
-
-		  return sameDirectionIncreasing || sameDirectionDecreasing ||
-		    (sameSemVer && differentDirectionsInclusive) ||
-		    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
-		};
-
-		exports$1.Range = Range;
-		function Range (range, options) {
-		  if (!options || typeof options !== 'object') {
-		    options = {
-		      loose: !!options,
-		      includePrerelease: false
-		    };
-		  }
-
-		  if (range instanceof Range) {
-		    if (range.loose === !!options.loose &&
-		        range.includePrerelease === !!options.includePrerelease) {
-		      return range
-		    } else {
-		      return new Range(range.raw, options)
-		    }
-		  }
-
-		  if (range instanceof Comparator) {
-		    return new Range(range.value, options)
-		  }
-
-		  if (!(this instanceof Range)) {
-		    return new Range(range, options)
-		  }
-
-		  this.options = options;
-		  this.loose = !!options.loose;
-		  this.includePrerelease = !!options.includePrerelease;
-
-		  // First reduce all whitespace as much as possible so we do not have to rely
-		  // on potentially slow regexes like \s*. This is then stored and used for
-		  // future error messages as well.
-		  this.raw = range
-		    .trim()
-		    .split(/\s+/)
-		    .join(' ');
-
-		  // First, split based on boolean or ||
-		  this.set = this.raw.split('||').map(function (range) {
-		    return this.parseRange(range.trim())
-		  }, this).filter(function (c) {
-		    // throw out any that are not relevant for whatever reason
-		    return c.length
-		  });
-
-		  if (!this.set.length) {
-		    throw new TypeError('Invalid SemVer Range: ' + this.raw)
-		  }
-
-		  this.format();
-		}
-
-		Range.prototype.format = function () {
-		  this.range = this.set.map(function (comps) {
-		    return comps.join(' ').trim()
-		  }).join('||').trim();
-		  return this.range
-		};
-
-		Range.prototype.toString = function () {
-		  return this.range
-		};
-
-		Range.prototype.parseRange = function (range) {
-		  var loose = this.options.loose;
-		  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
-		  var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE];
-		  range = range.replace(hr, hyphenReplace);
-		  debug('hyphen replace', range);
-		  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
-		  range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace);
-		  debug('comparator trim', range, safeRe[t.COMPARATORTRIM]);
-
-		  // `~ 1.2.3` => `~1.2.3`
-		  range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace);
-
-		  // `^ 1.2.3` => `^1.2.3`
-		  range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace);
-
-		  // normalize spaces
-		  range = range.split(/\s+/).join(' ');
-
-		  // At this point, the range is completely trimmed and
-		  // ready to be split into comparators.
-
-		  var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR];
-		  var set = range.split(' ').map(function (comp) {
-		    return parseComparator(comp, this.options)
-		  }, this).join(' ').split(/\s+/);
-		  if (this.options.loose) {
-		    // in loose mode, throw out any that are not valid comparators
-		    set = set.filter(function (comp) {
-		      return !!comp.match(compRe)
-		    });
-		  }
-		  set = set.map(function (comp) {
-		    return new Comparator(comp, this.options)
-		  }, this);
-
-		  return set
-		};
-
-		Range.prototype.intersects = function (range, options) {
-		  if (!(range instanceof Range)) {
-		    throw new TypeError('a Range is required')
-		  }
-
-		  return this.set.some(function (thisComparators) {
-		    return (
-		      isSatisfiable(thisComparators, options) &&
-		      range.set.some(function (rangeComparators) {
-		        return (
-		          isSatisfiable(rangeComparators, options) &&
-		          thisComparators.every(function (thisComparator) {
-		            return rangeComparators.every(function (rangeComparator) {
-		              return thisComparator.intersects(rangeComparator, options)
-		            })
-		          })
-		        )
-		      })
-		    )
-		  })
-		};
-
-		// take a set of comparators and determine whether there
-		// exists a version which can satisfy it
-		function isSatisfiable (comparators, options) {
-		  var result = true;
-		  var remainingComparators = comparators.slice();
-		  var testComparator = remainingComparators.pop();
-
-		  while (result && remainingComparators.length) {
-		    result = remainingComparators.every(function (otherComparator) {
-		      return testComparator.intersects(otherComparator, options)
-		    });
-
-		    testComparator = remainingComparators.pop();
-		  }
-
-		  return result
-		}
-
-		// Mostly just for testing and legacy API reasons
-		exports$1.toComparators = toComparators;
-		function toComparators (range, options) {
-		  return new Range(range, options).set.map(function (comp) {
-		    return comp.map(function (c) {
-		      return c.value
-		    }).join(' ').trim().split(' ')
-		  })
-		}
-
-		// comprised of xranges, tildes, stars, and gtlt's at this point.
-		// already replaced the hyphen ranges
-		// turn into a set of JUST comparators.
-		function parseComparator (comp, options) {
-		  debug('comp', comp, options);
-		  comp = replaceCarets(comp, options);
-		  debug('caret', comp);
-		  comp = replaceTildes(comp, options);
-		  debug('tildes', comp);
-		  comp = replaceXRanges(comp, options);
-		  debug('xrange', comp);
-		  comp = replaceStars(comp, options);
-		  debug('stars', comp);
-		  return comp
-		}
-
-		function isX (id) {
-		  return !id || id.toLowerCase() === 'x' || id === '*'
-		}
-
-		// ~, ~> --> * (any, kinda silly)
-		// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
-		// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
-		// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
-		// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
-		// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
-		function replaceTildes (comp, options) {
-		  return comp.trim().split(/\s+/).map(function (comp) {
-		    return replaceTilde(comp, options)
-		  }).join(' ')
-		}
-
-		function replaceTilde (comp, options) {
-		  var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE];
-		  return comp.replace(r, function (_, M, m, p, pr) {
-		    debug('tilde', comp, _, M, m, p, pr);
-		    var ret;
-
-		    if (isX(M)) {
-		      ret = '';
-		    } else if (isX(m)) {
-		      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-		    } else if (isX(p)) {
-		      // ~1.2 == >=1.2.0 <1.3.0
-		      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-		    } else if (pr) {
-		      debug('replaceTilde pr', pr);
-		      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
-		            ' <' + M + '.' + (+m + 1) + '.0';
-		    } else {
-		      // ~1.2.3 == >=1.2.3 <1.3.0
-		      ret = '>=' + M + '.' + m + '.' + p +
-		            ' <' + M + '.' + (+m + 1) + '.0';
-		    }
-
-		    debug('tilde return', ret);
-		    return ret
-		  })
-		}
-
-		// ^ --> * (any, kinda silly)
-		// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
-		// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
-		// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
-		// ^1.2.3 --> >=1.2.3 <2.0.0
-		// ^1.2.0 --> >=1.2.0 <2.0.0
-		function replaceCarets (comp, options) {
-		  return comp.trim().split(/\s+/).map(function (comp) {
-		    return replaceCaret(comp, options)
-		  }).join(' ')
-		}
-
-		function replaceCaret (comp, options) {
-		  debug('caret', comp, options);
-		  var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET];
-		  return comp.replace(r, function (_, M, m, p, pr) {
-		    debug('caret', comp, _, M, m, p, pr);
-		    var ret;
-
-		    if (isX(M)) {
-		      ret = '';
-		    } else if (isX(m)) {
-		      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-		    } else if (isX(p)) {
-		      if (M === '0') {
-		        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-		      } else {
-		        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
-		      }
-		    } else if (pr) {
-		      debug('replaceCaret pr', pr);
-		      if (M === '0') {
-		        if (m === '0') {
-		          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
-		                ' <' + M + '.' + m + '.' + (+p + 1);
-		        } else {
-		          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
-		                ' <' + M + '.' + (+m + 1) + '.0';
-		        }
-		      } else {
-		        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
-		              ' <' + (+M + 1) + '.0.0';
-		      }
-		    } else {
-		      debug('no pr');
-		      if (M === '0') {
-		        if (m === '0') {
-		          ret = '>=' + M + '.' + m + '.' + p +
-		                ' <' + M + '.' + m + '.' + (+p + 1);
-		        } else {
-		          ret = '>=' + M + '.' + m + '.' + p +
-		                ' <' + M + '.' + (+m + 1) + '.0';
-		        }
-		      } else {
-		        ret = '>=' + M + '.' + m + '.' + p +
-		              ' <' + (+M + 1) + '.0.0';
-		      }
-		    }
-
-		    debug('caret return', ret);
-		    return ret
-		  })
-		}
-
-		function replaceXRanges (comp, options) {
-		  debug('replaceXRanges', comp, options);
-		  return comp.split(/\s+/).map(function (comp) {
-		    return replaceXRange(comp, options)
-		  }).join(' ')
-		}
-
-		function replaceXRange (comp, options) {
-		  comp = comp.trim();
-		  var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE];
-		  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
-		    debug('xRange', comp, ret, gtlt, M, m, p, pr);
-		    var xM = isX(M);
-		    var xm = xM || isX(m);
-		    var xp = xm || isX(p);
-		    var anyX = xp;
-
-		    if (gtlt === '=' && anyX) {
-		      gtlt = '';
-		    }
-
-		    // if we're including prereleases in the match, then we need
-		    // to fix this to -0, the lowest possible prerelease value
-		    pr = options.includePrerelease ? '-0' : '';
-
-		    if (xM) {
-		      if (gtlt === '>' || gtlt === '<') {
-		        // nothing is allowed
-		        ret = '<0.0.0-0';
-		      } else {
-		        // nothing is forbidden
-		        ret = '*';
-		      }
-		    } else if (gtlt && anyX) {
-		      // we know patch is an x, because we have any x at all.
-		      // replace X with 0
-		      if (xm) {
-		        m = 0;
-		      }
-		      p = 0;
-
-		      if (gtlt === '>') {
-		        // >1 => >=2.0.0
-		        // >1.2 => >=1.3.0
-		        // >1.2.3 => >= 1.2.4
-		        gtlt = '>=';
-		        if (xm) {
-		          M = +M + 1;
-		          m = 0;
-		          p = 0;
-		        } else {
-		          m = +m + 1;
-		          p = 0;
-		        }
-		      } else if (gtlt === '<=') {
-		        // <=0.7.x is actually <0.8.0, since any 0.7.x should
-		        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
-		        gtlt = '<';
-		        if (xm) {
-		          M = +M + 1;
-		        } else {
-		          m = +m + 1;
-		        }
-		      }
-
-		      ret = gtlt + M + '.' + m + '.' + p + pr;
-		    } else if (xm) {
-		      ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr;
-		    } else if (xp) {
-		      ret = '>=' + M + '.' + m + '.0' + pr +
-		        ' <' + M + '.' + (+m + 1) + '.0' + pr;
-		    }
-
-		    debug('xRange return', ret);
-
-		    return ret
-		  })
-		}
-
-		// Because * is AND-ed with everything else in the comparator,
-		// and '' means "any version", just remove the *s entirely.
-		function replaceStars (comp, options) {
-		  debug('replaceStars', comp, options);
-		  // Looseness is ignored here.  star is always as loose as it gets!
-		  return comp.trim().replace(safeRe[t.STAR], '')
-		}
-
-		// This function is passed to string.replace(re[t.HYPHENRANGE])
-		// M, m, patch, prerelease, build
-		// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
-		// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
-		// 1.2 - 3.4 => >=1.2.0 <3.5.0
-		function hyphenReplace ($0,
-		  from, fM, fm, fp, fpr, fb,
-		  to, tM, tm, tp, tpr, tb) {
-		  if (isX(fM)) {
-		    from = '';
-		  } else if (isX(fm)) {
-		    from = '>=' + fM + '.0.0';
-		  } else if (isX(fp)) {
-		    from = '>=' + fM + '.' + fm + '.0';
-		  } else {
-		    from = '>=' + from;
-		  }
-
-		  if (isX(tM)) {
-		    to = '';
-		  } else if (isX(tm)) {
-		    to = '<' + (+tM + 1) + '.0.0';
-		  } else if (isX(tp)) {
-		    to = '<' + tM + '.' + (+tm + 1) + '.0';
-		  } else if (tpr) {
-		    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
-		  } else {
-		    to = '<=' + to;
-		  }
-
-		  return (from + ' ' + to).trim()
-		}
-
-		// if ANY of the sets match ALL of its comparators, then pass
-		Range.prototype.test = function (version) {
-		  if (!version) {
-		    return false
-		  }
-
-		  if (typeof version === 'string') {
-		    try {
-		      version = new SemVer(version, this.options);
-		    } catch (er) {
-		      return false
-		    }
-		  }
-
-		  for (var i = 0; i < this.set.length; i++) {
-		    if (testSet(this.set[i], version, this.options)) {
-		      return true
-		    }
-		  }
-		  return false
-		};
-
-		function testSet (set, version, options) {
-		  for (var i = 0; i < set.length; i++) {
-		    if (!set[i].test(version)) {
-		      return false
-		    }
-		  }
-
-		  if (version.prerelease.length && !options.includePrerelease) {
-		    // Find the set of versions that are allowed to have prereleases
-		    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
-		    // That should allow `1.2.3-pr.2` to pass.
-		    // However, `1.2.4-alpha.notready` should NOT be allowed,
-		    // even though it's within the range set by the comparators.
-		    for (i = 0; i < set.length; i++) {
-		      debug(set[i].semver);
-		      if (set[i].semver === ANY) {
-		        continue
-		      }
-
-		      if (set[i].semver.prerelease.length > 0) {
-		        var allowed = set[i].semver;
-		        if (allowed.major === version.major &&
-		            allowed.minor === version.minor &&
-		            allowed.patch === version.patch) {
-		          return true
-		        }
-		      }
-		    }
-
-		    // Version has a -pre, but it's not one of the ones we like.
-		    return false
-		  }
-
-		  return true
-		}
-
-		exports$1.satisfies = satisfies;
-		function satisfies (version, range, options) {
-		  try {
-		    range = new Range(range, options);
-		  } catch (er) {
-		    return false
-		  }
-		  return range.test(version)
-		}
-
-		exports$1.maxSatisfying = maxSatisfying;
-		function maxSatisfying (versions, range, options) {
-		  var max = null;
-		  var maxSV = null;
-		  try {
-		    var rangeObj = new Range(range, options);
-		  } catch (er) {
-		    return null
-		  }
-		  versions.forEach(function (v) {
-		    if (rangeObj.test(v)) {
-		      // satisfies(v, range, options)
-		      if (!max || maxSV.compare(v) === -1) {
-		        // compare(max, v, true)
-		        max = v;
-		        maxSV = new SemVer(max, options);
-		      }
-		    }
-		  });
-		  return max
-		}
-
-		exports$1.minSatisfying = minSatisfying;
-		function minSatisfying (versions, range, options) {
-		  var min = null;
-		  var minSV = null;
-		  try {
-		    var rangeObj = new Range(range, options);
-		  } catch (er) {
-		    return null
-		  }
-		  versions.forEach(function (v) {
-		    if (rangeObj.test(v)) {
-		      // satisfies(v, range, options)
-		      if (!min || minSV.compare(v) === 1) {
-		        // compare(min, v, true)
-		        min = v;
-		        minSV = new SemVer(min, options);
-		      }
-		    }
-		  });
-		  return min
-		}
-
-		exports$1.minVersion = minVersion;
-		function minVersion (range, loose) {
-		  range = new Range(range, loose);
-
-		  var minver = new SemVer('0.0.0');
-		  if (range.test(minver)) {
-		    return minver
-		  }
-
-		  minver = new SemVer('0.0.0-0');
-		  if (range.test(minver)) {
-		    return minver
-		  }
-
-		  minver = null;
-		  for (var i = 0; i < range.set.length; ++i) {
-		    var comparators = range.set[i];
-
-		    comparators.forEach(function (comparator) {
-		      // Clone to avoid manipulating the comparator's semver object.
-		      var compver = new SemVer(comparator.semver.version);
-		      switch (comparator.operator) {
-		        case '>':
-		          if (compver.prerelease.length === 0) {
-		            compver.patch++;
-		          } else {
-		            compver.prerelease.push(0);
-		          }
-		          compver.raw = compver.format();
-		          /* fallthrough */
-		        case '':
-		        case '>=':
-		          if (!minver || gt(minver, compver)) {
-		            minver = compver;
-		          }
-		          break
-		        case '<':
-		        case '<=':
-		          /* Ignore maximum versions */
-		          break
-		        /* istanbul ignore next */
-		        default:
-		          throw new Error('Unexpected operation: ' + comparator.operator)
-		      }
-		    });
-		  }
-
-		  if (minver && range.test(minver)) {
-		    return minver
-		  }
-
-		  return null
-		}
-
-		exports$1.validRange = validRange;
-		function validRange (range, options) {
-		  try {
-		    // Return '*' instead of '' so that truthiness works.
-		    // This will throw if it's invalid anyway
-		    return new Range(range, options).range || '*'
-		  } catch (er) {
-		    return null
-		  }
-		}
-
-		// Determine if version is less than all the versions possible in the range
-		exports$1.ltr = ltr;
-		function ltr (version, range, options) {
-		  return outside(version, range, '<', options)
-		}
-
-		// Determine if version is greater than all the versions possible in the range.
-		exports$1.gtr = gtr;
-		function gtr (version, range, options) {
-		  return outside(version, range, '>', options)
-		}
-
-		exports$1.outside = outside;
-		function outside (version, range, hilo, options) {
-		  version = new SemVer(version, options);
-		  range = new Range(range, options);
-
-		  var gtfn, ltefn, ltfn, comp, ecomp;
-		  switch (hilo) {
-		    case '>':
-		      gtfn = gt;
-		      ltefn = lte;
-		      ltfn = lt;
-		      comp = '>';
-		      ecomp = '>=';
-		      break
-		    case '<':
-		      gtfn = lt;
-		      ltefn = gte;
-		      ltfn = gt;
-		      comp = '<';
-		      ecomp = '<=';
-		      break
-		    default:
-		      throw new TypeError('Must provide a hilo val of "<" or ">"')
-		  }
-
-		  // If it satisifes the range it is not outside
-		  if (satisfies(version, range, options)) {
-		    return false
-		  }
-
-		  // From now on, variable terms are as if we're in "gtr" mode.
-		  // but note that everything is flipped for the "ltr" function.
-
-		  for (var i = 0; i < range.set.length; ++i) {
-		    var comparators = range.set[i];
-
-		    var high = null;
-		    var low = null;
-
-		    comparators.forEach(function (comparator) {
-		      if (comparator.semver === ANY) {
-		        comparator = new Comparator('>=0.0.0');
-		      }
-		      high = high || comparator;
-		      low = low || comparator;
-		      if (gtfn(comparator.semver, high.semver, options)) {
-		        high = comparator;
-		      } else if (ltfn(comparator.semver, low.semver, options)) {
-		        low = comparator;
-		      }
-		    });
-
-		    // If the edge version comparator has a operator then our version
-		    // isn't outside it
-		    if (high.operator === comp || high.operator === ecomp) {
-		      return false
-		    }
-
-		    // If the lowest version comparator has an operator and our version
-		    // is less than it then it isn't higher than the range
-		    if ((!low.operator || low.operator === comp) &&
-		        ltefn(version, low.semver)) {
-		      return false
-		    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
-		      return false
-		    }
-		  }
-		  return true
-		}
-
-		exports$1.prerelease = prerelease;
-		function prerelease (version, options) {
-		  var parsed = parse(version, options);
-		  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
-		}
-
-		exports$1.intersects = intersects;
-		function intersects (r1, r2, options) {
-		  r1 = new Range(r1, options);
-		  r2 = new Range(r2, options);
-		  return r1.intersects(r2)
-		}
-
-		exports$1.coerce = coerce;
-		function coerce (version, options) {
-		  if (version instanceof SemVer) {
-		    return version
-		  }
-
-		  if (typeof version === 'number') {
-		    version = String(version);
-		  }
-
-		  if (typeof version !== 'string') {
-		    return null
-		  }
-
-		  options = options || {};
-
-		  var match = null;
-		  if (!options.rtl) {
-		    match = version.match(safeRe[t.COERCE]);
-		  } else {
-		    // Find the right-most coercible string that does not share
-		    // a terminus with a more left-ward coercible string.
-		    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
-		    //
-		    // Walk through the string checking with a /g regexp
-		    // Manually set the index so as to pick up overlapping matches.
-		    // Stop when we get a match that ends at the string end, since no
-		    // coercible string can be more right-ward without the same terminus.
-		    var next;
-		    while ((next = safeRe[t.COERCERTL].exec(version)) &&
-		      (!match || match.index + match[0].length !== version.length)
-		    ) {
-		      if (!match ||
-		          next.index + next[0].length !== match.index + match[0].length) {
-		        match = next;
-		      }
-		      safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length;
-		    }
-		    // leave it in a clean state
-		    safeRe[t.COERCERTL].lastIndex = -1;
-		  }
-
-		  if (match === null) {
-		    return null
-		  }
-
-		  return parse(match[2] +
-		    '.' + (match[3] || '0') +
-		    '.' + (match[4] || '0'), options)
-		} 
-	} (semver$3, semver$3.exports));
-	return semver$3.exports;
-}
-
-var constants$6 = {};
-
-var hasRequiredConstants$6;
-
-function requireConstants$6 () {
-	if (hasRequiredConstants$6) return constants$6;
-	hasRequiredConstants$6 = 1;
-	Object.defineProperty(constants$6, "__esModule", { value: true });
-	constants$6.CacheFileSizeLimit = constants$6.ManifestFilename = constants$6.TarFilename = constants$6.SystemTarPathOnWindows = constants$6.GnuTarPathOnWindows = constants$6.SocketTimeout = constants$6.DefaultRetryDelay = constants$6.DefaultRetryAttempts = constants$6.ArchiveToolType = constants$6.CompressionMethod = constants$6.CacheFilename = void 0;
-	var CacheFilename;
-	(function (CacheFilename) {
-	    CacheFilename["Gzip"] = "cache.tgz";
-	    CacheFilename["Zstd"] = "cache.tzst";
-	})(CacheFilename || (constants$6.CacheFilename = CacheFilename = {}));
-	var CompressionMethod;
-	(function (CompressionMethod) {
-	    CompressionMethod["Gzip"] = "gzip";
-	    // Long range mode was added to zstd in v1.3.2.
-	    // This enum is for earlier version of zstd that does not have --long support
-	    CompressionMethod["ZstdWithoutLong"] = "zstd-without-long";
-	    CompressionMethod["Zstd"] = "zstd";
-	})(CompressionMethod || (constants$6.CompressionMethod = CompressionMethod = {}));
-	var ArchiveToolType;
-	(function (ArchiveToolType) {
-	    ArchiveToolType["GNU"] = "gnu";
-	    ArchiveToolType["BSD"] = "bsd";
-	})(ArchiveToolType || (constants$6.ArchiveToolType = ArchiveToolType = {}));
-	// The default number of retry attempts.
-	constants$6.DefaultRetryAttempts = 2;
-	// The default delay in milliseconds between retry attempts.
-	constants$6.DefaultRetryDelay = 5000;
-	// Socket timeout in milliseconds during download.  If no traffic is received
-	// over the socket during this period, the socket is destroyed and the download
-	// is aborted.
-	constants$6.SocketTimeout = 5000;
-	// The default path of GNUtar on hosted Windows runners
-	constants$6.GnuTarPathOnWindows = `${process.env['PROGRAMFILES']}\\Git\\usr\\bin\\tar.exe`;
-	// The default path of BSDtar on hosted Windows runners
-	constants$6.SystemTarPathOnWindows = `${process.env['SYSTEMDRIVE']}\\Windows\\System32\\tar.exe`;
-	constants$6.TarFilename = 'cache.tar';
-	constants$6.ManifestFilename = 'manifest.txt';
-	constants$6.CacheFileSizeLimit = 10 * Math.pow(1024, 3); // 10GiB per repository
-	
-	return constants$6;
-}
-
-var hasRequiredCacheUtils;
-
-function requireCacheUtils () {
-	if (hasRequiredCacheUtils) return cacheUtils;
-	hasRequiredCacheUtils = 1;
-	var __createBinding = (cacheUtils && cacheUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (cacheUtils && cacheUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (cacheUtils && cacheUtils.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (cacheUtils && cacheUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	var __asyncValues = (cacheUtils && cacheUtils.__asyncValues) || function (o) {
-	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-	    var m = o[Symbol.asyncIterator], i;
-	    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
-	    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
-	    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
-	};
-	Object.defineProperty(cacheUtils, "__esModule", { value: true });
-	cacheUtils.createTempDirectory = createTempDirectory;
-	cacheUtils.getArchiveFileSizeInBytes = getArchiveFileSizeInBytes;
-	cacheUtils.resolvePaths = resolvePaths;
-	cacheUtils.unlinkFile = unlinkFile;
-	cacheUtils.getCompressionMethod = getCompressionMethod;
-	cacheUtils.getCacheFileName = getCacheFileName;
-	cacheUtils.getGnuTarPathOnWindows = getGnuTarPathOnWindows;
-	cacheUtils.assertDefined = assertDefined;
-	cacheUtils.getCacheVersion = getCacheVersion;
-	cacheUtils.getRuntimeToken = getRuntimeToken;
-	const core = __importStar(requireCore$2());
-	const exec = __importStar(requireExec$2());
-	const glob = __importStar(requireGlob());
-	const io = __importStar(requireIo$2());
-	const crypto = __importStar(require$$0$4);
-	const fs = __importStar(require$$1__default);
-	const path = __importStar(require$$1$6);
-	const semver = __importStar(requireSemver$3());
-	const util = __importStar(require$$0$6);
-	const constants_1 = requireConstants$6();
-	const versionSalt = '1.0';
-	// From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23
-	function createTempDirectory() {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const IS_WINDOWS = process.platform === 'win32';
-	        let tempDirectory = process.env['RUNNER_TEMP'] || '';
-	        if (!tempDirectory) {
-	            let baseLocation;
-	            if (IS_WINDOWS) {
-	                // On Windows use the USERPROFILE env variable
-	                baseLocation = process.env['USERPROFILE'] || 'C:\\';
-	            }
-	            else {
-	                if (process.platform === 'darwin') {
-	                    baseLocation = '/Users';
-	                }
-	                else {
-	                    baseLocation = '/home';
-	                }
-	            }
-	            tempDirectory = path.join(baseLocation, 'actions', 'temp');
-	        }
-	        const dest = path.join(tempDirectory, crypto.randomUUID());
-	        yield io.mkdirP(dest);
-	        return dest;
-	    });
-	}
-	function getArchiveFileSizeInBytes(filePath) {
-	    return fs.statSync(filePath).size;
-	}
-	function resolvePaths(patterns) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        var _a, e_1, _b, _c;
-	        var _d;
-	        const paths = [];
-	        const workspace = (_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd();
-	        const globber = yield glob.create(patterns.join('\n'), {
-	            implicitDescendants: false
-	        });
-	        try {
-	            for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
-	                _c = _g.value;
-	                _e = false;
-	                const file = _c;
-	                const relativeFile = path
-	                    .relative(workspace, file)
-	                    .replace(new RegExp(`\\${path.sep}`, 'g'), '/');
-	                core.debug(`Matched: ${relativeFile}`);
-	                // Paths are made relative so the tar entries are all relative to the root of the workspace.
-	                if (relativeFile === '') {
-	                    // path.relative returns empty string if workspace and file are equal
-	                    paths.push('.');
-	                }
-	                else {
-	                    paths.push(`${relativeFile}`);
-	                }
-	            }
-	        }
-	        catch (e_1_1) { e_1 = { error: e_1_1 }; }
-	        finally {
-	            try {
-	                if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);
-	            }
-	            finally { if (e_1) throw e_1.error; }
-	        }
-	        return paths;
-	    });
-	}
-	function unlinkFile(filePath) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        return util.promisify(fs.unlink)(filePath);
-	    });
-	}
-	function getVersion(app_1) {
-	    return __awaiter(this, arguments, void 0, function* (app, additionalArgs = []) {
-	        let versionOutput = '';
-	        additionalArgs.push('--version');
-	        core.debug(`Checking ${app} ${additionalArgs.join(' ')}`);
-	        try {
-	            yield exec.exec(`${app}`, additionalArgs, {
-	                ignoreReturnCode: true,
-	                silent: true,
-	                listeners: {
-	                    stdout: (data) => (versionOutput += data.toString()),
-	                    stderr: (data) => (versionOutput += data.toString())
-	                }
-	            });
-	        }
-	        catch (err) {
-	            core.debug(err.message);
-	        }
-	        versionOutput = versionOutput.trim();
-	        core.debug(versionOutput);
-	        return versionOutput;
-	    });
-	}
-	// Use zstandard if possible to maximize cache performance
-	function getCompressionMethod() {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const versionOutput = yield getVersion('zstd', ['--quiet']);
-	        const version = semver.clean(versionOutput);
-	        core.debug(`zstd version: ${version}`);
-	        if (versionOutput === '') {
-	            return constants_1.CompressionMethod.Gzip;
-	        }
-	        else {
-	            return constants_1.CompressionMethod.ZstdWithoutLong;
-	        }
-	    });
-	}
-	function getCacheFileName(compressionMethod) {
-	    return compressionMethod === constants_1.CompressionMethod.Gzip
-	        ? constants_1.CacheFilename.Gzip
-	        : constants_1.CacheFilename.Zstd;
-	}
-	function getGnuTarPathOnWindows() {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        if (fs.existsSync(constants_1.GnuTarPathOnWindows)) {
-	            return constants_1.GnuTarPathOnWindows;
-	        }
-	        const versionOutput = yield getVersion('tar');
-	        return versionOutput.toLowerCase().includes('gnu tar') ? io.which('tar') : '';
-	    });
-	}
-	function assertDefined(name, value) {
-	    if (value === undefined) {
-	        throw Error(`Expected ${name} but value was undefiend`);
-	    }
-	    return value;
-	}
-	function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) {
-	    // don't pass changes upstream
-	    const components = paths.slice();
-	    // Add compression method to cache version to restore
-	    // compressed cache as per compression method
-	    if (compressionMethod) {
-	        components.push(compressionMethod);
-	    }
-	    // Only check for windows platforms if enableCrossOsArchive is false
-	    if (process.platform === 'win32' && !enableCrossOsArchive) {
-	        components.push('windows-only');
-	    }
-	    // Add salt to cache version to support breaking changes in cache entry
-	    components.push(versionSalt);
-	    return crypto.createHash('sha256').update(components.join('|')).digest('hex');
-	}
-	function getRuntimeToken() {
-	    const token = process.env['ACTIONS_RUNTIME_TOKEN'];
-	    if (!token) {
-	        throw new Error('Unable to get the ACTIONS_RUNTIME_TOKEN env variable');
-	    }
-	    return token;
-	}
-	
-	return cacheUtils;
-}
-
-var cacheHttpClient = {};
-
-var uploadUtils = {};
-
-var commonjs$e = {};
-
-/******************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    if (typeof b !== "function" && b !== null)
-        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-function __rest(s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
-            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
-                t[p[i]] = s[p[i]];
-        }
-    return t;
-}
-
-function __decorate(decorators, target, key, desc) {
-    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
-    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
-    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
-    return c > 3 && r && Object.defineProperty(target, key, r), r;
-}
-
-function __param(paramIndex, decorator) {
-    return function (target, key) { decorator(target, key, paramIndex); }
-}
-
-function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
-    function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
-    var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
-    var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
-    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
-    var _, done = false;
-    for (var i = decorators.length - 1; i >= 0; i--) {
-        var context = {};
-        for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
-        for (var p in contextIn.access) context.access[p] = contextIn.access[p];
-        context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
-        var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
-        if (kind === "accessor") {
-            if (result === void 0) continue;
-            if (result === null || typeof result !== "object") throw new TypeError("Object expected");
-            if (_ = accept(result.get)) descriptor.get = _;
-            if (_ = accept(result.set)) descriptor.set = _;
-            if (_ = accept(result.init)) initializers.unshift(_);
-        }
-        else if (_ = accept(result)) {
-            if (kind === "field") initializers.unshift(_);
-            else descriptor[key] = _;
-        }
-    }
-    if (target) Object.defineProperty(target, contextIn.name, descriptor);
-    done = true;
-}
-function __runInitializers(thisArg, initializers, value) {
-    var useValue = arguments.length > 2;
-    for (var i = 0; i < initializers.length; i++) {
-        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
-    }
-    return useValue ? value : void 0;
-}
-function __propKey(x) {
-    return typeof x === "symbol" ? x : "".concat(x);
-}
-function __setFunctionName(f, name, prefix) {
-    if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
-    return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
-}
-function __metadata(metadataKey, metadataValue) {
-    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
-}
-
-function __awaiter$5(thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-}
-
-function __generator(thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
-    return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (g && (g = 0, op[0] && (_ = 0)), _) try {
-            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [op[0] & 2, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-}
-
-var __createBinding = Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    var desc = Object.getOwnPropertyDescriptor(m, k);
-    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-        desc = { enumerable: true, get: function() { return m[k]; } };
-    }
-    Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-});
-
-function __exportStar(m, o) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
-}
-
-function __values$1(o) {
-    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
-    if (m) return m.call(o);
-    if (o && typeof o.length === "number") return {
-        next: function () {
-            if (o && i >= o.length) o = void 0;
-            return { value: o && o[i++], done: !o };
-        }
-    };
-    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
-}
-
-function __read(o, n) {
-    var m = typeof Symbol === "function" && o[Symbol.iterator];
-    if (!m) return o;
-    var i = m.call(o), r, ar = [], e;
-    try {
-        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
-    }
-    catch (error) { e = { error: error }; }
-    finally {
-        try {
-            if (r && !r.done && (m = i["return"])) m.call(i);
-        }
-        finally { if (e) throw e.error; }
-    }
-    return ar;
-}
-
-/** @deprecated */
-function __spread() {
-    for (var ar = [], i = 0; i < arguments.length; i++)
-        ar = ar.concat(__read(arguments[i]));
-    return ar;
-}
-
-/** @deprecated */
-function __spreadArrays() {
-    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
-    for (var r = Array(s), k = 0, i = 0; i < il; i++)
-        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
-            r[k] = a[j];
-    return r;
-}
-
-function __spreadArray(to, from, pack) {
-    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
-        if (ar || !(i in from)) {
-            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
-            ar[i] = from[i];
-        }
-    }
-    return to.concat(ar || Array.prototype.slice.call(from));
-}
-
-function __await(v) {
-    return this instanceof __await ? (this.v = v, this) : new __await(v);
-}
-
-function __asyncGenerator(thisArg, _arguments, generator) {
-    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-    var g = generator.apply(thisArg, _arguments || []), i, q = [];
-    return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
-    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
-    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
-    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
-    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
-    function fulfill(value) { resume("next", value); }
-    function reject(value) { resume("throw", value); }
-    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
-}
-
-function __asyncDelegator(o) {
-    var i, p;
-    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
-    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
-}
-
-function __asyncValues(o) {
-    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-    var m = o[Symbol.asyncIterator], i;
-    return m ? m.call(o) : (o = typeof __values$1 === "function" ? __values$1(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
-    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
-    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
-}
-
-function __makeTemplateObject(cooked, raw) {
-    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
-    return cooked;
-}
-var __setModuleDefault = Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-};
-
-var ownKeys = function(o) {
-    ownKeys = Object.getOwnPropertyNames || function (o) {
-        var ar = [];
-        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-        return ar;
-    };
-    return ownKeys(o);
-};
-
-function __importStar(mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-    __setModuleDefault(result, mod);
-    return result;
-}
-
-function __importDefault(mod) {
-    return (mod && mod.__esModule) ? mod : { default: mod };
-}
-
-function __classPrivateFieldGet(receiver, state, kind, f) {
-    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
-    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
-    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
-}
-
-function __classPrivateFieldSet(receiver, state, value, kind, f) {
-    if (kind === "m") throw new TypeError("Private method is not writable");
-    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
-    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
-    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
-}
-
-function __classPrivateFieldIn(state, receiver) {
-    if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
-    return typeof state === "function" ? receiver === state : state.has(receiver);
-}
-
-function __addDisposableResource(env, value, async) {
-    if (value !== null && value !== void 0) {
-        if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
-        var dispose, inner;
-        if (async) {
-            if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
-            dispose = value[Symbol.asyncDispose];
-        }
-        if (dispose === void 0) {
-            if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
-            dispose = value[Symbol.dispose];
-            if (async) inner = dispose;
-        }
-        if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
-        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
-        env.stack.push({ value: value, dispose: dispose, async: async });
-    }
-    else if (async) {
-        env.stack.push({ async: true });
-    }
-    return value;
-
-}
-
-var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
-    var e = new Error(message);
-    return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
-};
-
-function __disposeResources(env) {
-    function fail(e) {
-        env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
-        env.hasError = true;
-    }
-    var r, s = 0;
-    function next() {
-        while (r = env.stack.pop()) {
-            try {
-                if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
-                if (r.dispose) {
-                    var result = r.dispose.call(r.value);
-                    if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
-                }
-                else s |= 1;
-            }
-            catch (e) {
-                fail(e);
-            }
-        }
-        if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
-        if (env.hasError) throw env.error;
-    }
-    return next();
-}
-
-function __rewriteRelativeImportExtension(path, preserveJsx) {
-    if (typeof path === "string" && /^\.\.?\//.test(path)) {
-        return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
-            return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
-        });
-    }
-    return path;
-}
-
-var tslib_es6 = {
-    __extends: __extends,
-    __assign: __assign,
-    __rest: __rest,
-    __decorate: __decorate,
-    __param: __param,
-    __esDecorate: __esDecorate,
-    __runInitializers: __runInitializers,
-    __propKey: __propKey,
-    __setFunctionName: __setFunctionName,
-    __metadata: __metadata,
-    __awaiter: __awaiter$5,
-    __generator: __generator,
-    __createBinding: __createBinding,
-    __exportStar: __exportStar,
-    __values: __values$1,
-    __read: __read,
-    __spread: __spread,
-    __spreadArrays: __spreadArrays,
-    __spreadArray: __spreadArray,
-    __await: __await,
-    __asyncGenerator: __asyncGenerator,
-    __asyncDelegator: __asyncDelegator,
-    __asyncValues: __asyncValues,
-    __makeTemplateObject: __makeTemplateObject,
-    __importStar: __importStar,
-    __importDefault: __importDefault,
-    __classPrivateFieldGet: __classPrivateFieldGet,
-    __classPrivateFieldSet: __classPrivateFieldSet,
-    __classPrivateFieldIn: __classPrivateFieldIn,
-    __addDisposableResource: __addDisposableResource,
-    __disposeResources: __disposeResources,
-    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
-};
-
-var tslib_es6$1 = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	__addDisposableResource: __addDisposableResource,
-	get __assign () { return __assign; },
-	__asyncDelegator: __asyncDelegator,
-	__asyncGenerator: __asyncGenerator,
-	__asyncValues: __asyncValues,
-	__await: __await,
-	__awaiter: __awaiter$5,
-	__classPrivateFieldGet: __classPrivateFieldGet,
-	__classPrivateFieldIn: __classPrivateFieldIn,
-	__classPrivateFieldSet: __classPrivateFieldSet,
-	__createBinding: __createBinding,
-	__decorate: __decorate,
-	__disposeResources: __disposeResources,
-	__esDecorate: __esDecorate,
-	__exportStar: __exportStar,
-	__extends: __extends,
-	__generator: __generator,
-	__importDefault: __importDefault,
-	__importStar: __importStar,
-	__makeTemplateObject: __makeTemplateObject,
-	__metadata: __metadata,
-	__param: __param,
-	__propKey: __propKey,
-	__read: __read,
-	__rest: __rest,
-	__rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
-	__runInitializers: __runInitializers,
-	__setFunctionName: __setFunctionName,
-	__spread: __spread,
-	__spreadArray: __spreadArray,
-	__spreadArrays: __spreadArrays,
-	__values: __values$1,
-	default: tslib_es6
-});
-
-var require$$0$2 = /*@__PURE__*/getAugmentedNamespace(tslib_es6$1);
-
-var commonjs$d = {};
-
-var pipeline$2 = {};
-
-var commonjs$c = {};
-
-var AbortError$4 = {};
-
-var hasRequiredAbortError$3;
-
-function requireAbortError$3 () {
-	if (hasRequiredAbortError$3) return AbortError$4;
-	hasRequiredAbortError$3 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AbortError$4, "__esModule", { value: true });
-	AbortError$4.AbortError = void 0;
-	/**
-	 * This error is thrown when an asynchronous operation has been aborted.
-	 * Check for this error by testing the `name` that the name property of the
-	 * error matches `"AbortError"`.
-	 *
-	 * @example
-	 * ```ts snippet:ReadmeSampleAbortError
-	 * import { AbortError } from "@typespec/ts-http-runtime";
-	 *
-	 * async function doAsyncWork(options: { abortSignal: AbortSignal }): Promise {
-	 *   if (options.abortSignal.aborted) {
-	 *     throw new AbortError();
-	 *   }
-	 *
-	 *   // do async work
-	 * }
-	 *
-	 * const controller = new AbortController();
-	 * controller.abort();
-	 *
-	 * try {
-	 *   doAsyncWork({ abortSignal: controller.signal });
-	 * } catch (e) {
-	 *   if (e instanceof Error && e.name === "AbortError") {
-	 *     // handle abort error here.
-	 *   }
-	 * }
-	 * ```
-	 */
-	class AbortError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = "AbortError";
-	    }
-	}
-	AbortError$4.AbortError = AbortError;
-	
-	return AbortError$4;
-}
-
-var logger$1 = {};
-
-var debug = {};
-
-var log$5 = {};
-
-var hasRequiredLog$5;
-
-function requireLog$5 () {
-	if (hasRequiredLog$5) return log$5;
-	hasRequiredLog$5 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(log$5, "__esModule", { value: true });
-	log$5.log = log;
-	const tslib_1 = require$$0$2;
-	const node_os_1 = require$$1$7;
-	const node_util_1 = tslib_1.__importDefault(require$$1$4);
-	const node_process_1 = tslib_1.__importDefault(require$$2$3);
-	function log(message, ...args) {
-	    node_process_1.default.stderr.write(`${node_util_1.default.format(message, ...args)}${node_os_1.EOL}`);
-	}
-	
-	return log$5;
-}
-
-var hasRequiredDebug$1;
-
-function requireDebug$1 () {
-	if (hasRequiredDebug$1) return debug;
-	hasRequiredDebug$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(debug, "__esModule", { value: true });
-	const log_js_1 = requireLog$5();
-	const debugEnvVariable = (typeof process !== "undefined" && process.env && process.env.DEBUG) || undefined;
-	let enabledString;
-	let enabledNamespaces = [];
-	let skippedNamespaces = [];
-	const debuggers = [];
-	if (debugEnvVariable) {
-	    enable(debugEnvVariable);
-	}
-	const debugObj = Object.assign((namespace) => {
-	    return createDebugger(namespace);
-	}, {
-	    enable,
-	    enabled,
-	    disable,
-	    log: log_js_1.log,
-	});
-	function enable(namespaces) {
-	    enabledString = namespaces;
-	    enabledNamespaces = [];
-	    skippedNamespaces = [];
-	    const namespaceList = namespaces.split(",").map((ns) => ns.trim());
-	    for (const ns of namespaceList) {
-	        if (ns.startsWith("-")) {
-	            skippedNamespaces.push(ns.substring(1));
-	        }
-	        else {
-	            enabledNamespaces.push(ns);
-	        }
-	    }
-	    for (const instance of debuggers) {
-	        instance.enabled = enabled(instance.namespace);
-	    }
-	}
-	function enabled(namespace) {
-	    if (namespace.endsWith("*")) {
-	        return true;
-	    }
-	    for (const skipped of skippedNamespaces) {
-	        if (namespaceMatches(namespace, skipped)) {
-	            return false;
-	        }
-	    }
-	    for (const enabledNamespace of enabledNamespaces) {
-	        if (namespaceMatches(namespace, enabledNamespace)) {
-	            return true;
-	        }
-	    }
-	    return false;
-	}
-	/**
-	 * Given a namespace, check if it matches a pattern.
-	 * Patterns only have a single wildcard character which is *.
-	 * The behavior of * is that it matches zero or more other characters.
-	 */
-	function namespaceMatches(namespace, patternToMatch) {
-	    // simple case, no pattern matching required
-	    if (patternToMatch.indexOf("*") === -1) {
-	        return namespace === patternToMatch;
-	    }
-	    let pattern = patternToMatch;
-	    // normalize successive * if needed
-	    if (patternToMatch.indexOf("**") !== -1) {
-	        const patternParts = [];
-	        let lastCharacter = "";
-	        for (const character of patternToMatch) {
-	            if (character === "*" && lastCharacter === "*") {
-	                continue;
-	            }
-	            else {
-	                lastCharacter = character;
-	                patternParts.push(character);
-	            }
-	        }
-	        pattern = patternParts.join("");
-	    }
-	    let namespaceIndex = 0;
-	    let patternIndex = 0;
-	    const patternLength = pattern.length;
-	    const namespaceLength = namespace.length;
-	    let lastWildcard = -1;
-	    let lastWildcardNamespace = -1;
-	    while (namespaceIndex < namespaceLength && patternIndex < patternLength) {
-	        if (pattern[patternIndex] === "*") {
-	            lastWildcard = patternIndex;
-	            patternIndex++;
-	            if (patternIndex === patternLength) {
-	                // if wildcard is the last character, it will match the remaining namespace string
-	                return true;
-	            }
-	            // now we let the wildcard eat characters until we match the next literal in the pattern
-	            while (namespace[namespaceIndex] !== pattern[patternIndex]) {
-	                namespaceIndex++;
-	                // reached the end of the namespace without a match
-	                if (namespaceIndex === namespaceLength) {
-	                    return false;
-	                }
-	            }
-	            // now that we have a match, let's try to continue on
-	            // however, it's possible we could find a later match
-	            // so keep a reference in case we have to backtrack
-	            lastWildcardNamespace = namespaceIndex;
-	            namespaceIndex++;
-	            patternIndex++;
-	            continue;
-	        }
-	        else if (pattern[patternIndex] === namespace[namespaceIndex]) {
-	            // simple case: literal pattern matches so keep going
-	            patternIndex++;
-	            namespaceIndex++;
-	        }
-	        else if (lastWildcard >= 0) {
-	            // special case: we don't have a literal match, but there is a previous wildcard
-	            // which we can backtrack to and try having the wildcard eat the match instead
-	            patternIndex = lastWildcard + 1;
-	            namespaceIndex = lastWildcardNamespace + 1;
-	            // we've reached the end of the namespace without a match
-	            if (namespaceIndex === namespaceLength) {
-	                return false;
-	            }
-	            // similar to the previous logic, let's keep going until we find the next literal match
-	            while (namespace[namespaceIndex] !== pattern[patternIndex]) {
-	                namespaceIndex++;
-	                if (namespaceIndex === namespaceLength) {
-	                    return false;
-	                }
-	            }
-	            lastWildcardNamespace = namespaceIndex;
-	            namespaceIndex++;
-	            patternIndex++;
-	            continue;
-	        }
-	        else {
-	            return false;
-	        }
-	    }
-	    const namespaceDone = namespaceIndex === namespace.length;
-	    const patternDone = patternIndex === pattern.length;
-	    // this is to detect the case of an unneeded final wildcard
-	    // e.g. the pattern `ab*` should match the string `ab`
-	    const trailingWildCard = patternIndex === pattern.length - 1 && pattern[patternIndex] === "*";
-	    return namespaceDone && (patternDone || trailingWildCard);
-	}
-	function disable() {
-	    const result = enabledString || "";
-	    enable("");
-	    return result;
-	}
-	function createDebugger(namespace) {
-	    const newDebugger = Object.assign(debug, {
-	        enabled: enabled(namespace),
-	        destroy,
-	        log: debugObj.log,
-	        namespace,
-	        extend,
-	    });
-	    function debug(...args) {
-	        if (!newDebugger.enabled) {
-	            return;
-	        }
-	        if (args.length > 0) {
-	            args[0] = `${namespace} ${args[0]}`;
-	        }
-	        newDebugger.log(...args);
-	    }
-	    debuggers.push(newDebugger);
-	    return newDebugger;
-	}
-	function destroy() {
-	    const index = debuggers.indexOf(this);
-	    if (index >= 0) {
-	        debuggers.splice(index, 1);
-	        return true;
-	    }
-	    return false;
-	}
-	function extend(namespace) {
-	    const newDebugger = createDebugger(`${this.namespace}:${namespace}`);
-	    newDebugger.log = this.log;
-	    return newDebugger;
-	}
-	debug.default = debugObj;
-	
-	return debug;
-}
-
-var hasRequiredLogger$1;
-
-function requireLogger$1 () {
-	if (hasRequiredLogger$1) return logger$1;
-	hasRequiredLogger$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(logger$1, "__esModule", { value: true });
-	logger$1.TypeSpecRuntimeLogger = void 0;
-	logger$1.createLoggerContext = createLoggerContext;
-	logger$1.setLogLevel = setLogLevel;
-	logger$1.getLogLevel = getLogLevel;
-	logger$1.createClientLogger = createClientLogger;
-	const tslib_1 = require$$0$2;
-	const debug_js_1 = tslib_1.__importDefault(requireDebug$1());
-	const TYPESPEC_RUNTIME_LOG_LEVELS = ["verbose", "info", "warning", "error"];
-	const levelMap = {
-	    verbose: 400,
-	    info: 300,
-	    warning: 200,
-	    error: 100,
-	};
-	function patchLogMethod(parent, child) {
-	    child.log = (...args) => {
-	        parent.log(...args);
-	    };
-	}
-	function isTypeSpecRuntimeLogLevel(level) {
-	    return TYPESPEC_RUNTIME_LOG_LEVELS.includes(level);
-	}
-	/**
-	 * Creates a logger context base on the provided options.
-	 * @param options - The options for creating a logger context.
-	 * @returns The logger context.
-	 */
-	function createLoggerContext(options) {
-	    const registeredLoggers = new Set();
-	    const logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env[options.logLevelEnvVarName]) ||
-	        undefined;
-	    let logLevel;
-	    const clientLogger = (0, debug_js_1.default)(options.namespace);
-	    clientLogger.log = (...args) => {
-	        debug_js_1.default.log(...args);
-	    };
-	    function contextSetLogLevel(level) {
-	        if (level && !isTypeSpecRuntimeLogLevel(level)) {
-	            throw new Error(`Unknown log level '${level}'. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(",")}`);
-	        }
-	        logLevel = level;
-	        const enabledNamespaces = [];
-	        for (const logger of registeredLoggers) {
-	            if (shouldEnable(logger)) {
-	                enabledNamespaces.push(logger.namespace);
-	            }
-	        }
-	        debug_js_1.default.enable(enabledNamespaces.join(","));
-	    }
-	    if (logLevelFromEnv) {
-	        // avoid calling setLogLevel because we don't want a mis-set environment variable to crash
-	        if (isTypeSpecRuntimeLogLevel(logLevelFromEnv)) {
-	            contextSetLogLevel(logLevelFromEnv);
-	        }
-	        else {
-	            console.error(`${options.logLevelEnvVarName} set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(", ")}.`);
-	        }
-	    }
-	    function shouldEnable(logger) {
-	        return Boolean(logLevel && levelMap[logger.level] <= levelMap[logLevel]);
-	    }
-	    function createLogger(parent, level) {
-	        const logger = Object.assign(parent.extend(level), {
-	            level,
-	        });
-	        patchLogMethod(parent, logger);
-	        if (shouldEnable(logger)) {
-	            const enabledNamespaces = debug_js_1.default.disable();
-	            debug_js_1.default.enable(enabledNamespaces + "," + logger.namespace);
-	        }
-	        registeredLoggers.add(logger);
-	        return logger;
-	    }
-	    function contextGetLogLevel() {
-	        return logLevel;
-	    }
-	    function contextCreateClientLogger(namespace) {
-	        const clientRootLogger = clientLogger.extend(namespace);
-	        patchLogMethod(clientLogger, clientRootLogger);
-	        return {
-	            error: createLogger(clientRootLogger, "error"),
-	            warning: createLogger(clientRootLogger, "warning"),
-	            info: createLogger(clientRootLogger, "info"),
-	            verbose: createLogger(clientRootLogger, "verbose"),
-	        };
-	    }
-	    return {
-	        setLogLevel: contextSetLogLevel,
-	        getLogLevel: contextGetLogLevel,
-	        createClientLogger: contextCreateClientLogger,
-	        logger: clientLogger,
-	    };
-	}
-	const context = createLoggerContext({
-	    logLevelEnvVarName: "TYPESPEC_RUNTIME_LOG_LEVEL",
-	    namespace: "typeSpecRuntime",
-	});
-	/**
-	 * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
-	 * @param level - The log level to enable for logging.
-	 * Options from most verbose to least verbose are:
-	 * - verbose
-	 * - info
-	 * - warning
-	 * - error
-	 */
-	// eslint-disable-next-line @typescript-eslint/no-redeclare
-	logger$1.TypeSpecRuntimeLogger = context.logger;
-	/**
-	 * Retrieves the currently specified log level.
-	 */
-	function setLogLevel(logLevel) {
-	    context.setLogLevel(logLevel);
-	}
-	/**
-	 * Retrieves the currently specified log level.
-	 */
-	function getLogLevel() {
-	    return context.getLogLevel();
-	}
-	/**
-	 * Creates a logger for use by the SDKs that inherits from `TypeSpecRuntimeLogger`.
-	 * @param namespace - The name of the SDK package.
-	 * @hidden
-	 */
-	function createClientLogger(namespace) {
-	    return context.createClientLogger(namespace);
-	}
-	
-	return logger$1;
-}
-
-var httpHeaders$1 = {};
-
-var hasRequiredHttpHeaders$1;
-
-function requireHttpHeaders$1 () {
-	if (hasRequiredHttpHeaders$1) return httpHeaders$1;
-	hasRequiredHttpHeaders$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(httpHeaders$1, "__esModule", { value: true });
-	httpHeaders$1.createHttpHeaders = createHttpHeaders;
-	function normalizeName(name) {
-	    return name.toLowerCase();
-	}
-	function* headerIterator(map) {
-	    for (const entry of map.values()) {
-	        yield [entry.name, entry.value];
-	    }
-	}
-	class HttpHeadersImpl {
-	    _headersMap;
-	    constructor(rawHeaders) {
-	        this._headersMap = new Map();
-	        if (rawHeaders) {
-	            for (const headerName of Object.keys(rawHeaders)) {
-	                this.set(headerName, rawHeaders[headerName]);
-	            }
-	        }
-	    }
-	    /**
-	     * Set a header in this collection with the provided name and value. The name is
-	     * case-insensitive.
-	     * @param name - The name of the header to set. This value is case-insensitive.
-	     * @param value - The value of the header to set.
-	     */
-	    set(name, value) {
-	        this._headersMap.set(normalizeName(name), { name, value: String(value).trim() });
-	    }
-	    /**
-	     * Get the header value for the provided header name, or undefined if no header exists in this
-	     * collection with the provided name.
-	     * @param name - The name of the header. This value is case-insensitive.
-	     */
-	    get(name) {
-	        return this._headersMap.get(normalizeName(name))?.value;
-	    }
-	    /**
-	     * Get whether or not this header collection contains a header entry for the provided header name.
-	     * @param name - The name of the header to set. This value is case-insensitive.
-	     */
-	    has(name) {
-	        return this._headersMap.has(normalizeName(name));
-	    }
-	    /**
-	     * Remove the header with the provided headerName.
-	     * @param name - The name of the header to remove.
-	     */
-	    delete(name) {
-	        this._headersMap.delete(normalizeName(name));
-	    }
-	    /**
-	     * Get the JSON object representation of this HTTP header collection.
-	     */
-	    toJSON(options = {}) {
-	        const result = {};
-	        if (options.preserveCase) {
-	            for (const entry of this._headersMap.values()) {
-	                result[entry.name] = entry.value;
-	            }
-	        }
-	        else {
-	            for (const [normalizedName, entry] of this._headersMap) {
-	                result[normalizedName] = entry.value;
-	            }
-	        }
-	        return result;
-	    }
-	    /**
-	     * Get the string representation of this HTTP header collection.
-	     */
-	    toString() {
-	        return JSON.stringify(this.toJSON({ preserveCase: true }));
-	    }
-	    /**
-	     * Iterate over tuples of header [name, value] pairs.
-	     */
-	    [Symbol.iterator]() {
-	        return headerIterator(this._headersMap);
-	    }
-	}
-	/**
-	 * Creates an object that satisfies the `HttpHeaders` interface.
-	 * @param rawHeaders - A simple object representing initial headers
-	 */
-	function createHttpHeaders(rawHeaders) {
-	    return new HttpHeadersImpl(rawHeaders);
-	}
-	
-	return httpHeaders$1;
-}
-
-var schemes = {};
-
-var hasRequiredSchemes;
-
-function requireSchemes () {
-	if (hasRequiredSchemes) return schemes;
-	hasRequiredSchemes = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(schemes, "__esModule", { value: true });
-	
-	return schemes;
-}
-
-var oauth2Flows = {};
-
-var hasRequiredOauth2Flows;
-
-function requireOauth2Flows () {
-	if (hasRequiredOauth2Flows) return oauth2Flows;
-	hasRequiredOauth2Flows = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(oauth2Flows, "__esModule", { value: true });
-	
-	return oauth2Flows;
-}
-
-var pipelineRequest$1 = {};
-
-var uuidUtils = {};
-
-var hasRequiredUuidUtils;
-
-function requireUuidUtils () {
-	if (hasRequiredUuidUtils) return uuidUtils;
-	hasRequiredUuidUtils = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(uuidUtils, "__esModule", { value: true });
-	uuidUtils.randomUUID = randomUUID;
-	/**
-	 * Generated Universally Unique Identifier
-	 *
-	 * @returns RFC4122 v4 UUID.
-	 */
-	function randomUUID() {
-	    return crypto.randomUUID();
-	}
-	
-	return uuidUtils;
-}
-
-var hasRequiredPipelineRequest$1;
-
-function requirePipelineRequest$1 () {
-	if (hasRequiredPipelineRequest$1) return pipelineRequest$1;
-	hasRequiredPipelineRequest$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(pipelineRequest$1, "__esModule", { value: true });
-	pipelineRequest$1.createPipelineRequest = createPipelineRequest;
-	const httpHeaders_js_1 = requireHttpHeaders$1();
-	const uuidUtils_js_1 = requireUuidUtils();
-	class PipelineRequestImpl {
-	    url;
-	    method;
-	    headers;
-	    timeout;
-	    withCredentials;
-	    body;
-	    multipartBody;
-	    formData;
-	    streamResponseStatusCodes;
-	    enableBrowserStreams;
-	    proxySettings;
-	    disableKeepAlive;
-	    abortSignal;
-	    requestId;
-	    allowInsecureConnection;
-	    onUploadProgress;
-	    onDownloadProgress;
-	    requestOverrides;
-	    authSchemes;
-	    constructor(options) {
-	        this.url = options.url;
-	        this.body = options.body;
-	        this.headers = options.headers ?? (0, httpHeaders_js_1.createHttpHeaders)();
-	        this.method = options.method ?? "GET";
-	        this.timeout = options.timeout ?? 0;
-	        this.multipartBody = options.multipartBody;
-	        this.formData = options.formData;
-	        this.disableKeepAlive = options.disableKeepAlive ?? false;
-	        this.proxySettings = options.proxySettings;
-	        this.streamResponseStatusCodes = options.streamResponseStatusCodes;
-	        this.withCredentials = options.withCredentials ?? false;
-	        this.abortSignal = options.abortSignal;
-	        this.onUploadProgress = options.onUploadProgress;
-	        this.onDownloadProgress = options.onDownloadProgress;
-	        this.requestId = options.requestId || (0, uuidUtils_js_1.randomUUID)();
-	        this.allowInsecureConnection = options.allowInsecureConnection ?? false;
-	        this.enableBrowserStreams = options.enableBrowserStreams ?? false;
-	        this.requestOverrides = options.requestOverrides;
-	        this.authSchemes = options.authSchemes;
-	    }
-	}
-	/**
-	 * Creates a new pipeline request with the given options.
-	 * This method is to allow for the easy setting of default values and not required.
-	 * @param options - The options to create the request with.
-	 */
-	function createPipelineRequest(options) {
-	    return new PipelineRequestImpl(options);
-	}
-	
-	return pipelineRequest$1;
-}
-
-var pipeline$1 = {};
-
-var hasRequiredPipeline$3;
-
-function requirePipeline$3 () {
-	if (hasRequiredPipeline$3) return pipeline$1;
-	hasRequiredPipeline$3 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(pipeline$1, "__esModule", { value: true });
-	pipeline$1.createEmptyPipeline = createEmptyPipeline;
-	const ValidPhaseNames = new Set(["Deserialize", "Serialize", "Retry", "Sign"]);
-	/**
-	 * A private implementation of Pipeline.
-	 * Do not export this class from the package.
-	 * @internal
-	 */
-	class HttpPipeline {
-	    _policies = [];
-	    _orderedPolicies;
-	    constructor(policies) {
-	        this._policies = policies?.slice(0) ?? [];
-	        this._orderedPolicies = undefined;
-	    }
-	    addPolicy(policy, options = {}) {
-	        if (options.phase && options.afterPhase) {
-	            throw new Error("Policies inside a phase cannot specify afterPhase.");
-	        }
-	        if (options.phase && !ValidPhaseNames.has(options.phase)) {
-	            throw new Error(`Invalid phase name: ${options.phase}`);
-	        }
-	        if (options.afterPhase && !ValidPhaseNames.has(options.afterPhase)) {
-	            throw new Error(`Invalid afterPhase name: ${options.afterPhase}`);
-	        }
-	        this._policies.push({
-	            policy,
-	            options,
-	        });
-	        this._orderedPolicies = undefined;
-	    }
-	    removePolicy(options) {
-	        const removedPolicies = [];
-	        this._policies = this._policies.filter((policyDescriptor) => {
-	            if ((options.name && policyDescriptor.policy.name === options.name) ||
-	                (options.phase && policyDescriptor.options.phase === options.phase)) {
-	                removedPolicies.push(policyDescriptor.policy);
-	                return false;
-	            }
-	            else {
-	                return true;
-	            }
-	        });
-	        this._orderedPolicies = undefined;
-	        return removedPolicies;
-	    }
-	    sendRequest(httpClient, request) {
-	        const policies = this.getOrderedPolicies();
-	        const pipeline = policies.reduceRight((next, policy) => {
-	            return (req) => {
-	                return policy.sendRequest(req, next);
-	            };
-	        }, (req) => httpClient.sendRequest(req));
-	        return pipeline(request);
-	    }
-	    getOrderedPolicies() {
-	        if (!this._orderedPolicies) {
-	            this._orderedPolicies = this.orderPolicies();
-	        }
-	        return this._orderedPolicies;
-	    }
-	    clone() {
-	        return new HttpPipeline(this._policies);
-	    }
-	    static create() {
-	        return new HttpPipeline();
-	    }
-	    orderPolicies() {
-	        /**
-	         * The goal of this method is to reliably order pipeline policies
-	         * based on their declared requirements when they were added.
-	         *
-	         * Order is first determined by phase:
-	         *
-	         * 1. Serialize Phase
-	         * 2. Policies not in a phase
-	         * 3. Deserialize Phase
-	         * 4. Retry Phase
-	         * 5. Sign Phase
-	         *
-	         * Within each phase, policies are executed in the order
-	         * they were added unless they were specified to execute
-	         * before/after other policies or after a particular phase.
-	         *
-	         * To determine the final order, we will walk the policy list
-	         * in phase order multiple times until all dependencies are
-	         * satisfied.
-	         *
-	         * `afterPolicies` are the set of policies that must be
-	         * executed before a given policy. This requirement is
-	         * considered satisfied when each of the listed policies
-	         * have been scheduled.
-	         *
-	         * `beforePolicies` are the set of policies that must be
-	         * executed after a given policy. Since this dependency
-	         * can be expressed by converting it into a equivalent
-	         * `afterPolicies` declarations, they are normalized
-	         * into that form for simplicity.
-	         *
-	         * An `afterPhase` dependency is considered satisfied when all
-	         * policies in that phase have scheduled.
-	         *
-	         */
-	        const result = [];
-	        // Track all policies we know about.
-	        const policyMap = new Map();
-	        function createPhase(name) {
-	            return {
-	                name,
-	                policies: new Set(),
-	                hasRun: false,
-	                hasAfterPolicies: false,
-	            };
-	        }
-	        // Track policies for each phase.
-	        const serializePhase = createPhase("Serialize");
-	        const noPhase = createPhase("None");
-	        const deserializePhase = createPhase("Deserialize");
-	        const retryPhase = createPhase("Retry");
-	        const signPhase = createPhase("Sign");
-	        // a list of phases in order
-	        const orderedPhases = [serializePhase, noPhase, deserializePhase, retryPhase, signPhase];
-	        // Small helper function to map phase name to each Phase
-	        function getPhase(phase) {
-	            if (phase === "Retry") {
-	                return retryPhase;
-	            }
-	            else if (phase === "Serialize") {
-	                return serializePhase;
-	            }
-	            else if (phase === "Deserialize") {
-	                return deserializePhase;
-	            }
-	            else if (phase === "Sign") {
-	                return signPhase;
-	            }
-	            else {
-	                return noPhase;
-	            }
-	        }
-	        // First walk each policy and create a node to track metadata.
-	        for (const descriptor of this._policies) {
-	            const policy = descriptor.policy;
-	            const options = descriptor.options;
-	            const policyName = policy.name;
-	            if (policyMap.has(policyName)) {
-	                throw new Error("Duplicate policy names not allowed in pipeline");
-	            }
-	            const node = {
-	                policy,
-	                dependsOn: new Set(),
-	                dependants: new Set(),
-	            };
-	            if (options.afterPhase) {
-	                node.afterPhase = getPhase(options.afterPhase);
-	                node.afterPhase.hasAfterPolicies = true;
-	            }
-	            policyMap.set(policyName, node);
-	            const phase = getPhase(options.phase);
-	            phase.policies.add(node);
-	        }
-	        // Now that each policy has a node, connect dependency references.
-	        for (const descriptor of this._policies) {
-	            const { policy, options } = descriptor;
-	            const policyName = policy.name;
-	            const node = policyMap.get(policyName);
-	            if (!node) {
-	                throw new Error(`Missing node for policy ${policyName}`);
-	            }
-	            if (options.afterPolicies) {
-	                for (const afterPolicyName of options.afterPolicies) {
-	                    const afterNode = policyMap.get(afterPolicyName);
-	                    if (afterNode) {
-	                        // Linking in both directions helps later
-	                        // when we want to notify dependants.
-	                        node.dependsOn.add(afterNode);
-	                        afterNode.dependants.add(node);
-	                    }
-	                }
-	            }
-	            if (options.beforePolicies) {
-	                for (const beforePolicyName of options.beforePolicies) {
-	                    const beforeNode = policyMap.get(beforePolicyName);
-	                    if (beforeNode) {
-	                        // To execute before another node, make it
-	                        // depend on the current node.
-	                        beforeNode.dependsOn.add(node);
-	                        node.dependants.add(beforeNode);
-	                    }
-	                }
-	            }
-	        }
-	        function walkPhase(phase) {
-	            phase.hasRun = true;
-	            // Sets iterate in insertion order
-	            for (const node of phase.policies) {
-	                if (node.afterPhase && (!node.afterPhase.hasRun || node.afterPhase.policies.size)) {
-	                    // If this node is waiting on a phase to complete,
-	                    // we need to skip it for now.
-	                    // Even if the phase is empty, we should wait for it
-	                    // to be walked to avoid re-ordering policies.
-	                    continue;
-	                }
-	                if (node.dependsOn.size === 0) {
-	                    // If there's nothing else we're waiting for, we can
-	                    // add this policy to the result list.
-	                    result.push(node.policy);
-	                    // Notify anything that depends on this policy that
-	                    // the policy has been scheduled.
-	                    for (const dependant of node.dependants) {
-	                        dependant.dependsOn.delete(node);
-	                    }
-	                    policyMap.delete(node.policy.name);
-	                    phase.policies.delete(node);
-	                }
-	            }
-	        }
-	        function walkPhases() {
-	            for (const phase of orderedPhases) {
-	                walkPhase(phase);
-	                // if the phase isn't complete
-	                if (phase.policies.size > 0 && phase !== noPhase) {
-	                    if (!noPhase.hasRun) {
-	                        // Try running noPhase to see if that unblocks this phase next tick.
-	                        // This can happen if a phase that happens before noPhase
-	                        // is waiting on a noPhase policy to complete.
-	                        walkPhase(noPhase);
-	                    }
-	                    // Don't proceed to the next phase until this phase finishes.
-	                    return;
-	                }
-	                if (phase.hasAfterPolicies) {
-	                    // Run any policies unblocked by this phase
-	                    walkPhase(noPhase);
-	                }
-	            }
-	        }
-	        // Iterate until we've put every node in the result list.
-	        let iteration = 0;
-	        while (policyMap.size > 0) {
-	            iteration++;
-	            const initialResultLength = result.length;
-	            // Keep walking each phase in order until we can order every node.
-	            walkPhases();
-	            // The result list *should* get at least one larger each time
-	            // after the first full pass.
-	            // Otherwise, we're going to loop forever.
-	            if (result.length <= initialResultLength && iteration > 1) {
-	                throw new Error("Cannot satisfy policy dependencies due to requirements cycle.");
-	            }
-	        }
-	        return result;
-	    }
-	}
-	/**
-	 * Creates a totally empty pipeline.
-	 * Useful for testing or creating a custom one.
-	 */
-	function createEmptyPipeline() {
-	    return HttpPipeline.create();
-	}
-	
-	return pipeline$1;
-}
-
-var restError$2 = {};
-
-var error$1 = {};
-
-var object = {};
-
-var hasRequiredObject;
-
-function requireObject () {
-	if (hasRequiredObject) return object;
-	hasRequiredObject = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(object, "__esModule", { value: true });
-	object.isObject = isObject;
-	/**
-	 * Helper to determine when an input is a generic JS object.
-	 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
-	 */
-	function isObject(input) {
-	    return (typeof input === "object" &&
-	        input !== null &&
-	        !Array.isArray(input) &&
-	        !(input instanceof RegExp) &&
-	        !(input instanceof Date));
-	}
-	
-	return object;
-}
-
-var hasRequiredError$1;
-
-function requireError$1 () {
-	if (hasRequiredError$1) return error$1;
-	hasRequiredError$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(error$1, "__esModule", { value: true });
-	error$1.isError = isError;
-	const object_js_1 = requireObject();
-	/**
-	 * Typeguard for an error object shape (has name and message)
-	 * @param e - Something caught by a catch clause.
-	 */
-	function isError(e) {
-	    if ((0, object_js_1.isObject)(e)) {
-	        const hasName = typeof e.name === "string";
-	        const hasMessage = typeof e.message === "string";
-	        return hasName && hasMessage;
-	    }
-	    return false;
-	}
-	
-	return error$1;
-}
-
-var inspect = {};
-
-var hasRequiredInspect;
-
-function requireInspect () {
-	if (hasRequiredInspect) return inspect;
-	hasRequiredInspect = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(inspect, "__esModule", { value: true });
-	inspect.custom = void 0;
-	const node_util_1 = require$$1$4;
-	inspect.custom = node_util_1.inspect.custom;
-	
-	return inspect;
-}
-
-var sanitizer = {};
-
-var hasRequiredSanitizer;
-
-function requireSanitizer () {
-	if (hasRequiredSanitizer) return sanitizer;
-	hasRequiredSanitizer = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(sanitizer, "__esModule", { value: true });
-	sanitizer.Sanitizer = void 0;
-	const object_js_1 = requireObject();
-	const RedactedString = "REDACTED";
-	// Make sure this list is up-to-date with the one under core/logger/Readme#Keyconcepts
-	const defaultAllowedHeaderNames = [
-	    "x-ms-client-request-id",
-	    "x-ms-return-client-request-id",
-	    "x-ms-useragent",
-	    "x-ms-correlation-request-id",
-	    "x-ms-request-id",
-	    "client-request-id",
-	    "ms-cv",
-	    "return-client-request-id",
-	    "traceparent",
-	    "Access-Control-Allow-Credentials",
-	    "Access-Control-Allow-Headers",
-	    "Access-Control-Allow-Methods",
-	    "Access-Control-Allow-Origin",
-	    "Access-Control-Expose-Headers",
-	    "Access-Control-Max-Age",
-	    "Access-Control-Request-Headers",
-	    "Access-Control-Request-Method",
-	    "Origin",
-	    "Accept",
-	    "Accept-Encoding",
-	    "Cache-Control",
-	    "Connection",
-	    "Content-Length",
-	    "Content-Type",
-	    "Date",
-	    "ETag",
-	    "Expires",
-	    "If-Match",
-	    "If-Modified-Since",
-	    "If-None-Match",
-	    "If-Unmodified-Since",
-	    "Last-Modified",
-	    "Pragma",
-	    "Request-Id",
-	    "Retry-After",
-	    "Server",
-	    "Transfer-Encoding",
-	    "User-Agent",
-	    "WWW-Authenticate",
-	];
-	const defaultAllowedQueryParameters = ["api-version"];
-	/**
-	 * A utility class to sanitize objects for logging.
-	 */
-	class Sanitizer {
-	    allowedHeaderNames;
-	    allowedQueryParameters;
-	    constructor({ additionalAllowedHeaderNames: allowedHeaderNames = [], additionalAllowedQueryParameters: allowedQueryParameters = [], } = {}) {
-	        allowedHeaderNames = defaultAllowedHeaderNames.concat(allowedHeaderNames);
-	        allowedQueryParameters = defaultAllowedQueryParameters.concat(allowedQueryParameters);
-	        this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
-	        this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
-	    }
-	    /**
-	     * Sanitizes an object for logging.
-	     * @param obj - The object to sanitize
-	     * @returns - The sanitized object as a string
-	     */
-	    sanitize(obj) {
-	        const seen = new Set();
-	        return JSON.stringify(obj, (key, value) => {
-	            // Ensure Errors include their interesting non-enumerable members
-	            if (value instanceof Error) {
-	                return {
-	                    ...value,
-	                    name: value.name,
-	                    message: value.message,
-	                };
-	            }
-	            if (key === "headers") {
-	                return this.sanitizeHeaders(value);
-	            }
-	            else if (key === "url") {
-	                return this.sanitizeUrl(value);
-	            }
-	            else if (key === "query") {
-	                return this.sanitizeQuery(value);
-	            }
-	            else if (key === "body") {
-	                // Don't log the request body
-	                return undefined;
-	            }
-	            else if (key === "response") {
-	                // Don't log response again
-	                return undefined;
-	            }
-	            else if (key === "operationSpec") {
-	                // When using sendOperationRequest, the request carries a massive
-	                // field with the autorest spec. No need to log it.
-	                return undefined;
-	            }
-	            else if (Array.isArray(value) || (0, object_js_1.isObject)(value)) {
-	                if (seen.has(value)) {
-	                    return "[Circular]";
-	                }
-	                seen.add(value);
-	            }
-	            return value;
-	        }, 2);
-	    }
-	    /**
-	     * Sanitizes a URL for logging.
-	     * @param value - The URL to sanitize
-	     * @returns - The sanitized URL as a string
-	     */
-	    sanitizeUrl(value) {
-	        if (typeof value !== "string" || value === null || value === "") {
-	            return value;
-	        }
-	        const url = new URL(value);
-	        if (!url.search) {
-	            return value;
-	        }
-	        for (const [key] of url.searchParams) {
-	            if (!this.allowedQueryParameters.has(key.toLowerCase())) {
-	                url.searchParams.set(key, RedactedString);
-	            }
-	        }
-	        return url.toString();
-	    }
-	    sanitizeHeaders(obj) {
-	        const sanitized = {};
-	        for (const key of Object.keys(obj)) {
-	            if (this.allowedHeaderNames.has(key.toLowerCase())) {
-	                sanitized[key] = obj[key];
-	            }
-	            else {
-	                sanitized[key] = RedactedString;
-	            }
-	        }
-	        return sanitized;
-	    }
-	    sanitizeQuery(value) {
-	        if (typeof value !== "object" || value === null) {
-	            return value;
-	        }
-	        const sanitized = {};
-	        for (const k of Object.keys(value)) {
-	            if (this.allowedQueryParameters.has(k.toLowerCase())) {
-	                sanitized[k] = value[k];
-	            }
-	            else {
-	                sanitized[k] = RedactedString;
-	            }
-	        }
-	        return sanitized;
-	    }
-	}
-	sanitizer.Sanitizer = Sanitizer;
-	
-	return sanitizer;
-}
-
-var hasRequiredRestError$2;
-
-function requireRestError$2 () {
-	if (hasRequiredRestError$2) return restError$2;
-	hasRequiredRestError$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(restError$2, "__esModule", { value: true });
-	restError$2.RestError = void 0;
-	restError$2.isRestError = isRestError;
-	const error_js_1 = requireError$1();
-	const inspect_js_1 = requireInspect();
-	const sanitizer_js_1 = requireSanitizer();
-	const errorSanitizer = new sanitizer_js_1.Sanitizer();
-	/**
-	 * A custom error type for failed pipeline requests.
-	 */
-	class RestError extends Error {
-	    /**
-	     * Something went wrong when making the request.
-	     * This means the actual request failed for some reason,
-	     * such as a DNS issue or the connection being lost.
-	     */
-	    static REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
-	    /**
-	     * This means that parsing the response from the server failed.
-	     * It may have been malformed.
-	     */
-	    static PARSE_ERROR = "PARSE_ERROR";
-	    /**
-	     * The code of the error itself (use statics on RestError if possible.)
-	     */
-	    code;
-	    /**
-	     * The HTTP status code of the request (if applicable.)
-	     */
-	    statusCode;
-	    /**
-	     * The request that was made.
-	     * This property is non-enumerable.
-	     */
-	    request;
-	    /**
-	     * The response received (if any.)
-	     * This property is non-enumerable.
-	     */
-	    response;
-	    /**
-	     * Bonus property set by the throw site.
-	     */
-	    details;
-	    constructor(message, options = {}) {
-	        super(message);
-	        this.name = "RestError";
-	        this.code = options.code;
-	        this.statusCode = options.statusCode;
-	        // The request and response may contain sensitive information in the headers or body.
-	        // To help prevent this sensitive information being accidentally logged, the request and response
-	        // properties are marked as non-enumerable here. This prevents them showing up in the output of
-	        // JSON.stringify and console.log.
-	        Object.defineProperty(this, "request", { value: options.request, enumerable: false });
-	        Object.defineProperty(this, "response", { value: options.response, enumerable: false });
-	        // Only include useful agent information in the request for logging, as the full agent object
-	        // may contain large binary data.
-	        const agent = this.request?.agent
-	            ? {
-	                maxFreeSockets: this.request.agent.maxFreeSockets,
-	                maxSockets: this.request.agent.maxSockets,
-	            }
-	            : undefined;
-	        // Logging method for util.inspect in Node
-	        Object.defineProperty(this, inspect_js_1.custom, {
-	            value: () => {
-	                // Extract non-enumerable properties and add them back. This is OK since in this output the request and
-	                // response get sanitized.
-	                return `RestError: ${this.message} \n ${errorSanitizer.sanitize({
-	                    ...this,
-	                    request: { ...this.request, agent },
-	                    response: this.response,
-	                })}`;
-	            },
-	            enumerable: false,
-	        });
-	        Object.setPrototypeOf(this, RestError.prototype);
-	    }
-	}
-	restError$2.RestError = RestError;
-	/**
-	 * Typeguard for RestError
-	 * @param e - Something caught by a catch clause.
-	 */
-	function isRestError(e) {
-	    if (e instanceof RestError) {
-	        return true;
-	    }
-	    return (0, error_js_1.isError)(e) && e.name === "RestError";
-	}
-	
-	return restError$2;
-}
-
-var bytesEncoding = {};
-
-var hasRequiredBytesEncoding;
-
-function requireBytesEncoding () {
-	if (hasRequiredBytesEncoding) return bytesEncoding;
-	hasRequiredBytesEncoding = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(bytesEncoding, "__esModule", { value: true });
-	bytesEncoding.uint8ArrayToString = uint8ArrayToString;
-	bytesEncoding.stringToUint8Array = stringToUint8Array;
-	/**
-	 * The helper that transforms bytes with specific character encoding into string
-	 * @param bytes - the uint8array bytes
-	 * @param format - the format we use to encode the byte
-	 * @returns a string of the encoded string
-	 */
-	function uint8ArrayToString(bytes, format) {
-	    return Buffer.from(bytes).toString(format);
-	}
-	/**
-	 * The helper that transforms string to specific character encoded bytes array.
-	 * @param value - the string to be converted
-	 * @param format - the format we use to decode the value
-	 * @returns a uint8array
-	 */
-	function stringToUint8Array(value, format) {
-	    return Buffer.from(value, format);
-	}
-	
-	return bytesEncoding;
-}
-
-var defaultHttpClient$1 = {};
-
-var nodeHttpClient = {};
-
-var log$4 = {};
-
-var hasRequiredLog$4;
-
-function requireLog$4 () {
-	if (hasRequiredLog$4) return log$4;
-	hasRequiredLog$4 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(log$4, "__esModule", { value: true });
-	log$4.logger = void 0;
-	const logger_js_1 = requireLogger$1();
-	log$4.logger = (0, logger_js_1.createClientLogger)("ts-http-runtime");
-	
-	return log$4;
-}
-
-var hasRequiredNodeHttpClient;
-
-function requireNodeHttpClient () {
-	if (hasRequiredNodeHttpClient) return nodeHttpClient;
-	hasRequiredNodeHttpClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(nodeHttpClient, "__esModule", { value: true });
-	nodeHttpClient.getBodyLength = getBodyLength;
-	nodeHttpClient.createNodeHttpClient = createNodeHttpClient;
-	const tslib_1 = require$$0$2;
-	const node_http_1 = tslib_1.__importDefault(require$$1$8);
-	const node_https_1 = tslib_1.__importDefault(require$$2$4);
-	const node_zlib_1 = tslib_1.__importDefault(require$$3$2);
-	const node_stream_1 = require$$0$c;
-	const AbortError_js_1 = requireAbortError$3();
-	const httpHeaders_js_1 = requireHttpHeaders$1();
-	const restError_js_1 = requireRestError$2();
-	const log_js_1 = requireLog$4();
-	const sanitizer_js_1 = requireSanitizer();
-	const DEFAULT_TLS_SETTINGS = {};
-	function isReadableStream(body) {
-	    return body && typeof body.pipe === "function";
-	}
-	function isStreamComplete(stream) {
-	    if (stream.readable === false) {
-	        return Promise.resolve();
-	    }
-	    return new Promise((resolve) => {
-	        const handler = () => {
-	            resolve();
-	            stream.removeListener("close", handler);
-	            stream.removeListener("end", handler);
-	            stream.removeListener("error", handler);
-	        };
-	        stream.on("close", handler);
-	        stream.on("end", handler);
-	        stream.on("error", handler);
-	    });
-	}
-	function isArrayBuffer(body) {
-	    return body && typeof body.byteLength === "number";
-	}
-	class ReportTransform extends node_stream_1.Transform {
-	    loadedBytes = 0;
-	    progressCallback;
-	    // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
-	    _transform(chunk, _encoding, callback) {
-	        this.push(chunk);
-	        this.loadedBytes += chunk.length;
-	        try {
-	            this.progressCallback({ loadedBytes: this.loadedBytes });
-	            callback();
-	        }
-	        catch (e) {
-	            callback(e);
-	        }
-	    }
-	    constructor(progressCallback) {
-	        super();
-	        this.progressCallback = progressCallback;
-	    }
-	}
-	/**
-	 * A HttpClient implementation that uses Node's "https" module to send HTTPS requests.
-	 * @internal
-	 */
-	class NodeHttpClient {
-	    cachedHttpAgent;
-	    cachedHttpsAgents = new WeakMap();
-	    /**
-	     * Makes a request over an underlying transport layer and returns the response.
-	     * @param request - The request to be made.
-	     */
-	    async sendRequest(request) {
-	        const abortController = new AbortController();
-	        let abortListener;
-	        if (request.abortSignal) {
-	            if (request.abortSignal.aborted) {
-	                throw new AbortError_js_1.AbortError("The operation was aborted. Request has already been canceled.");
-	            }
-	            abortListener = (event) => {
-	                if (event.type === "abort") {
-	                    abortController.abort();
-	                }
-	            };
-	            request.abortSignal.addEventListener("abort", abortListener);
-	        }
-	        let timeoutId;
-	        if (request.timeout > 0) {
-	            timeoutId = setTimeout(() => {
-	                const sanitizer = new sanitizer_js_1.Sanitizer();
-	                log_js_1.logger.info(`request to '${sanitizer.sanitizeUrl(request.url)}' timed out. canceling...`);
-	                abortController.abort();
-	            }, request.timeout);
-	        }
-	        const acceptEncoding = request.headers.get("Accept-Encoding");
-	        const shouldDecompress = acceptEncoding?.includes("gzip") || acceptEncoding?.includes("deflate");
-	        let body = typeof request.body === "function" ? request.body() : request.body;
-	        if (body && !request.headers.has("Content-Length")) {
-	            const bodyLength = getBodyLength(body);
-	            if (bodyLength !== null) {
-	                request.headers.set("Content-Length", bodyLength);
-	            }
-	        }
-	        let responseStream;
-	        try {
-	            if (body && request.onUploadProgress) {
-	                const onUploadProgress = request.onUploadProgress;
-	                const uploadReportStream = new ReportTransform(onUploadProgress);
-	                uploadReportStream.on("error", (e) => {
-	                    log_js_1.logger.error("Error in upload progress", e);
-	                });
-	                if (isReadableStream(body)) {
-	                    body.pipe(uploadReportStream);
-	                }
-	                else {
-	                    uploadReportStream.end(body);
-	                }
-	                body = uploadReportStream;
-	            }
-	            const res = await this.makeRequest(request, abortController, body);
-	            if (timeoutId !== undefined) {
-	                clearTimeout(timeoutId);
-	            }
-	            const headers = getResponseHeaders(res);
-	            const status = res.statusCode ?? 0;
-	            const response = {
-	                status,
-	                headers,
-	                request,
-	            };
-	            // Responses to HEAD must not have a body.
-	            // If they do return a body, that body must be ignored.
-	            if (request.method === "HEAD") {
-	                // call resume() and not destroy() to avoid closing the socket
-	                // and losing keep alive
-	                res.resume();
-	                return response;
-	            }
-	            responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;
-	            const onDownloadProgress = request.onDownloadProgress;
-	            if (onDownloadProgress) {
-	                const downloadReportStream = new ReportTransform(onDownloadProgress);
-	                downloadReportStream.on("error", (e) => {
-	                    log_js_1.logger.error("Error in download progress", e);
-	                });
-	                responseStream.pipe(downloadReportStream);
-	                responseStream = downloadReportStream;
-	            }
-	            if (
-	            // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
-	            request.streamResponseStatusCodes?.has(Number.POSITIVE_INFINITY) ||
-	                request.streamResponseStatusCodes?.has(response.status)) {
-	                response.readableStreamBody = responseStream;
-	            }
-	            else {
-	                response.bodyAsText = await streamToText(responseStream);
-	            }
-	            return response;
-	        }
-	        finally {
-	            // clean up event listener
-	            if (request.abortSignal && abortListener) {
-	                let uploadStreamDone = Promise.resolve();
-	                if (isReadableStream(body)) {
-	                    uploadStreamDone = isStreamComplete(body);
-	                }
-	                let downloadStreamDone = Promise.resolve();
-	                if (isReadableStream(responseStream)) {
-	                    downloadStreamDone = isStreamComplete(responseStream);
-	                }
-	                Promise.all([uploadStreamDone, downloadStreamDone])
-	                    .then(() => {
-	                    // eslint-disable-next-line promise/always-return
-	                    if (abortListener) {
-	                        request.abortSignal?.removeEventListener("abort", abortListener);
-	                    }
-	                })
-	                    .catch((e) => {
-	                    log_js_1.logger.warning("Error when cleaning up abortListener on httpRequest", e);
-	                });
-	            }
-	        }
-	    }
-	    makeRequest(request, abortController, body) {
-	        const url = new URL(request.url);
-	        const isInsecure = url.protocol !== "https:";
-	        if (isInsecure && !request.allowInsecureConnection) {
-	            throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
-	        }
-	        const agent = request.agent ?? this.getOrCreateAgent(request, isInsecure);
-	        const options = {
-	            agent,
-	            hostname: url.hostname,
-	            path: `${url.pathname}${url.search}`,
-	            port: url.port,
-	            method: request.method,
-	            headers: request.headers.toJSON({ preserveCase: true }),
-	            ...request.requestOverrides,
-	        };
-	        return new Promise((resolve, reject) => {
-	            const req = isInsecure ? node_http_1.default.request(options, resolve) : node_https_1.default.request(options, resolve);
-	            req.once("error", (err) => {
-	                reject(new restError_js_1.RestError(err.message, { code: err.code ?? restError_js_1.RestError.REQUEST_SEND_ERROR, request }));
-	            });
-	            abortController.signal.addEventListener("abort", () => {
-	                const abortError = new AbortError_js_1.AbortError("The operation was aborted. Rejecting from abort signal callback while making request.");
-	                req.destroy(abortError);
-	                reject(abortError);
-	            });
-	            if (body && isReadableStream(body)) {
-	                body.pipe(req);
-	            }
-	            else if (body) {
-	                if (typeof body === "string" || Buffer.isBuffer(body)) {
-	                    req.end(body);
-	                }
-	                else if (isArrayBuffer(body)) {
-	                    req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body));
-	                }
-	                else {
-	                    log_js_1.logger.error("Unrecognized body type", body);
-	                    reject(new restError_js_1.RestError("Unrecognized body type"));
-	                }
-	            }
-	            else {
-	                // streams don't like "undefined" being passed as data
-	                req.end();
-	            }
-	        });
-	    }
-	    getOrCreateAgent(request, isInsecure) {
-	        const disableKeepAlive = request.disableKeepAlive;
-	        // Handle Insecure requests first
-	        if (isInsecure) {
-	            if (disableKeepAlive) {
-	                // keepAlive:false is the default so we don't need a custom Agent
-	                return node_http_1.default.globalAgent;
-	            }
-	            if (!this.cachedHttpAgent) {
-	                // If there is no cached agent create a new one and cache it.
-	                this.cachedHttpAgent = new node_http_1.default.Agent({ keepAlive: true });
-	            }
-	            return this.cachedHttpAgent;
-	        }
-	        else {
-	            if (disableKeepAlive && !request.tlsSettings) {
-	                // When there are no tlsSettings and keepAlive is false
-	                // we don't need a custom agent
-	                return node_https_1.default.globalAgent;
-	            }
-	            // We use the tlsSettings to index cached clients
-	            const tlsSettings = request.tlsSettings ?? DEFAULT_TLS_SETTINGS;
-	            // Get the cached agent or create a new one with the
-	            // provided values for keepAlive and tlsSettings
-	            let agent = this.cachedHttpsAgents.get(tlsSettings);
-	            if (agent && agent.options.keepAlive === !disableKeepAlive) {
-	                return agent;
-	            }
-	            log_js_1.logger.info("No cached TLS Agent exist, creating a new Agent");
-	            agent = new node_https_1.default.Agent({
-	                // keepAlive is true if disableKeepAlive is false.
-	                keepAlive: !disableKeepAlive,
-	                // Since we are spreading, if no tslSettings were provided, nothing is added to the agent options.
-	                ...tlsSettings,
-	            });
-	            this.cachedHttpsAgents.set(tlsSettings, agent);
-	            return agent;
-	        }
-	    }
-	}
-	function getResponseHeaders(res) {
-	    const headers = (0, httpHeaders_js_1.createHttpHeaders)();
-	    for (const header of Object.keys(res.headers)) {
-	        const value = res.headers[header];
-	        if (Array.isArray(value)) {
-	            if (value.length > 0) {
-	                headers.set(header, value[0]);
-	            }
-	        }
-	        else if (value) {
-	            headers.set(header, value);
-	        }
-	    }
-	    return headers;
-	}
-	function getDecodedResponseStream(stream, headers) {
-	    const contentEncoding = headers.get("Content-Encoding");
-	    if (contentEncoding === "gzip") {
-	        const unzip = node_zlib_1.default.createGunzip();
-	        stream.pipe(unzip);
-	        return unzip;
-	    }
-	    else if (contentEncoding === "deflate") {
-	        const inflate = node_zlib_1.default.createInflate();
-	        stream.pipe(inflate);
-	        return inflate;
-	    }
-	    return stream;
-	}
-	function streamToText(stream) {
-	    return new Promise((resolve, reject) => {
-	        const buffer = [];
-	        stream.on("data", (chunk) => {
-	            if (Buffer.isBuffer(chunk)) {
-	                buffer.push(chunk);
-	            }
-	            else {
-	                buffer.push(Buffer.from(chunk));
-	            }
-	        });
-	        stream.on("end", () => {
-	            resolve(Buffer.concat(buffer).toString("utf8"));
-	        });
-	        stream.on("error", (e) => {
-	            if (e && e?.name === "AbortError") {
-	                reject(e);
-	            }
-	            else {
-	                reject(new restError_js_1.RestError(`Error reading response as text: ${e.message}`, {
-	                    code: restError_js_1.RestError.PARSE_ERROR,
-	                }));
-	            }
-	        });
-	    });
-	}
-	/** @internal */
-	function getBodyLength(body) {
-	    if (!body) {
-	        return 0;
-	    }
-	    else if (Buffer.isBuffer(body)) {
-	        return body.length;
-	    }
-	    else if (isReadableStream(body)) {
-	        return null;
-	    }
-	    else if (isArrayBuffer(body)) {
-	        return body.byteLength;
-	    }
-	    else if (typeof body === "string") {
-	        return Buffer.from(body).length;
-	    }
-	    else {
-	        return null;
-	    }
-	}
-	/**
-	 * Create a new HttpClient instance for the NodeJS environment.
-	 * @internal
-	 */
-	function createNodeHttpClient() {
-	    return new NodeHttpClient();
-	}
-	
-	return nodeHttpClient;
-}
-
-var hasRequiredDefaultHttpClient$1;
-
-function requireDefaultHttpClient$1 () {
-	if (hasRequiredDefaultHttpClient$1) return defaultHttpClient$1;
-	hasRequiredDefaultHttpClient$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(defaultHttpClient$1, "__esModule", { value: true });
-	defaultHttpClient$1.createDefaultHttpClient = createDefaultHttpClient;
-	const nodeHttpClient_js_1 = requireNodeHttpClient();
-	/**
-	 * Create the correct HttpClient for the current environment.
-	 */
-	function createDefaultHttpClient() {
-	    return (0, nodeHttpClient_js_1.createNodeHttpClient)();
-	}
-	
-	return defaultHttpClient$1;
-}
-
-var getClient = {};
-
-var clientHelpers = {};
-
-var createPipelineFromOptions$1 = {};
-
-var logPolicy$1 = {};
-
-var hasRequiredLogPolicy$1;
-
-function requireLogPolicy$1 () {
-	if (hasRequiredLogPolicy$1) return logPolicy$1;
-	hasRequiredLogPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.logPolicyName = void 0;
-		exports$1.logPolicy = logPolicy;
-		const log_js_1 = requireLog$4();
-		const sanitizer_js_1 = requireSanitizer();
-		/**
-		 * The programmatic identifier of the logPolicy.
-		 */
-		exports$1.logPolicyName = "logPolicy";
-		/**
-		 * A policy that logs all requests and responses.
-		 * @param options - Options to configure logPolicy.
-		 */
-		function logPolicy(options = {}) {
-		    const logger = options.logger ?? log_js_1.logger.info;
-		    const sanitizer = new sanitizer_js_1.Sanitizer({
-		        additionalAllowedHeaderNames: options.additionalAllowedHeaderNames,
-		        additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
-		    });
-		    return {
-		        name: exports$1.logPolicyName,
-		        async sendRequest(request, next) {
-		            if (!logger.enabled) {
-		                return next(request);
-		            }
-		            logger(`Request: ${sanitizer.sanitize(request)}`);
-		            const response = await next(request);
-		            logger(`Response status code: ${response.status}`);
-		            logger(`Headers: ${sanitizer.sanitize(response.headers)}`);
-		            return response;
-		        },
-		    };
-		}
-		
-	} (logPolicy$1));
-	return logPolicy$1;
-}
-
-var redirectPolicy$1 = {};
-
-var hasRequiredRedirectPolicy$1;
-
-function requireRedirectPolicy$1 () {
-	if (hasRequiredRedirectPolicy$1) return redirectPolicy$1;
-	hasRequiredRedirectPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.redirectPolicyName = void 0;
-		exports$1.redirectPolicy = redirectPolicy;
-		/**
-		 * The programmatic identifier of the redirectPolicy.
-		 */
-		exports$1.redirectPolicyName = "redirectPolicy";
-		/**
-		 * Methods that are allowed to follow redirects 301 and 302
-		 */
-		const allowedRedirect = ["GET", "HEAD"];
-		/**
-		 * A policy to follow Location headers from the server in order
-		 * to support server-side redirection.
-		 * In the browser, this policy is not used.
-		 * @param options - Options to control policy behavior.
-		 */
-		function redirectPolicy(options = {}) {
-		    const { maxRetries = 20 } = options;
-		    return {
-		        name: exports$1.redirectPolicyName,
-		        async sendRequest(request, next) {
-		            const response = await next(request);
-		            return handleRedirect(next, response, maxRetries);
-		        },
-		    };
-		}
-		async function handleRedirect(next, response, maxRetries, currentRetries = 0) {
-		    const { request, status, headers } = response;
-		    const locationHeader = headers.get("location");
-		    if (locationHeader &&
-		        (status === 300 ||
-		            (status === 301 && allowedRedirect.includes(request.method)) ||
-		            (status === 302 && allowedRedirect.includes(request.method)) ||
-		            (status === 303 && request.method === "POST") ||
-		            status === 307) &&
-		        currentRetries < maxRetries) {
-		        const url = new URL(locationHeader, request.url);
-		        request.url = url.toString();
-		        // POST request with Status code 303 should be converted into a
-		        // redirected GET request if the redirect url is present in the location header
-		        if (status === 303) {
-		            request.method = "GET";
-		            request.headers.delete("Content-Length");
-		            delete request.body;
-		        }
-		        request.headers.delete("Authorization");
-		        const res = await next(request);
-		        return handleRedirect(next, res, maxRetries, currentRetries + 1);
-		    }
-		    return response;
-		}
-		
-	} (redirectPolicy$1));
-	return redirectPolicy$1;
-}
-
-var userAgentPolicy$1 = {};
-
-var userAgent$3 = {};
-
-var userAgentPlatform$1 = {};
-
-var hasRequiredUserAgentPlatform$1;
-
-function requireUserAgentPlatform$1 () {
-	if (hasRequiredUserAgentPlatform$1) return userAgentPlatform$1;
-	hasRequiredUserAgentPlatform$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(userAgentPlatform$1, "__esModule", { value: true });
-	userAgentPlatform$1.getHeaderName = getHeaderName;
-	userAgentPlatform$1.setPlatformSpecificData = setPlatformSpecificData;
-	const tslib_1 = require$$0$2;
-	const node_os_1 = tslib_1.__importDefault(require$$1$7);
-	const node_process_1 = tslib_1.__importDefault(require$$2$3);
-	/**
-	 * @internal
-	 */
-	function getHeaderName() {
-	    return "User-Agent";
-	}
-	/**
-	 * @internal
-	 */
-	async function setPlatformSpecificData(map) {
-	    if (node_process_1.default && node_process_1.default.versions) {
-	        const osInfo = `${node_os_1.default.type()} ${node_os_1.default.release()}; ${node_os_1.default.arch()}`;
-	        const versions = node_process_1.default.versions;
-	        if (versions.bun) {
-	            map.set("Bun", `${versions.bun} (${osInfo})`);
-	        }
-	        else if (versions.deno) {
-	            map.set("Deno", `${versions.deno} (${osInfo})`);
-	        }
-	        else if (versions.node) {
-	            map.set("Node", `${versions.node} (${osInfo})`);
-	        }
-	    }
-	}
-	
-	return userAgentPlatform$1;
-}
-
-var constants$5 = {};
-
-var hasRequiredConstants$5;
-
-function requireConstants$5 () {
-	if (hasRequiredConstants$5) return constants$5;
-	hasRequiredConstants$5 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(constants$5, "__esModule", { value: true });
-	constants$5.DEFAULT_RETRY_POLICY_COUNT = constants$5.SDK_VERSION = void 0;
-	constants$5.SDK_VERSION = "0.3.2";
-	constants$5.DEFAULT_RETRY_POLICY_COUNT = 3;
-	
-	return constants$5;
-}
-
-var hasRequiredUserAgent$2;
-
-function requireUserAgent$2 () {
-	if (hasRequiredUserAgent$2) return userAgent$3;
-	hasRequiredUserAgent$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(userAgent$3, "__esModule", { value: true });
-	userAgent$3.getUserAgentHeaderName = getUserAgentHeaderName;
-	userAgent$3.getUserAgentValue = getUserAgentValue;
-	const userAgentPlatform_js_1 = requireUserAgentPlatform$1();
-	const constants_js_1 = requireConstants$5();
-	function getUserAgentString(telemetryInfo) {
-	    const parts = [];
-	    for (const [key, value] of telemetryInfo) {
-	        const token = value ? `${key}/${value}` : key;
-	        parts.push(token);
-	    }
-	    return parts.join(" ");
-	}
-	/**
-	 * @internal
-	 */
-	function getUserAgentHeaderName() {
-	    return (0, userAgentPlatform_js_1.getHeaderName)();
-	}
-	/**
-	 * @internal
-	 */
-	async function getUserAgentValue(prefix) {
-	    const runtimeInfo = new Map();
-	    runtimeInfo.set("ts-http-runtime", constants_js_1.SDK_VERSION);
-	    await (0, userAgentPlatform_js_1.setPlatformSpecificData)(runtimeInfo);
-	    const defaultAgent = getUserAgentString(runtimeInfo);
-	    const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
-	    return userAgentValue;
-	}
-	
-	return userAgent$3;
-}
-
-var hasRequiredUserAgentPolicy$1;
-
-function requireUserAgentPolicy$1 () {
-	if (hasRequiredUserAgentPolicy$1) return userAgentPolicy$1;
-	hasRequiredUserAgentPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.userAgentPolicyName = void 0;
-		exports$1.userAgentPolicy = userAgentPolicy;
-		const userAgent_js_1 = requireUserAgent$2();
-		const UserAgentHeaderName = (0, userAgent_js_1.getUserAgentHeaderName)();
-		/**
-		 * The programmatic identifier of the userAgentPolicy.
-		 */
-		exports$1.userAgentPolicyName = "userAgentPolicy";
-		/**
-		 * A policy that sets the User-Agent header (or equivalent) to reflect
-		 * the library version.
-		 * @param options - Options to customize the user agent value.
-		 */
-		function userAgentPolicy(options = {}) {
-		    const userAgentValue = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix);
-		    return {
-		        name: exports$1.userAgentPolicyName,
-		        async sendRequest(request, next) {
-		            if (!request.headers.has(UserAgentHeaderName)) {
-		                request.headers.set(UserAgentHeaderName, await userAgentValue);
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (userAgentPolicy$1));
-	return userAgentPolicy$1;
-}
-
-var decompressResponsePolicy$1 = {};
-
-var hasRequiredDecompressResponsePolicy$1;
-
-function requireDecompressResponsePolicy$1 () {
-	if (hasRequiredDecompressResponsePolicy$1) return decompressResponsePolicy$1;
-	hasRequiredDecompressResponsePolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.decompressResponsePolicyName = void 0;
-		exports$1.decompressResponsePolicy = decompressResponsePolicy;
-		/**
-		 * The programmatic identifier of the decompressResponsePolicy.
-		 */
-		exports$1.decompressResponsePolicyName = "decompressResponsePolicy";
-		/**
-		 * A policy to enable response decompression according to Accept-Encoding header
-		 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
-		 */
-		function decompressResponsePolicy() {
-		    return {
-		        name: exports$1.decompressResponsePolicyName,
-		        async sendRequest(request, next) {
-		            // HEAD requests have no body
-		            if (request.method !== "HEAD") {
-		                request.headers.set("Accept-Encoding", "gzip,deflate");
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (decompressResponsePolicy$1));
-	return decompressResponsePolicy$1;
-}
-
-var defaultRetryPolicy$1 = {};
-
-var exponentialRetryStrategy = {};
-
-var delay$2 = {};
-
-var random = {};
-
-var hasRequiredRandom;
-
-function requireRandom () {
-	if (hasRequiredRandom) return random;
-	hasRequiredRandom = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(random, "__esModule", { value: true });
-	random.getRandomIntegerInclusive = getRandomIntegerInclusive;
-	/**
-	 * Returns a random integer value between a lower and upper bound,
-	 * inclusive of both bounds.
-	 * Note that this uses Math.random and isn't secure. If you need to use
-	 * this for any kind of security purpose, find a better source of random.
-	 * @param min - The smallest integer value allowed.
-	 * @param max - The largest integer value allowed.
-	 */
-	function getRandomIntegerInclusive(min, max) {
-	    // Make sure inputs are integers.
-	    min = Math.ceil(min);
-	    max = Math.floor(max);
-	    // Pick a random offset from zero to the size of the range.
-	    // Since Math.random() can never return 1, we have to make the range one larger
-	    // in order to be inclusive of the maximum value after we take the floor.
-	    const offset = Math.floor(Math.random() * (max - min + 1));
-	    return offset + min;
-	}
-	
-	return random;
-}
-
-var hasRequiredDelay$1;
-
-function requireDelay$1 () {
-	if (hasRequiredDelay$1) return delay$2;
-	hasRequiredDelay$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(delay$2, "__esModule", { value: true });
-	delay$2.calculateRetryDelay = calculateRetryDelay;
-	const random_js_1 = requireRandom();
-	/**
-	 * Calculates the delay interval for retry attempts using exponential delay with jitter.
-	 * @param retryAttempt - The current retry attempt number.
-	 * @param config - The exponential retry configuration.
-	 * @returns An object containing the calculated retry delay.
-	 */
-	function calculateRetryDelay(retryAttempt, config) {
-	    // Exponentially increase the delay each time
-	    const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt);
-	    // Don't let the delay exceed the maximum
-	    const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay);
-	    // Allow the final value to have some "jitter" (within 50% of the delay size) so
-	    // that retries across multiple clients don't occur simultaneously.
-	    const retryAfterInMs = clampedDelay / 2 + (0, random_js_1.getRandomIntegerInclusive)(0, clampedDelay / 2);
-	    return { retryAfterInMs };
-	}
-	
-	return delay$2;
-}
-
-var throttlingRetryStrategy = {};
-
-var helpers$1 = {};
-
-var hasRequiredHelpers$1;
-
-function requireHelpers$1 () {
-	if (hasRequiredHelpers$1) return helpers$1;
-	hasRequiredHelpers$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(helpers$1, "__esModule", { value: true });
-	helpers$1.delay = delay;
-	helpers$1.parseHeaderValueAsNumber = parseHeaderValueAsNumber;
-	const AbortError_js_1 = requireAbortError$3();
-	const StandardAbortMessage = "The operation was aborted.";
-	/**
-	 * A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
-	 * @param delayInMs - The number of milliseconds to be delayed.
-	 * @param value - The value to be resolved with after a timeout of t milliseconds.
-	 * @param options - The options for delay - currently abort options
-	 *                  - abortSignal - The abortSignal associated with containing operation.
-	 *                  - abortErrorMsg - The abort error message associated with containing operation.
-	 * @returns Resolved promise
-	 */
-	function delay(delayInMs, value, options) {
-	    return new Promise((resolve, reject) => {
-	        let timer = undefined;
-	        let onAborted = undefined;
-	        const rejectOnAbort = () => {
-	            return reject(new AbortError_js_1.AbortError(options?.abortErrorMsg ? options?.abortErrorMsg : StandardAbortMessage));
-	        };
-	        const removeListeners = () => {
-	            if (options?.abortSignal && onAborted) {
-	                options.abortSignal.removeEventListener("abort", onAborted);
-	            }
-	        };
-	        onAborted = () => {
-	            if (timer) {
-	                clearTimeout(timer);
-	            }
-	            removeListeners();
-	            return rejectOnAbort();
-	        };
-	        if (options?.abortSignal && options.abortSignal.aborted) {
-	            return rejectOnAbort();
-	        }
-	        timer = setTimeout(() => {
-	            removeListeners();
-	            resolve(value);
-	        }, delayInMs);
-	        if (options?.abortSignal) {
-	            options.abortSignal.addEventListener("abort", onAborted);
-	        }
-	    });
-	}
-	/**
-	 * @internal
-	 * @returns the parsed value or undefined if the parsed value is invalid.
-	 */
-	function parseHeaderValueAsNumber(response, headerName) {
-	    const value = response.headers.get(headerName);
-	    if (!value)
-	        return;
-	    const valueAsNum = Number(value);
-	    if (Number.isNaN(valueAsNum))
-	        return;
-	    return valueAsNum;
-	}
-	
-	return helpers$1;
-}
-
-var hasRequiredThrottlingRetryStrategy;
-
-function requireThrottlingRetryStrategy () {
-	if (hasRequiredThrottlingRetryStrategy) return throttlingRetryStrategy;
-	hasRequiredThrottlingRetryStrategy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(throttlingRetryStrategy, "__esModule", { value: true });
-	throttlingRetryStrategy.isThrottlingRetryResponse = isThrottlingRetryResponse;
-	throttlingRetryStrategy.throttlingRetryStrategy = throttlingRetryStrategy$1;
-	const helpers_js_1 = requireHelpers$1();
-	/**
-	 * The header that comes back from services representing
-	 * the amount of time (minimum) to wait to retry (in seconds or timestamp after which we can retry).
-	 */
-	const RetryAfterHeader = "Retry-After";
-	/**
-	 * The headers that come back from services representing
-	 * the amount of time (minimum) to wait to retry.
-	 *
-	 * "retry-after-ms", "x-ms-retry-after-ms" : milliseconds
-	 * "Retry-After" : seconds or timestamp
-	 */
-	const AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader];
-	/**
-	 * A response is a throttling retry response if it has a throttling status code (429 or 503),
-	 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
-	 *
-	 * Returns the `retryAfterInMs` value if the response is a throttling retry response.
-	 * If not throttling retry response, returns `undefined`.
-	 *
-	 * @internal
-	 */
-	function getRetryAfterInMs(response) {
-	    if (!(response && [429, 503].includes(response.status)))
-	        return undefined;
-	    try {
-	        // Headers: "retry-after-ms", "x-ms-retry-after-ms", "Retry-After"
-	        for (const header of AllRetryAfterHeaders) {
-	            const retryAfterValue = (0, helpers_js_1.parseHeaderValueAsNumber)(response, header);
-	            if (retryAfterValue === 0 || retryAfterValue) {
-	                // "Retry-After" header ==> seconds
-	                // "retry-after-ms", "x-ms-retry-after-ms" headers ==> milli-seconds
-	                const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1;
-	                return retryAfterValue * multiplyingFactor; // in milli-seconds
-	            }
-	        }
-	        // RetryAfterHeader ("Retry-After") has a special case where it might be formatted as a date instead of a number of seconds
-	        const retryAfterHeader = response.headers.get(RetryAfterHeader);
-	        if (!retryAfterHeader)
-	            return;
-	        const date = Date.parse(retryAfterHeader);
-	        const diff = date - Date.now();
-	        // negative diff would mean a date in the past, so retry asap with 0 milliseconds
-	        return Number.isFinite(diff) ? Math.max(0, diff) : undefined;
-	    }
-	    catch {
-	        return undefined;
-	    }
-	}
-	/**
-	 * A response is a retry response if it has a throttling status code (429 or 503),
-	 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
-	 */
-	function isThrottlingRetryResponse(response) {
-	    return Number.isFinite(getRetryAfterInMs(response));
-	}
-	function throttlingRetryStrategy$1() {
-	    return {
-	        name: "throttlingRetryStrategy",
-	        retry({ response }) {
-	            const retryAfterInMs = getRetryAfterInMs(response);
-	            if (!Number.isFinite(retryAfterInMs)) {
-	                return { skipStrategy: true };
-	            }
-	            return {
-	                retryAfterInMs,
-	            };
-	        },
-	    };
-	}
-	
-	return throttlingRetryStrategy;
-}
-
-var hasRequiredExponentialRetryStrategy;
-
-function requireExponentialRetryStrategy () {
-	if (hasRequiredExponentialRetryStrategy) return exponentialRetryStrategy;
-	hasRequiredExponentialRetryStrategy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(exponentialRetryStrategy, "__esModule", { value: true });
-	exponentialRetryStrategy.exponentialRetryStrategy = exponentialRetryStrategy$1;
-	exponentialRetryStrategy.isExponentialRetryResponse = isExponentialRetryResponse;
-	exponentialRetryStrategy.isSystemError = isSystemError;
-	const delay_js_1 = requireDelay$1();
-	const throttlingRetryStrategy_js_1 = requireThrottlingRetryStrategy();
-	// intervals are in milliseconds
-	const DEFAULT_CLIENT_RETRY_INTERVAL = 1000;
-	const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 64;
-	/**
-	 * A retry strategy that retries with an exponentially increasing delay in these two cases:
-	 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
-	 * - Or otherwise if the outgoing request fails (408, greater or equal than 500, except for 501 and 505).
-	 */
-	function exponentialRetryStrategy$1(options = {}) {
-	    const retryInterval = options.retryDelayInMs ?? DEFAULT_CLIENT_RETRY_INTERVAL;
-	    const maxRetryInterval = options.maxRetryDelayInMs ?? DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
-	    return {
-	        name: "exponentialRetryStrategy",
-	        retry({ retryCount, response, responseError }) {
-	            const matchedSystemError = isSystemError(responseError);
-	            const ignoreSystemErrors = matchedSystemError && options.ignoreSystemErrors;
-	            const isExponential = isExponentialRetryResponse(response);
-	            const ignoreExponentialResponse = isExponential && options.ignoreHttpStatusCodes;
-	            const unknownResponse = response && ((0, throttlingRetryStrategy_js_1.isThrottlingRetryResponse)(response) || !isExponential);
-	            if (unknownResponse || ignoreExponentialResponse || ignoreSystemErrors) {
-	                return { skipStrategy: true };
-	            }
-	            if (responseError && !matchedSystemError && !isExponential) {
-	                return { errorToThrow: responseError };
-	            }
-	            return (0, delay_js_1.calculateRetryDelay)(retryCount, {
-	                retryDelayInMs: retryInterval,
-	                maxRetryDelayInMs: maxRetryInterval,
-	            });
-	        },
-	    };
-	}
-	/**
-	 * A response is a retry response if it has status codes:
-	 * - 408, or
-	 * - Greater or equal than 500, except for 501 and 505.
-	 */
-	function isExponentialRetryResponse(response) {
-	    return Boolean(response &&
-	        response.status !== undefined &&
-	        (response.status >= 500 || response.status === 408) &&
-	        response.status !== 501 &&
-	        response.status !== 505);
-	}
-	/**
-	 * Determines whether an error from a pipeline response was triggered in the network layer.
-	 */
-	function isSystemError(err) {
-	    if (!err) {
-	        return false;
-	    }
-	    return (err.code === "ETIMEDOUT" ||
-	        err.code === "ESOCKETTIMEDOUT" ||
-	        err.code === "ECONNREFUSED" ||
-	        err.code === "ECONNRESET" ||
-	        err.code === "ENOENT" ||
-	        err.code === "ENOTFOUND");
-	}
-	
-	return exponentialRetryStrategy;
-}
-
-var retryPolicy$1 = {};
-
-var hasRequiredRetryPolicy$1;
-
-function requireRetryPolicy$1 () {
-	if (hasRequiredRetryPolicy$1) return retryPolicy$1;
-	hasRequiredRetryPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(retryPolicy$1, "__esModule", { value: true });
-	retryPolicy$1.retryPolicy = retryPolicy;
-	const helpers_js_1 = requireHelpers$1();
-	const AbortError_js_1 = requireAbortError$3();
-	const logger_js_1 = requireLogger$1();
-	const constants_js_1 = requireConstants$5();
-	const retryPolicyLogger = (0, logger_js_1.createClientLogger)("ts-http-runtime retryPolicy");
-	/**
-	 * The programmatic identifier of the retryPolicy.
-	 */
-	const retryPolicyName = "retryPolicy";
-	/**
-	 * retryPolicy is a generic policy to enable retrying requests when certain conditions are met
-	 */
-	function retryPolicy(strategies, options = { maxRetries: constants_js_1.DEFAULT_RETRY_POLICY_COUNT }) {
-	    const logger = options.logger || retryPolicyLogger;
-	    return {
-	        name: retryPolicyName,
-	        async sendRequest(request, next) {
-	            let response;
-	            let responseError;
-	            let retryCount = -1;
-	            retryRequest: while (true) {
-	                retryCount += 1;
-	                response = undefined;
-	                responseError = undefined;
-	                try {
-	                    logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId);
-	                    response = await next(request);
-	                    logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId);
-	                }
-	                catch (e) {
-	                    logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId);
-	                    // RestErrors are valid targets for the retry strategies.
-	                    // If none of the retry strategies can work with them, they will be thrown later in this policy.
-	                    // If the received error is not a RestError, it is immediately thrown.
-	                    responseError = e;
-	                    if (!e || responseError.name !== "RestError") {
-	                        throw e;
-	                    }
-	                    response = responseError.response;
-	                }
-	                if (request.abortSignal?.aborted) {
-	                    logger.error(`Retry ${retryCount}: Request aborted.`);
-	                    const abortError = new AbortError_js_1.AbortError();
-	                    throw abortError;
-	                }
-	                if (retryCount >= (options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT)) {
-	                    logger.info(`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`);
-	                    if (responseError) {
-	                        throw responseError;
-	                    }
-	                    else if (response) {
-	                        return response;
-	                    }
-	                    else {
-	                        throw new Error("Maximum retries reached with no response or error to throw");
-	                    }
-	                }
-	                logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`);
-	                strategiesLoop: for (const strategy of strategies) {
-	                    const strategyLogger = strategy.logger || logger;
-	                    strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`);
-	                    const modifiers = strategy.retry({
-	                        retryCount,
-	                        response,
-	                        responseError,
-	                    });
-	                    if (modifiers.skipStrategy) {
-	                        strategyLogger.info(`Retry ${retryCount}: Skipped.`);
-	                        continue strategiesLoop;
-	                    }
-	                    const { errorToThrow, retryAfterInMs, redirectTo } = modifiers;
-	                    if (errorToThrow) {
-	                        strategyLogger.error(`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`, errorToThrow);
-	                        throw errorToThrow;
-	                    }
-	                    if (retryAfterInMs || retryAfterInMs === 0) {
-	                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`);
-	                        await (0, helpers_js_1.delay)(retryAfterInMs, undefined, { abortSignal: request.abortSignal });
-	                        continue retryRequest;
-	                    }
-	                    if (redirectTo) {
-	                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`);
-	                        request.url = redirectTo;
-	                        continue retryRequest;
-	                    }
-	                }
-	                if (responseError) {
-	                    logger.info(`None of the retry strategies could work with the received error. Throwing it.`);
-	                    throw responseError;
-	                }
-	                if (response) {
-	                    logger.info(`None of the retry strategies could work with the received response. Returning it.`);
-	                    return response;
-	                }
-	                // If all the retries skip and there's no response,
-	                // we're still in the retry loop, so a new request will be sent
-	                // until `maxRetries` is reached.
-	            }
-	        },
-	    };
-	}
-	
-	return retryPolicy$1;
-}
-
-var hasRequiredDefaultRetryPolicy$1;
-
-function requireDefaultRetryPolicy$1 () {
-	if (hasRequiredDefaultRetryPolicy$1) return defaultRetryPolicy$1;
-	hasRequiredDefaultRetryPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.defaultRetryPolicyName = void 0;
-		exports$1.defaultRetryPolicy = defaultRetryPolicy;
-		const exponentialRetryStrategy_js_1 = requireExponentialRetryStrategy();
-		const throttlingRetryStrategy_js_1 = requireThrottlingRetryStrategy();
-		const retryPolicy_js_1 = requireRetryPolicy$1();
-		const constants_js_1 = requireConstants$5();
-		/**
-		 * Name of the {@link defaultRetryPolicy}
-		 */
-		exports$1.defaultRetryPolicyName = "defaultRetryPolicy";
-		/**
-		 * A policy that retries according to three strategies:
-		 * - When the server sends a 429 response with a Retry-After header.
-		 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
-		 * - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
-		 */
-		function defaultRetryPolicy(options = {}) {
-		    return {
-		        name: exports$1.defaultRetryPolicyName,
-		        sendRequest: (0, retryPolicy_js_1.retryPolicy)([(0, throttlingRetryStrategy_js_1.throttlingRetryStrategy)(), (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)(options)], {
-		            maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
-		        }).sendRequest,
-		    };
-		}
-		
-	} (defaultRetryPolicy$1));
-	return defaultRetryPolicy$1;
-}
-
-var formDataPolicy$1 = {};
-
-var checkEnvironment = {};
-
-var hasRequiredCheckEnvironment;
-
-function requireCheckEnvironment () {
-	if (hasRequiredCheckEnvironment) return checkEnvironment;
-	hasRequiredCheckEnvironment = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.isReactNative = exports$1.isNodeRuntime = exports$1.isNodeLike = exports$1.isBun = exports$1.isDeno = exports$1.isWebWorker = exports$1.isBrowser = void 0;
-		/**
-		 * A constant that indicates whether the environment the code is running is a Web Browser.
-		 */
-		// eslint-disable-next-line @azure/azure-sdk/ts-no-window
-		exports$1.isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
-		/**
-		 * A constant that indicates whether the environment the code is running is a Web Worker.
-		 */
-		exports$1.isWebWorker = typeof self === "object" &&
-		    typeof self?.importScripts === "function" &&
-		    (self.constructor?.name === "DedicatedWorkerGlobalScope" ||
-		        self.constructor?.name === "ServiceWorkerGlobalScope" ||
-		        self.constructor?.name === "SharedWorkerGlobalScope");
-		/**
-		 * A constant that indicates whether the environment the code is running is Deno.
-		 */
-		exports$1.isDeno = typeof Deno !== "undefined" &&
-		    typeof Deno.version !== "undefined" &&
-		    typeof Deno.version.deno !== "undefined";
-		/**
-		 * A constant that indicates whether the environment the code is running is Bun.sh.
-		 */
-		exports$1.isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined";
-		/**
-		 * A constant that indicates whether the environment the code is running is a Node.js compatible environment.
-		 */
-		exports$1.isNodeLike = typeof globalThis.process !== "undefined" &&
-		    Boolean(globalThis.process.version) &&
-		    Boolean(globalThis.process.versions?.node);
-		/**
-		 * A constant that indicates whether the environment the code is running is Node.JS.
-		 */
-		exports$1.isNodeRuntime = exports$1.isNodeLike && !exports$1.isBun && !exports$1.isDeno;
-		/**
-		 * A constant that indicates whether the environment the code is running is in React-Native.
-		 */
-		// https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js
-		exports$1.isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative";
-		
-	} (checkEnvironment));
-	return checkEnvironment;
-}
-
-var hasRequiredFormDataPolicy$1;
-
-function requireFormDataPolicy$1 () {
-	if (hasRequiredFormDataPolicy$1) return formDataPolicy$1;
-	hasRequiredFormDataPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.formDataPolicyName = void 0;
-		exports$1.formDataPolicy = formDataPolicy;
-		const bytesEncoding_js_1 = requireBytesEncoding();
-		const checkEnvironment_js_1 = requireCheckEnvironment();
-		const httpHeaders_js_1 = requireHttpHeaders$1();
-		/**
-		 * The programmatic identifier of the formDataPolicy.
-		 */
-		exports$1.formDataPolicyName = "formDataPolicy";
-		function formDataToFormDataMap(formData) {
-		    const formDataMap = {};
-		    for (const [key, value] of formData.entries()) {
-		        formDataMap[key] ??= [];
-		        formDataMap[key].push(value);
-		    }
-		    return formDataMap;
-		}
-		/**
-		 * A policy that encodes FormData on the request into the body.
-		 */
-		function formDataPolicy() {
-		    return {
-		        name: exports$1.formDataPolicyName,
-		        async sendRequest(request, next) {
-		            if (checkEnvironment_js_1.isNodeLike && typeof FormData !== "undefined" && request.body instanceof FormData) {
-		                request.formData = formDataToFormDataMap(request.body);
-		                request.body = undefined;
-		            }
-		            if (request.formData) {
-		                const contentType = request.headers.get("Content-Type");
-		                if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) {
-		                    request.body = wwwFormUrlEncode(request.formData);
-		                }
-		                else {
-		                    await prepareFormData(request.formData, request);
-		                }
-		                request.formData = undefined;
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		function wwwFormUrlEncode(formData) {
-		    const urlSearchParams = new URLSearchParams();
-		    for (const [key, value] of Object.entries(formData)) {
-		        if (Array.isArray(value)) {
-		            for (const subValue of value) {
-		                urlSearchParams.append(key, subValue.toString());
-		            }
-		        }
-		        else {
-		            urlSearchParams.append(key, value.toString());
-		        }
-		    }
-		    return urlSearchParams.toString();
-		}
-		async function prepareFormData(formData, request) {
-		    // validate content type (multipart/form-data)
-		    const contentType = request.headers.get("Content-Type");
-		    if (contentType && !contentType.startsWith("multipart/form-data")) {
-		        // content type is specified and is not multipart/form-data. Exit.
-		        return;
-		    }
-		    request.headers.set("Content-Type", contentType ?? "multipart/form-data");
-		    // set body to MultipartRequestBody using content from FormDataMap
-		    const parts = [];
-		    for (const [fieldName, values] of Object.entries(formData)) {
-		        for (const value of Array.isArray(values) ? values : [values]) {
-		            if (typeof value === "string") {
-		                parts.push({
-		                    headers: (0, httpHeaders_js_1.createHttpHeaders)({
-		                        "Content-Disposition": `form-data; name="${fieldName}"`,
-		                    }),
-		                    body: (0, bytesEncoding_js_1.stringToUint8Array)(value, "utf-8"),
-		                });
-		            }
-		            else if (value === undefined || value === null || typeof value !== "object") {
-		                throw new Error(`Unexpected value for key ${fieldName}: ${value}. Value should be serialized to string first.`);
-		            }
-		            else {
-		                // using || instead of ?? here since if value.name is empty we should create a file name
-		                const fileName = value.name || "blob";
-		                const headers = (0, httpHeaders_js_1.createHttpHeaders)();
-		                headers.set("Content-Disposition", `form-data; name="${fieldName}"; filename="${fileName}"`);
-		                // again, || is used since an empty value.type means the content type is unset
-		                headers.set("Content-Type", value.type || "application/octet-stream");
-		                parts.push({
-		                    headers,
-		                    body: value,
-		                });
-		            }
-		        }
-		    }
-		    request.multipartBody = { parts };
-		}
-		
-	} (formDataPolicy$1));
-	return formDataPolicy$1;
-}
-
-var proxyPolicy$1 = {};
-
-var dist$2 = {};
-
-var src$2 = {exports: {}};
-
-var browser = {exports: {}};
-
-/**
- * Helpers.
- */
-
-var ms;
-var hasRequiredMs;
-
-function requireMs () {
-	if (hasRequiredMs) return ms;
-	hasRequiredMs = 1;
-	var s = 1000;
-	var m = s * 60;
-	var h = m * 60;
-	var d = h * 24;
-	var w = d * 7;
-	var y = d * 365.25;
-
-	/**
-	 * Parse or format the given `val`.
-	 *
-	 * Options:
-	 *
-	 *  - `long` verbose formatting [false]
-	 *
-	 * @param {String|Number} val
-	 * @param {Object} [options]
-	 * @throws {Error} throw an error if val is not a non-empty string or a number
-	 * @return {String|Number}
-	 * @api public
-	 */
-
-	ms = function (val, options) {
-	  options = options || {};
-	  var type = typeof val;
-	  if (type === 'string' && val.length > 0) {
-	    return parse(val);
-	  } else if (type === 'number' && isFinite(val)) {
-	    return options.long ? fmtLong(val) : fmtShort(val);
-	  }
-	  throw new Error(
-	    'val is not a non-empty string or a valid number. val=' +
-	      JSON.stringify(val)
-	  );
-	};
-
-	/**
-	 * Parse the given `str` and return milliseconds.
-	 *
-	 * @param {String} str
-	 * @return {Number}
-	 * @api private
-	 */
-
-	function parse(str) {
-	  str = String(str);
-	  if (str.length > 100) {
-	    return;
-	  }
-	  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
-	    str
-	  );
-	  if (!match) {
-	    return;
-	  }
-	  var n = parseFloat(match[1]);
-	  var type = (match[2] || 'ms').toLowerCase();
-	  switch (type) {
-	    case 'years':
-	    case 'year':
-	    case 'yrs':
-	    case 'yr':
-	    case 'y':
-	      return n * y;
-	    case 'weeks':
-	    case 'week':
-	    case 'w':
-	      return n * w;
-	    case 'days':
-	    case 'day':
-	    case 'd':
-	      return n * d;
-	    case 'hours':
-	    case 'hour':
-	    case 'hrs':
-	    case 'hr':
-	    case 'h':
-	      return n * h;
-	    case 'minutes':
-	    case 'minute':
-	    case 'mins':
-	    case 'min':
-	    case 'm':
-	      return n * m;
-	    case 'seconds':
-	    case 'second':
-	    case 'secs':
-	    case 'sec':
-	    case 's':
-	      return n * s;
-	    case 'milliseconds':
-	    case 'millisecond':
-	    case 'msecs':
-	    case 'msec':
-	    case 'ms':
-	      return n;
-	    default:
-	      return undefined;
-	  }
-	}
-
-	/**
-	 * Short format for `ms`.
-	 *
-	 * @param {Number} ms
-	 * @return {String}
-	 * @api private
-	 */
-
-	function fmtShort(ms) {
-	  var msAbs = Math.abs(ms);
-	  if (msAbs >= d) {
-	    return Math.round(ms / d) + 'd';
-	  }
-	  if (msAbs >= h) {
-	    return Math.round(ms / h) + 'h';
-	  }
-	  if (msAbs >= m) {
-	    return Math.round(ms / m) + 'm';
-	  }
-	  if (msAbs >= s) {
-	    return Math.round(ms / s) + 's';
-	  }
-	  return ms + 'ms';
-	}
-
-	/**
-	 * Long format for `ms`.
-	 *
-	 * @param {Number} ms
-	 * @return {String}
-	 * @api private
-	 */
-
-	function fmtLong(ms) {
-	  var msAbs = Math.abs(ms);
-	  if (msAbs >= d) {
-	    return plural(ms, msAbs, d, 'day');
-	  }
-	  if (msAbs >= h) {
-	    return plural(ms, msAbs, h, 'hour');
-	  }
-	  if (msAbs >= m) {
-	    return plural(ms, msAbs, m, 'minute');
-	  }
-	  if (msAbs >= s) {
-	    return plural(ms, msAbs, s, 'second');
-	  }
-	  return ms + ' ms';
-	}
-
-	/**
-	 * Pluralization helper.
-	 */
-
-	function plural(ms, msAbs, n, name) {
-	  var isPlural = msAbs >= n * 1.5;
-	  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
-	}
-	return ms;
-}
-
-var common;
-var hasRequiredCommon;
-
-function requireCommon () {
-	if (hasRequiredCommon) return common;
-	hasRequiredCommon = 1;
-	/**
-	 * This is the common logic for both the Node.js and web browser
-	 * implementations of `debug()`.
-	 */
-
-	function setup(env) {
-		createDebug.debug = createDebug;
-		createDebug.default = createDebug;
-		createDebug.coerce = coerce;
-		createDebug.disable = disable;
-		createDebug.enable = enable;
-		createDebug.enabled = enabled;
-		createDebug.humanize = requireMs();
-		createDebug.destroy = destroy;
-
-		Object.keys(env).forEach(key => {
-			createDebug[key] = env[key];
-		});
-
-		/**
-		* The currently active debug mode names, and names to skip.
-		*/
-
-		createDebug.names = [];
-		createDebug.skips = [];
-
-		/**
-		* Map of special "%n" handling functions, for the debug "format" argument.
-		*
-		* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
-		*/
-		createDebug.formatters = {};
-
-		/**
-		* Selects a color for a debug namespace
-		* @param {String} namespace The namespace string for the debug instance to be colored
-		* @return {Number|String} An ANSI color code for the given namespace
-		* @api private
-		*/
-		function selectColor(namespace) {
-			let hash = 0;
-
-			for (let i = 0; i < namespace.length; i++) {
-				hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
-				hash |= 0; // Convert to 32bit integer
-			}
-
-			return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
-		}
-		createDebug.selectColor = selectColor;
-
-		/**
-		* Create a debugger with the given `namespace`.
-		*
-		* @param {String} namespace
-		* @return {Function}
-		* @api public
-		*/
-		function createDebug(namespace) {
-			let prevTime;
-			let enableOverride = null;
-			let namespacesCache;
-			let enabledCache;
-
-			function debug(...args) {
-				// Disabled?
-				if (!debug.enabled) {
-					return;
-				}
-
-				const self = debug;
-
-				// Set `diff` timestamp
-				const curr = Number(new Date());
-				const ms = curr - (prevTime || curr);
-				self.diff = ms;
-				self.prev = prevTime;
-				self.curr = curr;
-				prevTime = curr;
-
-				args[0] = createDebug.coerce(args[0]);
-
-				if (typeof args[0] !== 'string') {
-					// Anything else let's inspect with %O
-					args.unshift('%O');
-				}
-
-				// Apply any `formatters` transformations
-				let index = 0;
-				args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
-					// If we encounter an escaped % then don't increase the array index
-					if (match === '%%') {
-						return '%';
-					}
-					index++;
-					const formatter = createDebug.formatters[format];
-					if (typeof formatter === 'function') {
-						const val = args[index];
-						match = formatter.call(self, val);
-
-						// Now we need to remove `args[index]` since it's inlined in the `format`
-						args.splice(index, 1);
-						index--;
-					}
-					return match;
-				});
-
-				// Apply env-specific formatting (colors, etc.)
-				createDebug.formatArgs.call(self, args);
-
-				const logFn = self.log || createDebug.log;
-				logFn.apply(self, args);
-			}
-
-			debug.namespace = namespace;
-			debug.useColors = createDebug.useColors();
-			debug.color = createDebug.selectColor(namespace);
-			debug.extend = extend;
-			debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
-
-			Object.defineProperty(debug, 'enabled', {
-				enumerable: true,
-				configurable: false,
-				get: () => {
-					if (enableOverride !== null) {
-						return enableOverride;
-					}
-					if (namespacesCache !== createDebug.namespaces) {
-						namespacesCache = createDebug.namespaces;
-						enabledCache = createDebug.enabled(namespace);
-					}
-
-					return enabledCache;
-				},
-				set: v => {
-					enableOverride = v;
-				}
-			});
-
-			// Env-specific initialization logic for debug instances
-			if (typeof createDebug.init === 'function') {
-				createDebug.init(debug);
-			}
-
-			return debug;
-		}
-
-		function extend(namespace, delimiter) {
-			const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
-			newDebug.log = this.log;
-			return newDebug;
-		}
-
-		/**
-		* Enables a debug mode by namespaces. This can include modes
-		* separated by a colon and wildcards.
-		*
-		* @param {String} namespaces
-		* @api public
-		*/
-		function enable(namespaces) {
-			createDebug.save(namespaces);
-			createDebug.namespaces = namespaces;
-
-			createDebug.names = [];
-			createDebug.skips = [];
-
-			const split = (typeof namespaces === 'string' ? namespaces : '')
-				.trim()
-				.replace(/\s+/g, ',')
-				.split(',')
-				.filter(Boolean);
-
-			for (const ns of split) {
-				if (ns[0] === '-') {
-					createDebug.skips.push(ns.slice(1));
-				} else {
-					createDebug.names.push(ns);
-				}
-			}
-		}
-
-		/**
-		 * Checks if the given string matches a namespace template, honoring
-		 * asterisks as wildcards.
-		 *
-		 * @param {String} search
-		 * @param {String} template
-		 * @return {Boolean}
-		 */
-		function matchesTemplate(search, template) {
-			let searchIndex = 0;
-			let templateIndex = 0;
-			let starIndex = -1;
-			let matchIndex = 0;
-
-			while (searchIndex < search.length) {
-				if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {
-					// Match character or proceed with wildcard
-					if (template[templateIndex] === '*') {
-						starIndex = templateIndex;
-						matchIndex = searchIndex;
-						templateIndex++; // Skip the '*'
-					} else {
-						searchIndex++;
-						templateIndex++;
-					}
-				} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition
-					// Backtrack to the last '*' and try to match more characters
-					templateIndex = starIndex + 1;
-					matchIndex++;
-					searchIndex = matchIndex;
-				} else {
-					return false; // No match
-				}
-			}
-
-			// Handle trailing '*' in template
-			while (templateIndex < template.length && template[templateIndex] === '*') {
-				templateIndex++;
-			}
-
-			return templateIndex === template.length;
-		}
-
-		/**
-		* Disable debug output.
-		*
-		* @return {String} namespaces
-		* @api public
-		*/
-		function disable() {
-			const namespaces = [
-				...createDebug.names,
-				...createDebug.skips.map(namespace => '-' + namespace)
-			].join(',');
-			createDebug.enable('');
-			return namespaces;
-		}
-
-		/**
-		* Returns true if the given mode name is enabled, false otherwise.
-		*
-		* @param {String} name
-		* @return {Boolean}
-		* @api public
-		*/
-		function enabled(name) {
-			for (const skip of createDebug.skips) {
-				if (matchesTemplate(name, skip)) {
-					return false;
-				}
-			}
-
-			for (const ns of createDebug.names) {
-				if (matchesTemplate(name, ns)) {
-					return true;
-				}
-			}
-
-			return false;
-		}
-
-		/**
-		* Coerce `val`.
-		*
-		* @param {Mixed} val
-		* @return {Mixed}
-		* @api private
-		*/
-		function coerce(val) {
-			if (val instanceof Error) {
-				return val.stack || val.message;
-			}
-			return val;
-		}
-
-		/**
-		* XXX DO NOT USE. This is a temporary stub function.
-		* XXX It WILL be removed in the next major release.
-		*/
-		function destroy() {
-			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
-		}
-
-		createDebug.enable(createDebug.load());
-
-		return createDebug;
-	}
-
-	common = setup;
-	return common;
-}
-
-/* eslint-env browser */
-
-var hasRequiredBrowser;
-
-function requireBrowser () {
-	if (hasRequiredBrowser) return browser.exports;
-	hasRequiredBrowser = 1;
-	(function (module, exports$1) {
-		/**
-		 * This is the web browser implementation of `debug()`.
-		 */
-
-		exports$1.formatArgs = formatArgs;
-		exports$1.save = save;
-		exports$1.load = load;
-		exports$1.useColors = useColors;
-		exports$1.storage = localstorage();
-		exports$1.destroy = (() => {
-			let warned = false;
-
-			return () => {
-				if (!warned) {
-					warned = true;
-					console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
-				}
-			};
-		})();
-
-		/**
-		 * Colors.
-		 */
-
-		exports$1.colors = [
-			'#0000CC',
-			'#0000FF',
-			'#0033CC',
-			'#0033FF',
-			'#0066CC',
-			'#0066FF',
-			'#0099CC',
-			'#0099FF',
-			'#00CC00',
-			'#00CC33',
-			'#00CC66',
-			'#00CC99',
-			'#00CCCC',
-			'#00CCFF',
-			'#3300CC',
-			'#3300FF',
-			'#3333CC',
-			'#3333FF',
-			'#3366CC',
-			'#3366FF',
-			'#3399CC',
-			'#3399FF',
-			'#33CC00',
-			'#33CC33',
-			'#33CC66',
-			'#33CC99',
-			'#33CCCC',
-			'#33CCFF',
-			'#6600CC',
-			'#6600FF',
-			'#6633CC',
-			'#6633FF',
-			'#66CC00',
-			'#66CC33',
-			'#9900CC',
-			'#9900FF',
-			'#9933CC',
-			'#9933FF',
-			'#99CC00',
-			'#99CC33',
-			'#CC0000',
-			'#CC0033',
-			'#CC0066',
-			'#CC0099',
-			'#CC00CC',
-			'#CC00FF',
-			'#CC3300',
-			'#CC3333',
-			'#CC3366',
-			'#CC3399',
-			'#CC33CC',
-			'#CC33FF',
-			'#CC6600',
-			'#CC6633',
-			'#CC9900',
-			'#CC9933',
-			'#CCCC00',
-			'#CCCC33',
-			'#FF0000',
-			'#FF0033',
-			'#FF0066',
-			'#FF0099',
-			'#FF00CC',
-			'#FF00FF',
-			'#FF3300',
-			'#FF3333',
-			'#FF3366',
-			'#FF3399',
-			'#FF33CC',
-			'#FF33FF',
-			'#FF6600',
-			'#FF6633',
-			'#FF9900',
-			'#FF9933',
-			'#FFCC00',
-			'#FFCC33'
-		];
-
-		/**
-		 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
-		 * and the Firebug extension (any Firefox version) are known
-		 * to support "%c" CSS customizations.
-		 *
-		 * TODO: add a `localStorage` variable to explicitly enable/disable colors
-		 */
-
-		// eslint-disable-next-line complexity
-		function useColors() {
-			// NB: In an Electron preload script, document will be defined but not fully
-			// initialized. Since we know we're in Chrome, we'll just detect this case
-			// explicitly
-			if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
-				return true;
-			}
-
-			// Internet Explorer and Edge do not support colors.
-			if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
-				return false;
-			}
-
-			let m;
-
-			// Is webkit? http://stackoverflow.com/a/16459606/376773
-			// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-			// eslint-disable-next-line no-return-assign
-			return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
-				// Is firebug? http://stackoverflow.com/a/398120/376773
-				(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
-				// Is firefox >= v31?
-				// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
-				(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) ||
-				// Double check webkit in userAgent just in case we are in a worker
-				(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-		}
-
-		/**
-		 * Colorize log arguments if enabled.
-		 *
-		 * @api public
-		 */
-
-		function formatArgs(args) {
-			args[0] = (this.useColors ? '%c' : '') +
-				this.namespace +
-				(this.useColors ? ' %c' : ' ') +
-				args[0] +
-				(this.useColors ? '%c ' : ' ') +
-				'+' + module.exports.humanize(this.diff);
-
-			if (!this.useColors) {
-				return;
-			}
-
-			const c = 'color: ' + this.color;
-			args.splice(1, 0, c, 'color: inherit');
-
-			// The final "%c" is somewhat tricky, because there could be other
-			// arguments passed either before or after the %c, so we need to
-			// figure out the correct index to insert the CSS into
-			let index = 0;
-			let lastC = 0;
-			args[0].replace(/%[a-zA-Z%]/g, match => {
-				if (match === '%%') {
-					return;
-				}
-				index++;
-				if (match === '%c') {
-					// We only are interested in the *last* %c
-					// (the user may have provided their own)
-					lastC = index;
-				}
-			});
-
-			args.splice(lastC, 0, c);
-		}
-
-		/**
-		 * Invokes `console.debug()` when available.
-		 * No-op when `console.debug` is not a "function".
-		 * If `console.debug` is not available, falls back
-		 * to `console.log`.
-		 *
-		 * @api public
-		 */
-		exports$1.log = console.debug || console.log || (() => {});
-
-		/**
-		 * Save `namespaces`.
-		 *
-		 * @param {String} namespaces
-		 * @api private
-		 */
-		function save(namespaces) {
-			try {
-				if (namespaces) {
-					exports$1.storage.setItem('debug', namespaces);
-				} else {
-					exports$1.storage.removeItem('debug');
-				}
-			} catch (error) {
-				// Swallow
-				// XXX (@Qix-) should we be logging these?
-			}
-		}
-
-		/**
-		 * Load `namespaces`.
-		 *
-		 * @return {String} returns the previously persisted debug modes
-		 * @api private
-		 */
-		function load() {
-			let r;
-			try {
-				r = exports$1.storage.getItem('debug') || exports$1.storage.getItem('DEBUG') ;
-			} catch (error) {
-				// Swallow
-				// XXX (@Qix-) should we be logging these?
-			}
-
-			// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-			if (!r && typeof process !== 'undefined' && 'env' in process) {
-				r = process.env.DEBUG;
-			}
-
-			return r;
-		}
-
-		/**
-		 * Localstorage attempts to return the localstorage.
-		 *
-		 * This is necessary because safari throws
-		 * when a user disables cookies/localstorage
-		 * and you attempt to access it.
-		 *
-		 * @return {LocalStorage}
-		 * @api private
-		 */
-
-		function localstorage() {
-			try {
-				// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
-				// The Browser also has localStorage in the global context.
-				return localStorage;
-			} catch (error) {
-				// Swallow
-				// XXX (@Qix-) should we be logging these?
-			}
-		}
-
-		module.exports = requireCommon()(exports$1);
-
-		const {formatters} = module.exports;
-
-		/**
-		 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
-		 */
-
-		formatters.j = function (v) {
-			try {
-				return JSON.stringify(v);
-			} catch (error) {
-				return '[UnexpectedJSONParseError]: ' + error.message;
-			}
-		}; 
-	} (browser, browser.exports));
-	return browser.exports;
-}
-
-var node = {exports: {}};
-
-var hasFlag;
-var hasRequiredHasFlag;
-
-function requireHasFlag () {
-	if (hasRequiredHasFlag) return hasFlag;
-	hasRequiredHasFlag = 1;
-
-	hasFlag = (flag, argv = process.argv) => {
-		const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
-		const position = argv.indexOf(prefix + flag);
-		const terminatorPosition = argv.indexOf('--');
-		return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
-	};
-	return hasFlag;
-}
-
-var supportsColor_1;
-var hasRequiredSupportsColor;
-
-function requireSupportsColor () {
-	if (hasRequiredSupportsColor) return supportsColor_1;
-	hasRequiredSupportsColor = 1;
-	const os = require$$0$3;
-	const tty = require$$1$9;
-	const hasFlag = requireHasFlag();
-
-	const {env} = process;
-
-	let forceColor;
-	if (hasFlag('no-color') ||
-		hasFlag('no-colors') ||
-		hasFlag('color=false') ||
-		hasFlag('color=never')) {
-		forceColor = 0;
-	} else if (hasFlag('color') ||
-		hasFlag('colors') ||
-		hasFlag('color=true') ||
-		hasFlag('color=always')) {
-		forceColor = 1;
-	}
-
-	if ('FORCE_COLOR' in env) {
-		if (env.FORCE_COLOR === 'true') {
-			forceColor = 1;
-		} else if (env.FORCE_COLOR === 'false') {
-			forceColor = 0;
-		} else {
-			forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
-		}
-	}
-
-	function translateLevel(level) {
-		if (level === 0) {
-			return false;
-		}
-
-		return {
-			level,
-			hasBasic: true,
-			has256: level >= 2,
-			has16m: level >= 3
-		};
-	}
-
-	function supportsColor(haveStream, streamIsTTY) {
-		if (forceColor === 0) {
-			return 0;
-		}
-
-		if (hasFlag('color=16m') ||
-			hasFlag('color=full') ||
-			hasFlag('color=truecolor')) {
-			return 3;
-		}
-
-		if (hasFlag('color=256')) {
-			return 2;
-		}
-
-		if (haveStream && !streamIsTTY && forceColor === undefined) {
-			return 0;
-		}
-
-		const min = forceColor || 0;
-
-		if (env.TERM === 'dumb') {
-			return min;
-		}
-
-		if (process.platform === 'win32') {
-			// Windows 10 build 10586 is the first Windows release that supports 256 colors.
-			// Windows 10 build 14931 is the first release that supports 16m/TrueColor.
-			const osRelease = os.release().split('.');
-			if (
-				Number(osRelease[0]) >= 10 &&
-				Number(osRelease[2]) >= 10586
-			) {
-				return Number(osRelease[2]) >= 14931 ? 3 : 2;
-			}
-
-			return 1;
-		}
-
-		if ('CI' in env) {
-			if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
-				return 1;
-			}
-
-			return min;
-		}
-
-		if ('TEAMCITY_VERSION' in env) {
-			return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
-		}
-
-		if (env.COLORTERM === 'truecolor') {
-			return 3;
-		}
-
-		if ('TERM_PROGRAM' in env) {
-			const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
-
-			switch (env.TERM_PROGRAM) {
-				case 'iTerm.app':
-					return version >= 3 ? 3 : 2;
-				case 'Apple_Terminal':
-					return 2;
-				// No default
-			}
-		}
-
-		if (/-256(color)?$/i.test(env.TERM)) {
-			return 2;
-		}
-
-		if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
-			return 1;
-		}
-
-		if ('COLORTERM' in env) {
-			return 1;
-		}
-
-		return min;
-	}
-
-	function getSupportLevel(stream) {
-		const level = supportsColor(stream, stream && stream.isTTY);
-		return translateLevel(level);
-	}
-
-	supportsColor_1 = {
-		supportsColor: getSupportLevel,
-		stdout: translateLevel(supportsColor(true, tty.isatty(1))),
-		stderr: translateLevel(supportsColor(true, tty.isatty(2)))
-	};
-	return supportsColor_1;
-}
-
-/**
- * Module dependencies.
- */
-
-var hasRequiredNode;
-
-function requireNode () {
-	if (hasRequiredNode) return node.exports;
-	hasRequiredNode = 1;
-	(function (module, exports$1) {
-		const tty = require$$1$9;
-		const util = require$$0$6;
-
-		/**
-		 * This is the Node.js implementation of `debug()`.
-		 */
-
-		exports$1.init = init;
-		exports$1.log = log;
-		exports$1.formatArgs = formatArgs;
-		exports$1.save = save;
-		exports$1.load = load;
-		exports$1.useColors = useColors;
-		exports$1.destroy = util.deprecate(
-			() => {},
-			'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
-		);
-
-		/**
-		 * Colors.
-		 */
-
-		exports$1.colors = [6, 2, 3, 4, 5, 1];
-
-		try {
-			// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
-			// eslint-disable-next-line import/no-extraneous-dependencies
-			const supportsColor = requireSupportsColor();
-
-			if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
-				exports$1.colors = [
-					20,
-					21,
-					26,
-					27,
-					32,
-					33,
-					38,
-					39,
-					40,
-					41,
-					42,
-					43,
-					44,
-					45,
-					56,
-					57,
-					62,
-					63,
-					68,
-					69,
-					74,
-					75,
-					76,
-					77,
-					78,
-					79,
-					80,
-					81,
-					92,
-					93,
-					98,
-					99,
-					112,
-					113,
-					128,
-					129,
-					134,
-					135,
-					148,
-					149,
-					160,
-					161,
-					162,
-					163,
-					164,
-					165,
-					166,
-					167,
-					168,
-					169,
-					170,
-					171,
-					172,
-					173,
-					178,
-					179,
-					184,
-					185,
-					196,
-					197,
-					198,
-					199,
-					200,
-					201,
-					202,
-					203,
-					204,
-					205,
-					206,
-					207,
-					208,
-					209,
-					214,
-					215,
-					220,
-					221
-				];
-			}
-		} catch (error) {
-			// Swallow - we only care if `supports-color` is available; it doesn't have to be.
-		}
-
-		/**
-		 * Build up the default `inspectOpts` object from the environment variables.
-		 *
-		 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
-		 */
-
-		exports$1.inspectOpts = Object.keys(process.env).filter(key => {
-			return /^debug_/i.test(key);
-		}).reduce((obj, key) => {
-			// Camel-case
-			const prop = key
-				.substring(6)
-				.toLowerCase()
-				.replace(/_([a-z])/g, (_, k) => {
-					return k.toUpperCase();
-				});
-
-			// Coerce string value into JS value
-			let val = process.env[key];
-			if (/^(yes|on|true|enabled)$/i.test(val)) {
-				val = true;
-			} else if (/^(no|off|false|disabled)$/i.test(val)) {
-				val = false;
-			} else if (val === 'null') {
-				val = null;
-			} else {
-				val = Number(val);
-			}
-
-			obj[prop] = val;
-			return obj;
-		}, {});
-
-		/**
-		 * Is stdout a TTY? Colored output is enabled when `true`.
-		 */
-
-		function useColors() {
-			return 'colors' in exports$1.inspectOpts ?
-				Boolean(exports$1.inspectOpts.colors) :
-				tty.isatty(process.stderr.fd);
-		}
-
-		/**
-		 * Adds ANSI color escape codes if enabled.
-		 *
-		 * @api public
-		 */
-
-		function formatArgs(args) {
-			const {namespace: name, useColors} = this;
-
-			if (useColors) {
-				const c = this.color;
-				const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
-				const prefix = `  ${colorCode};1m${name} \u001B[0m`;
-
-				args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-				args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
-			} else {
-				args[0] = getDate() + name + ' ' + args[0];
-			}
-		}
-
-		function getDate() {
-			if (exports$1.inspectOpts.hideDate) {
-				return '';
-			}
-			return new Date().toISOString() + ' ';
-		}
-
-		/**
-		 * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.
-		 */
-
-		function log(...args) {
-			return process.stderr.write(util.formatWithOptions(exports$1.inspectOpts, ...args) + '\n');
-		}
-
-		/**
-		 * Save `namespaces`.
-		 *
-		 * @param {String} namespaces
-		 * @api private
-		 */
-		function save(namespaces) {
-			if (namespaces) {
-				process.env.DEBUG = namespaces;
-			} else {
-				// If you set a process.env field to null or undefined, it gets cast to the
-				// string 'null' or 'undefined'. Just delete instead.
-				delete process.env.DEBUG;
-			}
-		}
-
-		/**
-		 * Load `namespaces`.
-		 *
-		 * @return {String} returns the previously persisted debug modes
-		 * @api private
-		 */
-
-		function load() {
-			return process.env.DEBUG;
-		}
-
-		/**
-		 * Init logic for `debug` instances.
-		 *
-		 * Create a new `inspectOpts` object in case `useColors` is set
-		 * differently for a particular `debug` instance.
-		 */
-
-		function init(debug) {
-			debug.inspectOpts = {};
-
-			const keys = Object.keys(exports$1.inspectOpts);
-			for (let i = 0; i < keys.length; i++) {
-				debug.inspectOpts[keys[i]] = exports$1.inspectOpts[keys[i]];
-			}
-		}
-
-		module.exports = requireCommon()(exports$1);
-
-		const {formatters} = module.exports;
-
-		/**
-		 * Map %o to `util.inspect()`, all on a single line.
-		 */
-
-		formatters.o = function (v) {
-			this.inspectOpts.colors = this.useColors;
-			return util.inspect(v, this.inspectOpts)
-				.split('\n')
-				.map(str => str.trim())
-				.join(' ');
-		};
-
-		/**
-		 * Map %O to `util.inspect()`, allowing multiple lines if needed.
-		 */
-
-		formatters.O = function (v) {
-			this.inspectOpts.colors = this.useColors;
-			return util.inspect(v, this.inspectOpts);
-		}; 
-	} (node, node.exports));
-	return node.exports;
-}
-
-/**
- * Detect Electron renderer / nwjs process, which is node, but we should
- * treat as a browser.
- */
-
-var hasRequiredSrc$1;
-
-function requireSrc$1 () {
-	if (hasRequiredSrc$1) return src$2.exports;
-	hasRequiredSrc$1 = 1;
-	if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
-		src$2.exports = requireBrowser();
-	} else {
-		src$2.exports = requireNode();
-	}
-	return src$2.exports;
-}
-
-var dist$1 = {};
-
-var helpers = {};
-
-var hasRequiredHelpers;
-
-function requireHelpers () {
-	if (hasRequiredHelpers) return helpers;
-	hasRequiredHelpers = 1;
-	var __createBinding = (helpers && helpers.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (helpers && helpers.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (helpers && helpers.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	Object.defineProperty(helpers, "__esModule", { value: true });
-	helpers.req = helpers.json = helpers.toBuffer = void 0;
-	const http = __importStar(require$$0$5);
-	const https = __importStar(require$$1$2);
-	async function toBuffer(stream) {
-	    let length = 0;
-	    const chunks = [];
-	    for await (const chunk of stream) {
-	        length += chunk.length;
-	        chunks.push(chunk);
-	    }
-	    return Buffer.concat(chunks, length);
-	}
-	helpers.toBuffer = toBuffer;
-	// eslint-disable-next-line @typescript-eslint/no-explicit-any
-	async function json(stream) {
-	    const buf = await toBuffer(stream);
-	    const str = buf.toString('utf8');
-	    try {
-	        return JSON.parse(str);
-	    }
-	    catch (_err) {
-	        const err = _err;
-	        err.message += ` (input: ${str})`;
-	        throw err;
-	    }
-	}
-	helpers.json = json;
-	function req(url, opts = {}) {
-	    const href = typeof url === 'string' ? url : url.href;
-	    const req = (href.startsWith('https:') ? https : http).request(url, opts);
-	    const promise = new Promise((resolve, reject) => {
-	        req
-	            .once('response', resolve)
-	            .once('error', reject)
-	            .end();
-	    });
-	    req.then = promise.then.bind(promise);
-	    return req;
-	}
-	helpers.req = req;
-	
-	return helpers;
-}
-
-var hasRequiredDist$2;
-
-function requireDist$2 () {
-	if (hasRequiredDist$2) return dist$1;
-	hasRequiredDist$2 = 1;
-	(function (exports$1) {
-		var __createBinding = (dist$1 && dist$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    var desc = Object.getOwnPropertyDescriptor(m, k);
-		    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-		      desc = { enumerable: true, get: function() { return m[k]; } };
-		    }
-		    Object.defineProperty(o, k2, desc);
-		}) : (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    o[k2] = m[k];
-		}));
-		var __setModuleDefault = (dist$1 && dist$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-		    Object.defineProperty(o, "default", { enumerable: true, value: v });
-		}) : function(o, v) {
-		    o["default"] = v;
-		});
-		var __importStar = (dist$1 && dist$1.__importStar) || function (mod) {
-		    if (mod && mod.__esModule) return mod;
-		    var result = {};
-		    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-		    __setModuleDefault(result, mod);
-		    return result;
-		};
-		var __exportStar = (dist$1 && dist$1.__exportStar) || function(m, exports$1) {
-		    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
-		};
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.Agent = void 0;
-		const net = __importStar(require$$0$9);
-		const http = __importStar(require$$0$5);
-		const https_1 = require$$1$2;
-		__exportStar(requireHelpers(), exports$1);
-		const INTERNAL = Symbol('AgentBaseInternalState');
-		class Agent extends http.Agent {
-		    constructor(opts) {
-		        super(opts);
-		        this[INTERNAL] = {};
-		    }
-		    /**
-		     * Determine whether this is an `http` or `https` request.
-		     */
-		    isSecureEndpoint(options) {
-		        if (options) {
-		            // First check the `secureEndpoint` property explicitly, since this
-		            // means that a parent `Agent` is "passing through" to this instance.
-		            // eslint-disable-next-line @typescript-eslint/no-explicit-any
-		            if (typeof options.secureEndpoint === 'boolean') {
-		                return options.secureEndpoint;
-		            }
-		            // If no explicit `secure` endpoint, check if `protocol` property is
-		            // set. This will usually be the case since using a full string URL
-		            // or `URL` instance should be the most common usage.
-		            if (typeof options.protocol === 'string') {
-		                return options.protocol === 'https:';
-		            }
-		        }
-		        // Finally, if no `protocol` property was set, then fall back to
-		        // checking the stack trace of the current call stack, and try to
-		        // detect the "https" module.
-		        const { stack } = new Error();
-		        if (typeof stack !== 'string')
-		            return false;
-		        return stack
-		            .split('\n')
-		            .some((l) => l.indexOf('(https.js:') !== -1 ||
-		            l.indexOf('node:https:') !== -1);
-		    }
-		    // In order to support async signatures in `connect()` and Node's native
-		    // connection pooling in `http.Agent`, the array of sockets for each origin
-		    // has to be updated synchronously. This is so the length of the array is
-		    // accurate when `addRequest()` is next called. We achieve this by creating a
-		    // fake socket and adding it to `sockets[origin]` and incrementing
-		    // `totalSocketCount`.
-		    incrementSockets(name) {
-		        // If `maxSockets` and `maxTotalSockets` are both Infinity then there is no
-		        // need to create a fake socket because Node.js native connection pooling
-		        // will never be invoked.
-		        if (this.maxSockets === Infinity && this.maxTotalSockets === Infinity) {
-		            return null;
-		        }
-		        // All instances of `sockets` are expected TypeScript errors. The
-		        // alternative is to add it as a private property of this class but that
-		        // will break TypeScript subclassing.
-		        if (!this.sockets[name]) {
-		            // @ts-expect-error `sockets` is readonly in `@types/node`
-		            this.sockets[name] = [];
-		        }
-		        const fakeSocket = new net.Socket({ writable: false });
-		        this.sockets[name].push(fakeSocket);
-		        // @ts-expect-error `totalSocketCount` isn't defined in `@types/node`
-		        this.totalSocketCount++;
-		        return fakeSocket;
-		    }
-		    decrementSockets(name, socket) {
-		        if (!this.sockets[name] || socket === null) {
-		            return;
-		        }
-		        const sockets = this.sockets[name];
-		        const index = sockets.indexOf(socket);
-		        if (index !== -1) {
-		            sockets.splice(index, 1);
-		            // @ts-expect-error  `totalSocketCount` isn't defined in `@types/node`
-		            this.totalSocketCount--;
-		            if (sockets.length === 0) {
-		                // @ts-expect-error `sockets` is readonly in `@types/node`
-		                delete this.sockets[name];
-		            }
-		        }
-		    }
-		    // In order to properly update the socket pool, we need to call `getName()` on
-		    // the core `https.Agent` if it is a secureEndpoint.
-		    getName(options) {
-		        const secureEndpoint = this.isSecureEndpoint(options);
-		        if (secureEndpoint) {
-		            // @ts-expect-error `getName()` isn't defined in `@types/node`
-		            return https_1.Agent.prototype.getName.call(this, options);
-		        }
-		        // @ts-expect-error `getName()` isn't defined in `@types/node`
-		        return super.getName(options);
-		    }
-		    createSocket(req, options, cb) {
-		        const connectOpts = {
-		            ...options,
-		            secureEndpoint: this.isSecureEndpoint(options),
-		        };
-		        const name = this.getName(connectOpts);
-		        const fakeSocket = this.incrementSockets(name);
-		        Promise.resolve()
-		            .then(() => this.connect(req, connectOpts))
-		            .then((socket) => {
-		            this.decrementSockets(name, fakeSocket);
-		            if (socket instanceof http.Agent) {
-		                try {
-		                    // @ts-expect-error `addRequest()` isn't defined in `@types/node`
-		                    return socket.addRequest(req, connectOpts);
-		                }
-		                catch (err) {
-		                    return cb(err);
-		                }
-		            }
-		            this[INTERNAL].currentSocket = socket;
-		            // @ts-expect-error `createSocket()` isn't defined in `@types/node`
-		            super.createSocket(req, options, cb);
-		        }, (err) => {
-		            this.decrementSockets(name, fakeSocket);
-		            cb(err);
-		        });
-		    }
-		    createConnection() {
-		        const socket = this[INTERNAL].currentSocket;
-		        this[INTERNAL].currentSocket = undefined;
-		        if (!socket) {
-		            throw new Error('No socket was returned in the `connect()` function');
-		        }
-		        return socket;
-		    }
-		    get defaultPort() {
-		        return (this[INTERNAL].defaultPort ??
-		            (this.protocol === 'https:' ? 443 : 80));
-		    }
-		    set defaultPort(v) {
-		        if (this[INTERNAL]) {
-		            this[INTERNAL].defaultPort = v;
-		        }
-		    }
-		    get protocol() {
-		        return (this[INTERNAL].protocol ??
-		            (this.isSecureEndpoint() ? 'https:' : 'http:'));
-		    }
-		    set protocol(v) {
-		        if (this[INTERNAL]) {
-		            this[INTERNAL].protocol = v;
-		        }
-		    }
-		}
-		exports$1.Agent = Agent;
-		
-	} (dist$1));
-	return dist$1;
-}
-
-var parseProxyResponse = {};
-
-var hasRequiredParseProxyResponse;
-
-function requireParseProxyResponse () {
-	if (hasRequiredParseProxyResponse) return parseProxyResponse;
-	hasRequiredParseProxyResponse = 1;
-	var __importDefault = (parseProxyResponse && parseProxyResponse.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(parseProxyResponse, "__esModule", { value: true });
-	parseProxyResponse.parseProxyResponse = void 0;
-	const debug_1 = __importDefault(requireSrc$1());
-	const debug = (0, debug_1.default)('https-proxy-agent:parse-proxy-response');
-	function parseProxyResponse$1(socket) {
-	    return new Promise((resolve, reject) => {
-	        // we need to buffer any HTTP traffic that happens with the proxy before we get
-	        // the CONNECT response, so that if the response is anything other than an "200"
-	        // response code, then we can re-play the "data" events on the socket once the
-	        // HTTP parser is hooked up...
-	        let buffersLength = 0;
-	        const buffers = [];
-	        function read() {
-	            const b = socket.read();
-	            if (b)
-	                ondata(b);
-	            else
-	                socket.once('readable', read);
-	        }
-	        function cleanup() {
-	            socket.removeListener('end', onend);
-	            socket.removeListener('error', onerror);
-	            socket.removeListener('readable', read);
-	        }
-	        function onend() {
-	            cleanup();
-	            debug('onend');
-	            reject(new Error('Proxy connection ended before receiving CONNECT response'));
-	        }
-	        function onerror(err) {
-	            cleanup();
-	            debug('onerror %o', err);
-	            reject(err);
-	        }
-	        function ondata(b) {
-	            buffers.push(b);
-	            buffersLength += b.length;
-	            const buffered = Buffer.concat(buffers, buffersLength);
-	            const endOfHeaders = buffered.indexOf('\r\n\r\n');
-	            if (endOfHeaders === -1) {
-	                // keep buffering
-	                debug('have not received end of HTTP headers yet...');
-	                read();
-	                return;
-	            }
-	            const headerParts = buffered
-	                .slice(0, endOfHeaders)
-	                .toString('ascii')
-	                .split('\r\n');
-	            const firstLine = headerParts.shift();
-	            if (!firstLine) {
-	                socket.destroy();
-	                return reject(new Error('No header received from proxy CONNECT response'));
-	            }
-	            const firstLineParts = firstLine.split(' ');
-	            const statusCode = +firstLineParts[1];
-	            const statusText = firstLineParts.slice(2).join(' ');
-	            const headers = {};
-	            for (const header of headerParts) {
-	                if (!header)
-	                    continue;
-	                const firstColon = header.indexOf(':');
-	                if (firstColon === -1) {
-	                    socket.destroy();
-	                    return reject(new Error(`Invalid header from proxy CONNECT response: "${header}"`));
-	                }
-	                const key = header.slice(0, firstColon).toLowerCase();
-	                const value = header.slice(firstColon + 1).trimStart();
-	                const current = headers[key];
-	                if (typeof current === 'string') {
-	                    headers[key] = [current, value];
-	                }
-	                else if (Array.isArray(current)) {
-	                    current.push(value);
-	                }
-	                else {
-	                    headers[key] = value;
-	                }
-	            }
-	            debug('got proxy server response: %o %o', firstLine, headers);
-	            cleanup();
-	            resolve({
-	                connect: {
-	                    statusCode,
-	                    statusText,
-	                    headers,
-	                },
-	                buffered,
-	            });
-	        }
-	        socket.on('error', onerror);
-	        socket.on('end', onend);
-	        read();
-	    });
-	}
-	parseProxyResponse.parseProxyResponse = parseProxyResponse$1;
-	
-	return parseProxyResponse;
-}
-
-var hasRequiredDist$1;
-
-function requireDist$1 () {
-	if (hasRequiredDist$1) return dist$2;
-	hasRequiredDist$1 = 1;
-	var __createBinding = (dist$2 && dist$2.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (dist$2 && dist$2.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (dist$2 && dist$2.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __importDefault = (dist$2 && dist$2.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(dist$2, "__esModule", { value: true });
-	dist$2.HttpsProxyAgent = void 0;
-	const net = __importStar(require$$0$9);
-	const tls = __importStar(require$$1$3);
-	const assert_1 = __importDefault(require$$0$8);
-	const debug_1 = __importDefault(requireSrc$1());
-	const agent_base_1 = requireDist$2();
-	const url_1 = require$$5$1;
-	const parse_proxy_response_1 = requireParseProxyResponse();
-	const debug = (0, debug_1.default)('https-proxy-agent');
-	const setServernameFromNonIpHost = (options) => {
-	    if (options.servername === undefined &&
-	        options.host &&
-	        !net.isIP(options.host)) {
-	        return {
-	            ...options,
-	            servername: options.host,
-	        };
-	    }
-	    return options;
-	};
-	/**
-	 * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to
-	 * the specified "HTTP(s) proxy server" in order to proxy HTTPS requests.
-	 *
-	 * Outgoing HTTP requests are first tunneled through the proxy server using the
-	 * `CONNECT` HTTP request method to establish a connection to the proxy server,
-	 * and then the proxy server connects to the destination target and issues the
-	 * HTTP request from the proxy server.
-	 *
-	 * `https:` requests have their socket connection upgraded to TLS once
-	 * the connection to the proxy server has been established.
-	 */
-	class HttpsProxyAgent extends agent_base_1.Agent {
-	    constructor(proxy, opts) {
-	        super(opts);
-	        this.options = { path: undefined };
-	        this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy;
-	        this.proxyHeaders = opts?.headers ?? {};
-	        debug('Creating new HttpsProxyAgent instance: %o', this.proxy.href);
-	        // Trim off the brackets from IPv6 addresses
-	        const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, '');
-	        const port = this.proxy.port
-	            ? parseInt(this.proxy.port, 10)
-	            : this.proxy.protocol === 'https:'
-	                ? 443
-	                : 80;
-	        this.connectOpts = {
-	            // Attempt to negotiate http/1.1 for proxy servers that support http/2
-	            ALPNProtocols: ['http/1.1'],
-	            ...(opts ? omit(opts, 'headers') : null),
-	            host,
-	            port,
-	        };
-	    }
-	    /**
-	     * Called when the node-core HTTP client library is creating a
-	     * new HTTP request.
-	     */
-	    async connect(req, opts) {
-	        const { proxy } = this;
-	        if (!opts.host) {
-	            throw new TypeError('No "host" provided');
-	        }
-	        // Create a socket connection to the proxy server.
-	        let socket;
-	        if (proxy.protocol === 'https:') {
-	            debug('Creating `tls.Socket`: %o', this.connectOpts);
-	            socket = tls.connect(setServernameFromNonIpHost(this.connectOpts));
-	        }
-	        else {
-	            debug('Creating `net.Socket`: %o', this.connectOpts);
-	            socket = net.connect(this.connectOpts);
-	        }
-	        const headers = typeof this.proxyHeaders === 'function'
-	            ? this.proxyHeaders()
-	            : { ...this.proxyHeaders };
-	        const host = net.isIPv6(opts.host) ? `[${opts.host}]` : opts.host;
-	        let payload = `CONNECT ${host}:${opts.port} HTTP/1.1\r\n`;
-	        // Inject the `Proxy-Authorization` header if necessary.
-	        if (proxy.username || proxy.password) {
-	            const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
-	            headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`;
-	        }
-	        headers.Host = `${host}:${opts.port}`;
-	        if (!headers['Proxy-Connection']) {
-	            headers['Proxy-Connection'] = this.keepAlive
-	                ? 'Keep-Alive'
-	                : 'close';
-	        }
-	        for (const name of Object.keys(headers)) {
-	            payload += `${name}: ${headers[name]}\r\n`;
-	        }
-	        const proxyResponsePromise = (0, parse_proxy_response_1.parseProxyResponse)(socket);
-	        socket.write(`${payload}\r\n`);
-	        const { connect, buffered } = await proxyResponsePromise;
-	        req.emit('proxyConnect', connect);
-	        this.emit('proxyConnect', connect, req);
-	        if (connect.statusCode === 200) {
-	            req.once('socket', resume);
-	            if (opts.secureEndpoint) {
-	                // The proxy is connecting to a TLS server, so upgrade
-	                // this socket connection to a TLS connection.
-	                debug('Upgrading socket connection to TLS');
-	                return tls.connect({
-	                    ...omit(setServernameFromNonIpHost(opts), 'host', 'path', 'port'),
-	                    socket,
-	                });
-	            }
-	            return socket;
-	        }
-	        // Some other status code that's not 200... need to re-play the HTTP
-	        // header "data" events onto the socket once the HTTP machinery is
-	        // attached so that the node core `http` can parse and handle the
-	        // error status code.
-	        // Close the original socket, and a new "fake" socket is returned
-	        // instead, so that the proxy doesn't get the HTTP request
-	        // written to it (which may contain `Authorization` headers or other
-	        // sensitive data).
-	        //
-	        // See: https://hackerone.com/reports/541502
-	        socket.destroy();
-	        const fakeSocket = new net.Socket({ writable: false });
-	        fakeSocket.readable = true;
-	        // Need to wait for the "socket" event to re-play the "data" events.
-	        req.once('socket', (s) => {
-	            debug('Replaying proxy buffer for failed request');
-	            (0, assert_1.default)(s.listenerCount('data') > 0);
-	            // Replay the "buffered" Buffer onto the fake `socket`, since at
-	            // this point the HTTP module machinery has been hooked up for
-	            // the user.
-	            s.push(buffered);
-	            s.push(null);
-	        });
-	        return fakeSocket;
-	    }
-	}
-	HttpsProxyAgent.protocols = ['http', 'https'];
-	dist$2.HttpsProxyAgent = HttpsProxyAgent;
-	function resume(socket) {
-	    socket.resume();
-	}
-	function omit(obj, ...keys) {
-	    const ret = {};
-	    let key;
-	    for (key in obj) {
-	        if (!keys.includes(key)) {
-	            ret[key] = obj[key];
-	        }
-	    }
-	    return ret;
-	}
-	
-	return dist$2;
-}
-
-var dist = {};
-
-var hasRequiredDist;
-
-function requireDist () {
-	if (hasRequiredDist) return dist;
-	hasRequiredDist = 1;
-	var __createBinding = (dist && dist.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (dist && dist.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (dist && dist.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __importDefault = (dist && dist.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(dist, "__esModule", { value: true });
-	dist.HttpProxyAgent = void 0;
-	const net = __importStar(require$$0$9);
-	const tls = __importStar(require$$1$3);
-	const debug_1 = __importDefault(requireSrc$1());
-	const events_1 = require$$0$7;
-	const agent_base_1 = requireDist$2();
-	const url_1 = require$$5$1;
-	const debug = (0, debug_1.default)('http-proxy-agent');
-	/**
-	 * The `HttpProxyAgent` implements an HTTP Agent subclass that connects
-	 * to the specified "HTTP proxy server" in order to proxy HTTP requests.
-	 */
-	class HttpProxyAgent extends agent_base_1.Agent {
-	    constructor(proxy, opts) {
-	        super(opts);
-	        this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy;
-	        this.proxyHeaders = opts?.headers ?? {};
-	        debug('Creating new HttpProxyAgent instance: %o', this.proxy.href);
-	        // Trim off the brackets from IPv6 addresses
-	        const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, '');
-	        const port = this.proxy.port
-	            ? parseInt(this.proxy.port, 10)
-	            : this.proxy.protocol === 'https:'
-	                ? 443
-	                : 80;
-	        this.connectOpts = {
-	            ...(opts ? omit(opts, 'headers') : null),
-	            host,
-	            port,
-	        };
-	    }
-	    addRequest(req, opts) {
-	        req._header = null;
-	        this.setRequestProps(req, opts);
-	        // @ts-expect-error `addRequest()` isn't defined in `@types/node`
-	        super.addRequest(req, opts);
-	    }
-	    setRequestProps(req, opts) {
-	        const { proxy } = this;
-	        const protocol = opts.secureEndpoint ? 'https:' : 'http:';
-	        const hostname = req.getHeader('host') || 'localhost';
-	        const base = `${protocol}//${hostname}`;
-	        const url = new url_1.URL(req.path, base);
-	        if (opts.port !== 80) {
-	            url.port = String(opts.port);
-	        }
-	        // Change the `http.ClientRequest` instance's "path" field
-	        // to the absolute path of the URL that will be requested.
-	        req.path = String(url);
-	        // Inject the `Proxy-Authorization` header if necessary.
-	        const headers = typeof this.proxyHeaders === 'function'
-	            ? this.proxyHeaders()
-	            : { ...this.proxyHeaders };
-	        if (proxy.username || proxy.password) {
-	            const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
-	            headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`;
-	        }
-	        if (!headers['Proxy-Connection']) {
-	            headers['Proxy-Connection'] = this.keepAlive
-	                ? 'Keep-Alive'
-	                : 'close';
-	        }
-	        for (const name of Object.keys(headers)) {
-	            const value = headers[name];
-	            if (value) {
-	                req.setHeader(name, value);
-	            }
-	        }
-	    }
-	    async connect(req, opts) {
-	        req._header = null;
-	        if (!req.path.includes('://')) {
-	            this.setRequestProps(req, opts);
-	        }
-	        // At this point, the http ClientRequest's internal `_header` field
-	        // might have already been set. If this is the case then we'll need
-	        // to re-generate the string since we just changed the `req.path`.
-	        let first;
-	        let endOfHeaders;
-	        debug('Regenerating stored HTTP header string for request');
-	        req._implicitHeader();
-	        if (req.outputData && req.outputData.length > 0) {
-	            debug('Patching connection write() output buffer with updated header');
-	            first = req.outputData[0].data;
-	            endOfHeaders = first.indexOf('\r\n\r\n') + 4;
-	            req.outputData[0].data =
-	                req._header + first.substring(endOfHeaders);
-	            debug('Output buffer: %o', req.outputData[0].data);
-	        }
-	        // Create a socket connection to the proxy server.
-	        let socket;
-	        if (this.proxy.protocol === 'https:') {
-	            debug('Creating `tls.Socket`: %o', this.connectOpts);
-	            socket = tls.connect(this.connectOpts);
-	        }
-	        else {
-	            debug('Creating `net.Socket`: %o', this.connectOpts);
-	            socket = net.connect(this.connectOpts);
-	        }
-	        // Wait for the socket's `connect` event, so that this `callback()`
-	        // function throws instead of the `http` request machinery. This is
-	        // important for i.e. `PacProxyAgent` which determines a failed proxy
-	        // connection via the `callback()` function throwing.
-	        await (0, events_1.once)(socket, 'connect');
-	        return socket;
-	    }
-	}
-	HttpProxyAgent.protocols = ['http', 'https'];
-	dist.HttpProxyAgent = HttpProxyAgent;
-	function omit(obj, ...keys) {
-	    const ret = {};
-	    let key;
-	    for (key in obj) {
-	        if (!keys.includes(key)) {
-	            ret[key] = obj[key];
-	        }
-	    }
-	    return ret;
-	}
-	
-	return dist;
-}
-
-var hasRequiredProxyPolicy$1;
-
-function requireProxyPolicy$1 () {
-	if (hasRequiredProxyPolicy$1) return proxyPolicy$1;
-	hasRequiredProxyPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.globalNoProxyList = exports$1.proxyPolicyName = void 0;
-		exports$1.loadNoProxy = loadNoProxy;
-		exports$1.getDefaultProxySettings = getDefaultProxySettings;
-		exports$1.proxyPolicy = proxyPolicy;
-		const https_proxy_agent_1 = requireDist$1();
-		const http_proxy_agent_1 = requireDist();
-		const log_js_1 = requireLog$4();
-		const HTTPS_PROXY = "HTTPS_PROXY";
-		const HTTP_PROXY = "HTTP_PROXY";
-		const ALL_PROXY = "ALL_PROXY";
-		const NO_PROXY = "NO_PROXY";
-		/**
-		 * The programmatic identifier of the proxyPolicy.
-		 */
-		exports$1.proxyPolicyName = "proxyPolicy";
-		/**
-		 * Stores the patterns specified in NO_PROXY environment variable.
-		 * @internal
-		 */
-		exports$1.globalNoProxyList = [];
-		let noProxyListLoaded = false;
-		/** A cache of whether a host should bypass the proxy. */
-		const globalBypassedMap = new Map();
-		function getEnvironmentValue(name) {
-		    if (process.env[name]) {
-		        return process.env[name];
-		    }
-		    else if (process.env[name.toLowerCase()]) {
-		        return process.env[name.toLowerCase()];
-		    }
-		    return undefined;
-		}
-		function loadEnvironmentProxyValue() {
-		    if (!process) {
-		        return undefined;
-		    }
-		    const httpsProxy = getEnvironmentValue(HTTPS_PROXY);
-		    const allProxy = getEnvironmentValue(ALL_PROXY);
-		    const httpProxy = getEnvironmentValue(HTTP_PROXY);
-		    return httpsProxy || allProxy || httpProxy;
-		}
-		/**
-		 * Check whether the host of a given `uri` matches any pattern in the no proxy list.
-		 * If there's a match, any request sent to the same host shouldn't have the proxy settings set.
-		 * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
-		 */
-		function isBypassed(uri, noProxyList, bypassedMap) {
-		    if (noProxyList.length === 0) {
-		        return false;
-		    }
-		    const host = new URL(uri).hostname;
-		    if (bypassedMap?.has(host)) {
-		        return bypassedMap.get(host);
-		    }
-		    let isBypassedFlag = false;
-		    for (const pattern of noProxyList) {
-		        if (pattern[0] === ".") {
-		            // This should match either domain it self or any subdomain or host
-		            // .foo.com will match foo.com it self or *.foo.com
-		            if (host.endsWith(pattern)) {
-		                isBypassedFlag = true;
-		            }
-		            else {
-		                if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
-		                    isBypassedFlag = true;
-		                }
-		            }
-		        }
-		        else {
-		            if (host === pattern) {
-		                isBypassedFlag = true;
-		            }
-		        }
-		    }
-		    bypassedMap?.set(host, isBypassedFlag);
-		    return isBypassedFlag;
-		}
-		function loadNoProxy() {
-		    const noProxy = getEnvironmentValue(NO_PROXY);
-		    noProxyListLoaded = true;
-		    if (noProxy) {
-		        return noProxy
-		            .split(",")
-		            .map((item) => item.trim())
-		            .filter((item) => item.length);
-		    }
-		    return [];
-		}
-		/**
-		 * This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
-		 * If no argument is given, it attempts to parse a proxy URL from the environment
-		 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
-		 * @param proxyUrl - The url of the proxy to use. May contain authentication information.
-		 * @deprecated - Internally this method is no longer necessary when setting proxy information.
-		 */
-		function getDefaultProxySettings(proxyUrl) {
-		    if (!proxyUrl) {
-		        proxyUrl = loadEnvironmentProxyValue();
-		        if (!proxyUrl) {
-		            return undefined;
-		        }
-		    }
-		    const parsedUrl = new URL(proxyUrl);
-		    const schema = parsedUrl.protocol ? parsedUrl.protocol + "//" : "";
-		    return {
-		        host: schema + parsedUrl.hostname,
-		        port: Number.parseInt(parsedUrl.port || "80"),
-		        username: parsedUrl.username,
-		        password: parsedUrl.password,
-		    };
-		}
-		/**
-		 * This method attempts to parse a proxy URL from the environment
-		 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
-		 */
-		function getDefaultProxySettingsInternal() {
-		    const envProxy = loadEnvironmentProxyValue();
-		    return envProxy ? new URL(envProxy) : undefined;
-		}
-		function getUrlFromProxySettings(settings) {
-		    let parsedProxyUrl;
-		    try {
-		        parsedProxyUrl = new URL(settings.host);
-		    }
-		    catch {
-		        throw new Error(`Expecting a valid host string in proxy settings, but found "${settings.host}".`);
-		    }
-		    parsedProxyUrl.port = String(settings.port);
-		    if (settings.username) {
-		        parsedProxyUrl.username = settings.username;
-		    }
-		    if (settings.password) {
-		        parsedProxyUrl.password = settings.password;
-		    }
-		    return parsedProxyUrl;
-		}
-		function setProxyAgentOnRequest(request, cachedAgents, proxyUrl) {
-		    // Custom Agent should take precedence so if one is present
-		    // we should skip to avoid overwriting it.
-		    if (request.agent) {
-		        return;
-		    }
-		    const url = new URL(request.url);
-		    const isInsecure = url.protocol !== "https:";
-		    if (request.tlsSettings) {
-		        log_js_1.logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored.");
-		    }
-		    const headers = request.headers.toJSON();
-		    if (isInsecure) {
-		        if (!cachedAgents.httpProxyAgent) {
-		            cachedAgents.httpProxyAgent = new http_proxy_agent_1.HttpProxyAgent(proxyUrl, { headers });
-		        }
-		        request.agent = cachedAgents.httpProxyAgent;
-		    }
-		    else {
-		        if (!cachedAgents.httpsProxyAgent) {
-		            cachedAgents.httpsProxyAgent = new https_proxy_agent_1.HttpsProxyAgent(proxyUrl, { headers });
-		        }
-		        request.agent = cachedAgents.httpsProxyAgent;
-		    }
-		}
-		/**
-		 * A policy that allows one to apply proxy settings to all requests.
-		 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
-		 * or HTTP_PROXY environment variables.
-		 * @param proxySettings - ProxySettings to use on each request.
-		 * @param options - additional settings, for example, custom NO_PROXY patterns
-		 */
-		function proxyPolicy(proxySettings, options) {
-		    if (!noProxyListLoaded) {
-		        exports$1.globalNoProxyList.push(...loadNoProxy());
-		    }
-		    const defaultProxy = proxySettings
-		        ? getUrlFromProxySettings(proxySettings)
-		        : getDefaultProxySettingsInternal();
-		    const cachedAgents = {};
-		    return {
-		        name: exports$1.proxyPolicyName,
-		        async sendRequest(request, next) {
-		            if (!request.proxySettings &&
-		                defaultProxy &&
-		                !isBypassed(request.url, options?.customNoProxyList ?? exports$1.globalNoProxyList, options?.customNoProxyList ? undefined : globalBypassedMap)) {
-		                setProxyAgentOnRequest(request, cachedAgents, defaultProxy);
-		            }
-		            else if (request.proxySettings) {
-		                setProxyAgentOnRequest(request, cachedAgents, getUrlFromProxySettings(request.proxySettings));
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (proxyPolicy$1));
-	return proxyPolicy$1;
-}
-
-var agentPolicy$1 = {};
-
-var hasRequiredAgentPolicy$1;
-
-function requireAgentPolicy$1 () {
-	if (hasRequiredAgentPolicy$1) return agentPolicy$1;
-	hasRequiredAgentPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.agentPolicyName = void 0;
-		exports$1.agentPolicy = agentPolicy;
-		/**
-		 * Name of the Agent Policy
-		 */
-		exports$1.agentPolicyName = "agentPolicy";
-		/**
-		 * Gets a pipeline policy that sets http.agent
-		 */
-		function agentPolicy(agent) {
-		    return {
-		        name: exports$1.agentPolicyName,
-		        sendRequest: async (req, next) => {
-		            // Users may define an agent on the request, honor it over the client level one
-		            if (!req.agent) {
-		                req.agent = agent;
-		            }
-		            return next(req);
-		        },
-		    };
-		}
-		
-	} (agentPolicy$1));
-	return agentPolicy$1;
-}
-
-var tlsPolicy$1 = {};
-
-var hasRequiredTlsPolicy$1;
-
-function requireTlsPolicy$1 () {
-	if (hasRequiredTlsPolicy$1) return tlsPolicy$1;
-	hasRequiredTlsPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.tlsPolicyName = void 0;
-		exports$1.tlsPolicy = tlsPolicy;
-		/**
-		 * Name of the TLS Policy
-		 */
-		exports$1.tlsPolicyName = "tlsPolicy";
-		/**
-		 * Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
-		 */
-		function tlsPolicy(tlsSettings) {
-		    return {
-		        name: exports$1.tlsPolicyName,
-		        sendRequest: async (req, next) => {
-		            // Users may define a request tlsSettings, honor those over the client level one
-		            if (!req.tlsSettings) {
-		                req.tlsSettings = tlsSettings;
-		            }
-		            return next(req);
-		        },
-		    };
-		}
-		
-	} (tlsPolicy$1));
-	return tlsPolicy$1;
-}
-
-var multipartPolicy$1 = {};
-
-var typeGuards$1 = {};
-
-var hasRequiredTypeGuards$1;
-
-function requireTypeGuards$1 () {
-	if (hasRequiredTypeGuards$1) return typeGuards$1;
-	hasRequiredTypeGuards$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(typeGuards$1, "__esModule", { value: true });
-	typeGuards$1.isNodeReadableStream = isNodeReadableStream;
-	typeGuards$1.isWebReadableStream = isWebReadableStream;
-	typeGuards$1.isBinaryBody = isBinaryBody;
-	typeGuards$1.isReadableStream = isReadableStream;
-	typeGuards$1.isBlob = isBlob;
-	function isNodeReadableStream(x) {
-	    return Boolean(x && typeof x["pipe"] === "function");
-	}
-	function isWebReadableStream(x) {
-	    return Boolean(x &&
-	        typeof x.getReader === "function" &&
-	        typeof x.tee === "function");
-	}
-	function isBinaryBody(body) {
-	    return (body !== undefined &&
-	        (body instanceof Uint8Array ||
-	            isReadableStream(body) ||
-	            typeof body === "function" ||
-	            body instanceof Blob));
-	}
-	function isReadableStream(x) {
-	    return isNodeReadableStream(x) || isWebReadableStream(x);
-	}
-	function isBlob(x) {
-	    return typeof x.stream === "function";
-	}
-	
-	return typeGuards$1;
-}
-
-var concat = {};
-
-var hasRequiredConcat;
-
-function requireConcat () {
-	if (hasRequiredConcat) return concat;
-	hasRequiredConcat = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(concat, "__esModule", { value: true });
-	concat.concat = concat$1;
-	const stream_1 = require$$0$a;
-	const typeGuards_js_1 = requireTypeGuards$1();
-	async function* streamAsyncIterator() {
-	    const reader = this.getReader();
-	    try {
-	        while (true) {
-	            const { done, value } = await reader.read();
-	            if (done) {
-	                return;
-	            }
-	            yield value;
-	        }
-	    }
-	    finally {
-	        reader.releaseLock();
-	    }
-	}
-	function makeAsyncIterable(webStream) {
-	    if (!webStream[Symbol.asyncIterator]) {
-	        webStream[Symbol.asyncIterator] = streamAsyncIterator.bind(webStream);
-	    }
-	    if (!webStream.values) {
-	        webStream.values = streamAsyncIterator.bind(webStream);
-	    }
-	}
-	function ensureNodeStream(stream) {
-	    if (stream instanceof ReadableStream) {
-	        makeAsyncIterable(stream);
-	        return stream_1.Readable.fromWeb(stream);
-	    }
-	    else {
-	        return stream;
-	    }
-	}
-	function toStream(source) {
-	    if (source instanceof Uint8Array) {
-	        return stream_1.Readable.from(Buffer.from(source));
-	    }
-	    else if ((0, typeGuards_js_1.isBlob)(source)) {
-	        return ensureNodeStream(source.stream());
-	    }
-	    else {
-	        return ensureNodeStream(source);
-	    }
-	}
-	/**
-	 * Utility function that concatenates a set of binary inputs into one combined output.
-	 *
-	 * @param sources - array of sources for the concatenation
-	 * @returns - in Node, a (() =\> NodeJS.ReadableStream) which, when read, produces a concatenation of all the inputs.
-	 *           In browser, returns a `Blob` representing all the concatenated inputs.
-	 *
-	 * @internal
-	 */
-	async function concat$1(sources) {
-	    return function () {
-	        const streams = sources.map((x) => (typeof x === "function" ? x() : x)).map(toStream);
-	        return stream_1.Readable.from((async function* () {
-	            for (const stream of streams) {
-	                for await (const chunk of stream) {
-	                    yield chunk;
-	                }
-	            }
-	        })());
-	    };
-	}
-	
-	return concat;
-}
-
-var hasRequiredMultipartPolicy$1;
-
-function requireMultipartPolicy$1 () {
-	if (hasRequiredMultipartPolicy$1) return multipartPolicy$1;
-	hasRequiredMultipartPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.multipartPolicyName = void 0;
-		exports$1.multipartPolicy = multipartPolicy;
-		const bytesEncoding_js_1 = requireBytesEncoding();
-		const typeGuards_js_1 = requireTypeGuards$1();
-		const uuidUtils_js_1 = requireUuidUtils();
-		const concat_js_1 = requireConcat();
-		function generateBoundary() {
-		    return `----AzSDKFormBoundary${(0, uuidUtils_js_1.randomUUID)()}`;
-		}
-		function encodeHeaders(headers) {
-		    let result = "";
-		    for (const [key, value] of headers) {
-		        result += `${key}: ${value}\r\n`;
-		    }
-		    return result;
-		}
-		function getLength(source) {
-		    if (source instanceof Uint8Array) {
-		        return source.byteLength;
-		    }
-		    else if ((0, typeGuards_js_1.isBlob)(source)) {
-		        // if was created using createFile then -1 means we have an unknown size
-		        return source.size === -1 ? undefined : source.size;
-		    }
-		    else {
-		        return undefined;
-		    }
-		}
-		function getTotalLength(sources) {
-		    let total = 0;
-		    for (const source of sources) {
-		        const partLength = getLength(source);
-		        if (partLength === undefined) {
-		            return undefined;
-		        }
-		        else {
-		            total += partLength;
-		        }
-		    }
-		    return total;
-		}
-		async function buildRequestBody(request, parts, boundary) {
-		    const sources = [
-		        (0, bytesEncoding_js_1.stringToUint8Array)(`--${boundary}`, "utf-8"),
-		        ...parts.flatMap((part) => [
-		            (0, bytesEncoding_js_1.stringToUint8Array)("\r\n", "utf-8"),
-		            (0, bytesEncoding_js_1.stringToUint8Array)(encodeHeaders(part.headers), "utf-8"),
-		            (0, bytesEncoding_js_1.stringToUint8Array)("\r\n", "utf-8"),
-		            part.body,
-		            (0, bytesEncoding_js_1.stringToUint8Array)(`\r\n--${boundary}`, "utf-8"),
-		        ]),
-		        (0, bytesEncoding_js_1.stringToUint8Array)("--\r\n\r\n", "utf-8"),
-		    ];
-		    const contentLength = getTotalLength(sources);
-		    if (contentLength) {
-		        request.headers.set("Content-Length", contentLength);
-		    }
-		    request.body = await (0, concat_js_1.concat)(sources);
-		}
-		/**
-		 * Name of multipart policy
-		 */
-		exports$1.multipartPolicyName = "multipartPolicy";
-		const maxBoundaryLength = 70;
-		const validBoundaryCharacters = new Set(`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'()+,-./:=?`);
-		function assertValidBoundary(boundary) {
-		    if (boundary.length > maxBoundaryLength) {
-		        throw new Error(`Multipart boundary "${boundary}" exceeds maximum length of 70 characters`);
-		    }
-		    if (Array.from(boundary).some((x) => !validBoundaryCharacters.has(x))) {
-		        throw new Error(`Multipart boundary "${boundary}" contains invalid characters`);
-		    }
-		}
-		/**
-		 * Pipeline policy for multipart requests
-		 */
-		function multipartPolicy() {
-		    return {
-		        name: exports$1.multipartPolicyName,
-		        async sendRequest(request, next) {
-		            if (!request.multipartBody) {
-		                return next(request);
-		            }
-		            if (request.body) {
-		                throw new Error("multipartBody and regular body cannot be set at the same time");
-		            }
-		            let boundary = request.multipartBody.boundary;
-		            const contentTypeHeader = request.headers.get("Content-Type") ?? "multipart/mixed";
-		            const parsedHeader = contentTypeHeader.match(/^(multipart\/[^ ;]+)(?:; *boundary=(.+))?$/);
-		            if (!parsedHeader) {
-		                throw new Error(`Got multipart request body, but content-type header was not multipart: ${contentTypeHeader}`);
-		            }
-		            const [, contentType, parsedBoundary] = parsedHeader;
-		            if (parsedBoundary && boundary && parsedBoundary !== boundary) {
-		                throw new Error(`Multipart boundary was specified as ${parsedBoundary} in the header, but got ${boundary} in the request body`);
-		            }
-		            boundary ??= parsedBoundary;
-		            if (boundary) {
-		                assertValidBoundary(boundary);
-		            }
-		            else {
-		                boundary = generateBoundary();
-		            }
-		            request.headers.set("Content-Type", `${contentType}; boundary=${boundary}`);
-		            await buildRequestBody(request, request.multipartBody.parts, boundary);
-		            request.multipartBody = undefined;
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (multipartPolicy$1));
-	return multipartPolicy$1;
-}
-
-var hasRequiredCreatePipelineFromOptions$1;
-
-function requireCreatePipelineFromOptions$1 () {
-	if (hasRequiredCreatePipelineFromOptions$1) return createPipelineFromOptions$1;
-	hasRequiredCreatePipelineFromOptions$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(createPipelineFromOptions$1, "__esModule", { value: true });
-	createPipelineFromOptions$1.createPipelineFromOptions = createPipelineFromOptions;
-	const logPolicy_js_1 = requireLogPolicy$1();
-	const pipeline_js_1 = requirePipeline$3();
-	const redirectPolicy_js_1 = requireRedirectPolicy$1();
-	const userAgentPolicy_js_1 = requireUserAgentPolicy$1();
-	const decompressResponsePolicy_js_1 = requireDecompressResponsePolicy$1();
-	const defaultRetryPolicy_js_1 = requireDefaultRetryPolicy$1();
-	const formDataPolicy_js_1 = requireFormDataPolicy$1();
-	const checkEnvironment_js_1 = requireCheckEnvironment();
-	const proxyPolicy_js_1 = requireProxyPolicy$1();
-	const agentPolicy_js_1 = requireAgentPolicy$1();
-	const tlsPolicy_js_1 = requireTlsPolicy$1();
-	const multipartPolicy_js_1 = requireMultipartPolicy$1();
-	/**
-	 * Create a new pipeline with a default set of customizable policies.
-	 * @param options - Options to configure a custom pipeline.
-	 */
-	function createPipelineFromOptions(options) {
-	    const pipeline = (0, pipeline_js_1.createEmptyPipeline)();
-	    if (checkEnvironment_js_1.isNodeLike) {
-	        if (options.agent) {
-	            pipeline.addPolicy((0, agentPolicy_js_1.agentPolicy)(options.agent));
-	        }
-	        if (options.tlsOptions) {
-	            pipeline.addPolicy((0, tlsPolicy_js_1.tlsPolicy)(options.tlsOptions));
-	        }
-	        pipeline.addPolicy((0, proxyPolicy_js_1.proxyPolicy)(options.proxyOptions));
-	        pipeline.addPolicy((0, decompressResponsePolicy_js_1.decompressResponsePolicy)());
-	    }
-	    pipeline.addPolicy((0, formDataPolicy_js_1.formDataPolicy)(), { beforePolicies: [multipartPolicy_js_1.multipartPolicyName] });
-	    pipeline.addPolicy((0, userAgentPolicy_js_1.userAgentPolicy)(options.userAgentOptions));
-	    // The multipart policy is added after policies with no phase, so that
-	    // policies can be added between it and formDataPolicy to modify
-	    // properties (e.g., making the boundary constant in recorded tests).
-	    pipeline.addPolicy((0, multipartPolicy_js_1.multipartPolicy)(), { afterPhase: "Deserialize" });
-	    pipeline.addPolicy((0, defaultRetryPolicy_js_1.defaultRetryPolicy)(options.retryOptions), { phase: "Retry" });
-	    if (checkEnvironment_js_1.isNodeLike) {
-	        // Both XHR and Fetch expect to handle redirects automatically,
-	        // so only include this policy when we're in Node.
-	        pipeline.addPolicy((0, redirectPolicy_js_1.redirectPolicy)(options.redirectOptions), { afterPhase: "Retry" });
-	    }
-	    pipeline.addPolicy((0, logPolicy_js_1.logPolicy)(options.loggingOptions), { afterPhase: "Sign" });
-	    return pipeline;
-	}
-	
-	return createPipelineFromOptions$1;
-}
-
-var apiVersionPolicy = {};
-
-var hasRequiredApiVersionPolicy;
-
-function requireApiVersionPolicy () {
-	if (hasRequiredApiVersionPolicy) return apiVersionPolicy;
-	hasRequiredApiVersionPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.apiVersionPolicyName = void 0;
-		exports$1.apiVersionPolicy = apiVersionPolicy;
-		exports$1.apiVersionPolicyName = "ApiVersionPolicy";
-		/**
-		 * Creates a policy that sets the apiVersion as a query parameter on every request
-		 * @param options - Client options
-		 * @returns Pipeline policy that sets the apiVersion as a query parameter on every request
-		 */
-		function apiVersionPolicy(options) {
-		    return {
-		        name: exports$1.apiVersionPolicyName,
-		        sendRequest: (req, next) => {
-		            // Use the apiVesion defined in request url directly
-		            // Append one if there is no apiVesion and we have one at client options
-		            const url = new URL(req.url);
-		            if (!url.searchParams.get("api-version") && options.apiVersion) {
-		                req.url = `${req.url}${Array.from(url.searchParams.keys()).length > 0 ? "&" : "?"}api-version=${options.apiVersion}`;
-		            }
-		            return next(req);
-		        },
-		    };
-		}
-		
-	} (apiVersionPolicy));
-	return apiVersionPolicy;
-}
-
-var credentials = {};
-
-var hasRequiredCredentials;
-
-function requireCredentials () {
-	if (hasRequiredCredentials) return credentials;
-	hasRequiredCredentials = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(credentials, "__esModule", { value: true });
-	credentials.isOAuth2TokenCredential = isOAuth2TokenCredential;
-	credentials.isBearerTokenCredential = isBearerTokenCredential;
-	credentials.isBasicCredential = isBasicCredential;
-	credentials.isApiKeyCredential = isApiKeyCredential;
-	/**
-	 * Type guard to check if a credential is an OAuth2 token credential.
-	 */
-	function isOAuth2TokenCredential(credential) {
-	    return "getOAuth2Token" in credential;
-	}
-	/**
-	 * Type guard to check if a credential is a Bearer token credential.
-	 */
-	function isBearerTokenCredential(credential) {
-	    return "getBearerToken" in credential;
-	}
-	/**
-	 * Type guard to check if a credential is a Basic auth credential.
-	 */
-	function isBasicCredential(credential) {
-	    return "username" in credential && "password" in credential;
-	}
-	/**
-	 * Type guard to check if a credential is an API key credential.
-	 */
-	function isApiKeyCredential(credential) {
-	    return "key" in credential;
-	}
-	
-	return credentials;
-}
-
-var apiKeyAuthenticationPolicy = {};
-
-var checkInsecureConnection = {};
-
-var hasRequiredCheckInsecureConnection;
-
-function requireCheckInsecureConnection () {
-	if (hasRequiredCheckInsecureConnection) return checkInsecureConnection;
-	hasRequiredCheckInsecureConnection = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(checkInsecureConnection, "__esModule", { value: true });
-	checkInsecureConnection.ensureSecureConnection = ensureSecureConnection;
-	const log_js_1 = requireLog$4();
-	// Ensure the warining is only emitted once
-	let insecureConnectionWarningEmmitted = false;
-	/**
-	 * Checks if the request is allowed to be sent over an insecure connection.
-	 *
-	 * A request is allowed to be sent over an insecure connection when:
-	 * - The `allowInsecureConnection` option is set to `true`.
-	 * - The request has the `allowInsecureConnection` property set to `true`.
-	 * - The request is being sent to `localhost` or `127.0.0.1`
-	 */
-	function allowInsecureConnection(request, options) {
-	    if (options.allowInsecureConnection && request.allowInsecureConnection) {
-	        const url = new URL(request.url);
-	        if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
-	            return true;
-	        }
-	    }
-	    return false;
-	}
-	/**
-	 * Logs a warning about sending a token over an insecure connection.
-	 *
-	 * This function will emit a node warning once, but log the warning every time.
-	 */
-	function emitInsecureConnectionWarning() {
-	    const warning = "Sending token over insecure transport. Assume any token issued is compromised.";
-	    log_js_1.logger.warning(warning);
-	    if (typeof process?.emitWarning === "function" && !insecureConnectionWarningEmmitted) {
-	        insecureConnectionWarningEmmitted = true;
-	        process.emitWarning(warning);
-	    }
-	}
-	/**
-	 * Ensures that authentication is only allowed over HTTPS unless explicitly allowed.
-	 * Throws an error if the connection is not secure and not explicitly allowed.
-	 */
-	function ensureSecureConnection(request, options) {
-	    if (!request.url.toLowerCase().startsWith("https://")) {
-	        if (allowInsecureConnection(request, options)) {
-	            emitInsecureConnectionWarning();
-	        }
-	        else {
-	            throw new Error("Authentication is not permitted for non-TLS protected (non-https) URLs when allowInsecureConnection is false.");
-	        }
-	    }
-	}
-	
-	return checkInsecureConnection;
-}
-
-var hasRequiredApiKeyAuthenticationPolicy;
-
-function requireApiKeyAuthenticationPolicy () {
-	if (hasRequiredApiKeyAuthenticationPolicy) return apiKeyAuthenticationPolicy;
-	hasRequiredApiKeyAuthenticationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.apiKeyAuthenticationPolicyName = void 0;
-		exports$1.apiKeyAuthenticationPolicy = apiKeyAuthenticationPolicy;
-		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
-		/**
-		 * Name of the API Key Authentication Policy
-		 */
-		exports$1.apiKeyAuthenticationPolicyName = "apiKeyAuthenticationPolicy";
-		/**
-		 * Gets a pipeline policy that adds API key authentication to requests
-		 */
-		function apiKeyAuthenticationPolicy(options) {
-		    return {
-		        name: exports$1.apiKeyAuthenticationPolicyName,
-		        async sendRequest(request, next) {
-		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
-		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
-		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "apiKey");
-		            // Skip adding authentication header if no API key authentication scheme is found
-		            if (!scheme) {
-		                return next(request);
-		            }
-		            if (scheme.apiKeyLocation !== "header") {
-		                throw new Error(`Unsupported API key location: ${scheme.apiKeyLocation}`);
-		            }
-		            request.headers.set(scheme.name, options.credential.key);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (apiKeyAuthenticationPolicy));
-	return apiKeyAuthenticationPolicy;
-}
-
-var basicAuthenticationPolicy = {};
-
-var hasRequiredBasicAuthenticationPolicy;
-
-function requireBasicAuthenticationPolicy () {
-	if (hasRequiredBasicAuthenticationPolicy) return basicAuthenticationPolicy;
-	hasRequiredBasicAuthenticationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.basicAuthenticationPolicyName = void 0;
-		exports$1.basicAuthenticationPolicy = basicAuthenticationPolicy;
-		const bytesEncoding_js_1 = requireBytesEncoding();
-		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
-		/**
-		 * Name of the Basic Authentication Policy
-		 */
-		exports$1.basicAuthenticationPolicyName = "bearerAuthenticationPolicy";
-		/**
-		 * Gets a pipeline policy that adds basic authentication to requests
-		 */
-		function basicAuthenticationPolicy(options) {
-		    return {
-		        name: exports$1.basicAuthenticationPolicyName,
-		        async sendRequest(request, next) {
-		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
-		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
-		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "http" && x.scheme === "basic");
-		            // Skip adding authentication header if no basic authentication scheme is found
-		            if (!scheme) {
-		                return next(request);
-		            }
-		            const { username, password } = options.credential;
-		            const headerValue = (0, bytesEncoding_js_1.uint8ArrayToString)((0, bytesEncoding_js_1.stringToUint8Array)(`${username}:${password}`, "utf-8"), "base64");
-		            request.headers.set("Authorization", `Basic ${headerValue}`);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (basicAuthenticationPolicy));
-	return basicAuthenticationPolicy;
-}
-
-var bearerAuthenticationPolicy = {};
-
-var hasRequiredBearerAuthenticationPolicy;
-
-function requireBearerAuthenticationPolicy () {
-	if (hasRequiredBearerAuthenticationPolicy) return bearerAuthenticationPolicy;
-	hasRequiredBearerAuthenticationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.bearerAuthenticationPolicyName = void 0;
-		exports$1.bearerAuthenticationPolicy = bearerAuthenticationPolicy;
-		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
-		/**
-		 * Name of the Bearer Authentication Policy
-		 */
-		exports$1.bearerAuthenticationPolicyName = "bearerAuthenticationPolicy";
-		/**
-		 * Gets a pipeline policy that adds bearer token authentication to requests
-		 */
-		function bearerAuthenticationPolicy(options) {
-		    return {
-		        name: exports$1.bearerAuthenticationPolicyName,
-		        async sendRequest(request, next) {
-		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
-		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
-		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "http" && x.scheme === "bearer");
-		            // Skip adding authentication header if no bearer authentication scheme is found
-		            if (!scheme) {
-		                return next(request);
-		            }
-		            const token = await options.credential.getBearerToken({
-		                abortSignal: request.abortSignal,
-		            });
-		            request.headers.set("Authorization", `Bearer ${token}`);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (bearerAuthenticationPolicy));
-	return bearerAuthenticationPolicy;
-}
-
-var oauth2AuthenticationPolicy = {};
-
-var hasRequiredOauth2AuthenticationPolicy;
-
-function requireOauth2AuthenticationPolicy () {
-	if (hasRequiredOauth2AuthenticationPolicy) return oauth2AuthenticationPolicy;
-	hasRequiredOauth2AuthenticationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.oauth2AuthenticationPolicyName = void 0;
-		exports$1.oauth2AuthenticationPolicy = oauth2AuthenticationPolicy;
-		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
-		/**
-		 * Name of the OAuth2 Authentication Policy
-		 */
-		exports$1.oauth2AuthenticationPolicyName = "oauth2AuthenticationPolicy";
-		/**
-		 * Gets a pipeline policy that adds authorization header from OAuth2 schemes
-		 */
-		function oauth2AuthenticationPolicy(options) {
-		    return {
-		        name: exports$1.oauth2AuthenticationPolicyName,
-		        async sendRequest(request, next) {
-		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
-		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
-		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "oauth2");
-		            // Skip adding authentication header if no OAuth2 authentication scheme is found
-		            if (!scheme) {
-		                return next(request);
-		            }
-		            const token = await options.credential.getOAuth2Token(scheme.flows, {
-		                abortSignal: request.abortSignal,
-		            });
-		            request.headers.set("Authorization", `Bearer ${token}`);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (oauth2AuthenticationPolicy));
-	return oauth2AuthenticationPolicy;
-}
-
-var hasRequiredClientHelpers;
-
-function requireClientHelpers () {
-	if (hasRequiredClientHelpers) return clientHelpers;
-	hasRequiredClientHelpers = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(clientHelpers, "__esModule", { value: true });
-	clientHelpers.createDefaultPipeline = createDefaultPipeline;
-	clientHelpers.getCachedDefaultHttpsClient = getCachedDefaultHttpsClient;
-	const defaultHttpClient_js_1 = requireDefaultHttpClient$1();
-	const createPipelineFromOptions_js_1 = requireCreatePipelineFromOptions$1();
-	const apiVersionPolicy_js_1 = requireApiVersionPolicy();
-	const credentials_js_1 = requireCredentials();
-	const apiKeyAuthenticationPolicy_js_1 = requireApiKeyAuthenticationPolicy();
-	const basicAuthenticationPolicy_js_1 = requireBasicAuthenticationPolicy();
-	const bearerAuthenticationPolicy_js_1 = requireBearerAuthenticationPolicy();
-	const oauth2AuthenticationPolicy_js_1 = requireOauth2AuthenticationPolicy();
-	let cachedHttpClient;
-	/**
-	 * Creates a default rest pipeline to re-use accross Rest Level Clients
-	 */
-	function createDefaultPipeline(options = {}) {
-	    const pipeline = (0, createPipelineFromOptions_js_1.createPipelineFromOptions)(options);
-	    pipeline.addPolicy((0, apiVersionPolicy_js_1.apiVersionPolicy)(options));
-	    const { credential, authSchemes, allowInsecureConnection } = options;
-	    if (credential) {
-	        if ((0, credentials_js_1.isApiKeyCredential)(credential)) {
-	            pipeline.addPolicy((0, apiKeyAuthenticationPolicy_js_1.apiKeyAuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
-	        }
-	        else if ((0, credentials_js_1.isBasicCredential)(credential)) {
-	            pipeline.addPolicy((0, basicAuthenticationPolicy_js_1.basicAuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
-	        }
-	        else if ((0, credentials_js_1.isBearerTokenCredential)(credential)) {
-	            pipeline.addPolicy((0, bearerAuthenticationPolicy_js_1.bearerAuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
-	        }
-	        else if ((0, credentials_js_1.isOAuth2TokenCredential)(credential)) {
-	            pipeline.addPolicy((0, oauth2AuthenticationPolicy_js_1.oauth2AuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
-	        }
-	    }
-	    return pipeline;
-	}
-	function getCachedDefaultHttpsClient() {
-	    if (!cachedHttpClient) {
-	        cachedHttpClient = (0, defaultHttpClient_js_1.createDefaultHttpClient)();
-	    }
-	    return cachedHttpClient;
-	}
-	
-	return clientHelpers;
-}
-
-var sendRequest = {};
-
-var multipart = {};
-
-var hasRequiredMultipart;
-
-function requireMultipart () {
-	if (hasRequiredMultipart) return multipart;
-	hasRequiredMultipart = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(multipart, "__esModule", { value: true });
-	multipart.buildBodyPart = buildBodyPart;
-	multipart.buildMultipartBody = buildMultipartBody;
-	const restError_js_1 = requireRestError$2();
-	const httpHeaders_js_1 = requireHttpHeaders$1();
-	const bytesEncoding_js_1 = requireBytesEncoding();
-	const typeGuards_js_1 = requireTypeGuards$1();
-	/**
-	 * Get value of a header in the part descriptor ignoring case
-	 */
-	function getHeaderValue(descriptor, headerName) {
-	    if (descriptor.headers) {
-	        const actualHeaderName = Object.keys(descriptor.headers).find((x) => x.toLowerCase() === headerName.toLowerCase());
-	        if (actualHeaderName) {
-	            return descriptor.headers[actualHeaderName];
-	        }
-	    }
-	    return undefined;
-	}
-	function getPartContentType(descriptor) {
-	    const contentTypeHeader = getHeaderValue(descriptor, "content-type");
-	    if (contentTypeHeader) {
-	        return contentTypeHeader;
-	    }
-	    // Special value of null means content type is to be omitted
-	    if (descriptor.contentType === null) {
-	        return undefined;
-	    }
-	    if (descriptor.contentType) {
-	        return descriptor.contentType;
-	    }
-	    const { body } = descriptor;
-	    if (body === null || body === undefined) {
-	        return undefined;
-	    }
-	    if (typeof body === "string" || typeof body === "number" || typeof body === "boolean") {
-	        return "text/plain; charset=UTF-8";
-	    }
-	    if (body instanceof Blob) {
-	        return body.type || "application/octet-stream";
-	    }
-	    if ((0, typeGuards_js_1.isBinaryBody)(body)) {
-	        return "application/octet-stream";
-	    }
-	    // arbitrary non-text object -> generic JSON content type by default. We will try to JSON.stringify the body.
-	    return "application/json";
-	}
-	/**
-	 * Enclose value in quotes and escape special characters, for use in the Content-Disposition header
-	 */
-	function escapeDispositionField(value) {
-	    return JSON.stringify(value);
-	}
-	function getContentDisposition(descriptor) {
-	    const contentDispositionHeader = getHeaderValue(descriptor, "content-disposition");
-	    if (contentDispositionHeader) {
-	        return contentDispositionHeader;
-	    }
-	    if (descriptor.dispositionType === undefined &&
-	        descriptor.name === undefined &&
-	        descriptor.filename === undefined) {
-	        return undefined;
-	    }
-	    const dispositionType = descriptor.dispositionType ?? "form-data";
-	    let disposition = dispositionType;
-	    if (descriptor.name) {
-	        disposition += `; name=${escapeDispositionField(descriptor.name)}`;
-	    }
-	    let filename = undefined;
-	    if (descriptor.filename) {
-	        filename = descriptor.filename;
-	    }
-	    else if (typeof File !== "undefined" && descriptor.body instanceof File) {
-	        const filenameFromFile = descriptor.body.name;
-	        if (filenameFromFile !== "") {
-	            filename = filenameFromFile;
-	        }
-	    }
-	    if (filename) {
-	        disposition += `; filename=${escapeDispositionField(filename)}`;
-	    }
-	    return disposition;
-	}
-	function normalizeBody(body, contentType) {
-	    if (body === undefined) {
-	        // zero-length body
-	        return new Uint8Array([]);
-	    }
-	    // binary and primitives should go straight on the wire regardless of content type
-	    if ((0, typeGuards_js_1.isBinaryBody)(body)) {
-	        return body;
-	    }
-	    if (typeof body === "string" || typeof body === "number" || typeof body === "boolean") {
-	        return (0, bytesEncoding_js_1.stringToUint8Array)(String(body), "utf-8");
-	    }
-	    // stringify objects for JSON-ish content types e.g. application/json, application/merge-patch+json, application/vnd.oci.manifest.v1+json, application.json; charset=UTF-8
-	    if (contentType && /application\/(.+\+)?json(;.+)?/i.test(String(contentType))) {
-	        return (0, bytesEncoding_js_1.stringToUint8Array)(JSON.stringify(body), "utf-8");
-	    }
-	    throw new restError_js_1.RestError(`Unsupported body/content-type combination: ${body}, ${contentType}`);
-	}
-	function buildBodyPart(descriptor) {
-	    const contentType = getPartContentType(descriptor);
-	    const contentDisposition = getContentDisposition(descriptor);
-	    const headers = (0, httpHeaders_js_1.createHttpHeaders)(descriptor.headers ?? {});
-	    if (contentType) {
-	        headers.set("content-type", contentType);
-	    }
-	    if (contentDisposition) {
-	        headers.set("content-disposition", contentDisposition);
-	    }
-	    const body = normalizeBody(descriptor.body, contentType);
-	    return {
-	        headers,
-	        body,
-	    };
-	}
-	function buildMultipartBody(parts) {
-	    return { parts: parts.map(buildBodyPart) };
-	}
-	
-	return multipart;
-}
-
-var hasRequiredSendRequest;
-
-function requireSendRequest () {
-	if (hasRequiredSendRequest) return sendRequest;
-	hasRequiredSendRequest = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(sendRequest, "__esModule", { value: true });
-	sendRequest.sendRequest = sendRequest$1;
-	const restError_js_1 = requireRestError$2();
-	const httpHeaders_js_1 = requireHttpHeaders$1();
-	const pipelineRequest_js_1 = requirePipelineRequest$1();
-	const clientHelpers_js_1 = requireClientHelpers();
-	const typeGuards_js_1 = requireTypeGuards$1();
-	const multipart_js_1 = requireMultipart();
-	/**
-	 * Helper function to send request used by the client
-	 * @param method - method to use to send the request
-	 * @param url - url to send the request to
-	 * @param pipeline - pipeline with the policies to run when sending the request
-	 * @param options - request options
-	 * @param customHttpClient - a custom HttpClient to use when making the request
-	 * @returns returns and HttpResponse
-	 */
-	async function sendRequest$1(method, url, pipeline, options = {}, customHttpClient) {
-	    const httpClient = customHttpClient ?? (0, clientHelpers_js_1.getCachedDefaultHttpsClient)();
-	    const request = buildPipelineRequest(method, url, options);
-	    try {
-	        const response = await pipeline.sendRequest(httpClient, request);
-	        const headers = response.headers.toJSON();
-	        const stream = response.readableStreamBody ?? response.browserStreamBody;
-	        const parsedBody = options.responseAsStream || stream !== undefined ? undefined : getResponseBody(response);
-	        const body = stream ?? parsedBody;
-	        if (options?.onResponse) {
-	            options.onResponse({ ...response, request, rawHeaders: headers, parsedBody });
-	        }
-	        return {
-	            request,
-	            headers,
-	            status: `${response.status}`,
-	            body,
-	        };
-	    }
-	    catch (e) {
-	        if ((0, restError_js_1.isRestError)(e) && e.response && options.onResponse) {
-	            const { response } = e;
-	            const rawHeaders = response.headers.toJSON();
-	            // UNBRANDED DIFFERENCE: onResponse callback does not have a second __legacyError property
-	            options?.onResponse({ ...response, request, rawHeaders }, e);
-	        }
-	        throw e;
-	    }
-	}
-	/**
-	 * Function to determine the request content type
-	 * @param options - request options InternalRequestParameters
-	 * @returns returns the content-type
-	 */
-	function getRequestContentType(options = {}) {
-	    return (options.contentType ??
-	        options.headers?.["content-type"] ??
-	        getContentType(options.body));
-	}
-	/**
-	 * Function to determine the content-type of a body
-	 * this is used if an explicit content-type is not provided
-	 * @param body - body in the request
-	 * @returns returns the content-type
-	 */
-	function getContentType(body) {
-	    if (ArrayBuffer.isView(body)) {
-	        return "application/octet-stream";
-	    }
-	    if (typeof body === "string") {
-	        try {
-	            JSON.parse(body);
-	            return "application/json";
-	        }
-	        catch (error) {
-	            // If we fail to parse the body, it is not json
-	            return undefined;
-	        }
-	    }
-	    // By default return json
-	    return "application/json";
-	}
-	function buildPipelineRequest(method, url, options = {}) {
-	    const requestContentType = getRequestContentType(options);
-	    const { body, multipartBody } = getRequestBody(options.body, requestContentType);
-	    const hasContent = body !== undefined || multipartBody !== undefined;
-	    const headers = (0, httpHeaders_js_1.createHttpHeaders)({
-	        ...(options.headers ? options.headers : {}),
-	        accept: options.accept ?? options.headers?.accept ?? "application/json",
-	        ...(hasContent &&
-	            requestContentType && {
-	            "content-type": requestContentType,
-	        }),
-	    });
-	    return (0, pipelineRequest_js_1.createPipelineRequest)({
-	        url,
-	        method,
-	        body,
-	        multipartBody,
-	        headers,
-	        allowInsecureConnection: options.allowInsecureConnection,
-	        abortSignal: options.abortSignal,
-	        onUploadProgress: options.onUploadProgress,
-	        onDownloadProgress: options.onDownloadProgress,
-	        timeout: options.timeout,
-	        enableBrowserStreams: true,
-	        streamResponseStatusCodes: options.responseAsStream
-	            ? new Set([Number.POSITIVE_INFINITY])
-	            : undefined,
-	    });
-	}
-	/**
-	 * Prepares the body before sending the request
-	 */
-	function getRequestBody(body, contentType = "") {
-	    if (body === undefined) {
-	        return { body: undefined };
-	    }
-	    if (typeof FormData !== "undefined" && body instanceof FormData) {
-	        return { body };
-	    }
-	    if ((0, typeGuards_js_1.isReadableStream)(body)) {
-	        return { body };
-	    }
-	    if (ArrayBuffer.isView(body)) {
-	        return { body: body instanceof Uint8Array ? body : JSON.stringify(body) };
-	    }
-	    const firstType = contentType.split(";")[0];
-	    switch (firstType) {
-	        case "application/json":
-	            return { body: JSON.stringify(body) };
-	        case "multipart/form-data":
-	            if (Array.isArray(body)) {
-	                return { multipartBody: (0, multipart_js_1.buildMultipartBody)(body) };
-	            }
-	            return { body: JSON.stringify(body) };
-	        case "text/plain":
-	            return { body: String(body) };
-	        default:
-	            if (typeof body === "string") {
-	                return { body };
-	            }
-	            return { body: JSON.stringify(body) };
-	    }
-	}
-	/**
-	 * Prepares the response body
-	 */
-	function getResponseBody(response) {
-	    // Set the default response type
-	    const contentType = response.headers.get("content-type") ?? "";
-	    const firstType = contentType.split(";")[0];
-	    const bodyToParse = response.bodyAsText ?? "";
-	    if (firstType === "text/plain") {
-	        return String(bodyToParse);
-	    }
-	    // Default to "application/json" and fallback to string;
-	    try {
-	        return bodyToParse ? JSON.parse(bodyToParse) : undefined;
-	    }
-	    catch (error) {
-	        // If we were supposed to get a JSON object and failed to
-	        // parse, throw a parse error
-	        if (firstType === "application/json") {
-	            throw createParseError(response, error);
-	        }
-	        // We are not sure how to handle the response so we return it as
-	        // plain text.
-	        return String(bodyToParse);
-	    }
-	}
-	function createParseError(response, err) {
-	    const msg = `Error "${err}" occurred while parsing the response body - ${response.bodyAsText}.`;
-	    const errCode = err.code ?? restError_js_1.RestError.PARSE_ERROR;
-	    return new restError_js_1.RestError(msg, {
-	        code: errCode,
-	        statusCode: response.status,
-	        request: response.request,
-	        response: response,
-	    });
-	}
-	
-	return sendRequest;
-}
-
-var urlHelpers$1 = {};
-
-var hasRequiredUrlHelpers$1;
-
-function requireUrlHelpers$1 () {
-	if (hasRequiredUrlHelpers$1) return urlHelpers$1;
-	hasRequiredUrlHelpers$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(urlHelpers$1, "__esModule", { value: true });
-	urlHelpers$1.buildRequestUrl = buildRequestUrl;
-	urlHelpers$1.buildBaseUrl = buildBaseUrl;
-	urlHelpers$1.replaceAll = replaceAll;
-	function isQueryParameterWithOptions(x) {
-	    const value = x.value;
-	    return (value !== undefined && value.toString !== undefined && typeof value.toString === "function");
-	}
-	/**
-	 * Builds the request url, filling in query and path parameters
-	 * @param endpoint - base url which can be a template url
-	 * @param routePath - path to append to the endpoint
-	 * @param pathParameters - values of the path parameters
-	 * @param options - request parameters including query parameters
-	 * @returns a full url with path and query parameters
-	 */
-	function buildRequestUrl(endpoint, routePath, pathParameters, options = {}) {
-	    if (routePath.startsWith("https://") || routePath.startsWith("http://")) {
-	        return routePath;
-	    }
-	    endpoint = buildBaseUrl(endpoint, options);
-	    routePath = buildRoutePath(routePath, pathParameters, options);
-	    const requestUrl = appendQueryParams(`${endpoint}/${routePath}`, options);
-	    const url = new URL(requestUrl);
-	    return (url
-	        .toString()
-	        // Remove double forward slashes
-	        .replace(/([^:]\/)\/+/g, "$1"));
-	}
-	function getQueryParamValue(key, allowReserved, style, param) {
-	    let separator;
-	    if (style === "pipeDelimited") {
-	        separator = "|";
-	    }
-	    else if (style === "spaceDelimited") {
-	        separator = "%20";
-	    }
-	    else {
-	        separator = ",";
-	    }
-	    let paramValues;
-	    if (Array.isArray(param)) {
-	        paramValues = param;
-	    }
-	    else if (typeof param === "object" && param.toString === Object.prototype.toString) {
-	        // If the parameter is an object without a custom toString implementation (e.g. a Date),
-	        // then we should deconstruct the object into an array [key1, value1, key2, value2, ...].
-	        paramValues = Object.entries(param).flat();
-	    }
-	    else {
-	        paramValues = [param];
-	    }
-	    const value = paramValues
-	        .map((p) => {
-	        if (p === null || p === undefined) {
-	            return "";
-	        }
-	        if (!p.toString || typeof p.toString !== "function") {
-	            throw new Error(`Query parameters must be able to be represented as string, ${key} can't`);
-	        }
-	        const rawValue = p.toISOString !== undefined ? p.toISOString() : p.toString();
-	        return allowReserved ? rawValue : encodeURIComponent(rawValue);
-	    })
-	        .join(separator);
-	    return `${allowReserved ? key : encodeURIComponent(key)}=${value}`;
-	}
-	function appendQueryParams(url, options = {}) {
-	    if (!options.queryParameters) {
-	        return url;
-	    }
-	    const parsedUrl = new URL(url);
-	    const queryParams = options.queryParameters;
-	    const paramStrings = [];
-	    for (const key of Object.keys(queryParams)) {
-	        const param = queryParams[key];
-	        if (param === undefined || param === null) {
-	            continue;
-	        }
-	        const hasMetadata = isQueryParameterWithOptions(param);
-	        const rawValue = hasMetadata ? param.value : param;
-	        const explode = hasMetadata ? (param.explode ?? false) : false;
-	        const style = hasMetadata && param.style ? param.style : "form";
-	        if (explode) {
-	            if (Array.isArray(rawValue)) {
-	                for (const item of rawValue) {
-	                    paramStrings.push(getQueryParamValue(key, options.skipUrlEncoding ?? false, style, item));
-	                }
-	            }
-	            else if (typeof rawValue === "object") {
-	                // For object explode, the name of the query parameter is ignored and we use the object key instead
-	                for (const [actualKey, value] of Object.entries(rawValue)) {
-	                    paramStrings.push(getQueryParamValue(actualKey, options.skipUrlEncoding ?? false, style, value));
-	                }
-	            }
-	            else {
-	                // Explode doesn't really make sense for primitives
-	                throw new Error("explode can only be set to true for objects and arrays");
-	            }
-	        }
-	        else {
-	            paramStrings.push(getQueryParamValue(key, options.skipUrlEncoding ?? false, style, rawValue));
-	        }
-	    }
-	    if (parsedUrl.search !== "") {
-	        parsedUrl.search += "&";
-	    }
-	    parsedUrl.search += paramStrings.join("&");
-	    return parsedUrl.toString();
-	}
-	function buildBaseUrl(endpoint, options) {
-	    if (!options.pathParameters) {
-	        return endpoint;
-	    }
-	    const pathParams = options.pathParameters;
-	    for (const [key, param] of Object.entries(pathParams)) {
-	        if (param === undefined || param === null) {
-	            throw new Error(`Path parameters ${key} must not be undefined or null`);
-	        }
-	        if (!param.toString || typeof param.toString !== "function") {
-	            throw new Error(`Path parameters must be able to be represented as string, ${key} can't`);
-	        }
-	        let value = param.toISOString !== undefined ? param.toISOString() : String(param);
-	        if (!options.skipUrlEncoding) {
-	            value = encodeURIComponent(param);
-	        }
-	        endpoint = replaceAll(endpoint, `{${key}}`, value) ?? "";
-	    }
-	    return endpoint;
-	}
-	function buildRoutePath(routePath, pathParameters, options = {}) {
-	    for (const pathParam of pathParameters) {
-	        const allowReserved = typeof pathParam === "object" && (pathParam.allowReserved ?? false);
-	        let value = typeof pathParam === "object" ? pathParam.value : pathParam;
-	        if (!options.skipUrlEncoding && !allowReserved) {
-	            value = encodeURIComponent(value);
-	        }
-	        routePath = routePath.replace(/\{[\w-]+\}/, String(value));
-	    }
-	    return routePath;
-	}
-	/**
-	 * Replace all of the instances of searchValue in value with the provided replaceValue.
-	 * @param value - The value to search and replace in.
-	 * @param searchValue - The value to search for in the value argument.
-	 * @param replaceValue - The value to replace searchValue with in the value argument.
-	 * @returns The value where each instance of searchValue was replaced with replacedValue.
-	 */
-	function replaceAll(value, searchValue, replaceValue) {
-	    return !value || !searchValue ? value : value.split(searchValue).join(replaceValue || "");
-	}
-	
-	return urlHelpers$1;
-}
-
-var hasRequiredGetClient;
-
-function requireGetClient () {
-	if (hasRequiredGetClient) return getClient;
-	hasRequiredGetClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(getClient, "__esModule", { value: true });
-	getClient.getClient = getClient$1;
-	const clientHelpers_js_1 = requireClientHelpers();
-	const sendRequest_js_1 = requireSendRequest();
-	const urlHelpers_js_1 = requireUrlHelpers$1();
-	const checkEnvironment_js_1 = requireCheckEnvironment();
-	/**
-	 * Creates a client with a default pipeline
-	 * @param endpoint - Base endpoint for the client
-	 * @param credentials - Credentials to authenticate the requests
-	 * @param options - Client options
-	 */
-	function getClient$1(endpoint, clientOptions = {}) {
-	    const pipeline = clientOptions.pipeline ?? (0, clientHelpers_js_1.createDefaultPipeline)(clientOptions);
-	    if (clientOptions.additionalPolicies?.length) {
-	        for (const { policy, position } of clientOptions.additionalPolicies) {
-	            // Sign happens after Retry and is commonly needed to occur
-	            // before policies that intercept post-retry.
-	            const afterPhase = position === "perRetry" ? "Sign" : undefined;
-	            pipeline.addPolicy(policy, {
-	                afterPhase,
-	            });
-	        }
-	    }
-	    const { allowInsecureConnection, httpClient } = clientOptions;
-	    const endpointUrl = clientOptions.endpoint ?? endpoint;
-	    const client = (path, ...args) => {
-	        const getUrl = (requestOptions) => (0, urlHelpers_js_1.buildRequestUrl)(endpointUrl, path, args, { allowInsecureConnection, ...requestOptions });
-	        return {
-	            get: (requestOptions = {}) => {
-	                return buildOperation("GET", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            post: (requestOptions = {}) => {
-	                return buildOperation("POST", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            put: (requestOptions = {}) => {
-	                return buildOperation("PUT", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            patch: (requestOptions = {}) => {
-	                return buildOperation("PATCH", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            delete: (requestOptions = {}) => {
-	                return buildOperation("DELETE", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            head: (requestOptions = {}) => {
-	                return buildOperation("HEAD", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            options: (requestOptions = {}) => {
-	                return buildOperation("OPTIONS", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	            trace: (requestOptions = {}) => {
-	                return buildOperation("TRACE", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
-	            },
-	        };
-	    };
-	    return {
-	        path: client,
-	        pathUnchecked: client,
-	        pipeline,
-	    };
-	}
-	function buildOperation(method, url, pipeline, options, allowInsecureConnection, httpClient) {
-	    allowInsecureConnection = options.allowInsecureConnection ?? allowInsecureConnection;
-	    return {
-	        then: function (onFulfilled, onrejected) {
-	            return (0, sendRequest_js_1.sendRequest)(method, url, pipeline, { ...options, allowInsecureConnection }, httpClient).then(onFulfilled, onrejected);
-	        },
-	        async asBrowserStream() {
-	            if (checkEnvironment_js_1.isNodeLike) {
-	                throw new Error("`asBrowserStream` is supported only in the browser environment. Use `asNodeStream` instead to obtain the response body stream. If you require a Web stream of the response in Node, consider using `Readable.toWeb` on the result of `asNodeStream`.");
-	            }
-	            else {
-	                return (0, sendRequest_js_1.sendRequest)(method, url, pipeline, { ...options, allowInsecureConnection, responseAsStream: true }, httpClient);
-	            }
-	        },
-	        async asNodeStream() {
-	            if (checkEnvironment_js_1.isNodeLike) {
-	                return (0, sendRequest_js_1.sendRequest)(method, url, pipeline, { ...options, allowInsecureConnection, responseAsStream: true }, httpClient);
-	            }
-	            else {
-	                throw new Error("`isNodeStream` is not supported in the browser environment. Use `asBrowserStream` to obtain the response body stream.");
-	            }
-	        },
-	    };
-	}
-	
-	return getClient;
-}
-
-var operationOptionHelpers = {};
-
-var hasRequiredOperationOptionHelpers;
-
-function requireOperationOptionHelpers () {
-	if (hasRequiredOperationOptionHelpers) return operationOptionHelpers;
-	hasRequiredOperationOptionHelpers = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(operationOptionHelpers, "__esModule", { value: true });
-	operationOptionHelpers.operationOptionsToRequestParameters = operationOptionsToRequestParameters;
-	/**
-	 * Helper function to convert OperationOptions to RequestParameters
-	 * @param options - the options that are used by Modular layer to send the request
-	 * @returns the result of the conversion in RequestParameters of RLC layer
-	 */
-	function operationOptionsToRequestParameters(options) {
-	    return {
-	        allowInsecureConnection: options.requestOptions?.allowInsecureConnection,
-	        timeout: options.requestOptions?.timeout,
-	        skipUrlEncoding: options.requestOptions?.skipUrlEncoding,
-	        abortSignal: options.abortSignal,
-	        onUploadProgress: options.requestOptions?.onUploadProgress,
-	        onDownloadProgress: options.requestOptions?.onDownloadProgress,
-	        headers: { ...options.requestOptions?.headers },
-	        onResponse: options.onResponse,
-	    };
-	}
-	
-	return operationOptionHelpers;
-}
-
-var restError$1 = {};
-
-var hasRequiredRestError$1;
-
-function requireRestError$1 () {
-	if (hasRequiredRestError$1) return restError$1;
-	hasRequiredRestError$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(restError$1, "__esModule", { value: true });
-	restError$1.createRestError = createRestError;
-	const restError_js_1 = requireRestError$2();
-	const httpHeaders_js_1 = requireHttpHeaders$1();
-	function createRestError(messageOrResponse, response) {
-	    const resp = typeof messageOrResponse === "string" ? response : messageOrResponse;
-	    const internalError = resp.body?.error ?? resp.body;
-	    const message = typeof messageOrResponse === "string"
-	        ? messageOrResponse
-	        : (internalError?.message ?? `Unexpected status code: ${resp.status}`);
-	    return new restError_js_1.RestError(message, {
-	        statusCode: statusCodeToNumber(resp.status),
-	        code: internalError?.code,
-	        request: resp.request,
-	        response: toPipelineResponse(resp),
-	    });
-	}
-	function toPipelineResponse(response) {
-	    return {
-	        headers: (0, httpHeaders_js_1.createHttpHeaders)(response.headers),
-	        request: response.request,
-	        status: statusCodeToNumber(response.status) ?? -1,
-	    };
-	}
-	function statusCodeToNumber(statusCode) {
-	    const status = Number.parseInt(statusCode);
-	    return Number.isNaN(status) ? undefined : status;
-	}
-	
-	return restError$1;
-}
-
-var hasRequiredCommonjs$e;
-
-function requireCommonjs$e () {
-	if (hasRequiredCommonjs$e) return commonjs$c;
-	hasRequiredCommonjs$e = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.createRestError = exports$1.operationOptionsToRequestParameters = exports$1.getClient = exports$1.createDefaultHttpClient = exports$1.uint8ArrayToString = exports$1.stringToUint8Array = exports$1.isRestError = exports$1.RestError = exports$1.createEmptyPipeline = exports$1.createPipelineRequest = exports$1.createHttpHeaders = exports$1.TypeSpecRuntimeLogger = exports$1.setLogLevel = exports$1.getLogLevel = exports$1.createClientLogger = exports$1.AbortError = void 0;
-		const tslib_1 = require$$0$2;
-		var AbortError_js_1 = requireAbortError$3();
-		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
-		var logger_js_1 = requireLogger$1();
-		Object.defineProperty(exports$1, "createClientLogger", { enumerable: true, get: function () { return logger_js_1.createClientLogger; } });
-		Object.defineProperty(exports$1, "getLogLevel", { enumerable: true, get: function () { return logger_js_1.getLogLevel; } });
-		Object.defineProperty(exports$1, "setLogLevel", { enumerable: true, get: function () { return logger_js_1.setLogLevel; } });
-		Object.defineProperty(exports$1, "TypeSpecRuntimeLogger", { enumerable: true, get: function () { return logger_js_1.TypeSpecRuntimeLogger; } });
-		var httpHeaders_js_1 = requireHttpHeaders$1();
-		Object.defineProperty(exports$1, "createHttpHeaders", { enumerable: true, get: function () { return httpHeaders_js_1.createHttpHeaders; } });
-		tslib_1.__exportStar(requireSchemes(), exports$1);
-		tslib_1.__exportStar(requireOauth2Flows(), exports$1);
-		var pipelineRequest_js_1 = requirePipelineRequest$1();
-		Object.defineProperty(exports$1, "createPipelineRequest", { enumerable: true, get: function () { return pipelineRequest_js_1.createPipelineRequest; } });
-		var pipeline_js_1 = requirePipeline$3();
-		Object.defineProperty(exports$1, "createEmptyPipeline", { enumerable: true, get: function () { return pipeline_js_1.createEmptyPipeline; } });
-		var restError_js_1 = requireRestError$2();
-		Object.defineProperty(exports$1, "RestError", { enumerable: true, get: function () { return restError_js_1.RestError; } });
-		Object.defineProperty(exports$1, "isRestError", { enumerable: true, get: function () { return restError_js_1.isRestError; } });
-		var bytesEncoding_js_1 = requireBytesEncoding();
-		Object.defineProperty(exports$1, "stringToUint8Array", { enumerable: true, get: function () { return bytesEncoding_js_1.stringToUint8Array; } });
-		Object.defineProperty(exports$1, "uint8ArrayToString", { enumerable: true, get: function () { return bytesEncoding_js_1.uint8ArrayToString; } });
-		var defaultHttpClient_js_1 = requireDefaultHttpClient$1();
-		Object.defineProperty(exports$1, "createDefaultHttpClient", { enumerable: true, get: function () { return defaultHttpClient_js_1.createDefaultHttpClient; } });
-		var getClient_js_1 = requireGetClient();
-		Object.defineProperty(exports$1, "getClient", { enumerable: true, get: function () { return getClient_js_1.getClient; } });
-		var operationOptionHelpers_js_1 = requireOperationOptionHelpers();
-		Object.defineProperty(exports$1, "operationOptionsToRequestParameters", { enumerable: true, get: function () { return operationOptionHelpers_js_1.operationOptionsToRequestParameters; } });
-		var restError_js_2 = requireRestError$1();
-		Object.defineProperty(exports$1, "createRestError", { enumerable: true, get: function () { return restError_js_2.createRestError; } });
-		
-	} (commonjs$c));
-	return commonjs$c;
-}
-
-var hasRequiredPipeline$2;
-
-function requirePipeline$2 () {
-	if (hasRequiredPipeline$2) return pipeline$2;
-	hasRequiredPipeline$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(pipeline$2, "__esModule", { value: true });
-	pipeline$2.createEmptyPipeline = createEmptyPipeline;
-	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
-	/**
-	 * Creates a totally empty pipeline.
-	 * Useful for testing or creating a custom one.
-	 */
-	function createEmptyPipeline() {
-	    return (0, ts_http_runtime_1.createEmptyPipeline)();
-	}
-	
-	return pipeline$2;
-}
-
-var createPipelineFromOptions = {};
-
-var logPolicy = {};
-
-var log$3 = {};
-
-var commonjs$b = {};
-
-var internal$2 = {};
-
-var hasRequiredInternal$2;
-
-function requireInternal$2 () {
-	if (hasRequiredInternal$2) return internal$2;
-	hasRequiredInternal$2 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.createLoggerContext = void 0;
-		var logger_js_1 = requireLogger$1();
-		Object.defineProperty(exports$1, "createLoggerContext", { enumerable: true, get: function () { return logger_js_1.createLoggerContext; } });
-		
-	} (internal$2));
-	return internal$2;
-}
-
-var hasRequiredCommonjs$d;
-
-function requireCommonjs$d () {
-	if (hasRequiredCommonjs$d) return commonjs$b;
-	hasRequiredCommonjs$d = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(commonjs$b, "__esModule", { value: true });
-	commonjs$b.AzureLogger = void 0;
-	commonjs$b.setLogLevel = setLogLevel;
-	commonjs$b.getLogLevel = getLogLevel;
-	commonjs$b.createClientLogger = createClientLogger;
-	const logger_1 = /*@__PURE__*/ requireInternal$2();
-	const context = (0, logger_1.createLoggerContext)({
-	    logLevelEnvVarName: "AZURE_LOG_LEVEL",
-	    namespace: "azure",
-	});
-	/**
-	 * The AzureLogger provides a mechanism for overriding where logs are output to.
-	 * By default, logs are sent to stderr.
-	 * Override the `log` method to redirect logs to another location.
-	 */
-	commonjs$b.AzureLogger = context.logger;
-	/**
-	 * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
-	 * @param level - The log level to enable for logging.
-	 * Options from most verbose to least verbose are:
-	 * - verbose
-	 * - info
-	 * - warning
-	 * - error
-	 */
-	function setLogLevel(level) {
-	    context.setLogLevel(level);
-	}
-	/**
-	 * Retrieves the currently specified log level.
-	 */
-	function getLogLevel() {
-	    return context.getLogLevel();
-	}
-	/**
-	 * Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.
-	 * @param namespace - The name of the SDK package.
-	 * @hidden
-	 */
-	function createClientLogger(namespace) {
-	    return context.createClientLogger(namespace);
-	}
-	
-	return commonjs$b;
-}
-
-var hasRequiredLog$3;
-
-function requireLog$3 () {
-	if (hasRequiredLog$3) return log$3;
-	hasRequiredLog$3 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(log$3, "__esModule", { value: true });
-	log$3.logger = void 0;
-	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
-	log$3.logger = (0, logger_1.createClientLogger)("core-rest-pipeline");
-	
-	return log$3;
-}
-
-var internal$1 = {};
-
-var exponentialRetryPolicy$1 = {};
-
-var hasRequiredExponentialRetryPolicy$1;
-
-function requireExponentialRetryPolicy$1 () {
-	if (hasRequiredExponentialRetryPolicy$1) return exponentialRetryPolicy$1;
-	hasRequiredExponentialRetryPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(exponentialRetryPolicy$1, "__esModule", { value: true });
-	exponentialRetryPolicy$1.exponentialRetryPolicyName = void 0;
-	exponentialRetryPolicy$1.exponentialRetryPolicy = exponentialRetryPolicy;
-	const exponentialRetryStrategy_js_1 = requireExponentialRetryStrategy();
-	const retryPolicy_js_1 = requireRetryPolicy$1();
-	const constants_js_1 = requireConstants$5();
-	/**
-	 * The programmatic identifier of the exponentialRetryPolicy.
-	 */
-	exponentialRetryPolicy$1.exponentialRetryPolicyName = "exponentialRetryPolicy";
-	/**
-	 * A policy that attempts to retry requests while introducing an exponentially increasing delay.
-	 * @param options - Options that configure retry logic.
-	 */
-	function exponentialRetryPolicy(options = {}) {
-	    return (0, retryPolicy_js_1.retryPolicy)([
-	        (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)({
-	            ...options,
-	            ignoreSystemErrors: true,
-	        }),
-	    ], {
-	        maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
-	    });
-	}
-	
-	return exponentialRetryPolicy$1;
-}
-
-var systemErrorRetryPolicy$1 = {};
-
-var hasRequiredSystemErrorRetryPolicy$1;
-
-function requireSystemErrorRetryPolicy$1 () {
-	if (hasRequiredSystemErrorRetryPolicy$1) return systemErrorRetryPolicy$1;
-	hasRequiredSystemErrorRetryPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.systemErrorRetryPolicyName = void 0;
-		exports$1.systemErrorRetryPolicy = systemErrorRetryPolicy;
-		const exponentialRetryStrategy_js_1 = requireExponentialRetryStrategy();
-		const retryPolicy_js_1 = requireRetryPolicy$1();
-		const constants_js_1 = requireConstants$5();
-		/**
-		 * Name of the {@link systemErrorRetryPolicy}
-		 */
-		exports$1.systemErrorRetryPolicyName = "systemErrorRetryPolicy";
-		/**
-		 * A retry policy that specifically seeks to handle errors in the
-		 * underlying transport layer (e.g. DNS lookup failures) rather than
-		 * retryable error codes from the server itself.
-		 * @param options - Options that customize the policy.
-		 */
-		function systemErrorRetryPolicy(options = {}) {
-		    return {
-		        name: exports$1.systemErrorRetryPolicyName,
-		        sendRequest: (0, retryPolicy_js_1.retryPolicy)([
-		            (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)({
-		                ...options,
-		                ignoreHttpStatusCodes: true,
-		            }),
-		        ], {
-		            maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
-		        }).sendRequest,
-		    };
-		}
-		
-	} (systemErrorRetryPolicy$1));
-	return systemErrorRetryPolicy$1;
-}
-
-var throttlingRetryPolicy$1 = {};
-
-var hasRequiredThrottlingRetryPolicy$1;
-
-function requireThrottlingRetryPolicy$1 () {
-	if (hasRequiredThrottlingRetryPolicy$1) return throttlingRetryPolicy$1;
-	hasRequiredThrottlingRetryPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.throttlingRetryPolicyName = void 0;
-		exports$1.throttlingRetryPolicy = throttlingRetryPolicy;
-		const throttlingRetryStrategy_js_1 = requireThrottlingRetryStrategy();
-		const retryPolicy_js_1 = requireRetryPolicy$1();
-		const constants_js_1 = requireConstants$5();
-		/**
-		 * Name of the {@link throttlingRetryPolicy}
-		 */
-		exports$1.throttlingRetryPolicyName = "throttlingRetryPolicy";
-		/**
-		 * A policy that retries when the server sends a 429 response with a Retry-After header.
-		 *
-		 * To learn more, please refer to
-		 * https://learn.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits,
-		 * https://learn.microsoft.com/azure/azure-subscription-service-limits and
-		 * https://learn.microsoft.com/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
-		 *
-		 * @param options - Options that configure retry logic.
-		 */
-		function throttlingRetryPolicy(options = {}) {
-		    return {
-		        name: exports$1.throttlingRetryPolicyName,
-		        sendRequest: (0, retryPolicy_js_1.retryPolicy)([(0, throttlingRetryStrategy_js_1.throttlingRetryStrategy)()], {
-		            maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
-		        }).sendRequest,
-		    };
-		}
-		
-	} (throttlingRetryPolicy$1));
-	return throttlingRetryPolicy$1;
-}
-
-var hasRequiredInternal$1;
-
-function requireInternal$1 () {
-	if (hasRequiredInternal$1) return internal$1;
-	hasRequiredInternal$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.userAgentPolicyName = exports$1.userAgentPolicy = exports$1.tlsPolicyName = exports$1.tlsPolicy = exports$1.redirectPolicyName = exports$1.redirectPolicy = exports$1.getDefaultProxySettings = exports$1.proxyPolicyName = exports$1.proxyPolicy = exports$1.multipartPolicyName = exports$1.multipartPolicy = exports$1.logPolicyName = exports$1.logPolicy = exports$1.formDataPolicyName = exports$1.formDataPolicy = exports$1.throttlingRetryPolicyName = exports$1.throttlingRetryPolicy = exports$1.systemErrorRetryPolicyName = exports$1.systemErrorRetryPolicy = exports$1.retryPolicy = exports$1.exponentialRetryPolicyName = exports$1.exponentialRetryPolicy = exports$1.defaultRetryPolicyName = exports$1.defaultRetryPolicy = exports$1.decompressResponsePolicyName = exports$1.decompressResponsePolicy = exports$1.agentPolicyName = exports$1.agentPolicy = void 0;
-		var agentPolicy_js_1 = requireAgentPolicy$1();
-		Object.defineProperty(exports$1, "agentPolicy", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicy; } });
-		Object.defineProperty(exports$1, "agentPolicyName", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicyName; } });
-		var decompressResponsePolicy_js_1 = requireDecompressResponsePolicy$1();
-		Object.defineProperty(exports$1, "decompressResponsePolicy", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicy; } });
-		Object.defineProperty(exports$1, "decompressResponsePolicyName", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicyName; } });
-		var defaultRetryPolicy_js_1 = requireDefaultRetryPolicy$1();
-		Object.defineProperty(exports$1, "defaultRetryPolicy", { enumerable: true, get: function () { return defaultRetryPolicy_js_1.defaultRetryPolicy; } });
-		Object.defineProperty(exports$1, "defaultRetryPolicyName", { enumerable: true, get: function () { return defaultRetryPolicy_js_1.defaultRetryPolicyName; } });
-		var exponentialRetryPolicy_js_1 = requireExponentialRetryPolicy$1();
-		Object.defineProperty(exports$1, "exponentialRetryPolicy", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicy; } });
-		Object.defineProperty(exports$1, "exponentialRetryPolicyName", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicyName; } });
-		var retryPolicy_js_1 = requireRetryPolicy$1();
-		Object.defineProperty(exports$1, "retryPolicy", { enumerable: true, get: function () { return retryPolicy_js_1.retryPolicy; } });
-		var systemErrorRetryPolicy_js_1 = requireSystemErrorRetryPolicy$1();
-		Object.defineProperty(exports$1, "systemErrorRetryPolicy", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicy; } });
-		Object.defineProperty(exports$1, "systemErrorRetryPolicyName", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicyName; } });
-		var throttlingRetryPolicy_js_1 = requireThrottlingRetryPolicy$1();
-		Object.defineProperty(exports$1, "throttlingRetryPolicy", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicy; } });
-		Object.defineProperty(exports$1, "throttlingRetryPolicyName", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicyName; } });
-		var formDataPolicy_js_1 = requireFormDataPolicy$1();
-		Object.defineProperty(exports$1, "formDataPolicy", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicy; } });
-		Object.defineProperty(exports$1, "formDataPolicyName", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicyName; } });
-		var logPolicy_js_1 = requireLogPolicy$1();
-		Object.defineProperty(exports$1, "logPolicy", { enumerable: true, get: function () { return logPolicy_js_1.logPolicy; } });
-		Object.defineProperty(exports$1, "logPolicyName", { enumerable: true, get: function () { return logPolicy_js_1.logPolicyName; } });
-		var multipartPolicy_js_1 = requireMultipartPolicy$1();
-		Object.defineProperty(exports$1, "multipartPolicy", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicy; } });
-		Object.defineProperty(exports$1, "multipartPolicyName", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicyName; } });
-		var proxyPolicy_js_1 = requireProxyPolicy$1();
-		Object.defineProperty(exports$1, "proxyPolicy", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicy; } });
-		Object.defineProperty(exports$1, "proxyPolicyName", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicyName; } });
-		Object.defineProperty(exports$1, "getDefaultProxySettings", { enumerable: true, get: function () { return proxyPolicy_js_1.getDefaultProxySettings; } });
-		var redirectPolicy_js_1 = requireRedirectPolicy$1();
-		Object.defineProperty(exports$1, "redirectPolicy", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicy; } });
-		Object.defineProperty(exports$1, "redirectPolicyName", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicyName; } });
-		var tlsPolicy_js_1 = requireTlsPolicy$1();
-		Object.defineProperty(exports$1, "tlsPolicy", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicy; } });
-		Object.defineProperty(exports$1, "tlsPolicyName", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicyName; } });
-		var userAgentPolicy_js_1 = requireUserAgentPolicy$1();
-		Object.defineProperty(exports$1, "userAgentPolicy", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicy; } });
-		Object.defineProperty(exports$1, "userAgentPolicyName", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicyName; } });
-		
-	} (internal$1));
-	return internal$1;
-}
-
-var hasRequiredLogPolicy;
-
-function requireLogPolicy () {
-	if (hasRequiredLogPolicy) return logPolicy;
-	hasRequiredLogPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(logPolicy, "__esModule", { value: true });
-	logPolicy.logPolicyName = void 0;
-	logPolicy.logPolicy = logPolicy$1;
-	const log_js_1 = requireLog$3();
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * The programmatic identifier of the logPolicy.
-	 */
-	logPolicy.logPolicyName = policies_1.logPolicyName;
-	/**
-	 * A policy that logs all requests and responses.
-	 * @param options - Options to configure logPolicy.
-	 */
-	function logPolicy$1(options = {}) {
-	    return (0, policies_1.logPolicy)({
-	        logger: log_js_1.logger.info,
-	        ...options,
-	    });
-	}
-	
-	return logPolicy;
-}
-
-var redirectPolicy = {};
-
-var hasRequiredRedirectPolicy;
-
-function requireRedirectPolicy () {
-	if (hasRequiredRedirectPolicy) return redirectPolicy;
-	hasRequiredRedirectPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(redirectPolicy, "__esModule", { value: true });
-	redirectPolicy.redirectPolicyName = void 0;
-	redirectPolicy.redirectPolicy = redirectPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * The programmatic identifier of the redirectPolicy.
-	 */
-	redirectPolicy.redirectPolicyName = policies_1.redirectPolicyName;
-	/**
-	 * A policy to follow Location headers from the server in order
-	 * to support server-side redirection.
-	 * In the browser, this policy is not used.
-	 * @param options - Options to control policy behavior.
-	 */
-	function redirectPolicy$1(options = {}) {
-	    return (0, policies_1.redirectPolicy)(options);
-	}
-	
-	return redirectPolicy;
-}
-
-var userAgentPolicy = {};
-
-var userAgent$2 = {};
-
-var userAgentPlatform = {};
-
-var hasRequiredUserAgentPlatform;
-
-function requireUserAgentPlatform () {
-	if (hasRequiredUserAgentPlatform) return userAgentPlatform;
-	hasRequiredUserAgentPlatform = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(userAgentPlatform, "__esModule", { value: true });
-	userAgentPlatform.getHeaderName = getHeaderName;
-	userAgentPlatform.setPlatformSpecificData = setPlatformSpecificData;
-	const tslib_1 = require$$0$2;
-	const node_os_1 = tslib_1.__importDefault(require$$1$7);
-	const node_process_1 = tslib_1.__importDefault(require$$2$3);
-	/**
-	 * @internal
-	 */
-	function getHeaderName() {
-	    return "User-Agent";
-	}
-	/**
-	 * @internal
-	 */
-	async function setPlatformSpecificData(map) {
-	    if (node_process_1.default && node_process_1.default.versions) {
-	        const osInfo = `${node_os_1.default.type()} ${node_os_1.default.release()}; ${node_os_1.default.arch()}`;
-	        const versions = node_process_1.default.versions;
-	        if (versions.bun) {
-	            map.set("Bun", `${versions.bun} (${osInfo})`);
-	        }
-	        else if (versions.deno) {
-	            map.set("Deno", `${versions.deno} (${osInfo})`);
-	        }
-	        else if (versions.node) {
-	            map.set("Node", `${versions.node} (${osInfo})`);
-	        }
-	    }
-	}
-	
-	return userAgentPlatform;
-}
-
-var constants$4 = {};
-
-var hasRequiredConstants$4;
-
-function requireConstants$4 () {
-	if (hasRequiredConstants$4) return constants$4;
-	hasRequiredConstants$4 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(constants$4, "__esModule", { value: true });
-	constants$4.DEFAULT_RETRY_POLICY_COUNT = constants$4.SDK_VERSION = void 0;
-	constants$4.SDK_VERSION = "1.22.2";
-	constants$4.DEFAULT_RETRY_POLICY_COUNT = 3;
-	
-	return constants$4;
-}
-
-var hasRequiredUserAgent$1;
-
-function requireUserAgent$1 () {
-	if (hasRequiredUserAgent$1) return userAgent$2;
-	hasRequiredUserAgent$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(userAgent$2, "__esModule", { value: true });
-	userAgent$2.getUserAgentHeaderName = getUserAgentHeaderName;
-	userAgent$2.getUserAgentValue = getUserAgentValue;
-	const userAgentPlatform_js_1 = requireUserAgentPlatform();
-	const constants_js_1 = requireConstants$4();
-	function getUserAgentString(telemetryInfo) {
-	    const parts = [];
-	    for (const [key, value] of telemetryInfo) {
-	        const token = value ? `${key}/${value}` : key;
-	        parts.push(token);
-	    }
-	    return parts.join(" ");
-	}
-	/**
-	 * @internal
-	 */
-	function getUserAgentHeaderName() {
-	    return (0, userAgentPlatform_js_1.getHeaderName)();
-	}
-	/**
-	 * @internal
-	 */
-	async function getUserAgentValue(prefix) {
-	    const runtimeInfo = new Map();
-	    runtimeInfo.set("core-rest-pipeline", constants_js_1.SDK_VERSION);
-	    await (0, userAgentPlatform_js_1.setPlatformSpecificData)(runtimeInfo);
-	    const defaultAgent = getUserAgentString(runtimeInfo);
-	    const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
-	    return userAgentValue;
-	}
-	
-	return userAgent$2;
-}
-
-var hasRequiredUserAgentPolicy;
-
-function requireUserAgentPolicy () {
-	if (hasRequiredUserAgentPolicy) return userAgentPolicy;
-	hasRequiredUserAgentPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.userAgentPolicyName = void 0;
-		exports$1.userAgentPolicy = userAgentPolicy;
-		const userAgent_js_1 = requireUserAgent$1();
-		const UserAgentHeaderName = (0, userAgent_js_1.getUserAgentHeaderName)();
-		/**
-		 * The programmatic identifier of the userAgentPolicy.
-		 */
-		exports$1.userAgentPolicyName = "userAgentPolicy";
-		/**
-		 * A policy that sets the User-Agent header (or equivalent) to reflect
-		 * the library version.
-		 * @param options - Options to customize the user agent value.
-		 */
-		function userAgentPolicy(options = {}) {
-		    const userAgentValue = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix);
-		    return {
-		        name: exports$1.userAgentPolicyName,
-		        async sendRequest(request, next) {
-		            if (!request.headers.has(UserAgentHeaderName)) {
-		                request.headers.set(UserAgentHeaderName, await userAgentValue);
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (userAgentPolicy));
-	return userAgentPolicy;
-}
-
-var multipartPolicy = {};
-
-var file = {};
-
-var commonjs$a = {};
-
-var internal = {};
-
-var sha256 = {};
-
-var hasRequiredSha256;
-
-function requireSha256 () {
-	if (hasRequiredSha256) return sha256;
-	hasRequiredSha256 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(sha256, "__esModule", { value: true });
-	sha256.computeSha256Hmac = computeSha256Hmac;
-	sha256.computeSha256Hash = computeSha256Hash;
-	const node_crypto_1 = require$$0$g;
-	/**
-	 * Generates a SHA-256 HMAC signature.
-	 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
-	 * @param stringToSign - The data to be signed.
-	 * @param encoding - The textual encoding to use for the returned HMAC digest.
-	 */
-	async function computeSha256Hmac(key, stringToSign, encoding) {
-	    const decodedKey = Buffer.from(key, "base64");
-	    return (0, node_crypto_1.createHmac)("sha256", decodedKey).update(stringToSign).digest(encoding);
-	}
-	/**
-	 * Generates a SHA-256 hash.
-	 * @param content - The data to be included in the hash.
-	 * @param encoding - The textual encoding to use for the returned hash.
-	 */
-	async function computeSha256Hash(content, encoding) {
-	    return (0, node_crypto_1.createHash)("sha256").update(content).digest(encoding);
-	}
-	
-	return sha256;
-}
-
-var hasRequiredInternal;
-
-function requireInternal () {
-	if (hasRequiredInternal) return internal;
-	hasRequiredInternal = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.Sanitizer = exports$1.uint8ArrayToString = exports$1.stringToUint8Array = exports$1.isWebWorker = exports$1.isReactNative = exports$1.isDeno = exports$1.isNodeRuntime = exports$1.isNodeLike = exports$1.isBun = exports$1.isBrowser = exports$1.randomUUID = exports$1.computeSha256Hmac = exports$1.computeSha256Hash = exports$1.isError = exports$1.isObject = exports$1.getRandomIntegerInclusive = exports$1.calculateRetryDelay = void 0;
-		var delay_js_1 = requireDelay$1();
-		Object.defineProperty(exports$1, "calculateRetryDelay", { enumerable: true, get: function () { return delay_js_1.calculateRetryDelay; } });
-		var random_js_1 = requireRandom();
-		Object.defineProperty(exports$1, "getRandomIntegerInclusive", { enumerable: true, get: function () { return random_js_1.getRandomIntegerInclusive; } });
-		var object_js_1 = requireObject();
-		Object.defineProperty(exports$1, "isObject", { enumerable: true, get: function () { return object_js_1.isObject; } });
-		var error_js_1 = requireError$1();
-		Object.defineProperty(exports$1, "isError", { enumerable: true, get: function () { return error_js_1.isError; } });
-		var sha256_js_1 = requireSha256();
-		Object.defineProperty(exports$1, "computeSha256Hash", { enumerable: true, get: function () { return sha256_js_1.computeSha256Hash; } });
-		Object.defineProperty(exports$1, "computeSha256Hmac", { enumerable: true, get: function () { return sha256_js_1.computeSha256Hmac; } });
-		var uuidUtils_js_1 = requireUuidUtils();
-		Object.defineProperty(exports$1, "randomUUID", { enumerable: true, get: function () { return uuidUtils_js_1.randomUUID; } });
-		var checkEnvironment_js_1 = requireCheckEnvironment();
-		Object.defineProperty(exports$1, "isBrowser", { enumerable: true, get: function () { return checkEnvironment_js_1.isBrowser; } });
-		Object.defineProperty(exports$1, "isBun", { enumerable: true, get: function () { return checkEnvironment_js_1.isBun; } });
-		Object.defineProperty(exports$1, "isNodeLike", { enumerable: true, get: function () { return checkEnvironment_js_1.isNodeLike; } });
-		Object.defineProperty(exports$1, "isNodeRuntime", { enumerable: true, get: function () { return checkEnvironment_js_1.isNodeRuntime; } });
-		Object.defineProperty(exports$1, "isDeno", { enumerable: true, get: function () { return checkEnvironment_js_1.isDeno; } });
-		Object.defineProperty(exports$1, "isReactNative", { enumerable: true, get: function () { return checkEnvironment_js_1.isReactNative; } });
-		Object.defineProperty(exports$1, "isWebWorker", { enumerable: true, get: function () { return checkEnvironment_js_1.isWebWorker; } });
-		var bytesEncoding_js_1 = requireBytesEncoding();
-		Object.defineProperty(exports$1, "stringToUint8Array", { enumerable: true, get: function () { return bytesEncoding_js_1.stringToUint8Array; } });
-		Object.defineProperty(exports$1, "uint8ArrayToString", { enumerable: true, get: function () { return bytesEncoding_js_1.uint8ArrayToString; } });
-		var sanitizer_js_1 = requireSanitizer();
-		Object.defineProperty(exports$1, "Sanitizer", { enumerable: true, get: function () { return sanitizer_js_1.Sanitizer; } });
-		
-	} (internal));
-	return internal;
-}
-
-var aborterUtils = {};
-
-var hasRequiredAborterUtils;
-
-function requireAborterUtils () {
-	if (hasRequiredAborterUtils) return aborterUtils;
-	hasRequiredAborterUtils = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(aborterUtils, "__esModule", { value: true });
-	aborterUtils.cancelablePromiseRace = cancelablePromiseRace;
-	/**
-	 * promise.race() wrapper that aborts rest of promises as soon as the first promise settles.
-	 */
-	async function cancelablePromiseRace(abortablePromiseBuilders, options) {
-	    const aborter = new AbortController();
-	    function abortHandler() {
-	        aborter.abort();
-	    }
-	    options?.abortSignal?.addEventListener("abort", abortHandler);
-	    try {
-	        return await Promise.race(abortablePromiseBuilders.map((p) => p({ abortSignal: aborter.signal })));
-	    }
-	    finally {
-	        aborter.abort();
-	        options?.abortSignal?.removeEventListener("abort", abortHandler);
-	    }
-	}
-	
-	return aborterUtils;
-}
-
-var createAbortablePromise = {};
-
-var commonjs$9 = {};
-
-var AbortError$3 = {};
-
-var hasRequiredAbortError$2;
-
-function requireAbortError$2 () {
-	if (hasRequiredAbortError$2) return AbortError$3;
-	hasRequiredAbortError$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(AbortError$3, "__esModule", { value: true });
-	AbortError$3.AbortError = void 0;
-	/**
-	 * This error is thrown when an asynchronous operation has been aborted.
-	 * Check for this error by testing the `name` that the name property of the
-	 * error matches `"AbortError"`.
-	 *
-	 * @example
-	 * ```ts
-	 * const controller = new AbortController();
-	 * controller.abort();
-	 * try {
-	 *   doAsyncWork(controller.signal)
-	 * } catch (e) {
-	 *   if (e.name === 'AbortError') {
-	 *     // handle abort error here.
-	 *   }
-	 * }
-	 * ```
-	 */
-	class AbortError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = "AbortError";
-	    }
-	}
-	AbortError$3.AbortError = AbortError;
-	
-	return AbortError$3;
-}
-
-var hasRequiredCommonjs$c;
-
-function requireCommonjs$c () {
-	if (hasRequiredCommonjs$c) return commonjs$9;
-	hasRequiredCommonjs$c = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT license.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.AbortError = void 0;
-		var AbortError_js_1 = requireAbortError$2();
-		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
-		
-	} (commonjs$9));
-	return commonjs$9;
-}
-
-var hasRequiredCreateAbortablePromise;
-
-function requireCreateAbortablePromise () {
-	if (hasRequiredCreateAbortablePromise) return createAbortablePromise;
-	hasRequiredCreateAbortablePromise = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(createAbortablePromise, "__esModule", { value: true });
-	createAbortablePromise.createAbortablePromise = createAbortablePromise$1;
-	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$c();
-	/**
-	 * Creates an abortable promise.
-	 * @param buildPromise - A function that takes the resolve and reject functions as parameters.
-	 * @param options - The options for the abortable promise.
-	 * @returns A promise that can be aborted.
-	 */
-	function createAbortablePromise$1(buildPromise, options) {
-	    const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options ?? {};
-	    return new Promise((resolve, reject) => {
-	        function rejectOnAbort() {
-	            reject(new abort_controller_1.AbortError(abortErrorMsg ?? "The operation was aborted."));
-	        }
-	        function removeListeners() {
-	            abortSignal?.removeEventListener("abort", onAbort);
-	        }
-	        function onAbort() {
-	            cleanupBeforeAbort?.();
-	            removeListeners();
-	            rejectOnAbort();
-	        }
-	        if (abortSignal?.aborted) {
-	            return rejectOnAbort();
-	        }
-	        try {
-	            buildPromise((x) => {
-	                removeListeners();
-	                resolve(x);
-	            }, (x) => {
-	                removeListeners();
-	                reject(x);
-	            });
-	        }
-	        catch (err) {
-	            reject(err);
-	        }
-	        abortSignal?.addEventListener("abort", onAbort);
-	    });
-	}
-	
-	return createAbortablePromise;
-}
-
-var delay$1 = {};
-
-var hasRequiredDelay;
-
-function requireDelay () {
-	if (hasRequiredDelay) return delay$1;
-	hasRequiredDelay = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(delay$1, "__esModule", { value: true });
-	delay$1.delay = delay;
-	delay$1.calculateRetryDelay = calculateRetryDelay;
-	const createAbortablePromise_js_1 = requireCreateAbortablePromise();
-	const util_1 = /*@__PURE__*/ requireInternal();
-	const StandardAbortMessage = "The delay was aborted.";
-	/**
-	 * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.
-	 * @param timeInMs - The number of milliseconds to be delayed.
-	 * @param options - The options for delay - currently abort options
-	 * @returns Promise that is resolved after timeInMs
-	 */
-	function delay(timeInMs, options) {
-	    let token;
-	    const { abortSignal, abortErrorMsg } = options ?? {};
-	    return (0, createAbortablePromise_js_1.createAbortablePromise)((resolve) => {
-	        token = setTimeout(resolve, timeInMs);
-	    }, {
-	        cleanupBeforeAbort: () => clearTimeout(token),
-	        abortSignal,
-	        abortErrorMsg: abortErrorMsg ?? StandardAbortMessage,
-	    });
-	}
-	/**
-	 * Calculates the delay interval for retry attempts using exponential delay with jitter.
-	 * @param retryAttempt - The current retry attempt number.
-	 * @param config - The exponential retry configuration.
-	 * @returns An object containing the calculated retry delay.
-	 */
-	function calculateRetryDelay(retryAttempt, config) {
-	    // Exponentially increase the delay each time
-	    const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt);
-	    // Don't let the delay exceed the maximum
-	    const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay);
-	    // Allow the final value to have some "jitter" (within 50% of the delay size) so
-	    // that retries across multiple clients don't occur simultaneously.
-	    const retryAfterInMs = clampedDelay / 2 + (0, util_1.getRandomIntegerInclusive)(0, clampedDelay / 2);
-	    return { retryAfterInMs };
-	}
-	
-	return delay$1;
-}
-
-var error = {};
-
-var hasRequiredError;
-
-function requireError () {
-	if (hasRequiredError) return error;
-	hasRequiredError = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(error, "__esModule", { value: true });
-	error.getErrorMessage = getErrorMessage;
-	const util_1 = /*@__PURE__*/ requireInternal();
-	/**
-	 * Given what is thought to be an error object, return the message if possible.
-	 * If the message is missing, returns a stringified version of the input.
-	 * @param e - Something thrown from a try block
-	 * @returns The error message or a string of the input
-	 */
-	function getErrorMessage(e) {
-	    if ((0, util_1.isError)(e)) {
-	        return e.message;
-	    }
-	    else {
-	        let stringified;
-	        try {
-	            if (typeof e === "object" && e) {
-	                stringified = JSON.stringify(e);
-	            }
-	            else {
-	                stringified = String(e);
-	            }
-	        }
-	        catch (err) {
-	            stringified = "[unable to stringify input]";
-	        }
-	        return `Unknown error ${stringified}`;
-	    }
-	}
-	
-	return error;
-}
-
-var typeGuards = {};
-
-var hasRequiredTypeGuards;
-
-function requireTypeGuards () {
-	if (hasRequiredTypeGuards) return typeGuards;
-	hasRequiredTypeGuards = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(typeGuards, "__esModule", { value: true });
-	typeGuards.isDefined = isDefined;
-	typeGuards.isObjectWithProperties = isObjectWithProperties;
-	typeGuards.objectHasProperty = objectHasProperty;
-	/**
-	 * Helper TypeGuard that checks if something is defined or not.
-	 * @param thing - Anything
-	 */
-	function isDefined(thing) {
-	    return typeof thing !== "undefined" && thing !== null;
-	}
-	/**
-	 * Helper TypeGuard that checks if the input is an object with the specified properties.
-	 * @param thing - Anything.
-	 * @param properties - The name of the properties that should appear in the object.
-	 */
-	function isObjectWithProperties(thing, properties) {
-	    if (!isDefined(thing) || typeof thing !== "object") {
-	        return false;
-	    }
-	    for (const property of properties) {
-	        if (!objectHasProperty(thing, property)) {
-	            return false;
-	        }
-	    }
-	    return true;
-	}
-	/**
-	 * Helper TypeGuard that checks if the input is an object with the specified property.
-	 * @param thing - Any object.
-	 * @param property - The name of the property that should appear in the object.
-	 */
-	function objectHasProperty(thing, property) {
-	    return (isDefined(thing) && typeof thing === "object" && property in thing);
-	}
-	
-	return typeGuards;
-}
-
-var hasRequiredCommonjs$b;
-
-function requireCommonjs$b () {
-	if (hasRequiredCommonjs$b) return commonjs$a;
-	hasRequiredCommonjs$b = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.isWebWorker = exports$1.isReactNative = exports$1.isNodeRuntime = exports$1.isNodeLike = exports$1.isNode = exports$1.isDeno = exports$1.isBun = exports$1.isBrowser = exports$1.objectHasProperty = exports$1.isObjectWithProperties = exports$1.isDefined = exports$1.getErrorMessage = exports$1.delay = exports$1.createAbortablePromise = exports$1.cancelablePromiseRace = void 0;
-		exports$1.calculateRetryDelay = calculateRetryDelay;
-		exports$1.computeSha256Hash = computeSha256Hash;
-		exports$1.computeSha256Hmac = computeSha256Hmac;
-		exports$1.getRandomIntegerInclusive = getRandomIntegerInclusive;
-		exports$1.isError = isError;
-		exports$1.isObject = isObject;
-		exports$1.randomUUID = randomUUID;
-		exports$1.uint8ArrayToString = uint8ArrayToString;
-		exports$1.stringToUint8Array = stringToUint8Array;
-		const tslib_1 = require$$0$2;
-		const tspRuntime = tslib_1.__importStar(/*@__PURE__*/ requireInternal());
-		var aborterUtils_js_1 = requireAborterUtils();
-		Object.defineProperty(exports$1, "cancelablePromiseRace", { enumerable: true, get: function () { return aborterUtils_js_1.cancelablePromiseRace; } });
-		var createAbortablePromise_js_1 = requireCreateAbortablePromise();
-		Object.defineProperty(exports$1, "createAbortablePromise", { enumerable: true, get: function () { return createAbortablePromise_js_1.createAbortablePromise; } });
-		var delay_js_1 = requireDelay();
-		Object.defineProperty(exports$1, "delay", { enumerable: true, get: function () { return delay_js_1.delay; } });
-		var error_js_1 = requireError();
-		Object.defineProperty(exports$1, "getErrorMessage", { enumerable: true, get: function () { return error_js_1.getErrorMessage; } });
-		var typeGuards_js_1 = requireTypeGuards();
-		Object.defineProperty(exports$1, "isDefined", { enumerable: true, get: function () { return typeGuards_js_1.isDefined; } });
-		Object.defineProperty(exports$1, "isObjectWithProperties", { enumerable: true, get: function () { return typeGuards_js_1.isObjectWithProperties; } });
-		Object.defineProperty(exports$1, "objectHasProperty", { enumerable: true, get: function () { return typeGuards_js_1.objectHasProperty; } });
-		/**
-		 * Calculates the delay interval for retry attempts using exponential delay with jitter.
-		 *
-		 * @param retryAttempt - The current retry attempt number.
-		 *
-		 * @param config - The exponential retry configuration.
-		 *
-		 * @returns An object containing the calculated retry delay.
-		 */
-		function calculateRetryDelay(retryAttempt, config) {
-		    return tspRuntime.calculateRetryDelay(retryAttempt, config);
-		}
-		/**
-		 * Generates a SHA-256 hash.
-		 *
-		 * @param content - The data to be included in the hash.
-		 *
-		 * @param encoding - The textual encoding to use for the returned hash.
-		 */
-		function computeSha256Hash(content, encoding) {
-		    return tspRuntime.computeSha256Hash(content, encoding);
-		}
-		/**
-		 * Generates a SHA-256 HMAC signature.
-		 *
-		 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
-		 *
-		 * @param stringToSign - The data to be signed.
-		 *
-		 * @param encoding - The textual encoding to use for the returned HMAC digest.
-		 */
-		function computeSha256Hmac(key, stringToSign, encoding) {
-		    return tspRuntime.computeSha256Hmac(key, stringToSign, encoding);
-		}
-		/**
-		 * Returns a random integer value between a lower and upper bound, inclusive of both bounds. Note that this uses Math.random and isn't secure. If you need to use this for any kind of security purpose, find a better source of random.
-		 *
-		 * @param min - The smallest integer value allowed.
-		 *
-		 * @param max - The largest integer value allowed.
-		 */
-		function getRandomIntegerInclusive(min, max) {
-		    return tspRuntime.getRandomIntegerInclusive(min, max);
-		}
-		/**
-		 * Typeguard for an error object shape (has name and message)
-		 *
-		 * @param e - Something caught by a catch clause.
-		 */
-		function isError(e) {
-		    return tspRuntime.isError(e);
-		}
-		/**
-		 * Helper to determine when an input is a generic JS object.
-		 *
-		 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
-		 */
-		function isObject(input) {
-		    return tspRuntime.isObject(input);
-		}
-		/**
-		 * Generated Universally Unique Identifier
-		 *
-		 * @returns RFC4122 v4 UUID.
-		 */
-		function randomUUID() {
-		    return tspRuntime.randomUUID();
-		}
-		/**
-		 * A constant that indicates whether the environment the code is running is a Web Browser.
-		 */
-		exports$1.isBrowser = tspRuntime.isBrowser;
-		/**
-		 * A constant that indicates whether the environment the code is running is Bun.sh.
-		 */
-		exports$1.isBun = tspRuntime.isBun;
-		/**
-		 * A constant that indicates whether the environment the code is running is Deno.
-		 */
-		exports$1.isDeno = tspRuntime.isDeno;
-		/**
-		 * A constant that indicates whether the environment the code is running is a Node.js compatible environment.
-		 *
-		 * @deprecated
-		 *
-		 * Use `isNodeLike` instead.
-		 */
-		exports$1.isNode = tspRuntime.isNodeLike;
-		/**
-		 * A constant that indicates whether the environment the code is running is a Node.js compatible environment.
-		 */
-		exports$1.isNodeLike = tspRuntime.isNodeLike;
-		/**
-		 * A constant that indicates whether the environment the code is running is Node.JS.
-		 */
-		exports$1.isNodeRuntime = tspRuntime.isNodeRuntime;
-		/**
-		 * A constant that indicates whether the environment the code is running is in React-Native.
-		 */
-		exports$1.isReactNative = tspRuntime.isReactNative;
-		/**
-		 * A constant that indicates whether the environment the code is running is a Web Worker.
-		 */
-		exports$1.isWebWorker = tspRuntime.isWebWorker;
-		/**
-		 * The helper that transforms bytes with specific character encoding into string
-		 * @param bytes - the uint8array bytes
-		 * @param format - the format we use to encode the byte
-		 * @returns a string of the encoded string
-		 */
-		function uint8ArrayToString(bytes, format) {
-		    return tspRuntime.uint8ArrayToString(bytes, format);
-		}
-		/**
-		 * The helper that transforms string to specific character encoded bytes array.
-		 * @param value - the string to be converted
-		 * @param format - the format we use to decode the value
-		 * @returns a uint8array
-		 */
-		function stringToUint8Array(value, format) {
-		    return tspRuntime.stringToUint8Array(value, format);
-		}
-		
-	} (commonjs$a));
-	return commonjs$a;
-}
-
-var hasRequiredFile;
-
-function requireFile () {
-	if (hasRequiredFile) return file;
-	hasRequiredFile = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(file, "__esModule", { value: true });
-	file.hasRawContent = hasRawContent;
-	file.getRawContent = getRawContent;
-	file.createFileFromStream = createFileFromStream;
-	file.createFile = createFile;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	function isNodeReadableStream(x) {
-	    return Boolean(x && typeof x["pipe"] === "function");
-	}
-	const unimplementedMethods = {
-	    arrayBuffer: () => {
-	        throw new Error("Not implemented");
-	    },
-	    bytes: () => {
-	        throw new Error("Not implemented");
-	    },
-	    slice: () => {
-	        throw new Error("Not implemented");
-	    },
-	    text: () => {
-	        throw new Error("Not implemented");
-	    },
-	};
-	/**
-	 * Private symbol used as key on objects created using createFile containing the
-	 * original source of the file object.
-	 *
-	 * This is used in Node to access the original Node stream without using Blob#stream, which
-	 * returns a web stream. This is done to avoid a couple of bugs to do with Blob#stream and
-	 * Readable#to/fromWeb in Node versions we support:
-	 * - https://github.com/nodejs/node/issues/42694 (fixed in Node 18.14)
-	 * - https://github.com/nodejs/node/issues/48916 (fixed in Node 20.6)
-	 *
-	 * Once these versions are no longer supported, we may be able to stop doing this.
-	 *
-	 * @internal
-	 */
-	const rawContent = Symbol("rawContent");
-	/**
-	 * Type guard to check if a given object is a blob-like object with a raw content property.
-	 */
-	function hasRawContent(x) {
-	    return typeof x[rawContent] === "function";
-	}
-	/**
-	 * Extract the raw content from a given blob-like object. If the input was created using createFile
-	 * or createFileFromStream, the exact content passed into createFile/createFileFromStream will be used.
-	 * For true instances of Blob and File, returns the actual blob.
-	 *
-	 * @internal
-	 */
-	function getRawContent(blob) {
-	    if (hasRawContent(blob)) {
-	        return blob[rawContent]();
-	    }
-	    else {
-	        return blob;
-	    }
-	}
-	/**
-	 * Create an object that implements the File interface. This object is intended to be
-	 * passed into RequestBodyType.formData, and is not guaranteed to work as expected in
-	 * other situations.
-	 *
-	 * Use this function to:
-	 * - Create a File object for use in RequestBodyType.formData in environments where the
-	 *   global File object is unavailable.
-	 * - Create a File-like object from a readable stream without reading the stream into memory.
-	 *
-	 * @param stream - the content of the file as a callback returning a stream. When a File object made using createFile is
-	 *                  passed in a request's form data map, the stream will not be read into memory
-	 *                  and instead will be streamed when the request is made. In the event of a retry, the
-	 *                  stream needs to be read again, so this callback SHOULD return a fresh stream if possible.
-	 * @param name - the name of the file.
-	 * @param options - optional metadata about the file, e.g. file name, file size, MIME type.
-	 */
-	function createFileFromStream(stream, name, options = {}) {
-	    return {
-	        ...unimplementedMethods,
-	        type: options.type ?? "",
-	        lastModified: options.lastModified ?? new Date().getTime(),
-	        webkitRelativePath: options.webkitRelativePath ?? "",
-	        size: options.size ?? -1,
-	        name,
-	        stream: () => {
-	            const s = stream();
-	            if (isNodeReadableStream(s)) {
-	                throw new Error("Not supported: a Node stream was provided as input to createFileFromStream.");
-	            }
-	            return s;
-	        },
-	        [rawContent]: stream,
-	    };
-	}
-	/**
-	 * Create an object that implements the File interface. This object is intended to be
-	 * passed into RequestBodyType.formData, and is not guaranteed to work as expected in
-	 * other situations.
-	 *
-	 * Use this function create a File object for use in RequestBodyType.formData in environments where the global File object is unavailable.
-	 *
-	 * @param content - the content of the file as a Uint8Array in memory.
-	 * @param name - the name of the file.
-	 * @param options - optional metadata about the file, e.g. file name, file size, MIME type.
-	 */
-	function createFile(content, name, options = {}) {
-	    if (core_util_1.isNodeLike) {
-	        return {
-	            ...unimplementedMethods,
-	            type: options.type ?? "",
-	            lastModified: options.lastModified ?? new Date().getTime(),
-	            webkitRelativePath: options.webkitRelativePath ?? "",
-	            size: content.byteLength,
-	            name,
-	            arrayBuffer: async () => content.buffer,
-	            stream: () => new Blob([toArrayBuffer(content)]).stream(),
-	            [rawContent]: () => content,
-	        };
-	    }
-	    else {
-	        return new File([toArrayBuffer(content)], name, options);
-	    }
-	}
-	function toArrayBuffer(source) {
-	    if ("resize" in source.buffer) {
-	        // ArrayBuffer
-	        return source;
-	    }
-	    // SharedArrayBuffer
-	    return source.map((x) => x);
-	}
-	
-	return file;
-}
-
-var hasRequiredMultipartPolicy;
-
-function requireMultipartPolicy () {
-	if (hasRequiredMultipartPolicy) return multipartPolicy;
-	hasRequiredMultipartPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.multipartPolicyName = void 0;
-		exports$1.multipartPolicy = multipartPolicy;
-		const policies_1 = /*@__PURE__*/ requireInternal$1();
-		const file_js_1 = requireFile();
-		/**
-		 * Name of multipart policy
-		 */
-		exports$1.multipartPolicyName = policies_1.multipartPolicyName;
-		/**
-		 * Pipeline policy for multipart requests
-		 */
-		function multipartPolicy() {
-		    const tspPolicy = (0, policies_1.multipartPolicy)();
-		    return {
-		        name: exports$1.multipartPolicyName,
-		        sendRequest: async (request, next) => {
-		            if (request.multipartBody) {
-		                for (const part of request.multipartBody.parts) {
-		                    if ((0, file_js_1.hasRawContent)(part.body)) {
-		                        part.body = (0, file_js_1.getRawContent)(part.body);
-		                    }
-		                }
-		            }
-		            return tspPolicy.sendRequest(request, next);
-		        },
-		    };
-		}
-		
-	} (multipartPolicy));
-	return multipartPolicy;
-}
-
-var decompressResponsePolicy = {};
-
-var hasRequiredDecompressResponsePolicy;
-
-function requireDecompressResponsePolicy () {
-	if (hasRequiredDecompressResponsePolicy) return decompressResponsePolicy;
-	hasRequiredDecompressResponsePolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(decompressResponsePolicy, "__esModule", { value: true });
-	decompressResponsePolicy.decompressResponsePolicyName = void 0;
-	decompressResponsePolicy.decompressResponsePolicy = decompressResponsePolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * The programmatic identifier of the decompressResponsePolicy.
-	 */
-	decompressResponsePolicy.decompressResponsePolicyName = policies_1.decompressResponsePolicyName;
-	/**
-	 * A policy to enable response decompression according to Accept-Encoding header
-	 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
-	 */
-	function decompressResponsePolicy$1() {
-	    return (0, policies_1.decompressResponsePolicy)();
-	}
-	
-	return decompressResponsePolicy;
-}
-
-var defaultRetryPolicy = {};
-
-var hasRequiredDefaultRetryPolicy;
-
-function requireDefaultRetryPolicy () {
-	if (hasRequiredDefaultRetryPolicy) return defaultRetryPolicy;
-	hasRequiredDefaultRetryPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(defaultRetryPolicy, "__esModule", { value: true });
-	defaultRetryPolicy.defaultRetryPolicyName = void 0;
-	defaultRetryPolicy.defaultRetryPolicy = defaultRetryPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * Name of the {@link defaultRetryPolicy}
-	 */
-	defaultRetryPolicy.defaultRetryPolicyName = policies_1.defaultRetryPolicyName;
-	/**
-	 * A policy that retries according to three strategies:
-	 * - When the server sends a 429 response with a Retry-After header.
-	 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
-	 * - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
-	 */
-	function defaultRetryPolicy$1(options = {}) {
-	    return (0, policies_1.defaultRetryPolicy)(options);
-	}
-	
-	return defaultRetryPolicy;
-}
-
-var formDataPolicy = {};
-
-var hasRequiredFormDataPolicy;
-
-function requireFormDataPolicy () {
-	if (hasRequiredFormDataPolicy) return formDataPolicy;
-	hasRequiredFormDataPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(formDataPolicy, "__esModule", { value: true });
-	formDataPolicy.formDataPolicyName = void 0;
-	formDataPolicy.formDataPolicy = formDataPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * The programmatic identifier of the formDataPolicy.
-	 */
-	formDataPolicy.formDataPolicyName = policies_1.formDataPolicyName;
-	/**
-	 * A policy that encodes FormData on the request into the body.
-	 */
-	function formDataPolicy$1() {
-	    return (0, policies_1.formDataPolicy)();
-	}
-	
-	return formDataPolicy;
-}
-
-var proxyPolicy = {};
-
-var hasRequiredProxyPolicy;
-
-function requireProxyPolicy () {
-	if (hasRequiredProxyPolicy) return proxyPolicy;
-	hasRequiredProxyPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(proxyPolicy, "__esModule", { value: true });
-	proxyPolicy.proxyPolicyName = void 0;
-	proxyPolicy.getDefaultProxySettings = getDefaultProxySettings;
-	proxyPolicy.proxyPolicy = proxyPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * The programmatic identifier of the proxyPolicy.
-	 */
-	proxyPolicy.proxyPolicyName = policies_1.proxyPolicyName;
-	/**
-	 * This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
-	 * If no argument is given, it attempts to parse a proxy URL from the environment
-	 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
-	 * @param proxyUrl - The url of the proxy to use. May contain authentication information.
-	 * @deprecated - Internally this method is no longer necessary when setting proxy information.
-	 */
-	function getDefaultProxySettings(proxyUrl) {
-	    return (0, policies_1.getDefaultProxySettings)(proxyUrl);
-	}
-	/**
-	 * A policy that allows one to apply proxy settings to all requests.
-	 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
-	 * or HTTP_PROXY environment variables.
-	 * @param proxySettings - ProxySettings to use on each request.
-	 * @param options - additional settings, for example, custom NO_PROXY patterns
-	 */
-	function proxyPolicy$1(proxySettings, options) {
-	    return (0, policies_1.proxyPolicy)(proxySettings, options);
-	}
-	
-	return proxyPolicy;
-}
-
-var setClientRequestIdPolicy = {};
-
-var hasRequiredSetClientRequestIdPolicy;
-
-function requireSetClientRequestIdPolicy () {
-	if (hasRequiredSetClientRequestIdPolicy) return setClientRequestIdPolicy;
-	hasRequiredSetClientRequestIdPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.setClientRequestIdPolicyName = void 0;
-		exports$1.setClientRequestIdPolicy = setClientRequestIdPolicy;
-		/**
-		 * The programmatic identifier of the setClientRequestIdPolicy.
-		 */
-		exports$1.setClientRequestIdPolicyName = "setClientRequestIdPolicy";
-		/**
-		 * Each PipelineRequest gets a unique id upon creation.
-		 * This policy passes that unique id along via an HTTP header to enable better
-		 * telemetry and tracing.
-		 * @param requestIdHeaderName - The name of the header to pass the request ID to.
-		 */
-		function setClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
-		    return {
-		        name: exports$1.setClientRequestIdPolicyName,
-		        async sendRequest(request, next) {
-		            if (!request.headers.has(requestIdHeaderName)) {
-		                request.headers.set(requestIdHeaderName, request.requestId);
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (setClientRequestIdPolicy));
-	return setClientRequestIdPolicy;
-}
-
-var agentPolicy = {};
-
-var hasRequiredAgentPolicy;
-
-function requireAgentPolicy () {
-	if (hasRequiredAgentPolicy) return agentPolicy;
-	hasRequiredAgentPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(agentPolicy, "__esModule", { value: true });
-	agentPolicy.agentPolicyName = void 0;
-	agentPolicy.agentPolicy = agentPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * Name of the Agent Policy
-	 */
-	agentPolicy.agentPolicyName = policies_1.agentPolicyName;
-	/**
-	 * Gets a pipeline policy that sets http.agent
-	 */
-	function agentPolicy$1(agent) {
-	    return (0, policies_1.agentPolicy)(agent);
-	}
-	
-	return agentPolicy;
-}
-
-var tlsPolicy = {};
-
-var hasRequiredTlsPolicy;
-
-function requireTlsPolicy () {
-	if (hasRequiredTlsPolicy) return tlsPolicy;
-	hasRequiredTlsPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(tlsPolicy, "__esModule", { value: true });
-	tlsPolicy.tlsPolicyName = void 0;
-	tlsPolicy.tlsPolicy = tlsPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * Name of the TLS Policy
-	 */
-	tlsPolicy.tlsPolicyName = policies_1.tlsPolicyName;
-	/**
-	 * Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
-	 */
-	function tlsPolicy$1(tlsSettings) {
-	    return (0, policies_1.tlsPolicy)(tlsSettings);
-	}
-	
-	return tlsPolicy;
-}
-
-var tracingPolicy = {};
-
-var commonjs$8 = {};
-
-var instrumenter = {};
-
-var tracingContext = {};
-
-var hasRequiredTracingContext;
-
-function requireTracingContext () {
-	if (hasRequiredTracingContext) return tracingContext;
-	hasRequiredTracingContext = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.TracingContextImpl = exports$1.knownContextKeys = void 0;
-		exports$1.createTracingContext = createTracingContext;
-		/** @internal */
-		exports$1.knownContextKeys = {
-		    span: Symbol.for("@azure/core-tracing span"),
-		    namespace: Symbol.for("@azure/core-tracing namespace"),
-		};
-		/**
-		 * Creates a new {@link TracingContext} with the given options.
-		 * @param options - A set of known keys that may be set on the context.
-		 * @returns A new {@link TracingContext} with the given options.
-		 *
-		 * @internal
-		 */
-		function createTracingContext(options = {}) {
-		    let context = new TracingContextImpl(options.parentContext);
-		    if (options.span) {
-		        context = context.setValue(exports$1.knownContextKeys.span, options.span);
-		    }
-		    if (options.namespace) {
-		        context = context.setValue(exports$1.knownContextKeys.namespace, options.namespace);
-		    }
-		    return context;
-		}
-		/** @internal */
-		class TracingContextImpl {
-		    _contextMap;
-		    constructor(initialContext) {
-		        this._contextMap =
-		            initialContext instanceof TracingContextImpl
-		                ? new Map(initialContext._contextMap)
-		                : new Map();
-		    }
-		    setValue(key, value) {
-		        const newContext = new TracingContextImpl(this);
-		        newContext._contextMap.set(key, value);
-		        return newContext;
-		    }
-		    getValue(key) {
-		        return this._contextMap.get(key);
-		    }
-		    deleteValue(key) {
-		        const newContext = new TracingContextImpl(this);
-		        newContext._contextMap.delete(key);
-		        return newContext;
-		    }
-		}
-		exports$1.TracingContextImpl = TracingContextImpl;
-		
-	} (tracingContext));
-	return tracingContext;
-}
-
-var state$1 = {};
-
-var hasRequiredState$1;
-
-function requireState$1 () {
-	if (hasRequiredState$1) return state$1;
-	hasRequiredState$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(state$1, "__esModule", { value: true });
-	state$1.state = void 0;
-	/**
-	 * @internal
-	 *
-	 * Holds the singleton instrumenter, to be shared across CJS and ESM imports.
-	 */
-	state$1.state = {
-	    instrumenterImplementation: undefined,
-	};
-	
-	return state$1;
-}
-
-var hasRequiredInstrumenter;
-
-function requireInstrumenter () {
-	if (hasRequiredInstrumenter) return instrumenter;
-	hasRequiredInstrumenter = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(instrumenter, "__esModule", { value: true });
-	instrumenter.createDefaultTracingSpan = createDefaultTracingSpan;
-	instrumenter.createDefaultInstrumenter = createDefaultInstrumenter;
-	instrumenter.useInstrumenter = useInstrumenter;
-	instrumenter.getInstrumenter = getInstrumenter;
-	const tracingContext_js_1 = requireTracingContext();
-	const state_js_1 = requireState$1();
-	function createDefaultTracingSpan() {
-	    return {
-	        end: () => {
-	            // noop
-	        },
-	        isRecording: () => false,
-	        recordException: () => {
-	            // noop
-	        },
-	        setAttribute: () => {
-	            // noop
-	        },
-	        setStatus: () => {
-	            // noop
-	        },
-	        addEvent: () => {
-	            // noop
-	        },
-	    };
-	}
-	function createDefaultInstrumenter() {
-	    return {
-	        createRequestHeaders: () => {
-	            return {};
-	        },
-	        parseTraceparentHeader: () => {
-	            return undefined;
-	        },
-	        startSpan: (_name, spanOptions) => {
-	            return {
-	                span: createDefaultTracingSpan(),
-	                tracingContext: (0, tracingContext_js_1.createTracingContext)({ parentContext: spanOptions.tracingContext }),
-	            };
-	        },
-	        withContext(_context, callback, ...callbackArgs) {
-	            return callback(...callbackArgs);
-	        },
-	    };
-	}
-	/**
-	 * Extends the Azure SDK with support for a given instrumenter implementation.
-	 *
-	 * @param instrumenter - The instrumenter implementation to use.
-	 */
-	function useInstrumenter(instrumenter) {
-	    state_js_1.state.instrumenterImplementation = instrumenter;
-	}
-	/**
-	 * Gets the currently set instrumenter, a No-Op instrumenter by default.
-	 *
-	 * @returns The currently set instrumenter
-	 */
-	function getInstrumenter() {
-	    if (!state_js_1.state.instrumenterImplementation) {
-	        state_js_1.state.instrumenterImplementation = createDefaultInstrumenter();
-	    }
-	    return state_js_1.state.instrumenterImplementation;
-	}
-	
-	return instrumenter;
-}
-
-var tracingClient = {};
-
-var hasRequiredTracingClient;
-
-function requireTracingClient () {
-	if (hasRequiredTracingClient) return tracingClient;
-	hasRequiredTracingClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(tracingClient, "__esModule", { value: true });
-	tracingClient.createTracingClient = createTracingClient;
-	const instrumenter_js_1 = requireInstrumenter();
-	const tracingContext_js_1 = requireTracingContext();
-	/**
-	 * Creates a new tracing client.
-	 *
-	 * @param options - Options used to configure the tracing client.
-	 * @returns - An instance of {@link TracingClient}.
-	 */
-	function createTracingClient(options) {
-	    const { namespace, packageName, packageVersion } = options;
-	    function startSpan(name, operationOptions, spanOptions) {
-	        const startSpanResult = (0, instrumenter_js_1.getInstrumenter)().startSpan(name, {
-	            ...spanOptions,
-	            packageName: packageName,
-	            packageVersion: packageVersion,
-	            tracingContext: operationOptions?.tracingOptions?.tracingContext,
-	        });
-	        let tracingContext = startSpanResult.tracingContext;
-	        const span = startSpanResult.span;
-	        if (!tracingContext.getValue(tracingContext_js_1.knownContextKeys.namespace)) {
-	            tracingContext = tracingContext.setValue(tracingContext_js_1.knownContextKeys.namespace, namespace);
-	        }
-	        span.setAttribute("az.namespace", tracingContext.getValue(tracingContext_js_1.knownContextKeys.namespace));
-	        const updatedOptions = Object.assign({}, operationOptions, {
-	            tracingOptions: { ...operationOptions?.tracingOptions, tracingContext },
-	        });
-	        return {
-	            span,
-	            updatedOptions,
-	        };
-	    }
-	    async function withSpan(name, operationOptions, callback, spanOptions) {
-	        const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions);
-	        try {
-	            const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => Promise.resolve(callback(updatedOptions, span)));
-	            span.setStatus({ status: "success" });
-	            return result;
-	        }
-	        catch (err) {
-	            span.setStatus({ status: "error", error: err });
-	            throw err;
-	        }
-	        finally {
-	            span.end();
-	        }
-	    }
-	    function withContext(context, callback, ...callbackArgs) {
-	        return (0, instrumenter_js_1.getInstrumenter)().withContext(context, callback, ...callbackArgs);
-	    }
-	    /**
-	     * Parses a traceparent header value into a span identifier.
-	     *
-	     * @param traceparentHeader - The traceparent header to parse.
-	     * @returns An implementation-specific identifier for the span.
-	     */
-	    function parseTraceparentHeader(traceparentHeader) {
-	        return (0, instrumenter_js_1.getInstrumenter)().parseTraceparentHeader(traceparentHeader);
-	    }
-	    /**
-	     * Creates a set of request headers to propagate tracing information to a backend.
-	     *
-	     * @param tracingContext - The context containing the span to serialize.
-	     * @returns The set of headers to add to a request.
-	     */
-	    function createRequestHeaders(tracingContext) {
-	        return (0, instrumenter_js_1.getInstrumenter)().createRequestHeaders(tracingContext);
-	    }
-	    return {
-	        startSpan,
-	        withSpan,
-	        withContext,
-	        parseTraceparentHeader,
-	        createRequestHeaders,
-	    };
-	}
-	
-	return tracingClient;
-}
-
-var hasRequiredCommonjs$a;
-
-function requireCommonjs$a () {
-	if (hasRequiredCommonjs$a) return commonjs$8;
-	hasRequiredCommonjs$a = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.createTracingClient = exports$1.useInstrumenter = void 0;
-		var instrumenter_js_1 = requireInstrumenter();
-		Object.defineProperty(exports$1, "useInstrumenter", { enumerable: true, get: function () { return instrumenter_js_1.useInstrumenter; } });
-		var tracingClient_js_1 = requireTracingClient();
-		Object.defineProperty(exports$1, "createTracingClient", { enumerable: true, get: function () { return tracingClient_js_1.createTracingClient; } });
-		
-	} (commonjs$8));
-	return commonjs$8;
-}
-
-var restError = {};
-
-var hasRequiredRestError;
-
-function requireRestError () {
-	if (hasRequiredRestError) return restError;
-	hasRequiredRestError = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(restError, "__esModule", { value: true });
-	restError.RestError = void 0;
-	restError.isRestError = isRestError;
-	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
-	/**
-	 * A custom error type for failed pipeline requests.
-	 */
-	// eslint-disable-next-line @typescript-eslint/no-redeclare
-	restError.RestError = ts_http_runtime_1.RestError;
-	/**
-	 * Typeguard for RestError
-	 * @param e - Something caught by a catch clause.
-	 */
-	function isRestError(e) {
-	    return (0, ts_http_runtime_1.isRestError)(e);
-	}
-	
-	return restError;
-}
-
-var hasRequiredTracingPolicy;
-
-function requireTracingPolicy () {
-	if (hasRequiredTracingPolicy) return tracingPolicy;
-	hasRequiredTracingPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.tracingPolicyName = void 0;
-		exports$1.tracingPolicy = tracingPolicy;
-		const core_tracing_1 = /*@__PURE__*/ requireCommonjs$a();
-		const constants_js_1 = requireConstants$4();
-		const userAgent_js_1 = requireUserAgent$1();
-		const log_js_1 = requireLog$3();
-		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-		const restError_js_1 = requireRestError();
-		const util_1 = /*@__PURE__*/ requireInternal();
-		/**
-		 * The programmatic identifier of the tracingPolicy.
-		 */
-		exports$1.tracingPolicyName = "tracingPolicy";
-		/**
-		 * A simple policy to create OpenTelemetry Spans for each request made by the pipeline
-		 * that has SpanOptions with a parent.
-		 * Requests made without a parent Span will not be recorded.
-		 * @param options - Options to configure the telemetry logged by the tracing policy.
-		 */
-		function tracingPolicy(options = {}) {
-		    const userAgentPromise = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix);
-		    const sanitizer = new util_1.Sanitizer({
-		        additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
-		    });
-		    const tracingClient = tryCreateTracingClient();
-		    return {
-		        name: exports$1.tracingPolicyName,
-		        async sendRequest(request, next) {
-		            if (!tracingClient) {
-		                return next(request);
-		            }
-		            const userAgent = await userAgentPromise;
-		            const spanAttributes = {
-		                "http.url": sanitizer.sanitizeUrl(request.url),
-		                "http.method": request.method,
-		                "http.user_agent": userAgent,
-		                requestId: request.requestId,
-		            };
-		            if (userAgent) {
-		                spanAttributes["http.user_agent"] = userAgent;
-		            }
-		            const { span, tracingContext } = tryCreateSpan(tracingClient, request, spanAttributes) ?? {};
-		            if (!span || !tracingContext) {
-		                return next(request);
-		            }
-		            try {
-		                const response = await tracingClient.withContext(tracingContext, next, request);
-		                tryProcessResponse(span, response);
-		                return response;
-		            }
-		            catch (err) {
-		                tryProcessError(span, err);
-		                throw err;
-		            }
-		        },
-		    };
-		}
-		function tryCreateTracingClient() {
-		    try {
-		        return (0, core_tracing_1.createTracingClient)({
-		            namespace: "",
-		            packageName: "@azure/core-rest-pipeline",
-		            packageVersion: constants_js_1.SDK_VERSION,
-		        });
-		    }
-		    catch (e) {
-		        log_js_1.logger.warning(`Error when creating the TracingClient: ${(0, core_util_1.getErrorMessage)(e)}`);
-		        return undefined;
-		    }
-		}
-		function tryCreateSpan(tracingClient, request, spanAttributes) {
-		    try {
-		        // As per spec, we do not need to differentiate between HTTP and HTTPS in span name.
-		        const { span, updatedOptions } = tracingClient.startSpan(`HTTP ${request.method}`, { tracingOptions: request.tracingOptions }, {
-		            spanKind: "client",
-		            spanAttributes,
-		        });
-		        // If the span is not recording, don't do any more work.
-		        if (!span.isRecording()) {
-		            span.end();
-		            return undefined;
-		        }
-		        // set headers
-		        const headers = tracingClient.createRequestHeaders(updatedOptions.tracingOptions.tracingContext);
-		        for (const [key, value] of Object.entries(headers)) {
-		            request.headers.set(key, value);
-		        }
-		        return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };
-		    }
-		    catch (e) {
-		        log_js_1.logger.warning(`Skipping creating a tracing span due to an error: ${(0, core_util_1.getErrorMessage)(e)}`);
-		        return undefined;
-		    }
-		}
-		function tryProcessError(span, error) {
-		    try {
-		        span.setStatus({
-		            status: "error",
-		            error: (0, core_util_1.isError)(error) ? error : undefined,
-		        });
-		        if ((0, restError_js_1.isRestError)(error) && error.statusCode) {
-		            span.setAttribute("http.status_code", error.statusCode);
-		        }
-		        span.end();
-		    }
-		    catch (e) {
-		        log_js_1.logger.warning(`Skipping tracing span processing due to an error: ${(0, core_util_1.getErrorMessage)(e)}`);
-		    }
-		}
-		function tryProcessResponse(span, response) {
-		    try {
-		        span.setAttribute("http.status_code", response.status);
-		        const serviceRequestId = response.headers.get("x-ms-request-id");
-		        if (serviceRequestId) {
-		            span.setAttribute("serviceRequestId", serviceRequestId);
-		        }
-		        // Per semantic conventions, only set the status to error if the status code is 4xx or 5xx.
-		        // Otherwise, the status MUST remain unset.
-		        // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
-		        if (response.status >= 400) {
-		            span.setStatus({
-		                status: "error",
-		            });
-		        }
-		        span.end();
-		    }
-		    catch (e) {
-		        log_js_1.logger.warning(`Skipping tracing span processing due to an error: ${(0, core_util_1.getErrorMessage)(e)}`);
-		    }
-		}
-		
-	} (tracingPolicy));
-	return tracingPolicy;
-}
-
-var wrapAbortSignalLikePolicy = {};
-
-var wrapAbortSignal = {};
-
-var hasRequiredWrapAbortSignal;
-
-function requireWrapAbortSignal () {
-	if (hasRequiredWrapAbortSignal) return wrapAbortSignal;
-	hasRequiredWrapAbortSignal = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(wrapAbortSignal, "__esModule", { value: true });
-	wrapAbortSignal.wrapAbortSignalLike = wrapAbortSignalLike;
-	/**
-	 * Creates a native AbortSignal which reflects the state of the provided AbortSignalLike.
-	 * If the AbortSignalLike is already a native AbortSignal, it is returned as is.
-	 * @param abortSignalLike - The AbortSignalLike to wrap.
-	 * @returns - An object containing the native AbortSignal and an optional cleanup function. The cleanup function should be called when the AbortSignal is no longer needed.
-	 */
-	function wrapAbortSignalLike(abortSignalLike) {
-	    if (abortSignalLike instanceof AbortSignal) {
-	        return { abortSignal: abortSignalLike };
-	    }
-	    if (abortSignalLike.aborted) {
-	        return { abortSignal: AbortSignal.abort(abortSignalLike.reason) };
-	    }
-	    const controller = new AbortController();
-	    let needsCleanup = true;
-	    function cleanup() {
-	        if (needsCleanup) {
-	            abortSignalLike.removeEventListener("abort", listener);
-	            needsCleanup = false;
-	        }
-	    }
-	    function listener() {
-	        controller.abort(abortSignalLike.reason);
-	        cleanup();
-	    }
-	    abortSignalLike.addEventListener("abort", listener);
-	    return { abortSignal: controller.signal, cleanup };
-	}
-	
-	return wrapAbortSignal;
-}
-
-var hasRequiredWrapAbortSignalLikePolicy;
-
-function requireWrapAbortSignalLikePolicy () {
-	if (hasRequiredWrapAbortSignalLikePolicy) return wrapAbortSignalLikePolicy;
-	hasRequiredWrapAbortSignalLikePolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.wrapAbortSignalLikePolicyName = void 0;
-		exports$1.wrapAbortSignalLikePolicy = wrapAbortSignalLikePolicy;
-		const wrapAbortSignal_js_1 = requireWrapAbortSignal();
-		exports$1.wrapAbortSignalLikePolicyName = "wrapAbortSignalLikePolicy";
-		/**
-		 * Policy that ensure that any AbortSignalLike is wrapped in a native AbortSignal for processing by the pipeline.
-		 * Since the ts-http-runtime expects a native AbortSignal, this policy is used to ensure that any AbortSignalLike is wrapped in a native AbortSignal.
-		 *
-		 * @returns - created policy
-		 */
-		function wrapAbortSignalLikePolicy() {
-		    return {
-		        name: exports$1.wrapAbortSignalLikePolicyName,
-		        sendRequest: async (request, next) => {
-		            if (!request.abortSignal) {
-		                return next(request);
-		            }
-		            const { abortSignal, cleanup } = (0, wrapAbortSignal_js_1.wrapAbortSignalLike)(request.abortSignal);
-		            request.abortSignal = abortSignal;
-		            try {
-		                return await next(request);
-		            }
-		            finally {
-		                cleanup?.();
-		            }
-		        },
-		    };
-		}
-		
-	} (wrapAbortSignalLikePolicy));
-	return wrapAbortSignalLikePolicy;
-}
-
-var hasRequiredCreatePipelineFromOptions;
-
-function requireCreatePipelineFromOptions () {
-	if (hasRequiredCreatePipelineFromOptions) return createPipelineFromOptions;
-	hasRequiredCreatePipelineFromOptions = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(createPipelineFromOptions, "__esModule", { value: true });
-	createPipelineFromOptions.createPipelineFromOptions = createPipelineFromOptions$1;
-	const logPolicy_js_1 = requireLogPolicy();
-	const pipeline_js_1 = requirePipeline$2();
-	const redirectPolicy_js_1 = requireRedirectPolicy();
-	const userAgentPolicy_js_1 = requireUserAgentPolicy();
-	const multipartPolicy_js_1 = requireMultipartPolicy();
-	const decompressResponsePolicy_js_1 = requireDecompressResponsePolicy();
-	const defaultRetryPolicy_js_1 = requireDefaultRetryPolicy();
-	const formDataPolicy_js_1 = requireFormDataPolicy();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const proxyPolicy_js_1 = requireProxyPolicy();
-	const setClientRequestIdPolicy_js_1 = requireSetClientRequestIdPolicy();
-	const agentPolicy_js_1 = requireAgentPolicy();
-	const tlsPolicy_js_1 = requireTlsPolicy();
-	const tracingPolicy_js_1 = requireTracingPolicy();
-	const wrapAbortSignalLikePolicy_js_1 = requireWrapAbortSignalLikePolicy();
-	/**
-	 * Create a new pipeline with a default set of customizable policies.
-	 * @param options - Options to configure a custom pipeline.
-	 */
-	function createPipelineFromOptions$1(options) {
-	    const pipeline = (0, pipeline_js_1.createEmptyPipeline)();
-	    if (core_util_1.isNodeLike) {
-	        if (options.agent) {
-	            pipeline.addPolicy((0, agentPolicy_js_1.agentPolicy)(options.agent));
-	        }
-	        if (options.tlsOptions) {
-	            pipeline.addPolicy((0, tlsPolicy_js_1.tlsPolicy)(options.tlsOptions));
-	        }
-	        pipeline.addPolicy((0, proxyPolicy_js_1.proxyPolicy)(options.proxyOptions));
-	        pipeline.addPolicy((0, decompressResponsePolicy_js_1.decompressResponsePolicy)());
-	    }
-	    pipeline.addPolicy((0, wrapAbortSignalLikePolicy_js_1.wrapAbortSignalLikePolicy)());
-	    pipeline.addPolicy((0, formDataPolicy_js_1.formDataPolicy)(), { beforePolicies: [multipartPolicy_js_1.multipartPolicyName] });
-	    pipeline.addPolicy((0, userAgentPolicy_js_1.userAgentPolicy)(options.userAgentOptions));
-	    pipeline.addPolicy((0, setClientRequestIdPolicy_js_1.setClientRequestIdPolicy)(options.telemetryOptions?.clientRequestIdHeaderName));
-	    // The multipart policy is added after policies with no phase, so that
-	    // policies can be added between it and formDataPolicy to modify
-	    // properties (e.g., making the boundary constant in recorded tests).
-	    pipeline.addPolicy((0, multipartPolicy_js_1.multipartPolicy)(), { afterPhase: "Deserialize" });
-	    pipeline.addPolicy((0, defaultRetryPolicy_js_1.defaultRetryPolicy)(options.retryOptions), { phase: "Retry" });
-	    pipeline.addPolicy((0, tracingPolicy_js_1.tracingPolicy)({ ...options.userAgentOptions, ...options.loggingOptions }), {
-	        afterPhase: "Retry",
-	    });
-	    if (core_util_1.isNodeLike) {
-	        // Both XHR and Fetch expect to handle redirects automatically,
-	        // so only include this policy when we're in Node.
-	        pipeline.addPolicy((0, redirectPolicy_js_1.redirectPolicy)(options.redirectOptions), { afterPhase: "Retry" });
-	    }
-	    pipeline.addPolicy((0, logPolicy_js_1.logPolicy)(options.loggingOptions), { afterPhase: "Sign" });
-	    return pipeline;
-	}
-	
-	return createPipelineFromOptions;
-}
-
-var defaultHttpClient = {};
-
-var hasRequiredDefaultHttpClient;
-
-function requireDefaultHttpClient () {
-	if (hasRequiredDefaultHttpClient) return defaultHttpClient;
-	hasRequiredDefaultHttpClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(defaultHttpClient, "__esModule", { value: true });
-	defaultHttpClient.createDefaultHttpClient = createDefaultHttpClient;
-	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
-	const wrapAbortSignal_js_1 = requireWrapAbortSignal();
-	/**
-	 * Create the correct HttpClient for the current environment.
-	 */
-	function createDefaultHttpClient() {
-	    const client = (0, ts_http_runtime_1.createDefaultHttpClient)();
-	    return {
-	        async sendRequest(request) {
-	            // we wrap any AbortSignalLike here since the TypeSpec runtime expects a native AbortSignal.
-	            // 99% of the time, this should be a no-op since a native AbortSignal is passed in.
-	            const { abortSignal, cleanup } = request.abortSignal
-	                ? (0, wrapAbortSignal_js_1.wrapAbortSignalLike)(request.abortSignal)
-	                : {};
-	            try {
-	                request.abortSignal = abortSignal;
-	                return await client.sendRequest(request);
-	            }
-	            finally {
-	                cleanup?.();
-	            }
-	        },
-	    };
-	}
-	
-	return defaultHttpClient;
-}
-
-var httpHeaders = {};
-
-var hasRequiredHttpHeaders;
-
-function requireHttpHeaders () {
-	if (hasRequiredHttpHeaders) return httpHeaders;
-	hasRequiredHttpHeaders = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(httpHeaders, "__esModule", { value: true });
-	httpHeaders.createHttpHeaders = createHttpHeaders;
-	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
-	/**
-	 * Creates an object that satisfies the `HttpHeaders` interface.
-	 * @param rawHeaders - A simple object representing initial headers
-	 */
-	function createHttpHeaders(rawHeaders) {
-	    return (0, ts_http_runtime_1.createHttpHeaders)(rawHeaders);
-	}
-	
-	return httpHeaders;
-}
-
-var pipelineRequest = {};
-
-var hasRequiredPipelineRequest;
-
-function requirePipelineRequest () {
-	if (hasRequiredPipelineRequest) return pipelineRequest;
-	hasRequiredPipelineRequest = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(pipelineRequest, "__esModule", { value: true });
-	pipelineRequest.createPipelineRequest = createPipelineRequest;
-	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
-	/**
-	 * Creates a new pipeline request with the given options.
-	 * This method is to allow for the easy setting of default values and not required.
-	 * @param options - The options to create the request with.
-	 */
-	function createPipelineRequest(options) {
-	    // Cast required due to difference between ts-http-runtime requiring AbortSignal while core-rest-pipeline allows
-	    // the more generic AbortSignalLike. The wrapAbortSignalLike pipeline policy will take care of ensuring that any AbortSignalLike in the request
-	    // is converted into a true AbortSignal.
-	    return (0, ts_http_runtime_1.createPipelineRequest)(options);
-	}
-	
-	return pipelineRequest;
-}
-
-var exponentialRetryPolicy = {};
-
-var hasRequiredExponentialRetryPolicy;
-
-function requireExponentialRetryPolicy () {
-	if (hasRequiredExponentialRetryPolicy) return exponentialRetryPolicy;
-	hasRequiredExponentialRetryPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(exponentialRetryPolicy, "__esModule", { value: true });
-	exponentialRetryPolicy.exponentialRetryPolicyName = void 0;
-	exponentialRetryPolicy.exponentialRetryPolicy = exponentialRetryPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * The programmatic identifier of the exponentialRetryPolicy.
-	 */
-	exponentialRetryPolicy.exponentialRetryPolicyName = policies_1.exponentialRetryPolicyName;
-	/**
-	 * A policy that attempts to retry requests while introducing an exponentially increasing delay.
-	 * @param options - Options that configure retry logic.
-	 */
-	function exponentialRetryPolicy$1(options = {}) {
-	    return (0, policies_1.exponentialRetryPolicy)(options);
-	}
-	
-	return exponentialRetryPolicy;
-}
-
-var systemErrorRetryPolicy = {};
-
-var hasRequiredSystemErrorRetryPolicy;
-
-function requireSystemErrorRetryPolicy () {
-	if (hasRequiredSystemErrorRetryPolicy) return systemErrorRetryPolicy;
-	hasRequiredSystemErrorRetryPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(systemErrorRetryPolicy, "__esModule", { value: true });
-	systemErrorRetryPolicy.systemErrorRetryPolicyName = void 0;
-	systemErrorRetryPolicy.systemErrorRetryPolicy = systemErrorRetryPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * Name of the {@link systemErrorRetryPolicy}
-	 */
-	systemErrorRetryPolicy.systemErrorRetryPolicyName = policies_1.systemErrorRetryPolicyName;
-	/**
-	 * A retry policy that specifically seeks to handle errors in the
-	 * underlying transport layer (e.g. DNS lookup failures) rather than
-	 * retryable error codes from the server itself.
-	 * @param options - Options that customize the policy.
-	 */
-	function systemErrorRetryPolicy$1(options = {}) {
-	    return (0, policies_1.systemErrorRetryPolicy)(options);
-	}
-	
-	return systemErrorRetryPolicy;
-}
-
-var throttlingRetryPolicy = {};
-
-var hasRequiredThrottlingRetryPolicy;
-
-function requireThrottlingRetryPolicy () {
-	if (hasRequiredThrottlingRetryPolicy) return throttlingRetryPolicy;
-	hasRequiredThrottlingRetryPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(throttlingRetryPolicy, "__esModule", { value: true });
-	throttlingRetryPolicy.throttlingRetryPolicyName = void 0;
-	throttlingRetryPolicy.throttlingRetryPolicy = throttlingRetryPolicy$1;
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	/**
-	 * Name of the {@link throttlingRetryPolicy}
-	 */
-	throttlingRetryPolicy.throttlingRetryPolicyName = policies_1.throttlingRetryPolicyName;
-	/**
-	 * A policy that retries when the server sends a 429 response with a Retry-After header.
-	 *
-	 * To learn more, please refer to
-	 * https://learn.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits,
-	 * https://learn.microsoft.com/azure/azure-subscription-service-limits and
-	 * https://learn.microsoft.com/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
-	 *
-	 * @param options - Options that configure retry logic.
-	 */
-	function throttlingRetryPolicy$1(options = {}) {
-	    return (0, policies_1.throttlingRetryPolicy)(options);
-	}
-	
-	return throttlingRetryPolicy;
-}
-
-var retryPolicy = {};
-
-var hasRequiredRetryPolicy;
-
-function requireRetryPolicy () {
-	if (hasRequiredRetryPolicy) return retryPolicy;
-	hasRequiredRetryPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(retryPolicy, "__esModule", { value: true });
-	retryPolicy.retryPolicy = retryPolicy$1;
-	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
-	const constants_js_1 = requireConstants$4();
-	const policies_1 = /*@__PURE__*/ requireInternal$1();
-	const retryPolicyLogger = (0, logger_1.createClientLogger)("core-rest-pipeline retryPolicy");
-	/**
-	 * retryPolicy is a generic policy to enable retrying requests when certain conditions are met
-	 */
-	function retryPolicy$1(strategies, options = { maxRetries: constants_js_1.DEFAULT_RETRY_POLICY_COUNT }) {
-	    // Cast is required since the TSP runtime retry strategy type is slightly different
-	    // very deep down (using real AbortSignal vs. AbortSignalLike in RestError).
-	    // In practice the difference doesn't actually matter.
-	    return (0, policies_1.retryPolicy)(strategies, {
-	        logger: retryPolicyLogger,
-	        ...options,
-	    });
-	}
-	
-	return retryPolicy;
-}
-
-var bearerTokenAuthenticationPolicy = {};
-
-var tokenCycler = {};
-
-var hasRequiredTokenCycler;
-
-function requireTokenCycler () {
-	if (hasRequiredTokenCycler) return tokenCycler;
-	hasRequiredTokenCycler = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.DEFAULT_CYCLER_OPTIONS = void 0;
-		exports$1.createTokenCycler = createTokenCycler;
-		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-		// Default options for the cycler if none are provided
-		exports$1.DEFAULT_CYCLER_OPTIONS = {
-		    forcedRefreshWindowInMs: 1000, // Force waiting for a refresh 1s before the token expires
-		    retryIntervalInMs: 3000, // Allow refresh attempts every 3s
-		    refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
-		};
-		/**
-		 * Converts an an unreliable access token getter (which may resolve with null)
-		 * into an AccessTokenGetter by retrying the unreliable getter in a regular
-		 * interval.
-		 *
-		 * @param getAccessToken - A function that produces a promise of an access token that may fail by returning null.
-		 * @param retryIntervalInMs - The time (in milliseconds) to wait between retry attempts.
-		 * @param refreshTimeout - The timestamp after which the refresh attempt will fail, throwing an exception.
-		 * @returns - A promise that, if it resolves, will resolve with an access token.
-		 */
-		async function beginRefresh(getAccessToken, retryIntervalInMs, refreshTimeout) {
-		    // This wrapper handles exceptions gracefully as long as we haven't exceeded
-		    // the timeout.
-		    async function tryGetAccessToken() {
-		        if (Date.now() < refreshTimeout) {
-		            try {
-		                return await getAccessToken();
-		            }
-		            catch {
-		                return null;
-		            }
-		        }
-		        else {
-		            const finalToken = await getAccessToken();
-		            // Timeout is up, so throw if it's still null
-		            if (finalToken === null) {
-		                throw new Error("Failed to refresh access token.");
-		            }
-		            return finalToken;
-		        }
-		    }
-		    let token = await tryGetAccessToken();
-		    while (token === null) {
-		        await (0, core_util_1.delay)(retryIntervalInMs);
-		        token = await tryGetAccessToken();
-		    }
-		    return token;
-		}
-		/**
-		 * Creates a token cycler from a credential, scopes, and optional settings.
-		 *
-		 * A token cycler represents a way to reliably retrieve a valid access token
-		 * from a TokenCredential. It will handle initializing the token, refreshing it
-		 * when it nears expiration, and synchronizes refresh attempts to avoid
-		 * concurrency hazards.
-		 *
-		 * @param credential - the underlying TokenCredential that provides the access
-		 * token
-		 * @param tokenCyclerOptions - optionally override default settings for the cycler
-		 *
-		 * @returns - a function that reliably produces a valid access token
-		 */
-		function createTokenCycler(credential, tokenCyclerOptions) {
-		    let refreshWorker = null;
-		    let token = null;
-		    let tenantId;
-		    const options = {
-		        ...exports$1.DEFAULT_CYCLER_OPTIONS,
-		        ...tokenCyclerOptions,
-		    };
-		    /**
-		     * This little holder defines several predicates that we use to construct
-		     * the rules of refreshing the token.
-		     */
-		    const cycler = {
-		        /**
-		         * Produces true if a refresh job is currently in progress.
-		         */
-		        get isRefreshing() {
-		            return refreshWorker !== null;
-		        },
-		        /**
-		         * Produces true if the cycler SHOULD refresh (we are within the refresh
-		         * window and not already refreshing)
-		         */
-		        get shouldRefresh() {
-		            if (cycler.isRefreshing) {
-		                return false;
-		            }
-		            if (token?.refreshAfterTimestamp && token.refreshAfterTimestamp < Date.now()) {
-		                return true;
-		            }
-		            return (token?.expiresOnTimestamp ?? 0) - options.refreshWindowInMs < Date.now();
-		        },
-		        /**
-		         * Produces true if the cycler MUST refresh (null or nearly-expired
-		         * token).
-		         */
-		        get mustRefresh() {
-		            return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
-		        },
-		    };
-		    /**
-		     * Starts a refresh job or returns the existing job if one is already
-		     * running.
-		     */
-		    function refresh(scopes, getTokenOptions) {
-		        if (!cycler.isRefreshing) {
-		            // We bind `scopes` here to avoid passing it around a lot
-		            const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
-		            // Take advantage of promise chaining to insert an assignment to `token`
-		            // before the refresh can be considered done.
-		            refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, 
-		            // If we don't have a token, then we should timeout immediately
-		            token?.expiresOnTimestamp ?? Date.now())
-		                .then((_token) => {
-		                refreshWorker = null;
-		                token = _token;
-		                tenantId = getTokenOptions.tenantId;
-		                return token;
-		            })
-		                .catch((reason) => {
-		                // We also should reset the refresher if we enter a failed state.  All
-		                // existing awaiters will throw, but subsequent requests will start a
-		                // new retry chain.
-		                refreshWorker = null;
-		                token = null;
-		                tenantId = undefined;
-		                throw reason;
-		            });
-		        }
-		        return refreshWorker;
-		    }
-		    return async (scopes, tokenOptions) => {
-		        //
-		        // Simple rules:
-		        // - If we MUST refresh, then return the refresh task, blocking
-		        //   the pipeline until a token is available.
-		        // - If we SHOULD refresh, then run refresh but don't return it
-		        //   (we can still use the cached token).
-		        // - Return the token, since it's fine if we didn't return in
-		        //   step 1.
-		        //
-		        const hasClaimChallenge = Boolean(tokenOptions.claims);
-		        const tenantIdChanged = tenantId !== tokenOptions.tenantId;
-		        if (hasClaimChallenge) {
-		            // If we've received a claim, we know the existing token isn't valid
-		            // We want to clear it so that that refresh worker won't use the old expiration time as a timeout
-		            token = null;
-		        }
-		        // If the tenantId passed in token options is different to the one we have
-		        // Or if we are in claim challenge and the token was rejected and a new access token need to be issued, we need to
-		        // refresh the token with the new tenantId or token.
-		        const mustRefresh = tenantIdChanged || hasClaimChallenge || cycler.mustRefresh;
-		        if (mustRefresh) {
-		            return refresh(scopes, tokenOptions);
-		        }
-		        if (cycler.shouldRefresh) {
-		            refresh(scopes, tokenOptions);
-		        }
-		        return token;
-		    };
-		}
-		
-	} (tokenCycler));
-	return tokenCycler;
-}
-
-var hasRequiredBearerTokenAuthenticationPolicy;
-
-function requireBearerTokenAuthenticationPolicy () {
-	if (hasRequiredBearerTokenAuthenticationPolicy) return bearerTokenAuthenticationPolicy;
-	hasRequiredBearerTokenAuthenticationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.bearerTokenAuthenticationPolicyName = void 0;
-		exports$1.bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy;
-		exports$1.parseChallenges = parseChallenges;
-		const tokenCycler_js_1 = requireTokenCycler();
-		const log_js_1 = requireLog$3();
-		const restError_js_1 = requireRestError();
-		/**
-		 * The programmatic identifier of the bearerTokenAuthenticationPolicy.
-		 */
-		exports$1.bearerTokenAuthenticationPolicyName = "bearerTokenAuthenticationPolicy";
-		/**
-		 * Try to send the given request.
-		 *
-		 * When a response is received, returns a tuple of the response received and, if the response was received
-		 * inside a thrown RestError, the RestError that was thrown.
-		 *
-		 * Otherwise, if an error was thrown while sending the request that did not provide an underlying response, it
-		 * will be rethrown.
-		 */
-		async function trySendRequest(request, next) {
-		    try {
-		        return [await next(request), undefined];
-		    }
-		    catch (e) {
-		        if ((0, restError_js_1.isRestError)(e) && e.response) {
-		            return [e.response, e];
-		        }
-		        else {
-		            throw e;
-		        }
-		    }
-		}
-		/**
-		 * Default authorize request handler
-		 */
-		async function defaultAuthorizeRequest(options) {
-		    const { scopes, getAccessToken, request } = options;
-		    // Enable CAE true by default
-		    const getTokenOptions = {
-		        abortSignal: request.abortSignal,
-		        tracingOptions: request.tracingOptions,
-		        enableCae: true,
-		    };
-		    const accessToken = await getAccessToken(scopes, getTokenOptions);
-		    if (accessToken) {
-		        options.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
-		    }
-		}
-		/**
-		 * We will retrieve the challenge only if the response status code was 401,
-		 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
-		 */
-		function isChallengeResponse(response) {
-		    return response.status === 401 && response.headers.has("WWW-Authenticate");
-		}
-		/**
-		 * Re-authorize the request for CAE challenge.
-		 * The response containing the challenge is `options.response`.
-		 * If this method returns true, the underlying request will be sent once again.
-		 */
-		async function authorizeRequestOnCaeChallenge(onChallengeOptions, caeClaims) {
-		    const { scopes } = onChallengeOptions;
-		    const accessToken = await onChallengeOptions.getAccessToken(scopes, {
-		        enableCae: true,
-		        claims: caeClaims,
-		    });
-		    if (!accessToken) {
-		        return false;
-		    }
-		    onChallengeOptions.request.headers.set("Authorization", `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
-		    return true;
-		}
-		/**
-		 * A policy that can request a token from a TokenCredential implementation and
-		 * then apply it to the Authorization header of a request as a Bearer token.
-		 */
-		function bearerTokenAuthenticationPolicy(options) {
-		    const { credential, scopes, challengeCallbacks } = options;
-		    const logger = options.logger || log_js_1.logger;
-		    const callbacks = {
-		        authorizeRequest: challengeCallbacks?.authorizeRequest?.bind(challengeCallbacks) ?? defaultAuthorizeRequest,
-		        authorizeRequestOnChallenge: challengeCallbacks?.authorizeRequestOnChallenge?.bind(challengeCallbacks),
-		    };
-		    // This function encapsulates the entire process of reliably retrieving the token
-		    // The options are left out of the public API until there's demand to configure this.
-		    // Remember to extend `BearerTokenAuthenticationPolicyOptions` with `TokenCyclerOptions`
-		    // in order to pass through the `options` object.
-		    const getAccessToken = credential
-		        ? (0, tokenCycler_js_1.createTokenCycler)(credential /* , options */)
-		        : () => Promise.resolve(null);
-		    return {
-		        name: exports$1.bearerTokenAuthenticationPolicyName,
-		        /**
-		         * If there's no challenge parameter:
-		         * - It will try to retrieve the token using the cache, or the credential's getToken.
-		         * - Then it will try the next policy with or without the retrieved token.
-		         *
-		         * It uses the challenge parameters to:
-		         * - Skip a first attempt to get the token from the credential if there's no cached token,
-		         *   since it expects the token to be retrievable only after the challenge.
-		         * - Prepare the outgoing request if the `prepareRequest` method has been provided.
-		         * - Send an initial request to receive the challenge if it fails.
-		         * - Process a challenge if the response contains it.
-		         * - Retrieve a token with the challenge information, then re-send the request.
-		         */
-		        async sendRequest(request, next) {
-		            if (!request.url.toLowerCase().startsWith("https://")) {
-		                throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
-		            }
-		            await callbacks.authorizeRequest({
-		                scopes: Array.isArray(scopes) ? scopes : [scopes],
-		                request,
-		                getAccessToken,
-		                logger,
-		            });
-		            let response;
-		            let error;
-		            let shouldSendRequest;
-		            [response, error] = await trySendRequest(request, next);
-		            if (isChallengeResponse(response)) {
-		                let claims = getCaeChallengeClaims(response.headers.get("WWW-Authenticate"));
-		                // Handle CAE by default when receive CAE claim
-		                if (claims) {
-		                    let parsedClaim;
-		                    // Return the response immediately if claims is not a valid base64 encoded string
-		                    try {
-		                        parsedClaim = atob(claims);
-		                    }
-		                    catch (e) {
-		                        logger.warning(`The WWW-Authenticate header contains "claims" that cannot be parsed. Unable to perform the Continuous Access Evaluation authentication flow. Unparsable claims: ${claims}`);
-		                        return response;
-		                    }
-		                    shouldSendRequest = await authorizeRequestOnCaeChallenge({
-		                        scopes: Array.isArray(scopes) ? scopes : [scopes],
-		                        response,
-		                        request,
-		                        getAccessToken,
-		                        logger,
-		                    }, parsedClaim);
-		                    // Send updated request and handle response for RestError
-		                    if (shouldSendRequest) {
-		                        [response, error] = await trySendRequest(request, next);
-		                    }
-		                }
-		                else if (callbacks.authorizeRequestOnChallenge) {
-		                    // Handle custom challenges when client provides custom callback
-		                    shouldSendRequest = await callbacks.authorizeRequestOnChallenge({
-		                        scopes: Array.isArray(scopes) ? scopes : [scopes],
-		                        request,
-		                        response,
-		                        getAccessToken,
-		                        logger,
-		                    });
-		                    // Send updated request and handle response for RestError
-		                    if (shouldSendRequest) {
-		                        [response, error] = await trySendRequest(request, next);
-		                    }
-		                    // If we get another CAE Claim, we will handle it by default and return whatever value we receive for this
-		                    if (isChallengeResponse(response)) {
-		                        claims = getCaeChallengeClaims(response.headers.get("WWW-Authenticate"));
-		                        if (claims) {
-		                            let parsedClaim;
-		                            try {
-		                                parsedClaim = atob(claims);
-		                            }
-		                            catch (e) {
-		                                logger.warning(`The WWW-Authenticate header contains "claims" that cannot be parsed. Unable to perform the Continuous Access Evaluation authentication flow. Unparsable claims: ${claims}`);
-		                                return response;
-		                            }
-		                            shouldSendRequest = await authorizeRequestOnCaeChallenge({
-		                                scopes: Array.isArray(scopes) ? scopes : [scopes],
-		                                response,
-		                                request,
-		                                getAccessToken,
-		                                logger,
-		                            }, parsedClaim);
-		                            // Send updated request and handle response for RestError
-		                            if (shouldSendRequest) {
-		                                [response, error] = await trySendRequest(request, next);
-		                            }
-		                        }
-		                    }
-		                }
-		            }
-		            if (error) {
-		                throw error;
-		            }
-		            else {
-		                return response;
-		            }
-		        },
-		    };
-		}
-		/**
-		 * Converts: `Bearer a="b", c="d", Pop e="f", g="h"`.
-		 * Into: `[ { scheme: 'Bearer', params: { a: 'b', c: 'd' } }, { scheme: 'Pop', params: { e: 'f', g: 'h' } } ]`.
-		 *
-		 * @internal
-		 */
-		function parseChallenges(challenges) {
-		    // Challenge regex seperates the string to individual challenges with different schemes in the format `Scheme a="b", c=d`
-		    // The challenge regex captures parameteres with either quotes values or unquoted values
-		    const challengeRegex = /(\w+)\s+((?:\w+=(?:"[^"]*"|[^,]*),?\s*)+)/g;
-		    // Parameter regex captures the claims group removed from the scheme in the format `a="b"` and `c="d"`
-		    // CAE challenge always have quoted parameters. For more reference, https://learn.microsoft.com/entra/identity-platform/claims-challenge
-		    const paramRegex = /(\w+)="([^"]*)"/g;
-		    const parsedChallenges = [];
-		    let match;
-		    // Iterate over each challenge match
-		    while ((match = challengeRegex.exec(challenges)) !== null) {
-		        const scheme = match[1];
-		        const paramsString = match[2];
-		        const params = {};
-		        let paramMatch;
-		        // Iterate over each parameter match
-		        while ((paramMatch = paramRegex.exec(paramsString)) !== null) {
-		            params[paramMatch[1]] = paramMatch[2];
-		        }
-		        parsedChallenges.push({ scheme, params });
-		    }
-		    return parsedChallenges;
-		}
-		/**
-		 * Parse a pipeline response and look for a CAE challenge with "Bearer" scheme
-		 * Return the value in the header without parsing the challenge
-		 * @internal
-		 */
-		function getCaeChallengeClaims(challenges) {
-		    if (!challenges) {
-		        return;
-		    }
-		    // Find all challenges present in the header
-		    const parsedChallenges = parseChallenges(challenges);
-		    return parsedChallenges.find((x) => x.scheme === "Bearer" && x.params.claims && x.params.error === "insufficient_claims")?.params.claims;
-		}
-		
-	} (bearerTokenAuthenticationPolicy));
-	return bearerTokenAuthenticationPolicy;
-}
-
-var ndJsonPolicy = {};
-
-var hasRequiredNdJsonPolicy;
-
-function requireNdJsonPolicy () {
-	if (hasRequiredNdJsonPolicy) return ndJsonPolicy;
-	hasRequiredNdJsonPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.ndJsonPolicyName = void 0;
-		exports$1.ndJsonPolicy = ndJsonPolicy;
-		/**
-		 * The programmatic identifier of the ndJsonPolicy.
-		 */
-		exports$1.ndJsonPolicyName = "ndJsonPolicy";
-		/**
-		 * ndJsonPolicy is a policy used to control keep alive settings for every request.
-		 */
-		function ndJsonPolicy() {
-		    return {
-		        name: exports$1.ndJsonPolicyName,
-		        async sendRequest(request, next) {
-		            // There currently isn't a good way to bypass the serializer
-		            if (typeof request.body === "string" && request.body.startsWith("[")) {
-		                const body = JSON.parse(request.body);
-		                if (Array.isArray(body)) {
-		                    request.body = body.map((item) => JSON.stringify(item) + "\n").join("");
-		                }
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (ndJsonPolicy));
-	return ndJsonPolicy;
-}
-
-var auxiliaryAuthenticationHeaderPolicy = {};
-
-var hasRequiredAuxiliaryAuthenticationHeaderPolicy;
-
-function requireAuxiliaryAuthenticationHeaderPolicy () {
-	if (hasRequiredAuxiliaryAuthenticationHeaderPolicy) return auxiliaryAuthenticationHeaderPolicy;
-	hasRequiredAuxiliaryAuthenticationHeaderPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.auxiliaryAuthenticationHeaderPolicyName = void 0;
-		exports$1.auxiliaryAuthenticationHeaderPolicy = auxiliaryAuthenticationHeaderPolicy;
-		const tokenCycler_js_1 = requireTokenCycler();
-		const log_js_1 = requireLog$3();
-		/**
-		 * The programmatic identifier of the auxiliaryAuthenticationHeaderPolicy.
-		 */
-		exports$1.auxiliaryAuthenticationHeaderPolicyName = "auxiliaryAuthenticationHeaderPolicy";
-		const AUTHORIZATION_AUXILIARY_HEADER = "x-ms-authorization-auxiliary";
-		async function sendAuthorizeRequest(options) {
-		    const { scopes, getAccessToken, request } = options;
-		    const getTokenOptions = {
-		        abortSignal: request.abortSignal,
-		        tracingOptions: request.tracingOptions,
-		    };
-		    return (await getAccessToken(scopes, getTokenOptions))?.token ?? "";
-		}
-		/**
-		 * A policy for external tokens to `x-ms-authorization-auxiliary` header.
-		 * This header will be used when creating a cross-tenant application we may need to handle authentication requests
-		 * for resources that are in different tenants.
-		 * You could see [ARM docs](https://learn.microsoft.com/azure/azure-resource-manager/management/authenticate-multi-tenant) for a rundown of how this feature works
-		 */
-		function auxiliaryAuthenticationHeaderPolicy(options) {
-		    const { credentials, scopes } = options;
-		    const logger = options.logger || log_js_1.logger;
-		    const tokenCyclerMap = new WeakMap();
-		    return {
-		        name: exports$1.auxiliaryAuthenticationHeaderPolicyName,
-		        async sendRequest(request, next) {
-		            if (!request.url.toLowerCase().startsWith("https://")) {
-		                throw new Error("Bearer token authentication for auxiliary header is not permitted for non-TLS protected (non-https) URLs.");
-		            }
-		            if (!credentials || credentials.length === 0) {
-		                logger.info(`${exports$1.auxiliaryAuthenticationHeaderPolicyName} header will not be set due to empty credentials.`);
-		                return next(request);
-		            }
-		            const tokenPromises = [];
-		            for (const credential of credentials) {
-		                let getAccessToken = tokenCyclerMap.get(credential);
-		                if (!getAccessToken) {
-		                    getAccessToken = (0, tokenCycler_js_1.createTokenCycler)(credential);
-		                    tokenCyclerMap.set(credential, getAccessToken);
-		                }
-		                tokenPromises.push(sendAuthorizeRequest({
-		                    scopes: Array.isArray(scopes) ? scopes : [scopes],
-		                    request,
-		                    getAccessToken}));
-		            }
-		            const auxiliaryTokens = (await Promise.all(tokenPromises)).filter((token) => Boolean(token));
-		            if (auxiliaryTokens.length === 0) {
-		                logger.warning(`None of the auxiliary tokens are valid. ${AUTHORIZATION_AUXILIARY_HEADER} header will not be set.`);
-		                return next(request);
-		            }
-		            request.headers.set(AUTHORIZATION_AUXILIARY_HEADER, auxiliaryTokens.map((token) => `Bearer ${token}`).join(", "));
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (auxiliaryAuthenticationHeaderPolicy));
-	return auxiliaryAuthenticationHeaderPolicy;
-}
-
-var hasRequiredCommonjs$9;
-
-function requireCommonjs$9 () {
-	if (hasRequiredCommonjs$9) return commonjs$d;
-	hasRequiredCommonjs$9 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.createFileFromStream = exports$1.createFile = exports$1.agentPolicyName = exports$1.agentPolicy = exports$1.auxiliaryAuthenticationHeaderPolicyName = exports$1.auxiliaryAuthenticationHeaderPolicy = exports$1.ndJsonPolicyName = exports$1.ndJsonPolicy = exports$1.bearerTokenAuthenticationPolicyName = exports$1.bearerTokenAuthenticationPolicy = exports$1.formDataPolicyName = exports$1.formDataPolicy = exports$1.tlsPolicyName = exports$1.tlsPolicy = exports$1.userAgentPolicyName = exports$1.userAgentPolicy = exports$1.defaultRetryPolicy = exports$1.tracingPolicyName = exports$1.tracingPolicy = exports$1.retryPolicy = exports$1.throttlingRetryPolicyName = exports$1.throttlingRetryPolicy = exports$1.systemErrorRetryPolicyName = exports$1.systemErrorRetryPolicy = exports$1.redirectPolicyName = exports$1.redirectPolicy = exports$1.getDefaultProxySettings = exports$1.proxyPolicyName = exports$1.proxyPolicy = exports$1.multipartPolicyName = exports$1.multipartPolicy = exports$1.logPolicyName = exports$1.logPolicy = exports$1.setClientRequestIdPolicyName = exports$1.setClientRequestIdPolicy = exports$1.exponentialRetryPolicyName = exports$1.exponentialRetryPolicy = exports$1.decompressResponsePolicyName = exports$1.decompressResponsePolicy = exports$1.isRestError = exports$1.RestError = exports$1.createPipelineRequest = exports$1.createHttpHeaders = exports$1.createDefaultHttpClient = exports$1.createPipelineFromOptions = exports$1.createEmptyPipeline = void 0;
-		var pipeline_js_1 = requirePipeline$2();
-		Object.defineProperty(exports$1, "createEmptyPipeline", { enumerable: true, get: function () { return pipeline_js_1.createEmptyPipeline; } });
-		var createPipelineFromOptions_js_1 = requireCreatePipelineFromOptions();
-		Object.defineProperty(exports$1, "createPipelineFromOptions", { enumerable: true, get: function () { return createPipelineFromOptions_js_1.createPipelineFromOptions; } });
-		var defaultHttpClient_js_1 = requireDefaultHttpClient();
-		Object.defineProperty(exports$1, "createDefaultHttpClient", { enumerable: true, get: function () { return defaultHttpClient_js_1.createDefaultHttpClient; } });
-		var httpHeaders_js_1 = requireHttpHeaders();
-		Object.defineProperty(exports$1, "createHttpHeaders", { enumerable: true, get: function () { return httpHeaders_js_1.createHttpHeaders; } });
-		var pipelineRequest_js_1 = requirePipelineRequest();
-		Object.defineProperty(exports$1, "createPipelineRequest", { enumerable: true, get: function () { return pipelineRequest_js_1.createPipelineRequest; } });
-		var restError_js_1 = requireRestError();
-		Object.defineProperty(exports$1, "RestError", { enumerable: true, get: function () { return restError_js_1.RestError; } });
-		Object.defineProperty(exports$1, "isRestError", { enumerable: true, get: function () { return restError_js_1.isRestError; } });
-		var decompressResponsePolicy_js_1 = requireDecompressResponsePolicy();
-		Object.defineProperty(exports$1, "decompressResponsePolicy", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicy; } });
-		Object.defineProperty(exports$1, "decompressResponsePolicyName", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicyName; } });
-		var exponentialRetryPolicy_js_1 = requireExponentialRetryPolicy();
-		Object.defineProperty(exports$1, "exponentialRetryPolicy", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicy; } });
-		Object.defineProperty(exports$1, "exponentialRetryPolicyName", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicyName; } });
-		var setClientRequestIdPolicy_js_1 = requireSetClientRequestIdPolicy();
-		Object.defineProperty(exports$1, "setClientRequestIdPolicy", { enumerable: true, get: function () { return setClientRequestIdPolicy_js_1.setClientRequestIdPolicy; } });
-		Object.defineProperty(exports$1, "setClientRequestIdPolicyName", { enumerable: true, get: function () { return setClientRequestIdPolicy_js_1.setClientRequestIdPolicyName; } });
-		var logPolicy_js_1 = requireLogPolicy();
-		Object.defineProperty(exports$1, "logPolicy", { enumerable: true, get: function () { return logPolicy_js_1.logPolicy; } });
-		Object.defineProperty(exports$1, "logPolicyName", { enumerable: true, get: function () { return logPolicy_js_1.logPolicyName; } });
-		var multipartPolicy_js_1 = requireMultipartPolicy();
-		Object.defineProperty(exports$1, "multipartPolicy", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicy; } });
-		Object.defineProperty(exports$1, "multipartPolicyName", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicyName; } });
-		var proxyPolicy_js_1 = requireProxyPolicy();
-		Object.defineProperty(exports$1, "proxyPolicy", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicy; } });
-		Object.defineProperty(exports$1, "proxyPolicyName", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicyName; } });
-		Object.defineProperty(exports$1, "getDefaultProxySettings", { enumerable: true, get: function () { return proxyPolicy_js_1.getDefaultProxySettings; } });
-		var redirectPolicy_js_1 = requireRedirectPolicy();
-		Object.defineProperty(exports$1, "redirectPolicy", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicy; } });
-		Object.defineProperty(exports$1, "redirectPolicyName", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicyName; } });
-		var systemErrorRetryPolicy_js_1 = requireSystemErrorRetryPolicy();
-		Object.defineProperty(exports$1, "systemErrorRetryPolicy", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicy; } });
-		Object.defineProperty(exports$1, "systemErrorRetryPolicyName", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicyName; } });
-		var throttlingRetryPolicy_js_1 = requireThrottlingRetryPolicy();
-		Object.defineProperty(exports$1, "throttlingRetryPolicy", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicy; } });
-		Object.defineProperty(exports$1, "throttlingRetryPolicyName", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicyName; } });
-		var retryPolicy_js_1 = requireRetryPolicy();
-		Object.defineProperty(exports$1, "retryPolicy", { enumerable: true, get: function () { return retryPolicy_js_1.retryPolicy; } });
-		var tracingPolicy_js_1 = requireTracingPolicy();
-		Object.defineProperty(exports$1, "tracingPolicy", { enumerable: true, get: function () { return tracingPolicy_js_1.tracingPolicy; } });
-		Object.defineProperty(exports$1, "tracingPolicyName", { enumerable: true, get: function () { return tracingPolicy_js_1.tracingPolicyName; } });
-		var defaultRetryPolicy_js_1 = requireDefaultRetryPolicy();
-		Object.defineProperty(exports$1, "defaultRetryPolicy", { enumerable: true, get: function () { return defaultRetryPolicy_js_1.defaultRetryPolicy; } });
-		var userAgentPolicy_js_1 = requireUserAgentPolicy();
-		Object.defineProperty(exports$1, "userAgentPolicy", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicy; } });
-		Object.defineProperty(exports$1, "userAgentPolicyName", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicyName; } });
-		var tlsPolicy_js_1 = requireTlsPolicy();
-		Object.defineProperty(exports$1, "tlsPolicy", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicy; } });
-		Object.defineProperty(exports$1, "tlsPolicyName", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicyName; } });
-		var formDataPolicy_js_1 = requireFormDataPolicy();
-		Object.defineProperty(exports$1, "formDataPolicy", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicy; } });
-		Object.defineProperty(exports$1, "formDataPolicyName", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicyName; } });
-		var bearerTokenAuthenticationPolicy_js_1 = requireBearerTokenAuthenticationPolicy();
-		Object.defineProperty(exports$1, "bearerTokenAuthenticationPolicy", { enumerable: true, get: function () { return bearerTokenAuthenticationPolicy_js_1.bearerTokenAuthenticationPolicy; } });
-		Object.defineProperty(exports$1, "bearerTokenAuthenticationPolicyName", { enumerable: true, get: function () { return bearerTokenAuthenticationPolicy_js_1.bearerTokenAuthenticationPolicyName; } });
-		var ndJsonPolicy_js_1 = requireNdJsonPolicy();
-		Object.defineProperty(exports$1, "ndJsonPolicy", { enumerable: true, get: function () { return ndJsonPolicy_js_1.ndJsonPolicy; } });
-		Object.defineProperty(exports$1, "ndJsonPolicyName", { enumerable: true, get: function () { return ndJsonPolicy_js_1.ndJsonPolicyName; } });
-		var auxiliaryAuthenticationHeaderPolicy_js_1 = requireAuxiliaryAuthenticationHeaderPolicy();
-		Object.defineProperty(exports$1, "auxiliaryAuthenticationHeaderPolicy", { enumerable: true, get: function () { return auxiliaryAuthenticationHeaderPolicy_js_1.auxiliaryAuthenticationHeaderPolicy; } });
-		Object.defineProperty(exports$1, "auxiliaryAuthenticationHeaderPolicyName", { enumerable: true, get: function () { return auxiliaryAuthenticationHeaderPolicy_js_1.auxiliaryAuthenticationHeaderPolicyName; } });
-		var agentPolicy_js_1 = requireAgentPolicy();
-		Object.defineProperty(exports$1, "agentPolicy", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicy; } });
-		Object.defineProperty(exports$1, "agentPolicyName", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicyName; } });
-		var file_js_1 = requireFile();
-		Object.defineProperty(exports$1, "createFile", { enumerable: true, get: function () { return file_js_1.createFile; } });
-		Object.defineProperty(exports$1, "createFileFromStream", { enumerable: true, get: function () { return file_js_1.createFileFromStream; } });
-		
-	} (commonjs$d));
-	return commonjs$d;
-}
-
-var BlobServiceClient = {};
-
-var commonjs$7 = {};
-
-var azureKeyCredential = {};
-
-var hasRequiredAzureKeyCredential;
-
-function requireAzureKeyCredential () {
-	if (hasRequiredAzureKeyCredential) return azureKeyCredential;
-	hasRequiredAzureKeyCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(azureKeyCredential, "__esModule", { value: true });
-	azureKeyCredential.AzureKeyCredential = void 0;
-	/**
-	 * A static-key-based credential that supports updating
-	 * the underlying key value.
-	 */
-	class AzureKeyCredential {
-	    _key;
-	    /**
-	     * The value of the key to be used in authentication
-	     */
-	    get key() {
-	        return this._key;
-	    }
-	    /**
-	     * Create an instance of an AzureKeyCredential for use
-	     * with a service client.
-	     *
-	     * @param key - The initial value of the key to use in authentication
-	     */
-	    constructor(key) {
-	        if (!key) {
-	            throw new Error("key must be a non-empty string");
-	        }
-	        this._key = key;
-	    }
-	    /**
-	     * Change the value of the key.
-	     *
-	     * Updates will take effect upon the next request after
-	     * updating the key value.
-	     *
-	     * @param newKey - The new key value to be used
-	     */
-	    update(newKey) {
-	        this._key = newKey;
-	    }
-	}
-	azureKeyCredential.AzureKeyCredential = AzureKeyCredential;
-	
-	return azureKeyCredential;
-}
-
-var keyCredential = {};
-
-var hasRequiredKeyCredential;
-
-function requireKeyCredential () {
-	if (hasRequiredKeyCredential) return keyCredential;
-	hasRequiredKeyCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(keyCredential, "__esModule", { value: true });
-	keyCredential.isKeyCredential = isKeyCredential;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	/**
-	 * Tests an object to determine whether it implements KeyCredential.
-	 *
-	 * @param credential - The assumed KeyCredential to be tested.
-	 */
-	function isKeyCredential(credential) {
-	    return (0, core_util_1.isObjectWithProperties)(credential, ["key"]) && typeof credential.key === "string";
-	}
-	
-	return keyCredential;
-}
-
-var azureNamedKeyCredential = {};
-
-var hasRequiredAzureNamedKeyCredential;
-
-function requireAzureNamedKeyCredential () {
-	if (hasRequiredAzureNamedKeyCredential) return azureNamedKeyCredential;
-	hasRequiredAzureNamedKeyCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(azureNamedKeyCredential, "__esModule", { value: true });
-	azureNamedKeyCredential.AzureNamedKeyCredential = void 0;
-	azureNamedKeyCredential.isNamedKeyCredential = isNamedKeyCredential;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	/**
-	 * A static name/key-based credential that supports updating
-	 * the underlying name and key values.
-	 */
-	class AzureNamedKeyCredential {
-	    _key;
-	    _name;
-	    /**
-	     * The value of the key to be used in authentication.
-	     */
-	    get key() {
-	        return this._key;
-	    }
-	    /**
-	     * The value of the name to be used in authentication.
-	     */
-	    get name() {
-	        return this._name;
-	    }
-	    /**
-	     * Create an instance of an AzureNamedKeyCredential for use
-	     * with a service client.
-	     *
-	     * @param name - The initial value of the name to use in authentication.
-	     * @param key - The initial value of the key to use in authentication.
-	     */
-	    constructor(name, key) {
-	        if (!name || !key) {
-	            throw new TypeError("name and key must be non-empty strings");
-	        }
-	        this._name = name;
-	        this._key = key;
-	    }
-	    /**
-	     * Change the value of the key.
-	     *
-	     * Updates will take effect upon the next request after
-	     * updating the key value.
-	     *
-	     * @param newName - The new name value to be used.
-	     * @param newKey - The new key value to be used.
-	     */
-	    update(newName, newKey) {
-	        if (!newName || !newKey) {
-	            throw new TypeError("newName and newKey must be non-empty strings");
-	        }
-	        this._name = newName;
-	        this._key = newKey;
-	    }
-	}
-	azureNamedKeyCredential.AzureNamedKeyCredential = AzureNamedKeyCredential;
-	/**
-	 * Tests an object to determine whether it implements NamedKeyCredential.
-	 *
-	 * @param credential - The assumed NamedKeyCredential to be tested.
-	 */
-	function isNamedKeyCredential(credential) {
-	    return ((0, core_util_1.isObjectWithProperties)(credential, ["name", "key"]) &&
-	        typeof credential.key === "string" &&
-	        typeof credential.name === "string");
-	}
-	
-	return azureNamedKeyCredential;
-}
-
-var azureSASCredential = {};
-
-var hasRequiredAzureSASCredential;
-
-function requireAzureSASCredential () {
-	if (hasRequiredAzureSASCredential) return azureSASCredential;
-	hasRequiredAzureSASCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(azureSASCredential, "__esModule", { value: true });
-	azureSASCredential.AzureSASCredential = void 0;
-	azureSASCredential.isSASCredential = isSASCredential;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	/**
-	 * A static-signature-based credential that supports updating
-	 * the underlying signature value.
-	 */
-	class AzureSASCredential {
-	    _signature;
-	    /**
-	     * The value of the shared access signature to be used in authentication
-	     */
-	    get signature() {
-	        return this._signature;
-	    }
-	    /**
-	     * Create an instance of an AzureSASCredential for use
-	     * with a service client.
-	     *
-	     * @param signature - The initial value of the shared access signature to use in authentication
-	     */
-	    constructor(signature) {
-	        if (!signature) {
-	            throw new Error("shared access signature must be a non-empty string");
-	        }
-	        this._signature = signature;
-	    }
-	    /**
-	     * Change the value of the signature.
-	     *
-	     * Updates will take effect upon the next request after
-	     * updating the signature value.
-	     *
-	     * @param newSignature - The new shared access signature value to be used
-	     */
-	    update(newSignature) {
-	        if (!newSignature) {
-	            throw new Error("shared access signature must be a non-empty string");
-	        }
-	        this._signature = newSignature;
-	    }
-	}
-	azureSASCredential.AzureSASCredential = AzureSASCredential;
-	/**
-	 * Tests an object to determine whether it implements SASCredential.
-	 *
-	 * @param credential - The assumed SASCredential to be tested.
-	 */
-	function isSASCredential(credential) {
-	    return ((0, core_util_1.isObjectWithProperties)(credential, ["signature"]) && typeof credential.signature === "string");
-	}
-	
-	return azureSASCredential;
-}
-
-var tokenCredential = {};
-
-var hasRequiredTokenCredential;
-
-function requireTokenCredential () {
-	if (hasRequiredTokenCredential) return tokenCredential;
-	hasRequiredTokenCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(tokenCredential, "__esModule", { value: true });
-	tokenCredential.isBearerToken = isBearerToken;
-	tokenCredential.isPopToken = isPopToken;
-	tokenCredential.isTokenCredential = isTokenCredential;
-	/**
-	 * @internal
-	 * @param accessToken - Access token
-	 * @returns Whether a token is bearer type or not
-	 */
-	function isBearerToken(accessToken) {
-	    return !accessToken.tokenType || accessToken.tokenType === "Bearer";
-	}
-	/**
-	 * @internal
-	 * @param accessToken - Access token
-	 * @returns Whether a token is Pop token or not
-	 */
-	function isPopToken(accessToken) {
-	    return accessToken.tokenType === "pop";
-	}
-	/**
-	 * Tests an object to determine whether it implements TokenCredential.
-	 *
-	 * @param credential - The assumed TokenCredential to be tested.
-	 */
-	function isTokenCredential(credential) {
-	    // Check for an object with a 'getToken' function and possibly with
-	    // a 'signRequest' function.  We do this check to make sure that
-	    // a ServiceClientCredentials implementor (like TokenClientCredentials
-	    // in ms-rest-nodeauth) doesn't get mistaken for a TokenCredential if
-	    // it doesn't actually implement TokenCredential also.
-	    const castCredential = credential;
-	    return (castCredential &&
-	        typeof castCredential.getToken === "function" &&
-	        (castCredential.signRequest === undefined || castCredential.getToken.length > 0));
-	}
-	
-	return tokenCredential;
-}
-
-var hasRequiredCommonjs$8;
-
-function requireCommonjs$8 () {
-	if (hasRequiredCommonjs$8) return commonjs$7;
-	hasRequiredCommonjs$8 = 1;
-	(function (exports$1) {
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.isTokenCredential = exports$1.isSASCredential = exports$1.AzureSASCredential = exports$1.isNamedKeyCredential = exports$1.AzureNamedKeyCredential = exports$1.isKeyCredential = exports$1.AzureKeyCredential = void 0;
-		var azureKeyCredential_js_1 = requireAzureKeyCredential();
-		Object.defineProperty(exports$1, "AzureKeyCredential", { enumerable: true, get: function () { return azureKeyCredential_js_1.AzureKeyCredential; } });
-		var keyCredential_js_1 = requireKeyCredential();
-		Object.defineProperty(exports$1, "isKeyCredential", { enumerable: true, get: function () { return keyCredential_js_1.isKeyCredential; } });
-		var azureNamedKeyCredential_js_1 = requireAzureNamedKeyCredential();
-		Object.defineProperty(exports$1, "AzureNamedKeyCredential", { enumerable: true, get: function () { return azureNamedKeyCredential_js_1.AzureNamedKeyCredential; } });
-		Object.defineProperty(exports$1, "isNamedKeyCredential", { enumerable: true, get: function () { return azureNamedKeyCredential_js_1.isNamedKeyCredential; } });
-		var azureSASCredential_js_1 = requireAzureSASCredential();
-		Object.defineProperty(exports$1, "AzureSASCredential", { enumerable: true, get: function () { return azureSASCredential_js_1.AzureSASCredential; } });
-		Object.defineProperty(exports$1, "isSASCredential", { enumerable: true, get: function () { return azureSASCredential_js_1.isSASCredential; } });
-		var tokenCredential_js_1 = requireTokenCredential();
-		Object.defineProperty(exports$1, "isTokenCredential", { enumerable: true, get: function () { return tokenCredential_js_1.isTokenCredential; } });
-		
-	} (commonjs$7));
-	return commonjs$7;
-}
-
-var Pipeline = {};
-
-var commonjs$6 = {};
-
-var extendedClient = {};
-
-var disableKeepAlivePolicy = {};
-
-var hasRequiredDisableKeepAlivePolicy;
-
-function requireDisableKeepAlivePolicy () {
-	if (hasRequiredDisableKeepAlivePolicy) return disableKeepAlivePolicy;
-	hasRequiredDisableKeepAlivePolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.disableKeepAlivePolicyName = void 0;
-		exports$1.createDisableKeepAlivePolicy = createDisableKeepAlivePolicy;
-		exports$1.pipelineContainsDisableKeepAlivePolicy = pipelineContainsDisableKeepAlivePolicy;
-		exports$1.disableKeepAlivePolicyName = "DisableKeepAlivePolicy";
-		function createDisableKeepAlivePolicy() {
-		    return {
-		        name: exports$1.disableKeepAlivePolicyName,
-		        async sendRequest(request, next) {
-		            request.disableKeepAlive = true;
-		            return next(request);
-		        },
-		    };
-		}
-		/**
-		 * @internal
-		 */
-		function pipelineContainsDisableKeepAlivePolicy(pipeline) {
-		    return pipeline.getOrderedPolicies().some((policy) => policy.name === exports$1.disableKeepAlivePolicyName);
-		}
-		
-	} (disableKeepAlivePolicy));
-	return disableKeepAlivePolicy;
-}
-
-var commonjs$5 = {};
-
-var serializer = {};
-
-var base64 = {};
-
-var hasRequiredBase64;
-
-function requireBase64 () {
-	if (hasRequiredBase64) return base64;
-	hasRequiredBase64 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(base64, "__esModule", { value: true });
-	base64.encodeString = encodeString;
-	base64.encodeByteArray = encodeByteArray;
-	base64.decodeString = decodeString;
-	base64.decodeStringToString = decodeStringToString;
-	/**
-	 * Encodes a string in base64 format.
-	 * @param value - the string to encode
-	 * @internal
-	 */
-	function encodeString(value) {
-	    return Buffer.from(value).toString("base64");
-	}
-	/**
-	 * Encodes a byte array in base64 format.
-	 * @param value - the Uint8Aray to encode
-	 * @internal
-	 */
-	function encodeByteArray(value) {
-	    const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);
-	    return bufferValue.toString("base64");
-	}
-	/**
-	 * Decodes a base64 string into a byte array.
-	 * @param value - the base64 string to decode
-	 * @internal
-	 */
-	function decodeString(value) {
-	    return Buffer.from(value, "base64");
-	}
-	/**
-	 * Decodes a base64 string into a string.
-	 * @param value - the base64 string to decode
-	 * @internal
-	 */
-	function decodeStringToString(value) {
-	    return Buffer.from(value, "base64").toString();
-	}
-	
-	return base64;
-}
-
-var interfaces = {};
-
-var hasRequiredInterfaces;
-
-function requireInterfaces () {
-	if (hasRequiredInterfaces) return interfaces;
-	hasRequiredInterfaces = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(interfaces, "__esModule", { value: true });
-	interfaces.XML_CHARKEY = interfaces.XML_ATTRKEY = void 0;
-	/**
-	 * Default key used to access the XML attributes.
-	 */
-	interfaces.XML_ATTRKEY = "$";
-	/**
-	 * Default key used to access the XML value content.
-	 */
-	interfaces.XML_CHARKEY = "_";
-	
-	return interfaces;
-}
-
-var utils$4 = {};
-
-var hasRequiredUtils$4;
-
-function requireUtils$4 () {
-	if (hasRequiredUtils$4) return utils$4;
-	hasRequiredUtils$4 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(utils$4, "__esModule", { value: true });
-	utils$4.isPrimitiveBody = isPrimitiveBody;
-	utils$4.isDuration = isDuration;
-	utils$4.isValidUuid = isValidUuid;
-	utils$4.flattenResponse = flattenResponse;
-	/**
-	 * A type guard for a primitive response body.
-	 * @param value - Value to test
-	 *
-	 * @internal
-	 */
-	function isPrimitiveBody(value, mapperTypeName) {
-	    return (mapperTypeName !== "Composite" &&
-	        mapperTypeName !== "Dictionary" &&
-	        (typeof value === "string" ||
-	            typeof value === "number" ||
-	            typeof value === "boolean" ||
-	            mapperTypeName?.match(/^(Date|DateTime|DateTimeRfc1123|UnixTime|ByteArray|Base64Url)$/i) !==
-	                null ||
-	            value === undefined ||
-	            value === null));
-	}
-	const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
-	/**
-	 * Returns true if the given string is in ISO 8601 format.
-	 * @param value - The value to be validated for ISO 8601 duration format.
-	 * @internal
-	 */
-	function isDuration(value) {
-	    return validateISODuration.test(value);
-	}
-	const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
-	/**
-	 * Returns true if the provided uuid is valid.
-	 *
-	 * @param uuid - The uuid that needs to be validated.
-	 *
-	 * @internal
-	 */
-	function isValidUuid(uuid) {
-	    return validUuidRegex.test(uuid);
-	}
-	/**
-	 * Maps the response as follows:
-	 * - wraps the response body if needed (typically if its type is primitive).
-	 * - returns null if the combination of the headers and the body is empty.
-	 * - otherwise, returns the combination of the headers and the body.
-	 *
-	 * @param responseObject - a representation of the parsed response
-	 * @returns the response that will be returned to the user which can be null and/or wrapped
-	 *
-	 * @internal
-	 */
-	function handleNullableResponseAndWrappableBody(responseObject) {
-	    const combinedHeadersAndBody = {
-	        ...responseObject.headers,
-	        ...responseObject.body,
-	    };
-	    if (responseObject.hasNullableType &&
-	        Object.getOwnPropertyNames(combinedHeadersAndBody).length === 0) {
-	        return responseObject.shouldWrapBody ? { body: null } : null;
-	    }
-	    else {
-	        return responseObject.shouldWrapBody
-	            ? {
-	                ...responseObject.headers,
-	                body: responseObject.body,
-	            }
-	            : combinedHeadersAndBody;
-	    }
-	}
-	/**
-	 * Take a `FullOperationResponse` and turn it into a flat
-	 * response object to hand back to the consumer.
-	 * @param fullResponse - The processed response from the operation request
-	 * @param responseSpec - The response map from the OperationSpec
-	 *
-	 * @internal
-	 */
-	function flattenResponse(fullResponse, responseSpec) {
-	    const parsedHeaders = fullResponse.parsedHeaders;
-	    // head methods never have a body, but we return a boolean set to body property
-	    // to indicate presence/absence of the resource
-	    if (fullResponse.request.method === "HEAD") {
-	        return {
-	            ...parsedHeaders,
-	            body: fullResponse.parsedBody,
-	        };
-	    }
-	    const bodyMapper = responseSpec && responseSpec.bodyMapper;
-	    const isNullable = Boolean(bodyMapper?.nullable);
-	    const expectedBodyTypeName = bodyMapper?.type.name;
-	    /** If the body is asked for, we look at the expected body type to handle it */
-	    if (expectedBodyTypeName === "Stream") {
-	        return {
-	            ...parsedHeaders,
-	            blobBody: fullResponse.blobBody,
-	            readableStreamBody: fullResponse.readableStreamBody,
-	        };
-	    }
-	    const modelProperties = (expectedBodyTypeName === "Composite" &&
-	        bodyMapper.type.modelProperties) ||
-	        {};
-	    const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
-	    if (expectedBodyTypeName === "Sequence" || isPageableResponse) {
-	        const arrayResponse = fullResponse.parsedBody ?? [];
-	        for (const key of Object.keys(modelProperties)) {
-	            if (modelProperties[key].serializedName) {
-	                arrayResponse[key] = fullResponse.parsedBody?.[key];
-	            }
-	        }
-	        if (parsedHeaders) {
-	            for (const key of Object.keys(parsedHeaders)) {
-	                arrayResponse[key] = parsedHeaders[key];
-	            }
-	        }
-	        return isNullable &&
-	            !fullResponse.parsedBody &&
-	            !parsedHeaders &&
-	            Object.getOwnPropertyNames(modelProperties).length === 0
-	            ? null
-	            : arrayResponse;
-	    }
-	    return handleNullableResponseAndWrappableBody({
-	        body: fullResponse.parsedBody,
-	        headers: parsedHeaders,
-	        hasNullableType: isNullable,
-	        shouldWrapBody: isPrimitiveBody(fullResponse.parsedBody, expectedBodyTypeName),
-	    });
-	}
-	
-	return utils$4;
-}
-
-var hasRequiredSerializer;
-
-function requireSerializer () {
-	if (hasRequiredSerializer) return serializer;
-	hasRequiredSerializer = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(serializer, "__esModule", { value: true });
-	serializer.MapperTypeNames = void 0;
-	serializer.createSerializer = createSerializer;
-	const tslib_1 = require$$0$2;
-	const base64 = tslib_1.__importStar(requireBase64());
-	const interfaces_js_1 = requireInterfaces();
-	const utils_js_1 = requireUtils$4();
-	class SerializerImpl {
-	    modelMappers;
-	    isXML;
-	    constructor(modelMappers = {}, isXML = false) {
-	        this.modelMappers = modelMappers;
-	        this.isXML = isXML;
-	    }
-	    /**
-	     * @deprecated Removing the constraints validation on client side.
-	     */
-	    validateConstraints(mapper, value, objectName) {
-	        const failValidation = (constraintName, constraintValue) => {
-	            throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
-	        };
-	        if (mapper.constraints && value !== undefined && value !== null) {
-	            const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
-	            if (ExclusiveMaximum !== undefined && value >= ExclusiveMaximum) {
-	                failValidation("ExclusiveMaximum", ExclusiveMaximum);
-	            }
-	            if (ExclusiveMinimum !== undefined && value <= ExclusiveMinimum) {
-	                failValidation("ExclusiveMinimum", ExclusiveMinimum);
-	            }
-	            if (InclusiveMaximum !== undefined && value > InclusiveMaximum) {
-	                failValidation("InclusiveMaximum", InclusiveMaximum);
-	            }
-	            if (InclusiveMinimum !== undefined && value < InclusiveMinimum) {
-	                failValidation("InclusiveMinimum", InclusiveMinimum);
-	            }
-	            if (MaxItems !== undefined && value.length > MaxItems) {
-	                failValidation("MaxItems", MaxItems);
-	            }
-	            if (MaxLength !== undefined && value.length > MaxLength) {
-	                failValidation("MaxLength", MaxLength);
-	            }
-	            if (MinItems !== undefined && value.length < MinItems) {
-	                failValidation("MinItems", MinItems);
-	            }
-	            if (MinLength !== undefined && value.length < MinLength) {
-	                failValidation("MinLength", MinLength);
-	            }
-	            if (MultipleOf !== undefined && value % MultipleOf !== 0) {
-	                failValidation("MultipleOf", MultipleOf);
-	            }
-	            if (Pattern) {
-	                const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
-	                if (typeof value !== "string" || value.match(pattern) === null) {
-	                    failValidation("Pattern", Pattern);
-	                }
-	            }
-	            if (UniqueItems &&
-	                value.some((item, i, ar) => ar.indexOf(item) !== i)) {
-	                failValidation("UniqueItems", UniqueItems);
-	            }
-	        }
-	    }
-	    /**
-	     * Serialize the given object based on its metadata defined in the mapper
-	     *
-	     * @param mapper - The mapper which defines the metadata of the serializable object
-	     *
-	     * @param object - A valid Javascript object to be serialized
-	     *
-	     * @param objectName - Name of the serialized object
-	     *
-	     * @param options - additional options to serialization
-	     *
-	     * @returns A valid serialized Javascript object
-	     */
-	    serialize(mapper, object, objectName, options = { xml: {} }) {
-	        const updatedOptions = {
-	            xml: {
-	                rootName: options.xml.rootName ?? "",
-	                includeRoot: options.xml.includeRoot ?? false,
-	                xmlCharKey: options.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
-	            },
-	        };
-	        let payload = {};
-	        const mapperType = mapper.type.name;
-	        if (!objectName) {
-	            objectName = mapper.serializedName;
-	        }
-	        if (mapperType.match(/^Sequence$/i) !== null) {
-	            payload = [];
-	        }
-	        if (mapper.isConstant) {
-	            object = mapper.defaultValue;
-	        }
-	        // This table of allowed values should help explain
-	        // the mapper.required and mapper.nullable properties.
-	        // X means "neither undefined or null are allowed".
-	        //           || required
-	        //           || true      | false
-	        //  nullable || ==========================
-	        //      true || null      | undefined/null
-	        //     false || X         | undefined
-	        // undefined || X         | undefined/null
-	        const { required, nullable } = mapper;
-	        if (required && nullable && object === undefined) {
-	            throw new Error(`${objectName} cannot be undefined.`);
-	        }
-	        if (required && !nullable && (object === undefined || object === null)) {
-	            throw new Error(`${objectName} cannot be null or undefined.`);
-	        }
-	        if (!required && nullable === false && object === null) {
-	            throw new Error(`${objectName} cannot be null.`);
-	        }
-	        if (object === undefined || object === null) {
-	            payload = object;
-	        }
-	        else {
-	            if (mapperType.match(/^any$/i) !== null) {
-	                payload = object;
-	            }
-	            else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
-	                payload = serializeBasicTypes(mapperType, objectName, object);
-	            }
-	            else if (mapperType.match(/^Enum$/i) !== null) {
-	                const enumMapper = mapper;
-	                payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
-	            }
-	            else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
-	                payload = serializeDateTypes(mapperType, object, objectName);
-	            }
-	            else if (mapperType.match(/^ByteArray$/i) !== null) {
-	                payload = serializeByteArrayType(objectName, object);
-	            }
-	            else if (mapperType.match(/^Base64Url$/i) !== null) {
-	                payload = serializeBase64UrlType(objectName, object);
-	            }
-	            else if (mapperType.match(/^Sequence$/i) !== null) {
-	                payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
-	            }
-	            else if (mapperType.match(/^Dictionary$/i) !== null) {
-	                payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
-	            }
-	            else if (mapperType.match(/^Composite$/i) !== null) {
-	                payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
-	            }
-	        }
-	        return payload;
-	    }
-	    /**
-	     * Deserialize the given object based on its metadata defined in the mapper
-	     *
-	     * @param mapper - The mapper which defines the metadata of the serializable object
-	     *
-	     * @param responseBody - A valid Javascript entity to be deserialized
-	     *
-	     * @param objectName - Name of the deserialized object
-	     *
-	     * @param options - Controls behavior of XML parser and builder.
-	     *
-	     * @returns A valid deserialized Javascript object
-	     */
-	    deserialize(mapper, responseBody, objectName, options = { xml: {} }) {
-	        const updatedOptions = {
-	            xml: {
-	                rootName: options.xml.rootName ?? "",
-	                includeRoot: options.xml.includeRoot ?? false,
-	                xmlCharKey: options.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
-	            },
-	            ignoreUnknownProperties: options.ignoreUnknownProperties ?? false,
-	        };
-	        if (responseBody === undefined || responseBody === null) {
-	            if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
-	                // Edge case for empty XML non-wrapped lists. xml2js can't distinguish
-	                // between the list being empty versus being missing,
-	                // so let's do the more user-friendly thing and return an empty list.
-	                responseBody = [];
-	            }
-	            // specifically check for undefined as default value can be a falsey value `0, "", false, null`
-	            if (mapper.defaultValue !== undefined) {
-	                responseBody = mapper.defaultValue;
-	            }
-	            return responseBody;
-	        }
-	        let payload;
-	        const mapperType = mapper.type.name;
-	        if (!objectName) {
-	            objectName = mapper.serializedName;
-	        }
-	        if (mapperType.match(/^Composite$/i) !== null) {
-	            payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
-	        }
-	        else {
-	            if (this.isXML) {
-	                const xmlCharKey = updatedOptions.xml.xmlCharKey;
-	                /**
-	                 * If the mapper specifies this as a non-composite type value but the responseBody contains
-	                 * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
-	                 * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
-	                 */
-	                if (responseBody[interfaces_js_1.XML_ATTRKEY] !== undefined && responseBody[xmlCharKey] !== undefined) {
-	                    responseBody = responseBody[xmlCharKey];
-	                }
-	            }
-	            if (mapperType.match(/^Number$/i) !== null) {
-	                payload = parseFloat(responseBody);
-	                if (isNaN(payload)) {
-	                    payload = responseBody;
-	                }
-	            }
-	            else if (mapperType.match(/^Boolean$/i) !== null) {
-	                if (responseBody === "true") {
-	                    payload = true;
-	                }
-	                else if (responseBody === "false") {
-	                    payload = false;
-	                }
-	                else {
-	                    payload = responseBody;
-	                }
-	            }
-	            else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
-	                payload = responseBody;
-	            }
-	            else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
-	                payload = new Date(responseBody);
-	            }
-	            else if (mapperType.match(/^UnixTime$/i) !== null) {
-	                payload = unixTimeToDate(responseBody);
-	            }
-	            else if (mapperType.match(/^ByteArray$/i) !== null) {
-	                payload = base64.decodeString(responseBody);
-	            }
-	            else if (mapperType.match(/^Base64Url$/i) !== null) {
-	                payload = base64UrlToByteArray(responseBody);
-	            }
-	            else if (mapperType.match(/^Sequence$/i) !== null) {
-	                payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
-	            }
-	            else if (mapperType.match(/^Dictionary$/i) !== null) {
-	                payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
-	            }
-	        }
-	        if (mapper.isConstant) {
-	            payload = mapper.defaultValue;
-	        }
-	        return payload;
-	    }
-	}
-	/**
-	 * Method that creates and returns a Serializer.
-	 * @param modelMappers - Known models to map
-	 * @param isXML - If XML should be supported
-	 */
-	function createSerializer(modelMappers = {}, isXML = false) {
-	    return new SerializerImpl(modelMappers, isXML);
-	}
-	function trimEnd(str, ch) {
-	    let len = str.length;
-	    while (len - 1 >= 0 && str[len - 1] === ch) {
-	        --len;
-	    }
-	    return str.substr(0, len);
-	}
-	function bufferToBase64Url(buffer) {
-	    if (!buffer) {
-	        return undefined;
-	    }
-	    if (!(buffer instanceof Uint8Array)) {
-	        throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
-	    }
-	    // Uint8Array to Base64.
-	    const str = base64.encodeByteArray(buffer);
-	    // Base64 to Base64Url.
-	    return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
-	}
-	function base64UrlToByteArray(str) {
-	    if (!str) {
-	        return undefined;
-	    }
-	    if (str && typeof str.valueOf() !== "string") {
-	        throw new Error("Please provide an input of type string for converting to Uint8Array");
-	    }
-	    // Base64Url to Base64.
-	    str = str.replace(/-/g, "+").replace(/_/g, "/");
-	    // Base64 to Uint8Array.
-	    return base64.decodeString(str);
-	}
-	function splitSerializeName(prop) {
-	    const classes = [];
-	    let partialclass = "";
-	    if (prop) {
-	        const subwords = prop.split(".");
-	        for (const item of subwords) {
-	            if (item.charAt(item.length - 1) === "\\") {
-	                partialclass += item.substr(0, item.length - 1) + ".";
-	            }
-	            else {
-	                partialclass += item;
-	                classes.push(partialclass);
-	                partialclass = "";
-	            }
-	        }
-	    }
-	    return classes;
-	}
-	function dateToUnixTime(d) {
-	    if (!d) {
-	        return undefined;
-	    }
-	    if (typeof d.valueOf() === "string") {
-	        d = new Date(d);
-	    }
-	    return Math.floor(d.getTime() / 1000);
-	}
-	function unixTimeToDate(n) {
-	    if (!n) {
-	        return undefined;
-	    }
-	    return new Date(n * 1000);
-	}
-	function serializeBasicTypes(typeName, objectName, value) {
-	    if (value !== null && value !== undefined) {
-	        if (typeName.match(/^Number$/i) !== null) {
-	            if (typeof value !== "number") {
-	                throw new Error(`${objectName} with value ${value} must be of type number.`);
-	            }
-	        }
-	        else if (typeName.match(/^String$/i) !== null) {
-	            if (typeof value.valueOf() !== "string") {
-	                throw new Error(`${objectName} with value "${value}" must be of type string.`);
-	            }
-	        }
-	        else if (typeName.match(/^Uuid$/i) !== null) {
-	            if (!(typeof value.valueOf() === "string" && (0, utils_js_1.isValidUuid)(value))) {
-	                throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
-	            }
-	        }
-	        else if (typeName.match(/^Boolean$/i) !== null) {
-	            if (typeof value !== "boolean") {
-	                throw new Error(`${objectName} with value ${value} must be of type boolean.`);
-	            }
-	        }
-	        else if (typeName.match(/^Stream$/i) !== null) {
-	            const objectType = typeof value;
-	            if (objectType !== "string" &&
-	                typeof value.pipe !== "function" && // NodeJS.ReadableStream
-	                typeof value.tee !== "function" && // browser ReadableStream
-	                !(value instanceof ArrayBuffer) &&
-	                !ArrayBuffer.isView(value) &&
-	                // File objects count as a type of Blob, so we want to use instanceof explicitly
-	                !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob) &&
-	                objectType !== "function") {
-	                throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, ReadableStream, or () => ReadableStream.`);
-	            }
-	        }
-	    }
-	    return value;
-	}
-	function serializeEnumType(objectName, allowedValues, value) {
-	    if (!allowedValues) {
-	        throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
-	    }
-	    const isPresent = allowedValues.some((item) => {
-	        if (typeof item.valueOf() === "string") {
-	            return item.toLowerCase() === value.toLowerCase();
-	        }
-	        return item === value;
-	    });
-	    if (!isPresent) {
-	        throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
-	    }
-	    return value;
-	}
-	function serializeByteArrayType(objectName, value) {
-	    if (value !== undefined && value !== null) {
-	        if (!(value instanceof Uint8Array)) {
-	            throw new Error(`${objectName} must be of type Uint8Array.`);
-	        }
-	        value = base64.encodeByteArray(value);
-	    }
-	    return value;
-	}
-	function serializeBase64UrlType(objectName, value) {
-	    if (value !== undefined && value !== null) {
-	        if (!(value instanceof Uint8Array)) {
-	            throw new Error(`${objectName} must be of type Uint8Array.`);
-	        }
-	        value = bufferToBase64Url(value);
-	    }
-	    return value;
-	}
-	function serializeDateTypes(typeName, value, objectName) {
-	    if (value !== undefined && value !== null) {
-	        if (typeName.match(/^Date$/i) !== null) {
-	            if (!(value instanceof Date ||
-	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
-	                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
-	            }
-	            value =
-	                value instanceof Date
-	                    ? value.toISOString().substring(0, 10)
-	                    : new Date(value).toISOString().substring(0, 10);
-	        }
-	        else if (typeName.match(/^DateTime$/i) !== null) {
-	            if (!(value instanceof Date ||
-	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
-	                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
-	            }
-	            value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
-	        }
-	        else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
-	            if (!(value instanceof Date ||
-	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
-	                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
-	            }
-	            value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
-	        }
-	        else if (typeName.match(/^UnixTime$/i) !== null) {
-	            if (!(value instanceof Date ||
-	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
-	                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
-	                    `for it to be serialized in UnixTime/Epoch format.`);
-	            }
-	            value = dateToUnixTime(value);
-	        }
-	        else if (typeName.match(/^TimeSpan$/i) !== null) {
-	            if (!(0, utils_js_1.isDuration)(value)) {
-	                throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
-	            }
-	        }
-	    }
-	    return value;
-	}
-	function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
-	    if (!Array.isArray(object)) {
-	        throw new Error(`${objectName} must be of type Array.`);
-	    }
-	    let elementType = mapper.type.element;
-	    if (!elementType || typeof elementType !== "object") {
-	        throw new Error(`element" metadata for an Array must be defined in the ` +
-	            `mapper and it must of type "object" in ${objectName}.`);
-	    }
-	    // Quirk: Composite mappers referenced by `element` might
-	    // not have *all* properties declared (like uberParent),
-	    // so let's try to look up the full definition by name.
-	    if (elementType.type.name === "Composite" && elementType.type.className) {
-	        elementType = serializer.modelMappers[elementType.type.className] ?? elementType;
-	    }
-	    const tempArray = [];
-	    for (let i = 0; i < object.length; i++) {
-	        const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
-	        if (isXml && elementType.xmlNamespace) {
-	            const xmlnsKey = elementType.xmlNamespacePrefix
-	                ? `xmlns:${elementType.xmlNamespacePrefix}`
-	                : "xmlns";
-	            if (elementType.type.name === "Composite") {
-	                tempArray[i] = { ...serializedValue };
-	                tempArray[i][interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
-	            }
-	            else {
-	                tempArray[i] = {};
-	                tempArray[i][options.xml.xmlCharKey] = serializedValue;
-	                tempArray[i][interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
-	            }
-	        }
-	        else {
-	            tempArray[i] = serializedValue;
-	        }
-	    }
-	    return tempArray;
-	}
-	function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
-	    if (typeof object !== "object") {
-	        throw new Error(`${objectName} must be of type object.`);
-	    }
-	    const valueType = mapper.type.value;
-	    if (!valueType || typeof valueType !== "object") {
-	        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
-	            `mapper and it must of type "object" in ${objectName}.`);
-	    }
-	    const tempDictionary = {};
-	    for (const key of Object.keys(object)) {
-	        const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
-	        // If the element needs an XML namespace we need to add it within the $ property
-	        tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
-	    }
-	    // Add the namespace to the root element if needed
-	    if (isXml && mapper.xmlNamespace) {
-	        const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
-	        const result = tempDictionary;
-	        result[interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
-	        return result;
-	    }
-	    return tempDictionary;
-	}
-	/**
-	 * Resolves the additionalProperties property from a referenced mapper
-	 * @param serializer - the serializer containing the entire set of mappers
-	 * @param mapper - the composite mapper to resolve
-	 * @param objectName - name of the object being serialized
-	 */
-	function resolveAdditionalProperties(serializer, mapper, objectName) {
-	    const additionalProperties = mapper.type.additionalProperties;
-	    if (!additionalProperties && mapper.type.className) {
-	        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
-	        return modelMapper?.type.additionalProperties;
-	    }
-	    return additionalProperties;
-	}
-	/**
-	 * Finds the mapper referenced by className
-	 * @param serializer - the serializer containing the entire set of mappers
-	 * @param mapper - the composite mapper to resolve
-	 * @param objectName - name of the object being serialized
-	 */
-	function resolveReferencedMapper(serializer, mapper, objectName) {
-	    const className = mapper.type.className;
-	    if (!className) {
-	        throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
-	    }
-	    return serializer.modelMappers[className];
-	}
-	/**
-	 * Resolves a composite mapper's modelProperties.
-	 * @param serializer - the serializer containing the entire set of mappers
-	 * @param mapper - the composite mapper to resolve
-	 */
-	function resolveModelProperties(serializer, mapper, objectName) {
-	    let modelProps = mapper.type.modelProperties;
-	    if (!modelProps) {
-	        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
-	        if (!modelMapper) {
-	            throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
-	        }
-	        modelProps = modelMapper?.type.modelProperties;
-	        if (!modelProps) {
-	            throw new Error(`modelProperties cannot be null or undefined in the ` +
-	                `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
-	        }
-	    }
-	    return modelProps;
-	}
-	function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
-	    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
-	        mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
-	    }
-	    if (object !== undefined && object !== null) {
-	        const payload = {};
-	        const modelProps = resolveModelProperties(serializer, mapper, objectName);
-	        for (const key of Object.keys(modelProps)) {
-	            const propertyMapper = modelProps[key];
-	            if (propertyMapper.readOnly) {
-	                continue;
-	            }
-	            let propName;
-	            let parentObject = payload;
-	            if (serializer.isXML) {
-	                if (propertyMapper.xmlIsWrapped) {
-	                    propName = propertyMapper.xmlName;
-	                }
-	                else {
-	                    propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
-	                }
-	            }
-	            else {
-	                const paths = splitSerializeName(propertyMapper.serializedName);
-	                propName = paths.pop();
-	                for (const pathName of paths) {
-	                    const childObject = parentObject[pathName];
-	                    if ((childObject === undefined || childObject === null) &&
-	                        ((object[key] !== undefined && object[key] !== null) ||
-	                            propertyMapper.defaultValue !== undefined)) {
-	                        parentObject[pathName] = {};
-	                    }
-	                    parentObject = parentObject[pathName];
-	                }
-	            }
-	            if (parentObject !== undefined && parentObject !== null) {
-	                if (isXml && mapper.xmlNamespace) {
-	                    const xmlnsKey = mapper.xmlNamespacePrefix
-	                        ? `xmlns:${mapper.xmlNamespacePrefix}`
-	                        : "xmlns";
-	                    parentObject[interfaces_js_1.XML_ATTRKEY] = {
-	                        ...parentObject[interfaces_js_1.XML_ATTRKEY],
-	                        [xmlnsKey]: mapper.xmlNamespace,
-	                    };
-	                }
-	                const propertyObjectName = propertyMapper.serializedName !== ""
-	                    ? objectName + "." + propertyMapper.serializedName
-	                    : objectName;
-	                let toSerialize = object[key];
-	                const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
-	                if (polymorphicDiscriminator &&
-	                    polymorphicDiscriminator.clientName === key &&
-	                    (toSerialize === undefined || toSerialize === null)) {
-	                    toSerialize = mapper.serializedName;
-	                }
-	                const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
-	                if (serializedValue !== undefined && propName !== undefined && propName !== null) {
-	                    const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
-	                    if (isXml && propertyMapper.xmlIsAttribute) {
-	                        // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
-	                        // This keeps things simple while preventing name collision
-	                        // with names in user documents.
-	                        parentObject[interfaces_js_1.XML_ATTRKEY] = parentObject[interfaces_js_1.XML_ATTRKEY] || {};
-	                        parentObject[interfaces_js_1.XML_ATTRKEY][propName] = serializedValue;
-	                    }
-	                    else if (isXml && propertyMapper.xmlIsWrapped) {
-	                        parentObject[propName] = { [propertyMapper.xmlElementName]: value };
-	                    }
-	                    else {
-	                        parentObject[propName] = value;
-	                    }
-	                }
-	            }
-	        }
-	        const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
-	        if (additionalPropertiesMapper) {
-	            const propNames = Object.keys(modelProps);
-	            for (const clientPropName in object) {
-	                const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
-	                if (isAdditionalProperty) {
-	                    payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options);
-	                }
-	            }
-	        }
-	        return payload;
-	    }
-	    return object;
-	}
-	function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
-	    if (!isXml || !propertyMapper.xmlNamespace) {
-	        return serializedValue;
-	    }
-	    const xmlnsKey = propertyMapper.xmlNamespacePrefix
-	        ? `xmlns:${propertyMapper.xmlNamespacePrefix}`
-	        : "xmlns";
-	    const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
-	    if (["Composite"].includes(propertyMapper.type.name)) {
-	        if (serializedValue[interfaces_js_1.XML_ATTRKEY]) {
-	            return serializedValue;
-	        }
-	        else {
-	            const result = { ...serializedValue };
-	            result[interfaces_js_1.XML_ATTRKEY] = xmlNamespace;
-	            return result;
-	        }
-	    }
-	    const result = {};
-	    result[options.xml.xmlCharKey] = serializedValue;
-	    result[interfaces_js_1.XML_ATTRKEY] = xmlNamespace;
-	    return result;
-	}
-	function isSpecialXmlProperty(propertyName, options) {
-	    return [interfaces_js_1.XML_ATTRKEY, options.xml.xmlCharKey].includes(propertyName);
-	}
-	function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
-	    const xmlCharKey = options.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY;
-	    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
-	        mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
-	    }
-	    const modelProps = resolveModelProperties(serializer, mapper, objectName);
-	    let instance = {};
-	    const handledPropertyNames = [];
-	    for (const key of Object.keys(modelProps)) {
-	        const propertyMapper = modelProps[key];
-	        const paths = splitSerializeName(modelProps[key].serializedName);
-	        handledPropertyNames.push(paths[0]);
-	        const { serializedName, xmlName, xmlElementName } = propertyMapper;
-	        let propertyObjectName = objectName;
-	        if (serializedName !== "" && serializedName !== undefined) {
-	            propertyObjectName = objectName + "." + serializedName;
-	        }
-	        const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
-	        if (headerCollectionPrefix) {
-	            const dictionary = {};
-	            for (const headerKey of Object.keys(responseBody)) {
-	                if (headerKey.startsWith(headerCollectionPrefix)) {
-	                    dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
-	                }
-	                handledPropertyNames.push(headerKey);
-	            }
-	            instance[key] = dictionary;
-	        }
-	        else if (serializer.isXML) {
-	            if (propertyMapper.xmlIsAttribute && responseBody[interfaces_js_1.XML_ATTRKEY]) {
-	                instance[key] = serializer.deserialize(propertyMapper, responseBody[interfaces_js_1.XML_ATTRKEY][xmlName], propertyObjectName, options);
-	            }
-	            else if (propertyMapper.xmlIsMsText) {
-	                if (responseBody[xmlCharKey] !== undefined) {
-	                    instance[key] = responseBody[xmlCharKey];
-	                }
-	                else if (typeof responseBody === "string") {
-	                    // The special case where xml parser parses "content" into JSON of
-	                    //   `{ name: "content"}` instead of `{ name: { "_": "content" }}`
-	                    instance[key] = responseBody;
-	                }
-	            }
-	            else {
-	                const propertyName = xmlElementName || xmlName || serializedName;
-	                if (propertyMapper.xmlIsWrapped) {
-	                    /* a list of  wrapped by 
-	                      For the xml example below
-	                        
-	                          ...
-	                          ...
-	                        
-	                      the responseBody has
-	                        {
-	                          Cors: {
-	                            CorsRule: [{...}, {...}]
-	                          }
-	                        }
-	                      xmlName is "Cors" and xmlElementName is"CorsRule".
-	                    */
-	                    const wrapped = responseBody[xmlName];
-	                    const elementList = wrapped?.[xmlElementName] ?? [];
-	                    instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);
-	                    handledPropertyNames.push(xmlName);
-	                }
-	                else {
-	                    const property = responseBody[propertyName];
-	                    instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
-	                    handledPropertyNames.push(propertyName);
-	                }
-	            }
-	        }
-	        else {
-	            // deserialize the property if it is present in the provided responseBody instance
-	            let propertyInstance;
-	            let res = responseBody;
-	            // traversing the object step by step.
-	            let steps = 0;
-	            for (const item of paths) {
-	                if (!res)
-	                    break;
-	                steps++;
-	                res = res[item];
-	            }
-	            // only accept null when reaching the last position of object otherwise it would be undefined
-	            if (res === null && steps < paths.length) {
-	                res = undefined;
-	            }
-	            propertyInstance = res;
-	            const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
-	            // checking that the model property name (key)(ex: "fishtype") and the
-	            // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
-	            // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
-	            // is a better approach. The generator is not consistent with escaping '\.' in the
-	            // serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
-	            // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
-	            // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
-	            // the transformation of model property name (ex: "fishtype") is done consistently.
-	            // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
-	            if (polymorphicDiscriminator &&
-	                key === polymorphicDiscriminator.clientName &&
-	                (propertyInstance === undefined || propertyInstance === null)) {
-	                propertyInstance = mapper.serializedName;
-	            }
-	            let serializedValue;
-	            // paging
-	            if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
-	                propertyInstance = responseBody[key];
-	                const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
-	                // Copy over any properties that have already been added into the instance, where they do
-	                // not exist on the newly de-serialized array
-	                for (const [k, v] of Object.entries(instance)) {
-	                    if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
-	                        arrayInstance[k] = v;
-	                    }
-	                }
-	                instance = arrayInstance;
-	            }
-	            else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
-	                serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
-	                instance[key] = serializedValue;
-	            }
-	        }
-	    }
-	    const additionalPropertiesMapper = mapper.type.additionalProperties;
-	    if (additionalPropertiesMapper) {
-	        const isAdditionalProperty = (responsePropName) => {
-	            for (const clientPropName in modelProps) {
-	                const paths = splitSerializeName(modelProps[clientPropName].serializedName);
-	                if (paths[0] === responsePropName) {
-	                    return false;
-	                }
-	            }
-	            return true;
-	        };
-	        for (const responsePropName in responseBody) {
-	            if (isAdditionalProperty(responsePropName)) {
-	                instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
-	            }
-	        }
-	    }
-	    else if (responseBody && !options.ignoreUnknownProperties) {
-	        for (const key of Object.keys(responseBody)) {
-	            if (instance[key] === undefined &&
-	                !handledPropertyNames.includes(key) &&
-	                !isSpecialXmlProperty(key, options)) {
-	                instance[key] = responseBody[key];
-	            }
-	        }
-	    }
-	    return instance;
-	}
-	function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
-	    /* jshint validthis: true */
-	    const value = mapper.type.value;
-	    if (!value || typeof value !== "object") {
-	        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
-	            `mapper and it must of type "object" in ${objectName}`);
-	    }
-	    if (responseBody) {
-	        const tempDictionary = {};
-	        for (const key of Object.keys(responseBody)) {
-	            tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
-	        }
-	        return tempDictionary;
-	    }
-	    return responseBody;
-	}
-	function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
-	    let element = mapper.type.element;
-	    if (!element || typeof element !== "object") {
-	        throw new Error(`element" metadata for an Array must be defined in the ` +
-	            `mapper and it must of type "object" in ${objectName}`);
-	    }
-	    if (responseBody) {
-	        if (!Array.isArray(responseBody)) {
-	            // xml2js will interpret a single element array as just the element, so force it to be an array
-	            responseBody = [responseBody];
-	        }
-	        // Quirk: Composite mappers referenced by `element` might
-	        // not have *all* properties declared (like uberParent),
-	        // so let's try to look up the full definition by name.
-	        if (element.type.name === "Composite" && element.type.className) {
-	            element = serializer.modelMappers[element.type.className] ?? element;
-	        }
-	        const tempArray = [];
-	        for (let i = 0; i < responseBody.length; i++) {
-	            tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
-	        }
-	        return tempArray;
-	    }
-	    return responseBody;
-	}
-	function getIndexDiscriminator(discriminators, discriminatorValue, typeName) {
-	    const typeNamesToCheck = [typeName];
-	    while (typeNamesToCheck.length) {
-	        const currentName = typeNamesToCheck.shift();
-	        const indexDiscriminator = discriminatorValue === currentName
-	            ? discriminatorValue
-	            : currentName + "." + discriminatorValue;
-	        if (Object.prototype.hasOwnProperty.call(discriminators, indexDiscriminator)) {
-	            return discriminators[indexDiscriminator];
-	        }
-	        else {
-	            for (const [name, mapper] of Object.entries(discriminators)) {
-	                if (name.startsWith(currentName + ".") &&
-	                    mapper.type.uberParent === currentName &&
-	                    mapper.type.className) {
-	                    typeNamesToCheck.push(mapper.type.className);
-	                }
-	            }
-	        }
-	    }
-	    return undefined;
-	}
-	function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
-	    const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
-	    if (polymorphicDiscriminator) {
-	        let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
-	        if (discriminatorName) {
-	            // The serializedName might have \\, which we just want to ignore
-	            if (polymorphicPropertyName === "serializedName") {
-	                discriminatorName = discriminatorName.replace(/\\/gi, "");
-	            }
-	            const discriminatorValue = object[discriminatorName];
-	            const typeName = mapper.type.uberParent ?? mapper.type.className;
-	            if (typeof discriminatorValue === "string" && typeName) {
-	                const polymorphicMapper = getIndexDiscriminator(serializer.modelMappers.discriminators, discriminatorValue, typeName);
-	                if (polymorphicMapper) {
-	                    mapper = polymorphicMapper;
-	                }
-	            }
-	        }
-	    }
-	    return mapper;
-	}
-	function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
-	    return (mapper.type.polymorphicDiscriminator ||
-	        getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
-	        getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
-	}
-	function getPolymorphicDiscriminatorSafely(serializer, typeName) {
-	    return (typeName &&
-	        serializer.modelMappers[typeName] &&
-	        serializer.modelMappers[typeName].type.polymorphicDiscriminator);
-	}
-	/**
-	 * Known types of Mappers
-	 */
-	serializer.MapperTypeNames = {
-	    Base64Url: "Base64Url",
-	    Boolean: "Boolean",
-	    ByteArray: "ByteArray",
-	    Composite: "Composite",
-	    Date: "Date",
-	    DateTime: "DateTime",
-	    DateTimeRfc1123: "DateTimeRfc1123",
-	    Dictionary: "Dictionary",
-	    Enum: "Enum",
-	    Number: "Number",
-	    Object: "Object",
-	    Sequence: "Sequence",
-	    String: "String",
-	    Stream: "Stream",
-	    TimeSpan: "TimeSpan",
-	    UnixTime: "UnixTime",
-	};
-	
-	return serializer;
-}
-
-var serviceClient = {};
-
-var pipeline = {};
-
-var deserializationPolicy = {};
-
-var operationHelpers = {};
-
-var state = {};
-
-var hasRequiredState;
-
-function requireState () {
-	if (hasRequiredState) return state;
-	hasRequiredState = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(state, "__esModule", { value: true });
-	state.state = void 0;
-	/**
-	 * Holds the singleton operationRequestMap, to be shared across CJS and ESM imports.
-	 */
-	state.state = {
-	    operationRequestMap: new WeakMap(),
-	};
-	
-	return state;
-}
-
-var hasRequiredOperationHelpers;
-
-function requireOperationHelpers () {
-	if (hasRequiredOperationHelpers) return operationHelpers;
-	hasRequiredOperationHelpers = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(operationHelpers, "__esModule", { value: true });
-	operationHelpers.getOperationArgumentValueFromParameter = getOperationArgumentValueFromParameter;
-	operationHelpers.getOperationRequestInfo = getOperationRequestInfo;
-	const state_js_1 = requireState();
-	/**
-	 * @internal
-	 * Retrieves the value to use for a given operation argument
-	 * @param operationArguments - The arguments passed from the generated client
-	 * @param parameter - The parameter description
-	 * @param fallbackObject - If something isn't found in the arguments bag, look here.
-	 *  Generally used to look at the service client properties.
-	 */
-	function getOperationArgumentValueFromParameter(operationArguments, parameter, fallbackObject) {
-	    let parameterPath = parameter.parameterPath;
-	    const parameterMapper = parameter.mapper;
-	    let value;
-	    if (typeof parameterPath === "string") {
-	        parameterPath = [parameterPath];
-	    }
-	    if (Array.isArray(parameterPath)) {
-	        if (parameterPath.length > 0) {
-	            if (parameterMapper.isConstant) {
-	                value = parameterMapper.defaultValue;
-	            }
-	            else {
-	                let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
-	                if (!propertySearchResult.propertyFound && fallbackObject) {
-	                    propertySearchResult = getPropertyFromParameterPath(fallbackObject, parameterPath);
-	                }
-	                let useDefaultValue = false;
-	                if (!propertySearchResult.propertyFound) {
-	                    useDefaultValue =
-	                        parameterMapper.required ||
-	                            (parameterPath[0] === "options" && parameterPath.length === 2);
-	                }
-	                value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
-	            }
-	        }
-	    }
-	    else {
-	        if (parameterMapper.required) {
-	            value = {};
-	        }
-	        for (const propertyName in parameterPath) {
-	            const propertyMapper = parameterMapper.type.modelProperties[propertyName];
-	            const propertyPath = parameterPath[propertyName];
-	            const propertyValue = getOperationArgumentValueFromParameter(operationArguments, {
-	                parameterPath: propertyPath,
-	                mapper: propertyMapper,
-	            }, fallbackObject);
-	            if (propertyValue !== undefined) {
-	                if (!value) {
-	                    value = {};
-	                }
-	                value[propertyName] = propertyValue;
-	            }
-	        }
-	    }
-	    return value;
-	}
-	function getPropertyFromParameterPath(parent, parameterPath) {
-	    const result = { propertyFound: false };
-	    let i = 0;
-	    for (; i < parameterPath.length; ++i) {
-	        const parameterPathPart = parameterPath[i];
-	        // Make sure to check inherited properties too, so don't use hasOwnProperty().
-	        if (parent && parameterPathPart in parent) {
-	            parent = parent[parameterPathPart];
-	        }
-	        else {
-	            break;
-	        }
-	    }
-	    if (i === parameterPath.length) {
-	        result.propertyValue = parent;
-	        result.propertyFound = true;
-	    }
-	    return result;
-	}
-	const originalRequestSymbol = Symbol.for("@azure/core-client original request");
-	function hasOriginalRequest(request) {
-	    return originalRequestSymbol in request;
-	}
-	function getOperationRequestInfo(request) {
-	    if (hasOriginalRequest(request)) {
-	        return getOperationRequestInfo(request[originalRequestSymbol]);
-	    }
-	    let info = state_js_1.state.operationRequestMap.get(request);
-	    if (!info) {
-	        info = {};
-	        state_js_1.state.operationRequestMap.set(request, info);
-	    }
-	    return info;
-	}
-	
-	return operationHelpers;
-}
-
-var hasRequiredDeserializationPolicy;
-
-function requireDeserializationPolicy () {
-	if (hasRequiredDeserializationPolicy) return deserializationPolicy;
-	hasRequiredDeserializationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.deserializationPolicyName = void 0;
-		exports$1.deserializationPolicy = deserializationPolicy;
-		const interfaces_js_1 = requireInterfaces();
-		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-		const serializer_js_1 = requireSerializer();
-		const operationHelpers_js_1 = requireOperationHelpers();
-		const defaultJsonContentTypes = ["application/json", "text/json"];
-		const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
-		/**
-		 * The programmatic identifier of the deserializationPolicy.
-		 */
-		exports$1.deserializationPolicyName = "deserializationPolicy";
-		/**
-		 * This policy handles parsing out responses according to OperationSpecs on the request.
-		 */
-		function deserializationPolicy(options = {}) {
-		    const jsonContentTypes = options.expectedContentTypes?.json ?? defaultJsonContentTypes;
-		    const xmlContentTypes = options.expectedContentTypes?.xml ?? defaultXmlContentTypes;
-		    const parseXML = options.parseXML;
-		    const serializerOptions = options.serializerOptions;
-		    const updatedOptions = {
-		        xml: {
-		            rootName: serializerOptions?.xml.rootName ?? "",
-		            includeRoot: serializerOptions?.xml.includeRoot ?? false,
-		            xmlCharKey: serializerOptions?.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
-		        },
-		    };
-		    return {
-		        name: exports$1.deserializationPolicyName,
-		        async sendRequest(request, next) {
-		            const response = await next(request);
-		            return deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, updatedOptions, parseXML);
-		        },
-		    };
-		}
-		function getOperationResponseMap(parsedResponse) {
-		    let result;
-		    const request = parsedResponse.request;
-		    const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
-		    const operationSpec = operationInfo?.operationSpec;
-		    if (operationSpec) {
-		        if (!operationInfo?.operationResponseGetter) {
-		            result = operationSpec.responses[parsedResponse.status];
-		        }
-		        else {
-		            result = operationInfo?.operationResponseGetter(operationSpec, parsedResponse);
-		        }
-		    }
-		    return result;
-		}
-		function shouldDeserializeResponse(parsedResponse) {
-		    const request = parsedResponse.request;
-		    const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
-		    const shouldDeserialize = operationInfo?.shouldDeserialize;
-		    let result;
-		    if (shouldDeserialize === undefined) {
-		        result = true;
-		    }
-		    else if (typeof shouldDeserialize === "boolean") {
-		        result = shouldDeserialize;
-		    }
-		    else {
-		        result = shouldDeserialize(parsedResponse);
-		    }
-		    return result;
-		}
-		async function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options, parseXML) {
-		    const parsedResponse = await parse(jsonContentTypes, xmlContentTypes, response, options, parseXML);
-		    if (!shouldDeserializeResponse(parsedResponse)) {
-		        return parsedResponse;
-		    }
-		    const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(parsedResponse.request);
-		    const operationSpec = operationInfo?.operationSpec;
-		    if (!operationSpec || !operationSpec.responses) {
-		        return parsedResponse;
-		    }
-		    const responseSpec = getOperationResponseMap(parsedResponse);
-		    const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec, options);
-		    if (error) {
-		        throw error;
-		    }
-		    else if (shouldReturnResponse) {
-		        return parsedResponse;
-		    }
-		    // An operation response spec does exist for current status code, so
-		    // use it to deserialize the response.
-		    if (responseSpec) {
-		        if (responseSpec.bodyMapper) {
-		            let valueToDeserialize = parsedResponse.parsedBody;
-		            if (operationSpec.isXML && responseSpec.bodyMapper.type.name === serializer_js_1.MapperTypeNames.Sequence) {
-		                valueToDeserialize =
-		                    typeof valueToDeserialize === "object"
-		                        ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
-		                        : [];
-		            }
-		            try {
-		                parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);
-		            }
-		            catch (deserializeError) {
-		                const restError = new core_rest_pipeline_1.RestError(`Error ${deserializeError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, {
-		                    statusCode: parsedResponse.status,
-		                    request: parsedResponse.request,
-		                    response: parsedResponse,
-		                });
-		                throw restError;
-		            }
-		        }
-		        else if (operationSpec.httpMethod === "HEAD") {
-		            // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
-		            parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
-		        }
-		        if (responseSpec.headersMapper) {
-		            parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders", { xml: {}, ignoreUnknownProperties: true });
-		        }
-		    }
-		    return parsedResponse;
-		}
-		function isOperationSpecEmpty(operationSpec) {
-		    const expectedStatusCodes = Object.keys(operationSpec.responses);
-		    return (expectedStatusCodes.length === 0 ||
-		        (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
-		}
-		function handleErrorResponse(parsedResponse, operationSpec, responseSpec, options) {
-		    const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
-		    const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
-		        ? isSuccessByStatus
-		        : !!responseSpec;
-		    if (isExpectedStatusCode) {
-		        if (responseSpec) {
-		            if (!responseSpec.isError) {
-		                return { error: null, shouldReturnResponse: false };
-		            }
-		        }
-		        else {
-		            return { error: null, shouldReturnResponse: false };
-		        }
-		    }
-		    const errorResponseSpec = responseSpec ?? operationSpec.responses.default;
-		    const initialErrorMessage = parsedResponse.request.streamResponseStatusCodes?.has(parsedResponse.status)
-		        ? `Unexpected status code: ${parsedResponse.status}`
-		        : parsedResponse.bodyAsText;
-		    const error = new core_rest_pipeline_1.RestError(initialErrorMessage, {
-		        statusCode: parsedResponse.status,
-		        request: parsedResponse.request,
-		        response: parsedResponse,
-		    });
-		    // If the item failed but there's no error spec or default spec to deserialize the error,
-		    // and the parsed body doesn't look like an error object,
-		    // we should fail so we just throw the parsed response
-		    if (!errorResponseSpec &&
-		        !(parsedResponse.parsedBody?.error?.code && parsedResponse.parsedBody?.error?.message)) {
-		        throw error;
-		    }
-		    const defaultBodyMapper = errorResponseSpec?.bodyMapper;
-		    const defaultHeadersMapper = errorResponseSpec?.headersMapper;
-		    try {
-		        // If error response has a body, try to deserialize it using default body mapper.
-		        // Then try to extract error code & message from it
-		        if (parsedResponse.parsedBody) {
-		            const parsedBody = parsedResponse.parsedBody;
-		            let deserializedError;
-		            if (defaultBodyMapper) {
-		                let valueToDeserialize = parsedBody;
-		                if (operationSpec.isXML && defaultBodyMapper.type.name === serializer_js_1.MapperTypeNames.Sequence) {
-		                    valueToDeserialize = [];
-		                    const elementName = defaultBodyMapper.xmlElementName;
-		                    if (typeof parsedBody === "object" && elementName) {
-		                        valueToDeserialize = parsedBody[elementName];
-		                    }
-		                }
-		                deserializedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody", options);
-		            }
-		            const internalError = parsedBody.error || deserializedError || parsedBody;
-		            error.code = internalError.code;
-		            if (internalError.message) {
-		                error.message = internalError.message;
-		            }
-		            if (defaultBodyMapper) {
-		                error.response.parsedBody = deserializedError;
-		            }
-		        }
-		        // If error response has headers, try to deserialize it using default header mapper
-		        if (parsedResponse.headers && defaultHeadersMapper) {
-		            error.response.parsedHeaders =
-		                operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
-		        }
-		    }
-		    catch (defaultError) {
-		        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
-		    }
-		    return { error, shouldReturnResponse: false };
-		}
-		async function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts, parseXML) {
-		    if (!operationResponse.request.streamResponseStatusCodes?.has(operationResponse.status) &&
-		        operationResponse.bodyAsText) {
-		        const text = operationResponse.bodyAsText;
-		        const contentType = operationResponse.headers.get("Content-Type") || "";
-		        const contentComponents = !contentType
-		            ? []
-		            : contentType.split(";").map((component) => component.toLowerCase());
-		        try {
-		            if (contentComponents.length === 0 ||
-		                contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
-		                operationResponse.parsedBody = JSON.parse(text);
-		                return operationResponse;
-		            }
-		            else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
-		                if (!parseXML) {
-		                    throw new Error("Parsing XML not supported.");
-		                }
-		                const body = await parseXML(text, opts.xml);
-		                operationResponse.parsedBody = body;
-		                return operationResponse;
-		            }
-		        }
-		        catch (err) {
-		            const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
-		            const errCode = err.code || core_rest_pipeline_1.RestError.PARSE_ERROR;
-		            const e = new core_rest_pipeline_1.RestError(msg, {
-		                code: errCode,
-		                statusCode: operationResponse.status,
-		                request: operationResponse.request,
-		                response: operationResponse,
-		            });
-		            throw e;
-		        }
-		    }
-		    return operationResponse;
-		}
-		
-	} (deserializationPolicy));
-	return deserializationPolicy;
-}
-
-var serializationPolicy = {};
-
-var interfaceHelpers = {};
-
-var hasRequiredInterfaceHelpers;
-
-function requireInterfaceHelpers () {
-	if (hasRequiredInterfaceHelpers) return interfaceHelpers;
-	hasRequiredInterfaceHelpers = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(interfaceHelpers, "__esModule", { value: true });
-	interfaceHelpers.getStreamingResponseStatusCodes = getStreamingResponseStatusCodes;
-	interfaceHelpers.getPathStringFromParameter = getPathStringFromParameter;
-	const serializer_js_1 = requireSerializer();
-	/**
-	 * Gets the list of status codes for streaming responses.
-	 * @internal
-	 */
-	function getStreamingResponseStatusCodes(operationSpec) {
-	    const result = new Set();
-	    for (const statusCode in operationSpec.responses) {
-	        const operationResponse = operationSpec.responses[statusCode];
-	        if (operationResponse.bodyMapper &&
-	            operationResponse.bodyMapper.type.name === serializer_js_1.MapperTypeNames.Stream) {
-	            result.add(Number(statusCode));
-	        }
-	    }
-	    return result;
-	}
-	/**
-	 * Get the path to this parameter's value as a dotted string (a.b.c).
-	 * @param parameter - The parameter to get the path string for.
-	 * @returns The path to this parameter's value as a dotted string.
-	 * @internal
-	 */
-	function getPathStringFromParameter(parameter) {
-	    const { parameterPath, mapper } = parameter;
-	    let result;
-	    if (typeof parameterPath === "string") {
-	        result = parameterPath;
-	    }
-	    else if (Array.isArray(parameterPath)) {
-	        result = parameterPath.join(".");
-	    }
-	    else {
-	        result = mapper.serializedName;
-	    }
-	    return result;
-	}
-	
-	return interfaceHelpers;
-}
-
-var hasRequiredSerializationPolicy;
-
-function requireSerializationPolicy () {
-	if (hasRequiredSerializationPolicy) return serializationPolicy;
-	hasRequiredSerializationPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.serializationPolicyName = void 0;
-		exports$1.serializationPolicy = serializationPolicy;
-		exports$1.serializeHeaders = serializeHeaders;
-		exports$1.serializeRequestBody = serializeRequestBody;
-		const interfaces_js_1 = requireInterfaces();
-		const operationHelpers_js_1 = requireOperationHelpers();
-		const serializer_js_1 = requireSerializer();
-		const interfaceHelpers_js_1 = requireInterfaceHelpers();
-		/**
-		 * The programmatic identifier of the serializationPolicy.
-		 */
-		exports$1.serializationPolicyName = "serializationPolicy";
-		/**
-		 * This policy handles assembling the request body and headers using
-		 * an OperationSpec and OperationArguments on the request.
-		 */
-		function serializationPolicy(options = {}) {
-		    const stringifyXML = options.stringifyXML;
-		    return {
-		        name: exports$1.serializationPolicyName,
-		        async sendRequest(request, next) {
-		            const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
-		            const operationSpec = operationInfo?.operationSpec;
-		            const operationArguments = operationInfo?.operationArguments;
-		            if (operationSpec && operationArguments) {
-		                serializeHeaders(request, operationArguments, operationSpec);
-		                serializeRequestBody(request, operationArguments, operationSpec, stringifyXML);
-		            }
-		            return next(request);
-		        },
-		    };
-		}
-		/**
-		 * @internal
-		 */
-		function serializeHeaders(request, operationArguments, operationSpec) {
-		    if (operationSpec.headerParameters) {
-		        for (const headerParameter of operationSpec.headerParameters) {
-		            let headerValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, headerParameter);
-		            if ((headerValue !== null && headerValue !== undefined) || headerParameter.mapper.required) {
-		                headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(headerParameter));
-		                const headerCollectionPrefix = headerParameter.mapper
-		                    .headerCollectionPrefix;
-		                if (headerCollectionPrefix) {
-		                    for (const key of Object.keys(headerValue)) {
-		                        request.headers.set(headerCollectionPrefix + key, headerValue[key]);
-		                    }
-		                }
-		                else {
-		                    request.headers.set(headerParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(headerParameter), headerValue);
-		                }
-		            }
-		        }
-		    }
-		    const customHeaders = operationArguments.options?.requestOptions?.customHeaders;
-		    if (customHeaders) {
-		        for (const customHeaderName of Object.keys(customHeaders)) {
-		            request.headers.set(customHeaderName, customHeaders[customHeaderName]);
-		        }
-		    }
-		}
-		/**
-		 * @internal
-		 */
-		function serializeRequestBody(request, operationArguments, operationSpec, stringifyXML = function () {
-		    throw new Error("XML serialization unsupported!");
-		}) {
-		    const serializerOptions = operationArguments.options?.serializerOptions;
-		    const updatedOptions = {
-		        xml: {
-		            rootName: serializerOptions?.xml.rootName ?? "",
-		            includeRoot: serializerOptions?.xml.includeRoot ?? false,
-		            xmlCharKey: serializerOptions?.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
-		        },
-		    };
-		    const xmlCharKey = updatedOptions.xml.xmlCharKey;
-		    if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
-		        request.body = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, operationSpec.requestBody);
-		        const bodyMapper = operationSpec.requestBody.mapper;
-		        const { required, serializedName, xmlName, xmlElementName, xmlNamespace, xmlNamespacePrefix, nullable, } = bodyMapper;
-		        const typeName = bodyMapper.type.name;
-		        try {
-		            if ((request.body !== undefined && request.body !== null) ||
-		                (nullable && request.body === null) ||
-		                required) {
-		                const requestBodyParameterPathString = (0, interfaceHelpers_js_1.getPathStringFromParameter)(operationSpec.requestBody);
-		                request.body = operationSpec.serializer.serialize(bodyMapper, request.body, requestBodyParameterPathString, updatedOptions);
-		                const isStream = typeName === serializer_js_1.MapperTypeNames.Stream;
-		                if (operationSpec.isXML) {
-		                    const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
-		                    const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, request.body, updatedOptions);
-		                    if (typeName === serializer_js_1.MapperTypeNames.Sequence) {
-		                        request.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), { rootName: xmlName || serializedName, xmlCharKey });
-		                    }
-		                    else if (!isStream) {
-		                        request.body = stringifyXML(value, {
-		                            rootName: xmlName || serializedName,
-		                            xmlCharKey,
-		                        });
-		                    }
-		                }
-		                else if (typeName === serializer_js_1.MapperTypeNames.String &&
-		                    (operationSpec.contentType?.match("text/plain") || operationSpec.mediaType === "text")) {
-		                    // the String serializer has validated that request body is a string
-		                    // so just send the string.
-		                    return;
-		                }
-		                else if (!isStream) {
-		                    request.body = JSON.stringify(request.body);
-		                }
-		            }
-		        }
-		        catch (error) {
-		            throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, "  ")}.`);
-		        }
-		    }
-		    else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
-		        request.formData = {};
-		        for (const formDataParameter of operationSpec.formDataParameters) {
-		            const formDataParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, formDataParameter);
-		            if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
-		                const formDataParameterPropertyName = formDataParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(formDataParameter);
-		                request.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(formDataParameter), updatedOptions);
-		            }
-		        }
-		    }
-		}
-		/**
-		 * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
-		 */
-		function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
-		    // Composite and Sequence schemas already got their root namespace set during serialization
-		    // We just need to add xmlns to the other schema types
-		    if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
-		        const result = {};
-		        result[options.xml.xmlCharKey] = serializedValue;
-		        result[interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
-		        return result;
-		    }
-		    return serializedValue;
-		}
-		function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
-		    if (!Array.isArray(obj)) {
-		        obj = [obj];
-		    }
-		    if (!xmlNamespaceKey || !xmlNamespace) {
-		        return { [elementName]: obj };
-		    }
-		    const result = { [elementName]: obj };
-		    result[interfaces_js_1.XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
-		    return result;
-		}
-		
-	} (serializationPolicy));
-	return serializationPolicy;
-}
-
-var hasRequiredPipeline$1;
-
-function requirePipeline$1 () {
-	if (hasRequiredPipeline$1) return pipeline;
-	hasRequiredPipeline$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(pipeline, "__esModule", { value: true });
-	pipeline.createClientPipeline = createClientPipeline;
-	const deserializationPolicy_js_1 = requireDeserializationPolicy();
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const serializationPolicy_js_1 = requireSerializationPolicy();
-	/**
-	 * Creates a new Pipeline for use with a Service Client.
-	 * Adds in deserializationPolicy by default.
-	 * Also adds in bearerTokenAuthenticationPolicy if passed a TokenCredential.
-	 * @param options - Options to customize the created pipeline.
-	 */
-	function createClientPipeline(options = {}) {
-	    const pipeline = (0, core_rest_pipeline_1.createPipelineFromOptions)(options ?? {});
-	    if (options.credentialOptions) {
-	        pipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({
-	            credential: options.credentialOptions.credential,
-	            scopes: options.credentialOptions.credentialScopes,
-	        }));
-	    }
-	    pipeline.addPolicy((0, serializationPolicy_js_1.serializationPolicy)(options.serializationOptions), { phase: "Serialize" });
-	    pipeline.addPolicy((0, deserializationPolicy_js_1.deserializationPolicy)(options.deserializationOptions), {
-	        phase: "Deserialize",
-	    });
-	    return pipeline;
-	}
-	
-	return pipeline;
-}
-
-var httpClientCache = {};
-
-var hasRequiredHttpClientCache;
-
-function requireHttpClientCache () {
-	if (hasRequiredHttpClientCache) return httpClientCache;
-	hasRequiredHttpClientCache = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(httpClientCache, "__esModule", { value: true });
-	httpClientCache.getCachedDefaultHttpClient = getCachedDefaultHttpClient;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	let cachedHttpClient;
-	function getCachedDefaultHttpClient() {
-	    if (!cachedHttpClient) {
-	        cachedHttpClient = (0, core_rest_pipeline_1.createDefaultHttpClient)();
-	    }
-	    return cachedHttpClient;
-	}
-	
-	return httpClientCache;
-}
-
-var urlHelpers = {};
-
-var hasRequiredUrlHelpers;
-
-function requireUrlHelpers () {
-	if (hasRequiredUrlHelpers) return urlHelpers;
-	hasRequiredUrlHelpers = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(urlHelpers, "__esModule", { value: true });
-	urlHelpers.getRequestUrl = getRequestUrl;
-	urlHelpers.appendQueryParams = appendQueryParams;
-	const operationHelpers_js_1 = requireOperationHelpers();
-	const interfaceHelpers_js_1 = requireInterfaceHelpers();
-	const CollectionFormatToDelimiterMap = {
-	    CSV: ",",
-	    SSV: " ",
-	    Multi: "Multi",
-	    TSV: "\t",
-	    Pipes: "|",
-	};
-	function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
-	    const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject);
-	    let isAbsolutePath = false;
-	    let requestUrl = replaceAll(baseUri, urlReplacements);
-	    if (operationSpec.path) {
-	        let path = replaceAll(operationSpec.path, urlReplacements);
-	        // QUIRK: sometimes we get a path component like /{nextLink}
-	        // which may be a fully formed URL with a leading /. In that case, we should
-	        // remove the leading /
-	        if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
-	            path = path.substring(1);
-	        }
-	        // QUIRK: sometimes we get a path component like {nextLink}
-	        // which may be a fully formed URL. In that case, we should
-	        // ignore the baseUri.
-	        if (isAbsoluteUrl(path)) {
-	            requestUrl = path;
-	            isAbsolutePath = true;
-	        }
-	        else {
-	            requestUrl = appendPath(requestUrl, path);
-	        }
-	    }
-	    const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject);
-	    /**
-	     * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`
-	     * is an absolute path. This ensures that existing query parameter values in `requestUrl`
-	     * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it
-	     * is still being built so there is nothing to overwrite.
-	     */
-	    requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
-	    return requestUrl;
-	}
-	function replaceAll(input, replacements) {
-	    let result = input;
-	    for (const [searchValue, replaceValue] of replacements) {
-	        result = result.split(searchValue).join(replaceValue);
-	    }
-	    return result;
-	}
-	function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) {
-	    const result = new Map();
-	    if (operationSpec.urlParameters?.length) {
-	        for (const urlParameter of operationSpec.urlParameters) {
-	            let urlParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, urlParameter, fallbackObject);
-	            const parameterPathString = (0, interfaceHelpers_js_1.getPathStringFromParameter)(urlParameter);
-	            urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString);
-	            if (!urlParameter.skipEncoding) {
-	                urlParameterValue = encodeURIComponent(urlParameterValue);
-	            }
-	            result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue);
-	        }
-	    }
-	    return result;
-	}
-	function isAbsoluteUrl(url) {
-	    return url.includes("://");
-	}
-	function appendPath(url, pathToAppend) {
-	    if (!pathToAppend) {
-	        return url;
-	    }
-	    const parsedUrl = new URL(url);
-	    let newPath = parsedUrl.pathname;
-	    if (!newPath.endsWith("/")) {
-	        newPath = `${newPath}/`;
-	    }
-	    if (pathToAppend.startsWith("/")) {
-	        pathToAppend = pathToAppend.substring(1);
-	    }
-	    const searchStart = pathToAppend.indexOf("?");
-	    if (searchStart !== -1) {
-	        const path = pathToAppend.substring(0, searchStart);
-	        const search = pathToAppend.substring(searchStart + 1);
-	        newPath = newPath + path;
-	        if (search) {
-	            parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
-	        }
-	    }
-	    else {
-	        newPath = newPath + pathToAppend;
-	    }
-	    parsedUrl.pathname = newPath;
-	    return parsedUrl.toString();
-	}
-	function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) {
-	    const result = new Map();
-	    const sequenceParams = new Set();
-	    if (operationSpec.queryParameters?.length) {
-	        for (const queryParameter of operationSpec.queryParameters) {
-	            if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
-	                sequenceParams.add(queryParameter.mapper.serializedName);
-	            }
-	            let queryParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, queryParameter, fallbackObject);
-	            if ((queryParameterValue !== undefined && queryParameterValue !== null) ||
-	                queryParameter.mapper.required) {
-	                queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(queryParameter));
-	                const delimiter = queryParameter.collectionFormat
-	                    ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]
-	                    : "";
-	                if (Array.isArray(queryParameterValue)) {
-	                    // replace null and undefined
-	                    queryParameterValue = queryParameterValue.map((item) => {
-	                        if (item === null || item === undefined) {
-	                            return "";
-	                        }
-	                        return item;
-	                    });
-	                }
-	                if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
-	                    continue;
-	                }
-	                else if (Array.isArray(queryParameterValue) &&
-	                    (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
-	                    queryParameterValue = queryParameterValue.join(delimiter);
-	                }
-	                if (!queryParameter.skipEncoding) {
-	                    if (Array.isArray(queryParameterValue)) {
-	                        queryParameterValue = queryParameterValue.map((item) => {
-	                            return encodeURIComponent(item);
-	                        });
-	                    }
-	                    else {
-	                        queryParameterValue = encodeURIComponent(queryParameterValue);
-	                    }
-	                }
-	                // Join pipes and CSV *after* encoding, or the server will be upset.
-	                if (Array.isArray(queryParameterValue) &&
-	                    (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
-	                    queryParameterValue = queryParameterValue.join(delimiter);
-	                }
-	                result.set(queryParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(queryParameter), queryParameterValue);
-	            }
-	        }
-	    }
-	    return {
-	        queryParams: result,
-	        sequenceParams,
-	    };
-	}
-	function simpleParseQueryParams(queryString) {
-	    const result = new Map();
-	    if (!queryString || queryString[0] !== "?") {
-	        return result;
-	    }
-	    // remove the leading ?
-	    queryString = queryString.slice(1);
-	    const pairs = queryString.split("&");
-	    for (const pair of pairs) {
-	        const [name, value] = pair.split("=", 2);
-	        const existingValue = result.get(name);
-	        if (existingValue) {
-	            if (Array.isArray(existingValue)) {
-	                existingValue.push(value);
-	            }
-	            else {
-	                result.set(name, [existingValue, value]);
-	            }
-	        }
-	        else {
-	            result.set(name, value);
-	        }
-	    }
-	    return result;
-	}
-	/** @internal */
-	function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
-	    if (queryParams.size === 0) {
-	        return url;
-	    }
-	    const parsedUrl = new URL(url);
-	    // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which
-	    // can change their meaning to the server, such as in the case of a SAS signature.
-	    // To avoid accidentally un-encoding a query param, we parse the key/values ourselves
-	    const combinedParams = simpleParseQueryParams(parsedUrl.search);
-	    for (const [name, value] of queryParams) {
-	        const existingValue = combinedParams.get(name);
-	        if (Array.isArray(existingValue)) {
-	            if (Array.isArray(value)) {
-	                existingValue.push(...value);
-	                const valueSet = new Set(existingValue);
-	                combinedParams.set(name, Array.from(valueSet));
-	            }
-	            else {
-	                existingValue.push(value);
-	            }
-	        }
-	        else if (existingValue) {
-	            if (Array.isArray(value)) {
-	                value.unshift(existingValue);
-	            }
-	            else if (sequenceParams.has(name)) {
-	                combinedParams.set(name, [existingValue, value]);
-	            }
-	            if (!noOverwrite) {
-	                combinedParams.set(name, value);
-	            }
-	        }
-	        else {
-	            combinedParams.set(name, value);
-	        }
-	    }
-	    const searchPieces = [];
-	    for (const [name, value] of combinedParams) {
-	        if (typeof value === "string") {
-	            searchPieces.push(`${name}=${value}`);
-	        }
-	        else if (Array.isArray(value)) {
-	            // QUIRK: If we get an array of values, include multiple key/value pairs
-	            for (const subValue of value) {
-	                searchPieces.push(`${name}=${subValue}`);
-	            }
-	        }
-	        else {
-	            searchPieces.push(`${name}=${value}`);
-	        }
-	    }
-	    // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.
-	    parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
-	    return parsedUrl.toString();
-	}
-	
-	return urlHelpers;
-}
-
-var log$2 = {};
-
-var hasRequiredLog$2;
-
-function requireLog$2 () {
-	if (hasRequiredLog$2) return log$2;
-	hasRequiredLog$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(log$2, "__esModule", { value: true });
-	log$2.logger = void 0;
-	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
-	log$2.logger = (0, logger_1.createClientLogger)("core-client");
-	
-	return log$2;
-}
-
-var hasRequiredServiceClient;
-
-function requireServiceClient () {
-	if (hasRequiredServiceClient) return serviceClient;
-	hasRequiredServiceClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(serviceClient, "__esModule", { value: true });
-	serviceClient.ServiceClient = void 0;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const pipeline_js_1 = requirePipeline$1();
-	const utils_js_1 = requireUtils$4();
-	const httpClientCache_js_1 = requireHttpClientCache();
-	const operationHelpers_js_1 = requireOperationHelpers();
-	const urlHelpers_js_1 = requireUrlHelpers();
-	const interfaceHelpers_js_1 = requireInterfaceHelpers();
-	const log_js_1 = requireLog$2();
-	/**
-	 * Initializes a new instance of the ServiceClient.
-	 */
-	class ServiceClient {
-	    /**
-	     * If specified, this is the base URI that requests will be made against for this ServiceClient.
-	     * If it is not specified, then all OperationSpecs must contain a baseUrl property.
-	     */
-	    _endpoint;
-	    /**
-	     * The default request content type for the service.
-	     * Used if no requestContentType is present on an OperationSpec.
-	     */
-	    _requestContentType;
-	    /**
-	     * Set to true if the request is sent over HTTP instead of HTTPS
-	     */
-	    _allowInsecureConnection;
-	    /**
-	     * The HTTP client that will be used to send requests.
-	     */
-	    _httpClient;
-	    /**
-	     * The pipeline used by this client to make requests
-	     */
-	    pipeline;
-	    /**
-	     * The ServiceClient constructor
-	     * @param options - The service client options that govern the behavior of the client.
-	     */
-	    constructor(options = {}) {
-	        this._requestContentType = options.requestContentType;
-	        this._endpoint = options.endpoint ?? options.baseUri;
-	        if (options.baseUri) {
-	            log_js_1.logger.warning("The baseUri option for SDK Clients has been deprecated, please use endpoint instead.");
-	        }
-	        this._allowInsecureConnection = options.allowInsecureConnection;
-	        this._httpClient = options.httpClient || (0, httpClientCache_js_1.getCachedDefaultHttpClient)();
-	        this.pipeline = options.pipeline || createDefaultPipeline(options);
-	        if (options.additionalPolicies?.length) {
-	            for (const { policy, position } of options.additionalPolicies) {
-	                // Sign happens after Retry and is commonly needed to occur
-	                // before policies that intercept post-retry.
-	                const afterPhase = position === "perRetry" ? "Sign" : undefined;
-	                this.pipeline.addPolicy(policy, {
-	                    afterPhase,
-	                });
-	            }
-	        }
-	    }
-	    /**
-	     * Send the provided httpRequest.
-	     */
-	    async sendRequest(request) {
-	        return this.pipeline.sendRequest(this._httpClient, request);
-	    }
-	    /**
-	     * Send an HTTP request that is populated using the provided OperationSpec.
-	     * @typeParam T - The typed result of the request, based on the OperationSpec.
-	     * @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
-	     * @param operationSpec - The OperationSpec to use to populate the httpRequest.
-	     */
-	    async sendOperationRequest(operationArguments, operationSpec) {
-	        const endpoint = operationSpec.baseUrl || this._endpoint;
-	        if (!endpoint) {
-	            throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use.");
-	        }
-	        // Templatized URLs sometimes reference properties on the ServiceClient child class,
-	        // so we have to pass `this` below in order to search these properties if they're
-	        // not part of OperationArguments
-	        const url = (0, urlHelpers_js_1.getRequestUrl)(endpoint, operationSpec, operationArguments, this);
-	        const request = (0, core_rest_pipeline_1.createPipelineRequest)({
-	            url,
-	        });
-	        request.method = operationSpec.httpMethod;
-	        const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
-	        operationInfo.operationSpec = operationSpec;
-	        operationInfo.operationArguments = operationArguments;
-	        const contentType = operationSpec.contentType || this._requestContentType;
-	        if (contentType && operationSpec.requestBody) {
-	            request.headers.set("Content-Type", contentType);
-	        }
-	        const options = operationArguments.options;
-	        if (options) {
-	            const requestOptions = options.requestOptions;
-	            if (requestOptions) {
-	                if (requestOptions.timeout) {
-	                    request.timeout = requestOptions.timeout;
-	                }
-	                if (requestOptions.onUploadProgress) {
-	                    request.onUploadProgress = requestOptions.onUploadProgress;
-	                }
-	                if (requestOptions.onDownloadProgress) {
-	                    request.onDownloadProgress = requestOptions.onDownloadProgress;
-	                }
-	                if (requestOptions.shouldDeserialize !== undefined) {
-	                    operationInfo.shouldDeserialize = requestOptions.shouldDeserialize;
-	                }
-	                if (requestOptions.allowInsecureConnection) {
-	                    request.allowInsecureConnection = true;
-	                }
-	            }
-	            if (options.abortSignal) {
-	                request.abortSignal = options.abortSignal;
-	            }
-	            if (options.tracingOptions) {
-	                request.tracingOptions = options.tracingOptions;
-	            }
-	        }
-	        if (this._allowInsecureConnection) {
-	            request.allowInsecureConnection = true;
-	        }
-	        if (request.streamResponseStatusCodes === undefined) {
-	            request.streamResponseStatusCodes = (0, interfaceHelpers_js_1.getStreamingResponseStatusCodes)(operationSpec);
-	        }
-	        try {
-	            const rawResponse = await this.sendRequest(request);
-	            const flatResponse = (0, utils_js_1.flattenResponse)(rawResponse, operationSpec.responses[rawResponse.status]);
-	            if (options?.onResponse) {
-	                options.onResponse(rawResponse, flatResponse);
-	            }
-	            return flatResponse;
-	        }
-	        catch (error) {
-	            if (typeof error === "object" && error?.response) {
-	                const rawResponse = error.response;
-	                const flatResponse = (0, utils_js_1.flattenResponse)(rawResponse, operationSpec.responses[error.statusCode] || operationSpec.responses["default"]);
-	                error.details = flatResponse;
-	                if (options?.onResponse) {
-	                    options.onResponse(rawResponse, flatResponse, error);
-	                }
-	            }
-	            throw error;
-	        }
-	    }
-	}
-	serviceClient.ServiceClient = ServiceClient;
-	function createDefaultPipeline(options) {
-	    const credentialScopes = getCredentialScopes(options);
-	    const credentialOptions = options.credential && credentialScopes
-	        ? { credentialScopes, credential: options.credential }
-	        : undefined;
-	    return (0, pipeline_js_1.createClientPipeline)({
-	        ...options,
-	        credentialOptions,
-	    });
-	}
-	function getCredentialScopes(options) {
-	    if (options.credentialScopes) {
-	        return options.credentialScopes;
-	    }
-	    if (options.endpoint) {
-	        return `${options.endpoint}/.default`;
-	    }
-	    if (options.baseUri) {
-	        return `${options.baseUri}/.default`;
-	    }
-	    if (options.credential && !options.credentialScopes) {
-	        throw new Error(`When using credentials, the ServiceClientOptions must contain either a endpoint or a credentialScopes. Unable to create a bearerTokenAuthenticationPolicy`);
-	    }
-	    return undefined;
-	}
-	
-	return serviceClient;
-}
-
-var authorizeRequestOnClaimChallenge = {};
-
-var hasRequiredAuthorizeRequestOnClaimChallenge;
-
-function requireAuthorizeRequestOnClaimChallenge () {
-	if (hasRequiredAuthorizeRequestOnClaimChallenge) return authorizeRequestOnClaimChallenge;
-	hasRequiredAuthorizeRequestOnClaimChallenge = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(authorizeRequestOnClaimChallenge, "__esModule", { value: true });
-	authorizeRequestOnClaimChallenge.parseCAEChallenge = parseCAEChallenge;
-	authorizeRequestOnClaimChallenge.authorizeRequestOnClaimChallenge = authorizeRequestOnClaimChallenge$1;
-	const log_js_1 = requireLog$2();
-	const base64_js_1 = requireBase64();
-	/**
-	 * Converts: `Bearer a="b", c="d", Bearer d="e", f="g"`.
-	 * Into: `[ { a: 'b', c: 'd' }, { d: 'e', f: 'g' } ]`.
-	 *
-	 * @internal
-	 */
-	function parseCAEChallenge(challenges) {
-	    const bearerChallenges = `, ${challenges.trim()}`.split(", Bearer ").filter((x) => x);
-	    return bearerChallenges.map((challenge) => {
-	        const challengeParts = `${challenge.trim()}, `.split('", ').filter((x) => x);
-	        const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split('="')));
-	        // Key-value pairs to plain object:
-	        return keyValuePairs.reduce((a, b) => ({ ...a, ...b }), {});
-	    });
-	}
-	/**
-	 * This function can be used as a callback for the `bearerTokenAuthenticationPolicy` of `@azure/core-rest-pipeline`, to support CAE challenges:
-	 * [Continuous Access Evaluation](https://learn.microsoft.com/azure/active-directory/conditional-access/concept-continuous-access-evaluation).
-	 *
-	 * Call the `bearerTokenAuthenticationPolicy` with the following options:
-	 *
-	 * ```ts snippet:AuthorizeRequestOnClaimChallenge
-	 * import { bearerTokenAuthenticationPolicy } from "@azure/core-rest-pipeline";
-	 * import { authorizeRequestOnClaimChallenge } from "@azure/core-client";
-	 *
-	 * const policy = bearerTokenAuthenticationPolicy({
-	 *   challengeCallbacks: {
-	 *     authorizeRequestOnChallenge: authorizeRequestOnClaimChallenge,
-	 *   },
-	 *   scopes: ["https://service/.default"],
-	 * });
-	 * ```
-	 *
-	 * Once provided, the `bearerTokenAuthenticationPolicy` policy will internally handle Continuous Access Evaluation (CAE) challenges.
-	 * When it can't complete a challenge it will return the 401 (unauthorized) response from ARM.
-	 *
-	 * Example challenge with claims:
-	 *
-	 * ```
-	 * Bearer authorization_uri="https://login.windows-ppe.net/", error="invalid_token",
-	 * error_description="User session has been revoked",
-	 * claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwMzc0MjgwMCJ9fX0="
-	 * ```
-	 */
-	async function authorizeRequestOnClaimChallenge$1(onChallengeOptions) {
-	    const { scopes, response } = onChallengeOptions;
-	    const logger = onChallengeOptions.logger || log_js_1.logger;
-	    const challenge = response.headers.get("WWW-Authenticate");
-	    if (!challenge) {
-	        logger.info(`The WWW-Authenticate header was missing. Failed to perform the Continuous Access Evaluation authentication flow.`);
-	        return false;
-	    }
-	    const challenges = parseCAEChallenge(challenge) || [];
-	    const parsedChallenge = challenges.find((x) => x.claims);
-	    if (!parsedChallenge) {
-	        logger.info(`The WWW-Authenticate header was missing the necessary "claims" to perform the Continuous Access Evaluation authentication flow.`);
-	        return false;
-	    }
-	    const accessToken = await onChallengeOptions.getAccessToken(parsedChallenge.scope ? [parsedChallenge.scope] : scopes, {
-	        claims: (0, base64_js_1.decodeStringToString)(parsedChallenge.claims),
-	    });
-	    if (!accessToken) {
-	        return false;
-	    }
-	    onChallengeOptions.request.headers.set("Authorization", `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
-	    return true;
-	}
-	
-	return authorizeRequestOnClaimChallenge;
-}
-
-var authorizeRequestOnTenantChallenge = {};
-
-var hasRequiredAuthorizeRequestOnTenantChallenge;
-
-function requireAuthorizeRequestOnTenantChallenge () {
-	if (hasRequiredAuthorizeRequestOnTenantChallenge) return authorizeRequestOnTenantChallenge;
-	hasRequiredAuthorizeRequestOnTenantChallenge = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(authorizeRequestOnTenantChallenge, "__esModule", { value: true });
-	authorizeRequestOnTenantChallenge.authorizeRequestOnTenantChallenge = void 0;
-	/**
-	 * A set of constants used internally when processing requests.
-	 */
-	const Constants = {
-	    DefaultScope: "/.default",
-	    /**
-	     * Defines constants for use with HTTP headers.
-	     */
-	    HeaderConstants: {
-	        /**
-	         * The Authorization header.
-	         */
-	        AUTHORIZATION: "authorization",
-	    },
-	};
-	function isUuid(text) {
-	    return /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/.test(text);
-	}
-	/**
-	 * Defines a callback to handle auth challenge for Storage APIs.
-	 * This implements the bearer challenge process described here: https://learn.microsoft.com/rest/api/storageservices/authorize-with-azure-active-directory#bearer-challenge
-	 * Handling has specific features for storage that departs to the general AAD challenge docs.
-	 **/
-	const authorizeRequestOnTenantChallenge$1 = async (challengeOptions) => {
-	    const requestOptions = requestToOptions(challengeOptions.request);
-	    const challenge = getChallenge(challengeOptions.response);
-	    if (challenge) {
-	        const challengeInfo = parseChallenge(challenge);
-	        const challengeScopes = buildScopes(challengeOptions, challengeInfo);
-	        const tenantId = extractTenantId(challengeInfo);
-	        if (!tenantId) {
-	            return false;
-	        }
-	        const accessToken = await challengeOptions.getAccessToken(challengeScopes, {
-	            ...requestOptions,
-	            tenantId,
-	        });
-	        if (!accessToken) {
-	            return false;
-	        }
-	        challengeOptions.request.headers.set(Constants.HeaderConstants.AUTHORIZATION, `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
-	        return true;
-	    }
-	    return false;
-	};
-	authorizeRequestOnTenantChallenge.authorizeRequestOnTenantChallenge = authorizeRequestOnTenantChallenge$1;
-	/**
-	 * Extracts the tenant id from the challenge information
-	 * The tenant id is contained in the authorization_uri as the first
-	 * path part.
-	 */
-	function extractTenantId(challengeInfo) {
-	    const parsedAuthUri = new URL(challengeInfo.authorization_uri);
-	    const pathSegments = parsedAuthUri.pathname.split("/");
-	    const tenantId = pathSegments[1];
-	    if (tenantId && isUuid(tenantId)) {
-	        return tenantId;
-	    }
-	    return undefined;
-	}
-	/**
-	 * Builds the authentication scopes based on the information that comes in the
-	 * challenge information. Scopes url is present in the resource_id, if it is empty
-	 * we keep using the original scopes.
-	 */
-	function buildScopes(challengeOptions, challengeInfo) {
-	    if (!challengeInfo.resource_id) {
-	        return challengeOptions.scopes;
-	    }
-	    const challengeScopes = new URL(challengeInfo.resource_id);
-	    challengeScopes.pathname = Constants.DefaultScope;
-	    let scope = challengeScopes.toString();
-	    if (scope === "https://disk.azure.com/.default") {
-	        // the extra slash is required by the service
-	        scope = "https://disk.azure.com//.default";
-	    }
-	    return [scope];
-	}
-	/**
-	 * We will retrieve the challenge only if the response status code was 401,
-	 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
-	 */
-	function getChallenge(response) {
-	    const challenge = response.headers.get("WWW-Authenticate");
-	    if (response.status === 401 && challenge) {
-	        return challenge;
-	    }
-	    return;
-	}
-	/**
-	 * Converts: `Bearer a="b" c="d"`.
-	 * Into: `[ { a: 'b', c: 'd' }]`.
-	 *
-	 * @internal
-	 */
-	function parseChallenge(challenge) {
-	    const bearerChallenge = challenge.slice("Bearer ".length);
-	    const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);
-	    const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));
-	    // Key-value pairs to plain object:
-	    return keyValuePairs.reduce((a, b) => ({ ...a, ...b }), {});
-	}
-	/**
-	 * Extracts the options form a Pipeline Request for later re-use
-	 */
-	function requestToOptions(request) {
-	    return {
-	        abortSignal: request.abortSignal,
-	        requestOptions: {
-	            timeout: request.timeout,
-	        },
-	        tracingOptions: request.tracingOptions,
-	    };
-	}
-	
-	return authorizeRequestOnTenantChallenge;
-}
-
-var hasRequiredCommonjs$7;
-
-function requireCommonjs$7 () {
-	if (hasRequiredCommonjs$7) return commonjs$5;
-	hasRequiredCommonjs$7 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.authorizeRequestOnTenantChallenge = exports$1.authorizeRequestOnClaimChallenge = exports$1.serializationPolicyName = exports$1.serializationPolicy = exports$1.deserializationPolicyName = exports$1.deserializationPolicy = exports$1.XML_CHARKEY = exports$1.XML_ATTRKEY = exports$1.createClientPipeline = exports$1.ServiceClient = exports$1.MapperTypeNames = exports$1.createSerializer = void 0;
-		var serializer_js_1 = requireSerializer();
-		Object.defineProperty(exports$1, "createSerializer", { enumerable: true, get: function () { return serializer_js_1.createSerializer; } });
-		Object.defineProperty(exports$1, "MapperTypeNames", { enumerable: true, get: function () { return serializer_js_1.MapperTypeNames; } });
-		var serviceClient_js_1 = requireServiceClient();
-		Object.defineProperty(exports$1, "ServiceClient", { enumerable: true, get: function () { return serviceClient_js_1.ServiceClient; } });
-		var pipeline_js_1 = requirePipeline$1();
-		Object.defineProperty(exports$1, "createClientPipeline", { enumerable: true, get: function () { return pipeline_js_1.createClientPipeline; } });
-		var interfaces_js_1 = requireInterfaces();
-		Object.defineProperty(exports$1, "XML_ATTRKEY", { enumerable: true, get: function () { return interfaces_js_1.XML_ATTRKEY; } });
-		Object.defineProperty(exports$1, "XML_CHARKEY", { enumerable: true, get: function () { return interfaces_js_1.XML_CHARKEY; } });
-		var deserializationPolicy_js_1 = requireDeserializationPolicy();
-		Object.defineProperty(exports$1, "deserializationPolicy", { enumerable: true, get: function () { return deserializationPolicy_js_1.deserializationPolicy; } });
-		Object.defineProperty(exports$1, "deserializationPolicyName", { enumerable: true, get: function () { return deserializationPolicy_js_1.deserializationPolicyName; } });
-		var serializationPolicy_js_1 = requireSerializationPolicy();
-		Object.defineProperty(exports$1, "serializationPolicy", { enumerable: true, get: function () { return serializationPolicy_js_1.serializationPolicy; } });
-		Object.defineProperty(exports$1, "serializationPolicyName", { enumerable: true, get: function () { return serializationPolicy_js_1.serializationPolicyName; } });
-		var authorizeRequestOnClaimChallenge_js_1 = requireAuthorizeRequestOnClaimChallenge();
-		Object.defineProperty(exports$1, "authorizeRequestOnClaimChallenge", { enumerable: true, get: function () { return authorizeRequestOnClaimChallenge_js_1.authorizeRequestOnClaimChallenge; } });
-		var authorizeRequestOnTenantChallenge_js_1 = requireAuthorizeRequestOnTenantChallenge();
-		Object.defineProperty(exports$1, "authorizeRequestOnTenantChallenge", { enumerable: true, get: function () { return authorizeRequestOnTenantChallenge_js_1.authorizeRequestOnTenantChallenge; } });
-		
-	} (commonjs$5));
-	return commonjs$5;
-}
-
-var response = {};
-
-var util$1 = {};
-
-var hasRequiredUtil$1;
-
-function requireUtil$1 () {
-	if (hasRequiredUtil$1) return util$1;
-	hasRequiredUtil$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(util$1, "__esModule", { value: true });
-	util$1.HttpHeaders = void 0;
-	util$1.toPipelineRequest = toPipelineRequest;
-	util$1.toWebResourceLike = toWebResourceLike;
-	util$1.toHttpHeadersLike = toHttpHeadersLike;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	// We use a custom symbol to cache a reference to the original request without
-	// exposing it on the public interface.
-	const originalRequestSymbol = Symbol("Original PipelineRequest");
-	// Symbol.for() will return the same symbol if it's already been created
-	// This particular one is used in core-client to handle the case of when a request is
-	// cloned but we need to retrieve the OperationSpec and OperationArguments from the
-	// original request.
-	const originalClientRequestSymbol = Symbol.for("@azure/core-client original request");
-	function toPipelineRequest(webResource, options = {}) {
-	    const compatWebResource = webResource;
-	    const request = compatWebResource[originalRequestSymbol];
-	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)(webResource.headers.toJson({ preserveCase: true }));
-	    if (request) {
-	        request.headers = headers;
-	        return request;
-	    }
-	    else {
-	        const newRequest = (0, core_rest_pipeline_1.createPipelineRequest)({
-	            url: webResource.url,
-	            method: webResource.method,
-	            headers,
-	            withCredentials: webResource.withCredentials,
-	            timeout: webResource.timeout,
-	            requestId: webResource.requestId,
-	            abortSignal: webResource.abortSignal,
-	            body: webResource.body,
-	            formData: webResource.formData,
-	            disableKeepAlive: !!webResource.keepAlive,
-	            onDownloadProgress: webResource.onDownloadProgress,
-	            onUploadProgress: webResource.onUploadProgress,
-	            proxySettings: webResource.proxySettings,
-	            streamResponseStatusCodes: webResource.streamResponseStatusCodes,
-	            agent: webResource.agent,
-	            requestOverrides: webResource.requestOverrides,
-	        });
-	        if (options.originalRequest) {
-	            newRequest[originalClientRequestSymbol] =
-	                options.originalRequest;
-	        }
-	        return newRequest;
-	    }
-	}
-	function toWebResourceLike(request, options) {
-	    const originalRequest = options?.originalRequest ?? request;
-	    const webResource = {
-	        url: request.url,
-	        method: request.method,
-	        headers: toHttpHeadersLike(request.headers),
-	        withCredentials: request.withCredentials,
-	        timeout: request.timeout,
-	        requestId: request.headers.get("x-ms-client-request-id") || request.requestId,
-	        abortSignal: request.abortSignal,
-	        body: request.body,
-	        formData: request.formData,
-	        keepAlive: !!request.disableKeepAlive,
-	        onDownloadProgress: request.onDownloadProgress,
-	        onUploadProgress: request.onUploadProgress,
-	        proxySettings: request.proxySettings,
-	        streamResponseStatusCodes: request.streamResponseStatusCodes,
-	        agent: request.agent,
-	        requestOverrides: request.requestOverrides,
-	        clone() {
-	            throw new Error("Cannot clone a non-proxied WebResourceLike");
-	        },
-	        prepare() {
-	            throw new Error("WebResourceLike.prepare() is not supported by @azure/core-http-compat");
-	        },
-	        validateRequestProperties() {
-	            /** do nothing */
-	        },
-	    };
-	    if (options?.createProxy) {
-	        return new Proxy(webResource, {
-	            get(target, prop, receiver) {
-	                if (prop === originalRequestSymbol) {
-	                    return request;
-	                }
-	                else if (prop === "clone") {
-	                    return () => {
-	                        return toWebResourceLike(toPipelineRequest(webResource, { originalRequest }), {
-	                            createProxy: true,
-	                            originalRequest,
-	                        });
-	                    };
-	                }
-	                return Reflect.get(target, prop, receiver);
-	            },
-	            set(target, prop, value, receiver) {
-	                if (prop === "keepAlive") {
-	                    request.disableKeepAlive = !value;
-	                }
-	                const passThroughProps = [
-	                    "url",
-	                    "method",
-	                    "withCredentials",
-	                    "timeout",
-	                    "requestId",
-	                    "abortSignal",
-	                    "body",
-	                    "formData",
-	                    "onDownloadProgress",
-	                    "onUploadProgress",
-	                    "proxySettings",
-	                    "streamResponseStatusCodes",
-	                    "agent",
-	                    "requestOverrides",
-	                ];
-	                if (typeof prop === "string" && passThroughProps.includes(prop)) {
-	                    request[prop] = value;
-	                }
-	                return Reflect.set(target, prop, value, receiver);
-	            },
-	        });
-	    }
-	    else {
-	        return webResource;
-	    }
-	}
-	/**
-	 * Converts HttpHeaders from core-rest-pipeline to look like
-	 * HttpHeaders from core-http.
-	 * @param headers - HttpHeaders from core-rest-pipeline
-	 * @returns HttpHeaders as they looked in core-http
-	 */
-	function toHttpHeadersLike(headers) {
-	    return new HttpHeaders(headers.toJSON({ preserveCase: true }));
-	}
-	/**
-	 * A collection of HttpHeaders that can be sent with a HTTP request.
-	 */
-	function getHeaderKey(headerName) {
-	    return headerName.toLowerCase();
-	}
-	/**
-	 * A collection of HTTP header key/value pairs.
-	 */
-	class HttpHeaders {
-	    _headersMap;
-	    constructor(rawHeaders) {
-	        this._headersMap = {};
-	        if (rawHeaders) {
-	            for (const headerName in rawHeaders) {
-	                this.set(headerName, rawHeaders[headerName]);
-	            }
-	        }
-	    }
-	    /**
-	     * Set a header in this collection with the provided name and value. The name is
-	     * case-insensitive.
-	     * @param headerName - The name of the header to set. This value is case-insensitive.
-	     * @param headerValue - The value of the header to set.
-	     */
-	    set(headerName, headerValue) {
-	        this._headersMap[getHeaderKey(headerName)] = {
-	            name: headerName,
-	            value: headerValue.toString(),
-	        };
-	    }
-	    /**
-	     * Get the header value for the provided header name, or undefined if no header exists in this
-	     * collection with the provided name.
-	     * @param headerName - The name of the header.
-	     */
-	    get(headerName) {
-	        const header = this._headersMap[getHeaderKey(headerName)];
-	        return !header ? undefined : header.value;
-	    }
-	    /**
-	     * Get whether or not this header collection contains a header entry for the provided header name.
-	     */
-	    contains(headerName) {
-	        return !!this._headersMap[getHeaderKey(headerName)];
-	    }
-	    /**
-	     * Remove the header with the provided headerName. Return whether or not the header existed and
-	     * was removed.
-	     * @param headerName - The name of the header to remove.
-	     */
-	    remove(headerName) {
-	        const result = this.contains(headerName);
-	        delete this._headersMap[getHeaderKey(headerName)];
-	        return result;
-	    }
-	    /**
-	     * Get the headers that are contained this collection as an object.
-	     */
-	    rawHeaders() {
-	        return this.toJson({ preserveCase: true });
-	    }
-	    /**
-	     * Get the headers that are contained in this collection as an array.
-	     */
-	    headersArray() {
-	        const headers = [];
-	        for (const headerKey in this._headersMap) {
-	            headers.push(this._headersMap[headerKey]);
-	        }
-	        return headers;
-	    }
-	    /**
-	     * Get the header names that are contained in this collection.
-	     */
-	    headerNames() {
-	        const headerNames = [];
-	        const headers = this.headersArray();
-	        for (let i = 0; i < headers.length; ++i) {
-	            headerNames.push(headers[i].name);
-	        }
-	        return headerNames;
-	    }
-	    /**
-	     * Get the header values that are contained in this collection.
-	     */
-	    headerValues() {
-	        const headerValues = [];
-	        const headers = this.headersArray();
-	        for (let i = 0; i < headers.length; ++i) {
-	            headerValues.push(headers[i].value);
-	        }
-	        return headerValues;
-	    }
-	    /**
-	     * Get the JSON object representation of this HTTP header collection.
-	     */
-	    toJson(options = {}) {
-	        const result = {};
-	        if (options.preserveCase) {
-	            for (const headerKey in this._headersMap) {
-	                const header = this._headersMap[headerKey];
-	                result[header.name] = header.value;
-	            }
-	        }
-	        else {
-	            for (const headerKey in this._headersMap) {
-	                const header = this._headersMap[headerKey];
-	                result[getHeaderKey(header.name)] = header.value;
-	            }
-	        }
-	        return result;
-	    }
-	    /**
-	     * Get the string representation of this HTTP header collection.
-	     */
-	    toString() {
-	        return JSON.stringify(this.toJson({ preserveCase: true }));
-	    }
-	    /**
-	     * Create a deep clone/copy of this HttpHeaders collection.
-	     */
-	    clone() {
-	        const resultPreservingCasing = {};
-	        for (const headerKey in this._headersMap) {
-	            const header = this._headersMap[headerKey];
-	            resultPreservingCasing[header.name] = header.value;
-	        }
-	        return new HttpHeaders(resultPreservingCasing);
-	    }
-	}
-	util$1.HttpHeaders = HttpHeaders;
-	
-	return util$1;
-}
-
-var hasRequiredResponse;
-
-function requireResponse () {
-	if (hasRequiredResponse) return response;
-	hasRequiredResponse = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(response, "__esModule", { value: true });
-	response.toCompatResponse = toCompatResponse;
-	response.toPipelineResponse = toPipelineResponse;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const util_js_1 = requireUtil$1();
-	const originalResponse = Symbol("Original FullOperationResponse");
-	/**
-	 * A helper to convert response objects from the new pipeline back to the old one.
-	 * @param response - A response object from core-client.
-	 * @returns A response compatible with `HttpOperationResponse` from core-http.
-	 */
-	function toCompatResponse(response, options) {
-	    let request = (0, util_js_1.toWebResourceLike)(response.request);
-	    let headers = (0, util_js_1.toHttpHeadersLike)(response.headers);
-	    if (options?.createProxy) {
-	        return new Proxy(response, {
-	            get(target, prop, receiver) {
-	                if (prop === "headers") {
-	                    return headers;
-	                }
-	                else if (prop === "request") {
-	                    return request;
-	                }
-	                else if (prop === originalResponse) {
-	                    return response;
-	                }
-	                return Reflect.get(target, prop, receiver);
-	            },
-	            set(target, prop, value, receiver) {
-	                if (prop === "headers") {
-	                    headers = value;
-	                }
-	                else if (prop === "request") {
-	                    request = value;
-	                }
-	                return Reflect.set(target, prop, value, receiver);
-	            },
-	        });
-	    }
-	    else {
-	        return {
-	            ...response,
-	            request,
-	            headers,
-	        };
-	    }
-	}
-	/**
-	 * A helper to convert back to a PipelineResponse
-	 * @param compatResponse - A response compatible with `HttpOperationResponse` from core-http.
-	 */
-	function toPipelineResponse(compatResponse) {
-	    const extendedCompatResponse = compatResponse;
-	    const response = extendedCompatResponse[originalResponse];
-	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)(compatResponse.headers.toJson({ preserveCase: true }));
-	    if (response) {
-	        response.headers = headers;
-	        return response;
-	    }
-	    else {
-	        return {
-	            ...compatResponse,
-	            headers,
-	            request: (0, util_js_1.toPipelineRequest)(compatResponse.request),
-	        };
-	    }
-	}
-	
-	return response;
-}
-
-var hasRequiredExtendedClient;
-
-function requireExtendedClient () {
-	if (hasRequiredExtendedClient) return extendedClient;
-	hasRequiredExtendedClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(extendedClient, "__esModule", { value: true });
-	extendedClient.ExtendedServiceClient = void 0;
-	const disableKeepAlivePolicy_js_1 = requireDisableKeepAlivePolicy();
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_client_1 = /*@__PURE__*/ requireCommonjs$7();
-	const response_js_1 = requireResponse();
-	/**
-	 * Client to provide compatability between core V1 & V2.
-	 */
-	class ExtendedServiceClient extends core_client_1.ServiceClient {
-	    constructor(options) {
-	        super(options);
-	        if (options.keepAliveOptions?.enable === false &&
-	            !(0, disableKeepAlivePolicy_js_1.pipelineContainsDisableKeepAlivePolicy)(this.pipeline)) {
-	            this.pipeline.addPolicy((0, disableKeepAlivePolicy_js_1.createDisableKeepAlivePolicy)());
-	        }
-	        if (options.redirectOptions?.handleRedirects === false) {
-	            this.pipeline.removePolicy({
-	                name: core_rest_pipeline_1.redirectPolicyName,
-	            });
-	        }
-	    }
-	    /**
-	     * Compatible send operation request function.
-	     *
-	     * @param operationArguments - Operation arguments
-	     * @param operationSpec - Operation Spec
-	     * @returns
-	     */
-	    async sendOperationRequest(operationArguments, operationSpec) {
-	        const userProvidedCallBack = operationArguments?.options?.onResponse;
-	        let lastResponse;
-	        function onResponse(rawResponse, flatResponse, error) {
-	            lastResponse = rawResponse;
-	            if (userProvidedCallBack) {
-	                userProvidedCallBack(rawResponse, flatResponse, error);
-	            }
-	        }
-	        operationArguments.options = {
-	            ...operationArguments.options,
-	            onResponse,
-	        };
-	        const result = await super.sendOperationRequest(operationArguments, operationSpec);
-	        if (lastResponse) {
-	            Object.defineProperty(result, "_response", {
-	                value: (0, response_js_1.toCompatResponse)(lastResponse),
-	            });
-	        }
-	        return result;
-	    }
-	}
-	extendedClient.ExtendedServiceClient = ExtendedServiceClient;
-	
-	return extendedClient;
-}
-
-var requestPolicyFactoryPolicy = {};
-
-var hasRequiredRequestPolicyFactoryPolicy;
-
-function requireRequestPolicyFactoryPolicy () {
-	if (hasRequiredRequestPolicyFactoryPolicy) return requestPolicyFactoryPolicy;
-	hasRequiredRequestPolicyFactoryPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.requestPolicyFactoryPolicyName = exports$1.HttpPipelineLogLevel = void 0;
-		exports$1.createRequestPolicyFactoryPolicy = createRequestPolicyFactoryPolicy;
-		const util_js_1 = requireUtil$1();
-		const response_js_1 = requireResponse();
-		/**
-		 * An enum for compatibility with RequestPolicy
-		 */
-		var HttpPipelineLogLevel;
-		(function (HttpPipelineLogLevel) {
-		    HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";
-		    HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";
-		    HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";
-		    HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";
-		})(HttpPipelineLogLevel || (exports$1.HttpPipelineLogLevel = HttpPipelineLogLevel = {}));
-		const mockRequestPolicyOptions = {
-		    log(_logLevel, _message) {
-		        /* do nothing */
-		    },
-		    shouldLog(_logLevel) {
-		        return false;
-		    },
-		};
-		/**
-		 * The name of the RequestPolicyFactoryPolicy
-		 */
-		exports$1.requestPolicyFactoryPolicyName = "RequestPolicyFactoryPolicy";
-		/**
-		 * A policy that wraps policies written for core-http.
-		 * @param factories - An array of `RequestPolicyFactory` objects from a core-http pipeline
-		 */
-		function createRequestPolicyFactoryPolicy(factories) {
-		    const orderedFactories = factories.slice().reverse();
-		    return {
-		        name: exports$1.requestPolicyFactoryPolicyName,
-		        async sendRequest(request, next) {
-		            let httpPipeline = {
-		                async sendRequest(httpRequest) {
-		                    const response = await next((0, util_js_1.toPipelineRequest)(httpRequest));
-		                    return (0, response_js_1.toCompatResponse)(response, { createProxy: true });
-		                },
-		            };
-		            for (const factory of orderedFactories) {
-		                httpPipeline = factory.create(httpPipeline, mockRequestPolicyOptions);
-		            }
-		            const webResourceLike = (0, util_js_1.toWebResourceLike)(request, { createProxy: true });
-		            const response = await httpPipeline.sendRequest(webResourceLike);
-		            return (0, response_js_1.toPipelineResponse)(response);
-		        },
-		    };
-		}
-		
-	} (requestPolicyFactoryPolicy));
-	return requestPolicyFactoryPolicy;
-}
-
-var httpClientAdapter = {};
-
-var hasRequiredHttpClientAdapter;
-
-function requireHttpClientAdapter () {
-	if (hasRequiredHttpClientAdapter) return httpClientAdapter;
-	hasRequiredHttpClientAdapter = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(httpClientAdapter, "__esModule", { value: true });
-	httpClientAdapter.convertHttpClient = convertHttpClient;
-	const response_js_1 = requireResponse();
-	const util_js_1 = requireUtil$1();
-	/**
-	 * Converts a RequestPolicy based HttpClient to a PipelineRequest based HttpClient.
-	 * @param requestPolicyClient - A HttpClient compatible with core-http
-	 * @returns A HttpClient compatible with core-rest-pipeline
-	 */
-	function convertHttpClient(requestPolicyClient) {
-	    return {
-	        sendRequest: async (request) => {
-	            const response = await requestPolicyClient.sendRequest((0, util_js_1.toWebResourceLike)(request, { createProxy: true }));
-	            return (0, response_js_1.toPipelineResponse)(response);
-	        },
-	    };
-	}
-	
-	return httpClientAdapter;
-}
-
-var hasRequiredCommonjs$6;
-
-function requireCommonjs$6 () {
-	if (hasRequiredCommonjs$6) return commonjs$6;
-	hasRequiredCommonjs$6 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.toHttpHeadersLike = exports$1.convertHttpClient = exports$1.disableKeepAlivePolicyName = exports$1.HttpPipelineLogLevel = exports$1.createRequestPolicyFactoryPolicy = exports$1.requestPolicyFactoryPolicyName = exports$1.ExtendedServiceClient = void 0;
-		/**
-		 * A Shim Library that provides compatibility between Core V1 & V2 Packages.
-		 *
-		 * @packageDocumentation
-		 */
-		var extendedClient_js_1 = requireExtendedClient();
-		Object.defineProperty(exports$1, "ExtendedServiceClient", { enumerable: true, get: function () { return extendedClient_js_1.ExtendedServiceClient; } });
-		var requestPolicyFactoryPolicy_js_1 = requireRequestPolicyFactoryPolicy();
-		Object.defineProperty(exports$1, "requestPolicyFactoryPolicyName", { enumerable: true, get: function () { return requestPolicyFactoryPolicy_js_1.requestPolicyFactoryPolicyName; } });
-		Object.defineProperty(exports$1, "createRequestPolicyFactoryPolicy", { enumerable: true, get: function () { return requestPolicyFactoryPolicy_js_1.createRequestPolicyFactoryPolicy; } });
-		Object.defineProperty(exports$1, "HttpPipelineLogLevel", { enumerable: true, get: function () { return requestPolicyFactoryPolicy_js_1.HttpPipelineLogLevel; } });
-		var disableKeepAlivePolicy_js_1 = requireDisableKeepAlivePolicy();
-		Object.defineProperty(exports$1, "disableKeepAlivePolicyName", { enumerable: true, get: function () { return disableKeepAlivePolicy_js_1.disableKeepAlivePolicyName; } });
-		var httpClientAdapter_js_1 = requireHttpClientAdapter();
-		Object.defineProperty(exports$1, "convertHttpClient", { enumerable: true, get: function () { return httpClientAdapter_js_1.convertHttpClient; } });
-		var util_js_1 = requireUtil$1();
-		Object.defineProperty(exports$1, "toHttpHeadersLike", { enumerable: true, get: function () { return util_js_1.toHttpHeadersLike; } });
-		
-	} (commonjs$6));
-	return commonjs$6;
-}
-
-var commonjs$4 = {};
-
-var xml = {};
-
-var fxp = {exports: {}};
-
-var hasRequiredFxp;
-
-function requireFxp () {
-	if (hasRequiredFxp) return fxp.exports;
-	hasRequiredFxp = 1;
-	(()=>{var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:true,get:i[n]});},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:true});}},e={};t.r(e),t.d(e,{XMLBuilder:()=>lt,XMLParser:()=>tt,XMLValidator:()=>pt});const i=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)p+=t[o];if(p=p.trim(),"/"===p[p.length-1]&&(p=p.substring(0,p.length-1),o--),!r(p)){let e;return e=0===p.trim().length?"Invalid space after '<'.":"Tag '"+p+"' is an invalid name.",x("InvalidTag",e,b(t,o))}const c=f(t,o);if(false===c)return x("InvalidAttr","Attributes for '"+p+"' have open quote.",b(t,o));let N=c.value;if(o=c.index,"/"===N[N.length-1]){const i=o-N.length;N=N.substring(0,N.length-1);const s=g(N,e);if(true!==s)return x(s.err.code,s.err.msg,b(t,i+s.err.line));n=true;}else if(d){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+p+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return x("InvalidTag","Closing tag '"+p+"' can't have attributes or invalid starting.",b(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+p+"' has not been opened.",b(t,a));{const e=i.pop();if(p!==e.tagName){let i=b(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+p+"'.",b(t,a))}0==i.length&&(s=true);}}else {const r=g(N,e);if(true!==r)return x(r.err.code,r.err.msg,b(t,o-N.length+r.err.line));if(true===s)return x("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(p)||i.push({tagName:p,tagStartPos:a}),n=true;}for(o++;o0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map((t=>t.tagName)),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function l(t){return " "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const i=e;for(;e5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function h(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const d='"',p="'";function f(t,e){let i="",n="",s=false;for(;e"===t[e]&&""===n){s=true;break}i+=t[e];}return ""===n&&{value:i,index:e,tagClosed:s}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,c),n={};for(let t=0;tfalse,commentPropName:false,unpairedTags:[],processEntities:true,htmlEntities:false,ignoreDeclaration:false,ignorePiTags:false,transformTagName:false,transformAttributeName:false,updateTag:function(t,e,i){return t},captureMetaData:false};let T;T="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class y{constructor(t){this.tagname=t,this.child=[],this[":@"]={};}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e});}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][T]={startIndex:e});}static getMetaDataSymbol(){return T}}class w{constructor(t){this.suppressValidationErr=!t;}readDocType(t,e){const i={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let n=1,s=false,r=false,o="";for(;e"===t[e]){if(r?"-"===t[e-1]&&"-"===t[e-2]&&(r=false,n--):n--,0===n)break}else "["===t[e]?s=true:o+=t[e];else {if(s&&P(t,"!ENTITY",e)){let n,s;e+=7,[n,s,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===s.indexOf("&")&&(i[n]={regx:RegExp(`&${n};`,"g"),val:s});}else if(s&&P(t,"!ELEMENT",e)){e+=8;const{index:i}=this.readElementExp(t,e+1);e=i;}else if(s&&P(t,"!ATTLIST",e))e+=8;else if(s&&P(t,"!NOTATION",e)){e+=9;const{index:i}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=i;}else {if(!P(t,"!--",e))throw new Error("Invalid DOCTYPE");r=true;}n++,o="";}if(0!==n)throw new Error("Unclosed DOCTYPE")}return {entities:i,i:e}}readEntityExp(t,e){e=I(t,e);let i="";for(;e{for(;e{for(const i of t){if("string"==typeof i&&e===i)return  true;if(i instanceof RegExp&&i.test(e))return  true}}:()=>false}class D{constructor(t){if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:(t,e)=>String.fromCodePoint(Number.parseInt(e,10))},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:(t,e)=>String.fromCodePoint(Number.parseInt(e,16))}},this.addExternalEntities=j,this.parseXml=L,this.parseTextData=M,this.resolveNameSpace=F,this.buildAttributesMap=k,this.isItStopNode=Y,this.replaceEntitiesValue=B,this.readStopNodeData=W,this.saveTextToParentTag=R,this.addChild=U,this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t));const n=this.options.tagValueProcessor(e,t,i,s,r);return null==n?t:typeof n!=typeof t||n!==t?n:this.options.trimValues||t.trim()===t?q(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function F(t){if(this.options.removeNSPrefix){const e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return "";2===e.length&&(t=i+e[1]);}return t}const _=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function k(t,e){if(true!==this.options.ignoreAttributes&&"string"==typeof t){const i=s(t,_),n=i.length,r={};for(let t=0;t",o,"Closing Tag is not closed.");let r=t.substring(o+2,e).trim();if(this.options.removeNSPrefix){const t=r.indexOf(":");-1!==t&&(r=r.substr(t+1));}this.options.transformTagName&&(r=this.options.transformTagName(r)),i&&(n=this.saveTextToParentTag(n,i,s));const a=s.substring(s.lastIndexOf(".")+1);if(r&&-1!==this.options.unpairedTags.indexOf(r))throw new Error(`Unpaired tag can not be used as closing tag: `);let l=0;a&&-1!==this.options.unpairedTags.indexOf(a)?(l=s.lastIndexOf(".",s.lastIndexOf(".")-1),this.tagsNodeStack.pop()):l=s.lastIndexOf("."),s=s.substring(0,l),i=this.tagsNodeStack.pop(),n="",o=e;}else if("?"===t[o+1]){let e=X(t,o,false,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,i,s),this.options.ignoreDeclaration&&"?xml"===e.tagName||this.options.ignorePiTags);else {const t=new y(e.tagName);t.add(this.options.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,s)),this.addChild(i,t,s,o);}o=e.closeIndex+1;}else if("!--"===t.substr(o+1,3)){const e=G(t,"--\x3e",o+4,"Comment is not closed.");if(this.options.commentPropName){const r=t.substring(o+4,e-2);n=this.saveTextToParentTag(n,i,s),i.add(this.options.commentPropName,[{[this.options.textNodeName]:r}]);}o=e;}else if("!D"===t.substr(o+1,2)){const e=r.readDocType(t,o);this.docTypeEntities=e.entities,o=e.i;}else if("!["===t.substr(o+1,2)){const e=G(t,"]]>",o,"CDATA is not closed.")-2,r=t.substring(o+9,e);n=this.saveTextToParentTag(n,i,s);let a=this.parseTextData(r,i.tagname,s,true,false,true,true);null==a&&(a=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[{[this.options.textNodeName]:r}]):i.add(this.options.textNodeName,a),o=e+2;}else {let r=X(t,o,this.options.removeNSPrefix),a=r.tagName;const l=r.rawTagName;let u=r.tagExp,h=r.attrExpPresent,d=r.closeIndex;if(this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t;}i&&n&&"!xml"!==i.tagname&&(n=this.saveTextToParentTag(n,i,s,false));const p=i;p&&-1!==this.options.unpairedTags.indexOf(p.tagname)&&(i=this.tagsNodeStack.pop(),s=s.substring(0,s.lastIndexOf("."))),a!==e.tagname&&(s+=s?"."+a:a);const f=o;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,s,a)){let e="";if(u.length>0&&u.lastIndexOf("/")===u.length-1)"/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),o=r.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(a))o=r.closeIndex;else {const i=this.readStopNodeData(t,l,d+1);if(!i)throw new Error(`Unexpected end of ${l}`);o=i.i,e=i.tagContent;}const n=new y(a);a!==u&&h&&(n[":@"]=this.buildAttributesMap(u,s)),e&&(e=this.parseTextData(e,a,s,true,h,true,true)),s=s.substr(0,s.lastIndexOf(".")),n.add(this.options.textNodeName,e),this.addChild(i,n,s,f);}else {if(u.length>0&&u.lastIndexOf("/")===u.length-1){if("/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t;}const t=new y(a);a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),s=s.substr(0,s.lastIndexOf("."));}else {const t=new y(a);this.tagsNodeStack.push(i),a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),i=t;}n="",o=d;}}else n+=t[o];return e.child};function U(t,e,i,n){this.options.captureMetaData||(n=void 0);const s=this.options.updateTag(e.tagname,i,e[":@"]);false===s||("string"==typeof s?(e.tagname=s,t.addChild(e,n)):t.addChild(e,n));}const B=function(t){if(this.options.processEntities){for(let e in this.docTypeEntities){const i=this.docTypeEntities[e];t=t.replace(i.regx,i.val);}for(let e in this.lastEntities){const i=this.lastEntities[e];t=t.replace(i.regex,i.val);}if(this.options.htmlEntities)for(let e in this.htmlEntities){const i=this.htmlEntities[e];t=t.replace(i.regex,i.val);}t=t.replace(this.ampEntity.regex,this.ampEntity.val);}return t};function R(t,e,i,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,false,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Y(t,e,i,n){return !(!e||!e.has(n))||!(!t||!t.has(i))}function G(t,e,i,n){const s=t.indexOf(e,i);if(-1===s)throw new Error(n);return s+e.length-1}function X(t,e,i,n=">"){const s=function(t,e,i=">"){let n,s="";for(let r=e;r",i,`${e} is not closed`);if(t.substring(i+2,r).trim()===e&&(s--,0===s))return {tagContent:t.substring(n,i),i:r};i=r;}else if("?"===t[i+1])i=G(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=G(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=G(t,"]]>",i,"StopNode is not closed.")-2;else {const n=X(t,i,">");n&&((n&&n.tagName)===e&&"/"!==n.tagExp[n.tagExp.length-1]&&s++,i=n.closeIndex);}}function q(t,e,i){if(e&&"string"==typeof t){const e=t.trim();return "true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},C,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&A.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(-1!==i.search(/.+[eE].+/))return function(t,e,i){if(!i.eNotation)return t;const n=e.match(V);if(n){let s=n[1]||"";const r=-1===n[3].indexOf("e")?"E":"e",o=n[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:1!==o.length||!n[3].startsWith(`.${r}`)&&n[3][0]!==r?i.leadingZeros&&!a?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,i,e);{const s=S.exec(i);if(s){const r=s[1]||"",o=s[2];let a=(n=s[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!l))return t;{const n=Number(i),s=String(n);if(0===n||-0===n)return n;if(-1!==s.search(/[eE]/))return e.eNotation?n:t;if(-1!==i.indexOf("."))return "0"===s||s===a||s===`${r}${a}`?n:t;let l=o?a:i;return o?l===s||r+l===s?n:t:l===s||l===r+s?n:t}}return t}var n;}(t,i)}return void 0!==t?t:""}const Z=y.getMetaDataSymbol();function K(t,e){return Q(t,e)}function Q(t,e,i){let n;const s={};for(let r=0;r0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function z(t){const e=Object.keys(t);for(let t=0;t0&&(i="\n"),it(t,e,"",i)}function it(t,e,i,n){let s="",r=false;for(let o=0;o`,r=false;continue}if(l===e.commentPropName){s+=n+`\x3c!--${a[l][0][e.textNodeName]}--\x3e`,r=true;continue}if("?"===l[0]){const t=st(a[":@"],e),i="?xml"===l?"":n;let o=a[l][0][e.textNodeName];o=0!==o.length?" "+o:"",s+=i+`<${l}${o}${t}?>`,r=true;continue}let h=n;""!==h&&(h+=e.indentBy);const d=n+`<${l}${st(a[":@"],e)}`,p=it(a[l],e,u,h);-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=d+">":s+=d+"/>":p&&0!==p.length||!e.suppressEmptyNode?p&&p.endsWith(">")?s+=d+`>${p}${n}`:(s+=d+">",p&&""!==n&&(p.includes("/>")||p.includes("`):s+=d+"/>",r=true;}return s}function nt(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:true,stopNodes:[],oneListGroup:false};function lt(t){this.options=Object.assign({},at,t),true===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return  false}:(this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=dt),this.processTextOrObjNode=ut,this.options.format?(this.indentate=ht,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return ""},this.tagEndChar=">",this.newLine="");}function ut(t,e,i,n){const s=this.j2x(t,i+1,n.concat(e));return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,i):this.buildObjectNode(s.val,e,s.attrStr,i)}function ht(t){return this.options.indentBy.repeat(t)}function dt(t){return !(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}lt.prototype.build=function(t){return this.options.preserveOrder?et(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t}),this.j2x(t,0,[]).val)},lt.prototype.j2x=function(t,e,i){let n="",s="";const r=i.join(".");for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o))if(void 0===t[o])this.isAttribute(o)&&(s+="");else if(null===t[o])this.isAttribute(o)||o===this.options.cdataPropName?s+="":"?"===o[0]?s+=this.indentate(e)+"<"+o+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+o+"/"+this.tagEndChar;else if(t[o]instanceof Date)s+=this.buildTextValNode(t[o],o,"",e);else if("object"!=typeof t[o]){const i=this.isAttribute(o);if(i&&!this.ignoreAttributesFn(i,r))n+=this.buildAttrPairStr(i,""+t[o]);else if(!i)if(o===this.options.textNodeName){let e=this.options.tagValueProcessor(o,""+t[o]);s+=this.replaceEntitiesValue(e);}else s+=this.buildTextValNode(t[o],o,"",e);}else if(Array.isArray(t[o])){const n=t[o].length;let r="",a="";for(let l=0;l"+t+s}},lt.prototype.closeTag=function(t){let e="";return  -1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(false!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(n)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(n)+"<"+e+i+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(n)+"<"+e+i+">"+s+"0&&this.options.processEntities)for(let e=0;e${xmlData}`.replace(/\n/g, "");
-	}
-	/**
-	 * Converts given XML string into JSON
-	 * @param str - String containing the XML content to be parsed into JSON
-	 * @param opts - Options that govern the parsing of given xml string
-	 * `includeRoot` indicates whether the root element is to be included or not in the output
-	 */
-	async function parseXML(str, opts = {}) {
-	    if (!str) {
-	        throw new Error("Document is empty");
-	    }
-	    const validation = fast_xml_parser_1.XMLValidator.validate(str);
-	    if (validation !== true) {
-	        throw validation;
-	    }
-	    const parser = new fast_xml_parser_1.XMLParser(getParserOptions(opts));
-	    const parsedXml = parser.parse(str);
-	    // Remove the  node.
-	    // This is a change in behavior on fxp v4. Issue #424
-	    if (parsedXml["?xml"]) {
-	        delete parsedXml["?xml"];
-	    }
-	    if (!opts.includeRoot) {
-	        for (const key of Object.keys(parsedXml)) {
-	            const value = parsedXml[key];
-	            return typeof value === "object" ? Object.assign({}, value) : value;
-	        }
-	    }
-	    return parsedXml;
-	}
-	
-	return xml;
-}
-
-var hasRequiredCommonjs$5;
-
-function requireCommonjs$5 () {
-	if (hasRequiredCommonjs$5) return commonjs$4;
-	hasRequiredCommonjs$5 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.XML_CHARKEY = exports$1.XML_ATTRKEY = exports$1.parseXML = exports$1.stringifyXML = void 0;
-		var xml_js_1 = requireXml();
-		Object.defineProperty(exports$1, "stringifyXML", { enumerable: true, get: function () { return xml_js_1.stringifyXML; } });
-		Object.defineProperty(exports$1, "parseXML", { enumerable: true, get: function () { return xml_js_1.parseXML; } });
-		var xml_common_js_1 = requireXml_common();
-		Object.defineProperty(exports$1, "XML_ATTRKEY", { enumerable: true, get: function () { return xml_common_js_1.XML_ATTRKEY; } });
-		Object.defineProperty(exports$1, "XML_CHARKEY", { enumerable: true, get: function () { return xml_common_js_1.XML_CHARKEY; } });
-		
-	} (commonjs$4));
-	return commonjs$4;
-}
-
-var log$1 = {};
-
-var hasRequiredLog$1;
-
-function requireLog$1 () {
-	if (hasRequiredLog$1) return log$1;
-	hasRequiredLog$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(log$1, "__esModule", { value: true });
-	log$1.logger = void 0;
-	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
-	/**
-	 * The `@azure/logger` configuration for this package.
-	 */
-	log$1.logger = (0, logger_1.createClientLogger)("storage-blob");
-	
-	return log$1;
-}
-
-var StorageRetryPolicyFactory$1 = {};
-
-var StorageRetryPolicy$1 = {};
-
-var commonjs$3 = {};
-
-var AbortError$2 = {};
-
-var hasRequiredAbortError$1;
-
-function requireAbortError$1 () {
-	if (hasRequiredAbortError$1) return AbortError$2;
-	hasRequiredAbortError$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(AbortError$2, "__esModule", { value: true });
-	AbortError$2.AbortError = void 0;
-	/**
-	 * This error is thrown when an asynchronous operation has been aborted.
-	 * Check for this error by testing the `name` that the name property of the
-	 * error matches `"AbortError"`.
-	 *
-	 * @example
-	 * ```ts
-	 * const controller = new AbortController();
-	 * controller.abort();
-	 * try {
-	 *   doAsyncWork(controller.signal)
-	 * } catch (e) {
-	 *   if (e.name === 'AbortError') {
-	 *     // handle abort error here.
-	 *   }
-	 * }
-	 * ```
-	 */
-	class AbortError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = "AbortError";
-	    }
-	}
-	AbortError$2.AbortError = AbortError;
-	
-	return AbortError$2;
-}
-
-var hasRequiredCommonjs$4;
-
-function requireCommonjs$4 () {
-	if (hasRequiredCommonjs$4) return commonjs$3;
-	hasRequiredCommonjs$4 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT license.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.AbortError = void 0;
-		var AbortError_js_1 = requireAbortError$1();
-		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
-		
-	} (commonjs$3));
-	return commonjs$3;
-}
-
-var RequestPolicy$1 = {};
-
-var hasRequiredRequestPolicy$1;
-
-function requireRequestPolicy$1 () {
-	if (hasRequiredRequestPolicy$1) return RequestPolicy$1;
-	hasRequiredRequestPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(RequestPolicy$1, "__esModule", { value: true });
-	RequestPolicy$1.BaseRequestPolicy = void 0;
-	/**
-	 * The base class from which all request policies derive.
-	 */
-	class BaseRequestPolicy {
-	    _nextPolicy;
-	    _options;
-	    /**
-	     * The main method to implement that manipulates a request/response.
-	     */
-	    constructor(
-	    /**
-	     * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
-	     */
-	    _nextPolicy, 
-	    /**
-	     * The options that can be passed to a given request policy.
-	     */
-	    _options) {
-	        this._nextPolicy = _nextPolicy;
-	        this._options = _options;
-	    }
-	    /**
-	     * Get whether or not a log with the provided log level should be logged.
-	     * @param logLevel - The log level of the log that will be logged.
-	     * @returns Whether or not a log with the provided log level should be logged.
-	     */
-	    shouldLog(logLevel) {
-	        return this._options.shouldLog(logLevel);
-	    }
-	    /**
-	     * Attempt to log the provided message to the provided logger. If no logger was provided or if
-	     * the log level does not meat the logger's threshold, then nothing will be logged.
-	     * @param logLevel - The log level of this log.
-	     * @param message - The message of this log.
-	     */
-	    log(logLevel, message) {
-	        this._options.log(logLevel, message);
-	    }
-	}
-	RequestPolicy$1.BaseRequestPolicy = BaseRequestPolicy;
-	
-	return RequestPolicy$1;
-}
-
-var constants$3 = {};
-
-var hasRequiredConstants$3;
-
-function requireConstants$3 () {
-	if (hasRequiredConstants$3) return constants$3;
-	hasRequiredConstants$3 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.PathStylePorts = exports$1.BlobDoesNotUseCustomerSpecifiedEncryption = exports$1.BlobUsesCustomerSpecifiedEncryptionMsg = exports$1.StorageBlobLoggingAllowedQueryParameters = exports$1.StorageBlobLoggingAllowedHeaderNames = exports$1.DevelopmentConnectionString = exports$1.EncryptionAlgorithmAES25 = exports$1.HTTP_VERSION_1_1 = exports$1.HTTP_LINE_ENDING = exports$1.BATCH_MAX_PAYLOAD_IN_BYTES = exports$1.BATCH_MAX_REQUEST = exports$1.SIZE_1_MB = exports$1.ETagAny = exports$1.ETagNone = exports$1.HeaderConstants = exports$1.HTTPURLConnection = exports$1.URLConstants = exports$1.StorageOAuthScopes = exports$1.REQUEST_TIMEOUT = exports$1.DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = exports$1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = exports$1.DEFAULT_BLOCK_BUFFER_SIZE_BYTES = exports$1.BLOCK_BLOB_MAX_BLOCKS = exports$1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = exports$1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = exports$1.SERVICE_VERSION = exports$1.SDK_VERSION = void 0;
-		exports$1.SDK_VERSION = "12.29.1";
-		exports$1.SERVICE_VERSION = "2025-11-05";
-		exports$1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; // 256MB
-		exports$1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; // 4000MB
-		exports$1.BLOCK_BLOB_MAX_BLOCKS = 50000;
-		exports$1.DEFAULT_BLOCK_BUFFER_SIZE_BYTES = 8 * 1024 * 1024; // 8MB
-		exports$1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = 4 * 1024 * 1024; // 4MB
-		exports$1.DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = 5;
-		exports$1.REQUEST_TIMEOUT = 100 * 1000; // In ms
-		/**
-		 * The OAuth scope to use with Azure Storage.
-		 */
-		exports$1.StorageOAuthScopes = "https://storage.azure.com/.default";
-		exports$1.URLConstants = {
-		    Parameters: {
-		        FORCE_BROWSER_NO_CACHE: "_",
-		        SIGNATURE: "sig",
-		        SNAPSHOT: "snapshot",
-		        VERSIONID: "versionid",
-		        TIMEOUT: "timeout",
-		    },
-		};
-		exports$1.HTTPURLConnection = {
-		    HTTP_ACCEPTED: 202,
-		    HTTP_CONFLICT: 409,
-		    HTTP_NOT_FOUND: 404,
-		    HTTP_PRECON_FAILED: 412,
-		    HTTP_RANGE_NOT_SATISFIABLE: 416,
-		};
-		exports$1.HeaderConstants = {
-		    AUTHORIZATION: "Authorization",
-		    AUTHORIZATION_SCHEME: "Bearer",
-		    CONTENT_ENCODING: "Content-Encoding",
-		    CONTENT_ID: "Content-ID",
-		    CONTENT_LANGUAGE: "Content-Language",
-		    CONTENT_LENGTH: "Content-Length",
-		    CONTENT_MD5: "Content-Md5",
-		    CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",
-		    CONTENT_TYPE: "Content-Type",
-		    COOKIE: "Cookie",
-		    DATE: "date",
-		    IF_MATCH: "if-match",
-		    IF_MODIFIED_SINCE: "if-modified-since",
-		    IF_NONE_MATCH: "if-none-match",
-		    IF_UNMODIFIED_SINCE: "if-unmodified-since",
-		    PREFIX_FOR_STORAGE: "x-ms-",
-		    RANGE: "Range",
-		    USER_AGENT: "User-Agent",
-		    X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",
-		    X_MS_COPY_SOURCE: "x-ms-copy-source",
-		    X_MS_DATE: "x-ms-date",
-		    X_MS_ERROR_CODE: "x-ms-error-code",
-		    X_MS_VERSION: "x-ms-version",
-		    X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code",
-		};
-		exports$1.ETagNone = "";
-		exports$1.ETagAny = "*";
-		exports$1.SIZE_1_MB = 1 * 1024 * 1024;
-		exports$1.BATCH_MAX_REQUEST = 256;
-		exports$1.BATCH_MAX_PAYLOAD_IN_BYTES = 4 * exports$1.SIZE_1_MB;
-		exports$1.HTTP_LINE_ENDING = "\r\n";
-		exports$1.HTTP_VERSION_1_1 = "HTTP/1.1";
-		exports$1.EncryptionAlgorithmAES25 = "AES256";
-		exports$1.DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;
-		exports$1.StorageBlobLoggingAllowedHeaderNames = [
-		    "Access-Control-Allow-Origin",
-		    "Cache-Control",
-		    "Content-Length",
-		    "Content-Type",
-		    "Date",
-		    "Request-Id",
-		    "traceparent",
-		    "Transfer-Encoding",
-		    "User-Agent",
-		    "x-ms-client-request-id",
-		    "x-ms-date",
-		    "x-ms-error-code",
-		    "x-ms-request-id",
-		    "x-ms-return-client-request-id",
-		    "x-ms-version",
-		    "Accept-Ranges",
-		    "Content-Disposition",
-		    "Content-Encoding",
-		    "Content-Language",
-		    "Content-MD5",
-		    "Content-Range",
-		    "ETag",
-		    "Last-Modified",
-		    "Server",
-		    "Vary",
-		    "x-ms-content-crc64",
-		    "x-ms-copy-action",
-		    "x-ms-copy-completion-time",
-		    "x-ms-copy-id",
-		    "x-ms-copy-progress",
-		    "x-ms-copy-status",
-		    "x-ms-has-immutability-policy",
-		    "x-ms-has-legal-hold",
-		    "x-ms-lease-state",
-		    "x-ms-lease-status",
-		    "x-ms-range",
-		    "x-ms-request-server-encrypted",
-		    "x-ms-server-encrypted",
-		    "x-ms-snapshot",
-		    "x-ms-source-range",
-		    "If-Match",
-		    "If-Modified-Since",
-		    "If-None-Match",
-		    "If-Unmodified-Since",
-		    "x-ms-access-tier",
-		    "x-ms-access-tier-change-time",
-		    "x-ms-access-tier-inferred",
-		    "x-ms-account-kind",
-		    "x-ms-archive-status",
-		    "x-ms-blob-append-offset",
-		    "x-ms-blob-cache-control",
-		    "x-ms-blob-committed-block-count",
-		    "x-ms-blob-condition-appendpos",
-		    "x-ms-blob-condition-maxsize",
-		    "x-ms-blob-content-disposition",
-		    "x-ms-blob-content-encoding",
-		    "x-ms-blob-content-language",
-		    "x-ms-blob-content-length",
-		    "x-ms-blob-content-md5",
-		    "x-ms-blob-content-type",
-		    "x-ms-blob-public-access",
-		    "x-ms-blob-sequence-number",
-		    "x-ms-blob-type",
-		    "x-ms-copy-destination-snapshot",
-		    "x-ms-creation-time",
-		    "x-ms-default-encryption-scope",
-		    "x-ms-delete-snapshots",
-		    "x-ms-delete-type-permanent",
-		    "x-ms-deny-encryption-scope-override",
-		    "x-ms-encryption-algorithm",
-		    "x-ms-if-sequence-number-eq",
-		    "x-ms-if-sequence-number-le",
-		    "x-ms-if-sequence-number-lt",
-		    "x-ms-incremental-copy",
-		    "x-ms-lease-action",
-		    "x-ms-lease-break-period",
-		    "x-ms-lease-duration",
-		    "x-ms-lease-id",
-		    "x-ms-lease-time",
-		    "x-ms-page-write",
-		    "x-ms-proposed-lease-id",
-		    "x-ms-range-get-content-md5",
-		    "x-ms-rehydrate-priority",
-		    "x-ms-sequence-number-action",
-		    "x-ms-sku-name",
-		    "x-ms-source-content-md5",
-		    "x-ms-source-if-match",
-		    "x-ms-source-if-modified-since",
-		    "x-ms-source-if-none-match",
-		    "x-ms-source-if-unmodified-since",
-		    "x-ms-tag-count",
-		    "x-ms-encryption-key-sha256",
-		    "x-ms-copy-source-error-code",
-		    "x-ms-copy-source-status-code",
-		    "x-ms-if-tags",
-		    "x-ms-source-if-tags",
-		];
-		exports$1.StorageBlobLoggingAllowedQueryParameters = [
-		    "comp",
-		    "maxresults",
-		    "rscc",
-		    "rscd",
-		    "rsce",
-		    "rscl",
-		    "rsct",
-		    "se",
-		    "si",
-		    "sip",
-		    "sp",
-		    "spr",
-		    "sr",
-		    "srt",
-		    "ss",
-		    "st",
-		    "sv",
-		    "include",
-		    "marker",
-		    "prefix",
-		    "copyid",
-		    "restype",
-		    "blockid",
-		    "blocklisttype",
-		    "delimiter",
-		    "prevsnapshot",
-		    "ske",
-		    "skoid",
-		    "sks",
-		    "skt",
-		    "sktid",
-		    "skv",
-		    "snapshot",
-		];
-		exports$1.BlobUsesCustomerSpecifiedEncryptionMsg = "BlobUsesCustomerSpecifiedEncryption";
-		exports$1.BlobDoesNotUseCustomerSpecifiedEncryption = "BlobDoesNotUseCustomerSpecifiedEncryption";
-		/// List of ports used for path style addressing.
-		/// Path style addressing means that storage account is put in URI's Path segment in instead of in host.
-		exports$1.PathStylePorts = [
-		    "10000",
-		    "10001",
-		    "10002",
-		    "10003",
-		    "10004",
-		    "10100",
-		    "10101",
-		    "10102",
-		    "10103",
-		    "10104",
-		    "11000",
-		    "11001",
-		    "11002",
-		    "11003",
-		    "11004",
-		    "11100",
-		    "11101",
-		    "11102",
-		    "11103",
-		    "11104",
-		];
-		
-	} (constants$3));
-	return constants$3;
-}
-
-var utils_common$2 = {};
-
-var hasRequiredUtils_common$2;
-
-function requireUtils_common$2 () {
-	if (hasRequiredUtils_common$2) return utils_common$2;
-	hasRequiredUtils_common$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(utils_common$2, "__esModule", { value: true });
-	utils_common$2.escapeURLPath = escapeURLPath;
-	utils_common$2.getValueInConnString = getValueInConnString;
-	utils_common$2.extractConnectionStringParts = extractConnectionStringParts;
-	utils_common$2.appendToURLPath = appendToURLPath;
-	utils_common$2.setURLParameter = setURLParameter;
-	utils_common$2.getURLParameter = getURLParameter;
-	utils_common$2.setURLHost = setURLHost;
-	utils_common$2.getURLPath = getURLPath;
-	utils_common$2.getURLScheme = getURLScheme;
-	utils_common$2.getURLPathAndQuery = getURLPathAndQuery;
-	utils_common$2.getURLQueries = getURLQueries;
-	utils_common$2.appendToURLQuery = appendToURLQuery;
-	utils_common$2.truncatedISO8061Date = truncatedISO8061Date;
-	utils_common$2.base64encode = base64encode;
-	utils_common$2.base64decode = base64decode;
-	utils_common$2.generateBlockID = generateBlockID;
-	utils_common$2.delay = delay;
-	utils_common$2.padStart = padStart;
-	utils_common$2.sanitizeURL = sanitizeURL;
-	utils_common$2.sanitizeHeaders = sanitizeHeaders;
-	utils_common$2.iEqual = iEqual;
-	utils_common$2.getAccountNameFromUrl = getAccountNameFromUrl;
-	utils_common$2.isIpEndpointStyle = isIpEndpointStyle;
-	utils_common$2.toBlobTagsString = toBlobTagsString;
-	utils_common$2.toBlobTags = toBlobTags;
-	utils_common$2.toTags = toTags;
-	utils_common$2.toQuerySerialization = toQuerySerialization;
-	utils_common$2.parseObjectReplicationRecord = parseObjectReplicationRecord;
-	utils_common$2.attachCredential = attachCredential;
-	utils_common$2.httpAuthorizationToString = httpAuthorizationToString;
-	utils_common$2.BlobNameToString = BlobNameToString;
-	utils_common$2.ConvertInternalResponseOfListBlobFlat = ConvertInternalResponseOfListBlobFlat;
-	utils_common$2.ConvertInternalResponseOfListBlobHierarchy = ConvertInternalResponseOfListBlobHierarchy;
-	utils_common$2.ExtractPageRangeInfoItems = ExtractPageRangeInfoItems;
-	utils_common$2.EscapePath = EscapePath;
-	utils_common$2.assertResponse = assertResponse;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const constants_js_1 = requireConstants$3();
-	/**
-	 * Reserved URL characters must be properly escaped for Storage services like Blob or File.
-	 *
-	 * ## URL encode and escape strategy for JS SDKs
-	 *
-	 * When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.
-	 * But before sending to Azure Storage server, the URL must be encoded. However, it's hard for a SDK to guess whether the URL
-	 * string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.
-	 *
-	 * ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.
-	 *
-	 * This is what legacy V2 SDK does, simple and works for most of the cases.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
-	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
-	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.
-	 *
-	 * But this strategy will make it not possible to create a blob with "?" in it's name. Because when customer URL string is
-	 * "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.
-	 * If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.
-	 * V2 SDK doesn't have this issue because it doesn't allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.
-	 * We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:
-	 *
-	 * ### Strategy Two: SDK doesn't assume the URL has been encoded or not. It will just escape the special characters.
-	 *
-	 * This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
-	 *   SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
-	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",
-	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.
-	 *
-	 * This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string
-	 * is not encoded, there shouldn't a "%" in the URL string, otherwise the URL is not a valid URL.
-	 * If customer needs to create a blob with "%" in it's blob name, use "%25" instead of "%". Just like above 3rd sample.
-	 * And following URL strings are invalid:
-	 * - "http://account.blob.core.windows.net/con/b%"
-	 * - "http://account.blob.core.windows.net/con/b%2"
-	 * - "http://account.blob.core.windows.net/con/b%G"
-	 *
-	 * Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.
-	 *
-	 * ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`
-	 *
-	 * We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.
-	 *
-	 * @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
-	 * @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata
-	 *
-	 * @param url -
-	 */
-	function escapeURLPath(url) {
-	    const urlParsed = new URL(url);
-	    let path = urlParsed.pathname;
-	    path = path || "/";
-	    path = escape(path);
-	    urlParsed.pathname = path;
-	    return urlParsed.toString();
-	}
-	function getProxyUriFromDevConnString(connectionString) {
-	    // Development Connection String
-	    // https://learn.microsoft.com/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key
-	    let proxyUri = "";
-	    if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {
-	        // CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri
-	        const matchCredentials = connectionString.split(";");
-	        for (const element of matchCredentials) {
-	            if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {
-	                proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];
-	            }
-	        }
-	    }
-	    return proxyUri;
-	}
-	function getValueInConnString(connectionString, argument) {
-	    const elements = connectionString.split(";");
-	    for (const element of elements) {
-	        if (element.trim().startsWith(argument)) {
-	            return element.trim().match(argument + "=(.*)")[1];
-	        }
-	    }
-	    return "";
-	}
-	/**
-	 * Extracts the parts of an Azure Storage account connection string.
-	 *
-	 * @param connectionString - Connection string.
-	 * @returns String key value pairs of the storage account's url and credentials.
-	 */
-	function extractConnectionStringParts(connectionString) {
-	    let proxyUri = "";
-	    if (connectionString.startsWith("UseDevelopmentStorage=true")) {
-	        // Development connection string
-	        proxyUri = getProxyUriFromDevConnString(connectionString);
-	        connectionString = constants_js_1.DevelopmentConnectionString;
-	    }
-	    // Matching BlobEndpoint in the Account connection string
-	    let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");
-	    // Slicing off '/' at the end if exists
-	    // (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)
-	    blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;
-	    if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&
-	        connectionString.search("AccountKey=") !== -1) {
-	        // Account connection string
-	        let defaultEndpointsProtocol = "";
-	        let accountName = "";
-	        let accountKey = Buffer.from("accountKey", "base64");
-	        let endpointSuffix = "";
-	        // Get account name and key
-	        accountName = getValueInConnString(connectionString, "AccountName");
-	        accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64");
-	        if (!blobEndpoint) {
-	            // BlobEndpoint is not present in the Account connection string
-	            // Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`
-	            defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");
-	            const protocol = defaultEndpointsProtocol.toLowerCase();
-	            if (protocol !== "https" && protocol !== "http") {
-	                throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'");
-	            }
-	            endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");
-	            if (!endpointSuffix) {
-	                throw new Error("Invalid EndpointSuffix in the provided Connection String");
-	            }
-	            blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
-	        }
-	        if (!accountName) {
-	            throw new Error("Invalid AccountName in the provided Connection String");
-	        }
-	        else if (accountKey.length === 0) {
-	            throw new Error("Invalid AccountKey in the provided Connection String");
-	        }
-	        return {
-	            kind: "AccountConnString",
-	            url: blobEndpoint,
-	            accountName,
-	            accountKey,
-	            proxyUri,
-	        };
-	    }
-	    else {
-	        // SAS connection string
-	        let accountSas = getValueInConnString(connectionString, "SharedAccessSignature");
-	        let accountName = getValueInConnString(connectionString, "AccountName");
-	        // if accountName is empty, try to read it from BlobEndpoint
-	        if (!accountName) {
-	            accountName = getAccountNameFromUrl(blobEndpoint);
-	        }
-	        if (!blobEndpoint) {
-	            throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");
-	        }
-	        else if (!accountSas) {
-	            throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");
-	        }
-	        // client constructors assume accountSas does *not* start with ?
-	        if (accountSas.startsWith("?")) {
-	            accountSas = accountSas.substring(1);
-	        }
-	        return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };
-	    }
-	}
-	/**
-	 * Internal escape method implemented Strategy Two mentioned in escapeURL() description.
-	 *
-	 * @param text -
-	 */
-	function escape(text) {
-	    return encodeURIComponent(text)
-	        .replace(/%2F/g, "/") // Don't escape for "/"
-	        .replace(/'/g, "%27") // Escape for "'"
-	        .replace(/\+/g, "%20")
-	        .replace(/%25/g, "%"); // Revert encoded "%"
-	}
-	/**
-	 * Append a string to URL path. Will remove duplicated "/" in front of the string
-	 * when URL path ends with a "/".
-	 *
-	 * @param url - Source URL string
-	 * @param name - String to be appended to URL
-	 * @returns An updated URL string
-	 */
-	function appendToURLPath(url, name) {
-	    const urlParsed = new URL(url);
-	    let path = urlParsed.pathname;
-	    path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;
-	    urlParsed.pathname = path;
-	    return urlParsed.toString();
-	}
-	/**
-	 * Set URL parameter name and value. If name exists in URL parameters, old value
-	 * will be replaced by name key. If not provide value, the parameter will be deleted.
-	 *
-	 * @param url - Source URL string
-	 * @param name - Parameter name
-	 * @param value - Parameter value
-	 * @returns An updated URL string
-	 */
-	function setURLParameter(url, name, value) {
-	    const urlParsed = new URL(url);
-	    const encodedName = encodeURIComponent(name);
-	    const encodedValue = value ? encodeURIComponent(value) : undefined;
-	    // mutating searchParams will change the encoding, so we have to do this ourselves
-	    const searchString = urlParsed.search === "" ? "?" : urlParsed.search;
-	    const searchPieces = [];
-	    for (const pair of searchString.slice(1).split("&")) {
-	        if (pair) {
-	            const [key] = pair.split("=", 2);
-	            if (key !== encodedName) {
-	                searchPieces.push(pair);
-	            }
-	        }
-	    }
-	    if (encodedValue) {
-	        searchPieces.push(`${encodedName}=${encodedValue}`);
-	    }
-	    urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
-	    return urlParsed.toString();
-	}
-	/**
-	 * Get URL parameter by name.
-	 *
-	 * @param url -
-	 * @param name -
-	 */
-	function getURLParameter(url, name) {
-	    const urlParsed = new URL(url);
-	    return urlParsed.searchParams.get(name) ?? undefined;
-	}
-	/**
-	 * Set URL host.
-	 *
-	 * @param url - Source URL string
-	 * @param host - New host string
-	 * @returns An updated URL string
-	 */
-	function setURLHost(url, host) {
-	    const urlParsed = new URL(url);
-	    urlParsed.hostname = host;
-	    return urlParsed.toString();
-	}
-	/**
-	 * Get URL path from an URL string.
-	 *
-	 * @param url - Source URL string
-	 */
-	function getURLPath(url) {
-	    try {
-	        const urlParsed = new URL(url);
-	        return urlParsed.pathname;
-	    }
-	    catch (e) {
-	        return undefined;
-	    }
-	}
-	/**
-	 * Get URL scheme from an URL string.
-	 *
-	 * @param url - Source URL string
-	 */
-	function getURLScheme(url) {
-	    try {
-	        const urlParsed = new URL(url);
-	        return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol;
-	    }
-	    catch (e) {
-	        return undefined;
-	    }
-	}
-	/**
-	 * Get URL path and query from an URL string.
-	 *
-	 * @param url - Source URL string
-	 */
-	function getURLPathAndQuery(url) {
-	    const urlParsed = new URL(url);
-	    const pathString = urlParsed.pathname;
-	    if (!pathString) {
-	        throw new RangeError("Invalid url without valid path.");
-	    }
-	    let queryString = urlParsed.search || "";
-	    queryString = queryString.trim();
-	    if (queryString !== "") {
-	        queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with '?'
-	    }
-	    return `${pathString}${queryString}`;
-	}
-	/**
-	 * Get URL query key value pairs from an URL string.
-	 *
-	 * @param url -
-	 */
-	function getURLQueries(url) {
-	    let queryString = new URL(url).search;
-	    if (!queryString) {
-	        return {};
-	    }
-	    queryString = queryString.trim();
-	    queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString;
-	    let querySubStrings = queryString.split("&");
-	    querySubStrings = querySubStrings.filter((value) => {
-	        const indexOfEqual = value.indexOf("=");
-	        const lastIndexOfEqual = value.lastIndexOf("=");
-	        return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);
-	    });
-	    const queries = {};
-	    for (const querySubString of querySubStrings) {
-	        const splitResults = querySubString.split("=");
-	        const key = splitResults[0];
-	        const value = splitResults[1];
-	        queries[key] = value;
-	    }
-	    return queries;
-	}
-	/**
-	 * Append a string to URL query.
-	 *
-	 * @param url - Source URL string.
-	 * @param queryParts - String to be appended to the URL query.
-	 * @returns An updated URL string.
-	 */
-	function appendToURLQuery(url, queryParts) {
-	    const urlParsed = new URL(url);
-	    let query = urlParsed.search;
-	    if (query) {
-	        query += "&" + queryParts;
-	    }
-	    else {
-	        query = queryParts;
-	    }
-	    urlParsed.search = query;
-	    return urlParsed.toString();
-	}
-	/**
-	 * Rounds a date off to seconds.
-	 *
-	 * @param date -
-	 * @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;
-	 *                                          If false, YYYY-MM-DDThh:mm:ssZ will be returned.
-	 * @returns Date string in ISO8061 format, with or without 7 milliseconds component
-	 */
-	function truncatedISO8061Date(date, withMilliseconds = true) {
-	    // Date.toISOString() will return like "2018-10-29T06:34:36.139Z"
-	    const dateString = date.toISOString();
-	    return withMilliseconds
-	        ? dateString.substring(0, dateString.length - 1) + "0000" + "Z"
-	        : dateString.substring(0, dateString.length - 5) + "Z";
-	}
-	/**
-	 * Base64 encode.
-	 *
-	 * @param content -
-	 */
-	function base64encode(content) {
-	    return !core_util_1.isNodeLike ? btoa(content) : Buffer.from(content).toString("base64");
-	}
-	/**
-	 * Base64 decode.
-	 *
-	 * @param encodedString -
-	 */
-	function base64decode(encodedString) {
-	    return !core_util_1.isNodeLike ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();
-	}
-	/**
-	 * Generate a 64 bytes base64 block ID string.
-	 *
-	 * @param blockIndex -
-	 */
-	function generateBlockID(blockIDPrefix, blockIndex) {
-	    // To generate a 64 bytes base64 string, source string should be 48
-	    const maxSourceStringLength = 48;
-	    // A blob can have a maximum of 100,000 uncommitted blocks at any given time
-	    const maxBlockIndexLength = 6;
-	    const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;
-	    if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {
-	        blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);
-	    }
-	    const res = blockIDPrefix +
-	        padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");
-	    return base64encode(res);
-	}
-	/**
-	 * Delay specified time interval.
-	 *
-	 * @param timeInMs -
-	 * @param aborter -
-	 * @param abortError -
-	 */
-	async function delay(timeInMs, aborter, abortError) {
-	    return new Promise((resolve, reject) => {
-	        /* eslint-disable-next-line prefer-const */
-	        let timeout;
-	        const abortHandler = () => {
-	            if (timeout !== undefined) {
-	                clearTimeout(timeout);
-	            }
-	            reject(abortError);
-	        };
-	        const resolveHandler = () => {
-	            if (aborter !== undefined) {
-	                aborter.removeEventListener("abort", abortHandler);
-	            }
-	            resolve();
-	        };
-	        timeout = setTimeout(resolveHandler, timeInMs);
-	        if (aborter !== undefined) {
-	            aborter.addEventListener("abort", abortHandler);
-	        }
-	    });
-	}
-	/**
-	 * String.prototype.padStart()
-	 *
-	 * @param currentString -
-	 * @param targetLength -
-	 * @param padString -
-	 */
-	function padStart(currentString, targetLength, padString = " ") {
-	    // @ts-expect-error: TS doesn't know this code needs to run downlevel sometimes
-	    if (String.prototype.padStart) {
-	        return currentString.padStart(targetLength, padString);
-	    }
-	    padString = padString || " ";
-	    if (currentString.length > targetLength) {
-	        return currentString;
-	    }
-	    else {
-	        targetLength = targetLength - currentString.length;
-	        if (targetLength > padString.length) {
-	            padString += padString.repeat(targetLength / padString.length);
-	        }
-	        return padString.slice(0, targetLength) + currentString;
-	    }
-	}
-	function sanitizeURL(url) {
-	    let safeURL = url;
-	    if (getURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE)) {
-	        safeURL = setURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE, "*****");
-	    }
-	    return safeURL;
-	}
-	function sanitizeHeaders(originalHeader) {
-	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)();
-	    for (const [name, value] of originalHeader) {
-	        if (name.toLowerCase() === constants_js_1.HeaderConstants.AUTHORIZATION.toLowerCase()) {
-	            headers.set(name, "*****");
-	        }
-	        else if (name.toLowerCase() === constants_js_1.HeaderConstants.X_MS_COPY_SOURCE) {
-	            headers.set(name, sanitizeURL(value));
-	        }
-	        else {
-	            headers.set(name, value);
-	        }
-	    }
-	    return headers;
-	}
-	/**
-	 * If two strings are equal when compared case insensitive.
-	 *
-	 * @param str1 -
-	 * @param str2 -
-	 */
-	function iEqual(str1, str2) {
-	    return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();
-	}
-	/**
-	 * Extracts account name from the url
-	 * @param url - url to extract the account name from
-	 * @returns with the account name
-	 */
-	function getAccountNameFromUrl(url) {
-	    const parsedUrl = new URL(url);
-	    let accountName;
-	    try {
-	        if (parsedUrl.hostname.split(".")[1] === "blob") {
-	            // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
-	            accountName = parsedUrl.hostname.split(".")[0];
-	        }
-	        else if (isIpEndpointStyle(parsedUrl)) {
-	            // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/
-	            // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/
-	            // .getPath() -> /devstoreaccount1/
-	            accountName = parsedUrl.pathname.split("/")[1];
-	        }
-	        else {
-	            // Custom domain case: "https://customdomain.com/containername/blob".
-	            accountName = "";
-	        }
-	        return accountName;
-	    }
-	    catch (error) {
-	        throw new Error("Unable to extract accountName with provided information.");
-	    }
-	}
-	function isIpEndpointStyle(parsedUrl) {
-	    const host = parsedUrl.host;
-	    // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'.
-	    // Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.
-	    // Case 3: Ipv4, use broad regex which just check if host contains Ipv4.
-	    // For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.
-	    return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||
-	        (Boolean(parsedUrl.port) && constants_js_1.PathStylePorts.includes(parsedUrl.port)));
-	}
-	/**
-	 * Convert Tags to encoded string.
-	 *
-	 * @param tags -
-	 */
-	function toBlobTagsString(tags) {
-	    if (tags === undefined) {
-	        return undefined;
-	    }
-	    const tagPairs = [];
-	    for (const key in tags) {
-	        if (Object.prototype.hasOwnProperty.call(tags, key)) {
-	            const value = tags[key];
-	            tagPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
-	        }
-	    }
-	    return tagPairs.join("&");
-	}
-	/**
-	 * Convert Tags type to BlobTags.
-	 *
-	 * @param tags -
-	 */
-	function toBlobTags(tags) {
-	    if (tags === undefined) {
-	        return undefined;
-	    }
-	    const res = {
-	        blobTagSet: [],
-	    };
-	    for (const key in tags) {
-	        if (Object.prototype.hasOwnProperty.call(tags, key)) {
-	            const value = tags[key];
-	            res.blobTagSet.push({
-	                key,
-	                value,
-	            });
-	        }
-	    }
-	    return res;
-	}
-	/**
-	 * Covert BlobTags to Tags type.
-	 *
-	 * @param tags -
-	 */
-	function toTags(tags) {
-	    if (tags === undefined) {
-	        return undefined;
-	    }
-	    const res = {};
-	    for (const blobTag of tags.blobTagSet) {
-	        res[blobTag.key] = blobTag.value;
-	    }
-	    return res;
-	}
-	/**
-	 * Convert BlobQueryTextConfiguration to QuerySerialization type.
-	 *
-	 * @param textConfiguration -
-	 */
-	function toQuerySerialization(textConfiguration) {
-	    if (textConfiguration === undefined) {
-	        return undefined;
-	    }
-	    switch (textConfiguration.kind) {
-	        case "csv":
-	            return {
-	                format: {
-	                    type: "delimited",
-	                    delimitedTextConfiguration: {
-	                        columnSeparator: textConfiguration.columnSeparator || ",",
-	                        fieldQuote: textConfiguration.fieldQuote || "",
-	                        recordSeparator: textConfiguration.recordSeparator,
-	                        escapeChar: textConfiguration.escapeCharacter || "",
-	                        headersPresent: textConfiguration.hasHeaders || false,
-	                    },
-	                },
-	            };
-	        case "json":
-	            return {
-	                format: {
-	                    type: "json",
-	                    jsonTextConfiguration: {
-	                        recordSeparator: textConfiguration.recordSeparator,
-	                    },
-	                },
-	            };
-	        case "arrow":
-	            return {
-	                format: {
-	                    type: "arrow",
-	                    arrowConfiguration: {
-	                        schema: textConfiguration.schema,
-	                    },
-	                },
-	            };
-	        case "parquet":
-	            return {
-	                format: {
-	                    type: "parquet",
-	                },
-	            };
-	        default:
-	            throw Error("Invalid BlobQueryTextConfiguration.");
-	    }
-	}
-	function parseObjectReplicationRecord(objectReplicationRecord) {
-	    if (!objectReplicationRecord) {
-	        return undefined;
-	    }
-	    if ("policy-id" in objectReplicationRecord) {
-	        // If the dictionary contains a key with policy id, we are not required to do any parsing since
-	        // the policy id should already be stored in the ObjectReplicationDestinationPolicyId.
-	        return undefined;
-	    }
-	    const orProperties = [];
-	    for (const key in objectReplicationRecord) {
-	        const ids = key.split("_");
-	        const policyPrefix = "or-";
-	        if (ids[0].startsWith(policyPrefix)) {
-	            ids[0] = ids[0].substring(policyPrefix.length);
-	        }
-	        const rule = {
-	            ruleId: ids[1],
-	            replicationStatus: objectReplicationRecord[key],
-	        };
-	        const policyIndex = orProperties.findIndex((policy) => policy.policyId === ids[0]);
-	        if (policyIndex > -1) {
-	            orProperties[policyIndex].rules.push(rule);
-	        }
-	        else {
-	            orProperties.push({
-	                policyId: ids[0],
-	                rules: [rule],
-	            });
-	        }
-	    }
-	    return orProperties;
-	}
-	/**
-	 * Attach a TokenCredential to an object.
-	 *
-	 * @param thing -
-	 * @param credential -
-	 */
-	function attachCredential(thing, credential) {
-	    thing.credential = credential;
-	    return thing;
-	}
-	function httpAuthorizationToString(httpAuthorization) {
-	    return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;
-	}
-	function BlobNameToString(name) {
-	    if (name.encoded) {
-	        return decodeURIComponent(name.content);
-	    }
-	    else {
-	        return name.content;
-	    }
-	}
-	function ConvertInternalResponseOfListBlobFlat(internalResponse) {
-	    return {
-	        ...internalResponse,
-	        segment: {
-	            blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {
-	                const blobItem = {
-	                    ...blobItemInteral,
-	                    name: BlobNameToString(blobItemInteral.name),
-	                };
-	                return blobItem;
-	            }),
-	        },
-	    };
-	}
-	function ConvertInternalResponseOfListBlobHierarchy(internalResponse) {
-	    return {
-	        ...internalResponse,
-	        segment: {
-	            blobPrefixes: internalResponse.segment.blobPrefixes?.map((blobPrefixInternal) => {
-	                const blobPrefix = {
-	                    ...blobPrefixInternal,
-	                    name: BlobNameToString(blobPrefixInternal.name),
-	                };
-	                return blobPrefix;
-	            }),
-	            blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {
-	                const blobItem = {
-	                    ...blobItemInteral,
-	                    name: BlobNameToString(blobItemInteral.name),
-	                };
-	                return blobItem;
-	            }),
-	        },
-	    };
-	}
-	function* ExtractPageRangeInfoItems(getPageRangesSegment) {
-	    let pageRange = [];
-	    let clearRange = [];
-	    if (getPageRangesSegment.pageRange)
-	        pageRange = getPageRangesSegment.pageRange;
-	    if (getPageRangesSegment.clearRange)
-	        clearRange = getPageRangesSegment.clearRange;
-	    let pageRangeIndex = 0;
-	    let clearRangeIndex = 0;
-	    while (pageRangeIndex < pageRange.length && clearRangeIndex < clearRange.length) {
-	        if (pageRange[pageRangeIndex].start < clearRange[clearRangeIndex].start) {
-	            yield {
-	                start: pageRange[pageRangeIndex].start,
-	                end: pageRange[pageRangeIndex].end,
-	                isClear: false,
-	            };
-	            ++pageRangeIndex;
-	        }
-	        else {
-	            yield {
-	                start: clearRange[clearRangeIndex].start,
-	                end: clearRange[clearRangeIndex].end,
-	                isClear: true,
-	            };
-	            ++clearRangeIndex;
-	        }
-	    }
-	    for (; pageRangeIndex < pageRange.length; ++pageRangeIndex) {
-	        yield {
-	            start: pageRange[pageRangeIndex].start,
-	            end: pageRange[pageRangeIndex].end,
-	            isClear: false,
-	        };
-	    }
-	    for (; clearRangeIndex < clearRange.length; ++clearRangeIndex) {
-	        yield {
-	            start: clearRange[clearRangeIndex].start,
-	            end: clearRange[clearRangeIndex].end,
-	            isClear: true,
-	        };
-	    }
-	}
-	/**
-	 * Escape the blobName but keep path separator ('/').
-	 */
-	function EscapePath(blobName) {
-	    const split = blobName.split("/");
-	    for (let i = 0; i < split.length; i++) {
-	        split[i] = encodeURIComponent(split[i]);
-	    }
-	    return split.join("/");
-	}
-	/**
-	 * A typesafe helper for ensuring that a given response object has
-	 * the original _response attached.
-	 * @param response - A response object from calling a client operation
-	 * @returns The same object, but with known _response property
-	 */
-	function assertResponse(response) {
-	    if (`_response` in response) {
-	        return response;
-	    }
-	    throw new TypeError(`Unexpected response object ${response}`);
-	}
-	
-	return utils_common$2;
-}
-
-var StorageRetryPolicyType$1 = {};
-
-var hasRequiredStorageRetryPolicyType$1;
-
-function requireStorageRetryPolicyType$1 () {
-	if (hasRequiredStorageRetryPolicyType$1) return StorageRetryPolicyType$1;
-	hasRequiredStorageRetryPolicyType$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageRetryPolicyType$1, "__esModule", { value: true });
-	StorageRetryPolicyType$1.StorageRetryPolicyType = void 0;
-	/**
-	 * RetryPolicy types.
-	 */
-	var StorageRetryPolicyType;
-	(function (StorageRetryPolicyType) {
-	    /**
-	     * Exponential retry. Retry time delay grows exponentially.
-	     */
-	    StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";
-	    /**
-	     * Linear retry. Retry time delay grows linearly.
-	     */
-	    StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";
-	})(StorageRetryPolicyType || (StorageRetryPolicyType$1.StorageRetryPolicyType = StorageRetryPolicyType = {}));
-	
-	return StorageRetryPolicyType$1;
-}
-
-var hasRequiredStorageRetryPolicy$1;
-
-function requireStorageRetryPolicy$1 () {
-	if (hasRequiredStorageRetryPolicy$1) return StorageRetryPolicy$1;
-	hasRequiredStorageRetryPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageRetryPolicy$1, "__esModule", { value: true });
-	StorageRetryPolicy$1.StorageRetryPolicy = void 0;
-	StorageRetryPolicy$1.NewRetryPolicyFactory = NewRetryPolicyFactory;
-	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
-	const RequestPolicy_js_1 = requireRequestPolicy$1();
-	const constants_js_1 = requireConstants$3();
-	const utils_common_js_1 = requireUtils_common$2();
-	const log_js_1 = requireLog$1();
-	const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType$1();
-	/**
-	 * A factory method used to generated a RetryPolicy factory.
-	 *
-	 * @param retryOptions -
-	 */
-	function NewRetryPolicyFactory(retryOptions) {
-	    return {
-	        create: (nextPolicy, options) => {
-	            return new StorageRetryPolicy(nextPolicy, options, retryOptions);
-	        },
-	    };
-	}
-	// Default values of StorageRetryOptions
-	const DEFAULT_RETRY_OPTIONS = {
-	    maxRetryDelayInMs: 120 * 1000,
-	    maxTries: 4,
-	    retryDelayInMs: 4 * 1000,
-	    retryPolicyType: StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL,
-	    secondaryHost: "",
-	    tryTimeoutInMs: undefined, // Use server side default timeout strategy
-	};
-	const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
-	/**
-	 * Retry policy with exponential retry and linear retry implemented.
-	 */
-	class StorageRetryPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
-	    /**
-	     * RetryOptions.
-	     */
-	    retryOptions;
-	    /**
-	     * Creates an instance of RetryPolicy.
-	     *
-	     * @param nextPolicy -
-	     * @param options -
-	     * @param retryOptions -
-	     */
-	    constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {
-	        super(nextPolicy, options);
-	        // Initialize retry options
-	        this.retryOptions = {
-	            retryPolicyType: retryOptions.retryPolicyType
-	                ? retryOptions.retryPolicyType
-	                : DEFAULT_RETRY_OPTIONS.retryPolicyType,
-	            maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1
-	                ? Math.floor(retryOptions.maxTries)
-	                : DEFAULT_RETRY_OPTIONS.maxTries,
-	            tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0
-	                ? retryOptions.tryTimeoutInMs
-	                : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,
-	            retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0
-	                ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs
-	                    ? retryOptions.maxRetryDelayInMs
-	                    : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)
-	                : DEFAULT_RETRY_OPTIONS.retryDelayInMs,
-	            maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0
-	                ? retryOptions.maxRetryDelayInMs
-	                : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,
-	            secondaryHost: retryOptions.secondaryHost
-	                ? retryOptions.secondaryHost
-	                : DEFAULT_RETRY_OPTIONS.secondaryHost,
-	        };
-	    }
-	    /**
-	     * Sends request.
-	     *
-	     * @param request -
-	     */
-	    async sendRequest(request) {
-	        return this.attemptSendRequest(request, false, 1);
-	    }
-	    /**
-	     * Decide and perform next retry. Won't mutate request parameter.
-	     *
-	     * @param request -
-	     * @param secondaryHas404 -  If attempt was against the secondary & it returned a StatusNotFound (404), then
-	     *                                   the resource was not found. This may be due to replication delay. So, in this
-	     *                                   case, we'll never try the secondary again for this operation.
-	     * @param attempt -           How many retries has been attempted to performed, starting from 1, which includes
-	     *                                   the attempt will be performed by this method call.
-	     */
-	    async attemptSendRequest(request, secondaryHas404, attempt) {
-	        const newRequest = request.clone();
-	        const isPrimaryRetry = secondaryHas404 ||
-	            !this.retryOptions.secondaryHost ||
-	            !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||
-	            attempt % 2 === 1;
-	        if (!isPrimaryRetry) {
-	            newRequest.url = (0, utils_common_js_1.setURLHost)(newRequest.url, this.retryOptions.secondaryHost);
-	        }
-	        // Set the server-side timeout query parameter "timeout=[seconds]"
-	        if (this.retryOptions.tryTimeoutInMs) {
-	            newRequest.url = (0, utils_common_js_1.setURLParameter)(newRequest.url, constants_js_1.URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());
-	        }
-	        let response;
-	        try {
-	            log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
-	            response = await this._nextPolicy.sendRequest(newRequest);
-	            if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {
-	                return response;
-	            }
-	            secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
-	        }
-	        catch (err) {
-	            log_js_1.logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);
-	            if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {
-	                throw err;
-	            }
-	        }
-	        await this.delay(isPrimaryRetry, attempt, request.abortSignal);
-	        return this.attemptSendRequest(request, secondaryHas404, ++attempt);
-	    }
-	    /**
-	     * Decide whether to retry according to last HTTP response and retry counters.
-	     *
-	     * @param isPrimaryRetry -
-	     * @param attempt -
-	     * @param response -
-	     * @param err -
-	     */
-	    shouldRetry(isPrimaryRetry, attempt, response, err) {
-	        if (attempt >= this.retryOptions.maxTries) {
-	            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions
-	                .maxTries}, no further try.`);
-	            return false;
-	        }
-	        // Handle network failures, you may need to customize the list when you implement
-	        // your own http client
-	        const retriableErrors = [
-	            "ETIMEDOUT",
-	            "ESOCKETTIMEDOUT",
-	            "ECONNREFUSED",
-	            "ECONNRESET",
-	            "ENOENT",
-	            "ENOTFOUND",
-	            "TIMEOUT",
-	            "EPIPE",
-	            "REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js
-	        ];
-	        if (err) {
-	            for (const retriableError of retriableErrors) {
-	                if (err.name.toUpperCase().includes(retriableError) ||
-	                    err.message.toUpperCase().includes(retriableError) ||
-	                    (err.code && err.code.toString().toUpperCase() === retriableError)) {
-	                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
-	                    return true;
-	                }
-	            }
-	        }
-	        // If attempt was against the secondary & it returned a StatusNotFound (404), then
-	        // the resource was not found. This may be due to replication delay. So, in this
-	        // case, we'll never try the secondary again for this operation.
-	        if (response || err) {
-	            const statusCode = response ? response.status : err ? err.statusCode : 0;
-	            if (!isPrimaryRetry && statusCode === 404) {
-	                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
-	                return true;
-	            }
-	            // Server internal error or server timeout
-	            if (statusCode === 503 || statusCode === 500) {
-	                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
-	                return true;
-	            }
-	        }
-	        if (response) {
-	            // Retry select Copy Source Error Codes.
-	            if (response?.status >= 400) {
-	                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
-	                if (copySourceError !== undefined) {
-	                    switch (copySourceError) {
-	                        case "InternalError":
-	                        case "OperationTimedOut":
-	                        case "ServerBusy":
-	                            return true;
-	                    }
-	                }
-	            }
-	        }
-	        if (err?.code === "PARSE_ERROR" && err?.message.startsWith(`Error "Error: Unclosed root tag`)) {
-	            log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
-	            return true;
-	        }
-	        return false;
-	    }
-	    /**
-	     * Delay a calculated time between retries.
-	     *
-	     * @param isPrimaryRetry -
-	     * @param attempt -
-	     * @param abortSignal -
-	     */
-	    async delay(isPrimaryRetry, attempt, abortSignal) {
-	        let delayTimeInMs = 0;
-	        if (isPrimaryRetry) {
-	            switch (this.retryOptions.retryPolicyType) {
-	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL:
-	                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);
-	                    break;
-	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.FIXED:
-	                    delayTimeInMs = this.retryOptions.retryDelayInMs;
-	                    break;
-	            }
-	        }
-	        else {
-	            delayTimeInMs = Math.random() * 1000;
-	        }
-	        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
-	        return (0, utils_common_js_1.delay)(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);
-	    }
-	}
-	StorageRetryPolicy$1.StorageRetryPolicy = StorageRetryPolicy;
-	
-	return StorageRetryPolicy$1;
-}
-
-var hasRequiredStorageRetryPolicyFactory$1;
-
-function requireStorageRetryPolicyFactory$1 () {
-	if (hasRequiredStorageRetryPolicyFactory$1) return StorageRetryPolicyFactory$1;
-	hasRequiredStorageRetryPolicyFactory$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.StorageRetryPolicyFactory = exports$1.StorageRetryPolicy = exports$1.StorageRetryPolicyType = void 0;
-		const StorageRetryPolicy_js_1 = requireStorageRetryPolicy$1();
-		Object.defineProperty(exports$1, "StorageRetryPolicy", { enumerable: true, get: function () { return StorageRetryPolicy_js_1.StorageRetryPolicy; } });
-		const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType$1();
-		Object.defineProperty(exports$1, "StorageRetryPolicyType", { enumerable: true, get: function () { return StorageRetryPolicyType_js_1.StorageRetryPolicyType; } });
-		/**
-		 * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.
-		 */
-		class StorageRetryPolicyFactory {
-		    retryOptions;
-		    /**
-		     * Creates an instance of StorageRetryPolicyFactory.
-		     * @param retryOptions -
-		     */
-		    constructor(retryOptions) {
-		        this.retryOptions = retryOptions;
-		    }
-		    /**
-		     * Creates a StorageRetryPolicy object.
-		     *
-		     * @param nextPolicy -
-		     * @param options -
-		     */
-		    create(nextPolicy, options) {
-		        return new StorageRetryPolicy_js_1.StorageRetryPolicy(nextPolicy, options, this.retryOptions);
-		    }
-		}
-		exports$1.StorageRetryPolicyFactory = StorageRetryPolicyFactory;
-		
-	} (StorageRetryPolicyFactory$1));
-	return StorageRetryPolicyFactory$1;
-}
-
-var StorageSharedKeyCredential$1 = {};
-
-var StorageSharedKeyCredentialPolicy$1 = {};
-
-var CredentialPolicy$1 = {};
-
-var hasRequiredCredentialPolicy$1;
-
-function requireCredentialPolicy$1 () {
-	if (hasRequiredCredentialPolicy$1) return CredentialPolicy$1;
-	hasRequiredCredentialPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(CredentialPolicy$1, "__esModule", { value: true });
-	CredentialPolicy$1.CredentialPolicy = void 0;
-	const RequestPolicy_js_1 = requireRequestPolicy$1();
-	/**
-	 * Credential policy used to sign HTTP(S) requests before sending. This is an
-	 * abstract class.
-	 */
-	class CredentialPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
-	    /**
-	     * Sends out request.
-	     *
-	     * @param request -
-	     */
-	    sendRequest(request) {
-	        return this._nextPolicy.sendRequest(this.signRequest(request));
-	    }
-	    /**
-	     * Child classes must implement this method with request signing. This method
-	     * will be executed in {@link sendRequest}.
-	     *
-	     * @param request -
-	     */
-	    signRequest(request) {
-	        // Child classes must override this method with request signing. This method
-	        // will be executed in sendRequest().
-	        return request;
-	    }
-	}
-	CredentialPolicy$1.CredentialPolicy = CredentialPolicy;
-	
-	return CredentialPolicy$1;
-}
-
-var SharedKeyComparator$1 = {};
-
-var hasRequiredSharedKeyComparator$1;
-
-function requireSharedKeyComparator$1 () {
-	if (hasRequiredSharedKeyComparator$1) return SharedKeyComparator$1;
-	hasRequiredSharedKeyComparator$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(SharedKeyComparator$1, "__esModule", { value: true });
-	SharedKeyComparator$1.compareHeader = compareHeader;
-	/*
-	 * We need to imitate .Net culture-aware sorting, which is used in storage service.
-	 * Below tables contain sort-keys for en-US culture.
-	 */
-	const table_lv0 = new Uint32Array([
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721,
-	    0x723, 0x725, 0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e,
-	    0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe02, 0xe09, 0xe0a,
-	    0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89,
-	    0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x0, 0x0, 0x743, 0x744, 0x748,
-	    0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70,
-	    0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c,
-	    0x0, 0x750, 0x0,
-	]);
-	const table_lv2 = new Uint32Array([
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-	    0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-	    0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	]);
-	const table_lv4 = new Uint32Array([
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	]);
-	function compareHeader(lhs, rhs) {
-	    if (isLessThan(lhs, rhs))
-	        return -1;
-	    return 1;
-	}
-	function isLessThan(lhs, rhs) {
-	    const tables = [table_lv0, table_lv2, table_lv4];
-	    let curr_level = 0;
-	    let i = 0;
-	    let j = 0;
-	    while (curr_level < tables.length) {
-	        if (curr_level === tables.length - 1 && i !== j) {
-	            return i > j;
-	        }
-	        const weight1 = i < lhs.length ? tables[curr_level][lhs[i].charCodeAt(0)] : 0x1;
-	        const weight2 = j < rhs.length ? tables[curr_level][rhs[j].charCodeAt(0)] : 0x1;
-	        if (weight1 === 0x1 && weight2 === 0x1) {
-	            i = 0;
-	            j = 0;
-	            ++curr_level;
-	        }
-	        else if (weight1 === weight2) {
-	            ++i;
-	            ++j;
-	        }
-	        else if (weight1 === 0) {
-	            ++i;
-	        }
-	        else if (weight2 === 0) {
-	            ++j;
-	        }
-	        else {
-	            return weight1 < weight2;
-	        }
-	    }
-	    return false;
-	}
-	
-	return SharedKeyComparator$1;
-}
-
-var hasRequiredStorageSharedKeyCredentialPolicy$1;
-
-function requireStorageSharedKeyCredentialPolicy$1 () {
-	if (hasRequiredStorageSharedKeyCredentialPolicy$1) return StorageSharedKeyCredentialPolicy$1;
-	hasRequiredStorageSharedKeyCredentialPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageSharedKeyCredentialPolicy$1, "__esModule", { value: true });
-	StorageSharedKeyCredentialPolicy$1.StorageSharedKeyCredentialPolicy = void 0;
-	const constants_js_1 = requireConstants$3();
-	const utils_common_js_1 = requireUtils_common$2();
-	const CredentialPolicy_js_1 = requireCredentialPolicy$1();
-	const SharedKeyComparator_js_1 = requireSharedKeyComparator$1();
-	/**
-	 * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.
-	 */
-	class StorageSharedKeyCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
-	    /**
-	     * Reference to StorageSharedKeyCredential which generates StorageSharedKeyCredentialPolicy
-	     */
-	    factory;
-	    /**
-	     * Creates an instance of StorageSharedKeyCredentialPolicy.
-	     * @param nextPolicy -
-	     * @param options -
-	     * @param factory -
-	     */
-	    constructor(nextPolicy, options, factory) {
-	        super(nextPolicy, options);
-	        this.factory = factory;
-	    }
-	    /**
-	     * Signs request.
-	     *
-	     * @param request -
-	     */
-	    signRequest(request) {
-	        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
-	        if (request.body &&
-	            (typeof request.body === "string" || request.body !== undefined) &&
-	            request.body.length > 0) {
-	            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
-	        }
-	        const stringToSign = [
-	            request.method.toUpperCase(),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
-	        ].join("\n") +
-	            "\n" +
-	            this.getCanonicalizedHeadersString(request) +
-	            this.getCanonicalizedResourceString(request);
-	        const signature = this.factory.computeHMACSHA256(stringToSign);
-	        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);
-	        // console.log(`[URL]:${request.url}`);
-	        // console.log(`[HEADERS]:${request.headers.toString()}`);
-	        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
-	        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
-	        return request;
-	    }
-	    /**
-	     * Retrieve header value according to shared key sign rules.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
-	     *
-	     * @param request -
-	     * @param headerName -
-	     */
-	    getHeaderValueToSign(request, headerName) {
-	        const value = request.headers.get(headerName);
-	        if (!value) {
-	            return "";
-	        }
-	        // When using version 2015-02-21 or later, if Content-Length is zero, then
-	        // set the Content-Length part of the StringToSign to an empty string.
-	        // https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
-	        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
-	            return "";
-	        }
-	        return value;
-	    }
-	    /**
-	     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
-	     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
-	     * 2. Convert each HTTP header name to lowercase.
-	     * 3. Sort the headers lexicographically by header name, in ascending order.
-	     *    Each header may appear only once in the string.
-	     * 4. Replace any linear whitespace in the header value with a single space.
-	     * 5. Trim any whitespace around the colon in the header.
-	     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
-	     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
-	     *
-	     * @param request -
-	     */
-	    getCanonicalizedHeadersString(request) {
-	        let headersArray = request.headers.headersArray().filter((value) => {
-	            return value.name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE);
-	        });
-	        headersArray.sort((a, b) => {
-	            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
-	        });
-	        // Remove duplicate headers
-	        headersArray = headersArray.filter((value, index, array) => {
-	            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
-	                return false;
-	            }
-	            return true;
-	        });
-	        let canonicalizedHeadersStringToSign = "";
-	        headersArray.forEach((header) => {
-	            canonicalizedHeadersStringToSign += `${header.name
-	                .toLowerCase()
-	                .trimRight()}:${header.value.trimLeft()}\n`;
-	        });
-	        return canonicalizedHeadersStringToSign;
-	    }
-	    /**
-	     * Retrieves the webResource canonicalized resource string.
-	     *
-	     * @param request -
-	     */
-	    getCanonicalizedResourceString(request) {
-	        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
-	        let canonicalizedResourceString = "";
-	        canonicalizedResourceString += `/${this.factory.accountName}${path}`;
-	        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
-	        const lowercaseQueries = {};
-	        if (queries) {
-	            const queryKeys = [];
-	            for (const key in queries) {
-	                if (Object.prototype.hasOwnProperty.call(queries, key)) {
-	                    const lowercaseKey = key.toLowerCase();
-	                    lowercaseQueries[lowercaseKey] = queries[key];
-	                    queryKeys.push(lowercaseKey);
-	                }
-	            }
-	            queryKeys.sort();
-	            for (const key of queryKeys) {
-	                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
-	            }
-	        }
-	        return canonicalizedResourceString;
-	    }
-	}
-	StorageSharedKeyCredentialPolicy$1.StorageSharedKeyCredentialPolicy = StorageSharedKeyCredentialPolicy;
-	
-	return StorageSharedKeyCredentialPolicy$1;
-}
-
-var Credential$1 = {};
-
-var hasRequiredCredential$1;
-
-function requireCredential$1 () {
-	if (hasRequiredCredential$1) return Credential$1;
-	hasRequiredCredential$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(Credential$1, "__esModule", { value: true });
-	Credential$1.Credential = void 0;
-	/**
-	 * Credential is an abstract class for Azure Storage HTTP requests signing. This
-	 * class will host an credentialPolicyCreator factory which generates CredentialPolicy.
-	 */
-	class Credential {
-	    /**
-	     * Creates a RequestPolicy object.
-	     *
-	     * @param _nextPolicy -
-	     * @param _options -
-	     */
-	    create(_nextPolicy, _options) {
-	        throw new Error("Method should be implemented in children classes.");
-	    }
-	}
-	Credential$1.Credential = Credential;
-	
-	return Credential$1;
-}
-
-var hasRequiredStorageSharedKeyCredential$1;
-
-function requireStorageSharedKeyCredential$1 () {
-	if (hasRequiredStorageSharedKeyCredential$1) return StorageSharedKeyCredential$1;
-	hasRequiredStorageSharedKeyCredential$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageSharedKeyCredential$1, "__esModule", { value: true });
-	StorageSharedKeyCredential$1.StorageSharedKeyCredential = void 0;
-	const node_crypto_1 = require$$0$g;
-	const StorageSharedKeyCredentialPolicy_js_1 = requireStorageSharedKeyCredentialPolicy$1();
-	const Credential_js_1 = requireCredential$1();
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * StorageSharedKeyCredential for account key authorization of Azure Storage service.
-	 */
-	class StorageSharedKeyCredential extends Credential_js_1.Credential {
-	    /**
-	     * Azure Storage account name; readonly.
-	     */
-	    accountName;
-	    /**
-	     * Azure Storage account key; readonly.
-	     */
-	    accountKey;
-	    /**
-	     * Creates an instance of StorageSharedKeyCredential.
-	     * @param accountName -
-	     * @param accountKey -
-	     */
-	    constructor(accountName, accountKey) {
-	        super();
-	        this.accountName = accountName;
-	        this.accountKey = Buffer.from(accountKey, "base64");
-	    }
-	    /**
-	     * Creates a StorageSharedKeyCredentialPolicy object.
-	     *
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    create(nextPolicy, options) {
-	        return new StorageSharedKeyCredentialPolicy_js_1.StorageSharedKeyCredentialPolicy(nextPolicy, options, this);
-	    }
-	    /**
-	     * Generates a hash signature for an HTTP request or for a SAS.
-	     *
-	     * @param stringToSign -
-	     */
-	    computeHMACSHA256(stringToSign) {
-	        return (0, node_crypto_1.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");
-	    }
-	}
-	StorageSharedKeyCredential$1.StorageSharedKeyCredential = StorageSharedKeyCredential;
-	
-	return StorageSharedKeyCredential$1;
-}
-
-var AnonymousCredential$1 = {};
-
-var AnonymousCredentialPolicy$1 = {};
-
-var hasRequiredAnonymousCredentialPolicy$1;
-
-function requireAnonymousCredentialPolicy$1 () {
-	if (hasRequiredAnonymousCredentialPolicy$1) return AnonymousCredentialPolicy$1;
-	hasRequiredAnonymousCredentialPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AnonymousCredentialPolicy$1, "__esModule", { value: true });
-	AnonymousCredentialPolicy$1.AnonymousCredentialPolicy = void 0;
-	const CredentialPolicy_js_1 = requireCredentialPolicy$1();
-	/**
-	 * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources
-	 * or for use with Shared Access Signatures (SAS).
-	 */
-	class AnonymousCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
-	    /**
-	     * Creates an instance of AnonymousCredentialPolicy.
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
-	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
-	    constructor(nextPolicy, options) {
-	        super(nextPolicy, options);
-	    }
-	}
-	AnonymousCredentialPolicy$1.AnonymousCredentialPolicy = AnonymousCredentialPolicy;
-	
-	return AnonymousCredentialPolicy$1;
-}
-
-var hasRequiredAnonymousCredential$1;
-
-function requireAnonymousCredential$1 () {
-	if (hasRequiredAnonymousCredential$1) return AnonymousCredential$1;
-	hasRequiredAnonymousCredential$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AnonymousCredential$1, "__esModule", { value: true });
-	AnonymousCredential$1.AnonymousCredential = void 0;
-	const AnonymousCredentialPolicy_js_1 = requireAnonymousCredentialPolicy$1();
-	const Credential_js_1 = requireCredential$1();
-	/**
-	 * AnonymousCredential provides a credentialPolicyCreator member used to create
-	 * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with
-	 * HTTP(S) requests that read public resources or for use with Shared Access
-	 * Signatures (SAS).
-	 */
-	class AnonymousCredential extends Credential_js_1.Credential {
-	    /**
-	     * Creates an {@link AnonymousCredentialPolicy} object.
-	     *
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    create(nextPolicy, options) {
-	        return new AnonymousCredentialPolicy_js_1.AnonymousCredentialPolicy(nextPolicy, options);
-	    }
-	}
-	AnonymousCredential$1.AnonymousCredential = AnonymousCredential;
-	
-	return AnonymousCredential$1;
-}
-
-var commonjs$2 = {};
-
-var BufferScheduler = {};
-
-var PooledBuffer = {};
-
-var BuffersStream = {};
-
-var hasRequiredBuffersStream;
-
-function requireBuffersStream () {
-	if (hasRequiredBuffersStream) return BuffersStream;
-	hasRequiredBuffersStream = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BuffersStream, "__esModule", { value: true });
-	BuffersStream.BuffersStream = void 0;
-	const node_stream_1 = require$$0$c;
-	/**
-	 * This class generates a readable stream from the data in an array of buffers.
-	 */
-	let BuffersStream$1 = class BuffersStream extends node_stream_1.Readable {
-	    buffers;
-	    byteLength;
-	    /**
-	     * The offset of data to be read in the current buffer.
-	     */
-	    byteOffsetInCurrentBuffer;
-	    /**
-	     * The index of buffer to be read in the array of buffers.
-	     */
-	    bufferIndex;
-	    /**
-	     * The total length of data already read.
-	     */
-	    pushedBytesLength;
-	    /**
-	     * Creates an instance of BuffersStream that will emit the data
-	     * contained in the array of buffers.
-	     *
-	     * @param buffers - Array of buffers containing the data
-	     * @param byteLength - The total length of data contained in the buffers
-	     */
-	    constructor(buffers, byteLength, options) {
-	        super(options);
-	        this.buffers = buffers;
-	        this.byteLength = byteLength;
-	        this.byteOffsetInCurrentBuffer = 0;
-	        this.bufferIndex = 0;
-	        this.pushedBytesLength = 0;
-	        // check byteLength is no larger than buffers[] total length
-	        let buffersLength = 0;
-	        for (const buf of this.buffers) {
-	            buffersLength += buf.byteLength;
-	        }
-	        if (buffersLength < this.byteLength) {
-	            throw new Error("Data size shouldn't be larger than the total length of buffers.");
-	        }
-	    }
-	    /**
-	     * Internal _read() that will be called when the stream wants to pull more data in.
-	     *
-	     * @param size - Optional. The size of data to be read
-	     */
-	    _read(size) {
-	        if (this.pushedBytesLength >= this.byteLength) {
-	            this.push(null);
-	        }
-	        if (!size) {
-	            size = this.readableHighWaterMark;
-	        }
-	        const outBuffers = [];
-	        let i = 0;
-	        while (i < size && this.pushedBytesLength < this.byteLength) {
-	            // The last buffer may be longer than the data it contains.
-	            const remainingDataInAllBuffers = this.byteLength - this.pushedBytesLength;
-	            const remainingCapacityInThisBuffer = this.buffers[this.bufferIndex].byteLength - this.byteOffsetInCurrentBuffer;
-	            const remaining = Math.min(remainingCapacityInThisBuffer, remainingDataInAllBuffers);
-	            if (remaining > size - i) {
-	                // chunkSize = size - i
-	                const end = this.byteOffsetInCurrentBuffer + size - i;
-	                outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));
-	                this.pushedBytesLength += size - i;
-	                this.byteOffsetInCurrentBuffer = end;
-	                i = size;
-	                break;
-	            }
-	            else {
-	                // chunkSize = remaining
-	                const end = this.byteOffsetInCurrentBuffer + remaining;
-	                outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));
-	                if (remaining === remainingCapacityInThisBuffer) {
-	                    // this.buffers[this.bufferIndex] used up, shift to next one
-	                    this.byteOffsetInCurrentBuffer = 0;
-	                    this.bufferIndex++;
-	                }
-	                else {
-	                    this.byteOffsetInCurrentBuffer = end;
-	                }
-	                this.pushedBytesLength += remaining;
-	                i += remaining;
-	            }
-	        }
-	        if (outBuffers.length > 1) {
-	            this.push(Buffer.concat(outBuffers));
-	        }
-	        else if (outBuffers.length === 1) {
-	            this.push(outBuffers[0]);
-	        }
-	    }
-	};
-	BuffersStream.BuffersStream = BuffersStream$1;
-	
-	return BuffersStream;
-}
-
-var hasRequiredPooledBuffer;
-
-function requirePooledBuffer () {
-	if (hasRequiredPooledBuffer) return PooledBuffer;
-	hasRequiredPooledBuffer = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(PooledBuffer, "__esModule", { value: true });
-	PooledBuffer.PooledBuffer = void 0;
-	const tslib_1 = require$$0$2;
-	const BuffersStream_js_1 = requireBuffersStream();
-	const node_buffer_1 = tslib_1.__importDefault(require$$2$5);
-	/**
-	 * maxBufferLength is max size of each buffer in the pooled buffers.
-	 */
-	const maxBufferLength = node_buffer_1.default.constants.MAX_LENGTH;
-	/**
-	 * This class provides a buffer container which conceptually has no hard size limit.
-	 * It accepts a capacity, an array of input buffers and the total length of input data.
-	 * It will allocate an internal "buffer" of the capacity and fill the data in the input buffers
-	 * into the internal "buffer" serially with respect to the total length.
-	 * Then by calling PooledBuffer.getReadableStream(), you can get a readable stream
-	 * assembled from all the data in the internal "buffer".
-	 */
-	let PooledBuffer$1 = class PooledBuffer {
-	    /**
-	     * Internal buffers used to keep the data.
-	     * Each buffer has a length of the maxBufferLength except last one.
-	     */
-	    buffers = [];
-	    /**
-	     * The total size of internal buffers.
-	     */
-	    capacity;
-	    /**
-	     * The total size of data contained in internal buffers.
-	     */
-	    _size;
-	    /**
-	     * The size of the data contained in the pooled buffers.
-	     */
-	    get size() {
-	        return this._size;
-	    }
-	    constructor(capacity, buffers, totalLength) {
-	        this.capacity = capacity;
-	        this._size = 0;
-	        // allocate
-	        const bufferNum = Math.ceil(capacity / maxBufferLength);
-	        for (let i = 0; i < bufferNum; i++) {
-	            let len = i === bufferNum - 1 ? capacity % maxBufferLength : maxBufferLength;
-	            if (len === 0) {
-	                len = maxBufferLength;
-	            }
-	            this.buffers.push(Buffer.allocUnsafe(len));
-	        }
-	        if (buffers) {
-	            this.fill(buffers, totalLength);
-	        }
-	    }
-	    /**
-	     * Fill the internal buffers with data in the input buffers serially
-	     * with respect to the total length and the total capacity of the internal buffers.
-	     * Data copied will be shift out of the input buffers.
-	     *
-	     * @param buffers - Input buffers containing the data to be filled in the pooled buffer
-	     * @param totalLength - Total length of the data to be filled in.
-	     *
-	     */
-	    fill(buffers, totalLength) {
-	        this._size = Math.min(this.capacity, totalLength);
-	        let i = 0, j = 0, targetOffset = 0, sourceOffset = 0, totalCopiedNum = 0;
-	        while (totalCopiedNum < this._size) {
-	            const source = buffers[i];
-	            const target = this.buffers[j];
-	            const copiedNum = source.copy(target, targetOffset, sourceOffset);
-	            totalCopiedNum += copiedNum;
-	            sourceOffset += copiedNum;
-	            targetOffset += copiedNum;
-	            if (sourceOffset === source.length) {
-	                i++;
-	                sourceOffset = 0;
-	            }
-	            if (targetOffset === target.length) {
-	                j++;
-	                targetOffset = 0;
-	            }
-	        }
-	        // clear copied from source buffers
-	        buffers.splice(0, i);
-	        if (buffers.length > 0) {
-	            buffers[0] = buffers[0].slice(sourceOffset);
-	        }
-	    }
-	    /**
-	     * Get the readable stream assembled from all the data in the internal buffers.
-	     *
-	     */
-	    getReadableStream() {
-	        return new BuffersStream_js_1.BuffersStream(this.buffers, this.size);
-	    }
-	};
-	PooledBuffer.PooledBuffer = PooledBuffer$1;
-	
-	return PooledBuffer;
-}
-
-var hasRequiredBufferScheduler;
-
-function requireBufferScheduler () {
-	if (hasRequiredBufferScheduler) return BufferScheduler;
-	hasRequiredBufferScheduler = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BufferScheduler, "__esModule", { value: true });
-	BufferScheduler.BufferScheduler = void 0;
-	const events_1 = require$$0$7;
-	const PooledBuffer_js_1 = requirePooledBuffer();
-	/**
-	 * This class accepts a Node.js Readable stream as input, and keeps reading data
-	 * from the stream into the internal buffer structure, until it reaches maxBuffers.
-	 * Every available buffer will try to trigger outgoingHandler.
-	 *
-	 * The internal buffer structure includes an incoming buffer array, and a outgoing
-	 * buffer array. The incoming buffer array includes the "empty" buffers can be filled
-	 * with new incoming data. The outgoing array includes the filled buffers to be
-	 * handled by outgoingHandler. Every above buffer size is defined by parameter bufferSize.
-	 *
-	 * NUM_OF_ALL_BUFFERS = BUFFERS_IN_INCOMING + BUFFERS_IN_OUTGOING + BUFFERS_UNDER_HANDLING
-	 *
-	 * NUM_OF_ALL_BUFFERS lesser than or equal to maxBuffers
-	 *
-	 * PERFORMANCE IMPROVEMENT TIPS:
-	 * 1. Input stream highWaterMark is better to set a same value with bufferSize
-	 *    parameter, which will avoid Buffer.concat() operations.
-	 * 2. concurrency should set a smaller value than maxBuffers, which is helpful to
-	 *    reduce the possibility when a outgoing handler waits for the stream data.
-	 *    in this situation, outgoing handlers are blocked.
-	 *    Outgoing queue shouldn't be empty.
-	 */
-	let BufferScheduler$1 = class BufferScheduler {
-	    /**
-	     * Size of buffers in incoming and outgoing queues. This class will try to align
-	     * data read from Readable stream into buffer chunks with bufferSize defined.
-	     */
-	    bufferSize;
-	    /**
-	     * How many buffers can be created or maintained.
-	     */
-	    maxBuffers;
-	    /**
-	     * A Node.js Readable stream.
-	     */
-	    readable;
-	    /**
-	     * OutgoingHandler is an async function triggered by BufferScheduler when there
-	     * are available buffers in outgoing array.
-	     */
-	    outgoingHandler;
-	    /**
-	     * An internal event emitter.
-	     */
-	    emitter = new events_1.EventEmitter();
-	    /**
-	     * Concurrency of executing outgoingHandlers. (0 lesser than concurrency lesser than or equal to maxBuffers)
-	     */
-	    concurrency;
-	    /**
-	     * An internal offset marker to track data offset in bytes of next outgoingHandler.
-	     */
-	    offset = 0;
-	    /**
-	     * An internal marker to track whether stream is end.
-	     */
-	    isStreamEnd = false;
-	    /**
-	     * An internal marker to track whether stream or outgoingHandler returns error.
-	     */
-	    isError = false;
-	    /**
-	     * How many handlers are executing.
-	     */
-	    executingOutgoingHandlers = 0;
-	    /**
-	     * Encoding of the input Readable stream which has string data type instead of Buffer.
-	     */
-	    encoding;
-	    /**
-	     * How many buffers have been allocated.
-	     */
-	    numBuffers = 0;
-	    /**
-	     * Because this class doesn't know how much data every time stream pops, which
-	     * is defined by highWaterMarker of the stream. So BufferScheduler will cache
-	     * data received from the stream, when data in unresolvedDataArray exceeds the
-	     * blockSize defined, it will try to concat a blockSize of buffer, fill into available
-	     * buffers from incoming and push to outgoing array.
-	     */
-	    unresolvedDataArray = [];
-	    /**
-	     * How much data consisted in unresolvedDataArray.
-	     */
-	    unresolvedLength = 0;
-	    /**
-	     * The array includes all the available buffers can be used to fill data from stream.
-	     */
-	    incoming = [];
-	    /**
-	     * The array (queue) includes all the buffers filled from stream data.
-	     */
-	    outgoing = [];
-	    /**
-	     * Creates an instance of BufferScheduler.
-	     *
-	     * @param readable - A Node.js Readable stream
-	     * @param bufferSize - Buffer size of every maintained buffer
-	     * @param maxBuffers - How many buffers can be allocated
-	     * @param outgoingHandler - An async function scheduled to be
-	     *                                          triggered when a buffer fully filled
-	     *                                          with stream data
-	     * @param concurrency - Concurrency of executing outgoingHandlers (>0)
-	     * @param encoding - [Optional] Encoding of Readable stream when it's a string stream
-	     */
-	    constructor(readable, bufferSize, maxBuffers, outgoingHandler, concurrency, encoding) {
-	        if (bufferSize <= 0) {
-	            throw new RangeError(`bufferSize must be larger than 0, current is ${bufferSize}`);
-	        }
-	        if (maxBuffers <= 0) {
-	            throw new RangeError(`maxBuffers must be larger than 0, current is ${maxBuffers}`);
-	        }
-	        if (concurrency <= 0) {
-	            throw new RangeError(`concurrency must be larger than 0, current is ${concurrency}`);
-	        }
-	        this.bufferSize = bufferSize;
-	        this.maxBuffers = maxBuffers;
-	        this.readable = readable;
-	        this.outgoingHandler = outgoingHandler;
-	        this.concurrency = concurrency;
-	        this.encoding = encoding;
-	    }
-	    /**
-	     * Start the scheduler, will return error when stream of any of the outgoingHandlers
-	     * returns error.
-	     *
-	     */
-	    async do() {
-	        return new Promise((resolve, reject) => {
-	            this.readable.on("data", (data) => {
-	                data = typeof data === "string" ? Buffer.from(data, this.encoding) : data;
-	                this.appendUnresolvedData(data);
-	                if (!this.resolveData()) {
-	                    this.readable.pause();
-	                }
-	            });
-	            this.readable.on("error", (err) => {
-	                this.emitter.emit("error", err);
-	            });
-	            this.readable.on("end", () => {
-	                this.isStreamEnd = true;
-	                this.emitter.emit("checkEnd");
-	            });
-	            this.emitter.on("error", (err) => {
-	                this.isError = true;
-	                this.readable.pause();
-	                reject(err);
-	            });
-	            this.emitter.on("checkEnd", () => {
-	                if (this.outgoing.length > 0) {
-	                    this.triggerOutgoingHandlers();
-	                    return;
-	                }
-	                if (this.isStreamEnd && this.executingOutgoingHandlers === 0) {
-	                    if (this.unresolvedLength > 0 && this.unresolvedLength < this.bufferSize) {
-	                        const buffer = this.shiftBufferFromUnresolvedDataArray();
-	                        this.outgoingHandler(() => buffer.getReadableStream(), buffer.size, this.offset)
-	                            .then(resolve)
-	                            .catch(reject);
-	                    }
-	                    else if (this.unresolvedLength >= this.bufferSize) {
-	                        return;
-	                    }
-	                    else {
-	                        resolve();
-	                    }
-	                }
-	            });
-	        });
-	    }
-	    /**
-	     * Insert a new data into unresolved array.
-	     *
-	     * @param data -
-	     */
-	    appendUnresolvedData(data) {
-	        this.unresolvedDataArray.push(data);
-	        this.unresolvedLength += data.length;
-	    }
-	    /**
-	     * Try to shift a buffer with size in blockSize. The buffer returned may be less
-	     * than blockSize when data in unresolvedDataArray is less than bufferSize.
-	     *
-	     */
-	    shiftBufferFromUnresolvedDataArray(buffer) {
-	        if (!buffer) {
-	            buffer = new PooledBuffer_js_1.PooledBuffer(this.bufferSize, this.unresolvedDataArray, this.unresolvedLength);
-	        }
-	        else {
-	            buffer.fill(this.unresolvedDataArray, this.unresolvedLength);
-	        }
-	        this.unresolvedLength -= buffer.size;
-	        return buffer;
-	    }
-	    /**
-	     * Resolve data in unresolvedDataArray. For every buffer with size in blockSize
-	     * shifted, it will try to get (or allocate a buffer) from incoming, and fill it,
-	     * then push it into outgoing to be handled by outgoing handler.
-	     *
-	     * Return false when available buffers in incoming are not enough, else true.
-	     *
-	     * @returns Return false when buffers in incoming are not enough, else true.
-	     */
-	    resolveData() {
-	        while (this.unresolvedLength >= this.bufferSize) {
-	            let buffer;
-	            if (this.incoming.length > 0) {
-	                buffer = this.incoming.shift();
-	                this.shiftBufferFromUnresolvedDataArray(buffer);
-	            }
-	            else {
-	                if (this.numBuffers < this.maxBuffers) {
-	                    buffer = this.shiftBufferFromUnresolvedDataArray();
-	                    this.numBuffers++;
-	                }
-	                else {
-	                    // No available buffer, wait for buffer returned
-	                    return false;
-	                }
-	            }
-	            this.outgoing.push(buffer);
-	            this.triggerOutgoingHandlers();
-	        }
-	        return true;
-	    }
-	    /**
-	     * Try to trigger a outgoing handler for every buffer in outgoing. Stop when
-	     * concurrency reaches.
-	     */
-	    async triggerOutgoingHandlers() {
-	        let buffer;
-	        do {
-	            if (this.executingOutgoingHandlers >= this.concurrency) {
-	                return;
-	            }
-	            buffer = this.outgoing.shift();
-	            if (buffer) {
-	                this.triggerOutgoingHandler(buffer);
-	            }
-	        } while (buffer);
-	    }
-	    /**
-	     * Trigger a outgoing handler for a buffer shifted from outgoing.
-	     *
-	     * @param buffer -
-	     */
-	    async triggerOutgoingHandler(buffer) {
-	        const bufferLength = buffer.size;
-	        this.executingOutgoingHandlers++;
-	        this.offset += bufferLength;
-	        try {
-	            await this.outgoingHandler(() => buffer.getReadableStream(), bufferLength, this.offset - bufferLength);
-	        }
-	        catch (err) {
-	            this.emitter.emit("error", err);
-	            return;
-	        }
-	        this.executingOutgoingHandlers--;
-	        this.reuseBuffer(buffer);
-	        this.emitter.emit("checkEnd");
-	    }
-	    /**
-	     * Return buffer used by outgoing handler into incoming.
-	     *
-	     * @param buffer -
-	     */
-	    reuseBuffer(buffer) {
-	        this.incoming.push(buffer);
-	        if (!this.isError && this.resolveData() && !this.isStreamEnd) {
-	            this.readable.resume();
-	        }
-	    }
-	};
-	BufferScheduler.BufferScheduler = BufferScheduler$1;
-	
-	return BufferScheduler;
-}
-
-var cache$1 = {};
-
-var hasRequiredCache$2;
-
-function requireCache$2 () {
-	if (hasRequiredCache$2) return cache$1;
-	hasRequiredCache$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(cache$1, "__esModule", { value: true });
-	cache$1.getCachedDefaultHttpClient = getCachedDefaultHttpClient;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	let _defaultHttpClient;
-	function getCachedDefaultHttpClient() {
-	    if (!_defaultHttpClient) {
-	        _defaultHttpClient = (0, core_rest_pipeline_1.createDefaultHttpClient)();
-	    }
-	    return _defaultHttpClient;
-	}
-	
-	return cache$1;
-}
-
-var StorageBrowserPolicyFactory$1 = {};
-
-var StorageBrowserPolicy$1 = {};
-
-var RequestPolicy = {};
-
-var hasRequiredRequestPolicy;
-
-function requireRequestPolicy () {
-	if (hasRequiredRequestPolicy) return RequestPolicy;
-	hasRequiredRequestPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(RequestPolicy, "__esModule", { value: true });
-	RequestPolicy.BaseRequestPolicy = void 0;
-	/**
-	 * The base class from which all request policies derive.
-	 */
-	class BaseRequestPolicy {
-	    _nextPolicy;
-	    _options;
-	    /**
-	     * The main method to implement that manipulates a request/response.
-	     */
-	    constructor(
-	    /**
-	     * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
-	     */
-	    _nextPolicy, 
-	    /**
-	     * The options that can be passed to a given request policy.
-	     */
-	    _options) {
-	        this._nextPolicy = _nextPolicy;
-	        this._options = _options;
-	    }
-	    /**
-	     * Get whether or not a log with the provided log level should be logged.
-	     * @param logLevel - The log level of the log that will be logged.
-	     * @returns Whether or not a log with the provided log level should be logged.
-	     */
-	    shouldLog(logLevel) {
-	        return this._options.shouldLog(logLevel);
-	    }
-	    /**
-	     * Attempt to log the provided message to the provided logger. If no logger was provided or if
-	     * the log level does not meat the logger's threshold, then nothing will be logged.
-	     * @param logLevel - The log level of this log.
-	     * @param message - The message of this log.
-	     */
-	    log(logLevel, message) {
-	        this._options.log(logLevel, message);
-	    }
-	}
-	RequestPolicy.BaseRequestPolicy = BaseRequestPolicy;
-	
-	return RequestPolicy;
-}
-
-var constants$2 = {};
-
-var hasRequiredConstants$2;
-
-function requireConstants$2 () {
-	if (hasRequiredConstants$2) return constants$2;
-	hasRequiredConstants$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(constants$2, "__esModule", { value: true });
-	constants$2.PathStylePorts = constants$2.DevelopmentConnectionString = constants$2.HeaderConstants = constants$2.URLConstants = constants$2.SDK_VERSION = void 0;
-	constants$2.SDK_VERSION = "1.0.0";
-	constants$2.URLConstants = {
-	    Parameters: {
-	        FORCE_BROWSER_NO_CACHE: "_",
-	        SIGNATURE: "sig",
-	        SNAPSHOT: "snapshot",
-	        VERSIONID: "versionid",
-	        TIMEOUT: "timeout",
-	    },
-	};
-	constants$2.HeaderConstants = {
-	    AUTHORIZATION: "Authorization",
-	    AUTHORIZATION_SCHEME: "Bearer",
-	    CONTENT_ENCODING: "Content-Encoding",
-	    CONTENT_ID: "Content-ID",
-	    CONTENT_LANGUAGE: "Content-Language",
-	    CONTENT_LENGTH: "Content-Length",
-	    CONTENT_MD5: "Content-Md5",
-	    CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",
-	    CONTENT_TYPE: "Content-Type",
-	    COOKIE: "Cookie",
-	    DATE: "date",
-	    IF_MATCH: "if-match",
-	    IF_MODIFIED_SINCE: "if-modified-since",
-	    IF_NONE_MATCH: "if-none-match",
-	    IF_UNMODIFIED_SINCE: "if-unmodified-since",
-	    PREFIX_FOR_STORAGE: "x-ms-",
-	    RANGE: "Range",
-	    USER_AGENT: "User-Agent",
-	    X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",
-	    X_MS_COPY_SOURCE: "x-ms-copy-source",
-	    X_MS_DATE: "x-ms-date",
-	    X_MS_ERROR_CODE: "x-ms-error-code",
-	    X_MS_VERSION: "x-ms-version",
-	    X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code",
-	};
-	constants$2.DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;
-	/// List of ports used for path style addressing.
-	/// Path style addressing means that storage account is put in URI's Path segment in instead of in host.
-	constants$2.PathStylePorts = [
-	    "10000",
-	    "10001",
-	    "10002",
-	    "10003",
-	    "10004",
-	    "10100",
-	    "10101",
-	    "10102",
-	    "10103",
-	    "10104",
-	    "11000",
-	    "11001",
-	    "11002",
-	    "11003",
-	    "11004",
-	    "11100",
-	    "11101",
-	    "11102",
-	    "11103",
-	    "11104",
-	];
-	
-	return constants$2;
-}
-
-var utils_common$1 = {};
-
-var hasRequiredUtils_common$1;
-
-function requireUtils_common$1 () {
-	if (hasRequiredUtils_common$1) return utils_common$1;
-	hasRequiredUtils_common$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(utils_common$1, "__esModule", { value: true });
-	utils_common$1.escapeURLPath = escapeURLPath;
-	utils_common$1.getValueInConnString = getValueInConnString;
-	utils_common$1.extractConnectionStringParts = extractConnectionStringParts;
-	utils_common$1.appendToURLPath = appendToURLPath;
-	utils_common$1.setURLParameter = setURLParameter;
-	utils_common$1.getURLParameter = getURLParameter;
-	utils_common$1.setURLHost = setURLHost;
-	utils_common$1.getURLPath = getURLPath;
-	utils_common$1.getURLScheme = getURLScheme;
-	utils_common$1.getURLPathAndQuery = getURLPathAndQuery;
-	utils_common$1.getURLQueries = getURLQueries;
-	utils_common$1.appendToURLQuery = appendToURLQuery;
-	utils_common$1.truncatedISO8061Date = truncatedISO8061Date;
-	utils_common$1.base64encode = base64encode;
-	utils_common$1.base64decode = base64decode;
-	utils_common$1.generateBlockID = generateBlockID;
-	utils_common$1.delay = delay;
-	utils_common$1.padStart = padStart;
-	utils_common$1.sanitizeURL = sanitizeURL;
-	utils_common$1.sanitizeHeaders = sanitizeHeaders;
-	utils_common$1.iEqual = iEqual;
-	utils_common$1.getAccountNameFromUrl = getAccountNameFromUrl;
-	utils_common$1.isIpEndpointStyle = isIpEndpointStyle;
-	utils_common$1.attachCredential = attachCredential;
-	utils_common$1.httpAuthorizationToString = httpAuthorizationToString;
-	utils_common$1.EscapePath = EscapePath;
-	utils_common$1.assertResponse = assertResponse;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const constants_js_1 = requireConstants$2();
-	/**
-	 * Reserved URL characters must be properly escaped for Storage services like Blob or File.
-	 *
-	 * ## URL encode and escape strategy for JS SDKs
-	 *
-	 * When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.
-	 * But before sending to Azure Storage server, the URL must be encoded. However, it's hard for a SDK to guess whether the URL
-	 * string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.
-	 *
-	 * ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.
-	 *
-	 * This is what legacy V2 SDK does, simple and works for most of the cases.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
-	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
-	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.
-	 *
-	 * But this strategy will make it not possible to create a blob with "?" in it's name. Because when customer URL string is
-	 * "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.
-	 * If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.
-	 * V2 SDK doesn't have this issue because it doesn't allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.
-	 * We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:
-	 *
-	 * ### Strategy Two: SDK doesn't assume the URL has been encoded or not. It will just escape the special characters.
-	 *
-	 * This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
-	 *   SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
-	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.
-	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",
-	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.
-	 *
-	 * This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string
-	 * is not encoded, there shouldn't a "%" in the URL string, otherwise the URL is not a valid URL.
-	 * If customer needs to create a blob with "%" in it's blob name, use "%25" instead of "%". Just like above 3rd sample.
-	 * And following URL strings are invalid:
-	 * - "http://account.blob.core.windows.net/con/b%"
-	 * - "http://account.blob.core.windows.net/con/b%2"
-	 * - "http://account.blob.core.windows.net/con/b%G"
-	 *
-	 * Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.
-	 *
-	 * ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`
-	 *
-	 * We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.
-	 *
-	 * @see https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
-	 * @see https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata
-	 *
-	 * @param url -
-	 */
-	function escapeURLPath(url) {
-	    const urlParsed = new URL(url);
-	    let path = urlParsed.pathname;
-	    path = path || "/";
-	    path = escape(path);
-	    urlParsed.pathname = path;
-	    return urlParsed.toString();
-	}
-	function getProxyUriFromDevConnString(connectionString) {
-	    // Development Connection String
-	    // https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key
-	    let proxyUri = "";
-	    if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {
-	        // CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri
-	        const matchCredentials = connectionString.split(";");
-	        for (const element of matchCredentials) {
-	            if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {
-	                proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];
-	            }
-	        }
-	    }
-	    return proxyUri;
-	}
-	function getValueInConnString(connectionString, argument) {
-	    const elements = connectionString.split(";");
-	    for (const element of elements) {
-	        if (element.trim().startsWith(argument)) {
-	            return element.trim().match(argument + "=(.*)")[1];
-	        }
-	    }
-	    return "";
-	}
-	/**
-	 * Extracts the parts of an Azure Storage account connection string.
-	 *
-	 * @param connectionString - Connection string.
-	 * @returns String key value pairs of the storage account's url and credentials.
-	 */
-	function extractConnectionStringParts(connectionString) {
-	    let proxyUri = "";
-	    if (connectionString.startsWith("UseDevelopmentStorage=true")) {
-	        // Development connection string
-	        proxyUri = getProxyUriFromDevConnString(connectionString);
-	        connectionString = constants_js_1.DevelopmentConnectionString;
-	    }
-	    // Matching BlobEndpoint in the Account connection string
-	    let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");
-	    // Slicing off '/' at the end if exists
-	    // (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)
-	    blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;
-	    if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&
-	        connectionString.search("AccountKey=") !== -1) {
-	        // Account connection string
-	        let defaultEndpointsProtocol = "";
-	        let accountName = "";
-	        let accountKey = Buffer.from("accountKey", "base64");
-	        let endpointSuffix = "";
-	        // Get account name and key
-	        accountName = getValueInConnString(connectionString, "AccountName");
-	        accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64");
-	        if (!blobEndpoint) {
-	            // BlobEndpoint is not present in the Account connection string
-	            // Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`
-	            defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");
-	            const protocol = defaultEndpointsProtocol.toLowerCase();
-	            if (protocol !== "https" && protocol !== "http") {
-	                throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'");
-	            }
-	            endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");
-	            if (!endpointSuffix) {
-	                throw new Error("Invalid EndpointSuffix in the provided Connection String");
-	            }
-	            blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
-	        }
-	        if (!accountName) {
-	            throw new Error("Invalid AccountName in the provided Connection String");
-	        }
-	        else if (accountKey.length === 0) {
-	            throw new Error("Invalid AccountKey in the provided Connection String");
-	        }
-	        return {
-	            kind: "AccountConnString",
-	            url: blobEndpoint,
-	            accountName,
-	            accountKey,
-	            proxyUri,
-	        };
-	    }
-	    else {
-	        // SAS connection string
-	        let accountSas = getValueInConnString(connectionString, "SharedAccessSignature");
-	        let accountName = getValueInConnString(connectionString, "AccountName");
-	        // if accountName is empty, try to read it from BlobEndpoint
-	        if (!accountName) {
-	            accountName = getAccountNameFromUrl(blobEndpoint);
-	        }
-	        if (!blobEndpoint) {
-	            throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");
-	        }
-	        else if (!accountSas) {
-	            throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");
-	        }
-	        // client constructors assume accountSas does *not* start with ?
-	        if (accountSas.startsWith("?")) {
-	            accountSas = accountSas.substring(1);
-	        }
-	        return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };
-	    }
-	}
-	/**
-	 * Internal escape method implemented Strategy Two mentioned in escapeURL() description.
-	 *
-	 * @param text -
-	 */
-	function escape(text) {
-	    return encodeURIComponent(text)
-	        .replace(/%2F/g, "/") // Don't escape for "/"
-	        .replace(/'/g, "%27") // Escape for "'"
-	        .replace(/\+/g, "%20")
-	        .replace(/%25/g, "%"); // Revert encoded "%"
-	}
-	/**
-	 * Append a string to URL path. Will remove duplicated "/" in front of the string
-	 * when URL path ends with a "/".
-	 *
-	 * @param url - Source URL string
-	 * @param name - String to be appended to URL
-	 * @returns An updated URL string
-	 */
-	function appendToURLPath(url, name) {
-	    const urlParsed = new URL(url);
-	    let path = urlParsed.pathname;
-	    path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;
-	    urlParsed.pathname = path;
-	    return urlParsed.toString();
-	}
-	/**
-	 * Set URL parameter name and value. If name exists in URL parameters, old value
-	 * will be replaced by name key. If not provide value, the parameter will be deleted.
-	 *
-	 * @param url - Source URL string
-	 * @param name - Parameter name
-	 * @param value - Parameter value
-	 * @returns An updated URL string
-	 */
-	function setURLParameter(url, name, value) {
-	    const urlParsed = new URL(url);
-	    const encodedName = encodeURIComponent(name);
-	    const encodedValue = value ? encodeURIComponent(value) : undefined;
-	    // mutating searchParams will change the encoding, so we have to do this ourselves
-	    const searchString = urlParsed.search === "" ? "?" : urlParsed.search;
-	    const searchPieces = [];
-	    for (const pair of searchString.slice(1).split("&")) {
-	        if (pair) {
-	            const [key] = pair.split("=", 2);
-	            if (key !== encodedName) {
-	                searchPieces.push(pair);
-	            }
-	        }
-	    }
-	    if (encodedValue) {
-	        searchPieces.push(`${encodedName}=${encodedValue}`);
-	    }
-	    urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
-	    return urlParsed.toString();
-	}
-	/**
-	 * Get URL parameter by name.
-	 *
-	 * @param url -
-	 * @param name -
-	 */
-	function getURLParameter(url, name) {
-	    const urlParsed = new URL(url);
-	    return urlParsed.searchParams.get(name) ?? undefined;
-	}
-	/**
-	 * Set URL host.
-	 *
-	 * @param url - Source URL string
-	 * @param host - New host string
-	 * @returns An updated URL string
-	 */
-	function setURLHost(url, host) {
-	    const urlParsed = new URL(url);
-	    urlParsed.hostname = host;
-	    return urlParsed.toString();
-	}
-	/**
-	 * Get URL path from an URL string.
-	 *
-	 * @param url - Source URL string
-	 */
-	function getURLPath(url) {
-	    try {
-	        const urlParsed = new URL(url);
-	        return urlParsed.pathname;
-	    }
-	    catch (e) {
-	        return undefined;
-	    }
-	}
-	/**
-	 * Get URL scheme from an URL string.
-	 *
-	 * @param url - Source URL string
-	 */
-	function getURLScheme(url) {
-	    try {
-	        const urlParsed = new URL(url);
-	        return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol;
-	    }
-	    catch (e) {
-	        return undefined;
-	    }
-	}
-	/**
-	 * Get URL path and query from an URL string.
-	 *
-	 * @param url - Source URL string
-	 */
-	function getURLPathAndQuery(url) {
-	    const urlParsed = new URL(url);
-	    const pathString = urlParsed.pathname;
-	    if (!pathString) {
-	        throw new RangeError("Invalid url without valid path.");
-	    }
-	    let queryString = urlParsed.search || "";
-	    queryString = queryString.trim();
-	    if (queryString !== "") {
-	        queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with '?'
-	    }
-	    return `${pathString}${queryString}`;
-	}
-	/**
-	 * Get URL query key value pairs from an URL string.
-	 *
-	 * @param url -
-	 */
-	function getURLQueries(url) {
-	    let queryString = new URL(url).search;
-	    if (!queryString) {
-	        return {};
-	    }
-	    queryString = queryString.trim();
-	    queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString;
-	    let querySubStrings = queryString.split("&");
-	    querySubStrings = querySubStrings.filter((value) => {
-	        const indexOfEqual = value.indexOf("=");
-	        const lastIndexOfEqual = value.lastIndexOf("=");
-	        return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);
-	    });
-	    const queries = {};
-	    for (const querySubString of querySubStrings) {
-	        const splitResults = querySubString.split("=");
-	        const key = splitResults[0];
-	        const value = splitResults[1];
-	        queries[key] = value;
-	    }
-	    return queries;
-	}
-	/**
-	 * Append a string to URL query.
-	 *
-	 * @param url - Source URL string.
-	 * @param queryParts - String to be appended to the URL query.
-	 * @returns An updated URL string.
-	 */
-	function appendToURLQuery(url, queryParts) {
-	    const urlParsed = new URL(url);
-	    let query = urlParsed.search;
-	    if (query) {
-	        query += "&" + queryParts;
-	    }
-	    else {
-	        query = queryParts;
-	    }
-	    urlParsed.search = query;
-	    return urlParsed.toString();
-	}
-	/**
-	 * Rounds a date off to seconds.
-	 *
-	 * @param date -
-	 * @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;
-	 *                                          If false, YYYY-MM-DDThh:mm:ssZ will be returned.
-	 * @returns Date string in ISO8061 format, with or without 7 milliseconds component
-	 */
-	function truncatedISO8061Date(date, withMilliseconds = true) {
-	    // Date.toISOString() will return like "2018-10-29T06:34:36.139Z"
-	    const dateString = date.toISOString();
-	    return withMilliseconds
-	        ? dateString.substring(0, dateString.length - 1) + "0000" + "Z"
-	        : dateString.substring(0, dateString.length - 5) + "Z";
-	}
-	/**
-	 * Base64 encode.
-	 *
-	 * @param content -
-	 */
-	function base64encode(content) {
-	    return !core_util_1.isNodeLike ? btoa(content) : Buffer.from(content).toString("base64");
-	}
-	/**
-	 * Base64 decode.
-	 *
-	 * @param encodedString -
-	 */
-	function base64decode(encodedString) {
-	    return !core_util_1.isNodeLike ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();
-	}
-	/**
-	 * Generate a 64 bytes base64 block ID string.
-	 *
-	 * @param blockIndex -
-	 */
-	function generateBlockID(blockIDPrefix, blockIndex) {
-	    // To generate a 64 bytes base64 string, source string should be 48
-	    const maxSourceStringLength = 48;
-	    // A blob can have a maximum of 100,000 uncommitted blocks at any given time
-	    const maxBlockIndexLength = 6;
-	    const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;
-	    if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {
-	        blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);
-	    }
-	    const res = blockIDPrefix +
-	        padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");
-	    return base64encode(res);
-	}
-	/**
-	 * Delay specified time interval.
-	 *
-	 * @param timeInMs -
-	 * @param aborter -
-	 * @param abortError -
-	 */
-	async function delay(timeInMs, aborter, abortError) {
-	    return new Promise((resolve, reject) => {
-	        /* eslint-disable-next-line prefer-const */
-	        let timeout;
-	        const abortHandler = () => {
-	            if (timeout !== undefined) {
-	                clearTimeout(timeout);
-	            }
-	            reject(abortError);
-	        };
-	        const resolveHandler = () => {
-	            if (aborter !== undefined) {
-	                aborter.removeEventListener("abort", abortHandler);
-	            }
-	            resolve();
-	        };
-	        timeout = setTimeout(resolveHandler, timeInMs);
-	        if (aborter !== undefined) {
-	            aborter.addEventListener("abort", abortHandler);
-	        }
-	    });
-	}
-	/**
-	 * String.prototype.padStart()
-	 *
-	 * @param currentString -
-	 * @param targetLength -
-	 * @param padString -
-	 */
-	function padStart(currentString, targetLength, padString = " ") {
-	    // @ts-expect-error: TS doesn't know this code needs to run downlevel sometimes
-	    if (String.prototype.padStart) {
-	        return currentString.padStart(targetLength, padString);
-	    }
-	    padString = padString || " ";
-	    if (currentString.length > targetLength) {
-	        return currentString;
-	    }
-	    else {
-	        targetLength = targetLength - currentString.length;
-	        if (targetLength > padString.length) {
-	            padString += padString.repeat(targetLength / padString.length);
-	        }
-	        return padString.slice(0, targetLength) + currentString;
-	    }
-	}
-	function sanitizeURL(url) {
-	    let safeURL = url;
-	    if (getURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE)) {
-	        safeURL = setURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE, "*****");
-	    }
-	    return safeURL;
-	}
-	function sanitizeHeaders(originalHeader) {
-	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)();
-	    for (const [name, value] of originalHeader) {
-	        if (name.toLowerCase() === constants_js_1.HeaderConstants.AUTHORIZATION.toLowerCase()) {
-	            headers.set(name, "*****");
-	        }
-	        else if (name.toLowerCase() === constants_js_1.HeaderConstants.X_MS_COPY_SOURCE) {
-	            headers.set(name, sanitizeURL(value));
-	        }
-	        else {
-	            headers.set(name, value);
-	        }
-	    }
-	    return headers;
-	}
-	/**
-	 * If two strings are equal when compared case insensitive.
-	 *
-	 * @param str1 -
-	 * @param str2 -
-	 */
-	function iEqual(str1, str2) {
-	    return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();
-	}
-	/**
-	 * Extracts account name from the url
-	 * @param url - url to extract the account name from
-	 * @returns with the account name
-	 */
-	function getAccountNameFromUrl(url) {
-	    const parsedUrl = new URL(url);
-	    let accountName;
-	    try {
-	        if (parsedUrl.hostname.split(".")[1] === "blob") {
-	            // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
-	            accountName = parsedUrl.hostname.split(".")[0];
-	        }
-	        else if (isIpEndpointStyle(parsedUrl)) {
-	            // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/
-	            // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/
-	            // .getPath() -> /devstoreaccount1/
-	            accountName = parsedUrl.pathname.split("/")[1];
-	        }
-	        else {
-	            // Custom domain case: "https://customdomain.com/containername/blob".
-	            accountName = "";
-	        }
-	        return accountName;
-	    }
-	    catch (error) {
-	        throw new Error("Unable to extract accountName with provided information.");
-	    }
-	}
-	function isIpEndpointStyle(parsedUrl) {
-	    const host = parsedUrl.host;
-	    // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'.
-	    // Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.
-	    // Case 3: Ipv4, use broad regex which just check if host contains Ipv4.
-	    // For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.
-	    return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||
-	        (Boolean(parsedUrl.port) && constants_js_1.PathStylePorts.includes(parsedUrl.port)));
-	}
-	/**
-	 * Attach a TokenCredential to an object.
-	 *
-	 * @param thing -
-	 * @param credential -
-	 */
-	function attachCredential(thing, credential) {
-	    thing.credential = credential;
-	    return thing;
-	}
-	function httpAuthorizationToString(httpAuthorization) {
-	    return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;
-	}
-	/**
-	 * Escape the blobName but keep path separator ('/').
-	 */
-	function EscapePath(blobName) {
-	    const split = blobName.split("/");
-	    for (let i = 0; i < split.length; i++) {
-	        split[i] = encodeURIComponent(split[i]);
-	    }
-	    return split.join("/");
-	}
-	/**
-	 * A typesafe helper for ensuring that a given response object has
-	 * the original _response attached.
-	 * @param response - A response object from calling a client operation
-	 * @returns The same object, but with known _response property
-	 */
-	function assertResponse(response) {
-	    if (`_response` in response) {
-	        return response;
-	    }
-	    throw new TypeError(`Unexpected response object ${response}`);
-	}
-	
-	return utils_common$1;
-}
-
-var hasRequiredStorageBrowserPolicy$1;
-
-function requireStorageBrowserPolicy$1 () {
-	if (hasRequiredStorageBrowserPolicy$1) return StorageBrowserPolicy$1;
-	hasRequiredStorageBrowserPolicy$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageBrowserPolicy$1, "__esModule", { value: true });
-	StorageBrowserPolicy$1.StorageBrowserPolicy = void 0;
-	const RequestPolicy_js_1 = requireRequestPolicy();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const constants_js_1 = requireConstants$2();
-	const utils_common_js_1 = requireUtils_common$1();
-	/**
-	 * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:
-	 *
-	 * 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.
-	 * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL
-	 * thus avoid the browser cache.
-	 *
-	 * 2. Remove cookie header for security
-	 *
-	 * 3. Remove content-length header to avoid browsers warning
-	 */
-	class StorageBrowserPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
-	    /**
-	     * Creates an instance of StorageBrowserPolicy.
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
-	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
-	    constructor(nextPolicy, options) {
-	        super(nextPolicy, options);
-	    }
-	    /**
-	     * Sends out request.
-	     *
-	     * @param request -
-	     */
-	    async sendRequest(request) {
-	        if (core_util_1.isNodeLike) {
-	            return this._nextPolicy.sendRequest(request);
-	        }
-	        if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {
-	            request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
-	        }
-	        request.headers.remove(constants_js_1.HeaderConstants.COOKIE);
-	        // According to XHR standards, content-length should be fully controlled by browsers
-	        request.headers.remove(constants_js_1.HeaderConstants.CONTENT_LENGTH);
-	        return this._nextPolicy.sendRequest(request);
-	    }
-	}
-	StorageBrowserPolicy$1.StorageBrowserPolicy = StorageBrowserPolicy;
-	
-	return StorageBrowserPolicy$1;
-}
-
-var hasRequiredStorageBrowserPolicyFactory$1;
-
-function requireStorageBrowserPolicyFactory$1 () {
-	if (hasRequiredStorageBrowserPolicyFactory$1) return StorageBrowserPolicyFactory$1;
-	hasRequiredStorageBrowserPolicyFactory$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.StorageBrowserPolicyFactory = exports$1.StorageBrowserPolicy = void 0;
-		const StorageBrowserPolicy_js_1 = requireStorageBrowserPolicy$1();
-		Object.defineProperty(exports$1, "StorageBrowserPolicy", { enumerable: true, get: function () { return StorageBrowserPolicy_js_1.StorageBrowserPolicy; } });
-		/**
-		 * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.
-		 */
-		class StorageBrowserPolicyFactory {
-		    /**
-		     * Creates a StorageBrowserPolicyFactory object.
-		     *
-		     * @param nextPolicy -
-		     * @param options -
-		     */
-		    create(nextPolicy, options) {
-		        return new StorageBrowserPolicy_js_1.StorageBrowserPolicy(nextPolicy, options);
-		    }
-		}
-		exports$1.StorageBrowserPolicyFactory = StorageBrowserPolicyFactory;
-		
-	} (StorageBrowserPolicyFactory$1));
-	return StorageBrowserPolicyFactory$1;
-}
-
-var AnonymousCredential = {};
-
-var AnonymousCredentialPolicy = {};
-
-var CredentialPolicy = {};
-
-var hasRequiredCredentialPolicy;
-
-function requireCredentialPolicy () {
-	if (hasRequiredCredentialPolicy) return CredentialPolicy;
-	hasRequiredCredentialPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(CredentialPolicy, "__esModule", { value: true });
-	CredentialPolicy.CredentialPolicy = void 0;
-	const RequestPolicy_js_1 = requireRequestPolicy();
-	/**
-	 * Credential policy used to sign HTTP(S) requests before sending. This is an
-	 * abstract class.
-	 */
-	let CredentialPolicy$1 = class CredentialPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
-	    /**
-	     * Sends out request.
-	     *
-	     * @param request -
-	     */
-	    sendRequest(request) {
-	        return this._nextPolicy.sendRequest(this.signRequest(request));
-	    }
-	    /**
-	     * Child classes must implement this method with request signing. This method
-	     * will be executed in {@link sendRequest}.
-	     *
-	     * @param request -
-	     */
-	    signRequest(request) {
-	        // Child classes must override this method with request signing. This method
-	        // will be executed in sendRequest().
-	        return request;
-	    }
-	};
-	CredentialPolicy.CredentialPolicy = CredentialPolicy$1;
-	
-	return CredentialPolicy;
-}
-
-var hasRequiredAnonymousCredentialPolicy;
-
-function requireAnonymousCredentialPolicy () {
-	if (hasRequiredAnonymousCredentialPolicy) return AnonymousCredentialPolicy;
-	hasRequiredAnonymousCredentialPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AnonymousCredentialPolicy, "__esModule", { value: true });
-	AnonymousCredentialPolicy.AnonymousCredentialPolicy = void 0;
-	const CredentialPolicy_js_1 = requireCredentialPolicy();
-	/**
-	 * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources
-	 * or for use with Shared Access Signatures (SAS).
-	 */
-	let AnonymousCredentialPolicy$1 = class AnonymousCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
-	    /**
-	     * Creates an instance of AnonymousCredentialPolicy.
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
-	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
-	    constructor(nextPolicy, options) {
-	        super(nextPolicy, options);
-	    }
-	};
-	AnonymousCredentialPolicy.AnonymousCredentialPolicy = AnonymousCredentialPolicy$1;
-	
-	return AnonymousCredentialPolicy;
-}
-
-var Credential = {};
-
-var hasRequiredCredential;
-
-function requireCredential () {
-	if (hasRequiredCredential) return Credential;
-	hasRequiredCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(Credential, "__esModule", { value: true });
-	Credential.Credential = void 0;
-	/**
-	 * Credential is an abstract class for Azure Storage HTTP requests signing. This
-	 * class will host an credentialPolicyCreator factory which generates CredentialPolicy.
-	 */
-	let Credential$1 = class Credential {
-	    /**
-	     * Creates a RequestPolicy object.
-	     *
-	     * @param _nextPolicy -
-	     * @param _options -
-	     */
-	    create(_nextPolicy, _options) {
-	        throw new Error("Method should be implemented in children classes.");
-	    }
-	};
-	Credential.Credential = Credential$1;
-	
-	return Credential;
-}
-
-var hasRequiredAnonymousCredential;
-
-function requireAnonymousCredential () {
-	if (hasRequiredAnonymousCredential) return AnonymousCredential;
-	hasRequiredAnonymousCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AnonymousCredential, "__esModule", { value: true });
-	AnonymousCredential.AnonymousCredential = void 0;
-	const AnonymousCredentialPolicy_js_1 = requireAnonymousCredentialPolicy();
-	const Credential_js_1 = requireCredential();
-	/**
-	 * AnonymousCredential provides a credentialPolicyCreator member used to create
-	 * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with
-	 * HTTP(S) requests that read public resources or for use with Shared Access
-	 * Signatures (SAS).
-	 */
-	let AnonymousCredential$1 = class AnonymousCredential extends Credential_js_1.Credential {
-	    /**
-	     * Creates an {@link AnonymousCredentialPolicy} object.
-	     *
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    create(nextPolicy, options) {
-	        return new AnonymousCredentialPolicy_js_1.AnonymousCredentialPolicy(nextPolicy, options);
-	    }
-	};
-	AnonymousCredential.AnonymousCredential = AnonymousCredential$1;
-	
-	return AnonymousCredential;
-}
-
-var StorageSharedKeyCredential = {};
-
-var StorageSharedKeyCredentialPolicy = {};
-
-var SharedKeyComparator = {};
-
-var hasRequiredSharedKeyComparator;
-
-function requireSharedKeyComparator () {
-	if (hasRequiredSharedKeyComparator) return SharedKeyComparator;
-	hasRequiredSharedKeyComparator = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(SharedKeyComparator, "__esModule", { value: true });
-	SharedKeyComparator.compareHeader = compareHeader;
-	/*
-	 * We need to imitate .Net culture-aware sorting, which is used in storage service.
-	 * Below tables contain sort-keys for en-US culture.
-	 */
-	const table_lv0 = new Uint32Array([
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721,
-	    0x723, 0x725, 0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e,
-	    0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe02, 0xe09, 0xe0a,
-	    0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89,
-	    0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x0, 0x0, 0x743, 0x744, 0x748,
-	    0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70,
-	    0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c,
-	    0x0, 0x750, 0x0,
-	]);
-	const table_lv2 = new Uint32Array([
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-	    0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-	    0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	]);
-	const table_lv4 = new Uint32Array([
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-	]);
-	function compareHeader(lhs, rhs) {
-	    if (isLessThan(lhs, rhs))
-	        return -1;
-	    return 1;
-	}
-	function isLessThan(lhs, rhs) {
-	    const tables = [table_lv0, table_lv2, table_lv4];
-	    let curr_level = 0;
-	    let i = 0;
-	    let j = 0;
-	    while (curr_level < tables.length) {
-	        if (curr_level === tables.length - 1 && i !== j) {
-	            return i > j;
-	        }
-	        const weight1 = i < lhs.length ? tables[curr_level][lhs[i].charCodeAt(0)] : 0x1;
-	        const weight2 = j < rhs.length ? tables[curr_level][rhs[j].charCodeAt(0)] : 0x1;
-	        if (weight1 === 0x1 && weight2 === 0x1) {
-	            i = 0;
-	            j = 0;
-	            ++curr_level;
-	        }
-	        else if (weight1 === weight2) {
-	            ++i;
-	            ++j;
-	        }
-	        else if (weight1 === 0) {
-	            ++i;
-	        }
-	        else if (weight2 === 0) {
-	            ++j;
-	        }
-	        else {
-	            return weight1 < weight2;
-	        }
-	    }
-	    return false;
-	}
-	
-	return SharedKeyComparator;
-}
-
-var hasRequiredStorageSharedKeyCredentialPolicy;
-
-function requireStorageSharedKeyCredentialPolicy () {
-	if (hasRequiredStorageSharedKeyCredentialPolicy) return StorageSharedKeyCredentialPolicy;
-	hasRequiredStorageSharedKeyCredentialPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageSharedKeyCredentialPolicy, "__esModule", { value: true });
-	StorageSharedKeyCredentialPolicy.StorageSharedKeyCredentialPolicy = void 0;
-	const constants_js_1 = requireConstants$2();
-	const utils_common_js_1 = requireUtils_common$1();
-	const CredentialPolicy_js_1 = requireCredentialPolicy();
-	const SharedKeyComparator_js_1 = requireSharedKeyComparator();
-	/**
-	 * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.
-	 */
-	let StorageSharedKeyCredentialPolicy$1 = class StorageSharedKeyCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
-	    /**
-	     * Reference to StorageSharedKeyCredential which generates StorageSharedKeyCredentialPolicy
-	     */
-	    factory;
-	    /**
-	     * Creates an instance of StorageSharedKeyCredentialPolicy.
-	     * @param nextPolicy -
-	     * @param options -
-	     * @param factory -
-	     */
-	    constructor(nextPolicy, options, factory) {
-	        super(nextPolicy, options);
-	        this.factory = factory;
-	    }
-	    /**
-	     * Signs request.
-	     *
-	     * @param request -
-	     */
-	    signRequest(request) {
-	        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
-	        if (request.body &&
-	            (typeof request.body === "string" || request.body !== undefined) &&
-	            request.body.length > 0) {
-	            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
-	        }
-	        const stringToSign = [
-	            request.method.toUpperCase(),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
-	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
-	        ].join("\n") +
-	            "\n" +
-	            this.getCanonicalizedHeadersString(request) +
-	            this.getCanonicalizedResourceString(request);
-	        const signature = this.factory.computeHMACSHA256(stringToSign);
-	        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);
-	        // console.log(`[URL]:${request.url}`);
-	        // console.log(`[HEADERS]:${request.headers.toString()}`);
-	        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
-	        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
-	        return request;
-	    }
-	    /**
-	     * Retrieve header value according to shared key sign rules.
-	     * @see https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
-	     *
-	     * @param request -
-	     * @param headerName -
-	     */
-	    getHeaderValueToSign(request, headerName) {
-	        const value = request.headers.get(headerName);
-	        if (!value) {
-	            return "";
-	        }
-	        // When using version 2015-02-21 or later, if Content-Length is zero, then
-	        // set the Content-Length part of the StringToSign to an empty string.
-	        // https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
-	        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
-	            return "";
-	        }
-	        return value;
-	    }
-	    /**
-	     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
-	     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
-	     * 2. Convert each HTTP header name to lowercase.
-	     * 3. Sort the headers lexicographically by header name, in ascending order.
-	     *    Each header may appear only once in the string.
-	     * 4. Replace any linear whitespace in the header value with a single space.
-	     * 5. Trim any whitespace around the colon in the header.
-	     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
-	     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
-	     *
-	     * @param request -
-	     */
-	    getCanonicalizedHeadersString(request) {
-	        let headersArray = request.headers.headersArray().filter((value) => {
-	            return value.name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE);
-	        });
-	        headersArray.sort((a, b) => {
-	            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
-	        });
-	        // Remove duplicate headers
-	        headersArray = headersArray.filter((value, index, array) => {
-	            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
-	                return false;
-	            }
-	            return true;
-	        });
-	        let canonicalizedHeadersStringToSign = "";
-	        headersArray.forEach((header) => {
-	            canonicalizedHeadersStringToSign += `${header.name
-	                .toLowerCase()
-	                .trimRight()}:${header.value.trimLeft()}\n`;
-	        });
-	        return canonicalizedHeadersStringToSign;
-	    }
-	    /**
-	     * Retrieves the webResource canonicalized resource string.
-	     *
-	     * @param request -
-	     */
-	    getCanonicalizedResourceString(request) {
-	        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
-	        let canonicalizedResourceString = "";
-	        canonicalizedResourceString += `/${this.factory.accountName}${path}`;
-	        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
-	        const lowercaseQueries = {};
-	        if (queries) {
-	            const queryKeys = [];
-	            for (const key in queries) {
-	                if (Object.prototype.hasOwnProperty.call(queries, key)) {
-	                    const lowercaseKey = key.toLowerCase();
-	                    lowercaseQueries[lowercaseKey] = queries[key];
-	                    queryKeys.push(lowercaseKey);
-	                }
-	            }
-	            queryKeys.sort();
-	            for (const key of queryKeys) {
-	                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
-	            }
-	        }
-	        return canonicalizedResourceString;
-	    }
-	};
-	StorageSharedKeyCredentialPolicy.StorageSharedKeyCredentialPolicy = StorageSharedKeyCredentialPolicy$1;
-	
-	return StorageSharedKeyCredentialPolicy;
-}
-
-var hasRequiredStorageSharedKeyCredential;
-
-function requireStorageSharedKeyCredential () {
-	if (hasRequiredStorageSharedKeyCredential) return StorageSharedKeyCredential;
-	hasRequiredStorageSharedKeyCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageSharedKeyCredential, "__esModule", { value: true });
-	StorageSharedKeyCredential.StorageSharedKeyCredential = void 0;
-	const node_crypto_1 = require$$0$g;
-	const StorageSharedKeyCredentialPolicy_js_1 = requireStorageSharedKeyCredentialPolicy();
-	const Credential_js_1 = requireCredential();
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * StorageSharedKeyCredential for account key authorization of Azure Storage service.
-	 */
-	let StorageSharedKeyCredential$1 = class StorageSharedKeyCredential extends Credential_js_1.Credential {
-	    /**
-	     * Azure Storage account name; readonly.
-	     */
-	    accountName;
-	    /**
-	     * Azure Storage account key; readonly.
-	     */
-	    accountKey;
-	    /**
-	     * Creates an instance of StorageSharedKeyCredential.
-	     * @param accountName -
-	     * @param accountKey -
-	     */
-	    constructor(accountName, accountKey) {
-	        super();
-	        this.accountName = accountName;
-	        this.accountKey = Buffer.from(accountKey, "base64");
-	    }
-	    /**
-	     * Creates a StorageSharedKeyCredentialPolicy object.
-	     *
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    create(nextPolicy, options) {
-	        return new StorageSharedKeyCredentialPolicy_js_1.StorageSharedKeyCredentialPolicy(nextPolicy, options, this);
-	    }
-	    /**
-	     * Generates a hash signature for an HTTP request or for a SAS.
-	     *
-	     * @param stringToSign -
-	     */
-	    computeHMACSHA256(stringToSign) {
-	        return (0, node_crypto_1.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");
-	    }
-	};
-	StorageSharedKeyCredential.StorageSharedKeyCredential = StorageSharedKeyCredential$1;
-	
-	return StorageSharedKeyCredential;
-}
-
-var StorageRetryPolicyFactory = {};
-
-var StorageRetryPolicy = {};
-
-var commonjs$1 = {};
-
-var AbortError$1 = {};
-
-var hasRequiredAbortError;
-
-function requireAbortError () {
-	if (hasRequiredAbortError) return AbortError$1;
-	hasRequiredAbortError = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(AbortError$1, "__esModule", { value: true });
-	AbortError$1.AbortError = void 0;
-	/**
-	 * This error is thrown when an asynchronous operation has been aborted.
-	 * Check for this error by testing the `name` that the name property of the
-	 * error matches `"AbortError"`.
-	 *
-	 * @example
-	 * ```ts
-	 * const controller = new AbortController();
-	 * controller.abort();
-	 * try {
-	 *   doAsyncWork(controller.signal)
-	 * } catch (e) {
-	 *   if (e.name === 'AbortError') {
-	 *     // handle abort error here.
-	 *   }
-	 * }
-	 * ```
-	 */
-	class AbortError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = "AbortError";
-	    }
-	}
-	AbortError$1.AbortError = AbortError;
-	
-	return AbortError$1;
-}
-
-var hasRequiredCommonjs$3;
-
-function requireCommonjs$3 () {
-	if (hasRequiredCommonjs$3) return commonjs$1;
-	hasRequiredCommonjs$3 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT license.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.AbortError = void 0;
-		var AbortError_js_1 = requireAbortError();
-		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
-		
-	} (commonjs$1));
-	return commonjs$1;
-}
-
-var log = {};
-
-var hasRequiredLog;
-
-function requireLog () {
-	if (hasRequiredLog) return log;
-	hasRequiredLog = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(log, "__esModule", { value: true });
-	log.logger = void 0;
-	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
-	/**
-	 * The `@azure/logger` configuration for this package.
-	 */
-	log.logger = (0, logger_1.createClientLogger)("storage-common");
-	
-	return log;
-}
-
-var StorageRetryPolicyType = {};
-
-var hasRequiredStorageRetryPolicyType;
-
-function requireStorageRetryPolicyType () {
-	if (hasRequiredStorageRetryPolicyType) return StorageRetryPolicyType;
-	hasRequiredStorageRetryPolicyType = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageRetryPolicyType, "__esModule", { value: true });
-	StorageRetryPolicyType.StorageRetryPolicyType = void 0;
-	/**
-	 * RetryPolicy types.
-	 */
-	var StorageRetryPolicyType$1;
-	(function (StorageRetryPolicyType) {
-	    /**
-	     * Exponential retry. Retry time delay grows exponentially.
-	     */
-	    StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";
-	    /**
-	     * Linear retry. Retry time delay grows linearly.
-	     */
-	    StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";
-	})(StorageRetryPolicyType$1 || (StorageRetryPolicyType.StorageRetryPolicyType = StorageRetryPolicyType$1 = {}));
-	
-	return StorageRetryPolicyType;
-}
-
-var hasRequiredStorageRetryPolicy;
-
-function requireStorageRetryPolicy () {
-	if (hasRequiredStorageRetryPolicy) return StorageRetryPolicy;
-	hasRequiredStorageRetryPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageRetryPolicy, "__esModule", { value: true });
-	StorageRetryPolicy.StorageRetryPolicy = void 0;
-	StorageRetryPolicy.NewRetryPolicyFactory = NewRetryPolicyFactory;
-	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$3();
-	const RequestPolicy_js_1 = requireRequestPolicy();
-	const constants_js_1 = requireConstants$2();
-	const utils_common_js_1 = requireUtils_common$1();
-	const log_js_1 = requireLog();
-	const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType();
-	/**
-	 * A factory method used to generated a RetryPolicy factory.
-	 *
-	 * @param retryOptions -
-	 */
-	function NewRetryPolicyFactory(retryOptions) {
-	    return {
-	        create: (nextPolicy, options) => {
-	            return new StorageRetryPolicy$1(nextPolicy, options, retryOptions);
-	        },
-	    };
-	}
-	// Default values of StorageRetryOptions
-	const DEFAULT_RETRY_OPTIONS = {
-	    maxRetryDelayInMs: 120 * 1000,
-	    maxTries: 4,
-	    retryDelayInMs: 4 * 1000,
-	    retryPolicyType: StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL,
-	    secondaryHost: "",
-	    tryTimeoutInMs: undefined, // Use server side default timeout strategy
-	};
-	const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
-	/**
-	 * Retry policy with exponential retry and linear retry implemented.
-	 */
-	let StorageRetryPolicy$1 = class StorageRetryPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
-	    /**
-	     * RetryOptions.
-	     */
-	    retryOptions;
-	    /**
-	     * Creates an instance of RetryPolicy.
-	     *
-	     * @param nextPolicy -
-	     * @param options -
-	     * @param retryOptions -
-	     */
-	    constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {
-	        super(nextPolicy, options);
-	        // Initialize retry options
-	        this.retryOptions = {
-	            retryPolicyType: retryOptions.retryPolicyType
-	                ? retryOptions.retryPolicyType
-	                : DEFAULT_RETRY_OPTIONS.retryPolicyType,
-	            maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1
-	                ? Math.floor(retryOptions.maxTries)
-	                : DEFAULT_RETRY_OPTIONS.maxTries,
-	            tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0
-	                ? retryOptions.tryTimeoutInMs
-	                : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,
-	            retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0
-	                ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs
-	                    ? retryOptions.maxRetryDelayInMs
-	                    : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)
-	                : DEFAULT_RETRY_OPTIONS.retryDelayInMs,
-	            maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0
-	                ? retryOptions.maxRetryDelayInMs
-	                : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,
-	            secondaryHost: retryOptions.secondaryHost
-	                ? retryOptions.secondaryHost
-	                : DEFAULT_RETRY_OPTIONS.secondaryHost,
-	        };
-	    }
-	    /**
-	     * Sends request.
-	     *
-	     * @param request -
-	     */
-	    async sendRequest(request) {
-	        return this.attemptSendRequest(request, false, 1);
-	    }
-	    /**
-	     * Decide and perform next retry. Won't mutate request parameter.
-	     *
-	     * @param request -
-	     * @param secondaryHas404 -  If attempt was against the secondary & it returned a StatusNotFound (404), then
-	     *                                   the resource was not found. This may be due to replication delay. So, in this
-	     *                                   case, we'll never try the secondary again for this operation.
-	     * @param attempt -           How many retries has been attempted to performed, starting from 1, which includes
-	     *                                   the attempt will be performed by this method call.
-	     */
-	    async attemptSendRequest(request, secondaryHas404, attempt) {
-	        const newRequest = request.clone();
-	        const isPrimaryRetry = secondaryHas404 ||
-	            !this.retryOptions.secondaryHost ||
-	            !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||
-	            attempt % 2 === 1;
-	        if (!isPrimaryRetry) {
-	            newRequest.url = (0, utils_common_js_1.setURLHost)(newRequest.url, this.retryOptions.secondaryHost);
-	        }
-	        // Set the server-side timeout query parameter "timeout=[seconds]"
-	        if (this.retryOptions.tryTimeoutInMs) {
-	            newRequest.url = (0, utils_common_js_1.setURLParameter)(newRequest.url, constants_js_1.URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());
-	        }
-	        let response;
-	        try {
-	            log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
-	            response = await this._nextPolicy.sendRequest(newRequest);
-	            if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {
-	                return response;
-	            }
-	            secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
-	        }
-	        catch (err) {
-	            log_js_1.logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);
-	            if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {
-	                throw err;
-	            }
-	        }
-	        await this.delay(isPrimaryRetry, attempt, request.abortSignal);
-	        return this.attemptSendRequest(request, secondaryHas404, ++attempt);
-	    }
-	    /**
-	     * Decide whether to retry according to last HTTP response and retry counters.
-	     *
-	     * @param isPrimaryRetry -
-	     * @param attempt -
-	     * @param response -
-	     * @param err -
-	     */
-	    shouldRetry(isPrimaryRetry, attempt, response, err) {
-	        if (attempt >= this.retryOptions.maxTries) {
-	            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions
-	                .maxTries}, no further try.`);
-	            return false;
-	        }
-	        // Handle network failures, you may need to customize the list when you implement
-	        // your own http client
-	        const retriableErrors = [
-	            "ETIMEDOUT",
-	            "ESOCKETTIMEDOUT",
-	            "ECONNREFUSED",
-	            "ECONNRESET",
-	            "ENOENT",
-	            "ENOTFOUND",
-	            "TIMEOUT",
-	            "EPIPE",
-	            "REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js
-	        ];
-	        if (err) {
-	            for (const retriableError of retriableErrors) {
-	                if (err.name.toUpperCase().includes(retriableError) ||
-	                    err.message.toUpperCase().includes(retriableError) ||
-	                    (err.code && err.code.toString().toUpperCase() === retriableError)) {
-	                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
-	                    return true;
-	                }
-	            }
-	        }
-	        // If attempt was against the secondary & it returned a StatusNotFound (404), then
-	        // the resource was not found. This may be due to replication delay. So, in this
-	        // case, we'll never try the secondary again for this operation.
-	        if (response || err) {
-	            const statusCode = response ? response.status : err ? err.statusCode : 0;
-	            if (!isPrimaryRetry && statusCode === 404) {
-	                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
-	                return true;
-	            }
-	            // Server internal error or server timeout
-	            if (statusCode === 503 || statusCode === 500) {
-	                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
-	                return true;
-	            }
-	        }
-	        if (response) {
-	            // Retry select Copy Source Error Codes.
-	            if (response?.status >= 400) {
-	                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
-	                if (copySourceError !== undefined) {
-	                    switch (copySourceError) {
-	                        case "InternalError":
-	                        case "OperationTimedOut":
-	                        case "ServerBusy":
-	                            return true;
-	                    }
-	                }
-	            }
-	        }
-	        if (err?.code === "PARSE_ERROR" && err?.message.startsWith(`Error "Error: Unclosed root tag`)) {
-	            log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
-	            return true;
-	        }
-	        return false;
-	    }
-	    /**
-	     * Delay a calculated time between retries.
-	     *
-	     * @param isPrimaryRetry -
-	     * @param attempt -
-	     * @param abortSignal -
-	     */
-	    async delay(isPrimaryRetry, attempt, abortSignal) {
-	        let delayTimeInMs = 0;
-	        if (isPrimaryRetry) {
-	            switch (this.retryOptions.retryPolicyType) {
-	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL:
-	                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);
-	                    break;
-	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.FIXED:
-	                    delayTimeInMs = this.retryOptions.retryDelayInMs;
-	                    break;
-	            }
-	        }
-	        else {
-	            delayTimeInMs = Math.random() * 1000;
-	        }
-	        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
-	        return (0, utils_common_js_1.delay)(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);
-	    }
-	};
-	StorageRetryPolicy.StorageRetryPolicy = StorageRetryPolicy$1;
-	
-	return StorageRetryPolicy;
-}
-
-var hasRequiredStorageRetryPolicyFactory;
-
-function requireStorageRetryPolicyFactory () {
-	if (hasRequiredStorageRetryPolicyFactory) return StorageRetryPolicyFactory;
-	hasRequiredStorageRetryPolicyFactory = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.StorageRetryPolicyFactory = exports$1.StorageRetryPolicy = exports$1.StorageRetryPolicyType = void 0;
-		const StorageRetryPolicy_js_1 = requireStorageRetryPolicy();
-		Object.defineProperty(exports$1, "StorageRetryPolicy", { enumerable: true, get: function () { return StorageRetryPolicy_js_1.StorageRetryPolicy; } });
-		const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType();
-		Object.defineProperty(exports$1, "StorageRetryPolicyType", { enumerable: true, get: function () { return StorageRetryPolicyType_js_1.StorageRetryPolicyType; } });
-		/**
-		 * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.
-		 */
-		class StorageRetryPolicyFactory {
-		    retryOptions;
-		    /**
-		     * Creates an instance of StorageRetryPolicyFactory.
-		     * @param retryOptions -
-		     */
-		    constructor(retryOptions) {
-		        this.retryOptions = retryOptions;
-		    }
-		    /**
-		     * Creates a StorageRetryPolicy object.
-		     *
-		     * @param nextPolicy -
-		     * @param options -
-		     */
-		    create(nextPolicy, options) {
-		        return new StorageRetryPolicy_js_1.StorageRetryPolicy(nextPolicy, options, this.retryOptions);
-		    }
-		}
-		exports$1.StorageRetryPolicyFactory = StorageRetryPolicyFactory;
-		
-	} (StorageRetryPolicyFactory));
-	return StorageRetryPolicyFactory;
-}
-
-var StorageBrowserPolicyV2$1 = {};
-
-var hasRequiredStorageBrowserPolicyV2$1;
-
-function requireStorageBrowserPolicyV2$1 () {
-	if (hasRequiredStorageBrowserPolicyV2$1) return StorageBrowserPolicyV2$1;
-	hasRequiredStorageBrowserPolicyV2$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageBrowserPolicyName = void 0;
-		exports$1.storageBrowserPolicy = storageBrowserPolicy;
-		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-		const constants_js_1 = requireConstants$2();
-		const utils_common_js_1 = requireUtils_common$1();
-		/**
-		 * The programmatic identifier of the StorageBrowserPolicy.
-		 */
-		exports$1.storageBrowserPolicyName = "storageBrowserPolicy";
-		/**
-		 * storageBrowserPolicy is a policy used to prevent browsers from caching requests
-		 * and to remove cookies and explicit content-length headers.
-		 */
-		function storageBrowserPolicy() {
-		    return {
-		        name: exports$1.storageBrowserPolicyName,
-		        async sendRequest(request, next) {
-		            if (core_util_1.isNodeLike) {
-		                return next(request);
-		            }
-		            if (request.method === "GET" || request.method === "HEAD") {
-		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
-		            }
-		            request.headers.delete(constants_js_1.HeaderConstants.COOKIE);
-		            // According to XHR standards, content-length should be fully controlled by browsers
-		            request.headers.delete(constants_js_1.HeaderConstants.CONTENT_LENGTH);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (StorageBrowserPolicyV2$1));
-	return StorageBrowserPolicyV2$1;
-}
-
-var StorageCorrectContentLengthPolicy$1 = {};
-
-var hasRequiredStorageCorrectContentLengthPolicy$1;
-
-function requireStorageCorrectContentLengthPolicy$1 () {
-	if (hasRequiredStorageCorrectContentLengthPolicy$1) return StorageCorrectContentLengthPolicy$1;
-	hasRequiredStorageCorrectContentLengthPolicy$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageCorrectContentLengthPolicyName = void 0;
-		exports$1.storageCorrectContentLengthPolicy = storageCorrectContentLengthPolicy;
-		const constants_js_1 = requireConstants$2();
-		/**
-		 * The programmatic identifier of the storageCorrectContentLengthPolicy.
-		 */
-		exports$1.storageCorrectContentLengthPolicyName = "StorageCorrectContentLengthPolicy";
-		/**
-		 * storageCorrectContentLengthPolicy to correctly set Content-Length header with request body length.
-		 */
-		function storageCorrectContentLengthPolicy() {
-		    function correctContentLength(request) {
-		        if (request.body &&
-		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
-		            request.body.length > 0) {
-		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
-		        }
-		    }
-		    return {
-		        name: exports$1.storageCorrectContentLengthPolicyName,
-		        async sendRequest(request, next) {
-		            correctContentLength(request);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (StorageCorrectContentLengthPolicy$1));
-	return StorageCorrectContentLengthPolicy$1;
-}
-
-var StorageRetryPolicyV2$1 = {};
-
-var hasRequiredStorageRetryPolicyV2$1;
-
-function requireStorageRetryPolicyV2$1 () {
-	if (hasRequiredStorageRetryPolicyV2$1) return StorageRetryPolicyV2$1;
-	hasRequiredStorageRetryPolicyV2$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageRetryPolicyName = void 0;
-		exports$1.storageRetryPolicy = storageRetryPolicy;
-		const abort_controller_1 = /*@__PURE__*/ requireCommonjs$3();
-		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-		const StorageRetryPolicyFactory_js_1 = requireStorageRetryPolicyFactory();
-		const constants_js_1 = requireConstants$2();
-		const utils_common_js_1 = requireUtils_common$1();
-		const log_js_1 = requireLog();
-		/**
-		 * Name of the {@link storageRetryPolicy}
-		 */
-		exports$1.storageRetryPolicyName = "storageRetryPolicy";
-		// Default values of StorageRetryOptions
-		const DEFAULT_RETRY_OPTIONS = {
-		    maxRetryDelayInMs: 120 * 1000,
-		    maxTries: 4,
-		    retryDelayInMs: 4 * 1000,
-		    retryPolicyType: StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL,
-		    secondaryHost: "",
-		    tryTimeoutInMs: undefined, // Use server side default timeout strategy
-		};
-		const retriableErrors = [
-		    "ETIMEDOUT",
-		    "ESOCKETTIMEDOUT",
-		    "ECONNREFUSED",
-		    "ECONNRESET",
-		    "ENOENT",
-		    "ENOTFOUND",
-		    "TIMEOUT",
-		    "EPIPE",
-		    "REQUEST_SEND_ERROR",
-		];
-		const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
-		/**
-		 * Retry policy with exponential retry and linear retry implemented.
-		 */
-		function storageRetryPolicy(options = {}) {
-		    const retryPolicyType = options.retryPolicyType ?? DEFAULT_RETRY_OPTIONS.retryPolicyType;
-		    const maxTries = options.maxTries ?? DEFAULT_RETRY_OPTIONS.maxTries;
-		    const retryDelayInMs = options.retryDelayInMs ?? DEFAULT_RETRY_OPTIONS.retryDelayInMs;
-		    const maxRetryDelayInMs = options.maxRetryDelayInMs ?? DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs;
-		    const secondaryHost = options.secondaryHost ?? DEFAULT_RETRY_OPTIONS.secondaryHost;
-		    const tryTimeoutInMs = options.tryTimeoutInMs ?? DEFAULT_RETRY_OPTIONS.tryTimeoutInMs;
-		    function shouldRetry({ isPrimaryRetry, attempt, response, error, }) {
-		        if (attempt >= maxTries) {
-		            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${maxTries}, no further try.`);
-		            return false;
-		        }
-		        if (error) {
-		            for (const retriableError of retriableErrors) {
-		                if (error.name.toUpperCase().includes(retriableError) ||
-		                    error.message.toUpperCase().includes(retriableError) ||
-		                    (error.code && error.code.toString().toUpperCase() === retriableError)) {
-		                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
-		                    return true;
-		                }
-		            }
-		            if (error?.code === "PARSE_ERROR" &&
-		                error?.message.startsWith(`Error "Error: Unclosed root tag`)) {
-		                log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
-		                return true;
-		            }
-		        }
-		        // If attempt was against the secondary & it returned a StatusNotFound (404), then
-		        // the resource was not found. This may be due to replication delay. So, in this
-		        // case, we'll never try the secondary again for this operation.
-		        if (response || error) {
-		            const statusCode = response?.status ?? error?.statusCode ?? 0;
-		            if (!isPrimaryRetry && statusCode === 404) {
-		                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
-		                return true;
-		            }
-		            // Server internal error or server timeout
-		            if (statusCode === 503 || statusCode === 500) {
-		                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
-		                return true;
-		            }
-		        }
-		        if (response) {
-		            // Retry select Copy Source Error Codes.
-		            if (response?.status >= 400) {
-		                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
-		                if (copySourceError !== undefined) {
-		                    switch (copySourceError) {
-		                        case "InternalError":
-		                        case "OperationTimedOut":
-		                        case "ServerBusy":
-		                            return true;
-		                    }
-		                }
-		            }
-		        }
-		        return false;
-		    }
-		    function calculateDelay(isPrimaryRetry, attempt) {
-		        let delayTimeInMs = 0;
-		        if (isPrimaryRetry) {
-		            switch (retryPolicyType) {
-		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL:
-		                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * retryDelayInMs, maxRetryDelayInMs);
-		                    break;
-		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.FIXED:
-		                    delayTimeInMs = retryDelayInMs;
-		                    break;
-		            }
-		        }
-		        else {
-		            delayTimeInMs = Math.random() * 1000;
-		        }
-		        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
-		        return delayTimeInMs;
-		    }
-		    return {
-		        name: exports$1.storageRetryPolicyName,
-		        async sendRequest(request, next) {
-		            // Set the server-side timeout query parameter "timeout=[seconds]"
-		            if (tryTimeoutInMs) {
-		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.TIMEOUT, String(Math.floor(tryTimeoutInMs / 1000)));
-		            }
-		            const primaryUrl = request.url;
-		            const secondaryUrl = secondaryHost ? (0, utils_common_js_1.setURLHost)(request.url, secondaryHost) : undefined;
-		            let secondaryHas404 = false;
-		            let attempt = 1;
-		            let retryAgain = true;
-		            let response;
-		            let error;
-		            while (retryAgain) {
-		                const isPrimaryRetry = secondaryHas404 ||
-		                    !secondaryUrl ||
-		                    !["GET", "HEAD", "OPTIONS"].includes(request.method) ||
-		                    attempt % 2 === 1;
-		                request.url = isPrimaryRetry ? primaryUrl : secondaryUrl;
-		                response = undefined;
-		                error = undefined;
-		                try {
-		                    log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
-		                    response = await next(request);
-		                    secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
-		                }
-		                catch (e) {
-		                    if ((0, core_rest_pipeline_1.isRestError)(e)) {
-		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${e.message}, code: ${e.code}`);
-		                        error = e;
-		                    }
-		                    else {
-		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${(0, core_util_1.getErrorMessage)(e)}`);
-		                        throw e;
-		                    }
-		                }
-		                retryAgain = shouldRetry({ isPrimaryRetry, attempt, response, error });
-		                if (retryAgain) {
-		                    await (0, utils_common_js_1.delay)(calculateDelay(isPrimaryRetry, attempt), request.abortSignal, RETRY_ABORT_ERROR);
-		                }
-		                attempt++;
-		            }
-		            if (response) {
-		                return response;
-		            }
-		            throw error ?? new core_rest_pipeline_1.RestError("RetryPolicy failed without known error.");
-		        },
-		    };
-		}
-		
-	} (StorageRetryPolicyV2$1));
-	return StorageRetryPolicyV2$1;
-}
-
-var StorageSharedKeyCredentialPolicyV2$1 = {};
-
-var hasRequiredStorageSharedKeyCredentialPolicyV2$1;
-
-function requireStorageSharedKeyCredentialPolicyV2$1 () {
-	if (hasRequiredStorageSharedKeyCredentialPolicyV2$1) return StorageSharedKeyCredentialPolicyV2$1;
-	hasRequiredStorageSharedKeyCredentialPolicyV2$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageSharedKeyCredentialPolicyName = void 0;
-		exports$1.storageSharedKeyCredentialPolicy = storageSharedKeyCredentialPolicy;
-		const node_crypto_1 = require$$0$g;
-		const constants_js_1 = requireConstants$2();
-		const utils_common_js_1 = requireUtils_common$1();
-		const SharedKeyComparator_js_1 = requireSharedKeyComparator();
-		/**
-		 * The programmatic identifier of the storageSharedKeyCredentialPolicy.
-		 */
-		exports$1.storageSharedKeyCredentialPolicyName = "storageSharedKeyCredentialPolicy";
-		/**
-		 * storageSharedKeyCredentialPolicy handles signing requests using storage account keys.
-		 */
-		function storageSharedKeyCredentialPolicy(options) {
-		    function signRequest(request) {
-		        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
-		        if (request.body &&
-		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
-		            request.body.length > 0) {
-		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
-		        }
-		        const stringToSign = [
-		            request.method.toUpperCase(),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
-		        ].join("\n") +
-		            "\n" +
-		            getCanonicalizedHeadersString(request) +
-		            getCanonicalizedResourceString(request);
-		        const signature = (0, node_crypto_1.createHmac)("sha256", options.accountKey)
-		            .update(stringToSign, "utf8")
-		            .digest("base64");
-		        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${options.accountName}:${signature}`);
-		        // console.log(`[URL]:${request.url}`);
-		        // console.log(`[HEADERS]:${request.headers.toString()}`);
-		        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
-		        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
-		    }
-		    /**
-		     * Retrieve header value according to shared key sign rules.
-		     * @see https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
-		     */
-		    function getHeaderValueToSign(request, headerName) {
-		        const value = request.headers.get(headerName);
-		        if (!value) {
-		            return "";
-		        }
-		        // When using version 2015-02-21 or later, if Content-Length is zero, then
-		        // set the Content-Length part of the StringToSign to an empty string.
-		        // https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
-		        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
-		            return "";
-		        }
-		        return value;
-		    }
-		    /**
-		     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
-		     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
-		     * 2. Convert each HTTP header name to lowercase.
-		     * 3. Sort the headers lexicographically by header name, in ascending order.
-		     *    Each header may appear only once in the string.
-		     * 4. Replace any linear whitespace in the header value with a single space.
-		     * 5. Trim any whitespace around the colon in the header.
-		     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
-		     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
-		     *
-		     */
-		    function getCanonicalizedHeadersString(request) {
-		        let headersArray = [];
-		        for (const [name, value] of request.headers) {
-		            if (name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE)) {
-		                headersArray.push({ name, value });
-		            }
-		        }
-		        headersArray.sort((a, b) => {
-		            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
-		        });
-		        // Remove duplicate headers
-		        headersArray = headersArray.filter((value, index, array) => {
-		            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
-		                return false;
-		            }
-		            return true;
-		        });
-		        let canonicalizedHeadersStringToSign = "";
-		        headersArray.forEach((header) => {
-		            canonicalizedHeadersStringToSign += `${header.name
-		                .toLowerCase()
-		                .trimRight()}:${header.value.trimLeft()}\n`;
-		        });
-		        return canonicalizedHeadersStringToSign;
-		    }
-		    function getCanonicalizedResourceString(request) {
-		        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
-		        let canonicalizedResourceString = "";
-		        canonicalizedResourceString += `/${options.accountName}${path}`;
-		        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
-		        const lowercaseQueries = {};
-		        if (queries) {
-		            const queryKeys = [];
-		            for (const key in queries) {
-		                if (Object.prototype.hasOwnProperty.call(queries, key)) {
-		                    const lowercaseKey = key.toLowerCase();
-		                    lowercaseQueries[lowercaseKey] = queries[key];
-		                    queryKeys.push(lowercaseKey);
-		                }
-		            }
-		            queryKeys.sort();
-		            for (const key of queryKeys) {
-		                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
-		            }
-		        }
-		        return canonicalizedResourceString;
-		    }
-		    return {
-		        name: exports$1.storageSharedKeyCredentialPolicyName,
-		        async sendRequest(request, next) {
-		            signRequest(request);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (StorageSharedKeyCredentialPolicyV2$1));
-	return StorageSharedKeyCredentialPolicyV2$1;
-}
-
-var StorageRequestFailureDetailsParserPolicy = {};
-
-var hasRequiredStorageRequestFailureDetailsParserPolicy;
-
-function requireStorageRequestFailureDetailsParserPolicy () {
-	if (hasRequiredStorageRequestFailureDetailsParserPolicy) return StorageRequestFailureDetailsParserPolicy;
-	hasRequiredStorageRequestFailureDetailsParserPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageRequestFailureDetailsParserPolicyName = void 0;
-		exports$1.storageRequestFailureDetailsParserPolicy = storageRequestFailureDetailsParserPolicy;
-		/**
-		 * The programmatic identifier of the StorageRequestFailureDetailsParserPolicy.
-		 */
-		exports$1.storageRequestFailureDetailsParserPolicyName = "storageRequestFailureDetailsParserPolicy";
-		/**
-		 * StorageRequestFailureDetailsParserPolicy
-		 */
-		function storageRequestFailureDetailsParserPolicy() {
-		    return {
-		        name: exports$1.storageRequestFailureDetailsParserPolicyName,
-		        async sendRequest(request, next) {
-		            try {
-		                const response = await next(request);
-		                return response;
-		            }
-		            catch (err) {
-		                if (typeof err === "object" &&
-		                    err !== null &&
-		                    err.response &&
-		                    err.response.parsedBody) {
-		                    if (err.response.parsedBody.code === "InvalidHeaderValue" &&
-		                        err.response.parsedBody.HeaderName === "x-ms-version") {
-		                        err.message =
-		                            "The provided service version is not enabled on this storage account. Please see https://learn.microsoft.com/rest/api/storageservices/versioning-for-the-azure-storage-services for additional information.\n";
-		                    }
-		                }
-		                throw err;
-		            }
-		        },
-		    };
-		}
-		
-	} (StorageRequestFailureDetailsParserPolicy));
-	return StorageRequestFailureDetailsParserPolicy;
-}
-
-var hasRequiredCommonjs$2;
-
-function requireCommonjs$2 () {
-	if (hasRequiredCommonjs$2) return commonjs$2;
-	hasRequiredCommonjs$2 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.BaseRequestPolicy = exports$1.getCachedDefaultHttpClient = void 0;
-		const tslib_1 = require$$0$2;
-		tslib_1.__exportStar(requireBufferScheduler(), exports$1);
-		var cache_js_1 = requireCache$2();
-		Object.defineProperty(exports$1, "getCachedDefaultHttpClient", { enumerable: true, get: function () { return cache_js_1.getCachedDefaultHttpClient; } });
-		tslib_1.__exportStar(requireStorageBrowserPolicyFactory$1(), exports$1);
-		tslib_1.__exportStar(requireAnonymousCredential(), exports$1);
-		tslib_1.__exportStar(requireCredential(), exports$1);
-		tslib_1.__exportStar(requireStorageSharedKeyCredential(), exports$1);
-		tslib_1.__exportStar(requireStorageRetryPolicyFactory(), exports$1);
-		var RequestPolicy_js_1 = requireRequestPolicy();
-		Object.defineProperty(exports$1, "BaseRequestPolicy", { enumerable: true, get: function () { return RequestPolicy_js_1.BaseRequestPolicy; } });
-		tslib_1.__exportStar(requireAnonymousCredentialPolicy(), exports$1);
-		tslib_1.__exportStar(requireCredentialPolicy(), exports$1);
-		tslib_1.__exportStar(requireStorageBrowserPolicy$1(), exports$1);
-		tslib_1.__exportStar(requireStorageBrowserPolicyV2$1(), exports$1);
-		tslib_1.__exportStar(requireStorageCorrectContentLengthPolicy$1(), exports$1);
-		tslib_1.__exportStar(requireStorageRetryPolicyType(), exports$1);
-		tslib_1.__exportStar(requireStorageRetryPolicy(), exports$1);
-		tslib_1.__exportStar(requireStorageRetryPolicyV2$1(), exports$1);
-		tslib_1.__exportStar(requireStorageSharedKeyCredentialPolicy(), exports$1);
-		tslib_1.__exportStar(requireStorageSharedKeyCredentialPolicyV2$1(), exports$1);
-		tslib_1.__exportStar(requireStorageRetryPolicyFactory(), exports$1);
-		tslib_1.__exportStar(requireStorageRequestFailureDetailsParserPolicy(), exports$1);
-		
-	} (commonjs$2));
-	return commonjs$2;
-}
-
-var StorageBrowserPolicyV2 = {};
-
-var hasRequiredStorageBrowserPolicyV2;
-
-function requireStorageBrowserPolicyV2 () {
-	if (hasRequiredStorageBrowserPolicyV2) return StorageBrowserPolicyV2;
-	hasRequiredStorageBrowserPolicyV2 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageBrowserPolicyName = void 0;
-		exports$1.storageBrowserPolicy = storageBrowserPolicy;
-		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-		const constants_js_1 = requireConstants$3();
-		const utils_common_js_1 = requireUtils_common$2();
-		/**
-		 * The programmatic identifier of the StorageBrowserPolicy.
-		 */
-		exports$1.storageBrowserPolicyName = "storageBrowserPolicy";
-		/**
-		 * storageBrowserPolicy is a policy used to prevent browsers from caching requests
-		 * and to remove cookies and explicit content-length headers.
-		 */
-		function storageBrowserPolicy() {
-		    return {
-		        name: exports$1.storageBrowserPolicyName,
-		        async sendRequest(request, next) {
-		            if (core_util_1.isNodeLike) {
-		                return next(request);
-		            }
-		            if (request.method === "GET" || request.method === "HEAD") {
-		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
-		            }
-		            request.headers.delete(constants_js_1.HeaderConstants.COOKIE);
-		            // According to XHR standards, content-length should be fully controlled by browsers
-		            request.headers.delete(constants_js_1.HeaderConstants.CONTENT_LENGTH);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (StorageBrowserPolicyV2));
-	return StorageBrowserPolicyV2;
-}
-
-var StorageRetryPolicyV2 = {};
-
-var hasRequiredStorageRetryPolicyV2;
-
-function requireStorageRetryPolicyV2 () {
-	if (hasRequiredStorageRetryPolicyV2) return StorageRetryPolicyV2;
-	hasRequiredStorageRetryPolicyV2 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageRetryPolicyName = void 0;
-		exports$1.storageRetryPolicy = storageRetryPolicy;
-		const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
-		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-		const StorageRetryPolicyFactory_js_1 = requireStorageRetryPolicyFactory$1();
-		const constants_js_1 = requireConstants$3();
-		const utils_common_js_1 = requireUtils_common$2();
-		const log_js_1 = requireLog$1();
-		/**
-		 * Name of the {@link storageRetryPolicy}
-		 */
-		exports$1.storageRetryPolicyName = "storageRetryPolicy";
-		// Default values of StorageRetryOptions
-		const DEFAULT_RETRY_OPTIONS = {
-		    maxRetryDelayInMs: 120 * 1000,
-		    maxTries: 4,
-		    retryDelayInMs: 4 * 1000,
-		    retryPolicyType: StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL,
-		    secondaryHost: "",
-		    tryTimeoutInMs: undefined, // Use server side default timeout strategy
-		};
-		const retriableErrors = [
-		    "ETIMEDOUT",
-		    "ESOCKETTIMEDOUT",
-		    "ECONNREFUSED",
-		    "ECONNRESET",
-		    "ENOENT",
-		    "ENOTFOUND",
-		    "TIMEOUT",
-		    "EPIPE",
-		    "REQUEST_SEND_ERROR",
-		];
-		const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
-		/**
-		 * Retry policy with exponential retry and linear retry implemented.
-		 */
-		function storageRetryPolicy(options = {}) {
-		    const retryPolicyType = options.retryPolicyType ?? DEFAULT_RETRY_OPTIONS.retryPolicyType;
-		    const maxTries = options.maxTries ?? DEFAULT_RETRY_OPTIONS.maxTries;
-		    const retryDelayInMs = options.retryDelayInMs ?? DEFAULT_RETRY_OPTIONS.retryDelayInMs;
-		    const maxRetryDelayInMs = options.maxRetryDelayInMs ?? DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs;
-		    const secondaryHost = options.secondaryHost ?? DEFAULT_RETRY_OPTIONS.secondaryHost;
-		    const tryTimeoutInMs = options.tryTimeoutInMs ?? DEFAULT_RETRY_OPTIONS.tryTimeoutInMs;
-		    function shouldRetry({ isPrimaryRetry, attempt, response, error, }) {
-		        if (attempt >= maxTries) {
-		            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${maxTries}, no further try.`);
-		            return false;
-		        }
-		        if (error) {
-		            for (const retriableError of retriableErrors) {
-		                if (error.name.toUpperCase().includes(retriableError) ||
-		                    error.message.toUpperCase().includes(retriableError) ||
-		                    (error.code && error.code.toString().toUpperCase() === retriableError)) {
-		                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
-		                    return true;
-		                }
-		            }
-		            if (error?.code === "PARSE_ERROR" &&
-		                error?.message.startsWith(`Error "Error: Unclosed root tag`)) {
-		                log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
-		                return true;
-		            }
-		        }
-		        // If attempt was against the secondary & it returned a StatusNotFound (404), then
-		        // the resource was not found. This may be due to replication delay. So, in this
-		        // case, we'll never try the secondary again for this operation.
-		        if (response || error) {
-		            const statusCode = response?.status ?? error?.statusCode ?? 0;
-		            if (!isPrimaryRetry && statusCode === 404) {
-		                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
-		                return true;
-		            }
-		            // Server internal error or server timeout
-		            if (statusCode === 503 || statusCode === 500) {
-		                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
-		                return true;
-		            }
-		        }
-		        if (response) {
-		            // Retry select Copy Source Error Codes.
-		            if (response?.status >= 400) {
-		                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
-		                if (copySourceError !== undefined) {
-		                    switch (copySourceError) {
-		                        case "InternalError":
-		                        case "OperationTimedOut":
-		                        case "ServerBusy":
-		                            return true;
-		                    }
-		                }
-		            }
-		        }
-		        return false;
-		    }
-		    function calculateDelay(isPrimaryRetry, attempt) {
-		        let delayTimeInMs = 0;
-		        if (isPrimaryRetry) {
-		            switch (retryPolicyType) {
-		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL:
-		                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * retryDelayInMs, maxRetryDelayInMs);
-		                    break;
-		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.FIXED:
-		                    delayTimeInMs = retryDelayInMs;
-		                    break;
-		            }
-		        }
-		        else {
-		            delayTimeInMs = Math.random() * 1000;
-		        }
-		        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
-		        return delayTimeInMs;
-		    }
-		    return {
-		        name: exports$1.storageRetryPolicyName,
-		        async sendRequest(request, next) {
-		            // Set the server-side timeout query parameter "timeout=[seconds]"
-		            if (tryTimeoutInMs) {
-		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.TIMEOUT, String(Math.floor(tryTimeoutInMs / 1000)));
-		            }
-		            const primaryUrl = request.url;
-		            const secondaryUrl = secondaryHost ? (0, utils_common_js_1.setURLHost)(request.url, secondaryHost) : undefined;
-		            let secondaryHas404 = false;
-		            let attempt = 1;
-		            let retryAgain = true;
-		            let response;
-		            let error;
-		            while (retryAgain) {
-		                const isPrimaryRetry = secondaryHas404 ||
-		                    !secondaryUrl ||
-		                    !["GET", "HEAD", "OPTIONS"].includes(request.method) ||
-		                    attempt % 2 === 1;
-		                request.url = isPrimaryRetry ? primaryUrl : secondaryUrl;
-		                response = undefined;
-		                error = undefined;
-		                try {
-		                    log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
-		                    response = await next(request);
-		                    secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
-		                }
-		                catch (e) {
-		                    if ((0, core_rest_pipeline_1.isRestError)(e)) {
-		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${e.message}, code: ${e.code}`);
-		                        error = e;
-		                    }
-		                    else {
-		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${(0, core_util_1.getErrorMessage)(e)}`);
-		                        throw e;
-		                    }
-		                }
-		                retryAgain = shouldRetry({ isPrimaryRetry, attempt, response, error });
-		                if (retryAgain) {
-		                    await (0, utils_common_js_1.delay)(calculateDelay(isPrimaryRetry, attempt), request.abortSignal, RETRY_ABORT_ERROR);
-		                }
-		                attempt++;
-		            }
-		            if (response) {
-		                return response;
-		            }
-		            throw error ?? new core_rest_pipeline_1.RestError("RetryPolicy failed without known error.");
-		        },
-		    };
-		}
-		
-	} (StorageRetryPolicyV2));
-	return StorageRetryPolicyV2;
-}
-
-var StorageSharedKeyCredentialPolicyV2 = {};
-
-var hasRequiredStorageSharedKeyCredentialPolicyV2;
-
-function requireStorageSharedKeyCredentialPolicyV2 () {
-	if (hasRequiredStorageSharedKeyCredentialPolicyV2) return StorageSharedKeyCredentialPolicyV2;
-	hasRequiredStorageSharedKeyCredentialPolicyV2 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageSharedKeyCredentialPolicyName = void 0;
-		exports$1.storageSharedKeyCredentialPolicy = storageSharedKeyCredentialPolicy;
-		const node_crypto_1 = require$$0$g;
-		const constants_js_1 = requireConstants$3();
-		const utils_common_js_1 = requireUtils_common$2();
-		const SharedKeyComparator_js_1 = requireSharedKeyComparator$1();
-		/**
-		 * The programmatic identifier of the storageSharedKeyCredentialPolicy.
-		 */
-		exports$1.storageSharedKeyCredentialPolicyName = "storageSharedKeyCredentialPolicy";
-		/**
-		 * storageSharedKeyCredentialPolicy handles signing requests using storage account keys.
-		 */
-		function storageSharedKeyCredentialPolicy(options) {
-		    function signRequest(request) {
-		        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
-		        if (request.body &&
-		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
-		            request.body.length > 0) {
-		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
-		        }
-		        const stringToSign = [
-		            request.method.toUpperCase(),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
-		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
-		        ].join("\n") +
-		            "\n" +
-		            getCanonicalizedHeadersString(request) +
-		            getCanonicalizedResourceString(request);
-		        const signature = (0, node_crypto_1.createHmac)("sha256", options.accountKey)
-		            .update(stringToSign, "utf8")
-		            .digest("base64");
-		        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${options.accountName}:${signature}`);
-		        // console.log(`[URL]:${request.url}`);
-		        // console.log(`[HEADERS]:${request.headers.toString()}`);
-		        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
-		        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
-		    }
-		    /**
-		     * Retrieve header value according to shared key sign rules.
-		     * @see https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
-		     */
-		    function getHeaderValueToSign(request, headerName) {
-		        const value = request.headers.get(headerName);
-		        if (!value) {
-		            return "";
-		        }
-		        // When using version 2015-02-21 or later, if Content-Length is zero, then
-		        // set the Content-Length part of the StringToSign to an empty string.
-		        // https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
-		        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
-		            return "";
-		        }
-		        return value;
-		    }
-		    /**
-		     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
-		     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
-		     * 2. Convert each HTTP header name to lowercase.
-		     * 3. Sort the headers lexicographically by header name, in ascending order.
-		     *    Each header may appear only once in the string.
-		     * 4. Replace any linear whitespace in the header value with a single space.
-		     * 5. Trim any whitespace around the colon in the header.
-		     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
-		     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
-		     *
-		     */
-		    function getCanonicalizedHeadersString(request) {
-		        let headersArray = [];
-		        for (const [name, value] of request.headers) {
-		            if (name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE)) {
-		                headersArray.push({ name, value });
-		            }
-		        }
-		        headersArray.sort((a, b) => {
-		            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
-		        });
-		        // Remove duplicate headers
-		        headersArray = headersArray.filter((value, index, array) => {
-		            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
-		                return false;
-		            }
-		            return true;
-		        });
-		        let canonicalizedHeadersStringToSign = "";
-		        headersArray.forEach((header) => {
-		            canonicalizedHeadersStringToSign += `${header.name
-		                .toLowerCase()
-		                .trimRight()}:${header.value.trimLeft()}\n`;
-		        });
-		        return canonicalizedHeadersStringToSign;
-		    }
-		    function getCanonicalizedResourceString(request) {
-		        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
-		        let canonicalizedResourceString = "";
-		        canonicalizedResourceString += `/${options.accountName}${path}`;
-		        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
-		        const lowercaseQueries = {};
-		        if (queries) {
-		            const queryKeys = [];
-		            for (const key in queries) {
-		                if (Object.prototype.hasOwnProperty.call(queries, key)) {
-		                    const lowercaseKey = key.toLowerCase();
-		                    lowercaseQueries[lowercaseKey] = queries[key];
-		                    queryKeys.push(lowercaseKey);
-		                }
-		            }
-		            queryKeys.sort();
-		            for (const key of queryKeys) {
-		                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
-		            }
-		        }
-		        return canonicalizedResourceString;
-		    }
-		    return {
-		        name: exports$1.storageSharedKeyCredentialPolicyName,
-		        async sendRequest(request, next) {
-		            signRequest(request);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (StorageSharedKeyCredentialPolicyV2));
-	return StorageSharedKeyCredentialPolicyV2;
-}
-
-var StorageBrowserPolicyFactory = {};
-
-var StorageBrowserPolicy = {};
-
-var hasRequiredStorageBrowserPolicy;
-
-function requireStorageBrowserPolicy () {
-	if (hasRequiredStorageBrowserPolicy) return StorageBrowserPolicy;
-	hasRequiredStorageBrowserPolicy = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageBrowserPolicy, "__esModule", { value: true });
-	StorageBrowserPolicy.StorageBrowserPolicy = void 0;
-	const RequestPolicy_js_1 = requireRequestPolicy$1();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const constants_js_1 = requireConstants$3();
-	const utils_common_js_1 = requireUtils_common$2();
-	/**
-	 * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:
-	 *
-	 * 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.
-	 * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL
-	 * thus avoid the browser cache.
-	 *
-	 * 2. Remove cookie header for security
-	 *
-	 * 3. Remove content-length header to avoid browsers warning
-	 */
-	let StorageBrowserPolicy$1 = class StorageBrowserPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
-	    /**
-	     * Creates an instance of StorageBrowserPolicy.
-	     * @param nextPolicy -
-	     * @param options -
-	     */
-	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
-	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
-	    constructor(nextPolicy, options) {
-	        super(nextPolicy, options);
-	    }
-	    /**
-	     * Sends out request.
-	     *
-	     * @param request -
-	     */
-	    async sendRequest(request) {
-	        if (core_util_1.isNodeLike) {
-	            return this._nextPolicy.sendRequest(request);
-	        }
-	        if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {
-	            request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
-	        }
-	        request.headers.remove(constants_js_1.HeaderConstants.COOKIE);
-	        // According to XHR standards, content-length should be fully controlled by browsers
-	        request.headers.remove(constants_js_1.HeaderConstants.CONTENT_LENGTH);
-	        return this._nextPolicy.sendRequest(request);
-	    }
-	};
-	StorageBrowserPolicy.StorageBrowserPolicy = StorageBrowserPolicy$1;
-	
-	return StorageBrowserPolicy;
-}
-
-var hasRequiredStorageBrowserPolicyFactory;
-
-function requireStorageBrowserPolicyFactory () {
-	if (hasRequiredStorageBrowserPolicyFactory) return StorageBrowserPolicyFactory;
-	hasRequiredStorageBrowserPolicyFactory = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.StorageBrowserPolicyFactory = exports$1.StorageBrowserPolicy = void 0;
-		const StorageBrowserPolicy_js_1 = requireStorageBrowserPolicy();
-		Object.defineProperty(exports$1, "StorageBrowserPolicy", { enumerable: true, get: function () { return StorageBrowserPolicy_js_1.StorageBrowserPolicy; } });
-		/**
-		 * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.
-		 */
-		class StorageBrowserPolicyFactory {
-		    /**
-		     * Creates a StorageBrowserPolicyFactory object.
-		     *
-		     * @param nextPolicy -
-		     * @param options -
-		     */
-		    create(nextPolicy, options) {
-		        return new StorageBrowserPolicy_js_1.StorageBrowserPolicy(nextPolicy, options);
-		    }
-		}
-		exports$1.StorageBrowserPolicyFactory = StorageBrowserPolicyFactory;
-		
-	} (StorageBrowserPolicyFactory));
-	return StorageBrowserPolicyFactory;
-}
-
-var StorageCorrectContentLengthPolicy = {};
-
-var hasRequiredStorageCorrectContentLengthPolicy;
-
-function requireStorageCorrectContentLengthPolicy () {
-	if (hasRequiredStorageCorrectContentLengthPolicy) return StorageCorrectContentLengthPolicy;
-	hasRequiredStorageCorrectContentLengthPolicy = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.storageCorrectContentLengthPolicyName = void 0;
-		exports$1.storageCorrectContentLengthPolicy = storageCorrectContentLengthPolicy;
-		const constants_js_1 = requireConstants$3();
-		/**
-		 * The programmatic identifier of the storageCorrectContentLengthPolicy.
-		 */
-		exports$1.storageCorrectContentLengthPolicyName = "StorageCorrectContentLengthPolicy";
-		/**
-		 * storageCorrectContentLengthPolicy to correctly set Content-Length header with request body length.
-		 */
-		function storageCorrectContentLengthPolicy() {
-		    function correctContentLength(request) {
-		        if (request.body &&
-		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
-		            request.body.length > 0) {
-		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
-		        }
-		    }
-		    return {
-		        name: exports$1.storageCorrectContentLengthPolicyName,
-		        async sendRequest(request, next) {
-		            correctContentLength(request);
-		            return next(request);
-		        },
-		    };
-		}
-		
-	} (StorageCorrectContentLengthPolicy));
-	return StorageCorrectContentLengthPolicy;
-}
-
-var hasRequiredPipeline;
-
-function requirePipeline () {
-	if (hasRequiredPipeline) return Pipeline;
-	hasRequiredPipeline = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.Pipeline = exports$1.StorageOAuthScopes = void 0;
-		exports$1.isPipelineLike = isPipelineLike;
-		exports$1.newPipeline = newPipeline;
-		exports$1.getCoreClientOptions = getCoreClientOptions;
-		exports$1.getCredentialFromPipeline = getCredentialFromPipeline;
-		const core_http_compat_1 = /*@__PURE__*/ requireCommonjs$6();
-		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-		const core_client_1 = /*@__PURE__*/ requireCommonjs$7();
-		const core_xml_1 = /*@__PURE__*/ requireCommonjs$5();
-		const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
-		const log_js_1 = requireLog$1();
-		const StorageRetryPolicyFactory_js_1 = requireStorageRetryPolicyFactory$1();
-		const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
-		const AnonymousCredential_js_1 = requireAnonymousCredential$1();
-		const constants_js_1 = requireConstants$3();
-		Object.defineProperty(exports$1, "StorageOAuthScopes", { enumerable: true, get: function () { return constants_js_1.StorageOAuthScopes; } });
-		const storage_common_1 = /*@__PURE__*/ requireCommonjs$2();
-		const StorageBrowserPolicyV2_js_1 = requireStorageBrowserPolicyV2();
-		const StorageRetryPolicyV2_js_1 = requireStorageRetryPolicyV2();
-		const StorageSharedKeyCredentialPolicyV2_js_1 = requireStorageSharedKeyCredentialPolicyV2();
-		const StorageBrowserPolicyFactory_js_1 = requireStorageBrowserPolicyFactory();
-		const StorageCorrectContentLengthPolicy_js_1 = requireStorageCorrectContentLengthPolicy();
-		/**
-		 * A helper to decide if a given argument satisfies the Pipeline contract
-		 * @param pipeline - An argument that may be a Pipeline
-		 * @returns true when the argument satisfies the Pipeline contract
-		 */
-		function isPipelineLike(pipeline) {
-		    if (!pipeline || typeof pipeline !== "object") {
-		        return false;
-		    }
-		    const castPipeline = pipeline;
-		    return (Array.isArray(castPipeline.factories) &&
-		        typeof castPipeline.options === "object" &&
-		        typeof castPipeline.toServiceClientOptions === "function");
-		}
-		/**
-		 * A Pipeline class containing HTTP request policies.
-		 * You can create a default Pipeline by calling {@link newPipeline}.
-		 * Or you can create a Pipeline with your own policies by the constructor of Pipeline.
-		 *
-		 * Refer to {@link newPipeline} and provided policies before implementing your
-		 * customized Pipeline.
-		 */
-		class Pipeline {
-		    /**
-		     * A list of chained request policy factories.
-		     */
-		    factories;
-		    /**
-		     * Configures pipeline logger and HTTP client.
-		     */
-		    options;
-		    /**
-		     * Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface.
-		     *
-		     * @param factories -
-		     * @param options -
-		     */
-		    constructor(factories, options = {}) {
-		        this.factories = factories;
-		        this.options = options;
-		    }
-		    /**
-		     * Transfer Pipeline object to ServiceClientOptions object which is required by
-		     * ServiceClient constructor.
-		     *
-		     * @returns The ServiceClientOptions object from this Pipeline.
-		     */
-		    toServiceClientOptions() {
-		        return {
-		            httpClient: this.options.httpClient,
-		            requestPolicyFactories: this.factories,
-		        };
-		    }
-		}
-		exports$1.Pipeline = Pipeline;
-		/**
-		 * Creates a new Pipeline object with Credential provided.
-		 *
-		 * @param credential -  Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
-		 * @param pipelineOptions - Optional. Options.
-		 * @returns A new Pipeline object.
-		 */
-		function newPipeline(credential, pipelineOptions = {}) {
-		    if (!credential) {
-		        credential = new AnonymousCredential_js_1.AnonymousCredential();
-		    }
-		    const pipeline = new Pipeline([], pipelineOptions);
-		    pipeline._credential = credential;
-		    return pipeline;
-		}
-		function processDownlevelPipeline(pipeline) {
-		    const knownFactoryFunctions = [
-		        isAnonymousCredential,
-		        isStorageSharedKeyCredential,
-		        isCoreHttpBearerTokenFactory,
-		        isStorageBrowserPolicyFactory,
-		        isStorageRetryPolicyFactory,
-		        isStorageTelemetryPolicyFactory,
-		        isCoreHttpPolicyFactory,
-		    ];
-		    if (pipeline.factories.length) {
-		        const novelFactories = pipeline.factories.filter((factory) => {
-		            return !knownFactoryFunctions.some((knownFactory) => knownFactory(factory));
-		        });
-		        if (novelFactories.length) {
-		            const hasInjector = novelFactories.some((factory) => isInjectorPolicyFactory(factory));
-		            // if there are any left over, wrap in a requestPolicyFactoryPolicy
-		            return {
-		                wrappedPolicies: (0, core_http_compat_1.createRequestPolicyFactoryPolicy)(novelFactories),
-		                afterRetry: hasInjector,
-		            };
-		        }
-		    }
-		    return undefined;
-		}
-		function getCoreClientOptions(pipeline) {
-		    const { httpClient: v1Client, ...restOptions } = pipeline.options;
-		    let httpClient = pipeline._coreHttpClient;
-		    if (!httpClient) {
-		        httpClient = v1Client ? (0, core_http_compat_1.convertHttpClient)(v1Client) : (0, storage_common_1.getCachedDefaultHttpClient)();
-		        pipeline._coreHttpClient = httpClient;
-		    }
-		    let corePipeline = pipeline._corePipeline;
-		    if (!corePipeline) {
-		        const packageDetails = `azsdk-js-azure-storage-blob/${constants_js_1.SDK_VERSION}`;
-		        const userAgentPrefix = restOptions.userAgentOptions && restOptions.userAgentOptions.userAgentPrefix
-		            ? `${restOptions.userAgentOptions.userAgentPrefix} ${packageDetails}`
-		            : `${packageDetails}`;
-		        corePipeline = (0, core_client_1.createClientPipeline)({
-		            ...restOptions,
-		            loggingOptions: {
-		                additionalAllowedHeaderNames: constants_js_1.StorageBlobLoggingAllowedHeaderNames,
-		                additionalAllowedQueryParameters: constants_js_1.StorageBlobLoggingAllowedQueryParameters,
-		                logger: log_js_1.logger.info,
-		            },
-		            userAgentOptions: {
-		                userAgentPrefix,
-		            },
-		            serializationOptions: {
-		                stringifyXML: core_xml_1.stringifyXML,
-		                serializerOptions: {
-		                    xml: {
-		                        // Use customized XML char key of "#" so we can deserialize metadata
-		                        // with "_" key
-		                        xmlCharKey: "#",
-		                    },
-		                },
-		            },
-		            deserializationOptions: {
-		                parseXML: core_xml_1.parseXML,
-		                serializerOptions: {
-		                    xml: {
-		                        // Use customized XML char key of "#" so we can deserialize metadata
-		                        // with "_" key
-		                        xmlCharKey: "#",
-		                    },
-		                },
-		            },
-		        });
-		        corePipeline.removePolicy({ phase: "Retry" });
-		        corePipeline.removePolicy({ name: core_rest_pipeline_1.decompressResponsePolicyName });
-		        corePipeline.addPolicy((0, StorageCorrectContentLengthPolicy_js_1.storageCorrectContentLengthPolicy)());
-		        corePipeline.addPolicy((0, StorageRetryPolicyV2_js_1.storageRetryPolicy)(restOptions.retryOptions), { phase: "Retry" });
-		        corePipeline.addPolicy((0, storage_common_1.storageRequestFailureDetailsParserPolicy)());
-		        corePipeline.addPolicy((0, StorageBrowserPolicyV2_js_1.storageBrowserPolicy)());
-		        const downlevelResults = processDownlevelPipeline(pipeline);
-		        if (downlevelResults) {
-		            corePipeline.addPolicy(downlevelResults.wrappedPolicies, downlevelResults.afterRetry ? { afterPhase: "Retry" } : undefined);
-		        }
-		        const credential = getCredentialFromPipeline(pipeline);
-		        if ((0, core_auth_1.isTokenCredential)(credential)) {
-		            corePipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({
-		                credential,
-		                scopes: restOptions.audience ?? constants_js_1.StorageOAuthScopes,
-		                challengeCallbacks: { authorizeRequestOnChallenge: core_client_1.authorizeRequestOnTenantChallenge },
-		            }), { phase: "Sign" });
-		        }
-		        else if (credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) {
-		            corePipeline.addPolicy((0, StorageSharedKeyCredentialPolicyV2_js_1.storageSharedKeyCredentialPolicy)({
-		                accountName: credential.accountName,
-		                accountKey: credential.accountKey,
-		            }), { phase: "Sign" });
-		        }
-		        pipeline._corePipeline = corePipeline;
-		    }
-		    return {
-		        ...restOptions,
-		        allowInsecureConnection: true,
-		        httpClient,
-		        pipeline: corePipeline,
-		    };
-		}
-		function getCredentialFromPipeline(pipeline) {
-		    // see if we squirreled one away on the type itself
-		    if (pipeline._credential) {
-		        return pipeline._credential;
-		    }
-		    // if it came from another package, loop over the factories and look for one like before
-		    let credential = new AnonymousCredential_js_1.AnonymousCredential();
-		    for (const factory of pipeline.factories) {
-		        if ((0, core_auth_1.isTokenCredential)(factory.credential)) {
-		            // Only works if the factory has been attached a "credential" property.
-		            // We do that in newPipeline() when using TokenCredential.
-		            credential = factory.credential;
-		        }
-		        else if (isStorageSharedKeyCredential(factory)) {
-		            return factory;
-		        }
-		    }
-		    return credential;
-		}
-		function isStorageSharedKeyCredential(factory) {
-		    if (factory instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) {
-		        return true;
-		    }
-		    return factory.constructor.name === "StorageSharedKeyCredential";
-		}
-		function isAnonymousCredential(factory) {
-		    if (factory instanceof AnonymousCredential_js_1.AnonymousCredential) {
-		        return true;
-		    }
-		    return factory.constructor.name === "AnonymousCredential";
-		}
-		function isCoreHttpBearerTokenFactory(factory) {
-		    return (0, core_auth_1.isTokenCredential)(factory.credential);
-		}
-		function isStorageBrowserPolicyFactory(factory) {
-		    if (factory instanceof StorageBrowserPolicyFactory_js_1.StorageBrowserPolicyFactory) {
-		        return true;
-		    }
-		    return factory.constructor.name === "StorageBrowserPolicyFactory";
-		}
-		function isStorageRetryPolicyFactory(factory) {
-		    if (factory instanceof StorageRetryPolicyFactory_js_1.StorageRetryPolicyFactory) {
-		        return true;
-		    }
-		    return factory.constructor.name === "StorageRetryPolicyFactory";
-		}
-		function isStorageTelemetryPolicyFactory(factory) {
-		    return factory.constructor.name === "TelemetryPolicyFactory";
-		}
-		function isInjectorPolicyFactory(factory) {
-		    return factory.constructor.name === "InjectorPolicyFactory";
-		}
-		function isCoreHttpPolicyFactory(factory) {
-		    const knownPolicies = [
-		        "GenerateClientRequestIdPolicy",
-		        "TracingPolicy",
-		        "LogPolicy",
-		        "ProxyPolicy",
-		        "DisableResponseDecompressionPolicy",
-		        "KeepAlivePolicy",
-		        "DeserializationPolicy",
-		    ];
-		    const mockHttpClient = {
-		        sendRequest: async (request) => {
-		            return {
-		                request,
-		                headers: request.headers.clone(),
-		                status: 500,
-		            };
-		        },
-		    };
-		    const mockRequestPolicyOptions = {
-		        log(_logLevel, _message) {
-		            /* do nothing */
-		        },
-		        shouldLog(_logLevel) {
-		            return false;
-		        },
-		    };
-		    const policyInstance = factory.create(mockHttpClient, mockRequestPolicyOptions);
-		    const policyName = policyInstance.constructor.name;
-		    // bundlers sometimes add a custom suffix to the class name to make it unique
-		    return knownPolicies.some((knownPolicyName) => {
-		        return policyName.startsWith(knownPolicyName);
-		    });
-		}
-		
-	} (Pipeline));
-	return Pipeline;
-}
-
-var ContainerClient = {};
-
-var StorageClient = {};
-
-var StorageContextClient = {};
-
-var src$1 = {};
-
-var models$1 = {};
-
-var hasRequiredModels$1;
-
-function requireModels$1 () {
-	if (hasRequiredModels$1) return models$1;
-	hasRequiredModels$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(models$1, "__esModule", { value: true });
-	models$1.KnownStorageErrorCode = models$1.KnownBlobExpiryOptions = models$1.KnownFileShareTokenIntent = models$1.KnownEncryptionAlgorithmType = void 0;
-	/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */
-	var KnownEncryptionAlgorithmType;
-	(function (KnownEncryptionAlgorithmType) {
-	    /** AES256 */
-	    KnownEncryptionAlgorithmType["AES256"] = "AES256";
-	})(KnownEncryptionAlgorithmType || (models$1.KnownEncryptionAlgorithmType = KnownEncryptionAlgorithmType = {}));
-	/** Known values of {@link FileShareTokenIntent} that the service accepts. */
-	var KnownFileShareTokenIntent;
-	(function (KnownFileShareTokenIntent) {
-	    /** Backup */
-	    KnownFileShareTokenIntent["Backup"] = "backup";
-	})(KnownFileShareTokenIntent || (models$1.KnownFileShareTokenIntent = KnownFileShareTokenIntent = {}));
-	/** Known values of {@link BlobExpiryOptions} that the service accepts. */
-	var KnownBlobExpiryOptions;
-	(function (KnownBlobExpiryOptions) {
-	    /** NeverExpire */
-	    KnownBlobExpiryOptions["NeverExpire"] = "NeverExpire";
-	    /** RelativeToCreation */
-	    KnownBlobExpiryOptions["RelativeToCreation"] = "RelativeToCreation";
-	    /** RelativeToNow */
-	    KnownBlobExpiryOptions["RelativeToNow"] = "RelativeToNow";
-	    /** Absolute */
-	    KnownBlobExpiryOptions["Absolute"] = "Absolute";
-	})(KnownBlobExpiryOptions || (models$1.KnownBlobExpiryOptions = KnownBlobExpiryOptions = {}));
-	/** Known values of {@link StorageErrorCode} that the service accepts. */
-	var KnownStorageErrorCode;
-	(function (KnownStorageErrorCode) {
-	    /** AccountAlreadyExists */
-	    KnownStorageErrorCode["AccountAlreadyExists"] = "AccountAlreadyExists";
-	    /** AccountBeingCreated */
-	    KnownStorageErrorCode["AccountBeingCreated"] = "AccountBeingCreated";
-	    /** AccountIsDisabled */
-	    KnownStorageErrorCode["AccountIsDisabled"] = "AccountIsDisabled";
-	    /** AuthenticationFailed */
-	    KnownStorageErrorCode["AuthenticationFailed"] = "AuthenticationFailed";
-	    /** AuthorizationFailure */
-	    KnownStorageErrorCode["AuthorizationFailure"] = "AuthorizationFailure";
-	    /** ConditionHeadersNotSupported */
-	    KnownStorageErrorCode["ConditionHeadersNotSupported"] = "ConditionHeadersNotSupported";
-	    /** ConditionNotMet */
-	    KnownStorageErrorCode["ConditionNotMet"] = "ConditionNotMet";
-	    /** EmptyMetadataKey */
-	    KnownStorageErrorCode["EmptyMetadataKey"] = "EmptyMetadataKey";
-	    /** InsufficientAccountPermissions */
-	    KnownStorageErrorCode["InsufficientAccountPermissions"] = "InsufficientAccountPermissions";
-	    /** InternalError */
-	    KnownStorageErrorCode["InternalError"] = "InternalError";
-	    /** InvalidAuthenticationInfo */
-	    KnownStorageErrorCode["InvalidAuthenticationInfo"] = "InvalidAuthenticationInfo";
-	    /** InvalidHeaderValue */
-	    KnownStorageErrorCode["InvalidHeaderValue"] = "InvalidHeaderValue";
-	    /** InvalidHttpVerb */
-	    KnownStorageErrorCode["InvalidHttpVerb"] = "InvalidHttpVerb";
-	    /** InvalidInput */
-	    KnownStorageErrorCode["InvalidInput"] = "InvalidInput";
-	    /** InvalidMd5 */
-	    KnownStorageErrorCode["InvalidMd5"] = "InvalidMd5";
-	    /** InvalidMetadata */
-	    KnownStorageErrorCode["InvalidMetadata"] = "InvalidMetadata";
-	    /** InvalidQueryParameterValue */
-	    KnownStorageErrorCode["InvalidQueryParameterValue"] = "InvalidQueryParameterValue";
-	    /** InvalidRange */
-	    KnownStorageErrorCode["InvalidRange"] = "InvalidRange";
-	    /** InvalidResourceName */
-	    KnownStorageErrorCode["InvalidResourceName"] = "InvalidResourceName";
-	    /** InvalidUri */
-	    KnownStorageErrorCode["InvalidUri"] = "InvalidUri";
-	    /** InvalidXmlDocument */
-	    KnownStorageErrorCode["InvalidXmlDocument"] = "InvalidXmlDocument";
-	    /** InvalidXmlNodeValue */
-	    KnownStorageErrorCode["InvalidXmlNodeValue"] = "InvalidXmlNodeValue";
-	    /** Md5Mismatch */
-	    KnownStorageErrorCode["Md5Mismatch"] = "Md5Mismatch";
-	    /** MetadataTooLarge */
-	    KnownStorageErrorCode["MetadataTooLarge"] = "MetadataTooLarge";
-	    /** MissingContentLengthHeader */
-	    KnownStorageErrorCode["MissingContentLengthHeader"] = "MissingContentLengthHeader";
-	    /** MissingRequiredQueryParameter */
-	    KnownStorageErrorCode["MissingRequiredQueryParameter"] = "MissingRequiredQueryParameter";
-	    /** MissingRequiredHeader */
-	    KnownStorageErrorCode["MissingRequiredHeader"] = "MissingRequiredHeader";
-	    /** MissingRequiredXmlNode */
-	    KnownStorageErrorCode["MissingRequiredXmlNode"] = "MissingRequiredXmlNode";
-	    /** MultipleConditionHeadersNotSupported */
-	    KnownStorageErrorCode["MultipleConditionHeadersNotSupported"] = "MultipleConditionHeadersNotSupported";
-	    /** OperationTimedOut */
-	    KnownStorageErrorCode["OperationTimedOut"] = "OperationTimedOut";
-	    /** OutOfRangeInput */
-	    KnownStorageErrorCode["OutOfRangeInput"] = "OutOfRangeInput";
-	    /** OutOfRangeQueryParameterValue */
-	    KnownStorageErrorCode["OutOfRangeQueryParameterValue"] = "OutOfRangeQueryParameterValue";
-	    /** RequestBodyTooLarge */
-	    KnownStorageErrorCode["RequestBodyTooLarge"] = "RequestBodyTooLarge";
-	    /** ResourceTypeMismatch */
-	    KnownStorageErrorCode["ResourceTypeMismatch"] = "ResourceTypeMismatch";
-	    /** RequestUrlFailedToParse */
-	    KnownStorageErrorCode["RequestUrlFailedToParse"] = "RequestUrlFailedToParse";
-	    /** ResourceAlreadyExists */
-	    KnownStorageErrorCode["ResourceAlreadyExists"] = "ResourceAlreadyExists";
-	    /** ResourceNotFound */
-	    KnownStorageErrorCode["ResourceNotFound"] = "ResourceNotFound";
-	    /** ServerBusy */
-	    KnownStorageErrorCode["ServerBusy"] = "ServerBusy";
-	    /** UnsupportedHeader */
-	    KnownStorageErrorCode["UnsupportedHeader"] = "UnsupportedHeader";
-	    /** UnsupportedXmlNode */
-	    KnownStorageErrorCode["UnsupportedXmlNode"] = "UnsupportedXmlNode";
-	    /** UnsupportedQueryParameter */
-	    KnownStorageErrorCode["UnsupportedQueryParameter"] = "UnsupportedQueryParameter";
-	    /** UnsupportedHttpVerb */
-	    KnownStorageErrorCode["UnsupportedHttpVerb"] = "UnsupportedHttpVerb";
-	    /** AppendPositionConditionNotMet */
-	    KnownStorageErrorCode["AppendPositionConditionNotMet"] = "AppendPositionConditionNotMet";
-	    /** BlobAlreadyExists */
-	    KnownStorageErrorCode["BlobAlreadyExists"] = "BlobAlreadyExists";
-	    /** BlobImmutableDueToPolicy */
-	    KnownStorageErrorCode["BlobImmutableDueToPolicy"] = "BlobImmutableDueToPolicy";
-	    /** BlobNotFound */
-	    KnownStorageErrorCode["BlobNotFound"] = "BlobNotFound";
-	    /** BlobOverwritten */
-	    KnownStorageErrorCode["BlobOverwritten"] = "BlobOverwritten";
-	    /** BlobTierInadequateForContentLength */
-	    KnownStorageErrorCode["BlobTierInadequateForContentLength"] = "BlobTierInadequateForContentLength";
-	    /** BlobUsesCustomerSpecifiedEncryption */
-	    KnownStorageErrorCode["BlobUsesCustomerSpecifiedEncryption"] = "BlobUsesCustomerSpecifiedEncryption";
-	    /** BlockCountExceedsLimit */
-	    KnownStorageErrorCode["BlockCountExceedsLimit"] = "BlockCountExceedsLimit";
-	    /** BlockListTooLong */
-	    KnownStorageErrorCode["BlockListTooLong"] = "BlockListTooLong";
-	    /** CannotChangeToLowerTier */
-	    KnownStorageErrorCode["CannotChangeToLowerTier"] = "CannotChangeToLowerTier";
-	    /** CannotVerifyCopySource */
-	    KnownStorageErrorCode["CannotVerifyCopySource"] = "CannotVerifyCopySource";
-	    /** ContainerAlreadyExists */
-	    KnownStorageErrorCode["ContainerAlreadyExists"] = "ContainerAlreadyExists";
-	    /** ContainerBeingDeleted */
-	    KnownStorageErrorCode["ContainerBeingDeleted"] = "ContainerBeingDeleted";
-	    /** ContainerDisabled */
-	    KnownStorageErrorCode["ContainerDisabled"] = "ContainerDisabled";
-	    /** ContainerNotFound */
-	    KnownStorageErrorCode["ContainerNotFound"] = "ContainerNotFound";
-	    /** ContentLengthLargerThanTierLimit */
-	    KnownStorageErrorCode["ContentLengthLargerThanTierLimit"] = "ContentLengthLargerThanTierLimit";
-	    /** CopyAcrossAccountsNotSupported */
-	    KnownStorageErrorCode["CopyAcrossAccountsNotSupported"] = "CopyAcrossAccountsNotSupported";
-	    /** CopyIdMismatch */
-	    KnownStorageErrorCode["CopyIdMismatch"] = "CopyIdMismatch";
-	    /** FeatureVersionMismatch */
-	    KnownStorageErrorCode["FeatureVersionMismatch"] = "FeatureVersionMismatch";
-	    /** IncrementalCopyBlobMismatch */
-	    KnownStorageErrorCode["IncrementalCopyBlobMismatch"] = "IncrementalCopyBlobMismatch";
-	    /** IncrementalCopyOfEarlierVersionSnapshotNotAllowed */
-	    KnownStorageErrorCode["IncrementalCopyOfEarlierVersionSnapshotNotAllowed"] = "IncrementalCopyOfEarlierVersionSnapshotNotAllowed";
-	    /** IncrementalCopySourceMustBeSnapshot */
-	    KnownStorageErrorCode["IncrementalCopySourceMustBeSnapshot"] = "IncrementalCopySourceMustBeSnapshot";
-	    /** InfiniteLeaseDurationRequired */
-	    KnownStorageErrorCode["InfiniteLeaseDurationRequired"] = "InfiniteLeaseDurationRequired";
-	    /** InvalidBlobOrBlock */
-	    KnownStorageErrorCode["InvalidBlobOrBlock"] = "InvalidBlobOrBlock";
-	    /** InvalidBlobTier */
-	    KnownStorageErrorCode["InvalidBlobTier"] = "InvalidBlobTier";
-	    /** InvalidBlobType */
-	    KnownStorageErrorCode["InvalidBlobType"] = "InvalidBlobType";
-	    /** InvalidBlockId */
-	    KnownStorageErrorCode["InvalidBlockId"] = "InvalidBlockId";
-	    /** InvalidBlockList */
-	    KnownStorageErrorCode["InvalidBlockList"] = "InvalidBlockList";
-	    /** InvalidOperation */
-	    KnownStorageErrorCode["InvalidOperation"] = "InvalidOperation";
-	    /** InvalidPageRange */
-	    KnownStorageErrorCode["InvalidPageRange"] = "InvalidPageRange";
-	    /** InvalidSourceBlobType */
-	    KnownStorageErrorCode["InvalidSourceBlobType"] = "InvalidSourceBlobType";
-	    /** InvalidSourceBlobUrl */
-	    KnownStorageErrorCode["InvalidSourceBlobUrl"] = "InvalidSourceBlobUrl";
-	    /** InvalidVersionForPageBlobOperation */
-	    KnownStorageErrorCode["InvalidVersionForPageBlobOperation"] = "InvalidVersionForPageBlobOperation";
-	    /** LeaseAlreadyPresent */
-	    KnownStorageErrorCode["LeaseAlreadyPresent"] = "LeaseAlreadyPresent";
-	    /** LeaseAlreadyBroken */
-	    KnownStorageErrorCode["LeaseAlreadyBroken"] = "LeaseAlreadyBroken";
-	    /** LeaseIdMismatchWithBlobOperation */
-	    KnownStorageErrorCode["LeaseIdMismatchWithBlobOperation"] = "LeaseIdMismatchWithBlobOperation";
-	    /** LeaseIdMismatchWithContainerOperation */
-	    KnownStorageErrorCode["LeaseIdMismatchWithContainerOperation"] = "LeaseIdMismatchWithContainerOperation";
-	    /** LeaseIdMismatchWithLeaseOperation */
-	    KnownStorageErrorCode["LeaseIdMismatchWithLeaseOperation"] = "LeaseIdMismatchWithLeaseOperation";
-	    /** LeaseIdMissing */
-	    KnownStorageErrorCode["LeaseIdMissing"] = "LeaseIdMissing";
-	    /** LeaseIsBreakingAndCannotBeAcquired */
-	    KnownStorageErrorCode["LeaseIsBreakingAndCannotBeAcquired"] = "LeaseIsBreakingAndCannotBeAcquired";
-	    /** LeaseIsBreakingAndCannotBeChanged */
-	    KnownStorageErrorCode["LeaseIsBreakingAndCannotBeChanged"] = "LeaseIsBreakingAndCannotBeChanged";
-	    /** LeaseIsBrokenAndCannotBeRenewed */
-	    KnownStorageErrorCode["LeaseIsBrokenAndCannotBeRenewed"] = "LeaseIsBrokenAndCannotBeRenewed";
-	    /** LeaseLost */
-	    KnownStorageErrorCode["LeaseLost"] = "LeaseLost";
-	    /** LeaseNotPresentWithBlobOperation */
-	    KnownStorageErrorCode["LeaseNotPresentWithBlobOperation"] = "LeaseNotPresentWithBlobOperation";
-	    /** LeaseNotPresentWithContainerOperation */
-	    KnownStorageErrorCode["LeaseNotPresentWithContainerOperation"] = "LeaseNotPresentWithContainerOperation";
-	    /** LeaseNotPresentWithLeaseOperation */
-	    KnownStorageErrorCode["LeaseNotPresentWithLeaseOperation"] = "LeaseNotPresentWithLeaseOperation";
-	    /** MaxBlobSizeConditionNotMet */
-	    KnownStorageErrorCode["MaxBlobSizeConditionNotMet"] = "MaxBlobSizeConditionNotMet";
-	    /** NoAuthenticationInformation */
-	    KnownStorageErrorCode["NoAuthenticationInformation"] = "NoAuthenticationInformation";
-	    /** NoPendingCopyOperation */
-	    KnownStorageErrorCode["NoPendingCopyOperation"] = "NoPendingCopyOperation";
-	    /** OperationNotAllowedOnIncrementalCopyBlob */
-	    KnownStorageErrorCode["OperationNotAllowedOnIncrementalCopyBlob"] = "OperationNotAllowedOnIncrementalCopyBlob";
-	    /** PendingCopyOperation */
-	    KnownStorageErrorCode["PendingCopyOperation"] = "PendingCopyOperation";
-	    /** PreviousSnapshotCannotBeNewer */
-	    KnownStorageErrorCode["PreviousSnapshotCannotBeNewer"] = "PreviousSnapshotCannotBeNewer";
-	    /** PreviousSnapshotNotFound */
-	    KnownStorageErrorCode["PreviousSnapshotNotFound"] = "PreviousSnapshotNotFound";
-	    /** PreviousSnapshotOperationNotSupported */
-	    KnownStorageErrorCode["PreviousSnapshotOperationNotSupported"] = "PreviousSnapshotOperationNotSupported";
-	    /** SequenceNumberConditionNotMet */
-	    KnownStorageErrorCode["SequenceNumberConditionNotMet"] = "SequenceNumberConditionNotMet";
-	    /** SequenceNumberIncrementTooLarge */
-	    KnownStorageErrorCode["SequenceNumberIncrementTooLarge"] = "SequenceNumberIncrementTooLarge";
-	    /** SnapshotCountExceeded */
-	    KnownStorageErrorCode["SnapshotCountExceeded"] = "SnapshotCountExceeded";
-	    /** SnapshotOperationRateExceeded */
-	    KnownStorageErrorCode["SnapshotOperationRateExceeded"] = "SnapshotOperationRateExceeded";
-	    /** SnapshotsPresent */
-	    KnownStorageErrorCode["SnapshotsPresent"] = "SnapshotsPresent";
-	    /** SourceConditionNotMet */
-	    KnownStorageErrorCode["SourceConditionNotMet"] = "SourceConditionNotMet";
-	    /** SystemInUse */
-	    KnownStorageErrorCode["SystemInUse"] = "SystemInUse";
-	    /** TargetConditionNotMet */
-	    KnownStorageErrorCode["TargetConditionNotMet"] = "TargetConditionNotMet";
-	    /** UnauthorizedBlobOverwrite */
-	    KnownStorageErrorCode["UnauthorizedBlobOverwrite"] = "UnauthorizedBlobOverwrite";
-	    /** BlobBeingRehydrated */
-	    KnownStorageErrorCode["BlobBeingRehydrated"] = "BlobBeingRehydrated";
-	    /** BlobArchived */
-	    KnownStorageErrorCode["BlobArchived"] = "BlobArchived";
-	    /** BlobNotArchived */
-	    KnownStorageErrorCode["BlobNotArchived"] = "BlobNotArchived";
-	    /** AuthorizationSourceIPMismatch */
-	    KnownStorageErrorCode["AuthorizationSourceIPMismatch"] = "AuthorizationSourceIPMismatch";
-	    /** AuthorizationProtocolMismatch */
-	    KnownStorageErrorCode["AuthorizationProtocolMismatch"] = "AuthorizationProtocolMismatch";
-	    /** AuthorizationPermissionMismatch */
-	    KnownStorageErrorCode["AuthorizationPermissionMismatch"] = "AuthorizationPermissionMismatch";
-	    /** AuthorizationServiceMismatch */
-	    KnownStorageErrorCode["AuthorizationServiceMismatch"] = "AuthorizationServiceMismatch";
-	    /** AuthorizationResourceTypeMismatch */
-	    KnownStorageErrorCode["AuthorizationResourceTypeMismatch"] = "AuthorizationResourceTypeMismatch";
-	    /** BlobAccessTierNotSupportedForAccountType */
-	    KnownStorageErrorCode["BlobAccessTierNotSupportedForAccountType"] = "BlobAccessTierNotSupportedForAccountType";
-	})(KnownStorageErrorCode || (models$1.KnownStorageErrorCode = KnownStorageErrorCode = {}));
-	
-	return models$1;
-}
-
-var storageClient = {};
-
-var operations = {};
-
-var service$1 = {};
-
-var mappers = {};
-
-var hasRequiredMappers;
-
-function requireMappers () {
-	if (hasRequiredMappers) return mappers;
-	hasRequiredMappers = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(mappers, "__esModule", { value: true });
-	mappers.ServiceGetUserDelegationKeyHeaders = mappers.ServiceListContainersSegmentExceptionHeaders = mappers.ServiceListContainersSegmentHeaders = mappers.ServiceGetStatisticsExceptionHeaders = mappers.ServiceGetStatisticsHeaders = mappers.ServiceGetPropertiesExceptionHeaders = mappers.ServiceGetPropertiesHeaders = mappers.ServiceSetPropertiesExceptionHeaders = mappers.ServiceSetPropertiesHeaders = mappers.ArrowField = mappers.ArrowConfiguration = mappers.JsonTextConfiguration = mappers.DelimitedTextConfiguration = mappers.QueryFormat = mappers.QuerySerialization = mappers.QueryRequest = mappers.ClearRange = mappers.PageRange = mappers.PageList = mappers.Block = mappers.BlockList = mappers.BlockLookupList = mappers.BlobPrefix = mappers.BlobHierarchyListSegment = mappers.ListBlobsHierarchySegmentResponse = mappers.BlobPropertiesInternal = mappers.BlobName = mappers.BlobItemInternal = mappers.BlobFlatListSegment = mappers.ListBlobsFlatSegmentResponse = mappers.AccessPolicy = mappers.SignedIdentifier = mappers.BlobTag = mappers.BlobTags = mappers.FilterBlobItem = mappers.FilterBlobSegment = mappers.UserDelegationKey = mappers.KeyInfo = mappers.ContainerProperties = mappers.ContainerItem = mappers.ListContainersSegmentResponse = mappers.GeoReplication = mappers.BlobServiceStatistics = mappers.StorageError = mappers.StaticWebsite = mappers.CorsRule = mappers.Metrics = mappers.RetentionPolicy = mappers.Logging = mappers.BlobServiceProperties = void 0;
-	mappers.BlobUndeleteHeaders = mappers.BlobDeleteExceptionHeaders = mappers.BlobDeleteHeaders = mappers.BlobGetPropertiesExceptionHeaders = mappers.BlobGetPropertiesHeaders = mappers.BlobDownloadExceptionHeaders = mappers.BlobDownloadHeaders = mappers.ContainerGetAccountInfoExceptionHeaders = mappers.ContainerGetAccountInfoHeaders = mappers.ContainerListBlobHierarchySegmentExceptionHeaders = mappers.ContainerListBlobHierarchySegmentHeaders = mappers.ContainerListBlobFlatSegmentExceptionHeaders = mappers.ContainerListBlobFlatSegmentHeaders = mappers.ContainerChangeLeaseExceptionHeaders = mappers.ContainerChangeLeaseHeaders = mappers.ContainerBreakLeaseExceptionHeaders = mappers.ContainerBreakLeaseHeaders = mappers.ContainerRenewLeaseExceptionHeaders = mappers.ContainerRenewLeaseHeaders = mappers.ContainerReleaseLeaseExceptionHeaders = mappers.ContainerReleaseLeaseHeaders = mappers.ContainerAcquireLeaseExceptionHeaders = mappers.ContainerAcquireLeaseHeaders = mappers.ContainerFilterBlobsExceptionHeaders = mappers.ContainerFilterBlobsHeaders = mappers.ContainerSubmitBatchExceptionHeaders = mappers.ContainerSubmitBatchHeaders = mappers.ContainerRenameExceptionHeaders = mappers.ContainerRenameHeaders = mappers.ContainerRestoreExceptionHeaders = mappers.ContainerRestoreHeaders = mappers.ContainerSetAccessPolicyExceptionHeaders = mappers.ContainerSetAccessPolicyHeaders = mappers.ContainerGetAccessPolicyExceptionHeaders = mappers.ContainerGetAccessPolicyHeaders = mappers.ContainerSetMetadataExceptionHeaders = mappers.ContainerSetMetadataHeaders = mappers.ContainerDeleteExceptionHeaders = mappers.ContainerDeleteHeaders = mappers.ContainerGetPropertiesExceptionHeaders = mappers.ContainerGetPropertiesHeaders = mappers.ContainerCreateExceptionHeaders = mappers.ContainerCreateHeaders = mappers.ServiceFilterBlobsExceptionHeaders = mappers.ServiceFilterBlobsHeaders = mappers.ServiceSubmitBatchExceptionHeaders = mappers.ServiceSubmitBatchHeaders = mappers.ServiceGetAccountInfoExceptionHeaders = mappers.ServiceGetAccountInfoHeaders = mappers.ServiceGetUserDelegationKeyExceptionHeaders = void 0;
-	mappers.PageBlobGetPageRangesHeaders = mappers.PageBlobUploadPagesFromURLExceptionHeaders = mappers.PageBlobUploadPagesFromURLHeaders = mappers.PageBlobClearPagesExceptionHeaders = mappers.PageBlobClearPagesHeaders = mappers.PageBlobUploadPagesExceptionHeaders = mappers.PageBlobUploadPagesHeaders = mappers.PageBlobCreateExceptionHeaders = mappers.PageBlobCreateHeaders = mappers.BlobSetTagsExceptionHeaders = mappers.BlobSetTagsHeaders = mappers.BlobGetTagsExceptionHeaders = mappers.BlobGetTagsHeaders = mappers.BlobQueryExceptionHeaders = mappers.BlobQueryHeaders = mappers.BlobGetAccountInfoExceptionHeaders = mappers.BlobGetAccountInfoHeaders = mappers.BlobSetTierExceptionHeaders = mappers.BlobSetTierHeaders = mappers.BlobAbortCopyFromURLExceptionHeaders = mappers.BlobAbortCopyFromURLHeaders = mappers.BlobCopyFromURLExceptionHeaders = mappers.BlobCopyFromURLHeaders = mappers.BlobStartCopyFromURLExceptionHeaders = mappers.BlobStartCopyFromURLHeaders = mappers.BlobCreateSnapshotExceptionHeaders = mappers.BlobCreateSnapshotHeaders = mappers.BlobBreakLeaseExceptionHeaders = mappers.BlobBreakLeaseHeaders = mappers.BlobChangeLeaseExceptionHeaders = mappers.BlobChangeLeaseHeaders = mappers.BlobRenewLeaseExceptionHeaders = mappers.BlobRenewLeaseHeaders = mappers.BlobReleaseLeaseExceptionHeaders = mappers.BlobReleaseLeaseHeaders = mappers.BlobAcquireLeaseExceptionHeaders = mappers.BlobAcquireLeaseHeaders = mappers.BlobSetMetadataExceptionHeaders = mappers.BlobSetMetadataHeaders = mappers.BlobSetLegalHoldExceptionHeaders = mappers.BlobSetLegalHoldHeaders = mappers.BlobDeleteImmutabilityPolicyExceptionHeaders = mappers.BlobDeleteImmutabilityPolicyHeaders = mappers.BlobSetImmutabilityPolicyExceptionHeaders = mappers.BlobSetImmutabilityPolicyHeaders = mappers.BlobSetHttpHeadersExceptionHeaders = mappers.BlobSetHttpHeadersHeaders = mappers.BlobSetExpiryExceptionHeaders = mappers.BlobSetExpiryHeaders = mappers.BlobUndeleteExceptionHeaders = void 0;
-	mappers.BlockBlobGetBlockListExceptionHeaders = mappers.BlockBlobGetBlockListHeaders = mappers.BlockBlobCommitBlockListExceptionHeaders = mappers.BlockBlobCommitBlockListHeaders = mappers.BlockBlobStageBlockFromURLExceptionHeaders = mappers.BlockBlobStageBlockFromURLHeaders = mappers.BlockBlobStageBlockExceptionHeaders = mappers.BlockBlobStageBlockHeaders = mappers.BlockBlobPutBlobFromUrlExceptionHeaders = mappers.BlockBlobPutBlobFromUrlHeaders = mappers.BlockBlobUploadExceptionHeaders = mappers.BlockBlobUploadHeaders = mappers.AppendBlobSealExceptionHeaders = mappers.AppendBlobSealHeaders = mappers.AppendBlobAppendBlockFromUrlExceptionHeaders = mappers.AppendBlobAppendBlockFromUrlHeaders = mappers.AppendBlobAppendBlockExceptionHeaders = mappers.AppendBlobAppendBlockHeaders = mappers.AppendBlobCreateExceptionHeaders = mappers.AppendBlobCreateHeaders = mappers.PageBlobCopyIncrementalExceptionHeaders = mappers.PageBlobCopyIncrementalHeaders = mappers.PageBlobUpdateSequenceNumberExceptionHeaders = mappers.PageBlobUpdateSequenceNumberHeaders = mappers.PageBlobResizeExceptionHeaders = mappers.PageBlobResizeHeaders = mappers.PageBlobGetPageRangesDiffExceptionHeaders = mappers.PageBlobGetPageRangesDiffHeaders = mappers.PageBlobGetPageRangesExceptionHeaders = void 0;
-	mappers.BlobServiceProperties = {
-	    serializedName: "BlobServiceProperties",
-	    xmlName: "StorageServiceProperties",
-	    type: {
-	        name: "Composite",
-	        className: "BlobServiceProperties",
-	        modelProperties: {
-	            blobAnalyticsLogging: {
-	                serializedName: "Logging",
-	                xmlName: "Logging",
-	                type: {
-	                    name: "Composite",
-	                    className: "Logging",
-	                },
-	            },
-	            hourMetrics: {
-	                serializedName: "HourMetrics",
-	                xmlName: "HourMetrics",
-	                type: {
-	                    name: "Composite",
-	                    className: "Metrics",
-	                },
-	            },
-	            minuteMetrics: {
-	                serializedName: "MinuteMetrics",
-	                xmlName: "MinuteMetrics",
-	                type: {
-	                    name: "Composite",
-	                    className: "Metrics",
-	                },
-	            },
-	            cors: {
-	                serializedName: "Cors",
-	                xmlName: "Cors",
-	                xmlIsWrapped: true,
-	                xmlElementName: "CorsRule",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "CorsRule",
-	                        },
-	                    },
-	                },
-	            },
-	            defaultServiceVersion: {
-	                serializedName: "DefaultServiceVersion",
-	                xmlName: "DefaultServiceVersion",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            deleteRetentionPolicy: {
-	                serializedName: "DeleteRetentionPolicy",
-	                xmlName: "DeleteRetentionPolicy",
-	                type: {
-	                    name: "Composite",
-	                    className: "RetentionPolicy",
-	                },
-	            },
-	            staticWebsite: {
-	                serializedName: "StaticWebsite",
-	                xmlName: "StaticWebsite",
-	                type: {
-	                    name: "Composite",
-	                    className: "StaticWebsite",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.Logging = {
-	    serializedName: "Logging",
-	    type: {
-	        name: "Composite",
-	        className: "Logging",
-	        modelProperties: {
-	            version: {
-	                serializedName: "Version",
-	                required: true,
-	                xmlName: "Version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            deleteProperty: {
-	                serializedName: "Delete",
-	                required: true,
-	                xmlName: "Delete",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            read: {
-	                serializedName: "Read",
-	                required: true,
-	                xmlName: "Read",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            write: {
-	                serializedName: "Write",
-	                required: true,
-	                xmlName: "Write",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            retentionPolicy: {
-	                serializedName: "RetentionPolicy",
-	                xmlName: "RetentionPolicy",
-	                type: {
-	                    name: "Composite",
-	                    className: "RetentionPolicy",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.RetentionPolicy = {
-	    serializedName: "RetentionPolicy",
-	    type: {
-	        name: "Composite",
-	        className: "RetentionPolicy",
-	        modelProperties: {
-	            enabled: {
-	                serializedName: "Enabled",
-	                required: true,
-	                xmlName: "Enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            days: {
-	                constraints: {
-	                    InclusiveMinimum: 1,
-	                },
-	                serializedName: "Days",
-	                xmlName: "Days",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.Metrics = {
-	    serializedName: "Metrics",
-	    type: {
-	        name: "Composite",
-	        className: "Metrics",
-	        modelProperties: {
-	            version: {
-	                serializedName: "Version",
-	                xmlName: "Version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            enabled: {
-	                serializedName: "Enabled",
-	                required: true,
-	                xmlName: "Enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            includeAPIs: {
-	                serializedName: "IncludeAPIs",
-	                xmlName: "IncludeAPIs",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            retentionPolicy: {
-	                serializedName: "RetentionPolicy",
-	                xmlName: "RetentionPolicy",
-	                type: {
-	                    name: "Composite",
-	                    className: "RetentionPolicy",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.CorsRule = {
-	    serializedName: "CorsRule",
-	    type: {
-	        name: "Composite",
-	        className: "CorsRule",
-	        modelProperties: {
-	            allowedOrigins: {
-	                serializedName: "AllowedOrigins",
-	                required: true,
-	                xmlName: "AllowedOrigins",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            allowedMethods: {
-	                serializedName: "AllowedMethods",
-	                required: true,
-	                xmlName: "AllowedMethods",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            allowedHeaders: {
-	                serializedName: "AllowedHeaders",
-	                required: true,
-	                xmlName: "AllowedHeaders",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            exposedHeaders: {
-	                serializedName: "ExposedHeaders",
-	                required: true,
-	                xmlName: "ExposedHeaders",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            maxAgeInSeconds: {
-	                constraints: {
-	                    InclusiveMinimum: 0,
-	                },
-	                serializedName: "MaxAgeInSeconds",
-	                required: true,
-	                xmlName: "MaxAgeInSeconds",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.StaticWebsite = {
-	    serializedName: "StaticWebsite",
-	    type: {
-	        name: "Composite",
-	        className: "StaticWebsite",
-	        modelProperties: {
-	            enabled: {
-	                serializedName: "Enabled",
-	                required: true,
-	                xmlName: "Enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            indexDocument: {
-	                serializedName: "IndexDocument",
-	                xmlName: "IndexDocument",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorDocument404Path: {
-	                serializedName: "ErrorDocument404Path",
-	                xmlName: "ErrorDocument404Path",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            defaultIndexDocumentPath: {
-	                serializedName: "DefaultIndexDocumentPath",
-	                xmlName: "DefaultIndexDocumentPath",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.StorageError = {
-	    serializedName: "StorageError",
-	    type: {
-	        name: "Composite",
-	        className: "StorageError",
-	        modelProperties: {
-	            message: {
-	                serializedName: "Message",
-	                xmlName: "Message",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "CopySourceStatusCode",
-	                xmlName: "CopySourceStatusCode",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "CopySourceErrorCode",
-	                xmlName: "CopySourceErrorCode",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorMessage: {
-	                serializedName: "CopySourceErrorMessage",
-	                xmlName: "CopySourceErrorMessage",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            code: {
-	                serializedName: "Code",
-	                xmlName: "Code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            authenticationErrorDetail: {
-	                serializedName: "AuthenticationErrorDetail",
-	                xmlName: "AuthenticationErrorDetail",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobServiceStatistics = {
-	    serializedName: "BlobServiceStatistics",
-	    xmlName: "StorageServiceStats",
-	    type: {
-	        name: "Composite",
-	        className: "BlobServiceStatistics",
-	        modelProperties: {
-	            geoReplication: {
-	                serializedName: "GeoReplication",
-	                xmlName: "GeoReplication",
-	                type: {
-	                    name: "Composite",
-	                    className: "GeoReplication",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.GeoReplication = {
-	    serializedName: "GeoReplication",
-	    type: {
-	        name: "Composite",
-	        className: "GeoReplication",
-	        modelProperties: {
-	            status: {
-	                serializedName: "Status",
-	                required: true,
-	                xmlName: "Status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["live", "bootstrap", "unavailable"],
-	                },
-	            },
-	            lastSyncOn: {
-	                serializedName: "LastSyncTime",
-	                required: true,
-	                xmlName: "LastSyncTime",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ListContainersSegmentResponse = {
-	    serializedName: "ListContainersSegmentResponse",
-	    xmlName: "EnumerationResults",
-	    type: {
-	        name: "Composite",
-	        className: "ListContainersSegmentResponse",
-	        modelProperties: {
-	            serviceEndpoint: {
-	                serializedName: "ServiceEndpoint",
-	                required: true,
-	                xmlName: "ServiceEndpoint",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            prefix: {
-	                serializedName: "Prefix",
-	                xmlName: "Prefix",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            marker: {
-	                serializedName: "Marker",
-	                xmlName: "Marker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            maxPageSize: {
-	                serializedName: "MaxResults",
-	                xmlName: "MaxResults",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            containerItems: {
-	                serializedName: "ContainerItems",
-	                required: true,
-	                xmlName: "Containers",
-	                xmlIsWrapped: true,
-	                xmlElementName: "Container",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "ContainerItem",
-	                        },
-	                    },
-	                },
-	            },
-	            continuationToken: {
-	                serializedName: "NextMarker",
-	                xmlName: "NextMarker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerItem = {
-	    serializedName: "ContainerItem",
-	    xmlName: "Container",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerItem",
-	        modelProperties: {
-	            name: {
-	                serializedName: "Name",
-	                required: true,
-	                xmlName: "Name",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            deleted: {
-	                serializedName: "Deleted",
-	                xmlName: "Deleted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            version: {
-	                serializedName: "Version",
-	                xmlName: "Version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            properties: {
-	                serializedName: "Properties",
-	                xmlName: "Properties",
-	                type: {
-	                    name: "Composite",
-	                    className: "ContainerProperties",
-	                },
-	            },
-	            metadata: {
-	                serializedName: "Metadata",
-	                xmlName: "Metadata",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerProperties = {
-	    serializedName: "ContainerProperties",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerProperties",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "Last-Modified",
-	                required: true,
-	                xmlName: "Last-Modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            etag: {
-	                serializedName: "Etag",
-	                required: true,
-	                xmlName: "Etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            leaseStatus: {
-	                serializedName: "LeaseStatus",
-	                xmlName: "LeaseStatus",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["locked", "unlocked"],
-	                },
-	            },
-	            leaseState: {
-	                serializedName: "LeaseState",
-	                xmlName: "LeaseState",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "available",
-	                        "leased",
-	                        "expired",
-	                        "breaking",
-	                        "broken",
-	                    ],
-	                },
-	            },
-	            leaseDuration: {
-	                serializedName: "LeaseDuration",
-	                xmlName: "LeaseDuration",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["infinite", "fixed"],
-	                },
-	            },
-	            publicAccess: {
-	                serializedName: "PublicAccess",
-	                xmlName: "PublicAccess",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["container", "blob"],
-	                },
-	            },
-	            hasImmutabilityPolicy: {
-	                serializedName: "HasImmutabilityPolicy",
-	                xmlName: "HasImmutabilityPolicy",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            hasLegalHold: {
-	                serializedName: "HasLegalHold",
-	                xmlName: "HasLegalHold",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            defaultEncryptionScope: {
-	                serializedName: "DefaultEncryptionScope",
-	                xmlName: "DefaultEncryptionScope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            preventEncryptionScopeOverride: {
-	                serializedName: "DenyEncryptionScopeOverride",
-	                xmlName: "DenyEncryptionScopeOverride",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            deletedOn: {
-	                serializedName: "DeletedTime",
-	                xmlName: "DeletedTime",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            remainingRetentionDays: {
-	                serializedName: "RemainingRetentionDays",
-	                xmlName: "RemainingRetentionDays",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            isImmutableStorageWithVersioningEnabled: {
-	                serializedName: "ImmutableStorageWithVersioningEnabled",
-	                xmlName: "ImmutableStorageWithVersioningEnabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.KeyInfo = {
-	    serializedName: "KeyInfo",
-	    type: {
-	        name: "Composite",
-	        className: "KeyInfo",
-	        modelProperties: {
-	            startsOn: {
-	                serializedName: "Start",
-	                required: true,
-	                xmlName: "Start",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            expiresOn: {
-	                serializedName: "Expiry",
-	                required: true,
-	                xmlName: "Expiry",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.UserDelegationKey = {
-	    serializedName: "UserDelegationKey",
-	    type: {
-	        name: "Composite",
-	        className: "UserDelegationKey",
-	        modelProperties: {
-	            signedObjectId: {
-	                serializedName: "SignedOid",
-	                required: true,
-	                xmlName: "SignedOid",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            signedTenantId: {
-	                serializedName: "SignedTid",
-	                required: true,
-	                xmlName: "SignedTid",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            signedStartsOn: {
-	                serializedName: "SignedStart",
-	                required: true,
-	                xmlName: "SignedStart",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            signedExpiresOn: {
-	                serializedName: "SignedExpiry",
-	                required: true,
-	                xmlName: "SignedExpiry",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            signedService: {
-	                serializedName: "SignedService",
-	                required: true,
-	                xmlName: "SignedService",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            signedVersion: {
-	                serializedName: "SignedVersion",
-	                required: true,
-	                xmlName: "SignedVersion",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            value: {
-	                serializedName: "Value",
-	                required: true,
-	                xmlName: "Value",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.FilterBlobSegment = {
-	    serializedName: "FilterBlobSegment",
-	    xmlName: "EnumerationResults",
-	    type: {
-	        name: "Composite",
-	        className: "FilterBlobSegment",
-	        modelProperties: {
-	            serviceEndpoint: {
-	                serializedName: "ServiceEndpoint",
-	                required: true,
-	                xmlName: "ServiceEndpoint",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            where: {
-	                serializedName: "Where",
-	                required: true,
-	                xmlName: "Where",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobs: {
-	                serializedName: "Blobs",
-	                required: true,
-	                xmlName: "Blobs",
-	                xmlIsWrapped: true,
-	                xmlElementName: "Blob",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "FilterBlobItem",
-	                        },
-	                    },
-	                },
-	            },
-	            continuationToken: {
-	                serializedName: "NextMarker",
-	                xmlName: "NextMarker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.FilterBlobItem = {
-	    serializedName: "FilterBlobItem",
-	    xmlName: "Blob",
-	    type: {
-	        name: "Composite",
-	        className: "FilterBlobItem",
-	        modelProperties: {
-	            name: {
-	                serializedName: "Name",
-	                required: true,
-	                xmlName: "Name",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            containerName: {
-	                serializedName: "ContainerName",
-	                required: true,
-	                xmlName: "ContainerName",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            tags: {
-	                serializedName: "Tags",
-	                xmlName: "Tags",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobTags",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobTags = {
-	    serializedName: "BlobTags",
-	    xmlName: "Tags",
-	    type: {
-	        name: "Composite",
-	        className: "BlobTags",
-	        modelProperties: {
-	            blobTagSet: {
-	                serializedName: "BlobTagSet",
-	                required: true,
-	                xmlName: "TagSet",
-	                xmlIsWrapped: true,
-	                xmlElementName: "Tag",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "BlobTag",
-	                        },
-	                    },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobTag = {
-	    serializedName: "BlobTag",
-	    xmlName: "Tag",
-	    type: {
-	        name: "Composite",
-	        className: "BlobTag",
-	        modelProperties: {
-	            key: {
-	                serializedName: "Key",
-	                required: true,
-	                xmlName: "Key",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            value: {
-	                serializedName: "Value",
-	                required: true,
-	                xmlName: "Value",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.SignedIdentifier = {
-	    serializedName: "SignedIdentifier",
-	    xmlName: "SignedIdentifier",
-	    type: {
-	        name: "Composite",
-	        className: "SignedIdentifier",
-	        modelProperties: {
-	            id: {
-	                serializedName: "Id",
-	                required: true,
-	                xmlName: "Id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            accessPolicy: {
-	                serializedName: "AccessPolicy",
-	                xmlName: "AccessPolicy",
-	                type: {
-	                    name: "Composite",
-	                    className: "AccessPolicy",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AccessPolicy = {
-	    serializedName: "AccessPolicy",
-	    type: {
-	        name: "Composite",
-	        className: "AccessPolicy",
-	        modelProperties: {
-	            startsOn: {
-	                serializedName: "Start",
-	                xmlName: "Start",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            expiresOn: {
-	                serializedName: "Expiry",
-	                xmlName: "Expiry",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            permissions: {
-	                serializedName: "Permission",
-	                xmlName: "Permission",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ListBlobsFlatSegmentResponse = {
-	    serializedName: "ListBlobsFlatSegmentResponse",
-	    xmlName: "EnumerationResults",
-	    type: {
-	        name: "Composite",
-	        className: "ListBlobsFlatSegmentResponse",
-	        modelProperties: {
-	            serviceEndpoint: {
-	                serializedName: "ServiceEndpoint",
-	                required: true,
-	                xmlName: "ServiceEndpoint",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            containerName: {
-	                serializedName: "ContainerName",
-	                required: true,
-	                xmlName: "ContainerName",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            prefix: {
-	                serializedName: "Prefix",
-	                xmlName: "Prefix",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            marker: {
-	                serializedName: "Marker",
-	                xmlName: "Marker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            maxPageSize: {
-	                serializedName: "MaxResults",
-	                xmlName: "MaxResults",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            segment: {
-	                serializedName: "Segment",
-	                xmlName: "Blobs",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobFlatListSegment",
-	                },
-	            },
-	            continuationToken: {
-	                serializedName: "NextMarker",
-	                xmlName: "NextMarker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobFlatListSegment = {
-	    serializedName: "BlobFlatListSegment",
-	    xmlName: "Blobs",
-	    type: {
-	        name: "Composite",
-	        className: "BlobFlatListSegment",
-	        modelProperties: {
-	            blobItems: {
-	                serializedName: "BlobItems",
-	                required: true,
-	                xmlName: "BlobItems",
-	                xmlElementName: "Blob",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "BlobItemInternal",
-	                        },
-	                    },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobItemInternal = {
-	    serializedName: "BlobItemInternal",
-	    xmlName: "Blob",
-	    type: {
-	        name: "Composite",
-	        className: "BlobItemInternal",
-	        modelProperties: {
-	            name: {
-	                serializedName: "Name",
-	                xmlName: "Name",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobName",
-	                },
-	            },
-	            deleted: {
-	                serializedName: "Deleted",
-	                required: true,
-	                xmlName: "Deleted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            snapshot: {
-	                serializedName: "Snapshot",
-	                required: true,
-	                xmlName: "Snapshot",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "VersionId",
-	                xmlName: "VersionId",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            isCurrentVersion: {
-	                serializedName: "IsCurrentVersion",
-	                xmlName: "IsCurrentVersion",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            properties: {
-	                serializedName: "Properties",
-	                xmlName: "Properties",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobPropertiesInternal",
-	                },
-	            },
-	            metadata: {
-	                serializedName: "Metadata",
-	                xmlName: "Metadata",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            blobTags: {
-	                serializedName: "BlobTags",
-	                xmlName: "Tags",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobTags",
-	                },
-	            },
-	            objectReplicationMetadata: {
-	                serializedName: "ObjectReplicationMetadata",
-	                xmlName: "OrMetadata",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            hasVersionsOnly: {
-	                serializedName: "HasVersionsOnly",
-	                xmlName: "HasVersionsOnly",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobName = {
-	    serializedName: "BlobName",
-	    type: {
-	        name: "Composite",
-	        className: "BlobName",
-	        modelProperties: {
-	            encoded: {
-	                serializedName: "Encoded",
-	                xmlName: "Encoded",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            content: {
-	                serializedName: "content",
-	                xmlName: "content",
-	                xmlIsMsText: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobPropertiesInternal = {
-	    serializedName: "BlobPropertiesInternal",
-	    xmlName: "Properties",
-	    type: {
-	        name: "Composite",
-	        className: "BlobPropertiesInternal",
-	        modelProperties: {
-	            createdOn: {
-	                serializedName: "Creation-Time",
-	                xmlName: "Creation-Time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "Last-Modified",
-	                required: true,
-	                xmlName: "Last-Modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            etag: {
-	                serializedName: "Etag",
-	                required: true,
-	                xmlName: "Etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentLength: {
-	                serializedName: "Content-Length",
-	                xmlName: "Content-Length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            contentType: {
-	                serializedName: "Content-Type",
-	                xmlName: "Content-Type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentEncoding: {
-	                serializedName: "Content-Encoding",
-	                xmlName: "Content-Encoding",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentLanguage: {
-	                serializedName: "Content-Language",
-	                xmlName: "Content-Language",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "Content-MD5",
-	                xmlName: "Content-MD5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            contentDisposition: {
-	                serializedName: "Content-Disposition",
-	                xmlName: "Content-Disposition",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            cacheControl: {
-	                serializedName: "Cache-Control",
-	                xmlName: "Cache-Control",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            blobType: {
-	                serializedName: "BlobType",
-	                xmlName: "BlobType",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
-	                },
-	            },
-	            leaseStatus: {
-	                serializedName: "LeaseStatus",
-	                xmlName: "LeaseStatus",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["locked", "unlocked"],
-	                },
-	            },
-	            leaseState: {
-	                serializedName: "LeaseState",
-	                xmlName: "LeaseState",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "available",
-	                        "leased",
-	                        "expired",
-	                        "breaking",
-	                        "broken",
-	                    ],
-	                },
-	            },
-	            leaseDuration: {
-	                serializedName: "LeaseDuration",
-	                xmlName: "LeaseDuration",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["infinite", "fixed"],
-	                },
-	            },
-	            copyId: {
-	                serializedName: "CopyId",
-	                xmlName: "CopyId",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                serializedName: "CopyStatus",
-	                xmlName: "CopyStatus",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["pending", "success", "aborted", "failed"],
-	                },
-	            },
-	            copySource: {
-	                serializedName: "CopySource",
-	                xmlName: "CopySource",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyProgress: {
-	                serializedName: "CopyProgress",
-	                xmlName: "CopyProgress",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyCompletedOn: {
-	                serializedName: "CopyCompletionTime",
-	                xmlName: "CopyCompletionTime",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyStatusDescription: {
-	                serializedName: "CopyStatusDescription",
-	                xmlName: "CopyStatusDescription",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            serverEncrypted: {
-	                serializedName: "ServerEncrypted",
-	                xmlName: "ServerEncrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            incrementalCopy: {
-	                serializedName: "IncrementalCopy",
-	                xmlName: "IncrementalCopy",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            destinationSnapshot: {
-	                serializedName: "DestinationSnapshot",
-	                xmlName: "DestinationSnapshot",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            deletedOn: {
-	                serializedName: "DeletedTime",
-	                xmlName: "DeletedTime",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            remainingRetentionDays: {
-	                serializedName: "RemainingRetentionDays",
-	                xmlName: "RemainingRetentionDays",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            accessTier: {
-	                serializedName: "AccessTier",
-	                xmlName: "AccessTier",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "P4",
-	                        "P6",
-	                        "P10",
-	                        "P15",
-	                        "P20",
-	                        "P30",
-	                        "P40",
-	                        "P50",
-	                        "P60",
-	                        "P70",
-	                        "P80",
-	                        "Hot",
-	                        "Cool",
-	                        "Archive",
-	                        "Cold",
-	                    ],
-	                },
-	            },
-	            accessTierInferred: {
-	                serializedName: "AccessTierInferred",
-	                xmlName: "AccessTierInferred",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            archiveStatus: {
-	                serializedName: "ArchiveStatus",
-	                xmlName: "ArchiveStatus",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "rehydrate-pending-to-hot",
-	                        "rehydrate-pending-to-cool",
-	                        "rehydrate-pending-to-cold",
-	                    ],
-	                },
-	            },
-	            customerProvidedKeySha256: {
-	                serializedName: "CustomerProvidedKeySha256",
-	                xmlName: "CustomerProvidedKeySha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "EncryptionScope",
-	                xmlName: "EncryptionScope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            accessTierChangedOn: {
-	                serializedName: "AccessTierChangeTime",
-	                xmlName: "AccessTierChangeTime",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            tagCount: {
-	                serializedName: "TagCount",
-	                xmlName: "TagCount",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            expiresOn: {
-	                serializedName: "Expiry-Time",
-	                xmlName: "Expiry-Time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isSealed: {
-	                serializedName: "Sealed",
-	                xmlName: "Sealed",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            rehydratePriority: {
-	                serializedName: "RehydratePriority",
-	                xmlName: "RehydratePriority",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["High", "Standard"],
-	                },
-	            },
-	            lastAccessedOn: {
-	                serializedName: "LastAccessTime",
-	                xmlName: "LastAccessTime",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyExpiresOn: {
-	                serializedName: "ImmutabilityPolicyUntilDate",
-	                xmlName: "ImmutabilityPolicyUntilDate",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyMode: {
-	                serializedName: "ImmutabilityPolicyMode",
-	                xmlName: "ImmutabilityPolicyMode",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
-	                },
-	            },
-	            legalHold: {
-	                serializedName: "LegalHold",
-	                xmlName: "LegalHold",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ListBlobsHierarchySegmentResponse = {
-	    serializedName: "ListBlobsHierarchySegmentResponse",
-	    xmlName: "EnumerationResults",
-	    type: {
-	        name: "Composite",
-	        className: "ListBlobsHierarchySegmentResponse",
-	        modelProperties: {
-	            serviceEndpoint: {
-	                serializedName: "ServiceEndpoint",
-	                required: true,
-	                xmlName: "ServiceEndpoint",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            containerName: {
-	                serializedName: "ContainerName",
-	                required: true,
-	                xmlName: "ContainerName",
-	                xmlIsAttribute: true,
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            prefix: {
-	                serializedName: "Prefix",
-	                xmlName: "Prefix",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            marker: {
-	                serializedName: "Marker",
-	                xmlName: "Marker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            maxPageSize: {
-	                serializedName: "MaxResults",
-	                xmlName: "MaxResults",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            delimiter: {
-	                serializedName: "Delimiter",
-	                xmlName: "Delimiter",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            segment: {
-	                serializedName: "Segment",
-	                xmlName: "Blobs",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobHierarchyListSegment",
-	                },
-	            },
-	            continuationToken: {
-	                serializedName: "NextMarker",
-	                xmlName: "NextMarker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobHierarchyListSegment = {
-	    serializedName: "BlobHierarchyListSegment",
-	    xmlName: "Blobs",
-	    type: {
-	        name: "Composite",
-	        className: "BlobHierarchyListSegment",
-	        modelProperties: {
-	            blobPrefixes: {
-	                serializedName: "BlobPrefixes",
-	                xmlName: "BlobPrefixes",
-	                xmlElementName: "BlobPrefix",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "BlobPrefix",
-	                        },
-	                    },
-	                },
-	            },
-	            blobItems: {
-	                serializedName: "BlobItems",
-	                required: true,
-	                xmlName: "BlobItems",
-	                xmlElementName: "Blob",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "BlobItemInternal",
-	                        },
-	                    },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobPrefix = {
-	    serializedName: "BlobPrefix",
-	    type: {
-	        name: "Composite",
-	        className: "BlobPrefix",
-	        modelProperties: {
-	            name: {
-	                serializedName: "Name",
-	                xmlName: "Name",
-	                type: {
-	                    name: "Composite",
-	                    className: "BlobName",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockLookupList = {
-	    serializedName: "BlockLookupList",
-	    xmlName: "BlockList",
-	    type: {
-	        name: "Composite",
-	        className: "BlockLookupList",
-	        modelProperties: {
-	            committed: {
-	                serializedName: "Committed",
-	                xmlName: "Committed",
-	                xmlElementName: "Committed",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "String",
-	                        },
-	                    },
-	                },
-	            },
-	            uncommitted: {
-	                serializedName: "Uncommitted",
-	                xmlName: "Uncommitted",
-	                xmlElementName: "Uncommitted",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "String",
-	                        },
-	                    },
-	                },
-	            },
-	            latest: {
-	                serializedName: "Latest",
-	                xmlName: "Latest",
-	                xmlElementName: "Latest",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "String",
-	                        },
-	                    },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockList = {
-	    serializedName: "BlockList",
-	    type: {
-	        name: "Composite",
-	        className: "BlockList",
-	        modelProperties: {
-	            committedBlocks: {
-	                serializedName: "CommittedBlocks",
-	                xmlName: "CommittedBlocks",
-	                xmlIsWrapped: true,
-	                xmlElementName: "Block",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "Block",
-	                        },
-	                    },
-	                },
-	            },
-	            uncommittedBlocks: {
-	                serializedName: "UncommittedBlocks",
-	                xmlName: "UncommittedBlocks",
-	                xmlIsWrapped: true,
-	                xmlElementName: "Block",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "Block",
-	                        },
-	                    },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.Block = {
-	    serializedName: "Block",
-	    type: {
-	        name: "Composite",
-	        className: "Block",
-	        modelProperties: {
-	            name: {
-	                serializedName: "Name",
-	                required: true,
-	                xmlName: "Name",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            size: {
-	                serializedName: "Size",
-	                required: true,
-	                xmlName: "Size",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageList = {
-	    serializedName: "PageList",
-	    type: {
-	        name: "Composite",
-	        className: "PageList",
-	        modelProperties: {
-	            pageRange: {
-	                serializedName: "PageRange",
-	                xmlName: "PageRange",
-	                xmlElementName: "PageRange",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "PageRange",
-	                        },
-	                    },
-	                },
-	            },
-	            clearRange: {
-	                serializedName: "ClearRange",
-	                xmlName: "ClearRange",
-	                xmlElementName: "ClearRange",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "ClearRange",
-	                        },
-	                    },
-	                },
-	            },
-	            continuationToken: {
-	                serializedName: "NextMarker",
-	                xmlName: "NextMarker",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageRange = {
-	    serializedName: "PageRange",
-	    xmlName: "PageRange",
-	    type: {
-	        name: "Composite",
-	        className: "PageRange",
-	        modelProperties: {
-	            start: {
-	                serializedName: "Start",
-	                required: true,
-	                xmlName: "Start",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            end: {
-	                serializedName: "End",
-	                required: true,
-	                xmlName: "End",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ClearRange = {
-	    serializedName: "ClearRange",
-	    xmlName: "ClearRange",
-	    type: {
-	        name: "Composite",
-	        className: "ClearRange",
-	        modelProperties: {
-	            start: {
-	                serializedName: "Start",
-	                required: true,
-	                xmlName: "Start",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            end: {
-	                serializedName: "End",
-	                required: true,
-	                xmlName: "End",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.QueryRequest = {
-	    serializedName: "QueryRequest",
-	    xmlName: "QueryRequest",
-	    type: {
-	        name: "Composite",
-	        className: "QueryRequest",
-	        modelProperties: {
-	            queryType: {
-	                serializedName: "QueryType",
-	                required: true,
-	                xmlName: "QueryType",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            expression: {
-	                serializedName: "Expression",
-	                required: true,
-	                xmlName: "Expression",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            inputSerialization: {
-	                serializedName: "InputSerialization",
-	                xmlName: "InputSerialization",
-	                type: {
-	                    name: "Composite",
-	                    className: "QuerySerialization",
-	                },
-	            },
-	            outputSerialization: {
-	                serializedName: "OutputSerialization",
-	                xmlName: "OutputSerialization",
-	                type: {
-	                    name: "Composite",
-	                    className: "QuerySerialization",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.QuerySerialization = {
-	    serializedName: "QuerySerialization",
-	    type: {
-	        name: "Composite",
-	        className: "QuerySerialization",
-	        modelProperties: {
-	            format: {
-	                serializedName: "Format",
-	                xmlName: "Format",
-	                type: {
-	                    name: "Composite",
-	                    className: "QueryFormat",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.QueryFormat = {
-	    serializedName: "QueryFormat",
-	    type: {
-	        name: "Composite",
-	        className: "QueryFormat",
-	        modelProperties: {
-	            type: {
-	                serializedName: "Type",
-	                required: true,
-	                xmlName: "Type",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["delimited", "json", "arrow", "parquet"],
-	                },
-	            },
-	            delimitedTextConfiguration: {
-	                serializedName: "DelimitedTextConfiguration",
-	                xmlName: "DelimitedTextConfiguration",
-	                type: {
-	                    name: "Composite",
-	                    className: "DelimitedTextConfiguration",
-	                },
-	            },
-	            jsonTextConfiguration: {
-	                serializedName: "JsonTextConfiguration",
-	                xmlName: "JsonTextConfiguration",
-	                type: {
-	                    name: "Composite",
-	                    className: "JsonTextConfiguration",
-	                },
-	            },
-	            arrowConfiguration: {
-	                serializedName: "ArrowConfiguration",
-	                xmlName: "ArrowConfiguration",
-	                type: {
-	                    name: "Composite",
-	                    className: "ArrowConfiguration",
-	                },
-	            },
-	            parquetTextConfiguration: {
-	                serializedName: "ParquetTextConfiguration",
-	                xmlName: "ParquetTextConfiguration",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "any" } },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.DelimitedTextConfiguration = {
-	    serializedName: "DelimitedTextConfiguration",
-	    xmlName: "DelimitedTextConfiguration",
-	    type: {
-	        name: "Composite",
-	        className: "DelimitedTextConfiguration",
-	        modelProperties: {
-	            columnSeparator: {
-	                serializedName: "ColumnSeparator",
-	                xmlName: "ColumnSeparator",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            fieldQuote: {
-	                serializedName: "FieldQuote",
-	                xmlName: "FieldQuote",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            recordSeparator: {
-	                serializedName: "RecordSeparator",
-	                xmlName: "RecordSeparator",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            escapeChar: {
-	                serializedName: "EscapeChar",
-	                xmlName: "EscapeChar",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            headersPresent: {
-	                serializedName: "HeadersPresent",
-	                xmlName: "HasHeaders",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.JsonTextConfiguration = {
-	    serializedName: "JsonTextConfiguration",
-	    xmlName: "JsonTextConfiguration",
-	    type: {
-	        name: "Composite",
-	        className: "JsonTextConfiguration",
-	        modelProperties: {
-	            recordSeparator: {
-	                serializedName: "RecordSeparator",
-	                xmlName: "RecordSeparator",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ArrowConfiguration = {
-	    serializedName: "ArrowConfiguration",
-	    xmlName: "ArrowConfiguration",
-	    type: {
-	        name: "Composite",
-	        className: "ArrowConfiguration",
-	        modelProperties: {
-	            schema: {
-	                serializedName: "Schema",
-	                required: true,
-	                xmlName: "Schema",
-	                xmlIsWrapped: true,
-	                xmlElementName: "Field",
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: {
-	                            name: "Composite",
-	                            className: "ArrowField",
-	                        },
-	                    },
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ArrowField = {
-	    serializedName: "ArrowField",
-	    xmlName: "Field",
-	    type: {
-	        name: "Composite",
-	        className: "ArrowField",
-	        modelProperties: {
-	            type: {
-	                serializedName: "Type",
-	                required: true,
-	                xmlName: "Type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            name: {
-	                serializedName: "Name",
-	                xmlName: "Name",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            precision: {
-	                serializedName: "Precision",
-	                xmlName: "Precision",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            scale: {
-	                serializedName: "Scale",
-	                xmlName: "Scale",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceSetPropertiesHeaders = {
-	    serializedName: "Service_setPropertiesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceSetPropertiesHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceSetPropertiesExceptionHeaders = {
-	    serializedName: "Service_setPropertiesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceSetPropertiesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetPropertiesHeaders = {
-	    serializedName: "Service_getPropertiesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetPropertiesHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetPropertiesExceptionHeaders = {
-	    serializedName: "Service_getPropertiesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetPropertiesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetStatisticsHeaders = {
-	    serializedName: "Service_getStatisticsHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetStatisticsHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetStatisticsExceptionHeaders = {
-	    serializedName: "Service_getStatisticsExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetStatisticsExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceListContainersSegmentHeaders = {
-	    serializedName: "Service_listContainersSegmentHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceListContainersSegmentHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceListContainersSegmentExceptionHeaders = {
-	    serializedName: "Service_listContainersSegmentExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceListContainersSegmentExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetUserDelegationKeyHeaders = {
-	    serializedName: "Service_getUserDelegationKeyHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetUserDelegationKeyHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetUserDelegationKeyExceptionHeaders = {
-	    serializedName: "Service_getUserDelegationKeyExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetUserDelegationKeyExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetAccountInfoHeaders = {
-	    serializedName: "Service_getAccountInfoHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetAccountInfoHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            skuName: {
-	                serializedName: "x-ms-sku-name",
-	                xmlName: "x-ms-sku-name",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "Standard_LRS",
-	                        "Standard_GRS",
-	                        "Standard_RAGRS",
-	                        "Standard_ZRS",
-	                        "Premium_LRS",
-	                    ],
-	                },
-	            },
-	            accountKind: {
-	                serializedName: "x-ms-account-kind",
-	                xmlName: "x-ms-account-kind",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "Storage",
-	                        "BlobStorage",
-	                        "StorageV2",
-	                        "FileStorage",
-	                        "BlockBlobStorage",
-	                    ],
-	                },
-	            },
-	            isHierarchicalNamespaceEnabled: {
-	                serializedName: "x-ms-is-hns-enabled",
-	                xmlName: "x-ms-is-hns-enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceGetAccountInfoExceptionHeaders = {
-	    serializedName: "Service_getAccountInfoExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceGetAccountInfoExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceSubmitBatchHeaders = {
-	    serializedName: "Service_submitBatchHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceSubmitBatchHeaders",
-	        modelProperties: {
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceSubmitBatchExceptionHeaders = {
-	    serializedName: "Service_submitBatchExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceSubmitBatchExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceFilterBlobsHeaders = {
-	    serializedName: "Service_filterBlobsHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceFilterBlobsHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ServiceFilterBlobsExceptionHeaders = {
-	    serializedName: "Service_filterBlobsExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ServiceFilterBlobsExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerCreateHeaders = {
-	    serializedName: "Container_createHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerCreateHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerCreateExceptionHeaders = {
-	    serializedName: "Container_createExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerCreateExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerGetPropertiesHeaders = {
-	    serializedName: "Container_getPropertiesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerGetPropertiesHeaders",
-	        modelProperties: {
-	            metadata: {
-	                serializedName: "x-ms-meta",
-	                headerCollectionPrefix: "x-ms-meta-",
-	                xmlName: "x-ms-meta",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseDuration: {
-	                serializedName: "x-ms-lease-duration",
-	                xmlName: "x-ms-lease-duration",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["infinite", "fixed"],
-	                },
-	            },
-	            leaseState: {
-	                serializedName: "x-ms-lease-state",
-	                xmlName: "x-ms-lease-state",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "available",
-	                        "leased",
-	                        "expired",
-	                        "breaking",
-	                        "broken",
-	                    ],
-	                },
-	            },
-	            leaseStatus: {
-	                serializedName: "x-ms-lease-status",
-	                xmlName: "x-ms-lease-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["locked", "unlocked"],
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobPublicAccess: {
-	                serializedName: "x-ms-blob-public-access",
-	                xmlName: "x-ms-blob-public-access",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["container", "blob"],
-	                },
-	            },
-	            hasImmutabilityPolicy: {
-	                serializedName: "x-ms-has-immutability-policy",
-	                xmlName: "x-ms-has-immutability-policy",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            hasLegalHold: {
-	                serializedName: "x-ms-has-legal-hold",
-	                xmlName: "x-ms-has-legal-hold",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            defaultEncryptionScope: {
-	                serializedName: "x-ms-default-encryption-scope",
-	                xmlName: "x-ms-default-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            denyEncryptionScopeOverride: {
-	                serializedName: "x-ms-deny-encryption-scope-override",
-	                xmlName: "x-ms-deny-encryption-scope-override",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            isImmutableStorageWithVersioningEnabled: {
-	                serializedName: "x-ms-immutable-storage-with-versioning-enabled",
-	                xmlName: "x-ms-immutable-storage-with-versioning-enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerGetPropertiesExceptionHeaders = {
-	    serializedName: "Container_getPropertiesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerGetPropertiesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerDeleteHeaders = {
-	    serializedName: "Container_deleteHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerDeleteHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerDeleteExceptionHeaders = {
-	    serializedName: "Container_deleteExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerDeleteExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerSetMetadataHeaders = {
-	    serializedName: "Container_setMetadataHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerSetMetadataHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerSetMetadataExceptionHeaders = {
-	    serializedName: "Container_setMetadataExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerSetMetadataExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerGetAccessPolicyHeaders = {
-	    serializedName: "Container_getAccessPolicyHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerGetAccessPolicyHeaders",
-	        modelProperties: {
-	            blobPublicAccess: {
-	                serializedName: "x-ms-blob-public-access",
-	                xmlName: "x-ms-blob-public-access",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["container", "blob"],
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerGetAccessPolicyExceptionHeaders = {
-	    serializedName: "Container_getAccessPolicyExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerGetAccessPolicyExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerSetAccessPolicyHeaders = {
-	    serializedName: "Container_setAccessPolicyHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerSetAccessPolicyHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerSetAccessPolicyExceptionHeaders = {
-	    serializedName: "Container_setAccessPolicyExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerSetAccessPolicyExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerRestoreHeaders = {
-	    serializedName: "Container_restoreHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerRestoreHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerRestoreExceptionHeaders = {
-	    serializedName: "Container_restoreExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerRestoreExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerRenameHeaders = {
-	    serializedName: "Container_renameHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerRenameHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerRenameExceptionHeaders = {
-	    serializedName: "Container_renameExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerRenameExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerSubmitBatchHeaders = {
-	    serializedName: "Container_submitBatchHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerSubmitBatchHeaders",
-	        modelProperties: {
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerSubmitBatchExceptionHeaders = {
-	    serializedName: "Container_submitBatchExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerSubmitBatchExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerFilterBlobsHeaders = {
-	    serializedName: "Container_filterBlobsHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerFilterBlobsHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerFilterBlobsExceptionHeaders = {
-	    serializedName: "Container_filterBlobsExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerFilterBlobsExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerAcquireLeaseHeaders = {
-	    serializedName: "Container_acquireLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerAcquireLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseId: {
-	                serializedName: "x-ms-lease-id",
-	                xmlName: "x-ms-lease-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerAcquireLeaseExceptionHeaders = {
-	    serializedName: "Container_acquireLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerAcquireLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerReleaseLeaseHeaders = {
-	    serializedName: "Container_releaseLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerReleaseLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerReleaseLeaseExceptionHeaders = {
-	    serializedName: "Container_releaseLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerReleaseLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerRenewLeaseHeaders = {
-	    serializedName: "Container_renewLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerRenewLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseId: {
-	                serializedName: "x-ms-lease-id",
-	                xmlName: "x-ms-lease-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerRenewLeaseExceptionHeaders = {
-	    serializedName: "Container_renewLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerRenewLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerBreakLeaseHeaders = {
-	    serializedName: "Container_breakLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerBreakLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseTime: {
-	                serializedName: "x-ms-lease-time",
-	                xmlName: "x-ms-lease-time",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerBreakLeaseExceptionHeaders = {
-	    serializedName: "Container_breakLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerBreakLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerChangeLeaseHeaders = {
-	    serializedName: "Container_changeLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerChangeLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseId: {
-	                serializedName: "x-ms-lease-id",
-	                xmlName: "x-ms-lease-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerChangeLeaseExceptionHeaders = {
-	    serializedName: "Container_changeLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerChangeLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerListBlobFlatSegmentHeaders = {
-	    serializedName: "Container_listBlobFlatSegmentHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerListBlobFlatSegmentHeaders",
-	        modelProperties: {
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerListBlobFlatSegmentExceptionHeaders = {
-	    serializedName: "Container_listBlobFlatSegmentExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerListBlobFlatSegmentExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerListBlobHierarchySegmentHeaders = {
-	    serializedName: "Container_listBlobHierarchySegmentHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerListBlobHierarchySegmentHeaders",
-	        modelProperties: {
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerListBlobHierarchySegmentExceptionHeaders = {
-	    serializedName: "Container_listBlobHierarchySegmentExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerListBlobHierarchySegmentExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerGetAccountInfoHeaders = {
-	    serializedName: "Container_getAccountInfoHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerGetAccountInfoHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            skuName: {
-	                serializedName: "x-ms-sku-name",
-	                xmlName: "x-ms-sku-name",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "Standard_LRS",
-	                        "Standard_GRS",
-	                        "Standard_RAGRS",
-	                        "Standard_ZRS",
-	                        "Premium_LRS",
-	                    ],
-	                },
-	            },
-	            accountKind: {
-	                serializedName: "x-ms-account-kind",
-	                xmlName: "x-ms-account-kind",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "Storage",
-	                        "BlobStorage",
-	                        "StorageV2",
-	                        "FileStorage",
-	                        "BlockBlobStorage",
-	                    ],
-	                },
-	            },
-	            isHierarchicalNamespaceEnabled: {
-	                serializedName: "x-ms-is-hns-enabled",
-	                xmlName: "x-ms-is-hns-enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.ContainerGetAccountInfoExceptionHeaders = {
-	    serializedName: "Container_getAccountInfoExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "ContainerGetAccountInfoExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobDownloadHeaders = {
-	    serializedName: "Blob_downloadHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobDownloadHeaders",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            createdOn: {
-	                serializedName: "x-ms-creation-time",
-	                xmlName: "x-ms-creation-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            metadata: {
-	                serializedName: "x-ms-meta",
-	                headerCollectionPrefix: "x-ms-meta-",
-	                xmlName: "x-ms-meta",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            objectReplicationPolicyId: {
-	                serializedName: "x-ms-or-policy-id",
-	                xmlName: "x-ms-or-policy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            objectReplicationRules: {
-	                serializedName: "x-ms-or",
-	                headerCollectionPrefix: "x-ms-or-",
-	                xmlName: "x-ms-or",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            contentLength: {
-	                serializedName: "content-length",
-	                xmlName: "content-length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentRange: {
-	                serializedName: "content-range",
-	                xmlName: "content-range",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            contentEncoding: {
-	                serializedName: "content-encoding",
-	                xmlName: "content-encoding",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            cacheControl: {
-	                serializedName: "cache-control",
-	                xmlName: "cache-control",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentDisposition: {
-	                serializedName: "content-disposition",
-	                xmlName: "content-disposition",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentLanguage: {
-	                serializedName: "content-language",
-	                xmlName: "content-language",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            blobType: {
-	                serializedName: "x-ms-blob-type",
-	                xmlName: "x-ms-blob-type",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
-	                },
-	            },
-	            copyCompletedOn: {
-	                serializedName: "x-ms-copy-completion-time",
-	                xmlName: "x-ms-copy-completion-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyStatusDescription: {
-	                serializedName: "x-ms-copy-status-description",
-	                xmlName: "x-ms-copy-status-description",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyId: {
-	                serializedName: "x-ms-copy-id",
-	                xmlName: "x-ms-copy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyProgress: {
-	                serializedName: "x-ms-copy-progress",
-	                xmlName: "x-ms-copy-progress",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySource: {
-	                serializedName: "x-ms-copy-source",
-	                xmlName: "x-ms-copy-source",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                serializedName: "x-ms-copy-status",
-	                xmlName: "x-ms-copy-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["pending", "success", "aborted", "failed"],
-	                },
-	            },
-	            leaseDuration: {
-	                serializedName: "x-ms-lease-duration",
-	                xmlName: "x-ms-lease-duration",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["infinite", "fixed"],
-	                },
-	            },
-	            leaseState: {
-	                serializedName: "x-ms-lease-state",
-	                xmlName: "x-ms-lease-state",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "available",
-	                        "leased",
-	                        "expired",
-	                        "breaking",
-	                        "broken",
-	                    ],
-	                },
-	            },
-	            leaseStatus: {
-	                serializedName: "x-ms-lease-status",
-	                xmlName: "x-ms-lease-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["locked", "unlocked"],
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            isCurrentVersion: {
-	                serializedName: "x-ms-is-current-version",
-	                xmlName: "x-ms-is-current-version",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            acceptRanges: {
-	                serializedName: "accept-ranges",
-	                xmlName: "accept-ranges",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobCommittedBlockCount: {
-	                serializedName: "x-ms-blob-committed-block-count",
-	                xmlName: "x-ms-blob-committed-block-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-server-encrypted",
-	                xmlName: "x-ms-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobContentMD5: {
-	                serializedName: "x-ms-blob-content-md5",
-	                xmlName: "x-ms-blob-content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            tagCount: {
-	                serializedName: "x-ms-tag-count",
-	                xmlName: "x-ms-tag-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            isSealed: {
-	                serializedName: "x-ms-blob-sealed",
-	                xmlName: "x-ms-blob-sealed",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            lastAccessed: {
-	                serializedName: "x-ms-last-access-time",
-	                xmlName: "x-ms-last-access-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyExpiresOn: {
-	                serializedName: "x-ms-immutability-policy-until-date",
-	                xmlName: "x-ms-immutability-policy-until-date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyMode: {
-	                serializedName: "x-ms-immutability-policy-mode",
-	                xmlName: "x-ms-immutability-policy-mode",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
-	                },
-	            },
-	            legalHold: {
-	                serializedName: "x-ms-legal-hold",
-	                xmlName: "x-ms-legal-hold",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobDownloadExceptionHeaders = {
-	    serializedName: "Blob_downloadExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobDownloadExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobGetPropertiesHeaders = {
-	    serializedName: "Blob_getPropertiesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobGetPropertiesHeaders",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            createdOn: {
-	                serializedName: "x-ms-creation-time",
-	                xmlName: "x-ms-creation-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            metadata: {
-	                serializedName: "x-ms-meta",
-	                headerCollectionPrefix: "x-ms-meta-",
-	                xmlName: "x-ms-meta",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            objectReplicationPolicyId: {
-	                serializedName: "x-ms-or-policy-id",
-	                xmlName: "x-ms-or-policy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            objectReplicationRules: {
-	                serializedName: "x-ms-or",
-	                headerCollectionPrefix: "x-ms-or-",
-	                xmlName: "x-ms-or",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            blobType: {
-	                serializedName: "x-ms-blob-type",
-	                xmlName: "x-ms-blob-type",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
-	                },
-	            },
-	            copyCompletedOn: {
-	                serializedName: "x-ms-copy-completion-time",
-	                xmlName: "x-ms-copy-completion-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyStatusDescription: {
-	                serializedName: "x-ms-copy-status-description",
-	                xmlName: "x-ms-copy-status-description",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyId: {
-	                serializedName: "x-ms-copy-id",
-	                xmlName: "x-ms-copy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyProgress: {
-	                serializedName: "x-ms-copy-progress",
-	                xmlName: "x-ms-copy-progress",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySource: {
-	                serializedName: "x-ms-copy-source",
-	                xmlName: "x-ms-copy-source",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                serializedName: "x-ms-copy-status",
-	                xmlName: "x-ms-copy-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["pending", "success", "aborted", "failed"],
-	                },
-	            },
-	            isIncrementalCopy: {
-	                serializedName: "x-ms-incremental-copy",
-	                xmlName: "x-ms-incremental-copy",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            destinationSnapshot: {
-	                serializedName: "x-ms-copy-destination-snapshot",
-	                xmlName: "x-ms-copy-destination-snapshot",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            leaseDuration: {
-	                serializedName: "x-ms-lease-duration",
-	                xmlName: "x-ms-lease-duration",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["infinite", "fixed"],
-	                },
-	            },
-	            leaseState: {
-	                serializedName: "x-ms-lease-state",
-	                xmlName: "x-ms-lease-state",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "available",
-	                        "leased",
-	                        "expired",
-	                        "breaking",
-	                        "broken",
-	                    ],
-	                },
-	            },
-	            leaseStatus: {
-	                serializedName: "x-ms-lease-status",
-	                xmlName: "x-ms-lease-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["locked", "unlocked"],
-	                },
-	            },
-	            contentLength: {
-	                serializedName: "content-length",
-	                xmlName: "content-length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            contentEncoding: {
-	                serializedName: "content-encoding",
-	                xmlName: "content-encoding",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentDisposition: {
-	                serializedName: "content-disposition",
-	                xmlName: "content-disposition",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentLanguage: {
-	                serializedName: "content-language",
-	                xmlName: "content-language",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            cacheControl: {
-	                serializedName: "cache-control",
-	                xmlName: "cache-control",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            acceptRanges: {
-	                serializedName: "accept-ranges",
-	                xmlName: "accept-ranges",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobCommittedBlockCount: {
-	                serializedName: "x-ms-blob-committed-block-count",
-	                xmlName: "x-ms-blob-committed-block-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-server-encrypted",
-	                xmlName: "x-ms-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            accessTier: {
-	                serializedName: "x-ms-access-tier",
-	                xmlName: "x-ms-access-tier",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            accessTierInferred: {
-	                serializedName: "x-ms-access-tier-inferred",
-	                xmlName: "x-ms-access-tier-inferred",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            archiveStatus: {
-	                serializedName: "x-ms-archive-status",
-	                xmlName: "x-ms-archive-status",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            accessTierChangedOn: {
-	                serializedName: "x-ms-access-tier-change-time",
-	                xmlName: "x-ms-access-tier-change-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            isCurrentVersion: {
-	                serializedName: "x-ms-is-current-version",
-	                xmlName: "x-ms-is-current-version",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            tagCount: {
-	                serializedName: "x-ms-tag-count",
-	                xmlName: "x-ms-tag-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            expiresOn: {
-	                serializedName: "x-ms-expiry-time",
-	                xmlName: "x-ms-expiry-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isSealed: {
-	                serializedName: "x-ms-blob-sealed",
-	                xmlName: "x-ms-blob-sealed",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            rehydratePriority: {
-	                serializedName: "x-ms-rehydrate-priority",
-	                xmlName: "x-ms-rehydrate-priority",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["High", "Standard"],
-	                },
-	            },
-	            lastAccessed: {
-	                serializedName: "x-ms-last-access-time",
-	                xmlName: "x-ms-last-access-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyExpiresOn: {
-	                serializedName: "x-ms-immutability-policy-until-date",
-	                xmlName: "x-ms-immutability-policy-until-date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyMode: {
-	                serializedName: "x-ms-immutability-policy-mode",
-	                xmlName: "x-ms-immutability-policy-mode",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
-	                },
-	            },
-	            legalHold: {
-	                serializedName: "x-ms-legal-hold",
-	                xmlName: "x-ms-legal-hold",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobGetPropertiesExceptionHeaders = {
-	    serializedName: "Blob_getPropertiesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobGetPropertiesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobDeleteHeaders = {
-	    serializedName: "Blob_deleteHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobDeleteHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobDeleteExceptionHeaders = {
-	    serializedName: "Blob_deleteExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobDeleteExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobUndeleteHeaders = {
-	    serializedName: "Blob_undeleteHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobUndeleteHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobUndeleteExceptionHeaders = {
-	    serializedName: "Blob_undeleteExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobUndeleteExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetExpiryHeaders = {
-	    serializedName: "Blob_setExpiryHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetExpiryHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetExpiryExceptionHeaders = {
-	    serializedName: "Blob_setExpiryExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetExpiryExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetHttpHeadersHeaders = {
-	    serializedName: "Blob_setHttpHeadersHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetHttpHeadersHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetHttpHeadersExceptionHeaders = {
-	    serializedName: "Blob_setHttpHeadersExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetHttpHeadersExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetImmutabilityPolicyHeaders = {
-	    serializedName: "Blob_setImmutabilityPolicyHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetImmutabilityPolicyHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyExpiry: {
-	                serializedName: "x-ms-immutability-policy-until-date",
-	                xmlName: "x-ms-immutability-policy-until-date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            immutabilityPolicyMode: {
-	                serializedName: "x-ms-immutability-policy-mode",
-	                xmlName: "x-ms-immutability-policy-mode",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetImmutabilityPolicyExceptionHeaders = {
-	    serializedName: "Blob_setImmutabilityPolicyExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetImmutabilityPolicyExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobDeleteImmutabilityPolicyHeaders = {
-	    serializedName: "Blob_deleteImmutabilityPolicyHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobDeleteImmutabilityPolicyHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobDeleteImmutabilityPolicyExceptionHeaders = {
-	    serializedName: "Blob_deleteImmutabilityPolicyExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobDeleteImmutabilityPolicyExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetLegalHoldHeaders = {
-	    serializedName: "Blob_setLegalHoldHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetLegalHoldHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            legalHold: {
-	                serializedName: "x-ms-legal-hold",
-	                xmlName: "x-ms-legal-hold",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetLegalHoldExceptionHeaders = {
-	    serializedName: "Blob_setLegalHoldExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetLegalHoldExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetMetadataHeaders = {
-	    serializedName: "Blob_setMetadataHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetMetadataHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetMetadataExceptionHeaders = {
-	    serializedName: "Blob_setMetadataExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetMetadataExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobAcquireLeaseHeaders = {
-	    serializedName: "Blob_acquireLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobAcquireLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseId: {
-	                serializedName: "x-ms-lease-id",
-	                xmlName: "x-ms-lease-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobAcquireLeaseExceptionHeaders = {
-	    serializedName: "Blob_acquireLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobAcquireLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobReleaseLeaseHeaders = {
-	    serializedName: "Blob_releaseLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobReleaseLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobReleaseLeaseExceptionHeaders = {
-	    serializedName: "Blob_releaseLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobReleaseLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobRenewLeaseHeaders = {
-	    serializedName: "Blob_renewLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobRenewLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseId: {
-	                serializedName: "x-ms-lease-id",
-	                xmlName: "x-ms-lease-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobRenewLeaseExceptionHeaders = {
-	    serializedName: "Blob_renewLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobRenewLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobChangeLeaseHeaders = {
-	    serializedName: "Blob_changeLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobChangeLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            leaseId: {
-	                serializedName: "x-ms-lease-id",
-	                xmlName: "x-ms-lease-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobChangeLeaseExceptionHeaders = {
-	    serializedName: "Blob_changeLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobChangeLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobBreakLeaseHeaders = {
-	    serializedName: "Blob_breakLeaseHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobBreakLeaseHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            leaseTime: {
-	                serializedName: "x-ms-lease-time",
-	                xmlName: "x-ms-lease-time",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobBreakLeaseExceptionHeaders = {
-	    serializedName: "Blob_breakLeaseExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobBreakLeaseExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobCreateSnapshotHeaders = {
-	    serializedName: "Blob_createSnapshotHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobCreateSnapshotHeaders",
-	        modelProperties: {
-	            snapshot: {
-	                serializedName: "x-ms-snapshot",
-	                xmlName: "x-ms-snapshot",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobCreateSnapshotExceptionHeaders = {
-	    serializedName: "Blob_createSnapshotExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobCreateSnapshotExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobStartCopyFromURLHeaders = {
-	    serializedName: "Blob_startCopyFromURLHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobStartCopyFromURLHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyId: {
-	                serializedName: "x-ms-copy-id",
-	                xmlName: "x-ms-copy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                serializedName: "x-ms-copy-status",
-	                xmlName: "x-ms-copy-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["pending", "success", "aborted", "failed"],
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobStartCopyFromURLExceptionHeaders = {
-	    serializedName: "Blob_startCopyFromURLExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobStartCopyFromURLExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "x-ms-copy-source-error-code",
-	                xmlName: "x-ms-copy-source-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "x-ms-copy-source-status-code",
-	                xmlName: "x-ms-copy-source-status-code",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobCopyFromURLHeaders = {
-	    serializedName: "Blob_copyFromURLHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobCopyFromURLHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyId: {
-	                serializedName: "x-ms-copy-id",
-	                xmlName: "x-ms-copy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                defaultValue: "success",
-	                isConstant: true,
-	                serializedName: "x-ms-copy-status",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobCopyFromURLExceptionHeaders = {
-	    serializedName: "Blob_copyFromURLExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobCopyFromURLExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "x-ms-copy-source-error-code",
-	                xmlName: "x-ms-copy-source-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "x-ms-copy-source-status-code",
-	                xmlName: "x-ms-copy-source-status-code",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobAbortCopyFromURLHeaders = {
-	    serializedName: "Blob_abortCopyFromURLHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobAbortCopyFromURLHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobAbortCopyFromURLExceptionHeaders = {
-	    serializedName: "Blob_abortCopyFromURLExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobAbortCopyFromURLExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetTierHeaders = {
-	    serializedName: "Blob_setTierHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetTierHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetTierExceptionHeaders = {
-	    serializedName: "Blob_setTierExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetTierExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobGetAccountInfoHeaders = {
-	    serializedName: "Blob_getAccountInfoHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobGetAccountInfoHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            skuName: {
-	                serializedName: "x-ms-sku-name",
-	                xmlName: "x-ms-sku-name",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "Standard_LRS",
-	                        "Standard_GRS",
-	                        "Standard_RAGRS",
-	                        "Standard_ZRS",
-	                        "Premium_LRS",
-	                    ],
-	                },
-	            },
-	            accountKind: {
-	                serializedName: "x-ms-account-kind",
-	                xmlName: "x-ms-account-kind",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "Storage",
-	                        "BlobStorage",
-	                        "StorageV2",
-	                        "FileStorage",
-	                        "BlockBlobStorage",
-	                    ],
-	                },
-	            },
-	            isHierarchicalNamespaceEnabled: {
-	                serializedName: "x-ms-is-hns-enabled",
-	                xmlName: "x-ms-is-hns-enabled",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobGetAccountInfoExceptionHeaders = {
-	    serializedName: "Blob_getAccountInfoExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobGetAccountInfoExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobQueryHeaders = {
-	    serializedName: "Blob_queryHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobQueryHeaders",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            metadata: {
-	                serializedName: "x-ms-meta",
-	                headerCollectionPrefix: "x-ms-meta-",
-	                xmlName: "x-ms-meta",
-	                type: {
-	                    name: "Dictionary",
-	                    value: { type: { name: "String" } },
-	                },
-	            },
-	            contentLength: {
-	                serializedName: "content-length",
-	                xmlName: "content-length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentRange: {
-	                serializedName: "content-range",
-	                xmlName: "content-range",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            contentEncoding: {
-	                serializedName: "content-encoding",
-	                xmlName: "content-encoding",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            cacheControl: {
-	                serializedName: "cache-control",
-	                xmlName: "cache-control",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentDisposition: {
-	                serializedName: "content-disposition",
-	                xmlName: "content-disposition",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentLanguage: {
-	                serializedName: "content-language",
-	                xmlName: "content-language",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            blobType: {
-	                serializedName: "x-ms-blob-type",
-	                xmlName: "x-ms-blob-type",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
-	                },
-	            },
-	            copyCompletionTime: {
-	                serializedName: "x-ms-copy-completion-time",
-	                xmlName: "x-ms-copy-completion-time",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyStatusDescription: {
-	                serializedName: "x-ms-copy-status-description",
-	                xmlName: "x-ms-copy-status-description",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyId: {
-	                serializedName: "x-ms-copy-id",
-	                xmlName: "x-ms-copy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyProgress: {
-	                serializedName: "x-ms-copy-progress",
-	                xmlName: "x-ms-copy-progress",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySource: {
-	                serializedName: "x-ms-copy-source",
-	                xmlName: "x-ms-copy-source",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                serializedName: "x-ms-copy-status",
-	                xmlName: "x-ms-copy-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["pending", "success", "aborted", "failed"],
-	                },
-	            },
-	            leaseDuration: {
-	                serializedName: "x-ms-lease-duration",
-	                xmlName: "x-ms-lease-duration",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["infinite", "fixed"],
-	                },
-	            },
-	            leaseState: {
-	                serializedName: "x-ms-lease-state",
-	                xmlName: "x-ms-lease-state",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "available",
-	                        "leased",
-	                        "expired",
-	                        "breaking",
-	                        "broken",
-	                    ],
-	                },
-	            },
-	            leaseStatus: {
-	                serializedName: "x-ms-lease-status",
-	                xmlName: "x-ms-lease-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["locked", "unlocked"],
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            acceptRanges: {
-	                serializedName: "accept-ranges",
-	                xmlName: "accept-ranges",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobCommittedBlockCount: {
-	                serializedName: "x-ms-blob-committed-block-count",
-	                xmlName: "x-ms-blob-committed-block-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-server-encrypted",
-	                xmlName: "x-ms-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobContentMD5: {
-	                serializedName: "x-ms-blob-content-md5",
-	                xmlName: "x-ms-blob-content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobQueryExceptionHeaders = {
-	    serializedName: "Blob_queryExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobQueryExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobGetTagsHeaders = {
-	    serializedName: "Blob_getTagsHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobGetTagsHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobGetTagsExceptionHeaders = {
-	    serializedName: "Blob_getTagsExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobGetTagsExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetTagsHeaders = {
-	    serializedName: "Blob_setTagsHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetTagsHeaders",
-	        modelProperties: {
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlobSetTagsExceptionHeaders = {
-	    serializedName: "Blob_setTagsExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlobSetTagsExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobCreateHeaders = {
-	    serializedName: "PageBlob_createHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobCreateHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobCreateExceptionHeaders = {
-	    serializedName: "PageBlob_createExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobCreateExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobUploadPagesHeaders = {
-	    serializedName: "PageBlob_uploadPagesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobUploadPagesHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobUploadPagesExceptionHeaders = {
-	    serializedName: "PageBlob_uploadPagesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobUploadPagesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobClearPagesHeaders = {
-	    serializedName: "PageBlob_clearPagesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobClearPagesHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobClearPagesExceptionHeaders = {
-	    serializedName: "PageBlob_clearPagesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobClearPagesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobUploadPagesFromURLHeaders = {
-	    serializedName: "PageBlob_uploadPagesFromURLHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobUploadPagesFromURLHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobUploadPagesFromURLExceptionHeaders = {
-	    serializedName: "PageBlob_uploadPagesFromURLExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobUploadPagesFromURLExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "x-ms-copy-source-error-code",
-	                xmlName: "x-ms-copy-source-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "x-ms-copy-source-status-code",
-	                xmlName: "x-ms-copy-source-status-code",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobGetPageRangesHeaders = {
-	    serializedName: "PageBlob_getPageRangesHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobGetPageRangesHeaders",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobContentLength: {
-	                serializedName: "x-ms-blob-content-length",
-	                xmlName: "x-ms-blob-content-length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobGetPageRangesExceptionHeaders = {
-	    serializedName: "PageBlob_getPageRangesExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobGetPageRangesExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobGetPageRangesDiffHeaders = {
-	    serializedName: "PageBlob_getPageRangesDiffHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobGetPageRangesDiffHeaders",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobContentLength: {
-	                serializedName: "x-ms-blob-content-length",
-	                xmlName: "x-ms-blob-content-length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobGetPageRangesDiffExceptionHeaders = {
-	    serializedName: "PageBlob_getPageRangesDiffExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobGetPageRangesDiffExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobResizeHeaders = {
-	    serializedName: "PageBlob_resizeHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobResizeHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobResizeExceptionHeaders = {
-	    serializedName: "PageBlob_resizeExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobResizeExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobUpdateSequenceNumberHeaders = {
-	    serializedName: "PageBlob_updateSequenceNumberHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobUpdateSequenceNumberHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobSequenceNumber: {
-	                serializedName: "x-ms-blob-sequence-number",
-	                xmlName: "x-ms-blob-sequence-number",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobUpdateSequenceNumberExceptionHeaders = {
-	    serializedName: "PageBlob_updateSequenceNumberExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobUpdateSequenceNumberExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobCopyIncrementalHeaders = {
-	    serializedName: "PageBlob_copyIncrementalHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobCopyIncrementalHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            copyId: {
-	                serializedName: "x-ms-copy-id",
-	                xmlName: "x-ms-copy-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copyStatus: {
-	                serializedName: "x-ms-copy-status",
-	                xmlName: "x-ms-copy-status",
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["pending", "success", "aborted", "failed"],
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.PageBlobCopyIncrementalExceptionHeaders = {
-	    serializedName: "PageBlob_copyIncrementalExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "PageBlobCopyIncrementalExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobCreateHeaders = {
-	    serializedName: "AppendBlob_createHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobCreateHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobCreateExceptionHeaders = {
-	    serializedName: "AppendBlob_createExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobCreateExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobAppendBlockHeaders = {
-	    serializedName: "AppendBlob_appendBlockHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobAppendBlockHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobAppendOffset: {
-	                serializedName: "x-ms-blob-append-offset",
-	                xmlName: "x-ms-blob-append-offset",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobCommittedBlockCount: {
-	                serializedName: "x-ms-blob-committed-block-count",
-	                xmlName: "x-ms-blob-committed-block-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobAppendBlockExceptionHeaders = {
-	    serializedName: "AppendBlob_appendBlockExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobAppendBlockExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobAppendBlockFromUrlHeaders = {
-	    serializedName: "AppendBlob_appendBlockFromUrlHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobAppendBlockFromUrlHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            blobAppendOffset: {
-	                serializedName: "x-ms-blob-append-offset",
-	                xmlName: "x-ms-blob-append-offset",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobCommittedBlockCount: {
-	                serializedName: "x-ms-blob-committed-block-count",
-	                xmlName: "x-ms-blob-committed-block-count",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobAppendBlockFromUrlExceptionHeaders = {
-	    serializedName: "AppendBlob_appendBlockFromUrlExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobAppendBlockFromUrlExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "x-ms-copy-source-error-code",
-	                xmlName: "x-ms-copy-source-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "x-ms-copy-source-status-code",
-	                xmlName: "x-ms-copy-source-status-code",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobSealHeaders = {
-	    serializedName: "AppendBlob_sealHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobSealHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isSealed: {
-	                serializedName: "x-ms-blob-sealed",
-	                xmlName: "x-ms-blob-sealed",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.AppendBlobSealExceptionHeaders = {
-	    serializedName: "AppendBlob_sealExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "AppendBlobSealExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobUploadHeaders = {
-	    serializedName: "BlockBlob_uploadHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobUploadHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobUploadExceptionHeaders = {
-	    serializedName: "BlockBlob_uploadExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobUploadExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobPutBlobFromUrlHeaders = {
-	    serializedName: "BlockBlob_putBlobFromUrlHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobPutBlobFromUrlHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobPutBlobFromUrlExceptionHeaders = {
-	    serializedName: "BlockBlob_putBlobFromUrlExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobPutBlobFromUrlExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "x-ms-copy-source-error-code",
-	                xmlName: "x-ms-copy-source-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "x-ms-copy-source-status-code",
-	                xmlName: "x-ms-copy-source-status-code",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobStageBlockHeaders = {
-	    serializedName: "BlockBlob_stageBlockHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobStageBlockHeaders",
-	        modelProperties: {
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobStageBlockExceptionHeaders = {
-	    serializedName: "BlockBlob_stageBlockExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobStageBlockExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobStageBlockFromURLHeaders = {
-	    serializedName: "BlockBlob_stageBlockFromURLHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobStageBlockFromURLHeaders",
-	        modelProperties: {
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobStageBlockFromURLExceptionHeaders = {
-	    serializedName: "BlockBlob_stageBlockFromURLExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobStageBlockFromURLExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceErrorCode: {
-	                serializedName: "x-ms-copy-source-error-code",
-	                xmlName: "x-ms-copy-source-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            copySourceStatusCode: {
-	                serializedName: "x-ms-copy-source-status-code",
-	                xmlName: "x-ms-copy-source-status-code",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobCommitBlockListHeaders = {
-	    serializedName: "BlockBlob_commitBlockListHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobCommitBlockListHeaders",
-	        modelProperties: {
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            contentMD5: {
-	                serializedName: "content-md5",
-	                xmlName: "content-md5",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            xMsContentCrc64: {
-	                serializedName: "x-ms-content-crc64",
-	                xmlName: "x-ms-content-crc64",
-	                type: {
-	                    name: "ByteArray",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            versionId: {
-	                serializedName: "x-ms-version-id",
-	                xmlName: "x-ms-version-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            isServerEncrypted: {
-	                serializedName: "x-ms-request-server-encrypted",
-	                xmlName: "x-ms-request-server-encrypted",
-	                type: {
-	                    name: "Boolean",
-	                },
-	            },
-	            encryptionKeySha256: {
-	                serializedName: "x-ms-encryption-key-sha256",
-	                xmlName: "x-ms-encryption-key-sha256",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            encryptionScope: {
-	                serializedName: "x-ms-encryption-scope",
-	                xmlName: "x-ms-encryption-scope",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobCommitBlockListExceptionHeaders = {
-	    serializedName: "BlockBlob_commitBlockListExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobCommitBlockListExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobGetBlockListHeaders = {
-	    serializedName: "BlockBlob_getBlockListHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobGetBlockListHeaders",
-	        modelProperties: {
-	            lastModified: {
-	                serializedName: "last-modified",
-	                xmlName: "last-modified",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            etag: {
-	                serializedName: "etag",
-	                xmlName: "etag",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            contentType: {
-	                serializedName: "content-type",
-	                xmlName: "content-type",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            blobContentLength: {
-	                serializedName: "x-ms-blob-content-length",
-	                xmlName: "x-ms-blob-content-length",
-	                type: {
-	                    name: "Number",
-	                },
-	            },
-	            clientRequestId: {
-	                serializedName: "x-ms-client-request-id",
-	                xmlName: "x-ms-client-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            requestId: {
-	                serializedName: "x-ms-request-id",
-	                xmlName: "x-ms-request-id",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            version: {
-	                serializedName: "x-ms-version",
-	                xmlName: "x-ms-version",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	            date: {
-	                serializedName: "date",
-	                xmlName: "date",
-	                type: {
-	                    name: "DateTimeRfc1123",
-	                },
-	            },
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	mappers.BlockBlobGetBlockListExceptionHeaders = {
-	    serializedName: "BlockBlob_getBlockListExceptionHeaders",
-	    type: {
-	        name: "Composite",
-	        className: "BlockBlobGetBlockListExceptionHeaders",
-	        modelProperties: {
-	            errorCode: {
-	                serializedName: "x-ms-error-code",
-	                xmlName: "x-ms-error-code",
-	                type: {
-	                    name: "String",
-	                },
-	            },
-	        },
-	    },
-	};
-	
-	return mappers;
-}
-
-var parameters = {};
-
-var hasRequiredParameters;
-
-function requireParameters () {
-	if (hasRequiredParameters) return parameters;
-	hasRequiredParameters = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(parameters, "__esModule", { value: true });
-	parameters.action3 = parameters.action2 = parameters.leaseId1 = parameters.action1 = parameters.proposedLeaseId = parameters.duration = parameters.action = parameters.comp10 = parameters.sourceLeaseId = parameters.sourceContainerName = parameters.comp9 = parameters.deletedContainerVersion = parameters.deletedContainerName = parameters.comp8 = parameters.containerAcl = parameters.comp7 = parameters.comp6 = parameters.ifUnmodifiedSince = parameters.ifModifiedSince = parameters.leaseId = parameters.preventEncryptionScopeOverride = parameters.defaultEncryptionScope = parameters.access = parameters.metadata = parameters.restype2 = parameters.where = parameters.comp5 = parameters.multipartContentType = parameters.contentLength = parameters.comp4 = parameters.body = parameters.restype1 = parameters.comp3 = parameters.keyInfo = parameters.include = parameters.maxPageSize = parameters.marker = parameters.prefix = parameters.comp2 = parameters.comp1 = parameters.accept1 = parameters.requestId = parameters.version = parameters.timeoutInSeconds = parameters.comp = parameters.restype = parameters.url = parameters.accept = parameters.blobServiceProperties = parameters.contentType = void 0;
-	parameters.fileRequestIntent = parameters.copySourceTags = parameters.copySourceAuthorization = parameters.sourceContentMD5 = parameters.xMsRequiresSync = parameters.legalHold1 = parameters.sealBlob = parameters.blobTagsString = parameters.copySource = parameters.sourceIfTags = parameters.sourceIfNoneMatch = parameters.sourceIfMatch = parameters.sourceIfUnmodifiedSince = parameters.sourceIfModifiedSince = parameters.rehydratePriority = parameters.tier = parameters.comp14 = parameters.encryptionScope = parameters.legalHold = parameters.comp13 = parameters.immutabilityPolicyMode = parameters.immutabilityPolicyExpiry = parameters.comp12 = parameters.blobContentDisposition = parameters.blobContentLanguage = parameters.blobContentEncoding = parameters.blobContentMD5 = parameters.blobContentType = parameters.blobCacheControl = parameters.expiresOn = parameters.expiryOptions = parameters.comp11 = parameters.blobDeleteType = parameters.deleteSnapshots = parameters.ifTags = parameters.ifNoneMatch = parameters.ifMatch = parameters.encryptionAlgorithm = parameters.encryptionKeySha256 = parameters.encryptionKey = parameters.rangeGetContentCRC64 = parameters.rangeGetContentMD5 = parameters.range = parameters.versionId = parameters.snapshot = parameters.delimiter = parameters.include1 = parameters.proposedLeaseId1 = parameters.action4 = parameters.breakPeriod = void 0;
-	parameters.listType = parameters.comp25 = parameters.blocks = parameters.blockId = parameters.comp24 = parameters.copySourceBlobProperties = parameters.blobType2 = parameters.comp23 = parameters.sourceRange1 = parameters.appendPosition = parameters.maxSize = parameters.comp22 = parameters.blobType1 = parameters.comp21 = parameters.sequenceNumberAction = parameters.prevSnapshotUrl = parameters.prevsnapshot = parameters.comp20 = parameters.range1 = parameters.sourceContentCrc64 = parameters.sourceRange = parameters.sourceUrl = parameters.pageWrite1 = parameters.ifSequenceNumberEqualTo = parameters.ifSequenceNumberLessThan = parameters.ifSequenceNumberLessThanOrEqualTo = parameters.pageWrite = parameters.comp19 = parameters.accept2 = parameters.body1 = parameters.contentType1 = parameters.blobSequenceNumber = parameters.blobContentLength = parameters.blobType = parameters.transactionalContentCrc64 = parameters.transactionalContentMD5 = parameters.tags = parameters.comp18 = parameters.comp17 = parameters.queryRequest = parameters.tier1 = parameters.comp16 = parameters.copyId = parameters.copyActionAbortConstant = parameters.comp15 = void 0;
-	const mappers_js_1 = requireMappers();
-	parameters.contentType = {
-	    parameterPath: ["options", "contentType"],
-	    mapper: {
-	        defaultValue: "application/xml",
-	        isConstant: true,
-	        serializedName: "Content-Type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobServiceProperties = {
-	    parameterPath: "blobServiceProperties",
-	    mapper: mappers_js_1.BlobServiceProperties,
-	};
-	parameters.accept = {
-	    parameterPath: "accept",
-	    mapper: {
-	        defaultValue: "application/xml",
-	        isConstant: true,
-	        serializedName: "Accept",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.url = {
-	    parameterPath: "url",
-	    mapper: {
-	        serializedName: "url",
-	        required: true,
-	        xmlName: "url",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	    skipEncoding: true,
-	};
-	parameters.restype = {
-	    parameterPath: "restype",
-	    mapper: {
-	        defaultValue: "service",
-	        isConstant: true,
-	        serializedName: "restype",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "properties",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.timeoutInSeconds = {
-	    parameterPath: ["options", "timeoutInSeconds"],
-	    mapper: {
-	        constraints: {
-	            InclusiveMinimum: 0,
-	        },
-	        serializedName: "timeout",
-	        xmlName: "timeout",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.version = {
-	    parameterPath: "version",
-	    mapper: {
-	        defaultValue: "2025-11-05",
-	        isConstant: true,
-	        serializedName: "x-ms-version",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.requestId = {
-	    parameterPath: ["options", "requestId"],
-	    mapper: {
-	        serializedName: "x-ms-client-request-id",
-	        xmlName: "x-ms-client-request-id",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.accept1 = {
-	    parameterPath: "accept",
-	    mapper: {
-	        defaultValue: "application/xml",
-	        isConstant: true,
-	        serializedName: "Accept",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp1 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "stats",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp2 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "list",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.prefix = {
-	    parameterPath: ["options", "prefix"],
-	    mapper: {
-	        serializedName: "prefix",
-	        xmlName: "prefix",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.marker = {
-	    parameterPath: ["options", "marker"],
-	    mapper: {
-	        serializedName: "marker",
-	        xmlName: "marker",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.maxPageSize = {
-	    parameterPath: ["options", "maxPageSize"],
-	    mapper: {
-	        constraints: {
-	            InclusiveMinimum: 1,
-	        },
-	        serializedName: "maxresults",
-	        xmlName: "maxresults",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.include = {
-	    parameterPath: ["options", "include"],
-	    mapper: {
-	        serializedName: "include",
-	        xmlName: "include",
-	        xmlElementName: "ListContainersIncludeType",
-	        type: {
-	            name: "Sequence",
-	            element: {
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: ["metadata", "deleted", "system"],
-	                },
-	            },
-	        },
-	    },
-	    collectionFormat: "CSV",
-	};
-	parameters.keyInfo = {
-	    parameterPath: "keyInfo",
-	    mapper: mappers_js_1.KeyInfo,
-	};
-	parameters.comp3 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "userdelegationkey",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.restype1 = {
-	    parameterPath: "restype",
-	    mapper: {
-	        defaultValue: "account",
-	        isConstant: true,
-	        serializedName: "restype",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.body = {
-	    parameterPath: "body",
-	    mapper: {
-	        serializedName: "body",
-	        required: true,
-	        xmlName: "body",
-	        type: {
-	            name: "Stream",
-	        },
-	    },
-	};
-	parameters.comp4 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "batch",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.contentLength = {
-	    parameterPath: "contentLength",
-	    mapper: {
-	        serializedName: "Content-Length",
-	        required: true,
-	        xmlName: "Content-Length",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.multipartContentType = {
-	    parameterPath: "multipartContentType",
-	    mapper: {
-	        serializedName: "Content-Type",
-	        required: true,
-	        xmlName: "Content-Type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp5 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "blobs",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.where = {
-	    parameterPath: ["options", "where"],
-	    mapper: {
-	        serializedName: "where",
-	        xmlName: "where",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.restype2 = {
-	    parameterPath: "restype",
-	    mapper: {
-	        defaultValue: "container",
-	        isConstant: true,
-	        serializedName: "restype",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.metadata = {
-	    parameterPath: ["options", "metadata"],
-	    mapper: {
-	        serializedName: "x-ms-meta",
-	        xmlName: "x-ms-meta",
-	        headerCollectionPrefix: "x-ms-meta-",
-	        type: {
-	            name: "Dictionary",
-	            value: { type: { name: "String" } },
-	        },
-	    },
-	};
-	parameters.access = {
-	    parameterPath: ["options", "access"],
-	    mapper: {
-	        serializedName: "x-ms-blob-public-access",
-	        xmlName: "x-ms-blob-public-access",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["container", "blob"],
-	        },
-	    },
-	};
-	parameters.defaultEncryptionScope = {
-	    parameterPath: [
-	        "options",
-	        "containerEncryptionScope",
-	        "defaultEncryptionScope",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-default-encryption-scope",
-	        xmlName: "x-ms-default-encryption-scope",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.preventEncryptionScopeOverride = {
-	    parameterPath: [
-	        "options",
-	        "containerEncryptionScope",
-	        "preventEncryptionScopeOverride",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-deny-encryption-scope-override",
-	        xmlName: "x-ms-deny-encryption-scope-override",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.leaseId = {
-	    parameterPath: ["options", "leaseAccessConditions", "leaseId"],
-	    mapper: {
-	        serializedName: "x-ms-lease-id",
-	        xmlName: "x-ms-lease-id",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.ifModifiedSince = {
-	    parameterPath: ["options", "modifiedAccessConditions", "ifModifiedSince"],
-	    mapper: {
-	        serializedName: "If-Modified-Since",
-	        xmlName: "If-Modified-Since",
-	        type: {
-	            name: "DateTimeRfc1123",
-	        },
-	    },
-	};
-	parameters.ifUnmodifiedSince = {
-	    parameterPath: ["options", "modifiedAccessConditions", "ifUnmodifiedSince"],
-	    mapper: {
-	        serializedName: "If-Unmodified-Since",
-	        xmlName: "If-Unmodified-Since",
-	        type: {
-	            name: "DateTimeRfc1123",
-	        },
-	    },
-	};
-	parameters.comp6 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "metadata",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp7 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "acl",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.containerAcl = {
-	    parameterPath: ["options", "containerAcl"],
-	    mapper: {
-	        serializedName: "containerAcl",
-	        xmlName: "SignedIdentifiers",
-	        xmlIsWrapped: true,
-	        xmlElementName: "SignedIdentifier",
-	        type: {
-	            name: "Sequence",
-	            element: {
-	                type: {
-	                    name: "Composite",
-	                    className: "SignedIdentifier",
-	                },
-	            },
-	        },
-	    },
-	};
-	parameters.comp8 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "undelete",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.deletedContainerName = {
-	    parameterPath: ["options", "deletedContainerName"],
-	    mapper: {
-	        serializedName: "x-ms-deleted-container-name",
-	        xmlName: "x-ms-deleted-container-name",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.deletedContainerVersion = {
-	    parameterPath: ["options", "deletedContainerVersion"],
-	    mapper: {
-	        serializedName: "x-ms-deleted-container-version",
-	        xmlName: "x-ms-deleted-container-version",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp9 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "rename",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceContainerName = {
-	    parameterPath: "sourceContainerName",
-	    mapper: {
-	        serializedName: "x-ms-source-container-name",
-	        required: true,
-	        xmlName: "x-ms-source-container-name",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceLeaseId = {
-	    parameterPath: ["options", "sourceLeaseId"],
-	    mapper: {
-	        serializedName: "x-ms-source-lease-id",
-	        xmlName: "x-ms-source-lease-id",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp10 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "lease",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.action = {
-	    parameterPath: "action",
-	    mapper: {
-	        defaultValue: "acquire",
-	        isConstant: true,
-	        serializedName: "x-ms-lease-action",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.duration = {
-	    parameterPath: ["options", "duration"],
-	    mapper: {
-	        serializedName: "x-ms-lease-duration",
-	        xmlName: "x-ms-lease-duration",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.proposedLeaseId = {
-	    parameterPath: ["options", "proposedLeaseId"],
-	    mapper: {
-	        serializedName: "x-ms-proposed-lease-id",
-	        xmlName: "x-ms-proposed-lease-id",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.action1 = {
-	    parameterPath: "action",
-	    mapper: {
-	        defaultValue: "release",
-	        isConstant: true,
-	        serializedName: "x-ms-lease-action",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.leaseId1 = {
-	    parameterPath: "leaseId",
-	    mapper: {
-	        serializedName: "x-ms-lease-id",
-	        required: true,
-	        xmlName: "x-ms-lease-id",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.action2 = {
-	    parameterPath: "action",
-	    mapper: {
-	        defaultValue: "renew",
-	        isConstant: true,
-	        serializedName: "x-ms-lease-action",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.action3 = {
-	    parameterPath: "action",
-	    mapper: {
-	        defaultValue: "break",
-	        isConstant: true,
-	        serializedName: "x-ms-lease-action",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.breakPeriod = {
-	    parameterPath: ["options", "breakPeriod"],
-	    mapper: {
-	        serializedName: "x-ms-lease-break-period",
-	        xmlName: "x-ms-lease-break-period",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.action4 = {
-	    parameterPath: "action",
-	    mapper: {
-	        defaultValue: "change",
-	        isConstant: true,
-	        serializedName: "x-ms-lease-action",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.proposedLeaseId1 = {
-	    parameterPath: "proposedLeaseId",
-	    mapper: {
-	        serializedName: "x-ms-proposed-lease-id",
-	        required: true,
-	        xmlName: "x-ms-proposed-lease-id",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.include1 = {
-	    parameterPath: ["options", "include"],
-	    mapper: {
-	        serializedName: "include",
-	        xmlName: "include",
-	        xmlElementName: "ListBlobsIncludeItem",
-	        type: {
-	            name: "Sequence",
-	            element: {
-	                type: {
-	                    name: "Enum",
-	                    allowedValues: [
-	                        "copy",
-	                        "deleted",
-	                        "metadata",
-	                        "snapshots",
-	                        "uncommittedblobs",
-	                        "versions",
-	                        "tags",
-	                        "immutabilitypolicy",
-	                        "legalhold",
-	                        "deletedwithversions",
-	                    ],
-	                },
-	            },
-	        },
-	    },
-	    collectionFormat: "CSV",
-	};
-	parameters.delimiter = {
-	    parameterPath: "delimiter",
-	    mapper: {
-	        serializedName: "delimiter",
-	        required: true,
-	        xmlName: "delimiter",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.snapshot = {
-	    parameterPath: ["options", "snapshot"],
-	    mapper: {
-	        serializedName: "snapshot",
-	        xmlName: "snapshot",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.versionId = {
-	    parameterPath: ["options", "versionId"],
-	    mapper: {
-	        serializedName: "versionid",
-	        xmlName: "versionid",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.range = {
-	    parameterPath: ["options", "range"],
-	    mapper: {
-	        serializedName: "x-ms-range",
-	        xmlName: "x-ms-range",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.rangeGetContentMD5 = {
-	    parameterPath: ["options", "rangeGetContentMD5"],
-	    mapper: {
-	        serializedName: "x-ms-range-get-content-md5",
-	        xmlName: "x-ms-range-get-content-md5",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.rangeGetContentCRC64 = {
-	    parameterPath: ["options", "rangeGetContentCRC64"],
-	    mapper: {
-	        serializedName: "x-ms-range-get-content-crc64",
-	        xmlName: "x-ms-range-get-content-crc64",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.encryptionKey = {
-	    parameterPath: ["options", "cpkInfo", "encryptionKey"],
-	    mapper: {
-	        serializedName: "x-ms-encryption-key",
-	        xmlName: "x-ms-encryption-key",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.encryptionKeySha256 = {
-	    parameterPath: ["options", "cpkInfo", "encryptionKeySha256"],
-	    mapper: {
-	        serializedName: "x-ms-encryption-key-sha256",
-	        xmlName: "x-ms-encryption-key-sha256",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.encryptionAlgorithm = {
-	    parameterPath: ["options", "cpkInfo", "encryptionAlgorithm"],
-	    mapper: {
-	        serializedName: "x-ms-encryption-algorithm",
-	        xmlName: "x-ms-encryption-algorithm",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.ifMatch = {
-	    parameterPath: ["options", "modifiedAccessConditions", "ifMatch"],
-	    mapper: {
-	        serializedName: "If-Match",
-	        xmlName: "If-Match",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.ifNoneMatch = {
-	    parameterPath: ["options", "modifiedAccessConditions", "ifNoneMatch"],
-	    mapper: {
-	        serializedName: "If-None-Match",
-	        xmlName: "If-None-Match",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.ifTags = {
-	    parameterPath: ["options", "modifiedAccessConditions", "ifTags"],
-	    mapper: {
-	        serializedName: "x-ms-if-tags",
-	        xmlName: "x-ms-if-tags",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.deleteSnapshots = {
-	    parameterPath: ["options", "deleteSnapshots"],
-	    mapper: {
-	        serializedName: "x-ms-delete-snapshots",
-	        xmlName: "x-ms-delete-snapshots",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["include", "only"],
-	        },
-	    },
-	};
-	parameters.blobDeleteType = {
-	    parameterPath: ["options", "blobDeleteType"],
-	    mapper: {
-	        serializedName: "deletetype",
-	        xmlName: "deletetype",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp11 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "expiry",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.expiryOptions = {
-	    parameterPath: "expiryOptions",
-	    mapper: {
-	        serializedName: "x-ms-expiry-option",
-	        required: true,
-	        xmlName: "x-ms-expiry-option",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.expiresOn = {
-	    parameterPath: ["options", "expiresOn"],
-	    mapper: {
-	        serializedName: "x-ms-expiry-time",
-	        xmlName: "x-ms-expiry-time",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobCacheControl = {
-	    parameterPath: ["options", "blobHttpHeaders", "blobCacheControl"],
-	    mapper: {
-	        serializedName: "x-ms-blob-cache-control",
-	        xmlName: "x-ms-blob-cache-control",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobContentType = {
-	    parameterPath: ["options", "blobHttpHeaders", "blobContentType"],
-	    mapper: {
-	        serializedName: "x-ms-blob-content-type",
-	        xmlName: "x-ms-blob-content-type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobContentMD5 = {
-	    parameterPath: ["options", "blobHttpHeaders", "blobContentMD5"],
-	    mapper: {
-	        serializedName: "x-ms-blob-content-md5",
-	        xmlName: "x-ms-blob-content-md5",
-	        type: {
-	            name: "ByteArray",
-	        },
-	    },
-	};
-	parameters.blobContentEncoding = {
-	    parameterPath: ["options", "blobHttpHeaders", "blobContentEncoding"],
-	    mapper: {
-	        serializedName: "x-ms-blob-content-encoding",
-	        xmlName: "x-ms-blob-content-encoding",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobContentLanguage = {
-	    parameterPath: ["options", "blobHttpHeaders", "blobContentLanguage"],
-	    mapper: {
-	        serializedName: "x-ms-blob-content-language",
-	        xmlName: "x-ms-blob-content-language",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobContentDisposition = {
-	    parameterPath: ["options", "blobHttpHeaders", "blobContentDisposition"],
-	    mapper: {
-	        serializedName: "x-ms-blob-content-disposition",
-	        xmlName: "x-ms-blob-content-disposition",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp12 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "immutabilityPolicies",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.immutabilityPolicyExpiry = {
-	    parameterPath: ["options", "immutabilityPolicyExpiry"],
-	    mapper: {
-	        serializedName: "x-ms-immutability-policy-until-date",
-	        xmlName: "x-ms-immutability-policy-until-date",
-	        type: {
-	            name: "DateTimeRfc1123",
-	        },
-	    },
-	};
-	parameters.immutabilityPolicyMode = {
-	    parameterPath: ["options", "immutabilityPolicyMode"],
-	    mapper: {
-	        serializedName: "x-ms-immutability-policy-mode",
-	        xmlName: "x-ms-immutability-policy-mode",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["Mutable", "Unlocked", "Locked"],
-	        },
-	    },
-	};
-	parameters.comp13 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "legalhold",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.legalHold = {
-	    parameterPath: "legalHold",
-	    mapper: {
-	        serializedName: "x-ms-legal-hold",
-	        required: true,
-	        xmlName: "x-ms-legal-hold",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.encryptionScope = {
-	    parameterPath: ["options", "encryptionScope"],
-	    mapper: {
-	        serializedName: "x-ms-encryption-scope",
-	        xmlName: "x-ms-encryption-scope",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp14 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "snapshot",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.tier = {
-	    parameterPath: ["options", "tier"],
-	    mapper: {
-	        serializedName: "x-ms-access-tier",
-	        xmlName: "x-ms-access-tier",
-	        type: {
-	            name: "Enum",
-	            allowedValues: [
-	                "P4",
-	                "P6",
-	                "P10",
-	                "P15",
-	                "P20",
-	                "P30",
-	                "P40",
-	                "P50",
-	                "P60",
-	                "P70",
-	                "P80",
-	                "Hot",
-	                "Cool",
-	                "Archive",
-	                "Cold",
-	            ],
-	        },
-	    },
-	};
-	parameters.rehydratePriority = {
-	    parameterPath: ["options", "rehydratePriority"],
-	    mapper: {
-	        serializedName: "x-ms-rehydrate-priority",
-	        xmlName: "x-ms-rehydrate-priority",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["High", "Standard"],
-	        },
-	    },
-	};
-	parameters.sourceIfModifiedSince = {
-	    parameterPath: [
-	        "options",
-	        "sourceModifiedAccessConditions",
-	        "sourceIfModifiedSince",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-source-if-modified-since",
-	        xmlName: "x-ms-source-if-modified-since",
-	        type: {
-	            name: "DateTimeRfc1123",
-	        },
-	    },
-	};
-	parameters.sourceIfUnmodifiedSince = {
-	    parameterPath: [
-	        "options",
-	        "sourceModifiedAccessConditions",
-	        "sourceIfUnmodifiedSince",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-source-if-unmodified-since",
-	        xmlName: "x-ms-source-if-unmodified-since",
-	        type: {
-	            name: "DateTimeRfc1123",
-	        },
-	    },
-	};
-	parameters.sourceIfMatch = {
-	    parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfMatch"],
-	    mapper: {
-	        serializedName: "x-ms-source-if-match",
-	        xmlName: "x-ms-source-if-match",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceIfNoneMatch = {
-	    parameterPath: [
-	        "options",
-	        "sourceModifiedAccessConditions",
-	        "sourceIfNoneMatch",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-source-if-none-match",
-	        xmlName: "x-ms-source-if-none-match",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceIfTags = {
-	    parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfTags"],
-	    mapper: {
-	        serializedName: "x-ms-source-if-tags",
-	        xmlName: "x-ms-source-if-tags",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.copySource = {
-	    parameterPath: "copySource",
-	    mapper: {
-	        serializedName: "x-ms-copy-source",
-	        required: true,
-	        xmlName: "x-ms-copy-source",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobTagsString = {
-	    parameterPath: ["options", "blobTagsString"],
-	    mapper: {
-	        serializedName: "x-ms-tags",
-	        xmlName: "x-ms-tags",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sealBlob = {
-	    parameterPath: ["options", "sealBlob"],
-	    mapper: {
-	        serializedName: "x-ms-seal-blob",
-	        xmlName: "x-ms-seal-blob",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.legalHold1 = {
-	    parameterPath: ["options", "legalHold"],
-	    mapper: {
-	        serializedName: "x-ms-legal-hold",
-	        xmlName: "x-ms-legal-hold",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.xMsRequiresSync = {
-	    parameterPath: "xMsRequiresSync",
-	    mapper: {
-	        defaultValue: "true",
-	        isConstant: true,
-	        serializedName: "x-ms-requires-sync",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceContentMD5 = {
-	    parameterPath: ["options", "sourceContentMD5"],
-	    mapper: {
-	        serializedName: "x-ms-source-content-md5",
-	        xmlName: "x-ms-source-content-md5",
-	        type: {
-	            name: "ByteArray",
-	        },
-	    },
-	};
-	parameters.copySourceAuthorization = {
-	    parameterPath: ["options", "copySourceAuthorization"],
-	    mapper: {
-	        serializedName: "x-ms-copy-source-authorization",
-	        xmlName: "x-ms-copy-source-authorization",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.copySourceTags = {
-	    parameterPath: ["options", "copySourceTags"],
-	    mapper: {
-	        serializedName: "x-ms-copy-source-tag-option",
-	        xmlName: "x-ms-copy-source-tag-option",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["REPLACE", "COPY"],
-	        },
-	    },
-	};
-	parameters.fileRequestIntent = {
-	    parameterPath: ["options", "fileRequestIntent"],
-	    mapper: {
-	        serializedName: "x-ms-file-request-intent",
-	        xmlName: "x-ms-file-request-intent",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp15 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "copy",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.copyActionAbortConstant = {
-	    parameterPath: "copyActionAbortConstant",
-	    mapper: {
-	        defaultValue: "abort",
-	        isConstant: true,
-	        serializedName: "x-ms-copy-action",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.copyId = {
-	    parameterPath: "copyId",
-	    mapper: {
-	        serializedName: "copyid",
-	        required: true,
-	        xmlName: "copyid",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp16 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "tier",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.tier1 = {
-	    parameterPath: "tier",
-	    mapper: {
-	        serializedName: "x-ms-access-tier",
-	        required: true,
-	        xmlName: "x-ms-access-tier",
-	        type: {
-	            name: "Enum",
-	            allowedValues: [
-	                "P4",
-	                "P6",
-	                "P10",
-	                "P15",
-	                "P20",
-	                "P30",
-	                "P40",
-	                "P50",
-	                "P60",
-	                "P70",
-	                "P80",
-	                "Hot",
-	                "Cool",
-	                "Archive",
-	                "Cold",
-	            ],
-	        },
-	    },
-	};
-	parameters.queryRequest = {
-	    parameterPath: ["options", "queryRequest"],
-	    mapper: mappers_js_1.QueryRequest,
-	};
-	parameters.comp17 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "query",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp18 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "tags",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.tags = {
-	    parameterPath: ["options", "tags"],
-	    mapper: mappers_js_1.BlobTags,
-	};
-	parameters.transactionalContentMD5 = {
-	    parameterPath: ["options", "transactionalContentMD5"],
-	    mapper: {
-	        serializedName: "Content-MD5",
-	        xmlName: "Content-MD5",
-	        type: {
-	            name: "ByteArray",
-	        },
-	    },
-	};
-	parameters.transactionalContentCrc64 = {
-	    parameterPath: ["options", "transactionalContentCrc64"],
-	    mapper: {
-	        serializedName: "x-ms-content-crc64",
-	        xmlName: "x-ms-content-crc64",
-	        type: {
-	            name: "ByteArray",
-	        },
-	    },
-	};
-	parameters.blobType = {
-	    parameterPath: "blobType",
-	    mapper: {
-	        defaultValue: "PageBlob",
-	        isConstant: true,
-	        serializedName: "x-ms-blob-type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobContentLength = {
-	    parameterPath: "blobContentLength",
-	    mapper: {
-	        serializedName: "x-ms-blob-content-length",
-	        required: true,
-	        xmlName: "x-ms-blob-content-length",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.blobSequenceNumber = {
-	    parameterPath: ["options", "blobSequenceNumber"],
-	    mapper: {
-	        defaultValue: 0,
-	        serializedName: "x-ms-blob-sequence-number",
-	        xmlName: "x-ms-blob-sequence-number",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.contentType1 = {
-	    parameterPath: ["options", "contentType"],
-	    mapper: {
-	        defaultValue: "application/octet-stream",
-	        isConstant: true,
-	        serializedName: "Content-Type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.body1 = {
-	    parameterPath: "body",
-	    mapper: {
-	        serializedName: "body",
-	        required: true,
-	        xmlName: "body",
-	        type: {
-	            name: "Stream",
-	        },
-	    },
-	};
-	parameters.accept2 = {
-	    parameterPath: "accept",
-	    mapper: {
-	        defaultValue: "application/xml",
-	        isConstant: true,
-	        serializedName: "Accept",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp19 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "page",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.pageWrite = {
-	    parameterPath: "pageWrite",
-	    mapper: {
-	        defaultValue: "update",
-	        isConstant: true,
-	        serializedName: "x-ms-page-write",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.ifSequenceNumberLessThanOrEqualTo = {
-	    parameterPath: [
-	        "options",
-	        "sequenceNumberAccessConditions",
-	        "ifSequenceNumberLessThanOrEqualTo",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-if-sequence-number-le",
-	        xmlName: "x-ms-if-sequence-number-le",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.ifSequenceNumberLessThan = {
-	    parameterPath: [
-	        "options",
-	        "sequenceNumberAccessConditions",
-	        "ifSequenceNumberLessThan",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-if-sequence-number-lt",
-	        xmlName: "x-ms-if-sequence-number-lt",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.ifSequenceNumberEqualTo = {
-	    parameterPath: [
-	        "options",
-	        "sequenceNumberAccessConditions",
-	        "ifSequenceNumberEqualTo",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-if-sequence-number-eq",
-	        xmlName: "x-ms-if-sequence-number-eq",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.pageWrite1 = {
-	    parameterPath: "pageWrite",
-	    mapper: {
-	        defaultValue: "clear",
-	        isConstant: true,
-	        serializedName: "x-ms-page-write",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceUrl = {
-	    parameterPath: "sourceUrl",
-	    mapper: {
-	        serializedName: "x-ms-copy-source",
-	        required: true,
-	        xmlName: "x-ms-copy-source",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceRange = {
-	    parameterPath: "sourceRange",
-	    mapper: {
-	        serializedName: "x-ms-source-range",
-	        required: true,
-	        xmlName: "x-ms-source-range",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sourceContentCrc64 = {
-	    parameterPath: ["options", "sourceContentCrc64"],
-	    mapper: {
-	        serializedName: "x-ms-source-content-crc64",
-	        xmlName: "x-ms-source-content-crc64",
-	        type: {
-	            name: "ByteArray",
-	        },
-	    },
-	};
-	parameters.range1 = {
-	    parameterPath: "range",
-	    mapper: {
-	        serializedName: "x-ms-range",
-	        required: true,
-	        xmlName: "x-ms-range",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp20 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "pagelist",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.prevsnapshot = {
-	    parameterPath: ["options", "prevsnapshot"],
-	    mapper: {
-	        serializedName: "prevsnapshot",
-	        xmlName: "prevsnapshot",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.prevSnapshotUrl = {
-	    parameterPath: ["options", "prevSnapshotUrl"],
-	    mapper: {
-	        serializedName: "x-ms-previous-snapshot-url",
-	        xmlName: "x-ms-previous-snapshot-url",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.sequenceNumberAction = {
-	    parameterPath: "sequenceNumberAction",
-	    mapper: {
-	        serializedName: "x-ms-sequence-number-action",
-	        required: true,
-	        xmlName: "x-ms-sequence-number-action",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["max", "update", "increment"],
-	        },
-	    },
-	};
-	parameters.comp21 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "incrementalcopy",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobType1 = {
-	    parameterPath: "blobType",
-	    mapper: {
-	        defaultValue: "AppendBlob",
-	        isConstant: true,
-	        serializedName: "x-ms-blob-type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp22 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "appendblock",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.maxSize = {
-	    parameterPath: ["options", "appendPositionAccessConditions", "maxSize"],
-	    mapper: {
-	        serializedName: "x-ms-blob-condition-maxsize",
-	        xmlName: "x-ms-blob-condition-maxsize",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.appendPosition = {
-	    parameterPath: [
-	        "options",
-	        "appendPositionAccessConditions",
-	        "appendPosition",
-	    ],
-	    mapper: {
-	        serializedName: "x-ms-blob-condition-appendpos",
-	        xmlName: "x-ms-blob-condition-appendpos",
-	        type: {
-	            name: "Number",
-	        },
-	    },
-	};
-	parameters.sourceRange1 = {
-	    parameterPath: ["options", "sourceRange"],
-	    mapper: {
-	        serializedName: "x-ms-source-range",
-	        xmlName: "x-ms-source-range",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.comp23 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "seal",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blobType2 = {
-	    parameterPath: "blobType",
-	    mapper: {
-	        defaultValue: "BlockBlob",
-	        isConstant: true,
-	        serializedName: "x-ms-blob-type",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.copySourceBlobProperties = {
-	    parameterPath: ["options", "copySourceBlobProperties"],
-	    mapper: {
-	        serializedName: "x-ms-copy-source-blob-properties",
-	        xmlName: "x-ms-copy-source-blob-properties",
-	        type: {
-	            name: "Boolean",
-	        },
-	    },
-	};
-	parameters.comp24 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "block",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blockId = {
-	    parameterPath: "blockId",
-	    mapper: {
-	        serializedName: "blockid",
-	        required: true,
-	        xmlName: "blockid",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.blocks = {
-	    parameterPath: "blocks",
-	    mapper: mappers_js_1.BlockLookupList,
-	};
-	parameters.comp25 = {
-	    parameterPath: "comp",
-	    mapper: {
-	        defaultValue: "blocklist",
-	        isConstant: true,
-	        serializedName: "comp",
-	        type: {
-	            name: "String",
-	        },
-	    },
-	};
-	parameters.listType = {
-	    parameterPath: "listType",
-	    mapper: {
-	        defaultValue: "committed",
-	        serializedName: "blocklisttype",
-	        required: true,
-	        xmlName: "blocklisttype",
-	        type: {
-	            name: "Enum",
-	            allowedValues: ["committed", "uncommitted", "all"],
-	        },
-	    },
-	};
-	
-	return parameters;
-}
-
-var hasRequiredService$1;
-
-function requireService$1 () {
-	if (hasRequiredService$1) return service$1;
-	hasRequiredService$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(service$1, "__esModule", { value: true });
-	service$1.ServiceImpl = void 0;
-	const tslib_1 = require$$0$2;
-	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
-	const Mappers = tslib_1.__importStar(requireMappers());
-	const Parameters = tslib_1.__importStar(requireParameters());
-	/** Class containing Service operations. */
-	class ServiceImpl {
-	    client;
-	    /**
-	     * Initialize a new instance of the class Service class.
-	     * @param client Reference to the service client
-	     */
-	    constructor(client) {
-	        this.client = client;
-	    }
-	    /**
-	     * Sets properties for a storage account's Blob service endpoint, including properties for Storage
-	     * Analytics and CORS (Cross-Origin Resource Sharing) rules
-	     * @param blobServiceProperties The StorageService properties.
-	     * @param options The options parameters.
-	     */
-	    setProperties(blobServiceProperties, options) {
-	        return this.client.sendOperationRequest({ blobServiceProperties, options }, setPropertiesOperationSpec);
-	    }
-	    /**
-	     * gets the properties of a storage account's Blob service, including properties for Storage Analytics
-	     * and CORS (Cross-Origin Resource Sharing) rules.
-	     * @param options The options parameters.
-	     */
-	    getProperties(options) {
-	        return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
-	    }
-	    /**
-	     * Retrieves statistics related to replication for the Blob service. It is only available on the
-	     * secondary location endpoint when read-access geo-redundant replication is enabled for the storage
-	     * account.
-	     * @param options The options parameters.
-	     */
-	    getStatistics(options) {
-	        return this.client.sendOperationRequest({ options }, getStatisticsOperationSpec);
-	    }
-	    /**
-	     * The List Containers Segment operation returns a list of the containers under the specified account
-	     * @param options The options parameters.
-	     */
-	    listContainersSegment(options) {
-	        return this.client.sendOperationRequest({ options }, listContainersSegmentOperationSpec);
-	    }
-	    /**
-	     * Retrieves a user delegation key for the Blob service. This is only a valid operation when using
-	     * bearer token authentication.
-	     * @param keyInfo Key information
-	     * @param options The options parameters.
-	     */
-	    getUserDelegationKey(keyInfo, options) {
-	        return this.client.sendOperationRequest({ keyInfo, options }, getUserDelegationKeyOperationSpec);
-	    }
-	    /**
-	     * Returns the sku name and account kind
-	     * @param options The options parameters.
-	     */
-	    getAccountInfo(options) {
-	        return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
-	    }
-	    /**
-	     * The Batch operation allows multiple API calls to be embedded into a single HTTP request.
-	     * @param contentLength The length of the request.
-	     * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
-	     *                             boundary. Example header value: multipart/mixed; boundary=batch_
-	     * @param body Initial data
-	     * @param options The options parameters.
-	     */
-	    submitBatch(contentLength, multipartContentType, body, options) {
-	        return this.client.sendOperationRequest({ contentLength, multipartContentType, body, options }, submitBatchOperationSpec);
-	    }
-	    /**
-	     * The Filter Blobs operation enables callers to list blobs across all containers whose tags match a
-	     * given search expression.  Filter blobs searches across all containers within a storage account but
-	     * can be scoped within the expression to a single container.
-	     * @param options The options parameters.
-	     */
-	    filterBlobs(options) {
-	        return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec);
-	    }
-	}
-	service$1.ServiceImpl = ServiceImpl;
-	// Operation Specifications
-	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
-	const setPropertiesOperationSpec = {
-	    path: "/",
-	    httpMethod: "PUT",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.ServiceSetPropertiesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceSetPropertiesExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.blobServiceProperties,
-	    queryParameters: [
-	        Parameters.restype,
-	        Parameters.comp,
-	        Parameters.timeoutInSeconds,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.contentType,
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const getPropertiesOperationSpec = {
-	    path: "/",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.BlobServiceProperties,
-	            headersMapper: Mappers.ServiceGetPropertiesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceGetPropertiesExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.restype,
-	        Parameters.comp,
-	        Parameters.timeoutInSeconds,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getStatisticsOperationSpec = {
-	    path: "/",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.BlobServiceStatistics,
-	            headersMapper: Mappers.ServiceGetStatisticsHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceGetStatisticsExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.restype,
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp1,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const listContainersSegmentOperationSpec = {
-	    path: "/",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.ListContainersSegmentResponse,
-	            headersMapper: Mappers.ServiceListContainersSegmentHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceListContainersSegmentExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp2,
-	        Parameters.prefix,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.include,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getUserDelegationKeyOperationSpec = {
-	    path: "/",
-	    httpMethod: "POST",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.UserDelegationKey,
-	            headersMapper: Mappers.ServiceGetUserDelegationKeyHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceGetUserDelegationKeyExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.keyInfo,
-	    queryParameters: [
-	        Parameters.restype,
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp3,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.contentType,
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const getAccountInfoOperationSpec = {
-	    path: "/",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ServiceGetAccountInfoHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceGetAccountInfoExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.comp,
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype1,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const submitBatchOperationSpec = {
-	    path: "/",
-	    httpMethod: "POST",
-	    responses: {
-	        202: {
-	            bodyMapper: {
-	                type: { name: "Stream" },
-	                serializedName: "parsedResponse",
-	            },
-	            headersMapper: Mappers.ServiceSubmitBatchHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceSubmitBatchExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.body,
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp4],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.contentLength,
-	        Parameters.multipartContentType,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const filterBlobsOperationSpec = {
-	    path: "/",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.FilterBlobSegment,
-	            headersMapper: Mappers.ServiceFilterBlobsHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ServiceFilterBlobsExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.comp5,
-	        Parameters.where,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	
-	return service$1;
-}
-
-var container$1 = {};
-
-var hasRequiredContainer$1;
-
-function requireContainer$1 () {
-	if (hasRequiredContainer$1) return container$1;
-	hasRequiredContainer$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(container$1, "__esModule", { value: true });
-	container$1.ContainerImpl = void 0;
-	const tslib_1 = require$$0$2;
-	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
-	const Mappers = tslib_1.__importStar(requireMappers());
-	const Parameters = tslib_1.__importStar(requireParameters());
-	/** Class containing Container operations. */
-	class ContainerImpl {
-	    client;
-	    /**
-	     * Initialize a new instance of the class Container class.
-	     * @param client Reference to the service client
-	     */
-	    constructor(client) {
-	        this.client = client;
-	    }
-	    /**
-	     * creates a new container under the specified account. If the container with the same name already
-	     * exists, the operation fails
-	     * @param options The options parameters.
-	     */
-	    create(options) {
-	        return this.client.sendOperationRequest({ options }, createOperationSpec);
-	    }
-	    /**
-	     * returns all user-defined metadata and system properties for the specified container. The data
-	     * returned does not include the container's list of blobs
-	     * @param options The options parameters.
-	     */
-	    getProperties(options) {
-	        return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
-	    }
-	    /**
-	     * operation marks the specified container for deletion. The container and any blobs contained within
-	     * it are later deleted during garbage collection
-	     * @param options The options parameters.
-	     */
-	    delete(options) {
-	        return this.client.sendOperationRequest({ options }, deleteOperationSpec);
-	    }
-	    /**
-	     * operation sets one or more user-defined name-value pairs for the specified container.
-	     * @param options The options parameters.
-	     */
-	    setMetadata(options) {
-	        return this.client.sendOperationRequest({ options }, setMetadataOperationSpec);
-	    }
-	    /**
-	     * gets the permissions for the specified container. The permissions indicate whether container data
-	     * may be accessed publicly.
-	     * @param options The options parameters.
-	     */
-	    getAccessPolicy(options) {
-	        return this.client.sendOperationRequest({ options }, getAccessPolicyOperationSpec);
-	    }
-	    /**
-	     * sets the permissions for the specified container. The permissions indicate whether blobs in a
-	     * container may be accessed publicly.
-	     * @param options The options parameters.
-	     */
-	    setAccessPolicy(options) {
-	        return this.client.sendOperationRequest({ options }, setAccessPolicyOperationSpec);
-	    }
-	    /**
-	     * Restores a previously-deleted container.
-	     * @param options The options parameters.
-	     */
-	    restore(options) {
-	        return this.client.sendOperationRequest({ options }, restoreOperationSpec);
-	    }
-	    /**
-	     * Renames an existing container.
-	     * @param sourceContainerName Required.  Specifies the name of the container to rename.
-	     * @param options The options parameters.
-	     */
-	    rename(sourceContainerName, options) {
-	        return this.client.sendOperationRequest({ sourceContainerName, options }, renameOperationSpec);
-	    }
-	    /**
-	     * The Batch operation allows multiple API calls to be embedded into a single HTTP request.
-	     * @param contentLength The length of the request.
-	     * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
-	     *                             boundary. Example header value: multipart/mixed; boundary=batch_
-	     * @param body Initial data
-	     * @param options The options parameters.
-	     */
-	    submitBatch(contentLength, multipartContentType, body, options) {
-	        return this.client.sendOperationRequest({ contentLength, multipartContentType, body, options }, submitBatchOperationSpec);
-	    }
-	    /**
-	     * The Filter Blobs operation enables callers to list blobs in a container whose tags match a given
-	     * search expression.  Filter blobs searches within the given container.
-	     * @param options The options parameters.
-	     */
-	    filterBlobs(options) {
-	        return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec);
-	    }
-	    /**
-	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
-	     * be 15 to 60 seconds, or can be infinite
-	     * @param options The options parameters.
-	     */
-	    acquireLease(options) {
-	        return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
-	     * be 15 to 60 seconds, or can be infinite
-	     * @param leaseId Specifies the current lease ID on the resource.
-	     * @param options The options parameters.
-	     */
-	    releaseLease(leaseId, options) {
-	        return this.client.sendOperationRequest({ leaseId, options }, releaseLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
-	     * be 15 to 60 seconds, or can be infinite
-	     * @param leaseId Specifies the current lease ID on the resource.
-	     * @param options The options parameters.
-	     */
-	    renewLease(leaseId, options) {
-	        return this.client.sendOperationRequest({ leaseId, options }, renewLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
-	     * be 15 to 60 seconds, or can be infinite
-	     * @param options The options parameters.
-	     */
-	    breakLease(options) {
-	        return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
-	     * be 15 to 60 seconds, or can be infinite
-	     * @param leaseId Specifies the current lease ID on the resource.
-	     * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
-	     *                        (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
-	     *                        (String) for a list of valid GUID string formats.
-	     * @param options The options parameters.
-	     */
-	    changeLease(leaseId, proposedLeaseId, options) {
-	        return this.client.sendOperationRequest({ leaseId, proposedLeaseId, options }, changeLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] The List Blobs operation returns a list of the blobs under the specified container
-	     * @param options The options parameters.
-	     */
-	    listBlobFlatSegment(options) {
-	        return this.client.sendOperationRequest({ options }, listBlobFlatSegmentOperationSpec);
-	    }
-	    /**
-	     * [Update] The List Blobs operation returns a list of the blobs under the specified container
-	     * @param delimiter When the request includes this parameter, the operation returns a BlobPrefix
-	     *                  element in the response body that acts as a placeholder for all blobs whose names begin with the
-	     *                  same substring up to the appearance of the delimiter character. The delimiter may be a single
-	     *                  character or a string.
-	     * @param options The options parameters.
-	     */
-	    listBlobHierarchySegment(delimiter, options) {
-	        return this.client.sendOperationRequest({ delimiter, options }, listBlobHierarchySegmentOperationSpec);
-	    }
-	    /**
-	     * Returns the sku name and account kind
-	     * @param options The options parameters.
-	     */
-	    getAccountInfo(options) {
-	        return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
-	    }
-	}
-	container$1.ContainerImpl = ContainerImpl;
-	// Operation Specifications
-	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
-	const createOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.ContainerCreateHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerCreateExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.metadata,
-	        Parameters.access,
-	        Parameters.defaultEncryptionScope,
-	        Parameters.preventEncryptionScopeOverride,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getPropertiesOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerGetPropertiesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerGetPropertiesExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const deleteOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "DELETE",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.ContainerDeleteHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerDeleteExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setMetadataOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerSetMetadataHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerSetMetadataExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp6,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getAccessPolicyOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: {
-	                type: {
-	                    name: "Sequence",
-	                    element: {
-	                        type: { name: "Composite", className: "SignedIdentifier" },
-	                    },
-	                },
-	                serializedName: "SignedIdentifiers",
-	                xmlName: "SignedIdentifiers",
-	                xmlIsWrapped: true,
-	                xmlElementName: "SignedIdentifier",
-	            },
-	            headersMapper: Mappers.ContainerGetAccessPolicyHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerGetAccessPolicyExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp7,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setAccessPolicyOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerSetAccessPolicyHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerSetAccessPolicyExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.containerAcl,
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp7,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.contentType,
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.access,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const restoreOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.ContainerRestoreHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerRestoreExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp8,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.deletedContainerName,
-	        Parameters.deletedContainerVersion,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const renameOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerRenameHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerRenameExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp9,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.sourceContainerName,
-	        Parameters.sourceLeaseId,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const submitBatchOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "POST",
-	    responses: {
-	        202: {
-	            bodyMapper: {
-	                type: { name: "Stream" },
-	                serializedName: "parsedResponse",
-	            },
-	            headersMapper: Mappers.ContainerSubmitBatchHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerSubmitBatchExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.body,
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp4,
-	        Parameters.restype2,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.contentLength,
-	        Parameters.multipartContentType,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const filterBlobsOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.FilterBlobSegment,
-	            headersMapper: Mappers.ContainerFilterBlobsHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerFilterBlobsExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.comp5,
-	        Parameters.where,
-	        Parameters.restype2,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const acquireLeaseOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.ContainerAcquireLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerAcquireLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp10,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.action,
-	        Parameters.duration,
-	        Parameters.proposedLeaseId,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const releaseLeaseOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerReleaseLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerReleaseLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp10,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.action1,
-	        Parameters.leaseId1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const renewLeaseOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerRenewLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerRenewLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp10,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.leaseId1,
-	        Parameters.action2,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const breakLeaseOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.ContainerBreakLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerBreakLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp10,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.action3,
-	        Parameters.breakPeriod,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const changeLeaseOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerChangeLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerChangeLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype2,
-	        Parameters.comp10,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.leaseId1,
-	        Parameters.action4,
-	        Parameters.proposedLeaseId1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const listBlobFlatSegmentOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.ListBlobsFlatSegmentResponse,
-	            headersMapper: Mappers.ContainerListBlobFlatSegmentHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerListBlobFlatSegmentExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp2,
-	        Parameters.prefix,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.restype2,
-	        Parameters.include1,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const listBlobHierarchySegmentOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.ListBlobsHierarchySegmentResponse,
-	            headersMapper: Mappers.ContainerListBlobHierarchySegmentHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerListBlobHierarchySegmentExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp2,
-	        Parameters.prefix,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.restype2,
-	        Parameters.include1,
-	        Parameters.delimiter,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getAccountInfoOperationSpec = {
-	    path: "/{containerName}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.ContainerGetAccountInfoHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.ContainerGetAccountInfoExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.comp,
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype1,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	
-	return container$1;
-}
-
-var blob$1 = {};
-
-var hasRequiredBlob$1;
-
-function requireBlob$1 () {
-	if (hasRequiredBlob$1) return blob$1;
-	hasRequiredBlob$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(blob$1, "__esModule", { value: true });
-	blob$1.BlobImpl = void 0;
-	const tslib_1 = require$$0$2;
-	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
-	const Mappers = tslib_1.__importStar(requireMappers());
-	const Parameters = tslib_1.__importStar(requireParameters());
-	/** Class containing Blob operations. */
-	class BlobImpl {
-	    client;
-	    /**
-	     * Initialize a new instance of the class Blob class.
-	     * @param client Reference to the service client
-	     */
-	    constructor(client) {
-	        this.client = client;
-	    }
-	    /**
-	     * The Download operation reads or downloads a blob from the system, including its metadata and
-	     * properties. You can also call Download to read a snapshot.
-	     * @param options The options parameters.
-	     */
-	    download(options) {
-	        return this.client.sendOperationRequest({ options }, downloadOperationSpec);
-	    }
-	    /**
-	     * The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system
-	     * properties for the blob. It does not return the content of the blob.
-	     * @param options The options parameters.
-	     */
-	    getProperties(options) {
-	        return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
-	    }
-	    /**
-	     * If the storage account's soft delete feature is disabled then, when a blob is deleted, it is
-	     * permanently removed from the storage account. If the storage account's soft delete feature is
-	     * enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible
-	     * immediately. However, the blob service retains the blob or snapshot for the number of days specified
-	     * by the DeleteRetentionPolicy section of [Storage service properties]
-	     * (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is
-	     * permanently removed from the storage account. Note that you continue to be charged for the
-	     * soft-deleted blob's storage until it is permanently removed. Use the List Blobs API and specify the
-	     * "include=deleted" query parameter to discover which blobs and snapshots have been soft deleted. You
-	     * can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a
-	     * soft-deleted blob or snapshot causes the service to return an HTTP status code of 404
-	     * (ResourceNotFound).
-	     * @param options The options parameters.
-	     */
-	    delete(options) {
-	        return this.client.sendOperationRequest({ options }, deleteOperationSpec);
-	    }
-	    /**
-	     * Undelete a blob that was previously soft deleted
-	     * @param options The options parameters.
-	     */
-	    undelete(options) {
-	        return this.client.sendOperationRequest({ options }, undeleteOperationSpec);
-	    }
-	    /**
-	     * Sets the time a blob will expire and be deleted.
-	     * @param expiryOptions Required. Indicates mode of the expiry time
-	     * @param options The options parameters.
-	     */
-	    setExpiry(expiryOptions, options) {
-	        return this.client.sendOperationRequest({ expiryOptions, options }, setExpiryOperationSpec);
-	    }
-	    /**
-	     * The Set HTTP Headers operation sets system properties on the blob
-	     * @param options The options parameters.
-	     */
-	    setHttpHeaders(options) {
-	        return this.client.sendOperationRequest({ options }, setHttpHeadersOperationSpec);
-	    }
-	    /**
-	     * The Set Immutability Policy operation sets the immutability policy on the blob
-	     * @param options The options parameters.
-	     */
-	    setImmutabilityPolicy(options) {
-	        return this.client.sendOperationRequest({ options }, setImmutabilityPolicyOperationSpec);
-	    }
-	    /**
-	     * The Delete Immutability Policy operation deletes the immutability policy on the blob
-	     * @param options The options parameters.
-	     */
-	    deleteImmutabilityPolicy(options) {
-	        return this.client.sendOperationRequest({ options }, deleteImmutabilityPolicyOperationSpec);
-	    }
-	    /**
-	     * The Set Legal Hold operation sets a legal hold on the blob.
-	     * @param legalHold Specified if a legal hold should be set on the blob.
-	     * @param options The options parameters.
-	     */
-	    setLegalHold(legalHold, options) {
-	        return this.client.sendOperationRequest({ legalHold, options }, setLegalHoldOperationSpec);
-	    }
-	    /**
-	     * The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more
-	     * name-value pairs
-	     * @param options The options parameters.
-	     */
-	    setMetadata(options) {
-	        return this.client.sendOperationRequest({ options }, setMetadataOperationSpec);
-	    }
-	    /**
-	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
-	     * operations
-	     * @param options The options parameters.
-	     */
-	    acquireLease(options) {
-	        return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
-	     * operations
-	     * @param leaseId Specifies the current lease ID on the resource.
-	     * @param options The options parameters.
-	     */
-	    releaseLease(leaseId, options) {
-	        return this.client.sendOperationRequest({ leaseId, options }, releaseLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
-	     * operations
-	     * @param leaseId Specifies the current lease ID on the resource.
-	     * @param options The options parameters.
-	     */
-	    renewLease(leaseId, options) {
-	        return this.client.sendOperationRequest({ leaseId, options }, renewLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
-	     * operations
-	     * @param leaseId Specifies the current lease ID on the resource.
-	     * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
-	     *                        (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
-	     *                        (String) for a list of valid GUID string formats.
-	     * @param options The options parameters.
-	     */
-	    changeLease(leaseId, proposedLeaseId, options) {
-	        return this.client.sendOperationRequest({ leaseId, proposedLeaseId, options }, changeLeaseOperationSpec);
-	    }
-	    /**
-	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
-	     * operations
-	     * @param options The options parameters.
-	     */
-	    breakLease(options) {
-	        return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec);
-	    }
-	    /**
-	     * The Create Snapshot operation creates a read-only snapshot of a blob
-	     * @param options The options parameters.
-	     */
-	    createSnapshot(options) {
-	        return this.client.sendOperationRequest({ options }, createSnapshotOperationSpec);
-	    }
-	    /**
-	     * The Start Copy From URL operation copies a blob or an internet resource to a new blob.
-	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
-	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
-	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
-	     *                   access signature.
-	     * @param options The options parameters.
-	     */
-	    startCopyFromURL(copySource, options) {
-	        return this.client.sendOperationRequest({ copySource, options }, startCopyFromURLOperationSpec);
-	    }
-	    /**
-	     * The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return
-	     * a response until the copy is complete.
-	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
-	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
-	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
-	     *                   access signature.
-	     * @param options The options parameters.
-	     */
-	    copyFromURL(copySource, options) {
-	        return this.client.sendOperationRequest({ copySource, options }, copyFromURLOperationSpec);
-	    }
-	    /**
-	     * The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination
-	     * blob with zero length and full metadata.
-	     * @param copyId The copy identifier provided in the x-ms-copy-id header of the original Copy Blob
-	     *               operation.
-	     * @param options The options parameters.
-	     */
-	    abortCopyFromURL(copyId, options) {
-	        return this.client.sendOperationRequest({ copyId, options }, abortCopyFromURLOperationSpec);
-	    }
-	    /**
-	     * The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium
-	     * storage account and on a block blob in a blob storage account (locally redundant storage only). A
-	     * premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block
-	     * blob's tier determines Hot/Cool/Archive storage type. This operation does not update the blob's
-	     * ETag.
-	     * @param tier Indicates the tier to be set on the blob.
-	     * @param options The options parameters.
-	     */
-	    setTier(tier, options) {
-	        return this.client.sendOperationRequest({ tier, options }, setTierOperationSpec);
-	    }
-	    /**
-	     * Returns the sku name and account kind
-	     * @param options The options parameters.
-	     */
-	    getAccountInfo(options) {
-	        return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
-	    }
-	    /**
-	     * The Query operation enables users to select/project on blob data by providing simple query
-	     * expressions.
-	     * @param options The options parameters.
-	     */
-	    query(options) {
-	        return this.client.sendOperationRequest({ options }, queryOperationSpec);
-	    }
-	    /**
-	     * The Get Tags operation enables users to get the tags associated with a blob.
-	     * @param options The options parameters.
-	     */
-	    getTags(options) {
-	        return this.client.sendOperationRequest({ options }, getTagsOperationSpec);
-	    }
-	    /**
-	     * The Set Tags operation enables users to set tags on a blob.
-	     * @param options The options parameters.
-	     */
-	    setTags(options) {
-	        return this.client.sendOperationRequest({ options }, setTagsOperationSpec);
-	    }
-	}
-	blob$1.BlobImpl = BlobImpl;
-	// Operation Specifications
-	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
-	const downloadOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: {
-	                type: { name: "Stream" },
-	                serializedName: "parsedResponse",
-	            },
-	            headersMapper: Mappers.BlobDownloadHeaders,
-	        },
-	        206: {
-	            bodyMapper: {
-	                type: { name: "Stream" },
-	                serializedName: "parsedResponse",
-	            },
-	            headersMapper: Mappers.BlobDownloadHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobDownloadExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.range,
-	        Parameters.rangeGetContentMD5,
-	        Parameters.rangeGetContentCRC64,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getPropertiesOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "HEAD",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobGetPropertiesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobGetPropertiesExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const deleteOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "DELETE",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.BlobDeleteHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobDeleteExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	        Parameters.blobDeleteType,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.deleteSnapshots,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const undeleteOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobUndeleteHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobUndeleteExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp8],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setExpiryOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobSetExpiryHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetExpiryExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp11],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.expiryOptions,
-	        Parameters.expiresOn,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setHttpHeadersOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobSetHttpHeadersHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetHttpHeadersExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobCacheControl,
-	        Parameters.blobContentType,
-	        Parameters.blobContentMD5,
-	        Parameters.blobContentEncoding,
-	        Parameters.blobContentLanguage,
-	        Parameters.blobContentDisposition,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setImmutabilityPolicyOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobSetImmutabilityPolicyHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetImmutabilityPolicyExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	        Parameters.comp12,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const deleteImmutabilityPolicyOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "DELETE",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobDeleteImmutabilityPolicyHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobDeleteImmutabilityPolicyExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	        Parameters.comp12,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setLegalHoldOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobSetLegalHoldHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetLegalHoldExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	        Parameters.comp13,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.legalHold,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setMetadataOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobSetMetadataHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetMetadataExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp6],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const acquireLeaseOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlobAcquireLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobAcquireLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.action,
-	        Parameters.duration,
-	        Parameters.proposedLeaseId,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const releaseLeaseOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobReleaseLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobReleaseLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.action1,
-	        Parameters.leaseId1,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const renewLeaseOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobRenewLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobRenewLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.leaseId1,
-	        Parameters.action2,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const changeLeaseOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobChangeLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobChangeLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.leaseId1,
-	        Parameters.action4,
-	        Parameters.proposedLeaseId1,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const breakLeaseOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.BlobBreakLeaseHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobBreakLeaseExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.action3,
-	        Parameters.breakPeriod,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const createSnapshotOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlobCreateSnapshotHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobCreateSnapshotExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp14],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const startCopyFromURLOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.BlobStartCopyFromURLHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobStartCopyFromURLExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	        Parameters.tier,
-	        Parameters.rehydratePriority,
-	        Parameters.sourceIfModifiedSince,
-	        Parameters.sourceIfUnmodifiedSince,
-	        Parameters.sourceIfMatch,
-	        Parameters.sourceIfNoneMatch,
-	        Parameters.sourceIfTags,
-	        Parameters.copySource,
-	        Parameters.blobTagsString,
-	        Parameters.sealBlob,
-	        Parameters.legalHold1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const copyFromURLOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.BlobCopyFromURLHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobCopyFromURLExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	        Parameters.encryptionScope,
-	        Parameters.tier,
-	        Parameters.sourceIfModifiedSince,
-	        Parameters.sourceIfUnmodifiedSince,
-	        Parameters.sourceIfMatch,
-	        Parameters.sourceIfNoneMatch,
-	        Parameters.copySource,
-	        Parameters.blobTagsString,
-	        Parameters.legalHold1,
-	        Parameters.xMsRequiresSync,
-	        Parameters.sourceContentMD5,
-	        Parameters.copySourceAuthorization,
-	        Parameters.copySourceTags,
-	        Parameters.fileRequestIntent,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const abortCopyFromURLOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        204: {
-	            headersMapper: Mappers.BlobAbortCopyFromURLHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobAbortCopyFromURLExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp15,
-	        Parameters.copyId,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.copyActionAbortConstant,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setTierOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobSetTierHeaders,
-	        },
-	        202: {
-	            headersMapper: Mappers.BlobSetTierHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetTierExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	        Parameters.comp16,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifTags,
-	        Parameters.rehydratePriority,
-	        Parameters.tier1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getAccountInfoOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.BlobGetAccountInfoHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobGetAccountInfoExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.comp,
-	        Parameters.timeoutInSeconds,
-	        Parameters.restype1,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const queryOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "POST",
-	    responses: {
-	        200: {
-	            bodyMapper: {
-	                type: { name: "Stream" },
-	                serializedName: "parsedResponse",
-	            },
-	            headersMapper: Mappers.BlobQueryHeaders,
-	        },
-	        206: {
-	            bodyMapper: {
-	                type: { name: "Stream" },
-	                serializedName: "parsedResponse",
-	            },
-	            headersMapper: Mappers.BlobQueryHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobQueryExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.queryRequest,
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.comp17,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.contentType,
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const getTagsOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.BlobTags,
-	            headersMapper: Mappers.BlobGetTagsHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobGetTagsExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.versionId,
-	        Parameters.comp18,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const setTagsOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        204: {
-	            headersMapper: Mappers.BlobSetTagsHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlobSetTagsExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.tags,
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.versionId,
-	        Parameters.comp18,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.contentType,
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.leaseId,
-	        Parameters.ifTags,
-	        Parameters.transactionalContentMD5,
-	        Parameters.transactionalContentCrc64,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	
-	return blob$1;
-}
-
-var pageBlob$1 = {};
-
-var hasRequiredPageBlob$1;
-
-function requirePageBlob$1 () {
-	if (hasRequiredPageBlob$1) return pageBlob$1;
-	hasRequiredPageBlob$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(pageBlob$1, "__esModule", { value: true });
-	pageBlob$1.PageBlobImpl = void 0;
-	const tslib_1 = require$$0$2;
-	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
-	const Mappers = tslib_1.__importStar(requireMappers());
-	const Parameters = tslib_1.__importStar(requireParameters());
-	/** Class containing PageBlob operations. */
-	class PageBlobImpl {
-	    client;
-	    /**
-	     * Initialize a new instance of the class PageBlob class.
-	     * @param client Reference to the service client
-	     */
-	    constructor(client) {
-	        this.client = client;
-	    }
-	    /**
-	     * The Create operation creates a new page blob.
-	     * @param contentLength The length of the request.
-	     * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
-	     *                          page blob size must be aligned to a 512-byte boundary.
-	     * @param options The options parameters.
-	     */
-	    create(contentLength, blobContentLength, options) {
-	        return this.client.sendOperationRequest({ contentLength, blobContentLength, options }, createOperationSpec);
-	    }
-	    /**
-	     * The Upload Pages operation writes a range of pages to a page blob
-	     * @param contentLength The length of the request.
-	     * @param body Initial data
-	     * @param options The options parameters.
-	     */
-	    uploadPages(contentLength, body, options) {
-	        return this.client.sendOperationRequest({ contentLength, body, options }, uploadPagesOperationSpec);
-	    }
-	    /**
-	     * The Clear Pages operation clears a set of pages from a page blob
-	     * @param contentLength The length of the request.
-	     * @param options The options parameters.
-	     */
-	    clearPages(contentLength, options) {
-	        return this.client.sendOperationRequest({ contentLength, options }, clearPagesOperationSpec);
-	    }
-	    /**
-	     * The Upload Pages operation writes a range of pages to a page blob where the contents are read from a
-	     * URL
-	     * @param sourceUrl Specify a URL to the copy source.
-	     * @param sourceRange Bytes of source data in the specified range. The length of this range should
-	     *                    match the ContentLength header and x-ms-range/Range destination range header.
-	     * @param contentLength The length of the request.
-	     * @param range The range of bytes to which the source range would be written. The range should be 512
-	     *              aligned and range-end is required.
-	     * @param options The options parameters.
-	     */
-	    uploadPagesFromURL(sourceUrl, sourceRange, contentLength, range, options) {
-	        return this.client.sendOperationRequest({ sourceUrl, sourceRange, contentLength, range, options }, uploadPagesFromURLOperationSpec);
-	    }
-	    /**
-	     * The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a
-	     * page blob
-	     * @param options The options parameters.
-	     */
-	    getPageRanges(options) {
-	        return this.client.sendOperationRequest({ options }, getPageRangesOperationSpec);
-	    }
-	    /**
-	     * The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were
-	     * changed between target blob and previous snapshot.
-	     * @param options The options parameters.
-	     */
-	    getPageRangesDiff(options) {
-	        return this.client.sendOperationRequest({ options }, getPageRangesDiffOperationSpec);
-	    }
-	    /**
-	     * Resize the Blob
-	     * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
-	     *                          page blob size must be aligned to a 512-byte boundary.
-	     * @param options The options parameters.
-	     */
-	    resize(blobContentLength, options) {
-	        return this.client.sendOperationRequest({ blobContentLength, options }, resizeOperationSpec);
-	    }
-	    /**
-	     * Update the sequence number of the blob
-	     * @param sequenceNumberAction Required if the x-ms-blob-sequence-number header is set for the request.
-	     *                             This property applies to page blobs only. This property indicates how the service should modify the
-	     *                             blob's sequence number
-	     * @param options The options parameters.
-	     */
-	    updateSequenceNumber(sequenceNumberAction, options) {
-	        return this.client.sendOperationRequest({ sequenceNumberAction, options }, updateSequenceNumberOperationSpec);
-	    }
-	    /**
-	     * The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.
-	     * The snapshot is copied such that only the differential changes between the previously copied
-	     * snapshot are transferred to the destination. The copied snapshots are complete copies of the
-	     * original snapshot and can be read or copied from as usual. This API is supported since REST version
-	     * 2016-05-31.
-	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
-	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
-	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
-	     *                   access signature.
-	     * @param options The options parameters.
-	     */
-	    copyIncremental(copySource, options) {
-	        return this.client.sendOperationRequest({ copySource, options }, copyIncrementalOperationSpec);
-	    }
-	}
-	pageBlob$1.PageBlobImpl = PageBlobImpl;
-	// Operation Specifications
-	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
-	const createOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.PageBlobCreateHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobCreateExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobCacheControl,
-	        Parameters.blobContentType,
-	        Parameters.blobContentMD5,
-	        Parameters.blobContentEncoding,
-	        Parameters.blobContentLanguage,
-	        Parameters.blobContentDisposition,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	        Parameters.encryptionScope,
-	        Parameters.tier,
-	        Parameters.blobTagsString,
-	        Parameters.legalHold1,
-	        Parameters.blobType,
-	        Parameters.blobContentLength,
-	        Parameters.blobSequenceNumber,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const uploadPagesOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.PageBlobUploadPagesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobUploadPagesExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.body1,
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.range,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	        Parameters.transactionalContentMD5,
-	        Parameters.transactionalContentCrc64,
-	        Parameters.contentType1,
-	        Parameters.accept2,
-	        Parameters.pageWrite,
-	        Parameters.ifSequenceNumberLessThanOrEqualTo,
-	        Parameters.ifSequenceNumberLessThan,
-	        Parameters.ifSequenceNumberEqualTo,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "binary",
-	    serializer: xmlSerializer,
-	};
-	const clearPagesOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.PageBlobClearPagesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobClearPagesExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.range,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	        Parameters.ifSequenceNumberLessThanOrEqualTo,
-	        Parameters.ifSequenceNumberLessThan,
-	        Parameters.ifSequenceNumberEqualTo,
-	        Parameters.pageWrite1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const uploadPagesFromURLOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.PageBlobUploadPagesFromURLHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobUploadPagesFromURLExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	        Parameters.sourceIfModifiedSince,
-	        Parameters.sourceIfUnmodifiedSince,
-	        Parameters.sourceIfMatch,
-	        Parameters.sourceIfNoneMatch,
-	        Parameters.sourceContentMD5,
-	        Parameters.copySourceAuthorization,
-	        Parameters.fileRequestIntent,
-	        Parameters.pageWrite,
-	        Parameters.ifSequenceNumberLessThanOrEqualTo,
-	        Parameters.ifSequenceNumberLessThan,
-	        Parameters.ifSequenceNumberEqualTo,
-	        Parameters.sourceUrl,
-	        Parameters.sourceRange,
-	        Parameters.sourceContentCrc64,
-	        Parameters.range1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getPageRangesOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.PageList,
-	            headersMapper: Mappers.PageBlobGetPageRangesHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobGetPageRangesExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.snapshot,
-	        Parameters.comp20,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.range,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const getPageRangesDiffOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.PageList,
-	            headersMapper: Mappers.PageBlobGetPageRangesDiffHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobGetPageRangesDiffExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.marker,
-	        Parameters.maxPageSize,
-	        Parameters.snapshot,
-	        Parameters.comp20,
-	        Parameters.prevsnapshot,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.range,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.prevSnapshotUrl,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const resizeOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.PageBlobResizeHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobResizeExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	        Parameters.blobContentLength,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const updateSequenceNumberOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.PageBlobUpdateSequenceNumberHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobUpdateSequenceNumberExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobSequenceNumber,
-	        Parameters.sequenceNumberAction,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const copyIncrementalOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        202: {
-	            headersMapper: Mappers.PageBlobCopyIncrementalHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.PageBlobCopyIncrementalExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp21],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.copySource,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	
-	return pageBlob$1;
-}
-
-var appendBlob$1 = {};
-
-var hasRequiredAppendBlob$1;
-
-function requireAppendBlob$1 () {
-	if (hasRequiredAppendBlob$1) return appendBlob$1;
-	hasRequiredAppendBlob$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(appendBlob$1, "__esModule", { value: true });
-	appendBlob$1.AppendBlobImpl = void 0;
-	const tslib_1 = require$$0$2;
-	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
-	const Mappers = tslib_1.__importStar(requireMappers());
-	const Parameters = tslib_1.__importStar(requireParameters());
-	/** Class containing AppendBlob operations. */
-	class AppendBlobImpl {
-	    client;
-	    /**
-	     * Initialize a new instance of the class AppendBlob class.
-	     * @param client Reference to the service client
-	     */
-	    constructor(client) {
-	        this.client = client;
-	    }
-	    /**
-	     * The Create Append Blob operation creates a new append blob.
-	     * @param contentLength The length of the request.
-	     * @param options The options parameters.
-	     */
-	    create(contentLength, options) {
-	        return this.client.sendOperationRequest({ contentLength, options }, createOperationSpec);
-	    }
-	    /**
-	     * The Append Block operation commits a new block of data to the end of an existing append blob. The
-	     * Append Block operation is permitted only if the blob was created with x-ms-blob-type set to
-	     * AppendBlob. Append Block is supported only on version 2015-02-21 version or later.
-	     * @param contentLength The length of the request.
-	     * @param body Initial data
-	     * @param options The options parameters.
-	     */
-	    appendBlock(contentLength, body, options) {
-	        return this.client.sendOperationRequest({ contentLength, body, options }, appendBlockOperationSpec);
-	    }
-	    /**
-	     * The Append Block operation commits a new block of data to the end of an existing append blob where
-	     * the contents are read from a source url. The Append Block operation is permitted only if the blob
-	     * was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version
-	     * 2015-02-21 version or later.
-	     * @param sourceUrl Specify a URL to the copy source.
-	     * @param contentLength The length of the request.
-	     * @param options The options parameters.
-	     */
-	    appendBlockFromUrl(sourceUrl, contentLength, options) {
-	        return this.client.sendOperationRequest({ sourceUrl, contentLength, options }, appendBlockFromUrlOperationSpec);
-	    }
-	    /**
-	     * The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version
-	     * 2019-12-12 version or later.
-	     * @param options The options parameters.
-	     */
-	    seal(options) {
-	        return this.client.sendOperationRequest({ options }, sealOperationSpec);
-	    }
-	}
-	appendBlob$1.AppendBlobImpl = AppendBlobImpl;
-	// Operation Specifications
-	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
-	const createOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.AppendBlobCreateHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.AppendBlobCreateExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobCacheControl,
-	        Parameters.blobContentType,
-	        Parameters.blobContentMD5,
-	        Parameters.blobContentEncoding,
-	        Parameters.blobContentLanguage,
-	        Parameters.blobContentDisposition,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	        Parameters.encryptionScope,
-	        Parameters.blobTagsString,
-	        Parameters.legalHold1,
-	        Parameters.blobType1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const appendBlockOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.AppendBlobAppendBlockHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.AppendBlobAppendBlockExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.body1,
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp22],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	        Parameters.transactionalContentMD5,
-	        Parameters.transactionalContentCrc64,
-	        Parameters.contentType1,
-	        Parameters.accept2,
-	        Parameters.maxSize,
-	        Parameters.appendPosition,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "binary",
-	    serializer: xmlSerializer,
-	};
-	const appendBlockFromUrlOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.AppendBlobAppendBlockFromUrlHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.AppendBlobAppendBlockFromUrlExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp22],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.encryptionScope,
-	        Parameters.sourceIfModifiedSince,
-	        Parameters.sourceIfUnmodifiedSince,
-	        Parameters.sourceIfMatch,
-	        Parameters.sourceIfNoneMatch,
-	        Parameters.sourceContentMD5,
-	        Parameters.copySourceAuthorization,
-	        Parameters.fileRequestIntent,
-	        Parameters.transactionalContentMD5,
-	        Parameters.sourceUrl,
-	        Parameters.sourceContentCrc64,
-	        Parameters.maxSize,
-	        Parameters.appendPosition,
-	        Parameters.sourceRange1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const sealOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        200: {
-	            headersMapper: Mappers.AppendBlobSealHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.AppendBlobSealExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp23],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.appendPosition,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	
-	return appendBlob$1;
-}
-
-var blockBlob$1 = {};
-
-var hasRequiredBlockBlob$1;
-
-function requireBlockBlob$1 () {
-	if (hasRequiredBlockBlob$1) return blockBlob$1;
-	hasRequiredBlockBlob$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(blockBlob$1, "__esModule", { value: true });
-	blockBlob$1.BlockBlobImpl = void 0;
-	const tslib_1 = require$$0$2;
-	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
-	const Mappers = tslib_1.__importStar(requireMappers());
-	const Parameters = tslib_1.__importStar(requireParameters());
-	/** Class containing BlockBlob operations. */
-	class BlockBlobImpl {
-	    client;
-	    /**
-	     * Initialize a new instance of the class BlockBlob class.
-	     * @param client Reference to the service client
-	     */
-	    constructor(client) {
-	        this.client = client;
-	    }
-	    /**
-	     * The Upload Block Blob operation updates the content of an existing block blob. Updating an existing
-	     * block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put
-	     * Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a
-	     * partial update of the content of a block blob, use the Put Block List operation.
-	     * @param contentLength The length of the request.
-	     * @param body Initial data
-	     * @param options The options parameters.
-	     */
-	    upload(contentLength, body, options) {
-	        return this.client.sendOperationRequest({ contentLength, body, options }, uploadOperationSpec);
-	    }
-	    /**
-	     * The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read
-	     * from a given URL.  This API is supported beginning with the 2020-04-08 version. Partial updates are
-	     * not supported with Put Blob from URL; the content of an existing blob is overwritten with the
-	     * content of the new blob.  To perform partial updates to a block blob’s contents using a source URL,
-	     * use the Put Block from URL API in conjunction with Put Block List.
-	     * @param contentLength The length of the request.
-	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
-	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
-	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
-	     *                   access signature.
-	     * @param options The options parameters.
-	     */
-	    putBlobFromUrl(contentLength, copySource, options) {
-	        return this.client.sendOperationRequest({ contentLength, copySource, options }, putBlobFromUrlOperationSpec);
-	    }
-	    /**
-	     * The Stage Block operation creates a new block to be committed as part of a blob
-	     * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
-	     *                must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
-	     *                for the blockid parameter must be the same size for each block.
-	     * @param contentLength The length of the request.
-	     * @param body Initial data
-	     * @param options The options parameters.
-	     */
-	    stageBlock(blockId, contentLength, body, options) {
-	        return this.client.sendOperationRequest({ blockId, contentLength, body, options }, stageBlockOperationSpec);
-	    }
-	    /**
-	     * The Stage Block operation creates a new block to be committed as part of a blob where the contents
-	     * are read from a URL.
-	     * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
-	     *                must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
-	     *                for the blockid parameter must be the same size for each block.
-	     * @param contentLength The length of the request.
-	     * @param sourceUrl Specify a URL to the copy source.
-	     * @param options The options parameters.
-	     */
-	    stageBlockFromURL(blockId, contentLength, sourceUrl, options) {
-	        return this.client.sendOperationRequest({ blockId, contentLength, sourceUrl, options }, stageBlockFromURLOperationSpec);
-	    }
-	    /**
-	     * The Commit Block List operation writes a blob by specifying the list of block IDs that make up the
-	     * blob. In order to be written as part of a blob, a block must have been successfully written to the
-	     * server in a prior Put Block operation. You can call Put Block List to update a blob by uploading
-	     * only those blocks that have changed, then committing the new and existing blocks together. You can
-	     * do this by specifying whether to commit a block from the committed block list or from the
-	     * uncommitted block list, or to commit the most recently uploaded version of the block, whichever list
-	     * it may belong to.
-	     * @param blocks Blob Blocks.
-	     * @param options The options parameters.
-	     */
-	    commitBlockList(blocks, options) {
-	        return this.client.sendOperationRequest({ blocks, options }, commitBlockListOperationSpec);
-	    }
-	    /**
-	     * The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block
-	     * blob
-	     * @param listType Specifies whether to return the list of committed blocks, the list of uncommitted
-	     *                 blocks, or both lists together.
-	     * @param options The options parameters.
-	     */
-	    getBlockList(listType, options) {
-	        return this.client.sendOperationRequest({ listType, options }, getBlockListOperationSpec);
-	    }
-	}
-	blockBlob$1.BlockBlobImpl = BlockBlobImpl;
-	// Operation Specifications
-	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
-	const uploadOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlockBlobUploadHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlockBlobUploadExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.body1,
-	    queryParameters: [Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.contentLength,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobCacheControl,
-	        Parameters.blobContentType,
-	        Parameters.blobContentMD5,
-	        Parameters.blobContentEncoding,
-	        Parameters.blobContentLanguage,
-	        Parameters.blobContentDisposition,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	        Parameters.encryptionScope,
-	        Parameters.tier,
-	        Parameters.blobTagsString,
-	        Parameters.legalHold1,
-	        Parameters.transactionalContentMD5,
-	        Parameters.transactionalContentCrc64,
-	        Parameters.contentType1,
-	        Parameters.accept2,
-	        Parameters.blobType2,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "binary",
-	    serializer: xmlSerializer,
-	};
-	const putBlobFromUrlOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlockBlobPutBlobFromUrlHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlockBlobPutBlobFromUrlExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [Parameters.timeoutInSeconds],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobCacheControl,
-	        Parameters.blobContentType,
-	        Parameters.blobContentMD5,
-	        Parameters.blobContentEncoding,
-	        Parameters.blobContentLanguage,
-	        Parameters.blobContentDisposition,
-	        Parameters.encryptionScope,
-	        Parameters.tier,
-	        Parameters.sourceIfModifiedSince,
-	        Parameters.sourceIfUnmodifiedSince,
-	        Parameters.sourceIfMatch,
-	        Parameters.sourceIfNoneMatch,
-	        Parameters.sourceIfTags,
-	        Parameters.copySource,
-	        Parameters.blobTagsString,
-	        Parameters.sourceContentMD5,
-	        Parameters.copySourceAuthorization,
-	        Parameters.copySourceTags,
-	        Parameters.fileRequestIntent,
-	        Parameters.transactionalContentMD5,
-	        Parameters.blobType2,
-	        Parameters.copySourceBlobProperties,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const stageBlockOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlockBlobStageBlockHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlockBlobStageBlockExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.body1,
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp24,
-	        Parameters.blockId,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.encryptionScope,
-	        Parameters.transactionalContentMD5,
-	        Parameters.transactionalContentCrc64,
-	        Parameters.contentType1,
-	        Parameters.accept2,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "binary",
-	    serializer: xmlSerializer,
-	};
-	const stageBlockFromURLOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlockBlobStageBlockFromURLHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlockBlobStageBlockFromURLExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.comp24,
-	        Parameters.blockId,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.contentLength,
-	        Parameters.leaseId,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.encryptionScope,
-	        Parameters.sourceIfModifiedSince,
-	        Parameters.sourceIfUnmodifiedSince,
-	        Parameters.sourceIfMatch,
-	        Parameters.sourceIfNoneMatch,
-	        Parameters.sourceContentMD5,
-	        Parameters.copySourceAuthorization,
-	        Parameters.fileRequestIntent,
-	        Parameters.sourceUrl,
-	        Parameters.sourceContentCrc64,
-	        Parameters.sourceRange1,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	const commitBlockListOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "PUT",
-	    responses: {
-	        201: {
-	            headersMapper: Mappers.BlockBlobCommitBlockListHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlockBlobCommitBlockListExceptionHeaders,
-	        },
-	    },
-	    requestBody: Parameters.blocks,
-	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp25],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.contentType,
-	        Parameters.accept,
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.metadata,
-	        Parameters.leaseId,
-	        Parameters.ifModifiedSince,
-	        Parameters.ifUnmodifiedSince,
-	        Parameters.encryptionKey,
-	        Parameters.encryptionKeySha256,
-	        Parameters.encryptionAlgorithm,
-	        Parameters.ifMatch,
-	        Parameters.ifNoneMatch,
-	        Parameters.ifTags,
-	        Parameters.blobCacheControl,
-	        Parameters.blobContentType,
-	        Parameters.blobContentMD5,
-	        Parameters.blobContentEncoding,
-	        Parameters.blobContentLanguage,
-	        Parameters.blobContentDisposition,
-	        Parameters.immutabilityPolicyExpiry,
-	        Parameters.immutabilityPolicyMode,
-	        Parameters.encryptionScope,
-	        Parameters.tier,
-	        Parameters.blobTagsString,
-	        Parameters.legalHold1,
-	        Parameters.transactionalContentMD5,
-	        Parameters.transactionalContentCrc64,
-	    ],
-	    isXML: true,
-	    contentType: "application/xml; charset=utf-8",
-	    mediaType: "xml",
-	    serializer: xmlSerializer,
-	};
-	const getBlockListOperationSpec = {
-	    path: "/{containerName}/{blob}",
-	    httpMethod: "GET",
-	    responses: {
-	        200: {
-	            bodyMapper: Mappers.BlockList,
-	            headersMapper: Mappers.BlockBlobGetBlockListHeaders,
-	        },
-	        default: {
-	            bodyMapper: Mappers.StorageError,
-	            headersMapper: Mappers.BlockBlobGetBlockListExceptionHeaders,
-	        },
-	    },
-	    queryParameters: [
-	        Parameters.timeoutInSeconds,
-	        Parameters.snapshot,
-	        Parameters.comp25,
-	        Parameters.listType,
-	    ],
-	    urlParameters: [Parameters.url],
-	    headerParameters: [
-	        Parameters.version,
-	        Parameters.requestId,
-	        Parameters.accept1,
-	        Parameters.leaseId,
-	        Parameters.ifTags,
-	    ],
-	    isXML: true,
-	    serializer: xmlSerializer,
-	};
-	
-	return blockBlob$1;
-}
-
-var hasRequiredOperations;
-
-function requireOperations () {
-	if (hasRequiredOperations) return operations;
-	hasRequiredOperations = 1;
-	(function (exports$1) {
-		/*
-		 * Copyright (c) Microsoft Corporation.
-		 * Licensed under the MIT License.
-		 *
-		 * Code generated by Microsoft (R) AutoRest Code Generator.
-		 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-		 */
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		const tslib_1 = require$$0$2;
-		tslib_1.__exportStar(requireService$1(), exports$1);
-		tslib_1.__exportStar(requireContainer$1(), exports$1);
-		tslib_1.__exportStar(requireBlob$1(), exports$1);
-		tslib_1.__exportStar(requirePageBlob$1(), exports$1);
-		tslib_1.__exportStar(requireAppendBlob$1(), exports$1);
-		tslib_1.__exportStar(requireBlockBlob$1(), exports$1);
-		
-	} (operations));
-	return operations;
-}
-
-var hasRequiredStorageClient$1;
-
-function requireStorageClient$1 () {
-	if (hasRequiredStorageClient$1) return storageClient;
-	hasRequiredStorageClient$1 = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(storageClient, "__esModule", { value: true });
-	storageClient.StorageClient = void 0;
-	const tslib_1 = require$$0$2;
-	const coreHttpCompat = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$6());
-	const index_js_1 = requireOperations();
-	class StorageClient extends coreHttpCompat.ExtendedServiceClient {
-	    url;
-	    version;
-	    /**
-	     * Initializes a new instance of the StorageClient class.
-	     * @param url The URL of the service account, container, or blob that is the target of the desired
-	     *            operation.
-	     * @param options The parameter options
-	     */
-	    constructor(url, options) {
-	        if (url === undefined) {
-	            throw new Error("'url' cannot be null");
-	        }
-	        // Initializing default values for options
-	        if (!options) {
-	            options = {};
-	        }
-	        const defaults = {
-	            requestContentType: "application/json; charset=utf-8",
-	        };
-	        const packageDetails = `azsdk-js-azure-storage-blob/12.29.1`;
-	        const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix
-	            ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}`
-	            : `${packageDetails}`;
-	        const optionsWithDefaults = {
-	            ...defaults,
-	            ...options,
-	            userAgentOptions: {
-	                userAgentPrefix,
-	            },
-	            endpoint: options.endpoint ?? options.baseUri ?? "{url}",
-	        };
-	        super(optionsWithDefaults);
-	        // Parameter assignments
-	        this.url = url;
-	        // Assigning values to Constant parameters
-	        this.version = options.version || "2025-11-05";
-	        this.service = new index_js_1.ServiceImpl(this);
-	        this.container = new index_js_1.ContainerImpl(this);
-	        this.blob = new index_js_1.BlobImpl(this);
-	        this.pageBlob = new index_js_1.PageBlobImpl(this);
-	        this.appendBlob = new index_js_1.AppendBlobImpl(this);
-	        this.blockBlob = new index_js_1.BlockBlobImpl(this);
-	    }
-	    service;
-	    container;
-	    blob;
-	    pageBlob;
-	    appendBlob;
-	    blockBlob;
-	}
-	storageClient.StorageClient = StorageClient;
-	
-	return storageClient;
-}
-
-var operationsInterfaces = {};
-
-var service = {};
-
-var hasRequiredService;
-
-function requireService () {
-	if (hasRequiredService) return service;
-	hasRequiredService = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(service, "__esModule", { value: true });
-	
-	return service;
-}
-
-var container = {};
-
-var hasRequiredContainer;
-
-function requireContainer () {
-	if (hasRequiredContainer) return container;
-	hasRequiredContainer = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(container, "__esModule", { value: true });
-	
-	return container;
-}
-
-var blob = {};
-
-var hasRequiredBlob;
-
-function requireBlob () {
-	if (hasRequiredBlob) return blob;
-	hasRequiredBlob = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(blob, "__esModule", { value: true });
-	
-	return blob;
-}
-
-var pageBlob = {};
-
-var hasRequiredPageBlob;
-
-function requirePageBlob () {
-	if (hasRequiredPageBlob) return pageBlob;
-	hasRequiredPageBlob = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(pageBlob, "__esModule", { value: true });
-	
-	return pageBlob;
-}
-
-var appendBlob = {};
-
-var hasRequiredAppendBlob;
-
-function requireAppendBlob () {
-	if (hasRequiredAppendBlob) return appendBlob;
-	hasRequiredAppendBlob = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(appendBlob, "__esModule", { value: true });
-	
-	return appendBlob;
-}
-
-var blockBlob = {};
-
-var hasRequiredBlockBlob;
-
-function requireBlockBlob () {
-	if (hasRequiredBlockBlob) return blockBlob;
-	hasRequiredBlockBlob = 1;
-	/*
-	 * Copyright (c) Microsoft Corporation.
-	 * Licensed under the MIT License.
-	 *
-	 * Code generated by Microsoft (R) AutoRest Code Generator.
-	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-	 */
-	Object.defineProperty(blockBlob, "__esModule", { value: true });
-	
-	return blockBlob;
-}
-
-var hasRequiredOperationsInterfaces;
-
-function requireOperationsInterfaces () {
-	if (hasRequiredOperationsInterfaces) return operationsInterfaces;
-	hasRequiredOperationsInterfaces = 1;
-	(function (exports$1) {
-		/*
-		 * Copyright (c) Microsoft Corporation.
-		 * Licensed under the MIT License.
-		 *
-		 * Code generated by Microsoft (R) AutoRest Code Generator.
-		 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-		 */
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		const tslib_1 = require$$0$2;
-		tslib_1.__exportStar(requireService(), exports$1);
-		tslib_1.__exportStar(requireContainer(), exports$1);
-		tslib_1.__exportStar(requireBlob(), exports$1);
-		tslib_1.__exportStar(requirePageBlob(), exports$1);
-		tslib_1.__exportStar(requireAppendBlob(), exports$1);
-		tslib_1.__exportStar(requireBlockBlob(), exports$1);
-		
-	} (operationsInterfaces));
-	return operationsInterfaces;
-}
-
-var hasRequiredSrc;
-
-function requireSrc () {
-	if (hasRequiredSrc) return src$1;
-	hasRequiredSrc = 1;
-	(function (exports$1) {
-		/*
-		 * Copyright (c) Microsoft Corporation.
-		 * Licensed under the MIT License.
-		 *
-		 * Code generated by Microsoft (R) AutoRest Code Generator.
-		 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
-		 */
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.StorageClient = void 0;
-		const tslib_1 = require$$0$2;
-		tslib_1.__exportStar(requireModels$1(), exports$1);
-		var storageClient_js_1 = requireStorageClient$1();
-		Object.defineProperty(exports$1, "StorageClient", { enumerable: true, get: function () { return storageClient_js_1.StorageClient; } });
-		tslib_1.__exportStar(requireOperationsInterfaces(), exports$1);
-		
-	} (src$1));
-	return src$1;
-}
-
-var hasRequiredStorageContextClient;
-
-function requireStorageContextClient () {
-	if (hasRequiredStorageContextClient) return StorageContextClient;
-	hasRequiredStorageContextClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageContextClient, "__esModule", { value: true });
-	StorageContextClient.StorageContextClient = void 0;
-	const index_js_1 = requireSrc();
-	/**
-	 * @internal
-	 */
-	let StorageContextClient$1 = class StorageContextClient extends index_js_1.StorageClient {
-	    async sendOperationRequest(operationArguments, operationSpec) {
-	        const operationSpecToSend = { ...operationSpec };
-	        if (operationSpecToSend.path === "/{containerName}" ||
-	            operationSpecToSend.path === "/{containerName}/{blob}") {
-	            operationSpecToSend.path = "";
-	        }
-	        return super.sendOperationRequest(operationArguments, operationSpecToSend);
-	    }
-	};
-	StorageContextClient.StorageContextClient = StorageContextClient$1;
-	
-	return StorageContextClient;
-}
-
-var hasRequiredStorageClient;
-
-function requireStorageClient () {
-	if (hasRequiredStorageClient) return StorageClient;
-	hasRequiredStorageClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(StorageClient, "__esModule", { value: true });
-	StorageClient.StorageClient = void 0;
-	const StorageContextClient_js_1 = requireStorageContextClient();
-	const Pipeline_js_1 = requirePipeline();
-	const utils_common_js_1 = requireUtils_common$2();
-	/**
-	 * A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}
-	 * and etc.
-	 */
-	let StorageClient$1 = class StorageClient {
-	    /**
-	     * Encoded URL string value.
-	     */
-	    url;
-	    accountName;
-	    /**
-	     * Request policy pipeline.
-	     *
-	     * @internal
-	     */
-	    pipeline;
-	    /**
-	     * Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
-	     */
-	    credential;
-	    /**
-	     * StorageClient is a reference to protocol layer operations entry, which is
-	     * generated by AutoRest generator.
-	     */
-	    storageClientContext;
-	    /**
-	     */
-	    isHttps;
-	    /**
-	     * Creates an instance of StorageClient.
-	     * @param url - url to resource
-	     * @param pipeline - request policy pipeline.
-	     */
-	    constructor(url, pipeline) {
-	        // URL should be encoded and only once, protocol layer shouldn't encode URL again
-	        this.url = (0, utils_common_js_1.escapeURLPath)(url);
-	        this.accountName = (0, utils_common_js_1.getAccountNameFromUrl)(url);
-	        this.pipeline = pipeline;
-	        this.storageClientContext = new StorageContextClient_js_1.StorageContextClient(this.url, (0, Pipeline_js_1.getCoreClientOptions)(pipeline));
-	        this.isHttps = (0, utils_common_js_1.iEqual)((0, utils_common_js_1.getURLScheme)(this.url) || "", "https");
-	        this.credential = (0, Pipeline_js_1.getCredentialFromPipeline)(pipeline);
-	        // Override protocol layer's default content-type
-	        const storageClientContext = this.storageClientContext;
-	        storageClientContext.requestContentType = undefined;
-	    }
-	};
-	StorageClient.StorageClient = StorageClient$1;
-	
-	return StorageClient;
-}
-
-var tracing = {};
-
-var hasRequiredTracing;
-
-function requireTracing () {
-	if (hasRequiredTracing) return tracing;
-	hasRequiredTracing = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(tracing, "__esModule", { value: true });
-	tracing.tracingClient = void 0;
-	const core_tracing_1 = /*@__PURE__*/ requireCommonjs$a();
-	const constants_js_1 = requireConstants$3();
-	/**
-	 * Creates a span using the global tracer.
-	 * @internal
-	 */
-	tracing.tracingClient = (0, core_tracing_1.createTracingClient)({
-	    packageName: "@azure/storage-blob",
-	    packageVersion: constants_js_1.SDK_VERSION,
-	    namespace: "Microsoft.Storage",
-	});
-	
-	return tracing;
-}
-
-var BlobSASSignatureValues = {};
-
-var BlobSASPermissions = {};
-
-var hasRequiredBlobSASPermissions;
-
-function requireBlobSASPermissions () {
-	if (hasRequiredBlobSASPermissions) return BlobSASPermissions;
-	hasRequiredBlobSASPermissions = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobSASPermissions, "__esModule", { value: true });
-	BlobSASPermissions.BlobSASPermissions = void 0;
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a blob. Setting
-	 * a value to true means that any SAS which uses these permissions will grant permissions for that operation. Once all
-	 * the values are set, this should be serialized with toString and set as the permissions field on a
-	 * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but
-	 * the order of the permissions is particular and this class guarantees correctness.
-	 */
-	let BlobSASPermissions$1 = class BlobSASPermissions {
-	    /**
-	     * Creates a {@link BlobSASPermissions} from the specified permissions string. This method will throw an
-	     * Error if it encounters a character that does not correspond to a valid permission.
-	     *
-	     * @param permissions -
-	     */
-	    static parse(permissions) {
-	        const blobSASPermissions = new BlobSASPermissions();
-	        for (const char of permissions) {
-	            switch (char) {
-	                case "r":
-	                    blobSASPermissions.read = true;
-	                    break;
-	                case "a":
-	                    blobSASPermissions.add = true;
-	                    break;
-	                case "c":
-	                    blobSASPermissions.create = true;
-	                    break;
-	                case "w":
-	                    blobSASPermissions.write = true;
-	                    break;
-	                case "d":
-	                    blobSASPermissions.delete = true;
-	                    break;
-	                case "x":
-	                    blobSASPermissions.deleteVersion = true;
-	                    break;
-	                case "t":
-	                    blobSASPermissions.tag = true;
-	                    break;
-	                case "m":
-	                    blobSASPermissions.move = true;
-	                    break;
-	                case "e":
-	                    blobSASPermissions.execute = true;
-	                    break;
-	                case "i":
-	                    blobSASPermissions.setImmutabilityPolicy = true;
-	                    break;
-	                case "y":
-	                    blobSASPermissions.permanentDelete = true;
-	                    break;
-	                default:
-	                    throw new RangeError(`Invalid permission: ${char}`);
-	            }
-	        }
-	        return blobSASPermissions;
-	    }
-	    /**
-	     * Creates a {@link BlobSASPermissions} from a raw object which contains same keys as it
-	     * and boolean values for them.
-	     *
-	     * @param permissionLike -
-	     */
-	    static from(permissionLike) {
-	        const blobSASPermissions = new BlobSASPermissions();
-	        if (permissionLike.read) {
-	            blobSASPermissions.read = true;
-	        }
-	        if (permissionLike.add) {
-	            blobSASPermissions.add = true;
-	        }
-	        if (permissionLike.create) {
-	            blobSASPermissions.create = true;
-	        }
-	        if (permissionLike.write) {
-	            blobSASPermissions.write = true;
-	        }
-	        if (permissionLike.delete) {
-	            blobSASPermissions.delete = true;
-	        }
-	        if (permissionLike.deleteVersion) {
-	            blobSASPermissions.deleteVersion = true;
-	        }
-	        if (permissionLike.tag) {
-	            blobSASPermissions.tag = true;
-	        }
-	        if (permissionLike.move) {
-	            blobSASPermissions.move = true;
-	        }
-	        if (permissionLike.execute) {
-	            blobSASPermissions.execute = true;
-	        }
-	        if (permissionLike.setImmutabilityPolicy) {
-	            blobSASPermissions.setImmutabilityPolicy = true;
-	        }
-	        if (permissionLike.permanentDelete) {
-	            blobSASPermissions.permanentDelete = true;
-	        }
-	        return blobSASPermissions;
-	    }
-	    /**
-	     * Specifies Read access granted.
-	     */
-	    read = false;
-	    /**
-	     * Specifies Add access granted.
-	     */
-	    add = false;
-	    /**
-	     * Specifies Create access granted.
-	     */
-	    create = false;
-	    /**
-	     * Specifies Write access granted.
-	     */
-	    write = false;
-	    /**
-	     * Specifies Delete access granted.
-	     */
-	    delete = false;
-	    /**
-	     * Specifies Delete version access granted.
-	     */
-	    deleteVersion = false;
-	    /**
-	     * Specfies Tag access granted.
-	     */
-	    tag = false;
-	    /**
-	     * Specifies Move access granted.
-	     */
-	    move = false;
-	    /**
-	     * Specifies Execute access granted.
-	     */
-	    execute = false;
-	    /**
-	     * Specifies SetImmutabilityPolicy access granted.
-	     */
-	    setImmutabilityPolicy = false;
-	    /**
-	     * Specifies that Permanent Delete is permitted.
-	     */
-	    permanentDelete = false;
-	    /**
-	     * Converts the given permissions to a string. Using this method will guarantee the permissions are in an
-	     * order accepted by the service.
-	     *
-	     * @returns A string which represents the BlobSASPermissions
-	     */
-	    toString() {
-	        const permissions = [];
-	        if (this.read) {
-	            permissions.push("r");
-	        }
-	        if (this.add) {
-	            permissions.push("a");
-	        }
-	        if (this.create) {
-	            permissions.push("c");
-	        }
-	        if (this.write) {
-	            permissions.push("w");
-	        }
-	        if (this.delete) {
-	            permissions.push("d");
-	        }
-	        if (this.deleteVersion) {
-	            permissions.push("x");
-	        }
-	        if (this.tag) {
-	            permissions.push("t");
-	        }
-	        if (this.move) {
-	            permissions.push("m");
-	        }
-	        if (this.execute) {
-	            permissions.push("e");
-	        }
-	        if (this.setImmutabilityPolicy) {
-	            permissions.push("i");
-	        }
-	        if (this.permanentDelete) {
-	            permissions.push("y");
-	        }
-	        return permissions.join("");
-	    }
-	};
-	BlobSASPermissions.BlobSASPermissions = BlobSASPermissions$1;
-	
-	return BlobSASPermissions;
-}
-
-var ContainerSASPermissions = {};
-
-var hasRequiredContainerSASPermissions;
-
-function requireContainerSASPermissions () {
-	if (hasRequiredContainerSASPermissions) return ContainerSASPermissions;
-	hasRequiredContainerSASPermissions = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(ContainerSASPermissions, "__esModule", { value: true });
-	ContainerSASPermissions.ContainerSASPermissions = void 0;
-	/**
-	 * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a container.
-	 * Setting a value to true means that any SAS which uses these permissions will grant permissions for that operation.
-	 * Once all the values are set, this should be serialized with toString and set as the permissions field on a
-	 * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but
-	 * the order of the permissions is particular and this class guarantees correctness.
-	 */
-	let ContainerSASPermissions$1 = class ContainerSASPermissions {
-	    /**
-	     * Creates an {@link ContainerSASPermissions} from the specified permissions string. This method will throw an
-	     * Error if it encounters a character that does not correspond to a valid permission.
-	     *
-	     * @param permissions -
-	     */
-	    static parse(permissions) {
-	        const containerSASPermissions = new ContainerSASPermissions();
-	        for (const char of permissions) {
-	            switch (char) {
-	                case "r":
-	                    containerSASPermissions.read = true;
-	                    break;
-	                case "a":
-	                    containerSASPermissions.add = true;
-	                    break;
-	                case "c":
-	                    containerSASPermissions.create = true;
-	                    break;
-	                case "w":
-	                    containerSASPermissions.write = true;
-	                    break;
-	                case "d":
-	                    containerSASPermissions.delete = true;
-	                    break;
-	                case "l":
-	                    containerSASPermissions.list = true;
-	                    break;
-	                case "t":
-	                    containerSASPermissions.tag = true;
-	                    break;
-	                case "x":
-	                    containerSASPermissions.deleteVersion = true;
-	                    break;
-	                case "m":
-	                    containerSASPermissions.move = true;
-	                    break;
-	                case "e":
-	                    containerSASPermissions.execute = true;
-	                    break;
-	                case "i":
-	                    containerSASPermissions.setImmutabilityPolicy = true;
-	                    break;
-	                case "y":
-	                    containerSASPermissions.permanentDelete = true;
-	                    break;
-	                case "f":
-	                    containerSASPermissions.filterByTags = true;
-	                    break;
-	                default:
-	                    throw new RangeError(`Invalid permission ${char}`);
-	            }
-	        }
-	        return containerSASPermissions;
-	    }
-	    /**
-	     * Creates a {@link ContainerSASPermissions} from a raw object which contains same keys as it
-	     * and boolean values for them.
-	     *
-	     * @param permissionLike -
-	     */
-	    static from(permissionLike) {
-	        const containerSASPermissions = new ContainerSASPermissions();
-	        if (permissionLike.read) {
-	            containerSASPermissions.read = true;
-	        }
-	        if (permissionLike.add) {
-	            containerSASPermissions.add = true;
-	        }
-	        if (permissionLike.create) {
-	            containerSASPermissions.create = true;
-	        }
-	        if (permissionLike.write) {
-	            containerSASPermissions.write = true;
-	        }
-	        if (permissionLike.delete) {
-	            containerSASPermissions.delete = true;
-	        }
-	        if (permissionLike.list) {
-	            containerSASPermissions.list = true;
-	        }
-	        if (permissionLike.deleteVersion) {
-	            containerSASPermissions.deleteVersion = true;
-	        }
-	        if (permissionLike.tag) {
-	            containerSASPermissions.tag = true;
-	        }
-	        if (permissionLike.move) {
-	            containerSASPermissions.move = true;
-	        }
-	        if (permissionLike.execute) {
-	            containerSASPermissions.execute = true;
-	        }
-	        if (permissionLike.setImmutabilityPolicy) {
-	            containerSASPermissions.setImmutabilityPolicy = true;
-	        }
-	        if (permissionLike.permanentDelete) {
-	            containerSASPermissions.permanentDelete = true;
-	        }
-	        if (permissionLike.filterByTags) {
-	            containerSASPermissions.filterByTags = true;
-	        }
-	        return containerSASPermissions;
-	    }
-	    /**
-	     * Specifies Read access granted.
-	     */
-	    read = false;
-	    /**
-	     * Specifies Add access granted.
-	     */
-	    add = false;
-	    /**
-	     * Specifies Create access granted.
-	     */
-	    create = false;
-	    /**
-	     * Specifies Write access granted.
-	     */
-	    write = false;
-	    /**
-	     * Specifies Delete access granted.
-	     */
-	    delete = false;
-	    /**
-	     * Specifies Delete version access granted.
-	     */
-	    deleteVersion = false;
-	    /**
-	     * Specifies List access granted.
-	     */
-	    list = false;
-	    /**
-	     * Specfies Tag access granted.
-	     */
-	    tag = false;
-	    /**
-	     * Specifies Move access granted.
-	     */
-	    move = false;
-	    /**
-	     * Specifies Execute access granted.
-	     */
-	    execute = false;
-	    /**
-	     * Specifies SetImmutabilityPolicy access granted.
-	     */
-	    setImmutabilityPolicy = false;
-	    /**
-	     * Specifies that Permanent Delete is permitted.
-	     */
-	    permanentDelete = false;
-	    /**
-	     * Specifies that Filter Blobs by Tags is permitted.
-	     */
-	    filterByTags = false;
-	    /**
-	     * Converts the given permissions to a string. Using this method will guarantee the permissions are in an
-	     * order accepted by the service.
-	     *
-	     * The order of the characters should be as specified here to ensure correctness.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     */
-	    toString() {
-	        const permissions = [];
-	        if (this.read) {
-	            permissions.push("r");
-	        }
-	        if (this.add) {
-	            permissions.push("a");
-	        }
-	        if (this.create) {
-	            permissions.push("c");
-	        }
-	        if (this.write) {
-	            permissions.push("w");
-	        }
-	        if (this.delete) {
-	            permissions.push("d");
-	        }
-	        if (this.deleteVersion) {
-	            permissions.push("x");
-	        }
-	        if (this.list) {
-	            permissions.push("l");
-	        }
-	        if (this.tag) {
-	            permissions.push("t");
-	        }
-	        if (this.move) {
-	            permissions.push("m");
-	        }
-	        if (this.execute) {
-	            permissions.push("e");
-	        }
-	        if (this.setImmutabilityPolicy) {
-	            permissions.push("i");
-	        }
-	        if (this.permanentDelete) {
-	            permissions.push("y");
-	        }
-	        if (this.filterByTags) {
-	            permissions.push("f");
-	        }
-	        return permissions.join("");
-	    }
-	};
-	ContainerSASPermissions.ContainerSASPermissions = ContainerSASPermissions$1;
-	
-	return ContainerSASPermissions;
-}
-
-var UserDelegationKeyCredential = {};
-
-var hasRequiredUserDelegationKeyCredential;
-
-function requireUserDelegationKeyCredential () {
-	if (hasRequiredUserDelegationKeyCredential) return UserDelegationKeyCredential;
-	hasRequiredUserDelegationKeyCredential = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(UserDelegationKeyCredential, "__esModule", { value: true });
-	UserDelegationKeyCredential.UserDelegationKeyCredential = void 0;
-	const node_crypto_1 = require$$0$g;
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * UserDelegationKeyCredential is only used for generation of user delegation SAS.
-	 * @see https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas
-	 */
-	let UserDelegationKeyCredential$1 = class UserDelegationKeyCredential {
-	    /**
-	     * Azure Storage account name; readonly.
-	     */
-	    accountName;
-	    /**
-	     * Azure Storage user delegation key; readonly.
-	     */
-	    userDelegationKey;
-	    /**
-	     * Key value in Buffer type.
-	     */
-	    key;
-	    /**
-	     * Creates an instance of UserDelegationKeyCredential.
-	     * @param accountName -
-	     * @param userDelegationKey -
-	     */
-	    constructor(accountName, userDelegationKey) {
-	        this.accountName = accountName;
-	        this.userDelegationKey = userDelegationKey;
-	        this.key = Buffer.from(userDelegationKey.value, "base64");
-	    }
-	    /**
-	     * Generates a hash signature for an HTTP request or for a SAS.
-	     *
-	     * @param stringToSign -
-	     */
-	    computeHMACSHA256(stringToSign) {
-	        // console.log(`stringToSign: ${JSON.stringify(stringToSign)}`);
-	        return (0, node_crypto_1.createHmac)("sha256", this.key).update(stringToSign, "utf8").digest("base64");
-	    }
-	};
-	UserDelegationKeyCredential.UserDelegationKeyCredential = UserDelegationKeyCredential$1;
-	
-	return UserDelegationKeyCredential;
-}
-
-var SasIPRange = {};
-
-var hasRequiredSasIPRange;
-
-function requireSasIPRange () {
-	if (hasRequiredSasIPRange) return SasIPRange;
-	hasRequiredSasIPRange = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(SasIPRange, "__esModule", { value: true });
-	SasIPRange.ipRangeToString = ipRangeToString;
-	/**
-	 * Generate SasIPRange format string. For example:
-	 *
-	 * "8.8.8.8" or "1.1.1.1-255.255.255.255"
-	 *
-	 * @param ipRange -
-	 */
-	function ipRangeToString(ipRange) {
-	    return ipRange.end ? `${ipRange.start}-${ipRange.end}` : ipRange.start;
-	}
-	
-	return SasIPRange;
-}
-
-var SASQueryParameters = {};
-
-var hasRequiredSASQueryParameters;
-
-function requireSASQueryParameters () {
-	if (hasRequiredSASQueryParameters) return SASQueryParameters;
-	hasRequiredSASQueryParameters = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(SASQueryParameters, "__esModule", { value: true });
-	SASQueryParameters.SASQueryParameters = SASQueryParameters.SASProtocol = void 0;
-	const SasIPRange_js_1 = requireSasIPRange();
-	const utils_common_js_1 = requireUtils_common$2();
-	/**
-	 * Protocols for generated SAS.
-	 */
-	var SASProtocol;
-	(function (SASProtocol) {
-	    /**
-	     * Protocol that allows HTTPS only
-	     */
-	    SASProtocol["Https"] = "https";
-	    /**
-	     * Protocol that allows both HTTPS and HTTP
-	     */
-	    SASProtocol["HttpsAndHttp"] = "https,http";
-	})(SASProtocol || (SASQueryParameters.SASProtocol = SASProtocol = {}));
-	/**
-	 * Represents the components that make up an Azure Storage SAS' query parameters. This type is not constructed directly
-	 * by the user; it is only generated by the {@link AccountSASSignatureValues} and {@link BlobSASSignatureValues}
-	 * types. Once generated, it can be encoded into a {@link String} and appended to a URL directly (though caution should
-	 * be taken here in case there are existing query parameters, which might affect the appropriate means of appending
-	 * these query parameters).
-	 *
-	 * NOTE: Instances of this class are immutable.
-	 */
-	let SASQueryParameters$1 = class SASQueryParameters {
-	    /**
-	     * The storage API version.
-	     */
-	    version;
-	    /**
-	     * Optional. The allowed HTTP protocol(s).
-	     */
-	    protocol;
-	    /**
-	     * Optional. The start time for this SAS token.
-	     */
-	    startsOn;
-	    /**
-	     * Optional only when identifier is provided. The expiry time for this SAS token.
-	     */
-	    expiresOn;
-	    /**
-	     * Optional only when identifier is provided.
-	     * Please refer to {@link AccountSASPermissions}, {@link BlobSASPermissions}, or {@link ContainerSASPermissions} for
-	     * more details.
-	     */
-	    permissions;
-	    /**
-	     * Optional. The storage services being accessed (only for Account SAS). Please refer to {@link AccountSASServices}
-	     * for more details.
-	     */
-	    services;
-	    /**
-	     * Optional. The storage resource types being accessed (only for Account SAS). Please refer to
-	     * {@link AccountSASResourceTypes} for more details.
-	     */
-	    resourceTypes;
-	    /**
-	     * Optional. The signed identifier (only for {@link BlobSASSignatureValues}).
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/establishing-a-stored-access-policy
-	     */
-	    identifier;
-	    /**
-	     * Optional. Encryption scope to use when sending requests authorized with this SAS URI.
-	     */
-	    encryptionScope;
-	    /**
-	     * Optional. Specifies which resources are accessible via the SAS (only for {@link BlobSASSignatureValues}).
-	     * @see https://learn.microsoft.com/rest/api/storageservices/create-service-sas#specifying-the-signed-resource-blob-service-only
-	     */
-	    resource;
-	    /**
-	     * The signature for the SAS token.
-	     */
-	    signature;
-	    /**
-	     * Value for cache-control header in Blob/File Service SAS.
-	     */
-	    cacheControl;
-	    /**
-	     * Value for content-disposition header in Blob/File Service SAS.
-	     */
-	    contentDisposition;
-	    /**
-	     * Value for content-encoding header in Blob/File Service SAS.
-	     */
-	    contentEncoding;
-	    /**
-	     * Value for content-length header in Blob/File Service SAS.
-	     */
-	    contentLanguage;
-	    /**
-	     * Value for content-type header in Blob/File Service SAS.
-	     */
-	    contentType;
-	    /**
-	     * Inner value of getter ipRange.
-	     */
-	    ipRangeInner;
-	    /**
-	     * The Azure Active Directory object ID in GUID format.
-	     * Property of user delegation key.
-	     */
-	    signedOid;
-	    /**
-	     * The Azure Active Directory tenant ID in GUID format.
-	     * Property of user delegation key.
-	     */
-	    signedTenantId;
-	    /**
-	     * The date-time the key is active.
-	     * Property of user delegation key.
-	     */
-	    signedStartsOn;
-	    /**
-	     * The date-time the key expires.
-	     * Property of user delegation key.
-	     */
-	    signedExpiresOn;
-	    /**
-	     * Abbreviation of the Azure Storage service that accepts the user delegation key.
-	     * Property of user delegation key.
-	     */
-	    signedService;
-	    /**
-	     * The service version that created the user delegation key.
-	     * Property of user delegation key.
-	     */
-	    signedVersion;
-	    /**
-	     * Authorized AAD Object ID in GUID format. The AAD Object ID of a user authorized by the owner of the User Delegation Key
-	     * to perform the action granted by the SAS. The Azure Storage service will ensure that the owner of the user delegation key
-	     * has the required permissions before granting access but no additional permission check for the user specified in
-	     * this value will be performed. This is only used for User Delegation SAS.
-	     */
-	    preauthorizedAgentObjectId;
-	    /**
-	     * A GUID value that will be logged in the storage diagnostic logs and can be used to correlate SAS generation with storage resource access.
-	     * This is only used for User Delegation SAS.
-	     */
-	    correlationId;
-	    /**
-	     * Optional. IP range allowed for this SAS.
-	     *
-	     * @readonly
-	     */
-	    get ipRange() {
-	        if (this.ipRangeInner) {
-	            return {
-	                end: this.ipRangeInner.end,
-	                start: this.ipRangeInner.start,
-	            };
-	        }
-	        return undefined;
-	    }
-	    constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope) {
-	        this.version = version;
-	        this.signature = signature;
-	        if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") {
-	            // SASQueryParametersOptions
-	            this.permissions = permissionsOrOptions.permissions;
-	            this.services = permissionsOrOptions.services;
-	            this.resourceTypes = permissionsOrOptions.resourceTypes;
-	            this.protocol = permissionsOrOptions.protocol;
-	            this.startsOn = permissionsOrOptions.startsOn;
-	            this.expiresOn = permissionsOrOptions.expiresOn;
-	            this.ipRangeInner = permissionsOrOptions.ipRange;
-	            this.identifier = permissionsOrOptions.identifier;
-	            this.encryptionScope = permissionsOrOptions.encryptionScope;
-	            this.resource = permissionsOrOptions.resource;
-	            this.cacheControl = permissionsOrOptions.cacheControl;
-	            this.contentDisposition = permissionsOrOptions.contentDisposition;
-	            this.contentEncoding = permissionsOrOptions.contentEncoding;
-	            this.contentLanguage = permissionsOrOptions.contentLanguage;
-	            this.contentType = permissionsOrOptions.contentType;
-	            if (permissionsOrOptions.userDelegationKey) {
-	                this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId;
-	                this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId;
-	                this.signedStartsOn = permissionsOrOptions.userDelegationKey.signedStartsOn;
-	                this.signedExpiresOn = permissionsOrOptions.userDelegationKey.signedExpiresOn;
-	                this.signedService = permissionsOrOptions.userDelegationKey.signedService;
-	                this.signedVersion = permissionsOrOptions.userDelegationKey.signedVersion;
-	                this.preauthorizedAgentObjectId = permissionsOrOptions.preauthorizedAgentObjectId;
-	                this.correlationId = permissionsOrOptions.correlationId;
-	            }
-	        }
-	        else {
-	            this.services = services;
-	            this.resourceTypes = resourceTypes;
-	            this.expiresOn = expiresOn;
-	            this.permissions = permissionsOrOptions;
-	            this.protocol = protocol;
-	            this.startsOn = startsOn;
-	            this.ipRangeInner = ipRange;
-	            this.encryptionScope = encryptionScope;
-	            this.identifier = identifier;
-	            this.resource = resource;
-	            this.cacheControl = cacheControl;
-	            this.contentDisposition = contentDisposition;
-	            this.contentEncoding = contentEncoding;
-	            this.contentLanguage = contentLanguage;
-	            this.contentType = contentType;
-	            if (userDelegationKey) {
-	                this.signedOid = userDelegationKey.signedObjectId;
-	                this.signedTenantId = userDelegationKey.signedTenantId;
-	                this.signedStartsOn = userDelegationKey.signedStartsOn;
-	                this.signedExpiresOn = userDelegationKey.signedExpiresOn;
-	                this.signedService = userDelegationKey.signedService;
-	                this.signedVersion = userDelegationKey.signedVersion;
-	                this.preauthorizedAgentObjectId = preauthorizedAgentObjectId;
-	                this.correlationId = correlationId;
-	            }
-	        }
-	    }
-	    /**
-	     * Encodes all SAS query parameters into a string that can be appended to a URL.
-	     *
-	     */
-	    toString() {
-	        const params = [
-	            "sv",
-	            "ss",
-	            "srt",
-	            "spr",
-	            "st",
-	            "se",
-	            "sip",
-	            "si",
-	            "ses",
-	            "skoid", // Signed object ID
-	            "sktid", // Signed tenant ID
-	            "skt", // Signed key start time
-	            "ske", // Signed key expiry time
-	            "sks", // Signed key service
-	            "skv", // Signed key version
-	            "sr",
-	            "sp",
-	            "sig",
-	            "rscc",
-	            "rscd",
-	            "rsce",
-	            "rscl",
-	            "rsct",
-	            "saoid",
-	            "scid",
-	        ];
-	        const queries = [];
-	        for (const param of params) {
-	            switch (param) {
-	                case "sv":
-	                    this.tryAppendQueryParameter(queries, param, this.version);
-	                    break;
-	                case "ss":
-	                    this.tryAppendQueryParameter(queries, param, this.services);
-	                    break;
-	                case "srt":
-	                    this.tryAppendQueryParameter(queries, param, this.resourceTypes);
-	                    break;
-	                case "spr":
-	                    this.tryAppendQueryParameter(queries, param, this.protocol);
-	                    break;
-	                case "st":
-	                    this.tryAppendQueryParameter(queries, param, this.startsOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.startsOn, false) : undefined);
-	                    break;
-	                case "se":
-	                    this.tryAppendQueryParameter(queries, param, this.expiresOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.expiresOn, false) : undefined);
-	                    break;
-	                case "sip":
-	                    this.tryAppendQueryParameter(queries, param, this.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(this.ipRange) : undefined);
-	                    break;
-	                case "si":
-	                    this.tryAppendQueryParameter(queries, param, this.identifier);
-	                    break;
-	                case "ses":
-	                    this.tryAppendQueryParameter(queries, param, this.encryptionScope);
-	                    break;
-	                case "skoid": // Signed object ID
-	                    this.tryAppendQueryParameter(queries, param, this.signedOid);
-	                    break;
-	                case "sktid": // Signed tenant ID
-	                    this.tryAppendQueryParameter(queries, param, this.signedTenantId);
-	                    break;
-	                case "skt": // Signed key start time
-	                    this.tryAppendQueryParameter(queries, param, this.signedStartsOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.signedStartsOn, false) : undefined);
-	                    break;
-	                case "ske": // Signed key expiry time
-	                    this.tryAppendQueryParameter(queries, param, this.signedExpiresOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.signedExpiresOn, false) : undefined);
-	                    break;
-	                case "sks": // Signed key service
-	                    this.tryAppendQueryParameter(queries, param, this.signedService);
-	                    break;
-	                case "skv": // Signed key version
-	                    this.tryAppendQueryParameter(queries, param, this.signedVersion);
-	                    break;
-	                case "sr":
-	                    this.tryAppendQueryParameter(queries, param, this.resource);
-	                    break;
-	                case "sp":
-	                    this.tryAppendQueryParameter(queries, param, this.permissions);
-	                    break;
-	                case "sig":
-	                    this.tryAppendQueryParameter(queries, param, this.signature);
-	                    break;
-	                case "rscc":
-	                    this.tryAppendQueryParameter(queries, param, this.cacheControl);
-	                    break;
-	                case "rscd":
-	                    this.tryAppendQueryParameter(queries, param, this.contentDisposition);
-	                    break;
-	                case "rsce":
-	                    this.tryAppendQueryParameter(queries, param, this.contentEncoding);
-	                    break;
-	                case "rscl":
-	                    this.tryAppendQueryParameter(queries, param, this.contentLanguage);
-	                    break;
-	                case "rsct":
-	                    this.tryAppendQueryParameter(queries, param, this.contentType);
-	                    break;
-	                case "saoid":
-	                    this.tryAppendQueryParameter(queries, param, this.preauthorizedAgentObjectId);
-	                    break;
-	                case "scid":
-	                    this.tryAppendQueryParameter(queries, param, this.correlationId);
-	                    break;
-	            }
-	        }
-	        return queries.join("&");
-	    }
-	    /**
-	     * A private helper method used to filter and append query key/value pairs into an array.
-	     *
-	     * @param queries -
-	     * @param key -
-	     * @param value -
-	     */
-	    tryAppendQueryParameter(queries, key, value) {
-	        if (!value) {
-	            return;
-	        }
-	        key = encodeURIComponent(key);
-	        value = encodeURIComponent(value);
-	        if (key.length > 0 && value.length > 0) {
-	            queries.push(`${key}=${value}`);
-	        }
-	    }
-	};
-	SASQueryParameters.SASQueryParameters = SASQueryParameters$1;
-	
-	return SASQueryParameters;
-}
-
-var hasRequiredBlobSASSignatureValues;
-
-function requireBlobSASSignatureValues () {
-	if (hasRequiredBlobSASSignatureValues) return BlobSASSignatureValues;
-	hasRequiredBlobSASSignatureValues = 1;
-	Object.defineProperty(BlobSASSignatureValues, "__esModule", { value: true });
-	BlobSASSignatureValues.generateBlobSASQueryParameters = generateBlobSASQueryParameters;
-	BlobSASSignatureValues.generateBlobSASQueryParametersInternal = generateBlobSASQueryParametersInternal;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	const BlobSASPermissions_js_1 = requireBlobSASPermissions();
-	const ContainerSASPermissions_js_1 = requireContainerSASPermissions();
-	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
-	const UserDelegationKeyCredential_js_1 = requireUserDelegationKeyCredential();
-	const SasIPRange_js_1 = requireSasIPRange();
-	const SASQueryParameters_js_1 = requireSASQueryParameters();
-	const constants_js_1 = requireConstants$3();
-	const utils_common_js_1 = requireUtils_common$2();
-	function generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {
-	    return generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName).sasQueryParameters;
-	}
-	function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {
-	    const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : constants_js_1.SERVICE_VERSION;
-	    const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential
-	        ? sharedKeyCredentialOrUserDelegationKey
-	        : undefined;
-	    let userDelegationKeyCredential;
-	    if (sharedKeyCredential === undefined && accountName !== undefined) {
-	        userDelegationKeyCredential = new UserDelegationKeyCredential_js_1.UserDelegationKeyCredential(accountName, sharedKeyCredentialOrUserDelegationKey);
-	    }
-	    if (sharedKeyCredential === undefined && userDelegationKeyCredential === undefined) {
-	        throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName.");
-	    }
-	    // Version 2020-12-06 adds support for encryptionscope in SAS.
-	    if (version >= "2020-12-06") {
-	        if (sharedKeyCredential !== undefined) {
-	            return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential);
-	        }
-	        else {
-	            if (version >= "2025-07-05") {
-	                return generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential);
-	            }
-	            else {
-	                return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential);
-	            }
-	        }
-	    }
-	    // Version 2019-12-12 adds support for the blob tags permission.
-	    // Version 2018-11-09 adds support for the signed resource and signed blob snapshot time fields.
-	    // https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas#constructing-the-signature-string
-	    if (version >= "2018-11-09") {
-	        if (sharedKeyCredential !== undefined) {
-	            return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential);
-	        }
-	        else {
-	            // Version 2020-02-10 delegation SAS signature construction includes preauthorizedAgentObjectId, agentObjectId, correlationId.
-	            if (version >= "2020-02-10") {
-	                return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential);
-	            }
-	            else {
-	                return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential);
-	            }
-	        }
-	    }
-	    if (version >= "2015-04-05") {
-	        if (sharedKeyCredential !== undefined) {
-	            return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential);
-	        }
-	        else {
-	            throw new RangeError("'version' must be >= '2018-11-09' when generating user delegation SAS using user delegation key.");
-	        }
-	    }
-	    throw new RangeError("'version' must be >= '2015-04-05'.");
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2015-04-05 AND BEFORE 2018-11-09.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn and identifier.
-	 *
-	 * WARNING: When identifier is not provided, permissions and expiresOn are required.
-	 * You MUST assign value to identifier or expiresOn & permissions manually if you initial with
-	 * this constructor.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param sharedKeyCredential -
-	 */
-	function generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    if (!blobSASSignatureValues.identifier &&
-	        !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
-	    }
-	    let resource = "c";
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        blobSASSignatureValues.identifier,
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
-	        blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
-	        blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
-	        blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
-	        blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
-	    ].join("\n");
-	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType),
-	        stringToSign: stringToSign,
-	    };
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn and identifier.
-	 *
-	 * WARNING: When identifier is not provided, permissions and expiresOn are required.
-	 * You MUST assign value to identifier or expiresOn & permissions manually if you initial with
-	 * this constructor.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param sharedKeyCredential -
-	 */
-	function generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    if (!blobSASSignatureValues.identifier &&
-	        !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
-	    }
-	    let resource = "c";
-	    let timestamp = blobSASSignatureValues.snapshotTime;
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	        if (blobSASSignatureValues.snapshotTime) {
-	            resource = "bs";
-	        }
-	        else if (blobSASSignatureValues.versionId) {
-	            resource = "bv";
-	            timestamp = blobSASSignatureValues.versionId;
-	        }
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        blobSASSignatureValues.identifier,
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        resource,
-	        timestamp,
-	        blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
-	        blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
-	        blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
-	        blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
-	        blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
-	    ].join("\n");
-	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType),
-	        stringToSign: stringToSign,
-	    };
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn and identifier.
-	 *
-	 * WARNING: When identifier is not provided, permissions and expiresOn are required.
-	 * You MUST assign value to identifier or expiresOn & permissions manually if you initial with
-	 * this constructor.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param sharedKeyCredential -
-	 */
-	function generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    if (!blobSASSignatureValues.identifier &&
-	        !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
-	    }
-	    let resource = "c";
-	    let timestamp = blobSASSignatureValues.snapshotTime;
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	        if (blobSASSignatureValues.snapshotTime) {
-	            resource = "bs";
-	        }
-	        else if (blobSASSignatureValues.versionId) {
-	            resource = "bv";
-	            timestamp = blobSASSignatureValues.versionId;
-	        }
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        blobSASSignatureValues.identifier,
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        resource,
-	        timestamp,
-	        blobSASSignatureValues.encryptionScope,
-	        blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
-	        blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
-	        blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
-	        blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
-	        blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
-	    ].join("\n");
-	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope),
-	        stringToSign: stringToSign,
-	    };
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn.
-	 *
-	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param userDelegationKeyCredential -
-	 */
-	function generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    // Stored access policies are not supported for a user delegation SAS.
-	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
-	    }
-	    let resource = "c";
-	    let timestamp = blobSASSignatureValues.snapshotTime;
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	        if (blobSASSignatureValues.snapshotTime) {
-	            resource = "bs";
-	        }
-	        else if (blobSASSignatureValues.versionId) {
-	            resource = "bv";
-	            timestamp = blobSASSignatureValues.versionId;
-	        }
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
-	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
-	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedService,
-	        userDelegationKeyCredential.userDelegationKey.signedVersion,
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        resource,
-	        timestamp,
-	        blobSASSignatureValues.cacheControl,
-	        blobSASSignatureValues.contentDisposition,
-	        blobSASSignatureValues.contentEncoding,
-	        blobSASSignatureValues.contentLanguage,
-	        blobSASSignatureValues.contentType,
-	    ].join("\n");
-	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey),
-	        stringToSign: stringToSign,
-	    };
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2020-02-10.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn.
-	 *
-	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param userDelegationKeyCredential -
-	 */
-	function generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    // Stored access policies are not supported for a user delegation SAS.
-	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
-	    }
-	    let resource = "c";
-	    let timestamp = blobSASSignatureValues.snapshotTime;
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	        if (blobSASSignatureValues.snapshotTime) {
-	            resource = "bs";
-	        }
-	        else if (blobSASSignatureValues.versionId) {
-	            resource = "bv";
-	            timestamp = blobSASSignatureValues.versionId;
-	        }
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
-	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
-	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedService,
-	        userDelegationKeyCredential.userDelegationKey.signedVersion,
-	        blobSASSignatureValues.preauthorizedAgentObjectId,
-	        undefined, // agentObjectId
-	        blobSASSignatureValues.correlationId,
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        resource,
-	        timestamp,
-	        blobSASSignatureValues.cacheControl,
-	        blobSASSignatureValues.contentDisposition,
-	        blobSASSignatureValues.contentEncoding,
-	        blobSASSignatureValues.contentLanguage,
-	        blobSASSignatureValues.contentType,
-	    ].join("\n");
-	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId),
-	        stringToSign: stringToSign,
-	    };
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn.
-	 *
-	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param userDelegationKeyCredential -
-	 */
-	function generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    // Stored access policies are not supported for a user delegation SAS.
-	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
-	    }
-	    let resource = "c";
-	    let timestamp = blobSASSignatureValues.snapshotTime;
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	        if (blobSASSignatureValues.snapshotTime) {
-	            resource = "bs";
-	        }
-	        else if (blobSASSignatureValues.versionId) {
-	            resource = "bv";
-	            timestamp = blobSASSignatureValues.versionId;
-	        }
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
-	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
-	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedService,
-	        userDelegationKeyCredential.userDelegationKey.signedVersion,
-	        blobSASSignatureValues.preauthorizedAgentObjectId,
-	        undefined, // agentObjectId
-	        blobSASSignatureValues.correlationId,
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        resource,
-	        timestamp,
-	        blobSASSignatureValues.encryptionScope,
-	        blobSASSignatureValues.cacheControl,
-	        blobSASSignatureValues.contentDisposition,
-	        blobSASSignatureValues.contentEncoding,
-	        blobSASSignatureValues.contentLanguage,
-	        blobSASSignatureValues.contentType,
-	    ].join("\n");
-	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope),
-	        stringToSign: stringToSign,
-	    };
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
-	 *
-	 * Creates an instance of SASQueryParameters.
-	 *
-	 * Only accepts required settings needed to create a SAS. For optional settings please
-	 * set corresponding properties directly, such as permissions, startsOn.
-	 *
-	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
-	 *
-	 * @param blobSASSignatureValues -
-	 * @param userDelegationKeyCredential -
-	 */
-	function generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential) {
-	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
-	    // Stored access policies are not supported for a user delegation SAS.
-	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
-	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
-	    }
-	    let resource = "c";
-	    let timestamp = blobSASSignatureValues.snapshotTime;
-	    if (blobSASSignatureValues.blobName) {
-	        resource = "b";
-	        if (blobSASSignatureValues.snapshotTime) {
-	            resource = "bs";
-	        }
-	        else if (blobSASSignatureValues.versionId) {
-	            resource = "bv";
-	            timestamp = blobSASSignatureValues.versionId;
-	        }
-	    }
-	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
-	    let verifiedPermissions;
-	    if (blobSASSignatureValues.permissions) {
-	        if (blobSASSignatureValues.blobName) {
-	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	        else {
-	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
-	        }
-	    }
-	    // Signature is generated on the un-url-encoded values.
-	    const stringToSign = [
-	        verifiedPermissions ? verifiedPermissions : "",
-	        blobSASSignatureValues.startsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
-	            : "",
-	        blobSASSignatureValues.expiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
-	            : "",
-	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
-	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
-	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
-	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
-	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
-	            : "",
-	        userDelegationKeyCredential.userDelegationKey.signedService,
-	        userDelegationKeyCredential.userDelegationKey.signedVersion,
-	        blobSASSignatureValues.preauthorizedAgentObjectId,
-	        undefined, // agentObjectId
-	        blobSASSignatureValues.correlationId,
-	        undefined, // SignedKeyDelegatedUserTenantId, will be added in a future release.
-	        undefined, // SignedDelegatedUserObjectId, will be added in future release.
-	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
-	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
-	        blobSASSignatureValues.version,
-	        resource,
-	        timestamp,
-	        blobSASSignatureValues.encryptionScope,
-	        blobSASSignatureValues.cacheControl,
-	        blobSASSignatureValues.contentDisposition,
-	        blobSASSignatureValues.contentEncoding,
-	        blobSASSignatureValues.contentLanguage,
-	        blobSASSignatureValues.contentType,
-	    ].join("\n");
-	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope),
-	        stringToSign: stringToSign,
-	    };
-	}
-	function getCanonicalName(accountName, containerName, blobName) {
-	    // Container: "/blob/account/containerName"
-	    // Blob:      "/blob/account/containerName/blobName"
-	    const elements = [`/blob/${accountName}/${containerName}`];
-	    if (blobName) {
-	        elements.push(`/${blobName}`);
-	    }
-	    return elements.join("");
-	}
-	function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) {
-	    const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : constants_js_1.SERVICE_VERSION;
-	    if (blobSASSignatureValues.snapshotTime && version < "2018-11-09") {
-	        throw RangeError("'version' must be >= '2018-11-09' when providing 'snapshotTime'.");
-	    }
-	    if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.snapshotTime) {
-	        throw RangeError("Must provide 'blobName' when providing 'snapshotTime'.");
-	    }
-	    if (blobSASSignatureValues.versionId && version < "2019-10-10") {
-	        throw RangeError("'version' must be >= '2019-10-10' when providing 'versionId'.");
-	    }
-	    if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.versionId) {
-	        throw RangeError("Must provide 'blobName' when providing 'versionId'.");
-	    }
-	    if (blobSASSignatureValues.permissions &&
-	        blobSASSignatureValues.permissions.setImmutabilityPolicy &&
-	        version < "2020-08-04") {
-	        throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission.");
-	    }
-	    if (blobSASSignatureValues.permissions &&
-	        blobSASSignatureValues.permissions.deleteVersion &&
-	        version < "2019-10-10") {
-	        throw RangeError("'version' must be >= '2019-10-10' when providing 'x' permission.");
-	    }
-	    if (blobSASSignatureValues.permissions &&
-	        blobSASSignatureValues.permissions.permanentDelete &&
-	        version < "2019-10-10") {
-	        throw RangeError("'version' must be >= '2019-10-10' when providing 'y' permission.");
-	    }
-	    if (blobSASSignatureValues.permissions &&
-	        blobSASSignatureValues.permissions.tag &&
-	        version < "2019-12-12") {
-	        throw RangeError("'version' must be >= '2019-12-12' when providing 't' permission.");
-	    }
-	    if (version < "2020-02-10" &&
-	        blobSASSignatureValues.permissions &&
-	        (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) {
-	        throw RangeError("'version' must be >= '2020-02-10' when providing the 'm' or 'e' permission.");
-	    }
-	    if (version < "2021-04-10" &&
-	        blobSASSignatureValues.permissions &&
-	        blobSASSignatureValues.permissions.filterByTags) {
-	        throw RangeError("'version' must be >= '2021-04-10' when providing the 'f' permission.");
-	    }
-	    if (version < "2020-02-10" &&
-	        (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) {
-	        throw RangeError("'version' must be >= '2020-02-10' when providing 'preauthorizedAgentObjectId' or 'correlationId'.");
-	    }
-	    if (blobSASSignatureValues.encryptionScope && version < "2020-12-06") {
-	        throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS.");
-	    }
-	    blobSASSignatureValues.version = version;
-	    return blobSASSignatureValues;
-	}
-	
-	return BlobSASSignatureValues;
-}
-
-var BlobLeaseClient = {};
-
-var hasRequiredBlobLeaseClient;
-
-function requireBlobLeaseClient () {
-	if (hasRequiredBlobLeaseClient) return BlobLeaseClient;
-	hasRequiredBlobLeaseClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobLeaseClient, "__esModule", { value: true });
-	BlobLeaseClient.BlobLeaseClient = void 0;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const constants_js_1 = requireConstants$3();
-	const tracing_js_1 = requireTracing();
-	const utils_common_js_1 = requireUtils_common$2();
-	/**
-	 * A client that manages leases for a {@link ContainerClient} or a {@link BlobClient}.
-	 */
-	let BlobLeaseClient$1 = class BlobLeaseClient {
-	    _leaseId;
-	    _url;
-	    _containerOrBlobOperation;
-	    _isContainer;
-	    /**
-	     * Gets the lease Id.
-	     *
-	     * @readonly
-	     */
-	    get leaseId() {
-	        return this._leaseId;
-	    }
-	    /**
-	     * Gets the url.
-	     *
-	     * @readonly
-	     */
-	    get url() {
-	        return this._url;
-	    }
-	    /**
-	     * Creates an instance of BlobLeaseClient.
-	     * @param client - The client to make the lease operation requests.
-	     * @param leaseId - Initial proposed lease id.
-	     */
-	    constructor(client, leaseId) {
-	        const clientContext = client.storageClientContext;
-	        this._url = client.url;
-	        if (client.name === undefined) {
-	            this._isContainer = true;
-	            this._containerOrBlobOperation = clientContext.container;
-	        }
-	        else {
-	            this._isContainer = false;
-	            this._containerOrBlobOperation = clientContext.blob;
-	        }
-	        if (!leaseId) {
-	            leaseId = (0, core_util_1.randomUUID)();
-	        }
-	        this._leaseId = leaseId;
-	    }
-	    /**
-	     * Establishes and manages a lock on a container for delete operations, or on a blob
-	     * for write and delete operations.
-	     * The lock duration can be 15 to 60 seconds, or can be infinite.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
-	     * and
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
-	     *
-	     * @param duration - Must be between 15 to 60 seconds, or infinite (-1)
-	     * @param options - option to configure lease management operations.
-	     * @returns Response data for acquire lease operation.
-	     */
-	    async acquireLease(duration, options = {}) {
-	        if (this._isContainer &&
-	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
-	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
-	                options.conditions?.tagConditions)) {
-	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-acquireLease", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.acquireLease({
-	                abortSignal: options.abortSignal,
-	                duration,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                proposedLeaseId: this._leaseId,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * To change the ID of the lease.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
-	     * and
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
-	     *
-	     * @param proposedLeaseId - the proposed new lease Id.
-	     * @param options - option to configure lease management operations.
-	     * @returns Response data for change lease operation.
-	     */
-	    async changeLease(proposedLeaseId, options = {}) {
-	        if (this._isContainer &&
-	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
-	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
-	                options.conditions?.tagConditions)) {
-	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-changeLease", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId, {
-	                abortSignal: options.abortSignal,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            this._leaseId = proposedLeaseId;
-	            return response;
-	        });
-	    }
-	    /**
-	     * To free the lease if it is no longer needed so that another client may
-	     * immediately acquire a lease against the container or the blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
-	     * and
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
-	     *
-	     * @param options - option to configure lease management operations.
-	     * @returns Response data for release lease operation.
-	     */
-	    async releaseLease(options = {}) {
-	        if (this._isContainer &&
-	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
-	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
-	                options.conditions?.tagConditions)) {
-	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-releaseLease", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.releaseLease(this._leaseId, {
-	                abortSignal: options.abortSignal,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * To renew the lease.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
-	     * and
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
-	     *
-	     * @param options - Optional option to configure lease management operations.
-	     * @returns Response data for renew lease operation.
-	     */
-	    async renewLease(options = {}) {
-	        if (this._isContainer &&
-	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
-	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
-	                options.conditions?.tagConditions)) {
-	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-renewLease", options, async (updatedOptions) => {
-	            return this._containerOrBlobOperation.renewLease(this._leaseId, {
-	                abortSignal: options.abortSignal,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            });
-	        });
-	    }
-	    /**
-	     * To end the lease but ensure that another client cannot acquire a new lease
-	     * until the current lease period has expired.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
-	     * and
-	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
-	     *
-	     * @param breakPeriod - Break period
-	     * @param options - Optional options to configure lease management operations.
-	     * @returns Response data for break lease operation.
-	     */
-	    async breakLease(breakPeriod, options = {}) {
-	        if (this._isContainer &&
-	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
-	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
-	                options.conditions?.tagConditions)) {
-	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-breakLease", options, async (updatedOptions) => {
-	            const operationOptions = {
-	                abortSignal: options.abortSignal,
-	                breakPeriod,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            };
-	            return (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.breakLease(operationOptions));
-	        });
-	    }
-	};
-	BlobLeaseClient.BlobLeaseClient = BlobLeaseClient$1;
-	
-	return BlobLeaseClient;
-}
-
-var Clients = {};
-
-var BlobDownloadResponse = {};
-
-var RetriableReadableStream = {};
-
-var hasRequiredRetriableReadableStream;
-
-function requireRetriableReadableStream () {
-	if (hasRequiredRetriableReadableStream) return RetriableReadableStream;
-	hasRequiredRetriableReadableStream = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(RetriableReadableStream, "__esModule", { value: true });
-	RetriableReadableStream.RetriableReadableStream = void 0;
-	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
-	const node_stream_1 = require$$0$c;
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * A Node.js ReadableStream will internally retry when internal ReadableStream unexpected ends.
-	 */
-	let RetriableReadableStream$1 = class RetriableReadableStream extends node_stream_1.Readable {
-	    start;
-	    offset;
-	    end;
-	    getter;
-	    source;
-	    retries = 0;
-	    maxRetryRequests;
-	    onProgress;
-	    options;
-	    /**
-	     * Creates an instance of RetriableReadableStream.
-	     *
-	     * @param source - The current ReadableStream returned from getter
-	     * @param getter - A method calling downloading request returning
-	     *                                      a new ReadableStream from specified offset
-	     * @param offset - Offset position in original data source to read
-	     * @param count - How much data in original data source to read
-	     * @param options -
-	     */
-	    constructor(source, getter, offset, count, options = {}) {
-	        super({ highWaterMark: options.highWaterMark });
-	        this.getter = getter;
-	        this.source = source;
-	        this.start = offset;
-	        this.offset = offset;
-	        this.end = offset + count - 1;
-	        this.maxRetryRequests =
-	            options.maxRetryRequests && options.maxRetryRequests >= 0 ? options.maxRetryRequests : 0;
-	        this.onProgress = options.onProgress;
-	        this.options = options;
-	        this.setSourceEventHandlers();
-	    }
-	    _read() {
-	        this.source.resume();
-	    }
-	    setSourceEventHandlers() {
-	        this.source.on("data", this.sourceDataHandler);
-	        this.source.on("end", this.sourceErrorOrEndHandler);
-	        this.source.on("error", this.sourceErrorOrEndHandler);
-	        // needed for Node14
-	        this.source.on("aborted", this.sourceAbortedHandler);
-	    }
-	    removeSourceEventHandlers() {
-	        this.source.removeListener("data", this.sourceDataHandler);
-	        this.source.removeListener("end", this.sourceErrorOrEndHandler);
-	        this.source.removeListener("error", this.sourceErrorOrEndHandler);
-	        this.source.removeListener("aborted", this.sourceAbortedHandler);
-	    }
-	    sourceDataHandler = (data) => {
-	        if (this.options.doInjectErrorOnce) {
-	            this.options.doInjectErrorOnce = undefined;
-	            this.source.pause();
-	            this.sourceErrorOrEndHandler();
-	            this.source.destroy();
-	            return;
-	        }
-	        // console.log(
-	        //   `Offset: ${this.offset}, Received ${data.length} from internal stream`
-	        // );
-	        this.offset += data.length;
-	        if (this.onProgress) {
-	            this.onProgress({ loadedBytes: this.offset - this.start });
-	        }
-	        if (!this.push(data)) {
-	            this.source.pause();
-	        }
-	    };
-	    sourceAbortedHandler = () => {
-	        const abortError = new abort_controller_1.AbortError("The operation was aborted.");
-	        this.destroy(abortError);
-	    };
-	    sourceErrorOrEndHandler = (err) => {
-	        if (err && err.name === "AbortError") {
-	            this.destroy(err);
-	            return;
-	        }
-	        // console.log(
-	        //   `Source stream emits end or error, offset: ${
-	        //     this.offset
-	        //   }, dest end : ${this.end}`
-	        // );
-	        this.removeSourceEventHandlers();
-	        if (this.offset - 1 === this.end) {
-	            this.push(null);
-	        }
-	        else if (this.offset <= this.end) {
-	            // console.log(
-	            //   `retries: ${this.retries}, max retries: ${this.maxRetries}`
-	            // );
-	            if (this.retries < this.maxRetryRequests) {
-	                this.retries += 1;
-	                this.getter(this.offset)
-	                    .then((newSource) => {
-	                    this.source = newSource;
-	                    this.setSourceEventHandlers();
-	                    return;
-	                })
-	                    .catch((error) => {
-	                    this.destroy(error);
-	                });
-	            }
-	            else {
-	                this.destroy(new Error(`Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${this.offset - 1}, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${this.maxRetryRequests}`));
-	            }
-	        }
-	        else {
-	            this.destroy(new Error(`Data corruption failure: Received more data than original request, data needed offset is ${this.end}, received offset: ${this.offset - 1}`));
-	        }
-	    };
-	    _destroy(error, callback) {
-	        // remove listener from source and release source
-	        this.removeSourceEventHandlers();
-	        this.source.destroy();
-	        callback(error === null ? undefined : error);
-	    }
-	};
-	RetriableReadableStream.RetriableReadableStream = RetriableReadableStream$1;
-	
-	return RetriableReadableStream;
-}
-
-var hasRequiredBlobDownloadResponse;
-
-function requireBlobDownloadResponse () {
-	if (hasRequiredBlobDownloadResponse) return BlobDownloadResponse;
-	hasRequiredBlobDownloadResponse = 1;
-	Object.defineProperty(BlobDownloadResponse, "__esModule", { value: true });
-	BlobDownloadResponse.BlobDownloadResponse = void 0;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const RetriableReadableStream_js_1 = requireRetriableReadableStream();
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * BlobDownloadResponse implements BlobDownloadResponseParsed interface, and in Node.js runtime it will
-	 * automatically retry when internal read stream unexpected ends. (This kind of unexpected ends cannot
-	 * trigger retries defined in pipeline retry policy.)
-	 *
-	 * The {@link readableStreamBody} stream will retry underlayer, you can just use it as a normal Node.js
-	 * Readable stream.
-	 */
-	let BlobDownloadResponse$1 = class BlobDownloadResponse {
-	    /**
-	     * Indicates that the service supports
-	     * requests for partial file content.
-	     *
-	     * @readonly
-	     */
-	    get acceptRanges() {
-	        return this.originalResponse.acceptRanges;
-	    }
-	    /**
-	     * Returns if it was previously specified
-	     * for the file.
-	     *
-	     * @readonly
-	     */
-	    get cacheControl() {
-	        return this.originalResponse.cacheControl;
-	    }
-	    /**
-	     * Returns the value that was specified
-	     * for the 'x-ms-content-disposition' header and specifies how to process the
-	     * response.
-	     *
-	     * @readonly
-	     */
-	    get contentDisposition() {
-	        return this.originalResponse.contentDisposition;
-	    }
-	    /**
-	     * Returns the value that was specified
-	     * for the Content-Encoding request header.
-	     *
-	     * @readonly
-	     */
-	    get contentEncoding() {
-	        return this.originalResponse.contentEncoding;
-	    }
-	    /**
-	     * Returns the value that was specified
-	     * for the Content-Language request header.
-	     *
-	     * @readonly
-	     */
-	    get contentLanguage() {
-	        return this.originalResponse.contentLanguage;
-	    }
-	    /**
-	     * The current sequence number for a
-	     * page blob. This header is not returned for block blobs or append blobs.
-	     *
-	     * @readonly
-	     */
-	    get blobSequenceNumber() {
-	        return this.originalResponse.blobSequenceNumber;
-	    }
-	    /**
-	     * The blob's type. Possible values include:
-	     * 'BlockBlob', 'PageBlob', 'AppendBlob'.
-	     *
-	     * @readonly
-	     */
-	    get blobType() {
-	        return this.originalResponse.blobType;
-	    }
-	    /**
-	     * The number of bytes present in the
-	     * response body.
-	     *
-	     * @readonly
-	     */
-	    get contentLength() {
-	        return this.originalResponse.contentLength;
-	    }
-	    /**
-	     * If the file has an MD5 hash and the
-	     * request is to read the full file, this response header is returned so that
-	     * the client can check for message content integrity. If the request is to
-	     * read a specified range and the 'x-ms-range-get-content-md5' is set to
-	     * true, then the request returns an MD5 hash for the range, as long as the
-	     * range size is less than or equal to 4 MB. If neither of these sets of
-	     * conditions is true, then no value is returned for the 'Content-MD5'
-	     * header.
-	     *
-	     * @readonly
-	     */
-	    get contentMD5() {
-	        return this.originalResponse.contentMD5;
-	    }
-	    /**
-	     * Indicates the range of bytes returned if
-	     * the client requested a subset of the file by setting the Range request
-	     * header.
-	     *
-	     * @readonly
-	     */
-	    get contentRange() {
-	        return this.originalResponse.contentRange;
-	    }
-	    /**
-	     * The content type specified for the file.
-	     * The default content type is 'application/octet-stream'
-	     *
-	     * @readonly
-	     */
-	    get contentType() {
-	        return this.originalResponse.contentType;
-	    }
-	    /**
-	     * Conclusion time of the last attempted
-	     * Copy File operation where this file was the destination file. This value
-	     * can specify the time of a completed, aborted, or failed copy attempt.
-	     *
-	     * @readonly
-	     */
-	    get copyCompletedOn() {
-	        return this.originalResponse.copyCompletedOn;
-	    }
-	    /**
-	     * String identifier for the last attempted Copy
-	     * File operation where this file was the destination file.
-	     *
-	     * @readonly
-	     */
-	    get copyId() {
-	        return this.originalResponse.copyId;
-	    }
-	    /**
-	     * Contains the number of bytes copied and
-	     * the total bytes in the source in the last attempted Copy File operation
-	     * where this file was the destination file. Can show between 0 and
-	     * Content-Length bytes copied.
-	     *
-	     * @readonly
-	     */
-	    get copyProgress() {
-	        return this.originalResponse.copyProgress;
-	    }
-	    /**
-	     * URL up to 2KB in length that specifies the
-	     * source file used in the last attempted Copy File operation where this file
-	     * was the destination file.
-	     *
-	     * @readonly
-	     */
-	    get copySource() {
-	        return this.originalResponse.copySource;
-	    }
-	    /**
-	     * State of the copy operation
-	     * identified by 'x-ms-copy-id'. Possible values include: 'pending',
-	     * 'success', 'aborted', 'failed'
-	     *
-	     * @readonly
-	     */
-	    get copyStatus() {
-	        return this.originalResponse.copyStatus;
-	    }
-	    /**
-	     * Only appears when
-	     * x-ms-copy-status is failed or pending. Describes cause of fatal or
-	     * non-fatal copy operation failure.
-	     *
-	     * @readonly
-	     */
-	    get copyStatusDescription() {
-	        return this.originalResponse.copyStatusDescription;
-	    }
-	    /**
-	     * When a blob is leased,
-	     * specifies whether the lease is of infinite or fixed duration. Possible
-	     * values include: 'infinite', 'fixed'.
-	     *
-	     * @readonly
-	     */
-	    get leaseDuration() {
-	        return this.originalResponse.leaseDuration;
-	    }
-	    /**
-	     * Lease state of the blob. Possible
-	     * values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
-	     *
-	     * @readonly
-	     */
-	    get leaseState() {
-	        return this.originalResponse.leaseState;
-	    }
-	    /**
-	     * The current lease status of the
-	     * blob. Possible values include: 'locked', 'unlocked'.
-	     *
-	     * @readonly
-	     */
-	    get leaseStatus() {
-	        return this.originalResponse.leaseStatus;
-	    }
-	    /**
-	     * A UTC date/time value generated by the service that
-	     * indicates the time at which the response was initiated.
-	     *
-	     * @readonly
-	     */
-	    get date() {
-	        return this.originalResponse.date;
-	    }
-	    /**
-	     * The number of committed blocks
-	     * present in the blob. This header is returned only for append blobs.
-	     *
-	     * @readonly
-	     */
-	    get blobCommittedBlockCount() {
-	        return this.originalResponse.blobCommittedBlockCount;
-	    }
-	    /**
-	     * The ETag contains a value that you can use to
-	     * perform operations conditionally, in quotes.
-	     *
-	     * @readonly
-	     */
-	    get etag() {
-	        return this.originalResponse.etag;
-	    }
-	    /**
-	     * The number of tags associated with the blob
-	     *
-	     * @readonly
-	     */
-	    get tagCount() {
-	        return this.originalResponse.tagCount;
-	    }
-	    /**
-	     * The error code.
-	     *
-	     * @readonly
-	     */
-	    get errorCode() {
-	        return this.originalResponse.errorCode;
-	    }
-	    /**
-	     * The value of this header is set to
-	     * true if the file data and application metadata are completely encrypted
-	     * using the specified algorithm. Otherwise, the value is set to false (when
-	     * the file is unencrypted, or if only parts of the file/application metadata
-	     * are encrypted).
-	     *
-	     * @readonly
-	     */
-	    get isServerEncrypted() {
-	        return this.originalResponse.isServerEncrypted;
-	    }
-	    /**
-	     * If the blob has a MD5 hash, and if
-	     * request contains range header (Range or x-ms-range), this response header
-	     * is returned with the value of the whole blob's MD5 value. This value may
-	     * or may not be equal to the value returned in Content-MD5 header, with the
-	     * latter calculated from the requested range.
-	     *
-	     * @readonly
-	     */
-	    get blobContentMD5() {
-	        return this.originalResponse.blobContentMD5;
-	    }
-	    /**
-	     * Returns the date and time the file was last
-	     * modified. Any operation that modifies the file or its properties updates
-	     * the last modified time.
-	     *
-	     * @readonly
-	     */
-	    get lastModified() {
-	        return this.originalResponse.lastModified;
-	    }
-	    /**
-	     * Returns the UTC date and time generated by the service that indicates the time at which the blob was
-	     * last read or written to.
-	     *
-	     * @readonly
-	     */
-	    get lastAccessed() {
-	        return this.originalResponse.lastAccessed;
-	    }
-	    /**
-	     * Returns the date and time the blob was created.
-	     *
-	     * @readonly
-	     */
-	    get createdOn() {
-	        return this.originalResponse.createdOn;
-	    }
-	    /**
-	     * A name-value pair
-	     * to associate with a file storage object.
-	     *
-	     * @readonly
-	     */
-	    get metadata() {
-	        return this.originalResponse.metadata;
-	    }
-	    /**
-	     * This header uniquely identifies the request
-	     * that was made and can be used for troubleshooting the request.
-	     *
-	     * @readonly
-	     */
-	    get requestId() {
-	        return this.originalResponse.requestId;
-	    }
-	    /**
-	     * If a client request id header is sent in the request, this header will be present in the
-	     * response with the same value.
-	     *
-	     * @readonly
-	     */
-	    get clientRequestId() {
-	        return this.originalResponse.clientRequestId;
-	    }
-	    /**
-	     * Indicates the version of the Blob service used
-	     * to execute the request.
-	     *
-	     * @readonly
-	     */
-	    get version() {
-	        return this.originalResponse.version;
-	    }
-	    /**
-	     * Indicates the versionId of the downloaded blob version.
-	     *
-	     * @readonly
-	     */
-	    get versionId() {
-	        return this.originalResponse.versionId;
-	    }
-	    /**
-	     * Indicates whether version of this blob is a current version.
-	     *
-	     * @readonly
-	     */
-	    get isCurrentVersion() {
-	        return this.originalResponse.isCurrentVersion;
-	    }
-	    /**
-	     * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
-	     * when the blob was encrypted with a customer-provided key.
-	     *
-	     * @readonly
-	     */
-	    get encryptionKeySha256() {
-	        return this.originalResponse.encryptionKeySha256;
-	    }
-	    /**
-	     * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
-	     * true, then the request returns a crc64 for the range, as long as the range size is less than
-	     * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
-	     * specified in the same request, it will fail with 400(Bad Request)
-	     */
-	    get contentCrc64() {
-	        return this.originalResponse.contentCrc64;
-	    }
-	    /**
-	     * Object Replication Policy Id of the destination blob.
-	     *
-	     * @readonly
-	     */
-	    get objectReplicationDestinationPolicyId() {
-	        return this.originalResponse.objectReplicationDestinationPolicyId;
-	    }
-	    /**
-	     * Parsed Object Replication Policy Id, Rule Id(s) and status of the source blob.
-	     *
-	     * @readonly
-	     */
-	    get objectReplicationSourceProperties() {
-	        return this.originalResponse.objectReplicationSourceProperties;
-	    }
-	    /**
-	     * If this blob has been sealed.
-	     *
-	     * @readonly
-	     */
-	    get isSealed() {
-	        return this.originalResponse.isSealed;
-	    }
-	    /**
-	     * UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire.
-	     *
-	     * @readonly
-	     */
-	    get immutabilityPolicyExpiresOn() {
-	        return this.originalResponse.immutabilityPolicyExpiresOn;
-	    }
-	    /**
-	     * Indicates immutability policy mode.
-	     *
-	     * @readonly
-	     */
-	    get immutabilityPolicyMode() {
-	        return this.originalResponse.immutabilityPolicyMode;
-	    }
-	    /**
-	     * Indicates if a legal hold is present on the blob.
-	     *
-	     * @readonly
-	     */
-	    get legalHold() {
-	        return this.originalResponse.legalHold;
-	    }
-	    /**
-	     * The response body as a browser Blob.
-	     * Always undefined in node.js.
-	     *
-	     * @readonly
-	     */
-	    get contentAsBlob() {
-	        return this.originalResponse.blobBody;
-	    }
-	    /**
-	     * The response body as a node.js Readable stream.
-	     * Always undefined in the browser.
-	     *
-	     * It will automatically retry when internal read stream unexpected ends.
-	     *
-	     * @readonly
-	     */
-	    get readableStreamBody() {
-	        return core_util_1.isNodeLike ? this.blobDownloadStream : undefined;
-	    }
-	    /**
-	     * The HTTP response.
-	     */
-	    get _response() {
-	        return this.originalResponse._response;
-	    }
-	    originalResponse;
-	    blobDownloadStream;
-	    /**
-	     * Creates an instance of BlobDownloadResponse.
-	     *
-	     * @param originalResponse -
-	     * @param getter -
-	     * @param offset -
-	     * @param count -
-	     * @param options -
-	     */
-	    constructor(originalResponse, getter, offset, count, options = {}) {
-	        this.originalResponse = originalResponse;
-	        this.blobDownloadStream = new RetriableReadableStream_js_1.RetriableReadableStream(this.originalResponse.readableStreamBody, getter, offset, count, options);
-	    }
-	};
-	BlobDownloadResponse.BlobDownloadResponse = BlobDownloadResponse$1;
-	
-	return BlobDownloadResponse;
-}
-
-var BlobQueryResponse = {};
-
-var BlobQuickQueryStream = {};
-
-var internalAvro = {};
-
-var AvroReader = {};
-
-var AvroConstants = {};
-
-var hasRequiredAvroConstants;
-
-function requireAvroConstants () {
-	if (hasRequiredAvroConstants) return AvroConstants;
-	hasRequiredAvroConstants = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AvroConstants, "__esModule", { value: true });
-	AvroConstants.AVRO_SCHEMA_KEY = AvroConstants.AVRO_CODEC_KEY = AvroConstants.AVRO_INIT_BYTES = AvroConstants.AVRO_SYNC_MARKER_SIZE = void 0;
-	AvroConstants.AVRO_SYNC_MARKER_SIZE = 16;
-	AvroConstants.AVRO_INIT_BYTES = new Uint8Array([79, 98, 106, 1]);
-	AvroConstants.AVRO_CODEC_KEY = "avro.codec";
-	AvroConstants.AVRO_SCHEMA_KEY = "avro.schema";
-	
-	return AvroConstants;
-}
-
-var AvroParser = {};
-
-var hasRequiredAvroParser;
-
-function requireAvroParser () {
-	if (hasRequiredAvroParser) return AvroParser;
-	hasRequiredAvroParser = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AvroParser, "__esModule", { value: true });
-	AvroParser.AvroType = AvroParser.AvroParser = void 0;
-	let AvroParser$1 = class AvroParser {
-	    /**
-	     * Reads a fixed number of bytes from the stream.
-	     *
-	     * @param stream -
-	     * @param length -
-	     * @param options -
-	     */
-	    static async readFixedBytes(stream, length, options = {}) {
-	        const bytes = await stream.read(length, { abortSignal: options.abortSignal });
-	        if (bytes.length !== length) {
-	            throw new Error("Hit stream end.");
-	        }
-	        return bytes;
-	    }
-	    /**
-	     * Reads a single byte from the stream.
-	     *
-	     * @param stream -
-	     * @param options -
-	     */
-	    static async readByte(stream, options = {}) {
-	        const buf = await AvroParser.readFixedBytes(stream, 1, options);
-	        return buf[0];
-	    }
-	    // int and long are stored in variable-length zig-zag coding.
-	    // variable-length: https://lucene.apache.org/core/3_5_0/fileformats.html#VInt
-	    // zig-zag: https://developers.google.com/protocol-buffers/docs/encoding?csw=1#types
-	    static async readZigZagLong(stream, options = {}) {
-	        let zigZagEncoded = 0;
-	        let significanceInBit = 0;
-	        let byte, haveMoreByte, significanceInFloat;
-	        do {
-	            byte = await AvroParser.readByte(stream, options);
-	            haveMoreByte = byte & 0x80;
-	            zigZagEncoded |= (byte & 0x7f) << significanceInBit;
-	            significanceInBit += 7;
-	        } while (haveMoreByte && significanceInBit < 28); // bitwise operation only works for 32-bit integers
-	        if (haveMoreByte) {
-	            // Switch to float arithmetic
-	            // eslint-disable-next-line no-self-assign
-	            zigZagEncoded = zigZagEncoded;
-	            significanceInFloat = 268435456; // 2 ** 28.
-	            do {
-	                byte = await AvroParser.readByte(stream, options);
-	                zigZagEncoded += (byte & 0x7f) * significanceInFloat;
-	                significanceInFloat *= 128; // 2 ** 7
-	            } while (byte & 0x80);
-	            const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2;
-	            if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) {
-	                throw new Error("Integer overflow.");
-	            }
-	            return res;
-	        }
-	        return (zigZagEncoded >> 1) ^ -(zigZagEncoded & 1);
-	    }
-	    static async readLong(stream, options = {}) {
-	        return AvroParser.readZigZagLong(stream, options);
-	    }
-	    static async readInt(stream, options = {}) {
-	        return AvroParser.readZigZagLong(stream, options);
-	    }
-	    static async readNull() {
-	        return null;
-	    }
-	    static async readBoolean(stream, options = {}) {
-	        const b = await AvroParser.readByte(stream, options);
-	        if (b === 1) {
-	            return true;
-	        }
-	        else if (b === 0) {
-	            return false;
-	        }
-	        else {
-	            throw new Error("Byte was not a boolean.");
-	        }
-	    }
-	    static async readFloat(stream, options = {}) {
-	        const u8arr = await AvroParser.readFixedBytes(stream, 4, options);
-	        const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);
-	        return view.getFloat32(0, true); // littleEndian = true
-	    }
-	    static async readDouble(stream, options = {}) {
-	        const u8arr = await AvroParser.readFixedBytes(stream, 8, options);
-	        const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);
-	        return view.getFloat64(0, true); // littleEndian = true
-	    }
-	    static async readBytes(stream, options = {}) {
-	        const size = await AvroParser.readLong(stream, options);
-	        if (size < 0) {
-	            throw new Error("Bytes size was negative.");
-	        }
-	        return stream.read(size, { abortSignal: options.abortSignal });
-	    }
-	    static async readString(stream, options = {}) {
-	        const u8arr = await AvroParser.readBytes(stream, options);
-	        const utf8decoder = new TextDecoder();
-	        return utf8decoder.decode(u8arr);
-	    }
-	    static async readMapPair(stream, readItemMethod, options = {}) {
-	        const key = await AvroParser.readString(stream, options);
-	        // FUTURE: this won't work with readFixed (currently not supported) which needs a length as the parameter.
-	        const value = await readItemMethod(stream, options);
-	        return { key, value };
-	    }
-	    static async readMap(stream, readItemMethod, options = {}) {
-	        const readPairMethod = (s, opts = {}) => {
-	            return AvroParser.readMapPair(s, readItemMethod, opts);
-	        };
-	        const pairs = await AvroParser.readArray(stream, readPairMethod, options);
-	        const dict = {};
-	        for (const pair of pairs) {
-	            dict[pair.key] = pair.value;
-	        }
-	        return dict;
-	    }
-	    static async readArray(stream, readItemMethod, options = {}) {
-	        const items = [];
-	        for (let count = await AvroParser.readLong(stream, options); count !== 0; count = await AvroParser.readLong(stream, options)) {
-	            if (count < 0) {
-	                // Ignore block sizes
-	                await AvroParser.readLong(stream, options);
-	                count = -count;
-	            }
-	            while (count--) {
-	                const item = await readItemMethod(stream, options);
-	                items.push(item);
-	            }
-	        }
-	        return items;
-	    }
-	};
-	AvroParser.AvroParser = AvroParser$1;
-	var AvroComplex;
-	(function (AvroComplex) {
-	    AvroComplex["RECORD"] = "record";
-	    AvroComplex["ENUM"] = "enum";
-	    AvroComplex["ARRAY"] = "array";
-	    AvroComplex["MAP"] = "map";
-	    AvroComplex["UNION"] = "union";
-	    AvroComplex["FIXED"] = "fixed";
-	})(AvroComplex || (AvroComplex = {}));
-	var AvroPrimitive;
-	(function (AvroPrimitive) {
-	    AvroPrimitive["NULL"] = "null";
-	    AvroPrimitive["BOOLEAN"] = "boolean";
-	    AvroPrimitive["INT"] = "int";
-	    AvroPrimitive["LONG"] = "long";
-	    AvroPrimitive["FLOAT"] = "float";
-	    AvroPrimitive["DOUBLE"] = "double";
-	    AvroPrimitive["BYTES"] = "bytes";
-	    AvroPrimitive["STRING"] = "string";
-	})(AvroPrimitive || (AvroPrimitive = {}));
-	class AvroType {
-	    /**
-	     * Determines the AvroType from the Avro Schema.
-	     */
-	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
-	    static fromSchema(schema) {
-	        if (typeof schema === "string") {
-	            return AvroType.fromStringSchema(schema);
-	        }
-	        else if (Array.isArray(schema)) {
-	            return AvroType.fromArraySchema(schema);
-	        }
-	        else {
-	            return AvroType.fromObjectSchema(schema);
-	        }
-	    }
-	    static fromStringSchema(schema) {
-	        switch (schema) {
-	            case AvroPrimitive.NULL:
-	            case AvroPrimitive.BOOLEAN:
-	            case AvroPrimitive.INT:
-	            case AvroPrimitive.LONG:
-	            case AvroPrimitive.FLOAT:
-	            case AvroPrimitive.DOUBLE:
-	            case AvroPrimitive.BYTES:
-	            case AvroPrimitive.STRING:
-	                return new AvroPrimitiveType(schema);
-	            default:
-	                throw new Error(`Unexpected Avro type ${schema}`);
-	        }
-	    }
-	    static fromArraySchema(schema) {
-	        return new AvroUnionType(schema.map(AvroType.fromSchema));
-	    }
-	    static fromObjectSchema(schema) {
-	        const type = schema.type;
-	        // Primitives can be defined as strings or objects
-	        try {
-	            return AvroType.fromStringSchema(type);
-	        }
-	        catch {
-	            // no-op
-	        }
-	        switch (type) {
-	            case AvroComplex.RECORD:
-	                if (schema.aliases) {
-	                    throw new Error(`aliases currently is not supported, schema: ${schema}`);
-	                }
-	                if (!schema.name) {
-	                    throw new Error(`Required attribute 'name' doesn't exist on schema: ${schema}`);
-	                }
-	                // eslint-disable-next-line no-case-declarations
-	                const fields = {};
-	                if (!schema.fields) {
-	                    throw new Error(`Required attribute 'fields' doesn't exist on schema: ${schema}`);
-	                }
-	                for (const field of schema.fields) {
-	                    fields[field.name] = AvroType.fromSchema(field.type);
-	                }
-	                return new AvroRecordType(fields, schema.name);
-	            case AvroComplex.ENUM:
-	                if (schema.aliases) {
-	                    throw new Error(`aliases currently is not supported, schema: ${schema}`);
-	                }
-	                if (!schema.symbols) {
-	                    throw new Error(`Required attribute 'symbols' doesn't exist on schema: ${schema}`);
-	                }
-	                return new AvroEnumType(schema.symbols);
-	            case AvroComplex.MAP:
-	                if (!schema.values) {
-	                    throw new Error(`Required attribute 'values' doesn't exist on schema: ${schema}`);
-	                }
-	                return new AvroMapType(AvroType.fromSchema(schema.values));
-	            case AvroComplex.ARRAY: // Unused today
-	            case AvroComplex.FIXED: // Unused today
-	            default:
-	                throw new Error(`Unexpected Avro type ${type} in ${schema}`);
-	        }
-	    }
-	}
-	AvroParser.AvroType = AvroType;
-	class AvroPrimitiveType extends AvroType {
-	    _primitive;
-	    constructor(primitive) {
-	        super();
-	        this._primitive = primitive;
-	    }
-	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
-	    read(stream, options = {}) {
-	        switch (this._primitive) {
-	            case AvroPrimitive.NULL:
-	                return AvroParser$1.readNull();
-	            case AvroPrimitive.BOOLEAN:
-	                return AvroParser$1.readBoolean(stream, options);
-	            case AvroPrimitive.INT:
-	                return AvroParser$1.readInt(stream, options);
-	            case AvroPrimitive.LONG:
-	                return AvroParser$1.readLong(stream, options);
-	            case AvroPrimitive.FLOAT:
-	                return AvroParser$1.readFloat(stream, options);
-	            case AvroPrimitive.DOUBLE:
-	                return AvroParser$1.readDouble(stream, options);
-	            case AvroPrimitive.BYTES:
-	                return AvroParser$1.readBytes(stream, options);
-	            case AvroPrimitive.STRING:
-	                return AvroParser$1.readString(stream, options);
-	            default:
-	                throw new Error("Unknown Avro Primitive");
-	        }
-	    }
-	}
-	class AvroEnumType extends AvroType {
-	    _symbols;
-	    constructor(symbols) {
-	        super();
-	        this._symbols = symbols;
-	    }
-	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
-	    async read(stream, options = {}) {
-	        const value = await AvroParser$1.readInt(stream, options);
-	        return this._symbols[value];
-	    }
-	}
-	class AvroUnionType extends AvroType {
-	    _types;
-	    constructor(types) {
-	        super();
-	        this._types = types;
-	    }
-	    async read(stream, options = {}) {
-	        const typeIndex = await AvroParser$1.readInt(stream, options);
-	        return this._types[typeIndex].read(stream, options);
-	    }
-	}
-	class AvroMapType extends AvroType {
-	    _itemType;
-	    constructor(itemType) {
-	        super();
-	        this._itemType = itemType;
-	    }
-	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
-	    read(stream, options = {}) {
-	        const readItemMethod = (s, opts) => {
-	            return this._itemType.read(s, opts);
-	        };
-	        return AvroParser$1.readMap(stream, readItemMethod, options);
-	    }
-	}
-	class AvroRecordType extends AvroType {
-	    _name;
-	    _fields;
-	    constructor(fields, name) {
-	        super();
-	        this._fields = fields;
-	        this._name = name;
-	    }
-	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
-	    async read(stream, options = {}) {
-	        // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
-	        const record = {};
-	        record["$schema"] = this._name;
-	        for (const key in this._fields) {
-	            if (Object.prototype.hasOwnProperty.call(this._fields, key)) {
-	                record[key] = await this._fields[key].read(stream, options);
-	            }
-	        }
-	        return record;
-	    }
-	}
-	
-	return AvroParser;
-}
-
-var utils_common = {};
-
-var hasRequiredUtils_common;
-
-function requireUtils_common () {
-	if (hasRequiredUtils_common) return utils_common;
-	hasRequiredUtils_common = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(utils_common, "__esModule", { value: true });
-	utils_common.arraysEqual = arraysEqual;
-	function arraysEqual(a, b) {
-	    if (a === b)
-	        return true;
-	    if (a == null || b == null)
-	        return false;
-	    if (a.length !== b.length)
-	        return false;
-	    for (let i = 0; i < a.length; ++i) {
-	        if (a[i] !== b[i])
-	            return false;
-	    }
-	    return true;
-	}
-	
-	return utils_common;
-}
-
-var hasRequiredAvroReader;
-
-function requireAvroReader () {
-	if (hasRequiredAvroReader) return AvroReader;
-	hasRequiredAvroReader = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AvroReader, "__esModule", { value: true });
-	AvroReader.AvroReader = void 0;
-	// TODO: Do a review of non-interfaces
-	/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */
-	const AvroConstants_js_1 = requireAvroConstants();
-	const AvroParser_js_1 = requireAvroParser();
-	const utils_common_js_1 = requireUtils_common();
-	let AvroReader$1 = class AvroReader {
-	    _dataStream;
-	    _headerStream;
-	    _syncMarker;
-	    _metadata;
-	    _itemType;
-	    _itemsRemainingInBlock;
-	    // Remembers where we started if partial data stream was provided.
-	    _initialBlockOffset;
-	    /// The byte offset within the Avro file (both header and data)
-	    /// of the start of the current block.
-	    _blockOffset;
-	    get blockOffset() {
-	        return this._blockOffset;
-	    }
-	    _objectIndex;
-	    get objectIndex() {
-	        return this._objectIndex;
-	    }
-	    _initialized;
-	    constructor(dataStream, headerStream, currentBlockOffset, indexWithinCurrentBlock) {
-	        this._dataStream = dataStream;
-	        this._headerStream = headerStream || dataStream;
-	        this._initialized = false;
-	        this._blockOffset = currentBlockOffset || 0;
-	        this._objectIndex = indexWithinCurrentBlock || 0;
-	        this._initialBlockOffset = currentBlockOffset || 0;
-	    }
-	    async initialize(options = {}) {
-	        const header = await AvroParser_js_1.AvroParser.readFixedBytes(this._headerStream, AvroConstants_js_1.AVRO_INIT_BYTES.length, {
-	            abortSignal: options.abortSignal,
-	        });
-	        if (!(0, utils_common_js_1.arraysEqual)(header, AvroConstants_js_1.AVRO_INIT_BYTES)) {
-	            throw new Error("Stream is not an Avro file.");
-	        }
-	        // File metadata is written as if defined by the following map schema:
-	        // { "type": "map", "values": "bytes"}
-	        this._metadata = await AvroParser_js_1.AvroParser.readMap(this._headerStream, AvroParser_js_1.AvroParser.readString, {
-	            abortSignal: options.abortSignal,
-	        });
-	        // Validate codec
-	        const codec = this._metadata[AvroConstants_js_1.AVRO_CODEC_KEY];
-	        if (!(codec === undefined || codec === null || codec === "null")) {
-	            throw new Error("Codecs are not supported");
-	        }
-	        // The 16-byte, randomly-generated sync marker for this file.
-	        this._syncMarker = await AvroParser_js_1.AvroParser.readFixedBytes(this._headerStream, AvroConstants_js_1.AVRO_SYNC_MARKER_SIZE, {
-	            abortSignal: options.abortSignal,
-	        });
-	        // Parse the schema
-	        const schema = JSON.parse(this._metadata[AvroConstants_js_1.AVRO_SCHEMA_KEY]);
-	        this._itemType = AvroParser_js_1.AvroType.fromSchema(schema);
-	        if (this._blockOffset === 0) {
-	            this._blockOffset = this._initialBlockOffset + this._dataStream.position;
-	        }
-	        this._itemsRemainingInBlock = await AvroParser_js_1.AvroParser.readLong(this._dataStream, {
-	            abortSignal: options.abortSignal,
-	        });
-	        // skip block length
-	        await AvroParser_js_1.AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });
-	        this._initialized = true;
-	        if (this._objectIndex && this._objectIndex > 0) {
-	            for (let i = 0; i < this._objectIndex; i++) {
-	                await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal });
-	                this._itemsRemainingInBlock--;
-	            }
-	        }
-	    }
-	    hasNext() {
-	        return !this._initialized || this._itemsRemainingInBlock > 0;
-	    }
-	    async *parseObjects(options = {}) {
-	        if (!this._initialized) {
-	            await this.initialize(options);
-	        }
-	        while (this.hasNext()) {
-	            const result = await this._itemType.read(this._dataStream, {
-	                abortSignal: options.abortSignal,
-	            });
-	            this._itemsRemainingInBlock--;
-	            this._objectIndex++;
-	            if (this._itemsRemainingInBlock === 0) {
-	                const marker = await AvroParser_js_1.AvroParser.readFixedBytes(this._dataStream, AvroConstants_js_1.AVRO_SYNC_MARKER_SIZE, {
-	                    abortSignal: options.abortSignal,
-	                });
-	                this._blockOffset = this._initialBlockOffset + this._dataStream.position;
-	                this._objectIndex = 0;
-	                if (!(0, utils_common_js_1.arraysEqual)(this._syncMarker, marker)) {
-	                    throw new Error("Stream is not a valid Avro file.");
-	                }
-	                try {
-	                    this._itemsRemainingInBlock = await AvroParser_js_1.AvroParser.readLong(this._dataStream, {
-	                        abortSignal: options.abortSignal,
-	                    });
-	                }
-	                catch {
-	                    // We hit the end of the stream.
-	                    this._itemsRemainingInBlock = 0;
-	                }
-	                if (this._itemsRemainingInBlock > 0) {
-	                    // Ignore block size
-	                    await AvroParser_js_1.AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });
-	                }
-	            }
-	            yield result;
-	        }
-	    }
-	};
-	AvroReader.AvroReader = AvroReader$1;
-	
-	return AvroReader;
-}
-
-var AvroReadable = {};
-
-var hasRequiredAvroReadable;
-
-function requireAvroReadable () {
-	if (hasRequiredAvroReadable) return AvroReadable;
-	hasRequiredAvroReadable = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AvroReadable, "__esModule", { value: true });
-	AvroReadable.AvroReadable = void 0;
-	let AvroReadable$1 = class AvroReadable {
-	};
-	AvroReadable.AvroReadable = AvroReadable$1;
-	
-	return AvroReadable;
-}
-
-var AvroReadableFromStream = {};
-
-var hasRequiredAvroReadableFromStream;
-
-function requireAvroReadableFromStream () {
-	if (hasRequiredAvroReadableFromStream) return AvroReadableFromStream;
-	hasRequiredAvroReadableFromStream = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AvroReadableFromStream, "__esModule", { value: true });
-	AvroReadableFromStream.AvroReadableFromStream = void 0;
-	const AvroReadable_js_1 = requireAvroReadable();
-	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
-	const buffer_1 = require$$7;
-	const ABORT_ERROR = new abort_controller_1.AbortError("Reading from the avro stream was aborted.");
-	let AvroReadableFromStream$1 = class AvroReadableFromStream extends AvroReadable_js_1.AvroReadable {
-	    _position;
-	    _readable;
-	    toUint8Array(data) {
-	        if (typeof data === "string") {
-	            return buffer_1.Buffer.from(data);
-	        }
-	        return data;
-	    }
-	    constructor(readable) {
-	        super();
-	        this._readable = readable;
-	        this._position = 0;
-	    }
-	    get position() {
-	        return this._position;
-	    }
-	    async read(size, options = {}) {
-	        if (options.abortSignal?.aborted) {
-	            throw ABORT_ERROR;
-	        }
-	        if (size < 0) {
-	            throw new Error(`size parameter should be positive: ${size}`);
-	        }
-	        if (size === 0) {
-	            return new Uint8Array();
-	        }
-	        if (!this._readable.readable) {
-	            throw new Error("Stream no longer readable.");
-	        }
-	        // See if there is already enough data.
-	        const chunk = this._readable.read(size);
-	        if (chunk) {
-	            this._position += chunk.length;
-	            // chunk.length maybe less than desired size if the stream ends.
-	            return this.toUint8Array(chunk);
-	        }
-	        else {
-	            // register callback to wait for enough data to read
-	            return new Promise((resolve, reject) => {
-	                /* eslint-disable @typescript-eslint/no-use-before-define */
-	                const cleanUp = () => {
-	                    this._readable.removeListener("readable", readableCallback);
-	                    this._readable.removeListener("error", rejectCallback);
-	                    this._readable.removeListener("end", rejectCallback);
-	                    this._readable.removeListener("close", rejectCallback);
-	                    if (options.abortSignal) {
-	                        options.abortSignal.removeEventListener("abort", abortHandler);
-	                    }
-	                };
-	                const readableCallback = () => {
-	                    const callbackChunk = this._readable.read(size);
-	                    if (callbackChunk) {
-	                        this._position += callbackChunk.length;
-	                        cleanUp();
-	                        // callbackChunk.length maybe less than desired size if the stream ends.
-	                        resolve(this.toUint8Array(callbackChunk));
-	                    }
-	                };
-	                const rejectCallback = () => {
-	                    cleanUp();
-	                    reject();
-	                };
-	                const abortHandler = () => {
-	                    cleanUp();
-	                    reject(ABORT_ERROR);
-	                };
-	                this._readable.on("readable", readableCallback);
-	                this._readable.once("error", rejectCallback);
-	                this._readable.once("end", rejectCallback);
-	                this._readable.once("close", rejectCallback);
-	                if (options.abortSignal) {
-	                    options.abortSignal.addEventListener("abort", abortHandler);
-	                }
-	                /* eslint-enable @typescript-eslint/no-use-before-define */
-	            });
-	        }
-	    }
-	};
-	AvroReadableFromStream.AvroReadableFromStream = AvroReadableFromStream$1;
-	
-	return AvroReadableFromStream;
-}
-
-var hasRequiredInternalAvro;
-
-function requireInternalAvro () {
-	if (hasRequiredInternalAvro) return internalAvro;
-	hasRequiredInternalAvro = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.AvroReadableFromStream = exports$1.AvroReadable = exports$1.AvroReader = void 0;
-		var AvroReader_js_1 = requireAvroReader();
-		Object.defineProperty(exports$1, "AvroReader", { enumerable: true, get: function () { return AvroReader_js_1.AvroReader; } });
-		var AvroReadable_js_1 = requireAvroReadable();
-		Object.defineProperty(exports$1, "AvroReadable", { enumerable: true, get: function () { return AvroReadable_js_1.AvroReadable; } });
-		var AvroReadableFromStream_js_1 = requireAvroReadableFromStream();
-		Object.defineProperty(exports$1, "AvroReadableFromStream", { enumerable: true, get: function () { return AvroReadableFromStream_js_1.AvroReadableFromStream; } });
-		
-	} (internalAvro));
-	return internalAvro;
-}
-
-var hasRequiredBlobQuickQueryStream;
-
-function requireBlobQuickQueryStream () {
-	if (hasRequiredBlobQuickQueryStream) return BlobQuickQueryStream;
-	hasRequiredBlobQuickQueryStream = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobQuickQueryStream, "__esModule", { value: true });
-	BlobQuickQueryStream.BlobQuickQueryStream = void 0;
-	const node_stream_1 = require$$0$c;
-	const index_js_1 = requireInternalAvro();
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * A Node.js BlobQuickQueryStream will internally parse avro data stream for blob query.
-	 */
-	let BlobQuickQueryStream$1 = class BlobQuickQueryStream extends node_stream_1.Readable {
-	    source;
-	    avroReader;
-	    avroIter;
-	    avroPaused = true;
-	    onProgress;
-	    onError;
-	    /**
-	     * Creates an instance of BlobQuickQueryStream.
-	     *
-	     * @param source - The current ReadableStream returned from getter
-	     * @param options -
-	     */
-	    constructor(source, options = {}) {
-	        super();
-	        this.source = source;
-	        this.onProgress = options.onProgress;
-	        this.onError = options.onError;
-	        this.avroReader = new index_js_1.AvroReader(new index_js_1.AvroReadableFromStream(this.source));
-	        this.avroIter = this.avroReader.parseObjects({ abortSignal: options.abortSignal });
-	    }
-	    _read() {
-	        if (this.avroPaused) {
-	            this.readInternal().catch((err) => {
-	                this.emit("error", err);
-	            });
-	        }
-	    }
-	    async readInternal() {
-	        this.avroPaused = false;
-	        let avroNext;
-	        do {
-	            avroNext = await this.avroIter.next();
-	            if (avroNext.done) {
-	                break;
-	            }
-	            const obj = avroNext.value;
-	            const schema = obj.$schema;
-	            if (typeof schema !== "string") {
-	                throw Error("Missing schema in avro record.");
-	            }
-	            switch (schema) {
-	                case "com.microsoft.azure.storage.queryBlobContents.resultData":
-	                    {
-	                        const data = obj.data;
-	                        if (data instanceof Uint8Array === false) {
-	                            throw Error("Invalid data in avro result record.");
-	                        }
-	                        if (!this.push(Buffer.from(data))) {
-	                            this.avroPaused = true;
-	                        }
-	                    }
-	                    break;
-	                case "com.microsoft.azure.storage.queryBlobContents.progress":
-	                    {
-	                        const bytesScanned = obj.bytesScanned;
-	                        if (typeof bytesScanned !== "number") {
-	                            throw Error("Invalid bytesScanned in avro progress record.");
-	                        }
-	                        if (this.onProgress) {
-	                            this.onProgress({ loadedBytes: bytesScanned });
-	                        }
-	                    }
-	                    break;
-	                case "com.microsoft.azure.storage.queryBlobContents.end":
-	                    if (this.onProgress) {
-	                        const totalBytes = obj.totalBytes;
-	                        if (typeof totalBytes !== "number") {
-	                            throw Error("Invalid totalBytes in avro end record.");
-	                        }
-	                        this.onProgress({ loadedBytes: totalBytes });
-	                    }
-	                    this.push(null);
-	                    break;
-	                case "com.microsoft.azure.storage.queryBlobContents.error":
-	                    if (this.onError) {
-	                        const fatal = obj.fatal;
-	                        if (typeof fatal !== "boolean") {
-	                            throw Error("Invalid fatal in avro error record.");
-	                        }
-	                        const name = obj.name;
-	                        if (typeof name !== "string") {
-	                            throw Error("Invalid name in avro error record.");
-	                        }
-	                        const description = obj.description;
-	                        if (typeof description !== "string") {
-	                            throw Error("Invalid description in avro error record.");
-	                        }
-	                        const position = obj.position;
-	                        if (typeof position !== "number") {
-	                            throw Error("Invalid position in avro error record.");
-	                        }
-	                        this.onError({
-	                            position,
-	                            name,
-	                            isFatal: fatal,
-	                            description,
-	                        });
-	                    }
-	                    break;
-	                default:
-	                    throw Error(`Unknown schema ${schema} in avro progress record.`);
-	            }
-	        } while (!avroNext.done && !this.avroPaused);
-	    }
-	};
-	BlobQuickQueryStream.BlobQuickQueryStream = BlobQuickQueryStream$1;
-	
-	return BlobQuickQueryStream;
-}
-
-var hasRequiredBlobQueryResponse;
-
-function requireBlobQueryResponse () {
-	if (hasRequiredBlobQueryResponse) return BlobQueryResponse;
-	hasRequiredBlobQueryResponse = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobQueryResponse, "__esModule", { value: true });
-	BlobQueryResponse.BlobQueryResponse = void 0;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const BlobQuickQueryStream_js_1 = requireBlobQuickQueryStream();
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * BlobQueryResponse implements BlobDownloadResponseModel interface, and in Node.js runtime it will
-	 * parse avro data returned by blob query.
-	 */
-	let BlobQueryResponse$1 = class BlobQueryResponse {
-	    /**
-	     * Indicates that the service supports
-	     * requests for partial file content.
-	     *
-	     * @readonly
-	     */
-	    get acceptRanges() {
-	        return this.originalResponse.acceptRanges;
-	    }
-	    /**
-	     * Returns if it was previously specified
-	     * for the file.
-	     *
-	     * @readonly
-	     */
-	    get cacheControl() {
-	        return this.originalResponse.cacheControl;
-	    }
-	    /**
-	     * Returns the value that was specified
-	     * for the 'x-ms-content-disposition' header and specifies how to process the
-	     * response.
-	     *
-	     * @readonly
-	     */
-	    get contentDisposition() {
-	        return this.originalResponse.contentDisposition;
-	    }
-	    /**
-	     * Returns the value that was specified
-	     * for the Content-Encoding request header.
-	     *
-	     * @readonly
-	     */
-	    get contentEncoding() {
-	        return this.originalResponse.contentEncoding;
-	    }
-	    /**
-	     * Returns the value that was specified
-	     * for the Content-Language request header.
-	     *
-	     * @readonly
-	     */
-	    get contentLanguage() {
-	        return this.originalResponse.contentLanguage;
-	    }
-	    /**
-	     * The current sequence number for a
-	     * page blob. This header is not returned for block blobs or append blobs.
-	     *
-	     * @readonly
-	     */
-	    get blobSequenceNumber() {
-	        return this.originalResponse.blobSequenceNumber;
-	    }
-	    /**
-	     * The blob's type. Possible values include:
-	     * 'BlockBlob', 'PageBlob', 'AppendBlob'.
-	     *
-	     * @readonly
-	     */
-	    get blobType() {
-	        return this.originalResponse.blobType;
-	    }
-	    /**
-	     * The number of bytes present in the
-	     * response body.
-	     *
-	     * @readonly
-	     */
-	    get contentLength() {
-	        return this.originalResponse.contentLength;
-	    }
-	    /**
-	     * If the file has an MD5 hash and the
-	     * request is to read the full file, this response header is returned so that
-	     * the client can check for message content integrity. If the request is to
-	     * read a specified range and the 'x-ms-range-get-content-md5' is set to
-	     * true, then the request returns an MD5 hash for the range, as long as the
-	     * range size is less than or equal to 4 MB. If neither of these sets of
-	     * conditions is true, then no value is returned for the 'Content-MD5'
-	     * header.
-	     *
-	     * @readonly
-	     */
-	    get contentMD5() {
-	        return this.originalResponse.contentMD5;
-	    }
-	    /**
-	     * Indicates the range of bytes returned if
-	     * the client requested a subset of the file by setting the Range request
-	     * header.
-	     *
-	     * @readonly
-	     */
-	    get contentRange() {
-	        return this.originalResponse.contentRange;
-	    }
-	    /**
-	     * The content type specified for the file.
-	     * The default content type is 'application/octet-stream'
-	     *
-	     * @readonly
-	     */
-	    get contentType() {
-	        return this.originalResponse.contentType;
-	    }
-	    /**
-	     * Conclusion time of the last attempted
-	     * Copy File operation where this file was the destination file. This value
-	     * can specify the time of a completed, aborted, or failed copy attempt.
-	     *
-	     * @readonly
-	     */
-	    get copyCompletedOn() {
-	        return undefined;
-	    }
-	    /**
-	     * String identifier for the last attempted Copy
-	     * File operation where this file was the destination file.
-	     *
-	     * @readonly
-	     */
-	    get copyId() {
-	        return this.originalResponse.copyId;
-	    }
-	    /**
-	     * Contains the number of bytes copied and
-	     * the total bytes in the source in the last attempted Copy File operation
-	     * where this file was the destination file. Can show between 0 and
-	     * Content-Length bytes copied.
-	     *
-	     * @readonly
-	     */
-	    get copyProgress() {
-	        return this.originalResponse.copyProgress;
-	    }
-	    /**
-	     * URL up to 2KB in length that specifies the
-	     * source file used in the last attempted Copy File operation where this file
-	     * was the destination file.
-	     *
-	     * @readonly
-	     */
-	    get copySource() {
-	        return this.originalResponse.copySource;
-	    }
-	    /**
-	     * State of the copy operation
-	     * identified by 'x-ms-copy-id'. Possible values include: 'pending',
-	     * 'success', 'aborted', 'failed'
-	     *
-	     * @readonly
-	     */
-	    get copyStatus() {
-	        return this.originalResponse.copyStatus;
-	    }
-	    /**
-	     * Only appears when
-	     * x-ms-copy-status is failed or pending. Describes cause of fatal or
-	     * non-fatal copy operation failure.
-	     *
-	     * @readonly
-	     */
-	    get copyStatusDescription() {
-	        return this.originalResponse.copyStatusDescription;
-	    }
-	    /**
-	     * When a blob is leased,
-	     * specifies whether the lease is of infinite or fixed duration. Possible
-	     * values include: 'infinite', 'fixed'.
-	     *
-	     * @readonly
-	     */
-	    get leaseDuration() {
-	        return this.originalResponse.leaseDuration;
-	    }
-	    /**
-	     * Lease state of the blob. Possible
-	     * values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
-	     *
-	     * @readonly
-	     */
-	    get leaseState() {
-	        return this.originalResponse.leaseState;
-	    }
-	    /**
-	     * The current lease status of the
-	     * blob. Possible values include: 'locked', 'unlocked'.
-	     *
-	     * @readonly
-	     */
-	    get leaseStatus() {
-	        return this.originalResponse.leaseStatus;
-	    }
-	    /**
-	     * A UTC date/time value generated by the service that
-	     * indicates the time at which the response was initiated.
-	     *
-	     * @readonly
-	     */
-	    get date() {
-	        return this.originalResponse.date;
-	    }
-	    /**
-	     * The number of committed blocks
-	     * present in the blob. This header is returned only for append blobs.
-	     *
-	     * @readonly
-	     */
-	    get blobCommittedBlockCount() {
-	        return this.originalResponse.blobCommittedBlockCount;
-	    }
-	    /**
-	     * The ETag contains a value that you can use to
-	     * perform operations conditionally, in quotes.
-	     *
-	     * @readonly
-	     */
-	    get etag() {
-	        return this.originalResponse.etag;
-	    }
-	    /**
-	     * The error code.
-	     *
-	     * @readonly
-	     */
-	    get errorCode() {
-	        return this.originalResponse.errorCode;
-	    }
-	    /**
-	     * The value of this header is set to
-	     * true if the file data and application metadata are completely encrypted
-	     * using the specified algorithm. Otherwise, the value is set to false (when
-	     * the file is unencrypted, or if only parts of the file/application metadata
-	     * are encrypted).
-	     *
-	     * @readonly
-	     */
-	    get isServerEncrypted() {
-	        return this.originalResponse.isServerEncrypted;
-	    }
-	    /**
-	     * If the blob has a MD5 hash, and if
-	     * request contains range header (Range or x-ms-range), this response header
-	     * is returned with the value of the whole blob's MD5 value. This value may
-	     * or may not be equal to the value returned in Content-MD5 header, with the
-	     * latter calculated from the requested range.
-	     *
-	     * @readonly
-	     */
-	    get blobContentMD5() {
-	        return this.originalResponse.blobContentMD5;
-	    }
-	    /**
-	     * Returns the date and time the file was last
-	     * modified. Any operation that modifies the file or its properties updates
-	     * the last modified time.
-	     *
-	     * @readonly
-	     */
-	    get lastModified() {
-	        return this.originalResponse.lastModified;
-	    }
-	    /**
-	     * A name-value pair
-	     * to associate with a file storage object.
-	     *
-	     * @readonly
-	     */
-	    get metadata() {
-	        return this.originalResponse.metadata;
-	    }
-	    /**
-	     * This header uniquely identifies the request
-	     * that was made and can be used for troubleshooting the request.
-	     *
-	     * @readonly
-	     */
-	    get requestId() {
-	        return this.originalResponse.requestId;
-	    }
-	    /**
-	     * If a client request id header is sent in the request, this header will be present in the
-	     * response with the same value.
-	     *
-	     * @readonly
-	     */
-	    get clientRequestId() {
-	        return this.originalResponse.clientRequestId;
-	    }
-	    /**
-	     * Indicates the version of the File service used
-	     * to execute the request.
-	     *
-	     * @readonly
-	     */
-	    get version() {
-	        return this.originalResponse.version;
-	    }
-	    /**
-	     * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
-	     * when the blob was encrypted with a customer-provided key.
-	     *
-	     * @readonly
-	     */
-	    get encryptionKeySha256() {
-	        return this.originalResponse.encryptionKeySha256;
-	    }
-	    /**
-	     * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
-	     * true, then the request returns a crc64 for the range, as long as the range size is less than
-	     * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
-	     * specified in the same request, it will fail with 400(Bad Request)
-	     */
-	    get contentCrc64() {
-	        return this.originalResponse.contentCrc64;
-	    }
-	    /**
-	     * The response body as a browser Blob.
-	     * Always undefined in node.js.
-	     *
-	     * @readonly
-	     */
-	    get blobBody() {
-	        return undefined;
-	    }
-	    /**
-	     * The response body as a node.js Readable stream.
-	     * Always undefined in the browser.
-	     *
-	     * It will parse avor data returned by blob query.
-	     *
-	     * @readonly
-	     */
-	    get readableStreamBody() {
-	        return core_util_1.isNodeLike ? this.blobDownloadStream : undefined;
-	    }
-	    /**
-	     * The HTTP response.
-	     */
-	    get _response() {
-	        return this.originalResponse._response;
-	    }
-	    originalResponse;
-	    blobDownloadStream;
-	    /**
-	     * Creates an instance of BlobQueryResponse.
-	     *
-	     * @param originalResponse -
-	     * @param options -
-	     */
-	    constructor(originalResponse, options = {}) {
-	        this.originalResponse = originalResponse;
-	        this.blobDownloadStream = new BlobQuickQueryStream_js_1.BlobQuickQueryStream(this.originalResponse.readableStreamBody, options);
-	    }
-	};
-	BlobQueryResponse.BlobQueryResponse = BlobQueryResponse$1;
-	
-	return BlobQueryResponse;
-}
-
-var models = {};
-
-var hasRequiredModels;
-
-function requireModels () {
-	if (hasRequiredModels) return models;
-	hasRequiredModels = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(models, "__esModule", { value: true });
-	models.StorageBlobAudience = models.PremiumPageBlobTier = models.BlockBlobTier = void 0;
-	models.toAccessTier = toAccessTier;
-	models.ensureCpkIfSpecified = ensureCpkIfSpecified;
-	models.getBlobServiceAccountAudience = getBlobServiceAccountAudience;
-	const constants_js_1 = requireConstants$3();
-	/**
-	 * Represents the access tier on a blob.
-	 * For detailed information about block blob level tiering see {@link https://learn.microsoft.com/azure/storage/blobs/storage-blob-storage-tiers|Hot, cool and archive storage tiers.}
-	 */
-	var BlockBlobTier;
-	(function (BlockBlobTier) {
-	    /**
-	     * Optimized for storing data that is accessed frequently.
-	     */
-	    BlockBlobTier["Hot"] = "Hot";
-	    /**
-	     * Optimized for storing data that is infrequently accessed and stored for at least 30 days.
-	     */
-	    BlockBlobTier["Cool"] = "Cool";
-	    /**
-	     * Optimized for storing data that is rarely accessed.
-	     */
-	    BlockBlobTier["Cold"] = "Cold";
-	    /**
-	     * Optimized for storing data that is rarely accessed and stored for at least 180 days
-	     * with flexible latency requirements (on the order of hours).
-	     */
-	    BlockBlobTier["Archive"] = "Archive";
-	})(BlockBlobTier || (models.BlockBlobTier = BlockBlobTier = {}));
-	/**
-	 * Specifies the page blob tier to set the blob to. This is only applicable to page blobs on premium storage accounts.
-	 * Please see {@link https://learn.microsoft.com/azure/storage/storage-premium-storage#scalability-and-performance-targets|here}
-	 * for detailed information on the corresponding IOPS and throughput per PageBlobTier.
-	 */
-	var PremiumPageBlobTier;
-	(function (PremiumPageBlobTier) {
-	    /**
-	     * P4 Tier.
-	     */
-	    PremiumPageBlobTier["P4"] = "P4";
-	    /**
-	     * P6 Tier.
-	     */
-	    PremiumPageBlobTier["P6"] = "P6";
-	    /**
-	     * P10 Tier.
-	     */
-	    PremiumPageBlobTier["P10"] = "P10";
-	    /**
-	     * P15 Tier.
-	     */
-	    PremiumPageBlobTier["P15"] = "P15";
-	    /**
-	     * P20 Tier.
-	     */
-	    PremiumPageBlobTier["P20"] = "P20";
-	    /**
-	     * P30 Tier.
-	     */
-	    PremiumPageBlobTier["P30"] = "P30";
-	    /**
-	     * P40 Tier.
-	     */
-	    PremiumPageBlobTier["P40"] = "P40";
-	    /**
-	     * P50 Tier.
-	     */
-	    PremiumPageBlobTier["P50"] = "P50";
-	    /**
-	     * P60 Tier.
-	     */
-	    PremiumPageBlobTier["P60"] = "P60";
-	    /**
-	     * P70 Tier.
-	     */
-	    PremiumPageBlobTier["P70"] = "P70";
-	    /**
-	     * P80 Tier.
-	     */
-	    PremiumPageBlobTier["P80"] = "P80";
-	})(PremiumPageBlobTier || (models.PremiumPageBlobTier = PremiumPageBlobTier = {}));
-	function toAccessTier(tier) {
-	    if (tier === undefined) {
-	        return undefined;
-	    }
-	    return tier; // No more check if string is a valid AccessTier, and left this to underlay logic to decide(service).
-	}
-	function ensureCpkIfSpecified(cpk, isHttps) {
-	    if (cpk && !isHttps) {
-	        throw new RangeError("Customer-provided encryption key must be used over HTTPS.");
-	    }
-	    if (cpk && !cpk.encryptionAlgorithm) {
-	        cpk.encryptionAlgorithm = constants_js_1.EncryptionAlgorithmAES25;
-	    }
-	}
-	/**
-	 * Defines the known cloud audiences for Storage.
-	 */
-	var StorageBlobAudience;
-	(function (StorageBlobAudience) {
-	    /**
-	     * The OAuth scope to use to retrieve an AAD token for Azure Storage.
-	     */
-	    StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default";
-	    /**
-	     * The OAuth scope to use to retrieve an AAD token for Azure Disk.
-	     */
-	    StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default";
-	})(StorageBlobAudience || (models.StorageBlobAudience = StorageBlobAudience = {}));
-	/**
-	 *
-	 * To get OAuth audience for a storage account for blob service.
-	 */
-	function getBlobServiceAccountAudience(storageAccountName) {
-	    return `https://${storageAccountName}.blob.core.windows.net/.default`;
-	}
-	
-	return models;
-}
-
-var PageBlobRangeResponse = {};
-
-var hasRequiredPageBlobRangeResponse;
-
-function requirePageBlobRangeResponse () {
-	if (hasRequiredPageBlobRangeResponse) return PageBlobRangeResponse;
-	hasRequiredPageBlobRangeResponse = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(PageBlobRangeResponse, "__esModule", { value: true });
-	PageBlobRangeResponse.rangeResponseFromModel = rangeResponseFromModel;
-	/**
-	 * Function that converts PageRange and ClearRange to a common Range object.
-	 * PageRange and ClearRange have start and end while Range offset and count
-	 * this function normalizes to Range.
-	 * @param response - Model PageBlob Range response
-	 */
-	function rangeResponseFromModel(response) {
-	    const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({
-	        offset: x.start,
-	        count: x.end - x.start,
-	    }));
-	    const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({
-	        offset: x.start,
-	        count: x.end - x.start,
-	    }));
-	    return {
-	        ...response,
-	        pageRange,
-	        clearRange,
-	        _response: {
-	            ...response._response,
-	            parsedBody: {
-	                pageRange,
-	                clearRange,
-	            },
-	        },
-	    };
-	}
-	
-	return PageBlobRangeResponse;
-}
-
-var BlobStartCopyFromUrlPoller = {};
-
-var commonjs = {};
-
-var poller$2 = {};
-
-var operation$2 = {};
-
-var operation$1 = {};
-
-var logger = {};
-
-var hasRequiredLogger;
-
-function requireLogger () {
-	if (hasRequiredLogger) return logger;
-	hasRequiredLogger = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(logger, "__esModule", { value: true });
-	logger.logger = void 0;
-	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
-	/**
-	 * The `@azure/logger` configuration for this package.
-	 * @internal
-	 */
-	logger.logger = (0, logger_1.createClientLogger)("core-lro");
-	
-	return logger;
-}
-
-var constants$1 = {};
-
-var hasRequiredConstants$1;
-
-function requireConstants$1 () {
-	if (hasRequiredConstants$1) return constants$1;
-	hasRequiredConstants$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(constants$1, "__esModule", { value: true });
-	constants$1.terminalStates = constants$1.POLL_INTERVAL_IN_MS = void 0;
-	/**
-	 * The default time interval to wait before sending the next polling request.
-	 */
-	constants$1.POLL_INTERVAL_IN_MS = 2000;
-	/**
-	 * The closed set of terminal states.
-	 */
-	constants$1.terminalStates = ["succeeded", "canceled", "failed"];
-	
-	return constants$1;
-}
-
-var hasRequiredOperation$2;
-
-function requireOperation$2 () {
-	if (hasRequiredOperation$2) return operation$1;
-	hasRequiredOperation$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(operation$1, "__esModule", { value: true });
-	operation$1.pollOperation = operation$1.initOperation = operation$1.deserializeState = void 0;
-	const logger_js_1 = requireLogger();
-	const constants_js_1 = requireConstants$1();
-	/**
-	 * Deserializes the state
-	 */
-	function deserializeState(serializedState) {
-	    try {
-	        return JSON.parse(serializedState).state;
-	    }
-	    catch (e) {
-	        throw new Error(`Unable to deserialize input state: ${serializedState}`);
-	    }
-	}
-	operation$1.deserializeState = deserializeState;
-	function setStateError(inputs) {
-	    const { state, stateProxy, isOperationError } = inputs;
-	    return (error) => {
-	        if (isOperationError(error)) {
-	            stateProxy.setError(state, error);
-	            stateProxy.setFailed(state);
-	        }
-	        throw error;
-	    };
-	}
-	function appendReadableErrorMessage(currentMessage, innerMessage) {
-	    let message = currentMessage;
-	    if (message.slice(-1) !== ".") {
-	        message = message + ".";
-	    }
-	    return message + " " + innerMessage;
-	}
-	function simplifyError(err) {
-	    let message = err.message;
-	    let code = err.code;
-	    let curErr = err;
-	    while (curErr.innererror) {
-	        curErr = curErr.innererror;
-	        code = curErr.code;
-	        message = appendReadableErrorMessage(message, curErr.message);
-	    }
-	    return {
-	        code,
-	        message,
-	    };
-	}
-	function processOperationStatus(result) {
-	    const { state, stateProxy, status, isDone, processResult, getError, response, setErrorAsResult } = result;
-	    switch (status) {
-	        case "succeeded": {
-	            stateProxy.setSucceeded(state);
-	            break;
-	        }
-	        case "failed": {
-	            const err = getError === null || getError === void 0 ? void 0 : getError(response);
-	            let postfix = "";
-	            if (err) {
-	                const { code, message } = simplifyError(err);
-	                postfix = `. ${code}. ${message}`;
-	            }
-	            const errStr = `The long-running operation has failed${postfix}`;
-	            stateProxy.setError(state, new Error(errStr));
-	            stateProxy.setFailed(state);
-	            logger_js_1.logger.warning(errStr);
-	            break;
-	        }
-	        case "canceled": {
-	            stateProxy.setCanceled(state);
-	            break;
-	        }
-	    }
-	    if ((isDone === null || isDone === void 0 ? void 0 : isDone(response, state)) ||
-	        (isDone === undefined &&
-	            ["succeeded", "canceled"].concat(setErrorAsResult ? [] : ["failed"]).includes(status))) {
-	        stateProxy.setResult(state, buildResult({
-	            response,
-	            state,
-	            processResult,
-	        }));
-	    }
-	}
-	function buildResult(inputs) {
-	    const { processResult, response, state } = inputs;
-	    return processResult ? processResult(response, state) : response;
-	}
-	/**
-	 * Initiates the long-running operation.
-	 */
-	async function initOperation(inputs) {
-	    const { init, stateProxy, processResult, getOperationStatus, withOperationLocation, setErrorAsResult, } = inputs;
-	    const { operationLocation, resourceLocation, metadata, response } = await init();
-	    if (operationLocation)
-	        withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);
-	    const config = {
-	        metadata,
-	        operationLocation,
-	        resourceLocation,
-	    };
-	    logger_js_1.logger.verbose(`LRO: Operation description:`, config);
-	    const state = stateProxy.initState(config);
-	    const status = getOperationStatus({ response, state, operationLocation });
-	    processOperationStatus({ state, status, stateProxy, response, setErrorAsResult, processResult });
-	    return state;
-	}
-	operation$1.initOperation = initOperation;
-	async function pollOperationHelper(inputs) {
-	    const { poll, state, stateProxy, operationLocation, getOperationStatus, getResourceLocation, isOperationError, options, } = inputs;
-	    const response = await poll(operationLocation, options).catch(setStateError({
-	        state,
-	        stateProxy,
-	        isOperationError,
-	    }));
-	    const status = getOperationStatus(response, state);
-	    logger_js_1.logger.verbose(`LRO: Status:\n\tPolling from: ${state.config.operationLocation}\n\tOperation status: ${status}\n\tPolling status: ${constants_js_1.terminalStates.includes(status) ? "Stopped" : "Running"}`);
-	    if (status === "succeeded") {
-	        const resourceLocation = getResourceLocation(response, state);
-	        if (resourceLocation !== undefined) {
-	            return {
-	                response: await poll(resourceLocation).catch(setStateError({ state, stateProxy, isOperationError })),
-	                status,
-	            };
-	        }
-	    }
-	    return { response, status };
-	}
-	/** Polls the long-running operation. */
-	async function pollOperation(inputs) {
-	    const { poll, state, stateProxy, options, getOperationStatus, getResourceLocation, getOperationLocation, isOperationError, withOperationLocation, getPollingInterval, processResult, getError, updateState, setDelay, isDone, setErrorAsResult, } = inputs;
-	    const { operationLocation } = state.config;
-	    if (operationLocation !== undefined) {
-	        const { response, status } = await pollOperationHelper({
-	            poll,
-	            getOperationStatus,
-	            state,
-	            stateProxy,
-	            operationLocation,
-	            getResourceLocation,
-	            isOperationError,
-	            options,
-	        });
-	        processOperationStatus({
-	            status,
-	            response,
-	            state,
-	            stateProxy,
-	            isDone,
-	            processResult,
-	            getError,
-	            setErrorAsResult,
-	        });
-	        if (!constants_js_1.terminalStates.includes(status)) {
-	            const intervalInMs = getPollingInterval === null || getPollingInterval === void 0 ? void 0 : getPollingInterval(response);
-	            if (intervalInMs)
-	                setDelay(intervalInMs);
-	            const location = getOperationLocation === null || getOperationLocation === void 0 ? void 0 : getOperationLocation(response, state);
-	            if (location !== undefined) {
-	                const isUpdated = operationLocation !== location;
-	                state.config.operationLocation = location;
-	                withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(location, isUpdated);
-	            }
-	            else
-	                withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);
-	        }
-	        updateState === null || updateState === void 0 ? void 0 : updateState(state, response);
-	    }
-	}
-	operation$1.pollOperation = pollOperation;
-	
-	return operation$1;
-}
-
-var hasRequiredOperation$1;
-
-function requireOperation$1 () {
-	if (hasRequiredOperation$1) return operation$2;
-	hasRequiredOperation$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(operation$2, "__esModule", { value: true });
-	operation$2.pollHttpOperation = operation$2.isOperationError = operation$2.getResourceLocation = operation$2.getOperationStatus = operation$2.getOperationLocation = operation$2.initHttpOperation = operation$2.getStatusFromInitialResponse = operation$2.getErrorFromResponse = operation$2.parseRetryAfter = operation$2.inferLroMode = void 0;
-	const operation_js_1 = requireOperation$2();
-	const logger_js_1 = requireLogger();
-	function getOperationLocationPollingUrl(inputs) {
-	    const { azureAsyncOperation, operationLocation } = inputs;
-	    return operationLocation !== null && operationLocation !== void 0 ? operationLocation : azureAsyncOperation;
-	}
-	function getLocationHeader(rawResponse) {
-	    return rawResponse.headers["location"];
-	}
-	function getOperationLocationHeader(rawResponse) {
-	    return rawResponse.headers["operation-location"];
-	}
-	function getAzureAsyncOperationHeader(rawResponse) {
-	    return rawResponse.headers["azure-asyncoperation"];
-	}
-	function findResourceLocation(inputs) {
-	    var _a;
-	    const { location, requestMethod, requestPath, resourceLocationConfig } = inputs;
-	    switch (requestMethod) {
-	        case "PUT": {
-	            return requestPath;
-	        }
-	        case "DELETE": {
-	            return undefined;
-	        }
-	        case "PATCH": {
-	            return (_a = getDefault()) !== null && _a !== void 0 ? _a : requestPath;
-	        }
-	        default: {
-	            return getDefault();
-	        }
-	    }
-	    function getDefault() {
-	        switch (resourceLocationConfig) {
-	            case "azure-async-operation": {
-	                return undefined;
-	            }
-	            case "original-uri": {
-	                return requestPath;
-	            }
-	            case "location":
-	            default: {
-	                return location;
-	            }
-	        }
-	    }
-	}
-	function inferLroMode(inputs) {
-	    const { rawResponse, requestMethod, requestPath, resourceLocationConfig } = inputs;
-	    const operationLocation = getOperationLocationHeader(rawResponse);
-	    const azureAsyncOperation = getAzureAsyncOperationHeader(rawResponse);
-	    const pollingUrl = getOperationLocationPollingUrl({ operationLocation, azureAsyncOperation });
-	    const location = getLocationHeader(rawResponse);
-	    const normalizedRequestMethod = requestMethod === null || requestMethod === void 0 ? void 0 : requestMethod.toLocaleUpperCase();
-	    if (pollingUrl !== undefined) {
-	        return {
-	            mode: "OperationLocation",
-	            operationLocation: pollingUrl,
-	            resourceLocation: findResourceLocation({
-	                requestMethod: normalizedRequestMethod,
-	                location,
-	                requestPath,
-	                resourceLocationConfig,
-	            }),
-	        };
-	    }
-	    else if (location !== undefined) {
-	        return {
-	            mode: "ResourceLocation",
-	            operationLocation: location,
-	        };
-	    }
-	    else if (normalizedRequestMethod === "PUT" && requestPath) {
-	        return {
-	            mode: "Body",
-	            operationLocation: requestPath,
-	        };
-	    }
-	    else {
-	        return undefined;
-	    }
-	}
-	operation$2.inferLroMode = inferLroMode;
-	function transformStatus(inputs) {
-	    const { status, statusCode } = inputs;
-	    if (typeof status !== "string" && status !== undefined) {
-	        throw new Error(`Polling was unsuccessful. Expected status to have a string value or no value but it has instead: ${status}. This doesn't necessarily indicate the operation has failed. Check your Azure subscription or resource status for more information.`);
-	    }
-	    switch (status === null || status === void 0 ? void 0 : status.toLocaleLowerCase()) {
-	        case undefined:
-	            return toOperationStatus(statusCode);
-	        case "succeeded":
-	            return "succeeded";
-	        case "failed":
-	            return "failed";
-	        case "running":
-	        case "accepted":
-	        case "started":
-	        case "canceling":
-	        case "cancelling":
-	            return "running";
-	        case "canceled":
-	        case "cancelled":
-	            return "canceled";
-	        default: {
-	            logger_js_1.logger.verbose(`LRO: unrecognized operation status: ${status}`);
-	            return status;
-	        }
-	    }
-	}
-	function getStatus(rawResponse) {
-	    var _a;
-	    const { status } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
-	    return transformStatus({ status, statusCode: rawResponse.statusCode });
-	}
-	function getProvisioningState(rawResponse) {
-	    var _a, _b;
-	    const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
-	    const status = (_b = properties === null || properties === void 0 ? void 0 : properties.provisioningState) !== null && _b !== void 0 ? _b : provisioningState;
-	    return transformStatus({ status, statusCode: rawResponse.statusCode });
-	}
-	function toOperationStatus(statusCode) {
-	    if (statusCode === 202) {
-	        return "running";
-	    }
-	    else if (statusCode < 300) {
-	        return "succeeded";
-	    }
-	    else {
-	        return "failed";
-	    }
-	}
-	function parseRetryAfter({ rawResponse }) {
-	    const retryAfter = rawResponse.headers["retry-after"];
-	    if (retryAfter !== undefined) {
-	        // Retry-After header value is either in HTTP date format, or in seconds
-	        const retryAfterInSeconds = parseInt(retryAfter);
-	        return isNaN(retryAfterInSeconds)
-	            ? calculatePollingIntervalFromDate(new Date(retryAfter))
-	            : retryAfterInSeconds * 1000;
-	    }
-	    return undefined;
-	}
-	operation$2.parseRetryAfter = parseRetryAfter;
-	function getErrorFromResponse(response) {
-	    const error = accessBodyProperty(response, "error");
-	    if (!error) {
-	        logger_js_1.logger.warning(`The long-running operation failed but there is no error property in the response's body`);
-	        return;
-	    }
-	    if (!error.code || !error.message) {
-	        logger_js_1.logger.warning(`The long-running operation failed but the error property in the response's body doesn't contain code or message`);
-	        return;
-	    }
-	    return error;
-	}
-	operation$2.getErrorFromResponse = getErrorFromResponse;
-	function calculatePollingIntervalFromDate(retryAfterDate) {
-	    const timeNow = Math.floor(new Date().getTime());
-	    const retryAfterTime = retryAfterDate.getTime();
-	    if (timeNow < retryAfterTime) {
-	        return retryAfterTime - timeNow;
-	    }
-	    return undefined;
-	}
-	function getStatusFromInitialResponse(inputs) {
-	    const { response, state, operationLocation } = inputs;
-	    function helper() {
-	        var _a;
-	        const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
-	        switch (mode) {
-	            case undefined:
-	                return toOperationStatus(response.rawResponse.statusCode);
-	            case "Body":
-	                return getOperationStatus(response, state);
-	            default:
-	                return "running";
-	        }
-	    }
-	    const status = helper();
-	    return status === "running" && operationLocation === undefined ? "succeeded" : status;
-	}
-	operation$2.getStatusFromInitialResponse = getStatusFromInitialResponse;
-	/**
-	 * Initiates the long-running operation.
-	 */
-	async function initHttpOperation(inputs) {
-	    const { stateProxy, resourceLocationConfig, processResult, lro, setErrorAsResult } = inputs;
-	    return (0, operation_js_1.initOperation)({
-	        init: async () => {
-	            const response = await lro.sendInitialRequest();
-	            const config = inferLroMode({
-	                rawResponse: response.rawResponse,
-	                requestPath: lro.requestPath,
-	                requestMethod: lro.requestMethod,
-	                resourceLocationConfig,
-	            });
-	            return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));
-	        },
-	        stateProxy,
-	        processResult: processResult
-	            ? ({ flatResponse }, state) => processResult(flatResponse, state)
-	            : ({ flatResponse }) => flatResponse,
-	        getOperationStatus: getStatusFromInitialResponse,
-	        setErrorAsResult,
-	    });
-	}
-	operation$2.initHttpOperation = initHttpOperation;
-	function getOperationLocation({ rawResponse }, state) {
-	    var _a;
-	    const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
-	    switch (mode) {
-	        case "OperationLocation": {
-	            return getOperationLocationPollingUrl({
-	                operationLocation: getOperationLocationHeader(rawResponse),
-	                azureAsyncOperation: getAzureAsyncOperationHeader(rawResponse),
-	            });
-	        }
-	        case "ResourceLocation": {
-	            return getLocationHeader(rawResponse);
-	        }
-	        case "Body":
-	        default: {
-	            return undefined;
-	        }
-	    }
-	}
-	operation$2.getOperationLocation = getOperationLocation;
-	function getOperationStatus({ rawResponse }, state) {
-	    var _a;
-	    const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
-	    switch (mode) {
-	        case "OperationLocation": {
-	            return getStatus(rawResponse);
-	        }
-	        case "ResourceLocation": {
-	            return toOperationStatus(rawResponse.statusCode);
-	        }
-	        case "Body": {
-	            return getProvisioningState(rawResponse);
-	        }
-	        default:
-	            throw new Error(`Internal error: Unexpected operation mode: ${mode}`);
-	    }
-	}
-	operation$2.getOperationStatus = getOperationStatus;
-	function accessBodyProperty({ flatResponse, rawResponse }, prop) {
-	    var _a, _b;
-	    return (_a = flatResponse === null || flatResponse === void 0 ? void 0 : flatResponse[prop]) !== null && _a !== void 0 ? _a : (_b = rawResponse.body) === null || _b === void 0 ? void 0 : _b[prop];
-	}
-	function getResourceLocation(res, state) {
-	    const loc = accessBodyProperty(res, "resourceLocation");
-	    if (loc && typeof loc === "string") {
-	        state.config.resourceLocation = loc;
-	    }
-	    return state.config.resourceLocation;
-	}
-	operation$2.getResourceLocation = getResourceLocation;
-	function isOperationError(e) {
-	    return e.name === "RestError";
-	}
-	operation$2.isOperationError = isOperationError;
-	/** Polls the long-running operation. */
-	async function pollHttpOperation(inputs) {
-	    const { lro, stateProxy, options, processResult, updateState, setDelay, state, setErrorAsResult, } = inputs;
-	    return (0, operation_js_1.pollOperation)({
-	        state,
-	        stateProxy,
-	        setDelay,
-	        processResult: processResult
-	            ? ({ flatResponse }, inputState) => processResult(flatResponse, inputState)
-	            : ({ flatResponse }) => flatResponse,
-	        getError: getErrorFromResponse,
-	        updateState,
-	        getPollingInterval: parseRetryAfter,
-	        getOperationLocation,
-	        getOperationStatus,
-	        isOperationError,
-	        getResourceLocation,
-	        options,
-	        /**
-	         * The expansion here is intentional because `lro` could be an object that
-	         * references an inner this, so we need to preserve a reference to it.
-	         */
-	        poll: async (location, inputOptions) => lro.sendPollRequest(location, inputOptions),
-	        setErrorAsResult,
-	    });
-	}
-	operation$2.pollHttpOperation = pollHttpOperation;
-	
-	return operation$2;
-}
-
-var poller$1 = {};
-
-var hasRequiredPoller$2;
-
-function requirePoller$2 () {
-	if (hasRequiredPoller$2) return poller$1;
-	hasRequiredPoller$2 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(poller$1, "__esModule", { value: true });
-	poller$1.buildCreatePoller = void 0;
-	const operation_js_1 = requireOperation$2();
-	const constants_js_1 = requireConstants$1();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const createStateProxy = () => ({
-	    /**
-	     * The state at this point is created to be of type OperationState.
-	     * It will be updated later to be of type TState when the
-	     * customer-provided callback, `updateState`, is called during polling.
-	     */
-	    initState: (config) => ({ status: "running", config }),
-	    setCanceled: (state) => (state.status = "canceled"),
-	    setError: (state, error) => (state.error = error),
-	    setResult: (state, result) => (state.result = result),
-	    setRunning: (state) => (state.status = "running"),
-	    setSucceeded: (state) => (state.status = "succeeded"),
-	    setFailed: (state) => (state.status = "failed"),
-	    getError: (state) => state.error,
-	    getResult: (state) => state.result,
-	    isCanceled: (state) => state.status === "canceled",
-	    isFailed: (state) => state.status === "failed",
-	    isRunning: (state) => state.status === "running",
-	    isSucceeded: (state) => state.status === "succeeded",
-	});
-	/**
-	 * Returns a poller factory.
-	 */
-	function buildCreatePoller(inputs) {
-	    const { getOperationLocation, getStatusFromInitialResponse, getStatusFromPollResponse, isOperationError, getResourceLocation, getPollingInterval, getError, resolveOnUnsuccessful, } = inputs;
-	    return async ({ init, poll }, options) => {
-	        const { processResult, updateState, withOperationLocation: withOperationLocationCallback, intervalInMs = constants_js_1.POLL_INTERVAL_IN_MS, restoreFrom, } = options || {};
-	        const stateProxy = createStateProxy();
-	        const withOperationLocation = withOperationLocationCallback
-	            ? (() => {
-	                let called = false;
-	                return (operationLocation, isUpdated) => {
-	                    if (isUpdated)
-	                        withOperationLocationCallback(operationLocation);
-	                    else if (!called)
-	                        withOperationLocationCallback(operationLocation);
-	                    called = true;
-	                };
-	            })()
-	            : undefined;
-	        const state = restoreFrom
-	            ? (0, operation_js_1.deserializeState)(restoreFrom)
-	            : await (0, operation_js_1.initOperation)({
-	                init,
-	                stateProxy,
-	                processResult,
-	                getOperationStatus: getStatusFromInitialResponse,
-	                withOperationLocation,
-	                setErrorAsResult: !resolveOnUnsuccessful,
-	            });
-	        let resultPromise;
-	        const abortController = new AbortController();
-	        const handlers = new Map();
-	        const handleProgressEvents = async () => handlers.forEach((h) => h(state));
-	        const cancelErrMsg = "Operation was canceled";
-	        let currentPollIntervalInMs = intervalInMs;
-	        const poller = {
-	            getOperationState: () => state,
-	            getResult: () => state.result,
-	            isDone: () => ["succeeded", "failed", "canceled"].includes(state.status),
-	            isStopped: () => resultPromise === undefined,
-	            stopPolling: () => {
-	                abortController.abort();
-	            },
-	            toString: () => JSON.stringify({
-	                state,
-	            }),
-	            onProgress: (callback) => {
-	                const s = Symbol();
-	                handlers.set(s, callback);
-	                return () => handlers.delete(s);
-	            },
-	            pollUntilDone: (pollOptions) => (resultPromise !== null && resultPromise !== void 0 ? resultPromise : (resultPromise = (async () => {
-	                const { abortSignal: inputAbortSignal } = pollOptions || {};
-	                // In the future we can use AbortSignal.any() instead
-	                function abortListener() {
-	                    abortController.abort();
-	                }
-	                const abortSignal = abortController.signal;
-	                if (inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.aborted) {
-	                    abortController.abort();
-	                }
-	                else if (!abortSignal.aborted) {
-	                    inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.addEventListener("abort", abortListener, { once: true });
-	                }
-	                try {
-	                    if (!poller.isDone()) {
-	                        await poller.poll({ abortSignal });
-	                        while (!poller.isDone()) {
-	                            await (0, core_util_1.delay)(currentPollIntervalInMs, { abortSignal });
-	                            await poller.poll({ abortSignal });
-	                        }
-	                    }
-	                }
-	                finally {
-	                    inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.removeEventListener("abort", abortListener);
-	                }
-	                if (resolveOnUnsuccessful) {
-	                    return poller.getResult();
-	                }
-	                else {
-	                    switch (state.status) {
-	                        case "succeeded":
-	                            return poller.getResult();
-	                        case "canceled":
-	                            throw new Error(cancelErrMsg);
-	                        case "failed":
-	                            throw state.error;
-	                        case "notStarted":
-	                        case "running":
-	                            throw new Error(`Polling completed without succeeding or failing`);
-	                    }
-	                }
-	            })().finally(() => {
-	                resultPromise = undefined;
-	            }))),
-	            async poll(pollOptions) {
-	                if (resolveOnUnsuccessful) {
-	                    if (poller.isDone())
-	                        return;
-	                }
-	                else {
-	                    switch (state.status) {
-	                        case "succeeded":
-	                            return;
-	                        case "canceled":
-	                            throw new Error(cancelErrMsg);
-	                        case "failed":
-	                            throw state.error;
-	                    }
-	                }
-	                await (0, operation_js_1.pollOperation)({
-	                    poll,
-	                    state,
-	                    stateProxy,
-	                    getOperationLocation,
-	                    isOperationError,
-	                    withOperationLocation,
-	                    getPollingInterval,
-	                    getOperationStatus: getStatusFromPollResponse,
-	                    getResourceLocation,
-	                    processResult,
-	                    getError,
-	                    updateState,
-	                    options: pollOptions,
-	                    setDelay: (pollIntervalInMs) => {
-	                        currentPollIntervalInMs = pollIntervalInMs;
-	                    },
-	                    setErrorAsResult: !resolveOnUnsuccessful,
-	                });
-	                await handleProgressEvents();
-	                if (!resolveOnUnsuccessful) {
-	                    switch (state.status) {
-	                        case "canceled":
-	                            throw new Error(cancelErrMsg);
-	                        case "failed":
-	                            throw state.error;
-	                    }
-	                }
-	            },
-	        };
-	        return poller;
-	    };
-	}
-	poller$1.buildCreatePoller = buildCreatePoller;
-	
-	return poller$1;
-}
-
-var hasRequiredPoller$1;
-
-function requirePoller$1 () {
-	if (hasRequiredPoller$1) return poller$2;
-	hasRequiredPoller$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(poller$2, "__esModule", { value: true });
-	poller$2.createHttpPoller = void 0;
-	const operation_js_1 = requireOperation$1();
-	const poller_js_1 = requirePoller$2();
-	/**
-	 * Creates a poller that can be used to poll a long-running operation.
-	 * @param lro - Description of the long-running operation
-	 * @param options - options to configure the poller
-	 * @returns an initialized poller
-	 */
-	async function createHttpPoller(lro, options) {
-	    const { resourceLocationConfig, intervalInMs, processResult, restoreFrom, updateState, withOperationLocation, resolveOnUnsuccessful = false, } = options || {};
-	    return (0, poller_js_1.buildCreatePoller)({
-	        getStatusFromInitialResponse: operation_js_1.getStatusFromInitialResponse,
-	        getStatusFromPollResponse: operation_js_1.getOperationStatus,
-	        isOperationError: operation_js_1.isOperationError,
-	        getOperationLocation: operation_js_1.getOperationLocation,
-	        getResourceLocation: operation_js_1.getResourceLocation,
-	        getPollingInterval: operation_js_1.parseRetryAfter,
-	        getError: operation_js_1.getErrorFromResponse,
-	        resolveOnUnsuccessful,
-	    })({
-	        init: async () => {
-	            const response = await lro.sendInitialRequest();
-	            const config = (0, operation_js_1.inferLroMode)({
-	                rawResponse: response.rawResponse,
-	                requestPath: lro.requestPath,
-	                requestMethod: lro.requestMethod,
-	                resourceLocationConfig,
-	            });
-	            return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));
-	        },
-	        poll: lro.sendPollRequest,
-	    }, {
-	        intervalInMs,
-	        withOperationLocation,
-	        restoreFrom,
-	        updateState,
-	        processResult: processResult
-	            ? ({ flatResponse }, state) => processResult(flatResponse, state)
-	            : ({ flatResponse }) => flatResponse,
-	    });
-	}
-	poller$2.createHttpPoller = createHttpPoller;
-	
-	return poller$2;
-}
-
-var lroEngine$1 = {};
-
-var lroEngine = {};
-
-var operation = {};
-
-var hasRequiredOperation;
-
-function requireOperation () {
-	if (hasRequiredOperation) return operation;
-	hasRequiredOperation = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(operation, "__esModule", { value: true });
-	operation.GenericPollOperation = void 0;
-	const operation_js_1 = requireOperation$1();
-	const logger_js_1 = requireLogger();
-	const createStateProxy = () => ({
-	    initState: (config) => ({ config, isStarted: true }),
-	    setCanceled: (state) => (state.isCancelled = true),
-	    setError: (state, error) => (state.error = error),
-	    setResult: (state, result) => (state.result = result),
-	    setRunning: (state) => (state.isStarted = true),
-	    setSucceeded: (state) => (state.isCompleted = true),
-	    setFailed: () => {
-	        /** empty body */
-	    },
-	    getError: (state) => state.error,
-	    getResult: (state) => state.result,
-	    isCanceled: (state) => !!state.isCancelled,
-	    isFailed: (state) => !!state.error,
-	    isRunning: (state) => !!state.isStarted,
-	    isSucceeded: (state) => Boolean(state.isCompleted && !state.isCancelled && !state.error),
-	});
-	class GenericPollOperation {
-	    constructor(state, lro, setErrorAsResult, lroResourceLocationConfig, processResult, updateState, isDone) {
-	        this.state = state;
-	        this.lro = lro;
-	        this.setErrorAsResult = setErrorAsResult;
-	        this.lroResourceLocationConfig = lroResourceLocationConfig;
-	        this.processResult = processResult;
-	        this.updateState = updateState;
-	        this.isDone = isDone;
-	    }
-	    setPollerConfig(pollerConfig) {
-	        this.pollerConfig = pollerConfig;
-	    }
-	    async update(options) {
-	        var _a;
-	        const stateProxy = createStateProxy();
-	        if (!this.state.isStarted) {
-	            this.state = Object.assign(Object.assign({}, this.state), (await (0, operation_js_1.initHttpOperation)({
-	                lro: this.lro,
-	                stateProxy,
-	                resourceLocationConfig: this.lroResourceLocationConfig,
-	                processResult: this.processResult,
-	                setErrorAsResult: this.setErrorAsResult,
-	            })));
-	        }
-	        const updateState = this.updateState;
-	        const isDone = this.isDone;
-	        if (!this.state.isCompleted && this.state.error === undefined) {
-	            await (0, operation_js_1.pollHttpOperation)({
-	                lro: this.lro,
-	                state: this.state,
-	                stateProxy,
-	                processResult: this.processResult,
-	                updateState: updateState
-	                    ? (state, { rawResponse }) => updateState(state, rawResponse)
-	                    : undefined,
-	                isDone: isDone
-	                    ? ({ flatResponse }, state) => isDone(flatResponse, state)
-	                    : undefined,
-	                options,
-	                setDelay: (intervalInMs) => {
-	                    this.pollerConfig.intervalInMs = intervalInMs;
-	                },
-	                setErrorAsResult: this.setErrorAsResult,
-	            });
-	        }
-	        (_a = options === null || options === void 0 ? void 0 : options.fireProgress) === null || _a === void 0 ? void 0 : _a.call(options, this.state);
-	        return this;
-	    }
-	    async cancel() {
-	        logger_js_1.logger.error("`cancelOperation` is deprecated because it wasn't implemented");
-	        return this;
-	    }
-	    /**
-	     * Serializes the Poller operation.
-	     */
-	    toString() {
-	        return JSON.stringify({
-	            state: this.state,
-	        });
-	    }
-	}
-	operation.GenericPollOperation = GenericPollOperation;
-	
-	return operation;
-}
-
-var poller = {};
-
-var hasRequiredPoller;
-
-function requirePoller () {
-	if (hasRequiredPoller) return poller;
-	hasRequiredPoller = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(poller, "__esModule", { value: true });
-	poller.Poller = poller.PollerCancelledError = poller.PollerStoppedError = void 0;
-	/**
-	 * When a poller is manually stopped through the `stopPolling` method,
-	 * the poller will be rejected with an instance of the PollerStoppedError.
-	 */
-	class PollerStoppedError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = "PollerStoppedError";
-	        Object.setPrototypeOf(this, PollerStoppedError.prototype);
-	    }
-	}
-	poller.PollerStoppedError = PollerStoppedError;
-	/**
-	 * When the operation is cancelled, the poller will be rejected with an instance
-	 * of the PollerCancelledError.
-	 */
-	class PollerCancelledError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = "PollerCancelledError";
-	        Object.setPrototypeOf(this, PollerCancelledError.prototype);
-	    }
-	}
-	poller.PollerCancelledError = PollerCancelledError;
-	/**
-	 * A class that represents the definition of a program that polls through consecutive requests
-	 * until it reaches a state of completion.
-	 *
-	 * A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.
-	 * It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.
-	 * Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.
-	 *
-	 * ```ts
-	 * const poller = new MyPoller();
-	 *
-	 * // Polling just once:
-	 * await poller.poll();
-	 *
-	 * // We can try to cancel the request here, by calling:
-	 * //
-	 * //     await poller.cancelOperation();
-	 * //
-	 *
-	 * // Getting the final result:
-	 * const result = await poller.pollUntilDone();
-	 * ```
-	 *
-	 * The Poller is defined by two types, a type representing the state of the poller, which
-	 * must include a basic set of properties from `PollOperationState`,
-	 * and a return type defined by `TResult`, which can be anything.
-	 *
-	 * The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having
-	 * to export the Poller's class directly, and instead only export the already instantiated poller with the PollerLike type.
-	 *
-	 * ```ts
-	 * class Client {
-	 *   public async makePoller: PollerLike {
-	 *     const poller = new MyPoller({});
-	 *     // It might be preferred to return the poller after the first request is made,
-	 *     // so that some information can be obtained right away.
-	 *     await poller.poll();
-	 *     return poller;
-	 *   }
-	 * }
-	 *
-	 * const poller: PollerLike = myClient.makePoller();
-	 * ```
-	 *
-	 * A poller can be created through its constructor, then it can be polled until it's completed.
-	 * At any point in time, the state of the poller can be obtained without delay through the getOperationState method.
-	 * At any point in time, the intermediate forms of the result type can be requested without delay.
-	 * Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.
-	 *
-	 * ```ts
-	 * const poller = myClient.makePoller();
-	 * const state: MyOperationState = poller.getOperationState();
-	 *
-	 * // The intermediate result can be obtained at any time.
-	 * const result: MyResult | undefined = poller.getResult();
-	 *
-	 * // The final result can only be obtained after the poller finishes.
-	 * const result: MyResult = await poller.pollUntilDone();
-	 * ```
-	 *
-	 */
-	// eslint-disable-next-line no-use-before-define
-	class Poller {
-	    /**
-	     * A poller needs to be initialized by passing in at least the basic properties of the `PollOperation`.
-	     *
-	     * When writing an implementation of a Poller, this implementation needs to deal with the initialization
-	     * of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller's
-	     * operation has already been defined, at least its basic properties. The code below shows how to approach
-	     * the definition of the constructor of a new custom poller.
-	     *
-	     * ```ts
-	     * export class MyPoller extends Poller {
-	     *   constructor({
-	     *     // Anything you might need outside of the basics
-	     *   }) {
-	     *     let state: MyOperationState = {
-	     *       privateProperty: private,
-	     *       publicProperty: public,
-	     *     };
-	     *
-	     *     const operation = {
-	     *       state,
-	     *       update,
-	     *       cancel,
-	     *       toString
-	     *     }
-	     *
-	     *     // Sending the operation to the parent's constructor.
-	     *     super(operation);
-	     *
-	     *     // You can assign more local properties here.
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * Inside of this constructor, a new promise is created. This will be used to
-	     * tell the user when the poller finishes (see `pollUntilDone()`). The promise's
-	     * resolve and reject methods are also used internally to control when to resolve
-	     * or reject anyone waiting for the poller to finish.
-	     *
-	     * The constructor of a custom implementation of a poller is where any serialized version of
-	     * a previous poller's operation should be deserialized into the operation sent to the
-	     * base constructor. For example:
-	     *
-	     * ```ts
-	     * export class MyPoller extends Poller {
-	     *   constructor(
-	     *     baseOperation: string | undefined
-	     *   ) {
-	     *     let state: MyOperationState = {};
-	     *     if (baseOperation) {
-	     *       state = {
-	     *         ...JSON.parse(baseOperation).state,
-	     *         ...state
-	     *       };
-	     *     }
-	     *     const operation = {
-	     *       state,
-	     *       // ...
-	     *     }
-	     *     super(operation);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param operation - Must contain the basic properties of `PollOperation`.
-	     */
-	    constructor(operation) {
-	        /** controls whether to throw an error if the operation failed or was canceled. */
-	        this.resolveOnUnsuccessful = false;
-	        this.stopped = true;
-	        this.pollProgressCallbacks = [];
-	        this.operation = operation;
-	        this.promise = new Promise((resolve, reject) => {
-	            this.resolve = resolve;
-	            this.reject = reject;
-	        });
-	        // This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.
-	        // The above warning would get thrown if `poller.poll` is called, it returns an error,
-	        // and pullUntilDone did not have a .catch or await try/catch on it's return value.
-	        this.promise.catch(() => {
-	            /* intentionally blank */
-	        });
-	    }
-	    /**
-	     * Starts a loop that will break only if the poller is done
-	     * or if the poller is stopped.
-	     */
-	    async startPolling(pollOptions = {}) {
-	        if (this.stopped) {
-	            this.stopped = false;
-	        }
-	        while (!this.isStopped() && !this.isDone()) {
-	            await this.poll(pollOptions);
-	            await this.delay();
-	        }
-	    }
-	    /**
-	     * pollOnce does one polling, by calling to the update method of the underlying
-	     * poll operation to make any relevant change effective.
-	     *
-	     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
-	     *
-	     * @param options - Optional properties passed to the operation's update method.
-	     */
-	    async pollOnce(options = {}) {
-	        if (!this.isDone()) {
-	            this.operation = await this.operation.update({
-	                abortSignal: options.abortSignal,
-	                fireProgress: this.fireProgress.bind(this),
-	            });
-	        }
-	        this.processUpdatedState();
-	    }
-	    /**
-	     * fireProgress calls the functions passed in via onProgress the method of the poller.
-	     *
-	     * It loops over all of the callbacks received from onProgress, and executes them, sending them
-	     * the current operation state.
-	     *
-	     * @param state - The current operation state.
-	     */
-	    fireProgress(state) {
-	        for (const callback of this.pollProgressCallbacks) {
-	            callback(state);
-	        }
-	    }
-	    /**
-	     * Invokes the underlying operation's cancel method.
-	     */
-	    async cancelOnce(options = {}) {
-	        this.operation = await this.operation.cancel(options);
-	    }
-	    /**
-	     * Returns a promise that will resolve once a single polling request finishes.
-	     * It does this by calling the update method of the Poller's operation.
-	     *
-	     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
-	     *
-	     * @param options - Optional properties passed to the operation's update method.
-	     */
-	    poll(options = {}) {
-	        if (!this.pollOncePromise) {
-	            this.pollOncePromise = this.pollOnce(options);
-	            const clearPollOncePromise = () => {
-	                this.pollOncePromise = undefined;
-	            };
-	            this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);
-	        }
-	        return this.pollOncePromise;
-	    }
-	    processUpdatedState() {
-	        if (this.operation.state.error) {
-	            this.stopped = true;
-	            if (!this.resolveOnUnsuccessful) {
-	                this.reject(this.operation.state.error);
-	                throw this.operation.state.error;
-	            }
-	        }
-	        if (this.operation.state.isCancelled) {
-	            this.stopped = true;
-	            if (!this.resolveOnUnsuccessful) {
-	                const error = new PollerCancelledError("Operation was canceled");
-	                this.reject(error);
-	                throw error;
-	            }
-	        }
-	        if (this.isDone() && this.resolve) {
-	            // If the poller has finished polling, this means we now have a result.
-	            // However, it can be the case that TResult is instantiated to void, so
-	            // we are not expecting a result anyway. To assert that we might not
-	            // have a result eventually after finishing polling, we cast the result
-	            // to TResult.
-	            this.resolve(this.getResult());
-	        }
-	    }
-	    /**
-	     * Returns a promise that will resolve once the underlying operation is completed.
-	     */
-	    async pollUntilDone(pollOptions = {}) {
-	        if (this.stopped) {
-	            this.startPolling(pollOptions).catch(this.reject);
-	        }
-	        // This is needed because the state could have been updated by
-	        // `cancelOperation`, e.g. the operation is canceled or an error occurred.
-	        this.processUpdatedState();
-	        return this.promise;
-	    }
-	    /**
-	     * Invokes the provided callback after each polling is completed,
-	     * sending the current state of the poller's operation.
-	     *
-	     * It returns a method that can be used to stop receiving updates on the given callback function.
-	     */
-	    onProgress(callback) {
-	        this.pollProgressCallbacks.push(callback);
-	        return () => {
-	            this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);
-	        };
-	    }
-	    /**
-	     * Returns true if the poller has finished polling.
-	     */
-	    isDone() {
-	        const state = this.operation.state;
-	        return Boolean(state.isCompleted || state.isCancelled || state.error);
-	    }
-	    /**
-	     * Stops the poller from continuing to poll.
-	     */
-	    stopPolling() {
-	        if (!this.stopped) {
-	            this.stopped = true;
-	            if (this.reject) {
-	                this.reject(new PollerStoppedError("This poller is already stopped"));
-	            }
-	        }
-	    }
-	    /**
-	     * Returns true if the poller is stopped.
-	     */
-	    isStopped() {
-	        return this.stopped;
-	    }
-	    /**
-	     * Attempts to cancel the underlying operation.
-	     *
-	     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
-	     *
-	     * If it's called again before it finishes, it will throw an error.
-	     *
-	     * @param options - Optional properties passed to the operation's update method.
-	     */
-	    cancelOperation(options = {}) {
-	        if (!this.cancelPromise) {
-	            this.cancelPromise = this.cancelOnce(options);
-	        }
-	        else if (options.abortSignal) {
-	            throw new Error("A cancel request is currently pending");
-	        }
-	        return this.cancelPromise;
-	    }
-	    /**
-	     * Returns the state of the operation.
-	     *
-	     * Even though TState will be the same type inside any of the methods of any extension of the Poller class,
-	     * implementations of the pollers can customize what's shared with the public by writing their own
-	     * version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller
-	     * and a public type representing a safe to share subset of the properties of the internal state.
-	     * Their definition of getOperationState can then return their public type.
-	     *
-	     * Example:
-	     *
-	     * ```ts
-	     * // Let's say we have our poller's operation state defined as:
-	     * interface MyOperationState extends PollOperationState {
-	     *   privateProperty?: string;
-	     *   publicProperty?: string;
-	     * }
-	     *
-	     * // To allow us to have a true separation of public and private state, we have to define another interface:
-	     * interface PublicState extends PollOperationState {
-	     *   publicProperty?: string;
-	     * }
-	     *
-	     * // Then, we define our Poller as follows:
-	     * export class MyPoller extends Poller {
-	     *   // ... More content is needed here ...
-	     *
-	     *   public getOperationState(): PublicState {
-	     *     const state: PublicState = this.operation.state;
-	     *     return {
-	     *       // Properties from PollOperationState
-	     *       isStarted: state.isStarted,
-	     *       isCompleted: state.isCompleted,
-	     *       isCancelled: state.isCancelled,
-	     *       error: state.error,
-	     *       result: state.result,
-	     *
-	     *       // The only other property needed by PublicState.
-	     *       publicProperty: state.publicProperty
-	     *     }
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * You can see this in the tests of this repository, go to the file:
-	     * `../test/utils/testPoller.ts`
-	     * and look for the getOperationState implementation.
-	     */
-	    getOperationState() {
-	        return this.operation.state;
-	    }
-	    /**
-	     * Returns the result value of the operation,
-	     * regardless of the state of the poller.
-	     * It can return undefined or an incomplete form of the final TResult value
-	     * depending on the implementation.
-	     */
-	    getResult() {
-	        const state = this.operation.state;
-	        return state.result;
-	    }
-	    /**
-	     * Returns a serialized version of the poller's operation
-	     * by invoking the operation's toString method.
-	     */
-	    toString() {
-	        return this.operation.toString();
-	    }
-	}
-	poller.Poller = Poller;
-	
-	return poller;
-}
-
-var hasRequiredLroEngine$1;
-
-function requireLroEngine$1 () {
-	if (hasRequiredLroEngine$1) return lroEngine;
-	hasRequiredLroEngine$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(lroEngine, "__esModule", { value: true });
-	lroEngine.LroEngine = void 0;
-	const operation_js_1 = requireOperation();
-	const constants_js_1 = requireConstants$1();
-	const poller_js_1 = requirePoller();
-	const operation_js_2 = requireOperation$2();
-	/**
-	 * The LRO Engine, a class that performs polling.
-	 */
-	class LroEngine extends poller_js_1.Poller {
-	    constructor(lro, options) {
-	        const { intervalInMs = constants_js_1.POLL_INTERVAL_IN_MS, resumeFrom, resolveOnUnsuccessful = false, isDone, lroResourceLocationConfig, processResult, updateState, } = options || {};
-	        const state = resumeFrom
-	            ? (0, operation_js_2.deserializeState)(resumeFrom)
-	            : {};
-	        const operation = new operation_js_1.GenericPollOperation(state, lro, !resolveOnUnsuccessful, lroResourceLocationConfig, processResult, updateState, isDone);
-	        super(operation);
-	        this.resolveOnUnsuccessful = resolveOnUnsuccessful;
-	        this.config = { intervalInMs: intervalInMs };
-	        operation.setPollerConfig(this.config);
-	    }
-	    /**
-	     * The method used by the poller to wait before attempting to update its operation.
-	     */
-	    delay() {
-	        return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs));
-	    }
-	}
-	lroEngine.LroEngine = LroEngine;
-	
-	return lroEngine;
-}
-
-var hasRequiredLroEngine;
-
-function requireLroEngine () {
-	if (hasRequiredLroEngine) return lroEngine$1;
-	hasRequiredLroEngine = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT license.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.LroEngine = void 0;
-		var lroEngine_js_1 = requireLroEngine$1();
-		Object.defineProperty(exports$1, "LroEngine", { enumerable: true, get: function () { return lroEngine_js_1.LroEngine; } });
-		
-	} (lroEngine$1));
-	return lroEngine$1;
-}
-
-var pollOperation = {};
-
-var hasRequiredPollOperation;
-
-function requirePollOperation () {
-	if (hasRequiredPollOperation) return pollOperation;
-	hasRequiredPollOperation = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT license.
-	Object.defineProperty(pollOperation, "__esModule", { value: true });
-	
-	return pollOperation;
-}
-
-var hasRequiredCommonjs$1;
-
-function requireCommonjs$1 () {
-	if (hasRequiredCommonjs$1) return commonjs;
-	hasRequiredCommonjs$1 = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT license.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.createHttpPoller = void 0;
-		const tslib_1 = require$$0$2;
-		var poller_js_1 = requirePoller$1();
-		Object.defineProperty(exports$1, "createHttpPoller", { enumerable: true, get: function () { return poller_js_1.createHttpPoller; } });
-		/**
-		 * This can be uncommented to expose the protocol-agnostic poller
-		 */
-		// export {
-		//   BuildCreatePollerOptions,
-		//   Operation,
-		//   CreatePollerOptions,
-		//   OperationConfig,
-		//   RestorableOperationState,
-		// } from "./poller/models";
-		// export { buildCreatePoller } from "./poller/poller";
-		/** legacy */
-		tslib_1.__exportStar(requireLroEngine(), exports$1);
-		tslib_1.__exportStar(requirePoller(), exports$1);
-		tslib_1.__exportStar(requirePollOperation(), exports$1);
-		
-	} (commonjs));
-	return commonjs;
-}
-
-var hasRequiredBlobStartCopyFromUrlPoller;
-
-function requireBlobStartCopyFromUrlPoller () {
-	if (hasRequiredBlobStartCopyFromUrlPoller) return BlobStartCopyFromUrlPoller;
-	hasRequiredBlobStartCopyFromUrlPoller = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobStartCopyFromUrlPoller, "__esModule", { value: true });
-	BlobStartCopyFromUrlPoller.BlobBeginCopyFromUrlPoller = void 0;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const core_lro_1 = /*@__PURE__*/ requireCommonjs$1();
-	/**
-	 * This is the poller returned by {@link BlobClient.beginCopyFromURL}.
-	 * This can not be instantiated directly outside of this package.
-	 *
-	 * @hidden
-	 */
-	class BlobBeginCopyFromUrlPoller extends core_lro_1.Poller {
-	    intervalInMs;
-	    constructor(options) {
-	        const { blobClient, copySource, intervalInMs = 15000, onProgress, resumeFrom, startCopyFromURLOptions, } = options;
-	        let state;
-	        if (resumeFrom) {
-	            state = JSON.parse(resumeFrom).state;
-	        }
-	        const operation = makeBlobBeginCopyFromURLPollOperation({
-	            ...state,
-	            blobClient,
-	            copySource,
-	            startCopyFromURLOptions,
-	        });
-	        super(operation);
-	        if (typeof onProgress === "function") {
-	            this.onProgress(onProgress);
-	        }
-	        this.intervalInMs = intervalInMs;
-	    }
-	    delay() {
-	        return (0, core_util_1.delay)(this.intervalInMs);
-	    }
-	}
-	BlobStartCopyFromUrlPoller.BlobBeginCopyFromUrlPoller = BlobBeginCopyFromUrlPoller;
-	/**
-	 * Note: Intentionally using function expression over arrow function expression
-	 * so that the function can be invoked with a different context.
-	 * This affects what `this` refers to.
-	 * @hidden
-	 */
-	const cancel = async function cancel(options = {}) {
-	    const state = this.state;
-	    const { copyId } = state;
-	    if (state.isCompleted) {
-	        return makeBlobBeginCopyFromURLPollOperation(state);
-	    }
-	    if (!copyId) {
-	        state.isCancelled = true;
-	        return makeBlobBeginCopyFromURLPollOperation(state);
-	    }
-	    // if abortCopyFromURL throws, it will bubble up to user's poller.cancelOperation call
-	    await state.blobClient.abortCopyFromURL(copyId, {
-	        abortSignal: options.abortSignal,
-	    });
-	    state.isCancelled = true;
-	    return makeBlobBeginCopyFromURLPollOperation(state);
-	};
-	/**
-	 * Note: Intentionally using function expression over arrow function expression
-	 * so that the function can be invoked with a different context.
-	 * This affects what `this` refers to.
-	 * @hidden
-	 */
-	const update = async function update(options = {}) {
-	    const state = this.state;
-	    const { blobClient, copySource, startCopyFromURLOptions } = state;
-	    if (!state.isStarted) {
-	        state.isStarted = true;
-	        const result = await blobClient.startCopyFromURL(copySource, startCopyFromURLOptions);
-	        // copyId is needed to abort
-	        state.copyId = result.copyId;
-	        if (result.copyStatus === "success") {
-	            state.result = result;
-	            state.isCompleted = true;
-	        }
-	    }
-	    else if (!state.isCompleted) {
-	        try {
-	            const result = await state.blobClient.getProperties({ abortSignal: options.abortSignal });
-	            const { copyStatus, copyProgress } = result;
-	            const prevCopyProgress = state.copyProgress;
-	            if (copyProgress) {
-	                state.copyProgress = copyProgress;
-	            }
-	            if (copyStatus === "pending" &&
-	                copyProgress !== prevCopyProgress &&
-	                typeof options.fireProgress === "function") {
-	                // trigger in setTimeout, or swallow error?
-	                options.fireProgress(state);
-	            }
-	            else if (copyStatus === "success") {
-	                state.result = result;
-	                state.isCompleted = true;
-	            }
-	            else if (copyStatus === "failed") {
-	                state.error = new Error(`Blob copy failed with reason: "${result.copyStatusDescription || "unknown"}"`);
-	                state.isCompleted = true;
-	            }
-	        }
-	        catch (err) {
-	            state.error = err;
-	            state.isCompleted = true;
-	        }
-	    }
-	    return makeBlobBeginCopyFromURLPollOperation(state);
-	};
-	/**
-	 * Note: Intentionally using function expression over arrow function expression
-	 * so that the function can be invoked with a different context.
-	 * This affects what `this` refers to.
-	 * @hidden
-	 */
-	const toString = function toString() {
-	    return JSON.stringify({ state: this.state }, (key, value) => {
-	        // remove blobClient from serialized state since a client can't be hydrated from this info.
-	        if (key === "blobClient") {
-	            return undefined;
-	        }
-	        return value;
-	    });
-	};
-	/**
-	 * Creates a poll operation given the provided state.
-	 * @hidden
-	 */
-	function makeBlobBeginCopyFromURLPollOperation(state) {
-	    return {
-	        state: { ...state },
-	        cancel,
-	        toString,
-	        update,
-	    };
-	}
-	
-	return BlobStartCopyFromUrlPoller;
-}
-
-var Range = {};
-
-var hasRequiredRange$1;
-
-function requireRange$1 () {
-	if (hasRequiredRange$1) return Range;
-	hasRequiredRange$1 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(Range, "__esModule", { value: true });
-	Range.rangeToString = rangeToString;
-	/**
-	 * Generate a range string. For example:
-	 *
-	 * "bytes=255-" or "bytes=0-511"
-	 *
-	 * @param iRange -
-	 */
-	function rangeToString(iRange) {
-	    if (iRange.offset < 0) {
-	        throw new RangeError(`Range.offset cannot be smaller than 0.`);
-	    }
-	    if (iRange.count && iRange.count <= 0) {
-	        throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`);
-	    }
-	    return iRange.count
-	        ? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`
-	        : `bytes=${iRange.offset}-`;
-	}
-	
-	return Range;
-}
-
-var Batch = {};
-
-var hasRequiredBatch;
-
-function requireBatch () {
-	if (hasRequiredBatch) return Batch;
-	hasRequiredBatch = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(Batch, "__esModule", { value: true });
-	Batch.Batch = void 0;
-	// In browser, during webpack or browserify bundling, this module will be replaced by 'events'
-	// https://github.com/Gozala/events
-	const events_1 = require$$0$7;
-	/**
-	 * States for Batch.
-	 */
-	var BatchStates;
-	(function (BatchStates) {
-	    BatchStates[BatchStates["Good"] = 0] = "Good";
-	    BatchStates[BatchStates["Error"] = 1] = "Error";
-	})(BatchStates || (BatchStates = {}));
-	/**
-	 * Batch provides basic parallel execution with concurrency limits.
-	 * Will stop execute left operations when one of the executed operation throws an error.
-	 * But Batch cannot cancel ongoing operations, you need to cancel them by yourself.
-	 */
-	let Batch$1 = class Batch {
-	    /**
-	     * Concurrency. Must be lager than 0.
-	     */
-	    concurrency;
-	    /**
-	     * Number of active operations under execution.
-	     */
-	    actives = 0;
-	    /**
-	     * Number of completed operations under execution.
-	     */
-	    completed = 0;
-	    /**
-	     * Offset of next operation to be executed.
-	     */
-	    offset = 0;
-	    /**
-	     * Operation array to be executed.
-	     */
-	    operations = [];
-	    /**
-	     * States of Batch. When an error happens, state will turn into error.
-	     * Batch will stop execute left operations.
-	     */
-	    state = BatchStates.Good;
-	    /**
-	     * A private emitter used to pass events inside this class.
-	     */
-	    emitter;
-	    /**
-	     * Creates an instance of Batch.
-	     * @param concurrency -
-	     */
-	    constructor(concurrency = 5) {
-	        if (concurrency < 1) {
-	            throw new RangeError("concurrency must be larger than 0");
-	        }
-	        this.concurrency = concurrency;
-	        this.emitter = new events_1.EventEmitter();
-	    }
-	    /**
-	     * Add a operation into queue.
-	     *
-	     * @param operation -
-	     */
-	    addOperation(operation) {
-	        this.operations.push(async () => {
-	            try {
-	                this.actives++;
-	                await operation();
-	                this.actives--;
-	                this.completed++;
-	                this.parallelExecute();
-	            }
-	            catch (error) {
-	                this.emitter.emit("error", error);
-	            }
-	        });
-	    }
-	    /**
-	     * Start execute operations in the queue.
-	     *
-	     */
-	    async do() {
-	        if (this.operations.length === 0) {
-	            return Promise.resolve();
-	        }
-	        this.parallelExecute();
-	        return new Promise((resolve, reject) => {
-	            this.emitter.on("finish", resolve);
-	            this.emitter.on("error", (error) => {
-	                this.state = BatchStates.Error;
-	                reject(error);
-	            });
-	        });
-	    }
-	    /**
-	     * Get next operation to be executed. Return null when reaching ends.
-	     *
-	     */
-	    nextOperation() {
-	        if (this.offset < this.operations.length) {
-	            return this.operations[this.offset++];
-	        }
-	        return null;
-	    }
-	    /**
-	     * Start execute operations. One one the most important difference between
-	     * this method with do() is that do() wraps as an sync method.
-	     *
-	     */
-	    parallelExecute() {
-	        if (this.state === BatchStates.Error) {
-	            return;
-	        }
-	        if (this.completed >= this.operations.length) {
-	            this.emitter.emit("finish");
-	            return;
-	        }
-	        while (this.actives < this.concurrency) {
-	            const operation = this.nextOperation();
-	            if (operation) {
-	                operation();
-	            }
-	            else {
-	                return;
-	            }
-	        }
-	    }
-	};
-	Batch.Batch = Batch$1;
-	
-	return Batch;
-}
-
-var utils$3 = {};
-
-var hasRequiredUtils$3;
-
-function requireUtils$3 () {
-	if (hasRequiredUtils$3) return utils$3;
-	hasRequiredUtils$3 = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(utils$3, "__esModule", { value: true });
-	utils$3.fsCreateReadStream = utils$3.fsStat = void 0;
-	utils$3.streamToBuffer = streamToBuffer;
-	utils$3.streamToBuffer2 = streamToBuffer2;
-	utils$3.streamToBuffer3 = streamToBuffer3;
-	utils$3.readStreamToLocalFile = readStreamToLocalFile;
-	const tslib_1 = require$$0$2;
-	const node_fs_1 = tslib_1.__importDefault(require$$1$a);
-	const node_util_1 = tslib_1.__importDefault(require$$1$4);
-	const constants_js_1 = requireConstants$3();
-	/**
-	 * Reads a readable stream into buffer. Fill the buffer from offset to end.
-	 *
-	 * @param stream - A Node.js Readable stream
-	 * @param buffer - Buffer to be filled, length must greater than or equal to offset
-	 * @param offset - From which position in the buffer to be filled, inclusive
-	 * @param end - To which position in the buffer to be filled, exclusive
-	 * @param encoding - Encoding of the Readable stream
-	 */
-	async function streamToBuffer(stream, buffer, offset, end, encoding) {
-	    let pos = 0; // Position in stream
-	    const count = end - offset; // Total amount of data needed in stream
-	    return new Promise((resolve, reject) => {
-	        const timeout = setTimeout(() => reject(new Error(`The operation cannot be completed in timeout.`)), constants_js_1.REQUEST_TIMEOUT);
-	        stream.on("readable", () => {
-	            if (pos >= count) {
-	                clearTimeout(timeout);
-	                resolve();
-	                return;
-	            }
-	            let chunk = stream.read();
-	            if (!chunk) {
-	                return;
-	            }
-	            if (typeof chunk === "string") {
-	                chunk = Buffer.from(chunk, encoding);
-	            }
-	            // How much data needed in this chunk
-	            const chunkLength = pos + chunk.length > count ? count - pos : chunk.length;
-	            buffer.fill(chunk.slice(0, chunkLength), offset + pos, offset + pos + chunkLength);
-	            pos += chunkLength;
-	        });
-	        stream.on("end", () => {
-	            clearTimeout(timeout);
-	            if (pos < count) {
-	                reject(new Error(`Stream drains before getting enough data needed. Data read: ${pos}, data need: ${count}`));
-	            }
-	            resolve();
-	        });
-	        stream.on("error", (msg) => {
-	            clearTimeout(timeout);
-	            reject(msg);
-	        });
-	    });
-	}
-	/**
-	 * Reads a readable stream into buffer entirely.
-	 *
-	 * @param stream - A Node.js Readable stream
-	 * @param buffer - Buffer to be filled, length must greater than or equal to offset
-	 * @param encoding - Encoding of the Readable stream
-	 * @returns with the count of bytes read.
-	 * @throws `RangeError` If buffer size is not big enough.
-	 */
-	async function streamToBuffer2(stream, buffer, encoding) {
-	    let pos = 0; // Position in stream
-	    const bufferSize = buffer.length;
-	    return new Promise((resolve, reject) => {
-	        stream.on("readable", () => {
-	            let chunk = stream.read();
-	            if (!chunk) {
-	                return;
-	            }
-	            if (typeof chunk === "string") {
-	                chunk = Buffer.from(chunk, encoding);
-	            }
-	            if (pos + chunk.length > bufferSize) {
-	                reject(new Error(`Stream exceeds buffer size. Buffer size: ${bufferSize}`));
-	                return;
-	            }
-	            buffer.fill(chunk, pos, pos + chunk.length);
-	            pos += chunk.length;
-	        });
-	        stream.on("end", () => {
-	            resolve(pos);
-	        });
-	        stream.on("error", reject);
-	    });
-	}
-	/**
-	 * Reads a readable stream into a buffer.
-	 *
-	 * @param stream - A Node.js Readable stream
-	 * @param encoding - Encoding of the Readable stream
-	 * @returns with the count of bytes read.
-	 */
-	async function streamToBuffer3(readableStream, encoding) {
-	    return new Promise((resolve, reject) => {
-	        const chunks = [];
-	        readableStream.on("data", (data) => {
-	            chunks.push(typeof data === "string" ? Buffer.from(data, encoding) : data);
-	        });
-	        readableStream.on("end", () => {
-	            resolve(Buffer.concat(chunks));
-	        });
-	        readableStream.on("error", reject);
-	    });
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * Writes the content of a readstream to a local file. Returns a Promise which is completed after the file handle is closed.
-	 *
-	 * @param rs - The read stream.
-	 * @param file - Destination file path.
-	 */
-	async function readStreamToLocalFile(rs, file) {
-	    return new Promise((resolve, reject) => {
-	        const ws = node_fs_1.default.createWriteStream(file);
-	        rs.on("error", (err) => {
-	            reject(err);
-	        });
-	        ws.on("error", (err) => {
-	            reject(err);
-	        });
-	        ws.on("close", resolve);
-	        rs.pipe(ws);
-	    });
-	}
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * Promisified version of fs.stat().
-	 */
-	utils$3.fsStat = node_util_1.default.promisify(node_fs_1.default.stat);
-	utils$3.fsCreateReadStream = node_fs_1.default.createReadStream;
-	
-	return utils$3;
-}
-
-var hasRequiredClients;
-
-function requireClients () {
-	if (hasRequiredClients) return Clients;
-	hasRequiredClients = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(Clients, "__esModule", { value: true });
-	Clients.PageBlobClient = Clients.BlockBlobClient = Clients.AppendBlobClient = Clients.BlobClient = void 0;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const core_util_2 = /*@__PURE__*/ requireCommonjs$b();
-	const BlobDownloadResponse_js_1 = requireBlobDownloadResponse();
-	const BlobQueryResponse_js_1 = requireBlobQueryResponse();
-	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
-	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
-	const models_js_1 = requireModels();
-	const PageBlobRangeResponse_js_1 = requirePageBlobRangeResponse();
-	const Pipeline_js_1 = requirePipeline();
-	const BlobStartCopyFromUrlPoller_js_1 = requireBlobStartCopyFromUrlPoller();
-	const Range_js_1 = requireRange$1();
-	const StorageClient_js_1 = requireStorageClient();
-	const Batch_js_1 = requireBatch();
-	const storage_common_1 = /*@__PURE__*/ requireCommonjs$2();
-	const constants_js_1 = requireConstants$3();
-	const tracing_js_1 = requireTracing();
-	const utils_common_js_1 = requireUtils_common$2();
-	const utils_js_1 = requireUtils$3();
-	const BlobSASSignatureValues_js_1 = requireBlobSASSignatureValues();
-	const BlobLeaseClient_js_1 = requireBlobLeaseClient();
-	/**
-	 * A BlobClient represents a URL to an Azure Storage blob; the blob may be a block blob,
-	 * append blob, or page blob.
-	 */
-	class BlobClient extends StorageClient_js_1.StorageClient {
-	    /**
-	     * blobContext provided by protocol layer.
-	     */
-	    blobContext;
-	    _name;
-	    _containerName;
-	    _versionId;
-	    _snapshot;
-	    /**
-	     * The name of the blob.
-	     */
-	    get name() {
-	        return this._name;
-	    }
-	    /**
-	     * The name of the storage container the blob is associated with.
-	     */
-	    get containerName() {
-	        return this._containerName;
-	    }
-	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        options = options || {};
-	        let pipeline;
-	        let url;
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, pipeline: Pipeline)
-	            url = urlOrConnectionString;
-	            pipeline = credentialOrPipelineOrContainerName;
-	        }
-	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            url = urlOrConnectionString;
-	            options = blobNameOrOptions;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
-	        }
-	        else if (!credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName !== "string") {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            // The second parameter is undefined. Use anonymous credential.
-	            url = urlOrConnectionString;
-	            if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {
-	                options = blobNameOrOptions;
-	            }
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        else if (credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName === "string" &&
-	            blobNameOrOptions &&
-	            typeof blobNameOrOptions === "string") {
-	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
-	            const containerName = credentialOrPipelineOrContainerName;
-	            const blobName = blobNameOrOptions;
-	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
-	            if (extractedCreds.kind === "AccountConnString") {
-	                if (core_util_1.isNodeLike) {
-	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
-	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
-	                    if (!options.proxyOptions) {
-	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
-	                    }
-	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
-	                }
-	                else {
-	                    throw new Error("Account connection string is only supported in Node.js environment");
-	                }
-	            }
-	            else if (extractedCreds.kind === "SASConnString") {
-	                url =
-	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
-	                        "?" +
-	                        extractedCreds.accountSas;
-	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	            }
-	            else {
-	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
-	            }
-	        }
-	        else {
-	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
-	        }
-	        super(url, pipeline);
-	        ({ blobName: this._name, containerName: this._containerName } =
-	            this.getBlobAndContainerNamesFromUrl());
-	        this.blobContext = this.storageClientContext.blob;
-	        this._snapshot = (0, utils_common_js_1.getURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT);
-	        this._versionId = (0, utils_common_js_1.getURLParameter)(this.url, constants_js_1.URLConstants.Parameters.VERSIONID);
-	    }
-	    /**
-	     * Creates a new BlobClient object identical to the source but with the specified snapshot timestamp.
-	     * Provide "" will remove the snapshot and return a Client to the base blob.
-	     *
-	     * @param snapshot - The snapshot timestamp.
-	     * @returns A new BlobClient object identical to the source but with the specified snapshot timestamp
-	     */
-	    withSnapshot(snapshot) {
-	        return new BlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
-	    }
-	    /**
-	     * Creates a new BlobClient object pointing to a version of this blob.
-	     * Provide "" will remove the versionId and return a Client to the base blob.
-	     *
-	     * @param versionId - The versionId.
-	     * @returns A new BlobClient object pointing to the version of this blob.
-	     */
-	    withVersion(versionId) {
-	        return new BlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.VERSIONID, versionId.length === 0 ? undefined : versionId), this.pipeline);
-	    }
-	    /**
-	     * Creates a AppendBlobClient object.
-	     *
-	     */
-	    getAppendBlobClient() {
-	        return new AppendBlobClient(this.url, this.pipeline);
-	    }
-	    /**
-	     * Creates a BlockBlobClient object.
-	     *
-	     */
-	    getBlockBlobClient() {
-	        return new BlockBlobClient(this.url, this.pipeline);
-	    }
-	    /**
-	     * Creates a PageBlobClient object.
-	     *
-	     */
-	    getPageBlobClient() {
-	        return new PageBlobClient(this.url, this.pipeline);
-	    }
-	    /**
-	     * Reads or downloads a blob from the system, including its metadata and properties.
-	     * You can also call Get Blob to read a snapshot.
-	     *
-	     * * In Node.js, data returns in a Readable stream readableStreamBody
-	     * * In browsers, data returns in a promise blobBody
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob
-	     *
-	     * @param offset - From which position of the blob to download, greater than or equal to 0
-	     * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined
-	     * @param options - Optional options to Blob Download operation.
-	     *
-	     *
-	     * Example usage (Node.js):
-	     *
-	     * ```ts snippet:ReadmeSampleDownloadBlob_Node
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blobClient = containerClient.getBlobClient(blobName);
-	     *
-	     * // Get blob content from position 0 to the end
-	     * // In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody
-	     * const downloadBlockBlobResponse = await blobClient.download();
-	     * if (downloadBlockBlobResponse.readableStreamBody) {
-	     *   const downloaded = await streamToString(downloadBlockBlobResponse.readableStreamBody);
-	     *   console.log(`Downloaded blob content: ${downloaded}`);
-	     * }
-	     *
-	     * async function streamToString(stream: NodeJS.ReadableStream): Promise {
-	     *   const result = await new Promise>((resolve, reject) => {
-	     *     const chunks: Buffer[] = [];
-	     *     stream.on("data", (data) => {
-	     *       chunks.push(Buffer.isBuffer(data) ? data : Buffer.from(data));
-	     *     });
-	     *     stream.on("end", () => {
-	     *       resolve(Buffer.concat(chunks));
-	     *     });
-	     *     stream.on("error", reject);
-	     *   });
-	     *   return result.toString();
-	     * }
-	     * ```
-	     *
-	     * Example usage (browser):
-	     *
-	     * ```ts snippet:ReadmeSampleDownloadBlob_Browser
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blobClient = containerClient.getBlobClient(blobName);
-	     *
-	     * // Get blob content from position 0 to the end
-	     * // In browsers, get downloaded data by accessing downloadBlockBlobResponse.blobBody
-	     * const downloadBlockBlobResponse = await blobClient.download();
-	     * const blobBody = await downloadBlockBlobResponse.blobBody;
-	     * if (blobBody) {
-	     *   const downloaded = await blobBody.text();
-	     *   console.log(`Downloaded blob content: ${downloaded}`);
-	     * }
-	     * ```
-	     */
-	    async download(offset = 0, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-download", options, async (updatedOptions) => {
-	            const res = (0, utils_common_js_1.assertResponse)(await this.blobContext.download({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                requestOptions: {
-	                    onDownloadProgress: core_util_1.isNodeLike ? undefined : options.onProgress, // for Node.js, progress is reported by RetriableReadableStream
-	                },
-	                range: offset === 0 && !count ? undefined : (0, Range_js_1.rangeToString)({ offset, count }),
-	                rangeGetContentMD5: options.rangeGetContentMD5,
-	                rangeGetContentCRC64: options.rangeGetContentCrc64,
-	                snapshot: options.snapshot,
-	                cpkInfo: options.customerProvidedKey,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const wrappedRes = {
-	                ...res,
-	                _response: res._response, // _response is made non-enumerable
-	                objectReplicationDestinationPolicyId: res.objectReplicationPolicyId,
-	                objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(res.objectReplicationRules),
-	            };
-	            // Return browser response immediately
-	            if (!core_util_1.isNodeLike) {
-	                return wrappedRes;
-	            }
-	            // We support retrying when download stream unexpected ends in Node.js runtime
-	            // Following code shouldn't be bundled into browser build, however some
-	            // bundlers may try to bundle following code and "FileReadResponse.ts".
-	            // In this case, "FileDownloadResponse.browser.ts" will be used as a shim of "FileDownloadResponse.ts"
-	            // The config is in package.json "browser" field
-	            if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) {
-	                // TODO: Default value or make it a required parameter?
-	                options.maxRetryRequests = constants_js_1.DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS;
-	            }
-	            if (res.contentLength === undefined) {
-	                throw new RangeError(`File download response doesn't contain valid content length header`);
-	            }
-	            if (!res.etag) {
-	                throw new RangeError(`File download response doesn't contain valid etag header`);
-	            }
-	            return new BlobDownloadResponse_js_1.BlobDownloadResponse(wrappedRes, async (start) => {
-	                const updatedDownloadOptions = {
-	                    leaseAccessConditions: options.conditions,
-	                    modifiedAccessConditions: {
-	                        ifMatch: options.conditions.ifMatch || res.etag,
-	                        ifModifiedSince: options.conditions.ifModifiedSince,
-	                        ifNoneMatch: options.conditions.ifNoneMatch,
-	                        ifUnmodifiedSince: options.conditions.ifUnmodifiedSince,
-	                        ifTags: options.conditions?.tagConditions,
-	                    },
-	                    range: (0, Range_js_1.rangeToString)({
-	                        count: offset + res.contentLength - start,
-	                        offset: start,
-	                    }),
-	                    rangeGetContentMD5: options.rangeGetContentMD5,
-	                    rangeGetContentCRC64: options.rangeGetContentCrc64,
-	                    snapshot: options.snapshot,
-	                    cpkInfo: options.customerProvidedKey,
-	                };
-	                // Debug purpose only
-	                // console.log(
-	                //   `Read from internal stream, range: ${
-	                //     updatedOptions.range
-	                //   }, options: ${JSON.stringify(updatedOptions)}`
-	                // );
-	                return (await this.blobContext.download({
-	                    abortSignal: options.abortSignal,
-	                    ...updatedDownloadOptions,
-	                })).readableStreamBody;
-	            }, offset, res.contentLength, {
-	                maxRetryRequests: options.maxRetryRequests,
-	                onProgress: options.onProgress,
-	            });
-	        });
-	    }
-	    /**
-	     * Returns true if the Azure blob resource represented by this client exists; false otherwise.
-	     *
-	     * NOTE: use this function with care since an existing blob might be deleted by other clients or
-	     * applications. Vice versa new blobs might be added by other clients or applications after this
-	     * function completes.
-	     *
-	     * @param options - options to Exists operation.
-	     */
-	    async exists(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-exists", options, async (updatedOptions) => {
-	            try {
-	                (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	                await this.getProperties({
-	                    abortSignal: options.abortSignal,
-	                    customerProvidedKey: options.customerProvidedKey,
-	                    conditions: options.conditions,
-	                    tracingOptions: updatedOptions.tracingOptions,
-	                });
-	                return true;
-	            }
-	            catch (e) {
-	                if (e.statusCode === 404) {
-	                    // Expected exception when checking blob existence
-	                    return false;
-	                }
-	                else if (e.statusCode === 409 &&
-	                    (e.details.errorCode === constants_js_1.BlobUsesCustomerSpecifiedEncryptionMsg ||
-	                        e.details.errorCode === constants_js_1.BlobDoesNotUseCustomerSpecifiedEncryption)) {
-	                    // Expected exception when checking blob existence
-	                    return true;
-	                }
-	                throw e;
-	            }
-	        });
-	    }
-	    /**
-	     * Returns all user-defined metadata, standard HTTP properties, and system properties
-	     * for the blob. It does not return the content of the blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-properties
-	     *
-	     * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if
-	     * they originally contained uppercase characters. This differs from the metadata keys returned by
-	     * the methods of {@link ContainerClient} that list blobs using the `includeMetadata` option, which
-	     * will retain their original casing.
-	     *
-	     * @param options - Optional options to Get Properties operation.
-	     */
-	    async getProperties(options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-getProperties", options, async (updatedOptions) => {
-	            const res = (0, utils_common_js_1.assertResponse)(await this.blobContext.getProperties({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            return {
-	                ...res,
-	                _response: res._response, // _response is made non-enumerable
-	                objectReplicationDestinationPolicyId: res.objectReplicationPolicyId,
-	                objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(res.objectReplicationRules),
-	            };
-	        });
-	    }
-	    /**
-	     * Marks the specified blob or snapshot for deletion. The blob is later deleted
-	     * during garbage collection. Note that in order to delete a blob, you must delete
-	     * all of its snapshots. You can delete both at the same time with the Delete
-	     * Blob operation.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
-	     *
-	     * @param options - Optional options to Blob Delete operation.
-	     */
-	    async delete(options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-delete", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.delete({
-	                abortSignal: options.abortSignal,
-	                deleteSnapshots: options.deleteSnapshots,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Marks the specified blob or snapshot for deletion if it exists. The blob is later deleted
-	     * during garbage collection. Note that in order to delete a blob, you must delete
-	     * all of its snapshots. You can delete both at the same time with the Delete
-	     * Blob operation.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
-	     *
-	     * @param options - Optional options to Blob Delete operation.
-	     */
-	    async deleteIfExists(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-deleteIfExists", options, async (updatedOptions) => {
-	            try {
-	                const res = (0, utils_common_js_1.assertResponse)(await this.delete(updatedOptions));
-	                return {
-	                    succeeded: true,
-	                    ...res,
-	                    _response: res._response, // _response is made non-enumerable
-	                };
-	            }
-	            catch (e) {
-	                if (e.details?.errorCode === "BlobNotFound") {
-	                    return {
-	                        succeeded: false,
-	                        ...e.response?.parsedHeaders,
-	                        _response: e.response,
-	                    };
-	                }
-	                throw e;
-	            }
-	        });
-	    }
-	    /**
-	     * Restores the contents and metadata of soft deleted blob and any associated
-	     * soft deleted snapshots. Undelete Blob is supported only on version 2017-07-29
-	     * or later.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/undelete-blob
-	     *
-	     * @param options - Optional options to Blob Undelete operation.
-	     */
-	    async undelete(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-undelete", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.undelete({
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Sets system properties on the blob.
-	     *
-	     * If no value provided, or no value provided for the specified blob HTTP headers,
-	     * these blob HTTP headers without a value will be cleared.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
-	     *
-	     * @param blobHTTPHeaders - If no value provided, or no value provided for
-	     *                                                   the specified blob HTTP headers, these blob HTTP
-	     *                                                   headers without a value will be cleared.
-	     *                                                   A common header to set is `blobContentType`
-	     *                                                   enabling the browser to provide functionality
-	     *                                                   based on file type.
-	     * @param options - Optional options to Blob Set HTTP Headers operation.
-	     */
-	    async setHTTPHeaders(blobHTTPHeaders, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-setHTTPHeaders", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setHttpHeaders({
-	                abortSignal: options.abortSignal,
-	                blobHttpHeaders: blobHTTPHeaders,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                // cpkInfo: options.customerProvidedKey, // CPK is not included in Swagger, should change this back when this issue is fixed in Swagger.
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Sets user-defined metadata for the specified blob as one or more name-value pairs.
-	     *
-	     * If no option provided, or no metadata defined in the parameter, the blob
-	     * metadata will be removed.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-metadata
-	     *
-	     * @param metadata - Replace existing metadata with this value.
-	     *                               If no value provided the existing metadata will be removed.
-	     * @param options - Optional options to Set Metadata operation.
-	     */
-	    async setMetadata(metadata, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-setMetadata", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setMetadata({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Sets tags on the underlying blob.
-	     * A blob can have up to 10 tags. Tag keys must be between 1 and 128 characters.  Tag values must be between 0 and 256 characters.
-	     * Valid tag key and value characters include lower and upper case letters, digits (0-9),
-	     * space (' '), plus ('+'), minus ('-'), period ('.'), foward slash ('/'), colon (':'), equals ('='), and underscore ('_').
-	     *
-	     * @param tags -
-	     * @param options -
-	     */
-	    async setTags(tags, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-setTags", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setTags({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	                tags: (0, utils_common_js_1.toBlobTags)(tags),
-	            }));
-	        });
-	    }
-	    /**
-	     * Gets the tags associated with the underlying blob.
-	     *
-	     * @param options -
-	     */
-	    async getTags(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-getTags", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.blobContext.getTags({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const wrappedResponse = {
-	                ...response,
-	                _response: response._response, // _response is made non-enumerable
-	                tags: (0, utils_common_js_1.toTags)({ blobTagSet: response.blobTagSet }) || {},
-	            };
-	            return wrappedResponse;
-	        });
-	    }
-	    /**
-	     * Get a {@link BlobLeaseClient} that manages leases on the blob.
-	     *
-	     * @param proposeLeaseId - Initial proposed lease Id.
-	     * @returns A new BlobLeaseClient object for managing leases on the blob.
-	     */
-	    getBlobLeaseClient(proposeLeaseId) {
-	        return new BlobLeaseClient_js_1.BlobLeaseClient(this, proposeLeaseId);
-	    }
-	    /**
-	     * Creates a read-only snapshot of a blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/snapshot-blob
-	     *
-	     * @param options - Optional options to the Blob Create Snapshot operation.
-	     */
-	    async createSnapshot(options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-createSnapshot", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.createSnapshot({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                metadata: options.metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Asynchronously copies a blob to a destination within the storage account.
-	     * This method returns a long running operation poller that allows you to wait
-	     * indefinitely until the copy is completed.
-	     * You can also cancel a copy before it is completed by calling `cancelOperation` on the poller.
-	     * Note that the onProgress callback will not be invoked if the operation completes in the first
-	     * request, and attempting to cancel a completed copy will result in an error being thrown.
-	     *
-	     * In version 2012-02-12 and later, the source for a Copy Blob operation can be
-	     * a committed blob in any Azure storage account.
-	     * Beginning with version 2015-02-21, the source for a Copy Blob operation can be
-	     * an Azure file in any Azure storage account.
-	     * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob
-	     * operation to copy from another storage account.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/copy-blob
-	     *
-	     * ```ts snippet:ClientsBeginCopyFromURL
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blobClient = containerClient.getBlobClient(blobName);
-	     *
-	     * // Example using automatic polling
-	     * const automaticCopyPoller = await blobClient.beginCopyFromURL("url");
-	     * const automaticResult = await automaticCopyPoller.pollUntilDone();
-	     *
-	     * // Example using manual polling
-	     * const manualCopyPoller = await blobClient.beginCopyFromURL("url");
-	     * while (!manualCopyPoller.isDone()) {
-	     *   await manualCopyPoller.poll();
-	     * }
-	     * const manualResult = manualCopyPoller.getResult();
-	     *
-	     * // Example using progress updates
-	     * const progressUpdatesCopyPoller = await blobClient.beginCopyFromURL("url", {
-	     *   onProgress(state) {
-	     *     console.log(`Progress: ${state.copyProgress}`);
-	     *   },
-	     * });
-	     * const progressUpdatesResult = await progressUpdatesCopyPoller.pollUntilDone();
-	     *
-	     * // Example using a changing polling interval (default 15 seconds)
-	     * const pollingIntervalCopyPoller = await blobClient.beginCopyFromURL("url", {
-	     *   intervalInMs: 1000, // poll blob every 1 second for copy progress
-	     * });
-	     * const pollingIntervalResult = await pollingIntervalCopyPoller.pollUntilDone();
-	     *
-	     * // Example using copy cancellation:
-	     * const cancelCopyPoller = await blobClient.beginCopyFromURL("url");
-	     * // cancel operation after starting it.
-	     * try {
-	     *   await cancelCopyPoller.cancelOperation();
-	     *   // calls to get the result now throw PollerCancelledError
-	     *   cancelCopyPoller.getResult();
-	     * } catch (err: any) {
-	     *   if (err.name === "PollerCancelledError") {
-	     *     console.log("The copy was cancelled.");
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param copySource - url to the source Azure Blob/File.
-	     * @param options - Optional options to the Blob Start Copy From URL operation.
-	     */
-	    async beginCopyFromURL(copySource, options = {}) {
-	        const client = {
-	            abortCopyFromURL: (...args) => this.abortCopyFromURL(...args),
-	            getProperties: (...args) => this.getProperties(...args),
-	            startCopyFromURL: (...args) => this.startCopyFromURL(...args),
-	        };
-	        const poller = new BlobStartCopyFromUrlPoller_js_1.BlobBeginCopyFromUrlPoller({
-	            blobClient: client,
-	            copySource,
-	            intervalInMs: options.intervalInMs,
-	            onProgress: options.onProgress,
-	            resumeFrom: options.resumeFrom,
-	            startCopyFromURLOptions: options,
-	        });
-	        // Trigger the startCopyFromURL call by calling poll.
-	        // Any errors from this method should be surfaced to the user.
-	        await poller.poll();
-	        return poller;
-	    }
-	    /**
-	     * Aborts a pending asynchronous Copy Blob operation, and leaves a destination blob with zero
-	     * length and full metadata. Version 2012-02-12 and newer.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/abort-copy-blob
-	     *
-	     * @param copyId - Id of the Copy From URL operation.
-	     * @param options - Optional options to the Blob Abort Copy From URL operation.
-	     */
-	    async abortCopyFromURL(copyId, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-abortCopyFromURL", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.abortCopyFromURL(copyId, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The synchronous Copy From URL operation copies a blob or an internet resource to a new blob. It will not
-	     * return a response until the copy is complete.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/copy-blob-from-url
-	     *
-	     * @param copySource - The source URL to copy from, Shared Access Signature(SAS) maybe needed for authentication
-	     * @param options -
-	     */
-	    async syncCopyFromURL(copySource, options = {}) {
-	        options.conditions = options.conditions || {};
-	        options.sourceConditions = options.sourceConditions || {};
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-syncCopyFromURL", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.copyFromURL(copySource, {
-	                abortSignal: options.abortSignal,
-	                metadata: options.metadata,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                sourceModifiedAccessConditions: {
-	                    sourceIfMatch: options.sourceConditions?.ifMatch,
-	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
-	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
-	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
-	                },
-	                sourceContentMD5: options.sourceContentMD5,
-	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
-	                tier: (0, models_js_1.toAccessTier)(options.tier),
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
-	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
-	                legalHold: options.legalHold,
-	                encryptionScope: options.encryptionScope,
-	                copySourceTags: options.copySourceTags,
-	                fileRequestIntent: options.sourceShareTokenIntent,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Sets the tier on a blob. The operation is allowed on a page blob in a premium
-	     * storage account and on a block blob in a blob storage account (locally redundant
-	     * storage only). A premium page blob's tier determines the allowed size, IOPS,
-	     * and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive
-	     * storage type. This operation does not update the blob's ETag.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-tier
-	     *
-	     * @param tier - The tier to be set on the blob. Valid values are Hot, Cool, or Archive.
-	     * @param options - Optional options to the Blob Set Tier operation.
-	     */
-	    async setAccessTier(tier, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-setAccessTier", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setTier((0, models_js_1.toAccessTier)(tier), {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                rehydratePriority: options.rehydratePriority,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    async downloadToBuffer(param1, param2, param3, param4 = {}) {
-	        let buffer;
-	        let offset = 0;
-	        let count = 0;
-	        let options = param4;
-	        if (param1 instanceof Buffer) {
-	            buffer = param1;
-	            offset = param2 || 0;
-	            count = typeof param3 === "number" ? param3 : 0;
-	        }
-	        else {
-	            offset = typeof param1 === "number" ? param1 : 0;
-	            count = typeof param2 === "number" ? param2 : 0;
-	            options = param3 || {};
-	        }
-	        let blockSize = options.blockSize ?? 0;
-	        if (blockSize < 0) {
-	            throw new RangeError("blockSize option must be >= 0");
-	        }
-	        if (blockSize === 0) {
-	            blockSize = constants_js_1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;
-	        }
-	        if (offset < 0) {
-	            throw new RangeError("offset option must be >= 0");
-	        }
-	        if (count && count <= 0) {
-	            throw new RangeError("count option must be greater than 0");
-	        }
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-downloadToBuffer", options, async (updatedOptions) => {
-	            // Customer doesn't specify length, get it
-	            if (!count) {
-	                const response = await this.getProperties({
-	                    ...options,
-	                    tracingOptions: updatedOptions.tracingOptions,
-	                });
-	                count = response.contentLength - offset;
-	                if (count < 0) {
-	                    throw new RangeError(`offset ${offset} shouldn't be larger than blob size ${response.contentLength}`);
-	                }
-	            }
-	            // Allocate the buffer of size = count if the buffer is not provided
-	            if (!buffer) {
-	                try {
-	                    buffer = Buffer.alloc(count);
-	                }
-	                catch (error) {
-	                    throw new Error(`Unable to allocate the buffer of size: ${count}(in bytes). Please try passing your own buffer to the "downloadToBuffer" method or try using other methods like "download" or "downloadToFile".\t ${error.message}`);
-	                }
-	            }
-	            if (buffer.length < count) {
-	                throw new RangeError(`The buffer's size should be equal to or larger than the request count of bytes: ${count}`);
-	            }
-	            let transferProgress = 0;
-	            const batch = new Batch_js_1.Batch(options.concurrency);
-	            for (let off = offset; off < offset + count; off = off + blockSize) {
-	                batch.addOperation(async () => {
-	                    // Exclusive chunk end position
-	                    let chunkEnd = offset + count;
-	                    if (off + blockSize < chunkEnd) {
-	                        chunkEnd = off + blockSize;
-	                    }
-	                    const response = await this.download(off, chunkEnd - off, {
-	                        abortSignal: options.abortSignal,
-	                        conditions: options.conditions,
-	                        maxRetryRequests: options.maxRetryRequestsPerBlock,
-	                        customerProvidedKey: options.customerProvidedKey,
-	                        tracingOptions: updatedOptions.tracingOptions,
-	                    });
-	                    const stream = response.readableStreamBody;
-	                    await (0, utils_js_1.streamToBuffer)(stream, buffer, off - offset, chunkEnd - offset);
-	                    // Update progress after block is downloaded, in case of block trying
-	                    // Could provide finer grained progress updating inside HTTP requests,
-	                    // only if convenience layer download try is enabled
-	                    transferProgress += chunkEnd - off;
-	                    if (options.onProgress) {
-	                        options.onProgress({ loadedBytes: transferProgress });
-	                    }
-	                });
-	            }
-	            await batch.do();
-	            return buffer;
-	        });
-	    }
-	    /**
-	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	     *
-	     * Downloads an Azure Blob to a local file.
-	     * Fails if the the given file path already exits.
-	     * Offset and count are optional, pass 0 and undefined respectively to download the entire blob.
-	     *
-	     * @param filePath -
-	     * @param offset - From which position of the block blob to download.
-	     * @param count - How much data to be downloaded. Will download to the end when passing undefined.
-	     * @param options - Options to Blob download options.
-	     * @returns The response data for blob download operation,
-	     *                                                 but with readableStreamBody set to undefined since its
-	     *                                                 content is already read and written into a local file
-	     *                                                 at the specified path.
-	     */
-	    async downloadToFile(filePath, offset = 0, count, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-downloadToFile", options, async (updatedOptions) => {
-	            const response = await this.download(offset, count, {
-	                ...options,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            });
-	            if (response.readableStreamBody) {
-	                await (0, utils_js_1.readStreamToLocalFile)(response.readableStreamBody, filePath);
-	            }
-	            // The stream is no longer accessible so setting it to undefined.
-	            response.blobDownloadStream = undefined;
-	            return response;
-	        });
-	    }
-	    getBlobAndContainerNamesFromUrl() {
-	        let containerName;
-	        let blobName;
-	        try {
-	            //  URL may look like the following
-	            // "https://myaccount.blob.core.windows.net/mycontainer/blob?sasString";
-	            // "https://myaccount.blob.core.windows.net/mycontainer/blob";
-	            // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt?sasString";
-	            // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt";
-	            // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername/blob`
-	            // http://localhost:10001/devstoreaccount1/containername/blob
-	            const parsedUrl = new URL(this.url);
-	            if (parsedUrl.host.split(".")[1] === "blob") {
-	                // "https://myaccount.blob.core.windows.net/containername/blob".
-	                // .getPath() -> /containername/blob
-	                const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?");
-	                containerName = pathComponents[1];
-	                blobName = pathComponents[3];
-	            }
-	            else if ((0, utils_common_js_1.isIpEndpointStyle)(parsedUrl)) {
-	                // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername/blob
-	                // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername/blob
-	                // .getPath() -> /devstoreaccount1/containername/blob
-	                const pathComponents = parsedUrl.pathname.match("/([^/]*)/([^/]*)(/(.*))?");
-	                containerName = pathComponents[2];
-	                blobName = pathComponents[4];
-	            }
-	            else {
-	                // "https://customdomain.com/containername/blob".
-	                // .getPath() -> /containername/blob
-	                const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?");
-	                containerName = pathComponents[1];
-	                blobName = pathComponents[3];
-	            }
-	            // decode the encoded blobName, containerName - to get all the special characters that might be present in them
-	            containerName = decodeURIComponent(containerName);
-	            blobName = decodeURIComponent(blobName);
-	            // Azure Storage Server will replace "\" with "/" in the blob names
-	            //   doing the same in the SDK side so that the user doesn't have to replace "\" instances in the blobName
-	            blobName = blobName.replace(/\\/g, "/");
-	            if (!containerName) {
-	                throw new Error("Provided containerName is invalid.");
-	            }
-	            return { blobName, containerName };
-	        }
-	        catch (error) {
-	            throw new Error("Unable to extract blobName and containerName with provided information.");
-	        }
-	    }
-	    /**
-	     * Asynchronously copies a blob to a destination within the storage account.
-	     * In version 2012-02-12 and later, the source for a Copy Blob operation can be
-	     * a committed blob in any Azure storage account.
-	     * Beginning with version 2015-02-21, the source for a Copy Blob operation can be
-	     * an Azure file in any Azure storage account.
-	     * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob
-	     * operation to copy from another storage account.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/copy-blob
-	     *
-	     * @param copySource - url to the source Azure Blob/File.
-	     * @param options - Optional options to the Blob Start Copy From URL operation.
-	     */
-	    async startCopyFromURL(copySource, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-startCopyFromURL", options, async (updatedOptions) => {
-	            options.conditions = options.conditions || {};
-	            options.sourceConditions = options.sourceConditions || {};
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.startCopyFromURL(copySource, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                metadata: options.metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                sourceModifiedAccessConditions: {
-	                    sourceIfMatch: options.sourceConditions.ifMatch,
-	                    sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,
-	                    sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,
-	                    sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,
-	                    sourceIfTags: options.sourceConditions.tagConditions,
-	                },
-	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
-	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
-	                legalHold: options.legalHold,
-	                rehydratePriority: options.rehydratePriority,
-	                tier: (0, models_js_1.toAccessTier)(options.tier),
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                sealBlob: options.sealBlob,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Only available for BlobClient constructed with a shared key credential.
-	     *
-	     * Generates a Blob Service Shared Access Signature (SAS) URI based on the client properties
-	     * and parameters passed in. The SAS is signed by the shared key credential of the client.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateSasUrl(options) {
-	        return new Promise((resolve) => {
-	            if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
-	                throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
-	            }
-	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
-	                containerName: this._containerName,
-	                blobName: this._name,
-	                snapshotTime: this._snapshot,
-	                versionId: this._versionId,
-	                ...options,
-	            }, this.credential).toString();
-	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
-	        });
-	    }
-	    /**
-	     * Only available for BlobClient constructed with a shared key credential.
-	     *
-	     * Generates string to sign for a Blob Service Shared Access Signature (SAS) URI based on
-	     * the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    generateSasStringToSign(options) {
-	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
-	            throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
-	        }
-	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
-	            containerName: this._containerName,
-	            blobName: this._name,
-	            snapshotTime: this._snapshot,
-	            versionId: this._versionId,
-	            ...options,
-	        }, this.credential).stringToSign;
-	    }
-	    /**
-	     *
-	     * Generates a Blob Service Shared Access Signature (SAS) URI based on
-	     * the client properties and parameters passed in. The SAS is signed by the input user delegation key.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateUserDelegationSasUrl(options, userDelegationKey) {
-	        return new Promise((resolve) => {
-	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
-	                containerName: this._containerName,
-	                blobName: this._name,
-	                snapshotTime: this._snapshot,
-	                versionId: this._versionId,
-	                ...options,
-	            }, userDelegationKey, this.accountName).toString();
-	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
-	        });
-	    }
-	    /**
-	     * Only available for BlobClient constructed with a shared key credential.
-	     *
-	     * Generates string to sign for a Blob Service Shared Access Signature (SAS) URI based on
-	     * the client properties and parameters passed in. The SAS is signed by the input user delegation key.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateUserDelegationSasStringToSign(options, userDelegationKey) {
-	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
-	            containerName: this._containerName,
-	            blobName: this._name,
-	            snapshotTime: this._snapshot,
-	            versionId: this._versionId,
-	            ...options,
-	        }, userDelegationKey, this.accountName).stringToSign;
-	    }
-	    /**
-	     * Delete the immutablility policy on the blob.
-	     *
-	     * @param options - Optional options to delete immutability policy on the blob.
-	     */
-	    async deleteImmutabilityPolicy(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-deleteImmutabilityPolicy", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.deleteImmutabilityPolicy({
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Set immutability policy on the blob.
-	     *
-	     * @param options - Optional options to set immutability policy on the blob.
-	     */
-	    async setImmutabilityPolicy(immutabilityPolicy, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-setImmutabilityPolicy", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setImmutabilityPolicy({
-	                immutabilityPolicyExpiry: immutabilityPolicy.expiriesOn,
-	                immutabilityPolicyMode: immutabilityPolicy.policyMode,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Set legal hold on the blob.
-	     *
-	     * @param options - Optional options to set legal hold on the blob.
-	     */
-	    async setLegalHold(legalHoldEnabled, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-setLegalHold", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setLegalHold(legalHoldEnabled, {
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The Get Account Information operation returns the sku name and account kind
-	     * for the specified account.
-	     * The Get Account Information operation is available on service versions beginning
-	     * with version 2018-03-28.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
-	     *
-	     * @param options - Options to the Service Get Account Info operation.
-	     * @returns Response data for the Service Get Account Info operation.
-	     */
-	    async getAccountInfo(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobClient-getAccountInfo", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.getAccountInfo({
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	}
-	Clients.BlobClient = BlobClient;
-	/**
-	 * AppendBlobClient defines a set of operations applicable to append blobs.
-	 */
-	class AppendBlobClient extends BlobClient {
-	    /**
-	     * appendBlobsContext provided by protocol layer.
-	     */
-	    appendBlobContext;
-	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
-	        //   super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
-	        let pipeline;
-	        let url;
-	        options = options || {};
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, pipeline: Pipeline)
-	            url = urlOrConnectionString;
-	            pipeline = credentialOrPipelineOrContainerName;
-	        }
-	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)      url = urlOrConnectionString;
-	            url = urlOrConnectionString;
-	            options = blobNameOrOptions;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
-	        }
-	        else if (!credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName !== "string") {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            url = urlOrConnectionString;
-	            // The second parameter is undefined. Use anonymous credential.
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        else if (credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName === "string" &&
-	            blobNameOrOptions &&
-	            typeof blobNameOrOptions === "string") {
-	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
-	            const containerName = credentialOrPipelineOrContainerName;
-	            const blobName = blobNameOrOptions;
-	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
-	            if (extractedCreds.kind === "AccountConnString") {
-	                if (core_util_1.isNodeLike) {
-	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
-	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
-	                    if (!options.proxyOptions) {
-	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
-	                    }
-	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
-	                }
-	                else {
-	                    throw new Error("Account connection string is only supported in Node.js environment");
-	                }
-	            }
-	            else if (extractedCreds.kind === "SASConnString") {
-	                url =
-	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
-	                        "?" +
-	                        extractedCreds.accountSas;
-	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	            }
-	            else {
-	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
-	            }
-	        }
-	        else {
-	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
-	        }
-	        super(url, pipeline);
-	        this.appendBlobContext = this.storageClientContext.appendBlob;
-	    }
-	    /**
-	     * Creates a new AppendBlobClient object identical to the source but with the
-	     * specified snapshot timestamp.
-	     * Provide "" will remove the snapshot and return a Client to the base blob.
-	     *
-	     * @param snapshot - The snapshot timestamp.
-	     * @returns A new AppendBlobClient object identical to the source but with the specified snapshot timestamp.
-	     */
-	    withSnapshot(snapshot) {
-	        return new AppendBlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
-	    }
-	    /**
-	     * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
-	     *
-	     * @param options - Options to the Append Block Create operation.
-	     *
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:ClientsCreateAppendBlob
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     *
-	     * const appendBlobClient = containerClient.getAppendBlobClient(blobName);
-	     * await appendBlobClient.create();
-	     * ```
-	     */
-	    async create(options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-create", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.create(0, {
-	                abortSignal: options.abortSignal,
-	                blobHttpHeaders: options.blobHTTPHeaders,
-	                leaseAccessConditions: options.conditions,
-	                metadata: options.metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
-	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
-	                legalHold: options.legalHold,
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.
-	     * If the blob with the same name already exists, the content of the existing blob will remain unchanged.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
-	     *
-	     * @param options -
-	     */
-	    async createIfNotExists(options = {}) {
-	        const conditions = { ifNoneMatch: constants_js_1.ETagAny };
-	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-createIfNotExists", options, async (updatedOptions) => {
-	            try {
-	                const res = (0, utils_common_js_1.assertResponse)(await this.create({
-	                    ...updatedOptions,
-	                    conditions,
-	                }));
-	                return {
-	                    succeeded: true,
-	                    ...res,
-	                    _response: res._response, // _response is made non-enumerable
-	                };
-	            }
-	            catch (e) {
-	                if (e.details?.errorCode === "BlobAlreadyExists") {
-	                    return {
-	                        succeeded: false,
-	                        ...e.response?.parsedHeaders,
-	                        _response: e.response,
-	                    };
-	                }
-	                throw e;
-	            }
-	        });
-	    }
-	    /**
-	     * Seals the append blob, making it read only.
-	     *
-	     * @param options -
-	     */
-	    async seal(options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-seal", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.seal({
-	                abortSignal: options.abortSignal,
-	                appendPositionAccessConditions: options.conditions,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Commits a new block of data to the end of the existing append blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/append-block
-	     *
-	     * @param body - Data to be appended.
-	     * @param contentLength - Length of the body in bytes.
-	     * @param options - Options to the Append Block operation.
-	     *
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:ClientsAppendBlock
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     *
-	     * const content = "Hello World!";
-	     *
-	     * // Create a new append blob and append data to the blob.
-	     * const newAppendBlobClient = containerClient.getAppendBlobClient(blobName);
-	     * await newAppendBlobClient.create();
-	     * await newAppendBlobClient.appendBlock(content, content.length);
-	     *
-	     * // Append data to an existing append blob.
-	     * const existingAppendBlobClient = containerClient.getAppendBlobClient(blobName);
-	     * await existingAppendBlobClient.appendBlock(content, content.length);
-	     * ```
-	     */
-	    async appendBlock(body, contentLength, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-appendBlock", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.appendBlock(contentLength, body, {
-	                abortSignal: options.abortSignal,
-	                appendPositionAccessConditions: options.conditions,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                requestOptions: {
-	                    onUploadProgress: options.onProgress,
-	                },
-	                transactionalContentMD5: options.transactionalContentMD5,
-	                transactionalContentCrc64: options.transactionalContentCrc64,
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The Append Block operation commits a new block of data to the end of an existing append blob
-	     * where the contents are read from a source url.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/append-block-from-url
-	     *
-	     * @param sourceURL -
-	     *                 The url to the blob that will be the source of the copy. A source blob in the same storage account can
-	     *                 be authenticated via Shared Key. However, if the source is a blob in another account, the source blob
-	     *                 must either be public or must be authenticated via a shared access signature. If the source blob is
-	     *                 public, no authentication is required to perform the operation.
-	     * @param sourceOffset - Offset in source to be appended
-	     * @param count - Number of bytes to be appended as a block
-	     * @param options -
-	     */
-	    async appendBlockFromURL(sourceURL, sourceOffset, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        options.sourceConditions = options.sourceConditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-appendBlockFromURL", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.appendBlockFromUrl(sourceURL, 0, {
-	                abortSignal: options.abortSignal,
-	                sourceRange: (0, Range_js_1.rangeToString)({ offset: sourceOffset, count }),
-	                sourceContentMD5: options.sourceContentMD5,
-	                sourceContentCrc64: options.sourceContentCrc64,
-	                leaseAccessConditions: options.conditions,
-	                appendPositionAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                sourceModifiedAccessConditions: {
-	                    sourceIfMatch: options.sourceConditions?.ifMatch,
-	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
-	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
-	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
-	                },
-	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                fileRequestIntent: options.sourceShareTokenIntent,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	}
-	Clients.AppendBlobClient = AppendBlobClient;
-	/**
-	 * BlockBlobClient defines a set of operations applicable to block blobs.
-	 */
-	class BlockBlobClient extends BlobClient {
-	    /**
-	     * blobContext provided by protocol layer.
-	     *
-	     * Note. Ideally BlobClient should set BlobClient.blobContext to protected. However, API
-	     * extractor has issue blocking that. Here we redecelare _blobContext in BlockBlobClient.
-	     */
-	    _blobContext;
-	    /**
-	     * blockBlobContext provided by protocol layer.
-	     */
-	    blockBlobContext;
-	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
-	        //   super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
-	        let pipeline;
-	        let url;
-	        options = options || {};
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, pipeline: Pipeline)
-	            url = urlOrConnectionString;
-	            pipeline = credentialOrPipelineOrContainerName;
-	        }
-	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            url = urlOrConnectionString;
-	            options = blobNameOrOptions;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
-	        }
-	        else if (!credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName !== "string") {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            // The second parameter is undefined. Use anonymous credential.
-	            url = urlOrConnectionString;
-	            if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {
-	                options = blobNameOrOptions;
-	            }
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        else if (credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName === "string" &&
-	            blobNameOrOptions &&
-	            typeof blobNameOrOptions === "string") {
-	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
-	            const containerName = credentialOrPipelineOrContainerName;
-	            const blobName = blobNameOrOptions;
-	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
-	            if (extractedCreds.kind === "AccountConnString") {
-	                if (core_util_1.isNodeLike) {
-	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
-	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
-	                    if (!options.proxyOptions) {
-	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
-	                    }
-	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
-	                }
-	                else {
-	                    throw new Error("Account connection string is only supported in Node.js environment");
-	                }
-	            }
-	            else if (extractedCreds.kind === "SASConnString") {
-	                url =
-	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
-	                        "?" +
-	                        extractedCreds.accountSas;
-	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	            }
-	            else {
-	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
-	            }
-	        }
-	        else {
-	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
-	        }
-	        super(url, pipeline);
-	        this.blockBlobContext = this.storageClientContext.blockBlob;
-	        this._blobContext = this.storageClientContext.blob;
-	    }
-	    /**
-	     * Creates a new BlockBlobClient object identical to the source but with the
-	     * specified snapshot timestamp.
-	     * Provide "" will remove the snapshot and return a URL to the base blob.
-	     *
-	     * @param snapshot - The snapshot timestamp.
-	     * @returns A new BlockBlobClient object identical to the source but with the specified snapshot timestamp.
-	     */
-	    withSnapshot(snapshot) {
-	        return new BlockBlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
-	    }
-	    /**
-	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	     *
-	     * Quick query for a JSON or CSV formatted blob.
-	     *
-	     * Example usage (Node.js):
-	     *
-	     * ```ts snippet:ClientsQuery
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blockBlobClient = containerClient.getBlockBlobClient(blobName);
-	     *
-	     * // Query and convert a blob to a string
-	     * const queryBlockBlobResponse = await blockBlobClient.query("select from BlobStorage");
-	     * if (queryBlockBlobResponse.readableStreamBody) {
-	     *   const downloadedBuffer = await streamToBuffer(queryBlockBlobResponse.readableStreamBody);
-	     *   const downloaded = downloadedBuffer.toString();
-	     *   console.log(`Query blob content: ${downloaded}`);
-	     * }
-	     *
-	     * async function streamToBuffer(readableStream: NodeJS.ReadableStream): Promise {
-	     *   return new Promise((resolve, reject) => {
-	     *     const chunks: Buffer[] = [];
-	     *     readableStream.on("data", (data) => {
-	     *       chunks.push(data instanceof Buffer ? data : Buffer.from(data));
-	     *     });
-	     *     readableStream.on("end", () => {
-	     *       resolve(Buffer.concat(chunks));
-	     *     });
-	     *     readableStream.on("error", reject);
-	     *   });
-	     * }
-	     * ```
-	     *
-	     * @param query -
-	     * @param options -
-	     */
-	    async query(query, options = {}) {
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        if (!core_util_1.isNodeLike) {
-	            throw new Error("This operation currently is only supported in Node.js.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-query", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this._blobContext.query({
-	                abortSignal: options.abortSignal,
-	                queryRequest: {
-	                    queryType: "SQL",
-	                    expression: query,
-	                    inputSerialization: (0, utils_common_js_1.toQuerySerialization)(options.inputTextConfiguration),
-	                    outputSerialization: (0, utils_common_js_1.toQuerySerialization)(options.outputTextConfiguration),
-	                },
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            return new BlobQueryResponse_js_1.BlobQueryResponse(response, {
-	                abortSignal: options.abortSignal,
-	                onProgress: options.onProgress,
-	                onError: options.onError,
-	            });
-	        });
-	    }
-	    /**
-	     * Creates a new block blob, or updates the content of an existing block blob.
-	     * Updating an existing block blob overwrites any existing metadata on the blob.
-	     * Partial updates are not supported; the content of the existing blob is
-	     * overwritten with the new content. To perform a partial update of a block blob's,
-	     * use {@link stageBlock} and {@link commitBlockList}.
-	     *
-	     * This is a non-parallel uploading method, please use {@link uploadFile},
-	     * {@link uploadStream} or {@link uploadBrowserData} for better performance
-	     * with concurrency uploading.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
-	     *
-	     * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function
-	     *                               which returns a new Readable stream whose offset is from data source beginning.
-	     * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a
-	     *                               string including non non-Base64/Hex-encoded characters.
-	     * @param options - Options to the Block Blob Upload operation.
-	     * @returns Response data for the Block Blob Upload operation.
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:ClientsUpload
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blockBlobClient = containerClient.getBlockBlobClient(blobName);
-	     *
-	     * const content = "Hello world!";
-	     * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);
-	     * ```
-	     */
-	    async upload(body, contentLength, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-upload", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.upload(contentLength, body, {
-	                abortSignal: options.abortSignal,
-	                blobHttpHeaders: options.blobHTTPHeaders,
-	                leaseAccessConditions: options.conditions,
-	                metadata: options.metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                requestOptions: {
-	                    onUploadProgress: options.onProgress,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
-	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
-	                legalHold: options.legalHold,
-	                tier: (0, models_js_1.toAccessTier)(options.tier),
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Creates a new Block Blob where the contents of the blob are read from a given URL.
-	     * This API is supported beginning with the 2020-04-08 version. Partial updates
-	     * are not supported with Put Blob from URL; the content of an existing blob is overwritten with
-	     * the content of the new blob.  To perform partial updates to a block blob’s contents using a
-	     * source URL, use {@link stageBlockFromURL} and {@link commitBlockList}.
-	     *
-	     * @param sourceURL - Specifies the URL of the blob. The value
-	     *                           may be a URL of up to 2 KB in length that specifies a blob.
-	     *                           The value should be URL-encoded as it would appear
-	     *                           in a request URI. The source blob must either be public
-	     *                           or must be authenticated via a shared access signature.
-	     *                           If the source blob is public, no authentication is required
-	     *                           to perform the operation. Here are some examples of source object URLs:
-	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob
-	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=
-	     * @param options - Optional parameters.
-	     */
-	    async syncUploadFromURL(sourceURL, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-syncUploadFromURL", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.putBlobFromUrl(0, sourceURL, {
-	                ...options,
-	                blobHttpHeaders: options.blobHTTPHeaders,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                sourceModifiedAccessConditions: {
-	                    sourceIfMatch: options.sourceConditions?.ifMatch,
-	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
-	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
-	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
-	                    sourceIfTags: options.sourceConditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
-	                tier: (0, models_js_1.toAccessTier)(options.tier),
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                copySourceTags: options.copySourceTags,
-	                fileRequestIntent: options.sourceShareTokenIntent,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Uploads the specified block to the block blob's "staging area" to be later
-	     * committed by a call to commitBlockList.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-block
-	     *
-	     * @param blockId - A 64-byte value that is base64-encoded
-	     * @param body - Data to upload to the staging area.
-	     * @param contentLength - Number of bytes to upload.
-	     * @param options - Options to the Block Blob Stage Block operation.
-	     * @returns Response data for the Block Blob Stage Block operation.
-	     */
-	    async stageBlock(blockId, body, contentLength, options = {}) {
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-stageBlock", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.stageBlock(blockId, contentLength, body, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                requestOptions: {
-	                    onUploadProgress: options.onProgress,
-	                },
-	                transactionalContentMD5: options.transactionalContentMD5,
-	                transactionalContentCrc64: options.transactionalContentCrc64,
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The Stage Block From URL operation creates a new block to be committed as part
-	     * of a blob where the contents are read from a URL.
-	     * This API is available starting in version 2018-03-28.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-block-from-url
-	     *
-	     * @param blockId - A 64-byte value that is base64-encoded
-	     * @param sourceURL - Specifies the URL of the blob. The value
-	     *                           may be a URL of up to 2 KB in length that specifies a blob.
-	     *                           The value should be URL-encoded as it would appear
-	     *                           in a request URI. The source blob must either be public
-	     *                           or must be authenticated via a shared access signature.
-	     *                           If the source blob is public, no authentication is required
-	     *                           to perform the operation. Here are some examples of source object URLs:
-	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob
-	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=
-	     * @param offset - From which position of the blob to download, greater than or equal to 0
-	     * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined
-	     * @param options - Options to the Block Blob Stage Block From URL operation.
-	     * @returns Response data for the Block Blob Stage Block From URL operation.
-	     */
-	    async stageBlockFromURL(blockId, sourceURL, offset = 0, count, options = {}) {
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-stageBlockFromURL", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.stageBlockFromURL(blockId, 0, sourceURL, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                sourceContentMD5: options.sourceContentMD5,
-	                sourceContentCrc64: options.sourceContentCrc64,
-	                sourceRange: offset === 0 && !count ? undefined : (0, Range_js_1.rangeToString)({ offset, count }),
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
-	                fileRequestIntent: options.sourceShareTokenIntent,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Writes a blob by specifying the list of block IDs that make up the blob.
-	     * In order to be written as part of a blob, a block must have been successfully written
-	     * to the server in a prior {@link stageBlock} operation. You can call {@link commitBlockList} to
-	     * update a blob by uploading only those blocks that have changed, then committing the new and existing
-	     * blocks together. Any blocks not specified in the block list and permanently deleted.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-block-list
-	     *
-	     * @param blocks -  Array of 64-byte value that is base64-encoded
-	     * @param options - Options to the Block Blob Commit Block List operation.
-	     * @returns Response data for the Block Blob Commit Block List operation.
-	     */
-	    async commitBlockList(blocks, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-commitBlockList", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.commitBlockList({ latest: blocks }, {
-	                abortSignal: options.abortSignal,
-	                blobHttpHeaders: options.blobHTTPHeaders,
-	                leaseAccessConditions: options.conditions,
-	                metadata: options.metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
-	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
-	                legalHold: options.legalHold,
-	                tier: (0, models_js_1.toAccessTier)(options.tier),
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Returns the list of blocks that have been uploaded as part of a block blob
-	     * using the specified block list filter.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-block-list
-	     *
-	     * @param listType - Specifies whether to return the list of committed blocks,
-	     *                                        the list of uncommitted blocks, or both lists together.
-	     * @param options - Options to the Block Blob Get Block List operation.
-	     * @returns Response data for the Block Blob Get Block List operation.
-	     */
-	    async getBlockList(listType, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-getBlockList", options, async (updatedOptions) => {
-	            const res = (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.getBlockList(listType, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            if (!res.committedBlocks) {
-	                res.committedBlocks = [];
-	            }
-	            if (!res.uncommittedBlocks) {
-	                res.uncommittedBlocks = [];
-	            }
-	            return res;
-	        });
-	    }
-	    // High level functions
-	    /**
-	     * Uploads a Buffer(Node.js)/Blob(browsers)/ArrayBuffer/ArrayBufferView object to a BlockBlob.
-	     *
-	     * When data length is no more than the specifiled {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is
-	     * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.
-	     * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}
-	     * to commit the block list.
-	     *
-	     * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is
-	     * `blobContentType`, enabling the browser to provide
-	     * functionality based on file type.
-	     *
-	     * @param data - Buffer(Node.js), Blob, ArrayBuffer or ArrayBufferView
-	     * @param options -
-	     */
-	    async uploadData(data, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadData", options, async (updatedOptions) => {
-	            if (core_util_1.isNodeLike) {
-	                let buffer;
-	                if (data instanceof Buffer) {
-	                    buffer = data;
-	                }
-	                else if (data instanceof ArrayBuffer) {
-	                    buffer = Buffer.from(data);
-	                }
-	                else {
-	                    data = data;
-	                    buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
-	                }
-	                return this.uploadSeekableInternal((offset, size) => buffer.slice(offset, offset + size), buffer.byteLength, updatedOptions);
-	            }
-	            else {
-	                const browserBlob = new Blob([data]);
-	                return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);
-	            }
-	        });
-	    }
-	    /**
-	     * ONLY AVAILABLE IN BROWSERS.
-	     *
-	     * Uploads a browser Blob/File/ArrayBuffer/ArrayBufferView object to block blob.
-	     *
-	     * When buffer length lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.
-	     * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call
-	     * {@link commitBlockList} to commit the block list.
-	     *
-	     * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is
-	     * `blobContentType`, enabling the browser to provide
-	     * functionality based on file type.
-	     *
-	     * @deprecated Use {@link uploadData} instead.
-	     *
-	     * @param browserData - Blob, File, ArrayBuffer or ArrayBufferView
-	     * @param options - Options to upload browser data.
-	     * @returns Response data for the Blob Upload operation.
-	     */
-	    async uploadBrowserData(browserData, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadBrowserData", options, async (updatedOptions) => {
-	            const browserBlob = new Blob([browserData]);
-	            return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);
-	        });
-	    }
-	    /**
-	     *
-	     * Uploads data to block blob. Requires a bodyFactory as the data source,
-	     * which need to return a {@link HttpRequestBody} object with the offset and size provided.
-	     *
-	     * When data length is no more than the specified {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is
-	     * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.
-	     * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}
-	     * to commit the block list.
-	     *
-	     * @param bodyFactory -
-	     * @param size - size of the data to upload.
-	     * @param options - Options to Upload to Block Blob operation.
-	     * @returns Response data for the Blob Upload operation.
-	     */
-	    async uploadSeekableInternal(bodyFactory, size, options = {}) {
-	        let blockSize = options.blockSize ?? 0;
-	        if (blockSize < 0 || blockSize > constants_js_1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES) {
-	            throw new RangeError(`blockSize option must be >= 0 and <= ${constants_js_1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES}`);
-	        }
-	        const maxSingleShotSize = options.maxSingleShotSize ?? constants_js_1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES;
-	        if (maxSingleShotSize < 0 || maxSingleShotSize > constants_js_1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES) {
-	            throw new RangeError(`maxSingleShotSize option must be >= 0 and <= ${constants_js_1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}`);
-	        }
-	        if (blockSize === 0) {
-	            if (size > constants_js_1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES * constants_js_1.BLOCK_BLOB_MAX_BLOCKS) {
-	                throw new RangeError(`${size} is too larger to upload to a block blob.`);
-	            }
-	            if (size > maxSingleShotSize) {
-	                blockSize = Math.ceil(size / constants_js_1.BLOCK_BLOB_MAX_BLOCKS);
-	                if (blockSize < constants_js_1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES) {
-	                    blockSize = constants_js_1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;
-	                }
-	            }
-	        }
-	        if (!options.blobHTTPHeaders) {
-	            options.blobHTTPHeaders = {};
-	        }
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadSeekableInternal", options, async (updatedOptions) => {
-	            if (size <= maxSingleShotSize) {
-	                return (0, utils_common_js_1.assertResponse)(await this.upload(bodyFactory(0, size), size, updatedOptions));
-	            }
-	            const numBlocks = Math.floor((size - 1) / blockSize) + 1;
-	            if (numBlocks > constants_js_1.BLOCK_BLOB_MAX_BLOCKS) {
-	                throw new RangeError(`The buffer's size is too big or the BlockSize is too small;` +
-	                    `the number of blocks must be <= ${constants_js_1.BLOCK_BLOB_MAX_BLOCKS}`);
-	            }
-	            const blockList = [];
-	            const blockIDPrefix = (0, core_util_2.randomUUID)();
-	            let transferProgress = 0;
-	            const batch = new Batch_js_1.Batch(options.concurrency);
-	            for (let i = 0; i < numBlocks; i++) {
-	                batch.addOperation(async () => {
-	                    const blockID = (0, utils_common_js_1.generateBlockID)(blockIDPrefix, i);
-	                    const start = blockSize * i;
-	                    const end = i === numBlocks - 1 ? size : start + blockSize;
-	                    const contentLength = end - start;
-	                    blockList.push(blockID);
-	                    await this.stageBlock(blockID, bodyFactory(start, contentLength), contentLength, {
-	                        abortSignal: options.abortSignal,
-	                        conditions: options.conditions,
-	                        encryptionScope: options.encryptionScope,
-	                        tracingOptions: updatedOptions.tracingOptions,
-	                    });
-	                    // Update progress after block is successfully uploaded to server, in case of block trying
-	                    // TODO: Hook with convenience layer progress event in finer level
-	                    transferProgress += contentLength;
-	                    if (options.onProgress) {
-	                        options.onProgress({
-	                            loadedBytes: transferProgress,
-	                        });
-	                    }
-	                });
-	            }
-	            await batch.do();
-	            return this.commitBlockList(blockList, updatedOptions);
-	        });
-	    }
-	    /**
-	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	     *
-	     * Uploads a local file in blocks to a block blob.
-	     *
-	     * When file size lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.
-	     * Otherwise, this method will call stageBlock to upload blocks, and finally call commitBlockList
-	     * to commit the block list.
-	     *
-	     * @param filePath - Full path of local file
-	     * @param options - Options to Upload to Block Blob operation.
-	     * @returns Response data for the Blob Upload operation.
-	     */
-	    async uploadFile(filePath, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadFile", options, async (updatedOptions) => {
-	            const size = (await (0, utils_js_1.fsStat)(filePath)).size;
-	            return this.uploadSeekableInternal((offset, count) => {
-	                return () => (0, utils_js_1.fsCreateReadStream)(filePath, {
-	                    autoClose: true,
-	                    end: count ? offset + count - 1 : Infinity,
-	                    start: offset,
-	                });
-	            }, size, {
-	                ...options,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            });
-	        });
-	    }
-	    /**
-	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	     *
-	     * Uploads a Node.js Readable stream into block blob.
-	     *
-	     * PERFORMANCE IMPROVEMENT TIPS:
-	     * * Input stream highWaterMark is better to set a same value with bufferSize
-	     *    parameter, which will avoid Buffer.concat() operations.
-	     *
-	     * @param stream - Node.js Readable stream
-	     * @param bufferSize - Size of every buffer allocated, also the block size in the uploaded block blob. Default value is 8MB
-	     * @param maxConcurrency -  Max concurrency indicates the max number of buffers that can be allocated,
-	     *                                 positive correlation with max uploading concurrency. Default value is 5
-	     * @param options - Options to Upload Stream to Block Blob operation.
-	     * @returns Response data for the Blob Upload operation.
-	     */
-	    async uploadStream(stream, bufferSize = constants_js_1.DEFAULT_BLOCK_BUFFER_SIZE_BYTES, maxConcurrency = 5, options = {}) {
-	        if (!options.blobHTTPHeaders) {
-	            options.blobHTTPHeaders = {};
-	        }
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadStream", options, async (updatedOptions) => {
-	            let blockNum = 0;
-	            const blockIDPrefix = (0, core_util_2.randomUUID)();
-	            let transferProgress = 0;
-	            const blockList = [];
-	            const scheduler = new storage_common_1.BufferScheduler(stream, bufferSize, maxConcurrency, async (body, length) => {
-	                const blockID = (0, utils_common_js_1.generateBlockID)(blockIDPrefix, blockNum);
-	                blockList.push(blockID);
-	                blockNum++;
-	                await this.stageBlock(blockID, body, length, {
-	                    customerProvidedKey: options.customerProvidedKey,
-	                    conditions: options.conditions,
-	                    encryptionScope: options.encryptionScope,
-	                    tracingOptions: updatedOptions.tracingOptions,
-	                });
-	                // Update progress after block is successfully uploaded to server, in case of block trying
-	                transferProgress += length;
-	                if (options.onProgress) {
-	                    options.onProgress({ loadedBytes: transferProgress });
-	                }
-	            }, 
-	            // concurrency should set a smaller value than maxConcurrency, which is helpful to
-	            // reduce the possibility when a outgoing handler waits for stream data, in
-	            // this situation, outgoing handlers are blocked.
-	            // Outgoing queue shouldn't be empty.
-	            Math.ceil((maxConcurrency / 4) * 3));
-	            await scheduler.do();
-	            return (0, utils_common_js_1.assertResponse)(await this.commitBlockList(blockList, {
-	                ...options,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	}
-	Clients.BlockBlobClient = BlockBlobClient;
-	/**
-	 * PageBlobClient defines a set of operations applicable to page blobs.
-	 */
-	class PageBlobClient extends BlobClient {
-	    /**
-	     * pageBlobsContext provided by protocol layer.
-	     */
-	    pageBlobContext;
-	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
-	        //   super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
-	        let pipeline;
-	        let url;
-	        options = options || {};
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, pipeline: Pipeline)
-	            url = urlOrConnectionString;
-	            pipeline = credentialOrPipelineOrContainerName;
-	        }
-	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            url = urlOrConnectionString;
-	            options = blobNameOrOptions;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
-	        }
-	        else if (!credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName !== "string") {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            // The second parameter is undefined. Use anonymous credential.
-	            url = urlOrConnectionString;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        else if (credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName === "string" &&
-	            blobNameOrOptions &&
-	            typeof blobNameOrOptions === "string") {
-	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
-	            const containerName = credentialOrPipelineOrContainerName;
-	            const blobName = blobNameOrOptions;
-	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
-	            if (extractedCreds.kind === "AccountConnString") {
-	                if (core_util_1.isNodeLike) {
-	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
-	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
-	                    if (!options.proxyOptions) {
-	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
-	                    }
-	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
-	                }
-	                else {
-	                    throw new Error("Account connection string is only supported in Node.js environment");
-	                }
-	            }
-	            else if (extractedCreds.kind === "SASConnString") {
-	                url =
-	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
-	                        "?" +
-	                        extractedCreds.accountSas;
-	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	            }
-	            else {
-	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
-	            }
-	        }
-	        else {
-	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
-	        }
-	        super(url, pipeline);
-	        this.pageBlobContext = this.storageClientContext.pageBlob;
-	    }
-	    /**
-	     * Creates a new PageBlobClient object identical to the source but with the
-	     * specified snapshot timestamp.
-	     * Provide "" will remove the snapshot and return a Client to the base blob.
-	     *
-	     * @param snapshot - The snapshot timestamp.
-	     * @returns A new PageBlobClient object identical to the source but with the specified snapshot timestamp.
-	     */
-	    withSnapshot(snapshot) {
-	        return new PageBlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
-	    }
-	    /**
-	     * Creates a page blob of the specified length. Call uploadPages to upload data
-	     * data to a page blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
-	     *
-	     * @param size - size of the page blob.
-	     * @param options - Options to the Page Blob Create operation.
-	     * @returns Response data for the Page Blob Create operation.
-	     */
-	    async create(size, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-create", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.create(0, size, {
-	                abortSignal: options.abortSignal,
-	                blobHttpHeaders: options.blobHTTPHeaders,
-	                blobSequenceNumber: options.blobSequenceNumber,
-	                leaseAccessConditions: options.conditions,
-	                metadata: options.metadata,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
-	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
-	                legalHold: options.legalHold,
-	                tier: (0, models_js_1.toAccessTier)(options.tier),
-	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Creates a page blob of the specified length. Call uploadPages to upload data
-	     * data to a page blob. If the blob with the same name already exists, the content
-	     * of the existing blob will remain unchanged.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
-	     *
-	     * @param size - size of the page blob.
-	     * @param options -
-	     */
-	    async createIfNotExists(size, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-createIfNotExists", options, async (updatedOptions) => {
-	            try {
-	                const conditions = { ifNoneMatch: constants_js_1.ETagAny };
-	                const res = (0, utils_common_js_1.assertResponse)(await this.create(size, {
-	                    ...options,
-	                    conditions,
-	                    tracingOptions: updatedOptions.tracingOptions,
-	                }));
-	                return {
-	                    succeeded: true,
-	                    ...res,
-	                    _response: res._response, // _response is made non-enumerable
-	                };
-	            }
-	            catch (e) {
-	                if (e.details?.errorCode === "BlobAlreadyExists") {
-	                    return {
-	                        succeeded: false,
-	                        ...e.response?.parsedHeaders,
-	                        _response: e.response,
-	                    };
-	                }
-	                throw e;
-	            }
-	        });
-	    }
-	    /**
-	     * Writes 1 or more pages to the page blob. The start and end offsets must be a multiple of 512.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-page
-	     *
-	     * @param body - Data to upload
-	     * @param offset - Offset of destination page blob
-	     * @param count - Content length of the body, also number of bytes to be uploaded
-	     * @param options - Options to the Page Blob Upload Pages operation.
-	     * @returns Response data for the Page Blob Upload Pages operation.
-	     */
-	    async uploadPages(body, offset, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-uploadPages", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.uploadPages(count, body, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                requestOptions: {
-	                    onUploadProgress: options.onProgress,
-	                },
-	                range: (0, Range_js_1.rangeToString)({ offset, count }),
-	                sequenceNumberAccessConditions: options.conditions,
-	                transactionalContentMD5: options.transactionalContentMD5,
-	                transactionalContentCrc64: options.transactionalContentCrc64,
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The Upload Pages operation writes a range of pages to a page blob where the
-	     * contents are read from a URL.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-page-from-url
-	     *
-	     * @param sourceURL - Specify a URL to the copy source, Shared Access Signature(SAS) maybe needed for authentication
-	     * @param sourceOffset - The source offset to copy from. Pass 0 to copy from the beginning of source page blob
-	     * @param destOffset - Offset of destination page blob
-	     * @param count - Number of bytes to be uploaded from source page blob
-	     * @param options -
-	     */
-	    async uploadPagesFromURL(sourceURL, sourceOffset, destOffset, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        options.sourceConditions = options.sourceConditions || {};
-	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-uploadPagesFromURL", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.uploadPagesFromURL(sourceURL, (0, Range_js_1.rangeToString)({ offset: sourceOffset, count }), 0, (0, Range_js_1.rangeToString)({ offset: destOffset, count }), {
-	                abortSignal: options.abortSignal,
-	                sourceContentMD5: options.sourceContentMD5,
-	                sourceContentCrc64: options.sourceContentCrc64,
-	                leaseAccessConditions: options.conditions,
-	                sequenceNumberAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                sourceModifiedAccessConditions: {
-	                    sourceIfMatch: options.sourceConditions?.ifMatch,
-	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
-	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
-	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
-	                },
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
-	                fileRequestIntent: options.sourceShareTokenIntent,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Frees the specified pages from the page blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-page
-	     *
-	     * @param offset - Starting byte position of the pages to clear.
-	     * @param count - Number of bytes to clear.
-	     * @param options - Options to the Page Blob Clear Pages operation.
-	     * @returns Response data for the Page Blob Clear Pages operation.
-	     */
-	    async clearPages(offset = 0, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-clearPages", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.clearPages(0, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                range: (0, Range_js_1.rangeToString)({ offset, count }),
-	                sequenceNumberAccessConditions: options.conditions,
-	                cpkInfo: options.customerProvidedKey,
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Returns the list of valid page ranges for a page blob or snapshot of a page blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param options - Options to the Page Blob Get Ranges operation.
-	     * @returns Response data for the Page Blob Get Ranges operation.
-	     */
-	    async getPageRanges(offset = 0, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRanges", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRanges({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                range: (0, Range_js_1.rangeToString)({ offset, count }),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            return (0, PageBlobRangeResponse_js_1.rangeResponseFromModel)(response);
-	        });
-	    }
-	    /**
-	     * getPageRangesSegment returns a single segment of page ranges starting from the
-	     * specified Marker. Use an empty Marker to start enumeration from the beginning.
-	     * After getting a segment, process it, and then call getPageRangesSegment again
-	     * (passing the the previously-returned Marker) to get the next segment.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
-	     * @param options - Options to PageBlob Get Page Ranges Segment operation.
-	     */
-	    async listPageRangesSegment(offset = 0, count, marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRangesSegment", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRanges({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                range: (0, Range_js_1.rangeToString)({ offset, count }),
-	                marker: marker,
-	                maxPageSize: options.maxPageSize,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesResponseModel}
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param marker - A string value that identifies the portion of
-	     *                          the get of page ranges to be returned with the next getting operation. The
-	     *                          operation returns the ContinuationToken value within the response body if the
-	     *                          getting operation did not return all page ranges remaining within the current page.
-	     *                          The ContinuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of get
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to List Page Ranges operation.
-	     */
-	    async *listPageRangeItemSegments(offset = 0, count, marker, options = {}) {
-	        let getPageRangeItemSegmentsResponse;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                getPageRangeItemSegmentsResponse = await this.listPageRangesSegment(offset, count, marker, options);
-	                marker = getPageRangeItemSegmentsResponse.continuationToken;
-	                yield await getPageRangeItemSegmentsResponse;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param options - Options to List Page Ranges operation.
-	     */
-	    async *listPageRangeItems(offset = 0, count, options = {}) {
-	        let marker;
-	        for await (const getPageRangesSegment of this.listPageRangeItemSegments(offset, count, marker, options)) {
-	            yield* (0, utils_common_js_1.ExtractPageRangeInfoItems)(getPageRangesSegment);
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to list of page ranges for a page blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     *  .byPage() returns an async iterable iterator to list of page ranges for a page blob.
-	     *
-	     * ```ts snippet:ClientsListPageBlobs
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const pageBlobClient = containerClient.getPageBlobClient(blobName);
-	     *
-	     * // Example using `for await` syntax
-	     * let i = 1;
-	     * for await (const pageRange of pageBlobClient.listPageRanges()) {
-	     *   console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     * }
-	     *
-	     * // Example using `iter.next()` syntax
-	     * i = 1;
-	     * const iter = pageBlobClient.listPageRanges();
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   console.log(`Page range ${i++}: ${value.start} - ${value.end}`);
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Example using `byPage()` syntax
-	     * i = 1;
-	     * for await (const page of pageBlobClient.listPageRanges().byPage({ maxPageSize: 20 })) {
-	     *   for (const pageRange of page.pageRange || []) {
-	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     *   }
-	     * }
-	     *
-	     * // Example using paging with a marker
-	     * i = 1;
-	     * let iterator = pageBlobClient.listPageRanges().byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     * // Prints 2 page ranges
-	     * if (response.pageRange) {
-	     *   for (const pageRange of response.pageRange) {
-	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     *   }
-	     * }
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = pageBlobClient.listPageRanges().byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     * // Prints 10 page ranges
-	     * if (response.pageRange) {
-	     *   for (const pageRange of response.pageRange) {
-	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param options - Options to the Page Blob Get Ranges operation.
-	     * @returns An asyncIterableIterator that supports paging.
-	     */
-	    listPageRanges(offset = 0, count, options = {}) {
-	        options.conditions = options.conditions || {};
-	        // AsyncIterableIterator to iterate over blobs
-	        const iter = this.listPageRangeItems(offset, count, options);
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.listPageRangeItemSegments(offset, count, settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...options,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * Gets the collection of page ranges that differ between a specified snapshot and this page blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     * @param offset - Starting byte position of the page blob
-	     * @param count - Number of bytes to get ranges diff.
-	     * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.
-	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
-	     * @returns Response data for the Page Blob Get Page Range Diff operation.
-	     */
-	    async getPageRangesDiff(offset, count, prevSnapshot, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRangesDiff", options, async (updatedOptions) => {
-	            const result = (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRangesDiff({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                prevsnapshot: prevSnapshot,
-	                range: (0, Range_js_1.rangeToString)({ offset, count }),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            return (0, PageBlobRangeResponse_js_1.rangeResponseFromModel)(result);
-	        });
-	    }
-	    /**
-	     * getPageRangesDiffSegment returns a single segment of page ranges starting from the
-	     * specified Marker for difference between previous snapshot and the target page blob.
-	     * Use an empty Marker to start enumeration from the beginning.
-	     * After getting a segment, process it, and then call getPageRangesDiffSegment again
-	     * (passing the the previously-returned Marker) to get the next segment.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
-	     * @param marker - A string value that identifies the portion of the get to be returned with the next get operation.
-	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
-	     */
-	    async listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRangesDiffSegment", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRangesDiff({
-	                abortSignal: options?.abortSignal,
-	                leaseAccessConditions: options?.conditions,
-	                modifiedAccessConditions: {
-	                    ...options?.conditions,
-	                    ifTags: options?.conditions?.tagConditions,
-	                },
-	                prevsnapshot: prevSnapshotOrUrl,
-	                range: (0, Range_js_1.rangeToString)({
-	                    offset: offset,
-	                    count: count,
-	                }),
-	                marker: marker,
-	                maxPageSize: options?.maxPageSize,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesDiffResponseModel}
-	     *
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
-	     * @param marker - A string value that identifies the portion of
-	     *                          the get of page ranges to be returned with the next getting operation. The
-	     *                          operation returns the ContinuationToken value within the response body if the
-	     *                          getting operation did not return all page ranges remaining within the current page.
-	     *                          The ContinuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of get
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
-	     */
-	    async *listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options) {
-	        let getPageRangeItemSegmentsResponse;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                getPageRangeItemSegmentsResponse = await this.listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options);
-	                marker = getPageRangeItemSegmentsResponse.continuationToken;
-	                yield await getPageRangeItemSegmentsResponse;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
-	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
-	     */
-	    async *listPageRangeDiffItems(offset, count, prevSnapshotOrUrl, options) {
-	        let marker;
-	        for await (const getPageRangesSegment of this.listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options)) {
-	            yield* (0, utils_common_js_1.ExtractPageRangeInfoItems)(getPageRangesSegment);
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     *  .byPage() returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.
-	     *
-	     * ```ts snippet:ClientsListPageBlobsDiff
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const pageBlobClient = containerClient.getPageBlobClient(blobName);
-	     *
-	     * const offset = 0;
-	     * const count = 1024;
-	     * const previousSnapshot = "";
-	     * // Example using `for await` syntax
-	     * let i = 1;
-	     * for await (const pageRange of pageBlobClient.listPageRangesDiff(offset, count, previousSnapshot)) {
-	     *   console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     * }
-	     *
-	     * // Example using `iter.next()` syntax
-	     * i = 1;
-	     * const iter = pageBlobClient.listPageRangesDiff(offset, count, previousSnapshot);
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   console.log(`Page range ${i++}: ${value.start} - ${value.end}`);
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Example using `byPage()` syntax
-	     * i = 1;
-	     * for await (const page of pageBlobClient
-	     *   .listPageRangesDiff(offset, count, previousSnapshot)
-	     *   .byPage({ maxPageSize: 20 })) {
-	     *   for (const pageRange of page.pageRange || []) {
-	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     *   }
-	     * }
-	     *
-	     * // Example using paging with a marker
-	     * i = 1;
-	     * let iterator = pageBlobClient
-	     *   .listPageRangesDiff(offset, count, previousSnapshot)
-	     *   .byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     * // Prints 2 page ranges
-	     * if (response.pageRange) {
-	     *   for (const pageRange of response.pageRange) {
-	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     *   }
-	     * }
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = pageBlobClient
-	     *   .listPageRangesDiff(offset, count, previousSnapshot)
-	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     * // Prints 10 page ranges
-	     * if (response.pageRange) {
-	     *   for (const pageRange of response.pageRange) {
-	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param offset - Starting byte position of the page ranges.
-	     * @param count - Number of bytes to get.
-	     * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.
-	     * @param options - Options to the Page Blob Get Ranges operation.
-	     * @returns An asyncIterableIterator that supports paging.
-	     */
-	    listPageRangesDiff(offset, count, prevSnapshot, options = {}) {
-	        options.conditions = options.conditions || {};
-	        // AsyncIterableIterator to iterate over blobs
-	        const iter = this.listPageRangeDiffItems(offset, count, prevSnapshot, {
-	            ...options,
-	        });
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.listPageRangeDiffItemSegments(offset, count, prevSnapshot, settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...options,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * Gets the collection of page ranges that differ between a specified snapshot and this page blob for managed disks.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
-	     *
-	     * @param offset - Starting byte position of the page blob
-	     * @param count - Number of bytes to get ranges diff.
-	     * @param prevSnapshotUrl - URL of snapshot to retrieve the difference.
-	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
-	     * @returns Response data for the Page Blob Get Page Range Diff operation.
-	     */
-	    async getPageRangesDiffForManagedDisks(offset, count, prevSnapshotUrl, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-GetPageRangesDiffForManagedDisks", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRangesDiff({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                prevSnapshotUrl,
-	                range: (0, Range_js_1.rangeToString)({ offset, count }),
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            return (0, PageBlobRangeResponse_js_1.rangeResponseFromModel)(response);
-	        });
-	    }
-	    /**
-	     * Resizes the page blob to the specified size (which must be a multiple of 512).
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
-	     *
-	     * @param size - Target size
-	     * @param options - Options to the Page Blob Resize operation.
-	     * @returns Response data for the Page Blob Resize operation.
-	     */
-	    async resize(size, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-resize", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.resize(size, {
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                encryptionScope: options.encryptionScope,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Sets a page blob's sequence number.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
-	     *
-	     * @param sequenceNumberAction - Indicates how the service should modify the blob's sequence number.
-	     * @param sequenceNumber - Required if sequenceNumberAction is max or update
-	     * @param options - Options to the Page Blob Update Sequence Number operation.
-	     * @returns Response data for the Page Blob Update Sequence Number operation.
-	     */
-	    async updateSequenceNumber(sequenceNumberAction, sequenceNumber, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-updateSequenceNumber", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.updateSequenceNumber(sequenceNumberAction, {
-	                abortSignal: options.abortSignal,
-	                blobSequenceNumber: sequenceNumber,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Begins an operation to start an incremental copy from one page blob's snapshot to this page blob.
-	     * The snapshot is copied such that only the differential changes between the previously
-	     * copied snapshot are transferred to the destination.
-	     * The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/incremental-copy-blob
-	     * @see https://learn.microsoft.com/azure/virtual-machines/windows/incremental-snapshots
-	     *
-	     * @param copySource - Specifies the name of the source page blob snapshot. For example,
-	     *                            https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=
-	     * @param options - Options to the Page Blob Copy Incremental operation.
-	     * @returns Response data for the Page Blob Copy Incremental operation.
-	     */
-	    async startCopyIncremental(copySource, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-startCopyIncremental", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.copyIncremental(copySource, {
-	                abortSignal: options.abortSignal,
-	                modifiedAccessConditions: {
-	                    ...options.conditions,
-	                    ifTags: options.conditions?.tagConditions,
-	                },
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	}
-	Clients.PageBlobClient = PageBlobClient;
-	
-	return Clients;
-}
-
-var BlobBatchClient = {};
-
-var BatchResponseParser = {};
-
-var BatchUtils = {};
-
-var hasRequiredBatchUtils;
-
-function requireBatchUtils () {
-	if (hasRequiredBatchUtils) return BatchUtils;
-	hasRequiredBatchUtils = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BatchUtils, "__esModule", { value: true });
-	BatchUtils.getBodyAsText = getBodyAsText;
-	BatchUtils.utf8ByteLength = utf8ByteLength;
-	const utils_js_1 = requireUtils$3();
-	const constants_js_1 = requireConstants$3();
-	async function getBodyAsText(batchResponse) {
-	    let buffer = Buffer.alloc(constants_js_1.BATCH_MAX_PAYLOAD_IN_BYTES);
-	    const responseLength = await (0, utils_js_1.streamToBuffer2)(batchResponse.readableStreamBody, buffer);
-	    // Slice the buffer to trim the empty ending.
-	    buffer = buffer.slice(0, responseLength);
-	    return buffer.toString();
-	}
-	function utf8ByteLength(str) {
-	    return Buffer.byteLength(str);
-	}
-	
-	return BatchUtils;
-}
-
-var hasRequiredBatchResponseParser;
-
-function requireBatchResponseParser () {
-	if (hasRequiredBatchResponseParser) return BatchResponseParser;
-	hasRequiredBatchResponseParser = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BatchResponseParser, "__esModule", { value: true });
-	BatchResponseParser.BatchResponseParser = void 0;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_http_compat_1 = /*@__PURE__*/ requireCommonjs$6();
-	const constants_js_1 = requireConstants$3();
-	const BatchUtils_js_1 = requireBatchUtils();
-	const log_js_1 = requireLog$1();
-	const HTTP_HEADER_DELIMITER = ": ";
-	const SPACE_DELIMITER = " ";
-	const NOT_FOUND = -1;
-	/**
-	 * Util class for parsing batch response.
-	 */
-	let BatchResponseParser$1 = class BatchResponseParser {
-	    batchResponse;
-	    responseBatchBoundary;
-	    perResponsePrefix;
-	    batchResponseEnding;
-	    subRequests;
-	    constructor(batchResponse, subRequests) {
-	        if (!batchResponse || !batchResponse.contentType) {
-	            // In special case(reported), server may return invalid content-type which could not be parsed.
-	            throw new RangeError("batchResponse is malformed or doesn't contain valid content-type.");
-	        }
-	        if (!subRequests || subRequests.size === 0) {
-	            // This should be prevent during coding.
-	            throw new RangeError("Invalid state: subRequests is not provided or size is 0.");
-	        }
-	        this.batchResponse = batchResponse;
-	        this.subRequests = subRequests;
-	        this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1];
-	        this.perResponsePrefix = `--${this.responseBatchBoundary}${constants_js_1.HTTP_LINE_ENDING}`;
-	        this.batchResponseEnding = `--${this.responseBatchBoundary}--`;
-	    }
-	    // For example of response, please refer to https://learn.microsoft.com/rest/api/storageservices/blob-batch#response
-	    async parseBatchResponse() {
-	        // When logic reach here, suppose batch request has already succeeded with 202, so we can further parse
-	        // sub request's response.
-	        if (this.batchResponse._response.status !== constants_js_1.HTTPURLConnection.HTTP_ACCEPTED) {
-	            throw new Error(`Invalid state: batch request failed with status: '${this.batchResponse._response.status}'.`);
-	        }
-	        const responseBodyAsText = await (0, BatchUtils_js_1.getBodyAsText)(this.batchResponse);
-	        const subResponses = responseBodyAsText
-	            .split(this.batchResponseEnding)[0] // string after ending is useless
-	            .split(this.perResponsePrefix)
-	            .slice(1); // string before first response boundary is useless
-	        const subResponseCount = subResponses.length;
-	        // Defensive coding in case of potential error parsing.
-	        // Note: subResponseCount == 1 is special case where sub request is invalid.
-	        // We try to prevent such cases through early validation, e.g. validate sub request count >= 1.
-	        // While in unexpected sub request invalid case, we allow sub response to be parsed and return to user.
-	        if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) {
-	            throw new Error("Invalid state: sub responses' count is not equal to sub requests' count.");
-	        }
-	        const deserializedSubResponses = new Array(subResponseCount);
-	        let subResponsesSucceededCount = 0;
-	        let subResponsesFailedCount = 0;
-	        // Parse sub subResponses.
-	        for (let index = 0; index < subResponseCount; index++) {
-	            const subResponse = subResponses[index];
-	            const deserializedSubResponse = {};
-	            deserializedSubResponse.headers = (0, core_http_compat_1.toHttpHeadersLike)((0, core_rest_pipeline_1.createHttpHeaders)());
-	            const responseLines = subResponse.split(`${constants_js_1.HTTP_LINE_ENDING}`);
-	            let subRespHeaderStartFound = false;
-	            let subRespHeaderEndFound = false;
-	            let subRespFailed = false;
-	            let contentId = NOT_FOUND;
-	            for (const responseLine of responseLines) {
-	                if (!subRespHeaderStartFound) {
-	                    // Convention line to indicate content ID
-	                    if (responseLine.startsWith(constants_js_1.HeaderConstants.CONTENT_ID)) {
-	                        contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]);
-	                    }
-	                    // Http version line with status code indicates the start of sub request's response.
-	                    // Example: HTTP/1.1 202 Accepted
-	                    if (responseLine.startsWith(constants_js_1.HTTP_VERSION_1_1)) {
-	                        subRespHeaderStartFound = true;
-	                        const tokens = responseLine.split(SPACE_DELIMITER);
-	                        deserializedSubResponse.status = parseInt(tokens[1]);
-	                        deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER);
-	                    }
-	                    continue; // Skip convention headers not specifically for sub request i.e. Content-Type: application/http and Content-ID: *
-	                }
-	                if (responseLine.trim() === "") {
-	                    // Sub response's header start line already found, and the first empty line indicates header end line found.
-	                    if (!subRespHeaderEndFound) {
-	                        subRespHeaderEndFound = true;
-	                    }
-	                    continue; // Skip empty line
-	                }
-	                // Note: when code reach here, it indicates subRespHeaderStartFound == true
-	                if (!subRespHeaderEndFound) {
-	                    if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) {
-	                        // Defensive coding to prevent from missing valuable lines.
-	                        throw new Error(`Invalid state: find non-empty line '${responseLine}' without HTTP header delimiter '${HTTP_HEADER_DELIMITER}'.`);
-	                    }
-	                    // Parse headers of sub response.
-	                    const tokens = responseLine.split(HTTP_HEADER_DELIMITER);
-	                    deserializedSubResponse.headers.set(tokens[0], tokens[1]);
-	                    if (tokens[0] === constants_js_1.HeaderConstants.X_MS_ERROR_CODE) {
-	                        deserializedSubResponse.errorCode = tokens[1];
-	                        subRespFailed = true;
-	                    }
-	                }
-	                else {
-	                    // Assemble body of sub response.
-	                    if (!deserializedSubResponse.bodyAsText) {
-	                        deserializedSubResponse.bodyAsText = "";
-	                    }
-	                    deserializedSubResponse.bodyAsText += responseLine;
-	                }
-	            } // Inner for end
-	            // The response will contain the Content-ID header for each corresponding subrequest response to use for tracking.
-	            // The Content-IDs are set to a valid index in the subrequests we sent. In the status code 202 path, we could expect it
-	            // to be 1-1 mapping from the [0, subRequests.size) to the Content-IDs returned. If not, we simply don't return that
-	            // unexpected subResponse in the parsed reponse and we can always look it up in the raw response for debugging purpose.
-	            if (contentId !== NOT_FOUND &&
-	                Number.isInteger(contentId) &&
-	                contentId >= 0 &&
-	                contentId < this.subRequests.size &&
-	                deserializedSubResponses[contentId] === undefined) {
-	                deserializedSubResponse._request = this.subRequests.get(contentId);
-	                deserializedSubResponses[contentId] = deserializedSubResponse;
-	            }
-	            else {
-	                log_js_1.logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`);
-	            }
-	            if (subRespFailed) {
-	                subResponsesFailedCount++;
-	            }
-	            else {
-	                subResponsesSucceededCount++;
-	            }
-	        }
-	        return {
-	            subResponses: deserializedSubResponses,
-	            subResponsesSucceededCount: subResponsesSucceededCount,
-	            subResponsesFailedCount: subResponsesFailedCount,
-	        };
-	    }
-	};
-	BatchResponseParser.BatchResponseParser = BatchResponseParser$1;
-	
-	return BatchResponseParser;
-}
-
-var BlobBatch = {};
-
-var Mutex = {};
-
-var hasRequiredMutex;
-
-function requireMutex () {
-	if (hasRequiredMutex) return Mutex;
-	hasRequiredMutex = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(Mutex, "__esModule", { value: true });
-	Mutex.Mutex = void 0;
-	var MutexLockStatus;
-	(function (MutexLockStatus) {
-	    MutexLockStatus[MutexLockStatus["LOCKED"] = 0] = "LOCKED";
-	    MutexLockStatus[MutexLockStatus["UNLOCKED"] = 1] = "UNLOCKED";
-	})(MutexLockStatus || (MutexLockStatus = {}));
-	/**
-	 * An async mutex lock.
-	 */
-	let Mutex$1 = class Mutex {
-	    /**
-	     * Lock for a specific key. If the lock has been acquired by another customer, then
-	     * will wait until getting the lock.
-	     *
-	     * @param key - lock key
-	     */
-	    static async lock(key) {
-	        return new Promise((resolve) => {
-	            if (this.keys[key] === undefined || this.keys[key] === MutexLockStatus.UNLOCKED) {
-	                this.keys[key] = MutexLockStatus.LOCKED;
-	                resolve();
-	            }
-	            else {
-	                this.onUnlockEvent(key, () => {
-	                    this.keys[key] = MutexLockStatus.LOCKED;
-	                    resolve();
-	                });
-	            }
-	        });
-	    }
-	    /**
-	     * Unlock a key.
-	     *
-	     * @param key -
-	     */
-	    static async unlock(key) {
-	        return new Promise((resolve) => {
-	            if (this.keys[key] === MutexLockStatus.LOCKED) {
-	                this.emitUnlockEvent(key);
-	            }
-	            delete this.keys[key];
-	            resolve();
-	        });
-	    }
-	    static keys = {};
-	    static listeners = {};
-	    static onUnlockEvent(key, handler) {
-	        if (this.listeners[key] === undefined) {
-	            this.listeners[key] = [handler];
-	        }
-	        else {
-	            this.listeners[key].push(handler);
-	        }
-	    }
-	    static emitUnlockEvent(key) {
-	        if (this.listeners[key] !== undefined && this.listeners[key].length > 0) {
-	            const handler = this.listeners[key].shift();
-	            setImmediate(() => {
-	                handler.call(this);
-	            });
-	        }
-	    }
-	};
-	Mutex.Mutex = Mutex$1;
-	
-	return Mutex;
-}
-
-var hasRequiredBlobBatch;
-
-function requireBlobBatch () {
-	if (hasRequiredBlobBatch) return BlobBatch;
-	hasRequiredBlobBatch = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobBatch, "__esModule", { value: true });
-	BlobBatch.BlobBatch = void 0;
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_util_2 = /*@__PURE__*/ requireCommonjs$b();
-	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
-	const Clients_js_1 = requireClients();
-	const Mutex_js_1 = requireMutex();
-	const Pipeline_js_1 = requirePipeline();
-	const utils_common_js_1 = requireUtils_common$2();
-	const core_xml_1 = /*@__PURE__*/ requireCommonjs$5();
-	const constants_js_1 = requireConstants$3();
-	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
-	const tracing_js_1 = requireTracing();
-	const core_client_1 = /*@__PURE__*/ requireCommonjs$7();
-	const StorageSharedKeyCredentialPolicyV2_js_1 = requireStorageSharedKeyCredentialPolicyV2();
-	/**
-	 * A BlobBatch represents an aggregated set of operations on blobs.
-	 * Currently, only `delete` and `setAccessTier` are supported.
-	 */
-	let BlobBatch$1 = class BlobBatch {
-	    batchRequest;
-	    batch = "batch";
-	    batchType;
-	    constructor() {
-	        this.batchRequest = new InnerBatchRequest();
-	    }
-	    /**
-	     * Get the value of Content-Type for a batch request.
-	     * The value must be multipart/mixed with a batch boundary.
-	     * Example: multipart/mixed; boundary=batch_a81786c8-e301-4e42-a729-a32ca24ae252
-	     */
-	    getMultiPartContentType() {
-	        return this.batchRequest.getMultipartContentType();
-	    }
-	    /**
-	     * Get assembled HTTP request body for sub requests.
-	     */
-	    getHttpRequestBody() {
-	        return this.batchRequest.getHttpRequestBody();
-	    }
-	    /**
-	     * Get sub requests that are added into the batch request.
-	     */
-	    getSubRequests() {
-	        return this.batchRequest.getSubRequests();
-	    }
-	    async addSubRequestInternal(subRequest, assembleSubRequestFunc) {
-	        await Mutex_js_1.Mutex.lock(this.batch);
-	        try {
-	            this.batchRequest.preAddSubRequest(subRequest);
-	            await assembleSubRequestFunc();
-	            this.batchRequest.postAddSubRequest(subRequest);
-	        }
-	        finally {
-	            await Mutex_js_1.Mutex.unlock(this.batch);
-	        }
-	    }
-	    setBatchType(batchType) {
-	        if (!this.batchType) {
-	            this.batchType = batchType;
-	        }
-	        if (this.batchType !== batchType) {
-	            throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`);
-	        }
-	    }
-	    async deleteBlob(urlOrBlobClient, credentialOrOptions, options) {
-	        let url;
-	        let credential;
-	        if (typeof urlOrBlobClient === "string" &&
-	            ((core_util_2.isNodeLike && credentialOrOptions instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	                credentialOrOptions instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	                (0, core_auth_1.isTokenCredential)(credentialOrOptions))) {
-	            // First overload
-	            url = urlOrBlobClient;
-	            credential = credentialOrOptions;
-	        }
-	        else if (urlOrBlobClient instanceof Clients_js_1.BlobClient) {
-	            // Second overload
-	            url = urlOrBlobClient.url;
-	            credential = urlOrBlobClient.credential;
-	            options = credentialOrOptions;
-	        }
-	        else {
-	            throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
-	        }
-	        if (!options) {
-	            options = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BatchDeleteRequest-addSubRequest", options, async (updatedOptions) => {
-	            this.setBatchType("delete");
-	            await this.addSubRequestInternal({
-	                url: url,
-	                credential: credential,
-	            }, async () => {
-	                await new Clients_js_1.BlobClient(url, this.batchRequest.createPipeline(credential)).delete(updatedOptions);
-	            });
-	        });
-	    }
-	    async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) {
-	        let url;
-	        let credential;
-	        let tier;
-	        if (typeof urlOrBlobClient === "string" &&
-	            ((core_util_2.isNodeLike && credentialOrTier instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	                credentialOrTier instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	                (0, core_auth_1.isTokenCredential)(credentialOrTier))) {
-	            // First overload
-	            url = urlOrBlobClient;
-	            credential = credentialOrTier;
-	            tier = tierOrOptions;
-	        }
-	        else if (urlOrBlobClient instanceof Clients_js_1.BlobClient) {
-	            // Second overload
-	            url = urlOrBlobClient.url;
-	            credential = urlOrBlobClient.credential;
-	            tier = credentialOrTier;
-	            options = tierOrOptions;
-	        }
-	        else {
-	            throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
-	        }
-	        if (!options) {
-	            options = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BatchSetTierRequest-addSubRequest", options, async (updatedOptions) => {
-	            this.setBatchType("setAccessTier");
-	            await this.addSubRequestInternal({
-	                url: url,
-	                credential: credential,
-	            }, async () => {
-	                await new Clients_js_1.BlobClient(url, this.batchRequest.createPipeline(credential)).setAccessTier(tier, updatedOptions);
-	            });
-	        });
-	    }
-	};
-	BlobBatch.BlobBatch = BlobBatch$1;
-	/**
-	 * Inner batch request class which is responsible for assembling and serializing sub requests.
-	 * See https://learn.microsoft.com/rest/api/storageservices/blob-batch#request-body for how requests are assembled.
-	 */
-	class InnerBatchRequest {
-	    operationCount;
-	    body;
-	    subRequests;
-	    boundary;
-	    subRequestPrefix;
-	    multipartContentType;
-	    batchRequestEnding;
-	    constructor() {
-	        this.operationCount = 0;
-	        this.body = "";
-	        const tempGuid = (0, core_util_1.randomUUID)();
-	        // batch_{batchid}
-	        this.boundary = `batch_${tempGuid}`;
-	        // --batch_{batchid}
-	        // Content-Type: application/http
-	        // Content-Transfer-Encoding: binary
-	        this.subRequestPrefix = `--${this.boundary}${constants_js_1.HTTP_LINE_ENDING}${constants_js_1.HeaderConstants.CONTENT_TYPE}: application/http${constants_js_1.HTTP_LINE_ENDING}${constants_js_1.HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`;
-	        // multipart/mixed; boundary=batch_{batchid}
-	        this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`;
-	        // --batch_{batchid}--
-	        this.batchRequestEnding = `--${this.boundary}--`;
-	        this.subRequests = new Map();
-	    }
-	    /**
-	     * Create pipeline to assemble sub requests. The idea here is to use existing
-	     * credential and serialization/deserialization components, with additional policies to
-	     * filter unnecessary headers, assemble sub requests into request's body
-	     * and intercept request from going to wire.
-	     * @param credential -  Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
-	     */
-	    createPipeline(credential) {
-	        const corePipeline = (0, core_rest_pipeline_1.createEmptyPipeline)();
-	        corePipeline.addPolicy((0, core_client_1.serializationPolicy)({
-	            stringifyXML: core_xml_1.stringifyXML,
-	            serializerOptions: {
-	                xml: {
-	                    xmlCharKey: "#",
-	                },
-	            },
-	        }), { phase: "Serialize" });
-	        // Use batch header filter policy to exclude unnecessary headers
-	        corePipeline.addPolicy(batchHeaderFilterPolicy());
-	        // Use batch assemble policy to assemble request and intercept request from going to wire
-	        corePipeline.addPolicy(batchRequestAssemblePolicy(this), { afterPhase: "Sign" });
-	        if ((0, core_auth_1.isTokenCredential)(credential)) {
-	            corePipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({
-	                credential,
-	                scopes: constants_js_1.StorageOAuthScopes,
-	                challengeCallbacks: { authorizeRequestOnChallenge: core_client_1.authorizeRequestOnTenantChallenge },
-	            }), { phase: "Sign" });
-	        }
-	        else if (credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) {
-	            corePipeline.addPolicy((0, StorageSharedKeyCredentialPolicyV2_js_1.storageSharedKeyCredentialPolicy)({
-	                accountName: credential.accountName,
-	                accountKey: credential.accountKey,
-	            }), { phase: "Sign" });
-	        }
-	        const pipeline = new Pipeline_js_1.Pipeline([]);
-	        // attach the v2 pipeline to this one
-	        pipeline._credential = credential;
-	        pipeline._corePipeline = corePipeline;
-	        return pipeline;
-	    }
-	    appendSubRequestToBody(request) {
-	        // Start to assemble sub request
-	        this.body += [
-	            this.subRequestPrefix, // sub request constant prefix
-	            `${constants_js_1.HeaderConstants.CONTENT_ID}: ${this.operationCount}`, // sub request's content ID
-	            "", // empty line after sub request's content ID
-	            `${request.method.toString()} ${(0, utils_common_js_1.getURLPathAndQuery)(request.url)} ${constants_js_1.HTTP_VERSION_1_1}${constants_js_1.HTTP_LINE_ENDING}`, // sub request start line with method
-	        ].join(constants_js_1.HTTP_LINE_ENDING);
-	        for (const [name, value] of request.headers) {
-	            this.body += `${name}: ${value}${constants_js_1.HTTP_LINE_ENDING}`;
-	        }
-	        this.body += constants_js_1.HTTP_LINE_ENDING; // sub request's headers need be ending with an empty line
-	        // No body to assemble for current batch request support
-	        // End to assemble sub request
-	    }
-	    preAddSubRequest(subRequest) {
-	        if (this.operationCount >= constants_js_1.BATCH_MAX_REQUEST) {
-	            throw new RangeError(`Cannot exceed ${constants_js_1.BATCH_MAX_REQUEST} sub requests in a single batch`);
-	        }
-	        // Fast fail if url for sub request is invalid
-	        const path = (0, utils_common_js_1.getURLPath)(subRequest.url);
-	        if (!path || path === "") {
-	            throw new RangeError(`Invalid url for sub request: '${subRequest.url}'`);
-	        }
-	    }
-	    postAddSubRequest(subRequest) {
-	        this.subRequests.set(this.operationCount, subRequest);
-	        this.operationCount++;
-	    }
-	    // Return the http request body with assembling the ending line to the sub request body.
-	    getHttpRequestBody() {
-	        return `${this.body}${this.batchRequestEnding}${constants_js_1.HTTP_LINE_ENDING}`;
-	    }
-	    getMultipartContentType() {
-	        return this.multipartContentType;
-	    }
-	    getSubRequests() {
-	        return this.subRequests;
-	    }
-	}
-	function batchRequestAssemblePolicy(batchRequest) {
-	    return {
-	        name: "batchRequestAssemblePolicy",
-	        async sendRequest(request) {
-	            batchRequest.appendSubRequestToBody(request);
-	            return {
-	                request,
-	                status: 200,
-	                headers: (0, core_rest_pipeline_1.createHttpHeaders)(),
-	            };
-	        },
-	    };
-	}
-	function batchHeaderFilterPolicy() {
-	    return {
-	        name: "batchHeaderFilterPolicy",
-	        async sendRequest(request, next) {
-	            let xMsHeaderName = "";
-	            for (const [name] of request.headers) {
-	                if ((0, utils_common_js_1.iEqual)(name, constants_js_1.HeaderConstants.X_MS_VERSION)) {
-	                    xMsHeaderName = name;
-	                }
-	            }
-	            if (xMsHeaderName !== "") {
-	                request.headers.delete(xMsHeaderName); // The subrequests should not have the x-ms-version header.
-	            }
-	            return next(request);
-	        },
-	    };
-	}
-	
-	return BlobBatch;
-}
-
-var hasRequiredBlobBatchClient;
-
-function requireBlobBatchClient () {
-	if (hasRequiredBlobBatchClient) return BlobBatchClient;
-	hasRequiredBlobBatchClient = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BlobBatchClient, "__esModule", { value: true });
-	BlobBatchClient.BlobBatchClient = void 0;
-	const BatchResponseParser_js_1 = requireBatchResponseParser();
-	const BatchUtils_js_1 = requireBatchUtils();
-	const BlobBatch_js_1 = requireBlobBatch();
-	const tracing_js_1 = requireTracing();
-	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
-	const StorageContextClient_js_1 = requireStorageContextClient();
-	const Pipeline_js_1 = requirePipeline();
-	const utils_common_js_1 = requireUtils_common$2();
-	/**
-	 * A BlobBatchClient allows you to make batched requests to the Azure Storage Blob service.
-	 *
-	 * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
-	 */
-	let BlobBatchClient$1 = class BlobBatchClient {
-	    serviceOrContainerContext;
-	    constructor(url, credentialOrPipeline, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        let pipeline;
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipeline)) {
-	            pipeline = credentialOrPipeline;
-	        }
-	        else if (!credentialOrPipeline) {
-	            // no credential provided
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        else {
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipeline, options);
-	        }
-	        const storageClientContext = new StorageContextClient_js_1.StorageContextClient(url, (0, Pipeline_js_1.getCoreClientOptions)(pipeline));
-	        const path = (0, utils_common_js_1.getURLPath)(url);
-	        if (path && path !== "/") {
-	            // Container scoped.
-	            this.serviceOrContainerContext = storageClientContext.container;
-	        }
-	        else {
-	            this.serviceOrContainerContext = storageClientContext.service;
-	        }
-	    }
-	    /**
-	     * Creates a {@link BlobBatch}.
-	     * A BlobBatch represents an aggregated set of operations on blobs.
-	     */
-	    createBatch() {
-	        return new BlobBatch_js_1.BlobBatch();
-	    }
-	    async deleteBlobs(urlsOrBlobClients, credentialOrOptions, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        const batch = new BlobBatch_js_1.BlobBatch();
-	        for (const urlOrBlobClient of urlsOrBlobClients) {
-	            if (typeof urlOrBlobClient === "string") {
-	                await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options);
-	            }
-	            else {
-	                await batch.deleteBlob(urlOrBlobClient, credentialOrOptions);
-	            }
-	        }
-	        return this.submitBatch(batch);
-	    }
-	    async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        const batch = new BlobBatch_js_1.BlobBatch();
-	        for (const urlOrBlobClient of urlsOrBlobClients) {
-	            if (typeof urlOrBlobClient === "string") {
-	                await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options);
-	            }
-	            else {
-	                await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions);
-	            }
-	        }
-	        return this.submitBatch(batch);
-	    }
-	    /**
-	     * Submit batch request which consists of multiple subrequests.
-	     *
-	     * Get `blobBatchClient` and other details before running the snippets.
-	     * `blobServiceClient.getBlobBatchClient()` gives the `blobBatchClient`
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:BlobBatchClientSubmitBatch
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     * import { BlobServiceClient, BlobBatch } from "@azure/storage-blob";
-	     *
-	     * const account = "";
-	     * const credential = new DefaultAzureCredential();
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   credential,
-	     * );
-	     *
-	     * const containerName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blobBatchClient = containerClient.getBlobBatchClient();
-	     *
-	     * const batchRequest = new BlobBatch();
-	     * await batchRequest.deleteBlob("", credential);
-	     * await batchRequest.deleteBlob("", credential, {
-	     *   deleteSnapshots: "include",
-	     * });
-	     * const batchResp = await blobBatchClient.submitBatch(batchRequest);
-	     * console.log(batchResp.subResponsesSucceededCount);
-	     * ```
-	     *
-	     * Example using a lease:
-	     *
-	     * ```ts snippet:BlobBatchClientSubmitBatchWithLease
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     * import { BlobServiceClient, BlobBatch } from "@azure/storage-blob";
-	     *
-	     * const account = "";
-	     * const credential = new DefaultAzureCredential();
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   credential,
-	     * );
-	     *
-	     * const containerName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blobBatchClient = containerClient.getBlobBatchClient();
-	     * const blobClient = containerClient.getBlobClient("");
-	     *
-	     * const batchRequest = new BlobBatch();
-	     * await batchRequest.setBlobAccessTier(blobClient, "Cool");
-	     * await batchRequest.setBlobAccessTier(blobClient, "Cool", {
-	     *   conditions: { leaseId: "" },
-	     * });
-	     * const batchResp = await blobBatchClient.submitBatch(batchRequest);
-	     * console.log(batchResp.subResponsesSucceededCount);
-	     * ```
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
-	     *
-	     * @param batchRequest - A set of Delete or SetTier operations.
-	     * @param options -
-	     */
-	    async submitBatch(batchRequest, options = {}) {
-	        if (!batchRequest || batchRequest.getSubRequests().size === 0) {
-	            throw new RangeError("Batch request should contain one or more sub requests.");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("BlobBatchClient-submitBatch", options, async (updatedOptions) => {
-	            const batchRequestBody = batchRequest.getHttpRequestBody();
-	            // ServiceSubmitBatchResponseModel and ContainerSubmitBatchResponse are compatible for now.
-	            const rawBatchResponse = (0, utils_common_js_1.assertResponse)(await this.serviceOrContainerContext.submitBatch((0, BatchUtils_js_1.utf8ByteLength)(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, {
-	                ...updatedOptions,
-	            }));
-	            // Parse the sub responses result, if logic reaches here(i.e. the batch request succeeded with status code 202).
-	            const batchResponseParser = new BatchResponseParser_js_1.BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests());
-	            const responseSummary = await batchResponseParser.parseBatchResponse();
-	            const res = {
-	                _response: rawBatchResponse._response,
-	                contentType: rawBatchResponse.contentType,
-	                errorCode: rawBatchResponse.errorCode,
-	                requestId: rawBatchResponse.requestId,
-	                clientRequestId: rawBatchResponse.clientRequestId,
-	                version: rawBatchResponse.version,
-	                subResponses: responseSummary.subResponses,
-	                subResponsesSucceededCount: responseSummary.subResponsesSucceededCount,
-	                subResponsesFailedCount: responseSummary.subResponsesFailedCount,
-	            };
-	            return res;
-	        });
-	    }
-	};
-	BlobBatchClient.BlobBatchClient = BlobBatchClient$1;
-	
-	return BlobBatchClient;
-}
-
-var hasRequiredContainerClient;
-
-function requireContainerClient () {
-	if (hasRequiredContainerClient) return ContainerClient;
-	hasRequiredContainerClient = 1;
-	Object.defineProperty(ContainerClient, "__esModule", { value: true });
-	ContainerClient.ContainerClient = void 0;
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
-	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
-	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
-	const Pipeline_js_1 = requirePipeline();
-	const StorageClient_js_1 = requireStorageClient();
-	const tracing_js_1 = requireTracing();
-	const utils_common_js_1 = requireUtils_common$2();
-	const BlobSASSignatureValues_js_1 = requireBlobSASSignatureValues();
-	const BlobLeaseClient_js_1 = requireBlobLeaseClient();
-	const Clients_js_1 = requireClients();
-	const BlobBatchClient_js_1 = requireBlobBatchClient();
-	/**
-	 * A ContainerClient represents a URL to the Azure Storage container allowing you to manipulate its blobs.
-	 */
-	let ContainerClient$1 = class ContainerClient extends StorageClient_js_1.StorageClient {
-	    /**
-	     * containerContext provided by protocol layer.
-	     */
-	    containerContext;
-	    _containerName;
-	    /**
-	     * The name of the container.
-	     */
-	    get containerName() {
-	        return this._containerName;
-	    }
-	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        let pipeline;
-	        let url;
-	        options = options || {};
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, pipeline: Pipeline)
-	            url = urlOrConnectionString;
-	            pipeline = credentialOrPipelineOrContainerName;
-	        }
-	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            url = urlOrConnectionString;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
-	        }
-	        else if (!credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName !== "string") {
-	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
-	            // The second parameter is undefined. Use anonymous credential.
-	            url = urlOrConnectionString;
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        else if (credentialOrPipelineOrContainerName &&
-	            typeof credentialOrPipelineOrContainerName === "string") {
-	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
-	            const containerName = credentialOrPipelineOrContainerName;
-	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
-	            if (extractedCreds.kind === "AccountConnString") {
-	                if (core_util_1.isNodeLike) {
-	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
-	                    url = (0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName));
-	                    if (!options.proxyOptions) {
-	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
-	                    }
-	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
-	                }
-	                else {
-	                    throw new Error("Account connection string is only supported in Node.js environment");
-	                }
-	            }
-	            else if (extractedCreds.kind === "SASConnString") {
-	                url =
-	                    (0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)) +
-	                        "?" +
-	                        extractedCreds.accountSas;
-	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	            }
-	            else {
-	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
-	            }
-	        }
-	        else {
-	            throw new Error("Expecting non-empty strings for containerName parameter");
-	        }
-	        super(url, pipeline);
-	        this._containerName = this.getContainerNameFromUrl();
-	        this.containerContext = this.storageClientContext.container;
-	    }
-	    /**
-	     * Creates a new container under the specified account. If the container with
-	     * the same name already exists, the operation fails.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/create-container
-	     * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
-	     *
-	     * @param options - Options to Container Create operation.
-	     *
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:ContainerClientCreate
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const createContainerResponse = await containerClient.create();
-	     * console.log("Container was created successfully", createContainerResponse.requestId);
-	     * ```
-	     */
-	    async create(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-create", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.create(updatedOptions));
-	        });
-	    }
-	    /**
-	     * Creates a new container under the specified account. If the container with
-	     * the same name already exists, it is not changed.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/create-container
-	     * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
-	     *
-	     * @param options -
-	     */
-	    async createIfNotExists(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-createIfNotExists", options, async (updatedOptions) => {
-	            try {
-	                const res = await this.create(updatedOptions);
-	                return {
-	                    succeeded: true,
-	                    ...res,
-	                    _response: res._response, // _response is made non-enumerable
-	                };
-	            }
-	            catch (e) {
-	                if (e.details?.errorCode === "ContainerAlreadyExists") {
-	                    return {
-	                        succeeded: false,
-	                        ...e.response?.parsedHeaders,
-	                        _response: e.response,
-	                    };
-	                }
-	                else {
-	                    throw e;
-	                }
-	            }
-	        });
-	    }
-	    /**
-	     * Returns true if the Azure container resource represented by this client exists; false otherwise.
-	     *
-	     * NOTE: use this function with care since an existing container might be deleted by other clients or
-	     * applications. Vice versa new containers with the same name might be added by other clients or
-	     * applications after this function completes.
-	     *
-	     * @param options -
-	     */
-	    async exists(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-exists", options, async (updatedOptions) => {
-	            try {
-	                await this.getProperties({
-	                    abortSignal: options.abortSignal,
-	                    tracingOptions: updatedOptions.tracingOptions,
-	                });
-	                return true;
-	            }
-	            catch (e) {
-	                if (e.statusCode === 404) {
-	                    return false;
-	                }
-	                throw e;
-	            }
-	        });
-	    }
-	    /**
-	     * Creates a {@link BlobClient}
-	     *
-	     * @param blobName - A blob name
-	     * @returns A new BlobClient object for the given blob name.
-	     */
-	    getBlobClient(blobName) {
-	        return new Clients_js_1.BlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
-	    }
-	    /**
-	     * Creates an {@link AppendBlobClient}
-	     *
-	     * @param blobName - An append blob name
-	     */
-	    getAppendBlobClient(blobName) {
-	        return new Clients_js_1.AppendBlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
-	    }
-	    /**
-	     * Creates a {@link BlockBlobClient}
-	     *
-	     * @param blobName - A block blob name
-	     *
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:ClientsUpload
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const blobName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     * const blockBlobClient = containerClient.getBlockBlobClient(blobName);
-	     *
-	     * const content = "Hello world!";
-	     * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);
-	     * ```
-	     */
-	    getBlockBlobClient(blobName) {
-	        return new Clients_js_1.BlockBlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
-	    }
-	    /**
-	     * Creates a {@link PageBlobClient}
-	     *
-	     * @param blobName - A page blob name
-	     */
-	    getPageBlobClient(blobName) {
-	        return new Clients_js_1.PageBlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
-	    }
-	    /**
-	     * Returns all user-defined metadata and system properties for the specified
-	     * container. The data returned does not include the container's list of blobs.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-container-properties
-	     *
-	     * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if
-	     * they originally contained uppercase characters. This differs from the metadata keys returned by
-	     * the `listContainers` method of {@link BlobServiceClient} using the `includeMetadata` option, which
-	     * will retain their original casing.
-	     *
-	     * @param options - Options to Container Get Properties operation.
-	     */
-	    async getProperties(options = {}) {
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-getProperties", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.getProperties({
-	                abortSignal: options.abortSignal,
-	                ...options.conditions,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Marks the specified container for deletion. The container and any blobs
-	     * contained within it are later deleted during garbage collection.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-container
-	     *
-	     * @param options - Options to Container Delete operation.
-	     */
-	    async delete(options = {}) {
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-delete", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.delete({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: options.conditions,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Marks the specified container for deletion if it exists. The container and any blobs
-	     * contained within it are later deleted during garbage collection.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-container
-	     *
-	     * @param options - Options to Container Delete operation.
-	     */
-	    async deleteIfExists(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-deleteIfExists", options, async (updatedOptions) => {
-	            try {
-	                const res = await this.delete(updatedOptions);
-	                return {
-	                    succeeded: true,
-	                    ...res,
-	                    _response: res._response,
-	                };
-	            }
-	            catch (e) {
-	                if (e.details?.errorCode === "ContainerNotFound") {
-	                    return {
-	                        succeeded: false,
-	                        ...e.response?.parsedHeaders,
-	                        _response: e.response,
-	                    };
-	                }
-	                throw e;
-	            }
-	        });
-	    }
-	    /**
-	     * Sets one or more user-defined name-value pairs for the specified container.
-	     *
-	     * If no option provided, or no metadata defined in the parameter, the container
-	     * metadata will be removed.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-container-metadata
-	     *
-	     * @param metadata - Replace existing metadata with this value.
-	     *                            If no value provided the existing metadata will be removed.
-	     * @param options - Options to Container Set Metadata operation.
-	     */
-	    async setMetadata(metadata, options = {}) {
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        if (options.conditions.ifUnmodifiedSince) {
-	            throw new RangeError("the IfUnmodifiedSince must have their default values because they are ignored by the blob service");
-	        }
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-setMetadata", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.setMetadata({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                metadata,
-	                modifiedAccessConditions: options.conditions,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Gets the permissions for the specified container. The permissions indicate
-	     * whether container data may be accessed publicly.
-	     *
-	     * WARNING: JavaScript Date will potentially lose precision when parsing startsOn and expiresOn strings.
-	     * For example, new Date("2018-12-31T03:44:23.8827891Z").toISOString() will get "2018-12-31T03:44:23.882Z".
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-container-acl
-	     *
-	     * @param options - Options to Container Get Access Policy operation.
-	     */
-	    async getAccessPolicy(options = {}) {
-	        if (!options.conditions) {
-	            options.conditions = {};
-	        }
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-getAccessPolicy", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.getAccessPolicy({
-	                abortSignal: options.abortSignal,
-	                leaseAccessConditions: options.conditions,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const res = {
-	                _response: response._response,
-	                blobPublicAccess: response.blobPublicAccess,
-	                date: response.date,
-	                etag: response.etag,
-	                errorCode: response.errorCode,
-	                lastModified: response.lastModified,
-	                requestId: response.requestId,
-	                clientRequestId: response.clientRequestId,
-	                signedIdentifiers: [],
-	                version: response.version,
-	            };
-	            for (const identifier of response) {
-	                let accessPolicy = undefined;
-	                if (identifier.accessPolicy) {
-	                    accessPolicy = {
-	                        permissions: identifier.accessPolicy.permissions,
-	                    };
-	                    if (identifier.accessPolicy.expiresOn) {
-	                        accessPolicy.expiresOn = new Date(identifier.accessPolicy.expiresOn);
-	                    }
-	                    if (identifier.accessPolicy.startsOn) {
-	                        accessPolicy.startsOn = new Date(identifier.accessPolicy.startsOn);
-	                    }
-	                }
-	                res.signedIdentifiers.push({
-	                    accessPolicy,
-	                    id: identifier.id,
-	                });
-	            }
-	            return res;
-	        });
-	    }
-	    /**
-	     * Sets the permissions for the specified container. The permissions indicate
-	     * whether blobs in a container may be accessed publicly.
-	     *
-	     * When you set permissions for a container, the existing permissions are replaced.
-	     * If no access or containerAcl provided, the existing container ACL will be
-	     * removed.
-	     *
-	     * When you establish a stored access policy on a container, it may take up to 30 seconds to take effect.
-	     * During this interval, a shared access signature that is associated with the stored access policy will
-	     * fail with status code 403 (Forbidden), until the access policy becomes active.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-container-acl
-	     *
-	     * @param access - The level of public access to data in the container.
-	     * @param containerAcl - Array of elements each having a unique Id and details of the access policy.
-	     * @param options - Options to Container Set Access Policy operation.
-	     */
-	    async setAccessPolicy(access, containerAcl, options = {}) {
-	        options.conditions = options.conditions || {};
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-setAccessPolicy", options, async (updatedOptions) => {
-	            const acl = [];
-	            for (const identifier of containerAcl || []) {
-	                acl.push({
-	                    accessPolicy: {
-	                        expiresOn: identifier.accessPolicy.expiresOn
-	                            ? (0, utils_common_js_1.truncatedISO8061Date)(identifier.accessPolicy.expiresOn)
-	                            : "",
-	                        permissions: identifier.accessPolicy.permissions,
-	                        startsOn: identifier.accessPolicy.startsOn
-	                            ? (0, utils_common_js_1.truncatedISO8061Date)(identifier.accessPolicy.startsOn)
-	                            : "",
-	                    },
-	                    id: identifier.id,
-	                });
-	            }
-	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.setAccessPolicy({
-	                abortSignal: options.abortSignal,
-	                access,
-	                containerAcl: acl,
-	                leaseAccessConditions: options.conditions,
-	                modifiedAccessConditions: options.conditions,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Get a {@link BlobLeaseClient} that manages leases on the container.
-	     *
-	     * @param proposeLeaseId - Initial proposed lease Id.
-	     * @returns A new BlobLeaseClient object for managing leases on the container.
-	     */
-	    getBlobLeaseClient(proposeLeaseId) {
-	        return new BlobLeaseClient_js_1.BlobLeaseClient(this, proposeLeaseId);
-	    }
-	    /**
-	     * Creates a new block blob, or updates the content of an existing block blob.
-	     *
-	     * Updating an existing block blob overwrites any existing metadata on the blob.
-	     * Partial updates are not supported; the content of the existing blob is
-	     * overwritten with the new content. To perform a partial update of a block blob's,
-	     * use {@link BlockBlobClient.stageBlock} and {@link BlockBlobClient.commitBlockList}.
-	     *
-	     * This is a non-parallel uploading method, please use {@link BlockBlobClient.uploadFile},
-	     * {@link BlockBlobClient.uploadStream} or {@link BlockBlobClient.uploadBrowserData} for better
-	     * performance with concurrency uploading.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
-	     *
-	     * @param blobName - Name of the block blob to create or update.
-	     * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function
-	     *                               which returns a new Readable stream whose offset is from data source beginning.
-	     * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a
-	     *                               string including non non-Base64/Hex-encoded characters.
-	     * @param options - Options to configure the Block Blob Upload operation.
-	     * @returns Block Blob upload response data and the corresponding BlockBlobClient instance.
-	     */
-	    async uploadBlockBlob(blobName, body, contentLength, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-uploadBlockBlob", options, async (updatedOptions) => {
-	            const blockBlobClient = this.getBlockBlobClient(blobName);
-	            const response = await blockBlobClient.upload(body, contentLength, updatedOptions);
-	            return {
-	                blockBlobClient,
-	                response,
-	            };
-	        });
-	    }
-	    /**
-	     * Marks the specified blob or snapshot for deletion. The blob is later deleted
-	     * during garbage collection. Note that in order to delete a blob, you must delete
-	     * all of its snapshots. You can delete both at the same time with the Delete
-	     * Blob operation.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
-	     *
-	     * @param blobName -
-	     * @param options - Options to Blob Delete operation.
-	     * @returns Block blob deletion response data.
-	     */
-	    async deleteBlob(blobName, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-deleteBlob", options, async (updatedOptions) => {
-	            let blobClient = this.getBlobClient(blobName);
-	            if (options.versionId) {
-	                blobClient = blobClient.withVersion(options.versionId);
-	            }
-	            return blobClient.delete(updatedOptions);
-	        });
-	    }
-	    /**
-	     * listBlobFlatSegment returns a single segment of blobs starting from the
-	     * specified Marker. Use an empty Marker to start enumeration from the beginning.
-	     * After getting a segment, process it, and then call listBlobsFlatSegment again
-	     * (passing the the previously-returned Marker) to get the next segment.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/list-blobs
-	     *
-	     * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
-	     * @param options - Options to Container List Blob Flat Segment operation.
-	     */
-	    async listBlobFlatSegment(marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-listBlobFlatSegment", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.listBlobFlatSegment({
-	                marker,
-	                ...options,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const wrappedResponse = {
-	                ...response,
-	                _response: {
-	                    ...response._response,
-	                    parsedBody: (0, utils_common_js_1.ConvertInternalResponseOfListBlobFlat)(response._response.parsedBody),
-	                }, // _response is made non-enumerable
-	                segment: {
-	                    ...response.segment,
-	                    blobItems: response.segment.blobItems.map((blobItemInternal) => {
-	                        const blobItem = {
-	                            ...blobItemInternal,
-	                            name: (0, utils_common_js_1.BlobNameToString)(blobItemInternal.name),
-	                            tags: (0, utils_common_js_1.toTags)(blobItemInternal.blobTags),
-	                            objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(blobItemInternal.objectReplicationMetadata),
-	                        };
-	                        return blobItem;
-	                    }),
-	                },
-	            };
-	            return wrappedResponse;
-	        });
-	    }
-	    /**
-	     * listBlobHierarchySegment returns a single segment of blobs starting from
-	     * the specified Marker. Use an empty Marker to start enumeration from the
-	     * beginning. After getting a segment, process it, and then call listBlobsHierarchicalSegment
-	     * again (passing the the previously-returned Marker) to get the next segment.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/list-blobs
-	     *
-	     * @param delimiter - The character or string used to define the virtual hierarchy
-	     * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
-	     * @param options - Options to Container List Blob Hierarchy Segment operation.
-	     */
-	    async listBlobHierarchySegment(delimiter, marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-listBlobHierarchySegment", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.listBlobHierarchySegment(delimiter, {
-	                marker,
-	                ...options,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const wrappedResponse = {
-	                ...response,
-	                _response: {
-	                    ...response._response,
-	                    parsedBody: (0, utils_common_js_1.ConvertInternalResponseOfListBlobHierarchy)(response._response.parsedBody),
-	                }, // _response is made non-enumerable
-	                segment: {
-	                    ...response.segment,
-	                    blobItems: response.segment.blobItems.map((blobItemInternal) => {
-	                        const blobItem = {
-	                            ...blobItemInternal,
-	                            name: (0, utils_common_js_1.BlobNameToString)(blobItemInternal.name),
-	                            tags: (0, utils_common_js_1.toTags)(blobItemInternal.blobTags),
-	                            objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(blobItemInternal.objectReplicationMetadata),
-	                        };
-	                        return blobItem;
-	                    }),
-	                    blobPrefixes: response.segment.blobPrefixes?.map((blobPrefixInternal) => {
-	                        const blobPrefix = {
-	                            ...blobPrefixInternal,
-	                            name: (0, utils_common_js_1.BlobNameToString)(blobPrefixInternal.name),
-	                        };
-	                        return blobPrefix;
-	                    }),
-	                },
-	            };
-	            return wrappedResponse;
-	        });
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for ContainerListBlobFlatSegmentResponse
-	     *
-	     * @param marker - A string value that identifies the portion of
-	     *                          the list of blobs to be returned with the next listing operation. The
-	     *                          operation returns the ContinuationToken value within the response body if the
-	     *                          listing operation did not return all blobs remaining to be listed
-	     *                          with the current page. The ContinuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of list
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to list blobs operation.
-	     */
-	    async *listSegments(marker, options = {}) {
-	        let listBlobsFlatSegmentResponse;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                listBlobsFlatSegmentResponse = await this.listBlobFlatSegment(marker, options);
-	                marker = listBlobsFlatSegmentResponse.continuationToken;
-	                yield await listBlobsFlatSegmentResponse;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator of {@link BlobItem} objects
-	     *
-	     * @param options - Options to list blobs operation.
-	     */
-	    async *listItems(options = {}) {
-	        let marker;
-	        for await (const listBlobsFlatSegmentResponse of this.listSegments(marker, options)) {
-	            yield* listBlobsFlatSegmentResponse.segment.blobItems;
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to list all the blobs
-	     * under the specified account.
-	     *
-	     * .byPage() returns an async iterable iterator to list the blobs in pages.
-	     *
-	     * ```ts snippet:ReadmeSampleListBlobs_Multiple
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     *
-	     * // Example using `for await` syntax
-	     * let i = 1;
-	     * const blobs = containerClient.listBlobsFlat();
-	     * for await (const blob of blobs) {
-	     *   console.log(`Blob ${i++}: ${blob.name}`);
-	     * }
-	     *
-	     * // Example using `iter.next()` syntax
-	     * i = 1;
-	     * const iter = containerClient.listBlobsFlat();
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   console.log(`Blob ${i++}: ${value.name}`);
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Example using `byPage()` syntax
-	     * i = 1;
-	     * for await (const page of containerClient.listBlobsFlat().byPage({ maxPageSize: 20 })) {
-	     *   for (const blob of page.segment.blobItems) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Example using paging with a marker
-	     * i = 1;
-	     * let iterator = containerClient.listBlobsFlat().byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     * // Prints 2 blob names
-	     * if (response.segment.blobItems) {
-	     *   for (const blob of response.segment.blobItems) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = containerClient.listBlobsFlat().byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     * // Prints 10 blob names
-	     * if (response.segment.blobItems) {
-	     *   for (const blob of response.segment.blobItems) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param options - Options to list blobs.
-	     * @returns An asyncIterableIterator that supports paging.
-	     */
-	    listBlobsFlat(options = {}) {
-	        const include = [];
-	        if (options.includeCopy) {
-	            include.push("copy");
-	        }
-	        if (options.includeDeleted) {
-	            include.push("deleted");
-	        }
-	        if (options.includeMetadata) {
-	            include.push("metadata");
-	        }
-	        if (options.includeSnapshots) {
-	            include.push("snapshots");
-	        }
-	        if (options.includeVersions) {
-	            include.push("versions");
-	        }
-	        if (options.includeUncommitedBlobs) {
-	            include.push("uncommittedblobs");
-	        }
-	        if (options.includeTags) {
-	            include.push("tags");
-	        }
-	        if (options.includeDeletedWithVersions) {
-	            include.push("deletedwithversions");
-	        }
-	        if (options.includeImmutabilityPolicy) {
-	            include.push("immutabilitypolicy");
-	        }
-	        if (options.includeLegalHold) {
-	            include.push("legalhold");
-	        }
-	        if (options.prefix === "") {
-	            options.prefix = undefined;
-	        }
-	        const updatedOptions = {
-	            ...options,
-	            ...(include.length > 0 ? { include: include } : {}),
-	        };
-	        // AsyncIterableIterator to iterate over blobs
-	        const iter = this.listItems(updatedOptions);
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.listSegments(settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...updatedOptions,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for ContainerListBlobHierarchySegmentResponse
-	     *
-	     * @param delimiter - The character or string used to define the virtual hierarchy
-	     * @param marker - A string value that identifies the portion of
-	     *                          the list of blobs to be returned with the next listing operation. The
-	     *                          operation returns the ContinuationToken value within the response body if the
-	     *                          listing operation did not return all blobs remaining to be listed
-	     *                          with the current page. The ContinuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of list
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to list blobs operation.
-	     */
-	    async *listHierarchySegments(delimiter, marker, options = {}) {
-	        let listBlobsHierarchySegmentResponse;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                listBlobsHierarchySegmentResponse = await this.listBlobHierarchySegment(delimiter, marker, options);
-	                marker = listBlobsHierarchySegmentResponse.continuationToken;
-	                yield await listBlobsHierarchySegmentResponse;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for {@link BlobPrefix} and {@link BlobItem} objects.
-	     *
-	     * @param delimiter - The character or string used to define the virtual hierarchy
-	     * @param options - Options to list blobs operation.
-	     */
-	    async *listItemsByHierarchy(delimiter, options = {}) {
-	        let marker;
-	        for await (const listBlobsHierarchySegmentResponse of this.listHierarchySegments(delimiter, marker, options)) {
-	            const segment = listBlobsHierarchySegmentResponse.segment;
-	            if (segment.blobPrefixes) {
-	                for (const prefix of segment.blobPrefixes) {
-	                    yield {
-	                        kind: "prefix",
-	                        ...prefix,
-	                    };
-	                }
-	            }
-	            for (const blob of segment.blobItems) {
-	                yield { kind: "blob", ...blob };
-	            }
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to list all the blobs by hierarchy.
-	     * under the specified account.
-	     *
-	     * .byPage() returns an async iterable iterator to list the blobs by hierarchy in pages.
-	     *
-	     * ```ts snippet:ReadmeSampleListBlobsByHierarchy
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     *
-	     * // Example using `for await` syntax
-	     * let i = 1;
-	     * const blobs = containerClient.listBlobsByHierarchy("/");
-	     * for await (const blob of blobs) {
-	     *   if (blob.kind === "prefix") {
-	     *     console.log(`\tBlobPrefix: ${blob.name}`);
-	     *   } else {
-	     *     console.log(`\tBlobItem: name - ${blob.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Example using `iter.next()` syntax
-	     * i = 1;
-	     * const iter = containerClient.listBlobsByHierarchy("/");
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   if (value.kind === "prefix") {
-	     *     console.log(`\tBlobPrefix: ${value.name}`);
-	     *   } else {
-	     *     console.log(`\tBlobItem: name - ${value.name}`);
-	     *   }
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Example using `byPage()` syntax
-	     * i = 1;
-	     * for await (const page of containerClient.listBlobsByHierarchy("/").byPage({ maxPageSize: 20 })) {
-	     *   const segment = page.segment;
-	     *   if (segment.blobPrefixes) {
-	     *     for (const prefix of segment.blobPrefixes) {
-	     *       console.log(`\tBlobPrefix: ${prefix.name}`);
-	     *     }
-	     *   }
-	     *   for (const blob of page.segment.blobItems) {
-	     *     console.log(`\tBlobItem: name - ${blob.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Example using paging with a marker
-	     * i = 1;
-	     * let iterator = containerClient.listBlobsByHierarchy("/").byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     * // Prints 2 blob names
-	     * if (response.blobPrefixes) {
-	     *   for (const prefix of response.blobPrefixes) {
-	     *     console.log(`\tBlobPrefix: ${prefix.name}`);
-	     *   }
-	     * }
-	     * if (response.segment.blobItems) {
-	     *   for (const blob of response.segment.blobItems) {
-	     *     console.log(`\tBlobItem: name - ${blob.name}`);
-	     *   }
-	     * }
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = containerClient
-	     *   .listBlobsByHierarchy("/")
-	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     * // Prints 10 blob names
-	     * if (response.blobPrefixes) {
-	     *   for (const prefix of response.blobPrefixes) {
-	     *     console.log(`\tBlobPrefix: ${prefix.name}`);
-	     *   }
-	     * }
-	     * if (response.segment.blobItems) {
-	     *   for (const blob of response.segment.blobItems) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param delimiter - The character or string used to define the virtual hierarchy
-	     * @param options - Options to list blobs operation.
-	     */
-	    listBlobsByHierarchy(delimiter, options = {}) {
-	        if (delimiter === "") {
-	            throw new RangeError("delimiter should contain one or more characters");
-	        }
-	        const include = [];
-	        if (options.includeCopy) {
-	            include.push("copy");
-	        }
-	        if (options.includeDeleted) {
-	            include.push("deleted");
-	        }
-	        if (options.includeMetadata) {
-	            include.push("metadata");
-	        }
-	        if (options.includeSnapshots) {
-	            include.push("snapshots");
-	        }
-	        if (options.includeVersions) {
-	            include.push("versions");
-	        }
-	        if (options.includeUncommitedBlobs) {
-	            include.push("uncommittedblobs");
-	        }
-	        if (options.includeTags) {
-	            include.push("tags");
-	        }
-	        if (options.includeDeletedWithVersions) {
-	            include.push("deletedwithversions");
-	        }
-	        if (options.includeImmutabilityPolicy) {
-	            include.push("immutabilitypolicy");
-	        }
-	        if (options.includeLegalHold) {
-	            include.push("legalhold");
-	        }
-	        if (options.prefix === "") {
-	            options.prefix = undefined;
-	        }
-	        const updatedOptions = {
-	            ...options,
-	            ...(include.length > 0 ? { include: include } : {}),
-	        };
-	        // AsyncIterableIterator to iterate over blob prefixes and blobs
-	        const iter = this.listItemsByHierarchy(delimiter, updatedOptions);
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            async next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.listHierarchySegments(delimiter, settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...updatedOptions,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * The Filter Blobs operation enables callers to list blobs in the container whose tags
-	     * match a given search expression.
-	     *
-	     * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                        The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                        The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                        however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param marker - A string value that identifies the portion of
-	     *                          the list of blobs to be returned with the next listing operation. The
-	     *                          operation returns the continuationToken value within the response body if the
-	     *                          listing operation did not return all blobs remaining to be listed
-	     *                          with the current page. The continuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of list
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to find blobs by tags.
-	     */
-	    async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-findBlobsByTagsSegment", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.filterBlobs({
-	                abortSignal: options.abortSignal,
-	                where: tagFilterSqlExpression,
-	                marker,
-	                maxPageSize: options.maxPageSize,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const wrappedResponse = {
-	                ...response,
-	                _response: response._response, // _response is made non-enumerable
-	                blobs: response.blobs.map((blob) => {
-	                    let tagValue = "";
-	                    if (blob.tags?.blobTagSet.length === 1) {
-	                        tagValue = blob.tags.blobTagSet[0].value;
-	                    }
-	                    return { ...blob, tags: (0, utils_common_js_1.toTags)(blob.tags), tagValue };
-	                }),
-	            };
-	            return wrappedResponse;
-	        });
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for ContainerFindBlobsByTagsSegmentResponse.
-	     *
-	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param marker - A string value that identifies the portion of
-	     *                          the list of blobs to be returned with the next listing operation. The
-	     *                          operation returns the continuationToken value within the response body if the
-	     *                          listing operation did not return all blobs remaining to be listed
-	     *                          with the current page. The continuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of list
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to find blobs by tags.
-	     */
-	    async *findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
-	        let response;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                response = await this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options);
-	                response.blobs = response.blobs || [];
-	                marker = response.continuationToken;
-	                yield response;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for blobs.
-	     *
-	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param options - Options to findBlobsByTagsItems.
-	     */
-	    async *findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
-	        let marker;
-	        for await (const segment of this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)) {
-	            yield* segment.blobs;
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to find all blobs with specified tag
-	     * under the specified container.
-	     *
-	     * .byPage() returns an async iterable iterator to list the blobs in pages.
-	     *
-	     * Example using `for await` syntax:
-	     *
-	     * ```ts snippet:ReadmeSampleFindBlobsByTags
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerName = "";
-	     * const containerClient = blobServiceClient.getContainerClient(containerName);
-	     *
-	     * // Example using `for await` syntax
-	     * let i = 1;
-	     * for await (const blob of containerClient.findBlobsByTags("tagkey='tagvalue'")) {
-	     *   console.log(`Blob ${i++}: ${blob.name}`);
-	     * }
-	     *
-	     * // Example using `iter.next()` syntax
-	     * i = 1;
-	     * const iter = containerClient.findBlobsByTags("tagkey='tagvalue'");
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   console.log(`Blob ${i++}: ${value.name}`);
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Example using `byPage()` syntax
-	     * i = 1;
-	     * for await (const page of containerClient
-	     *   .findBlobsByTags("tagkey='tagvalue'")
-	     *   .byPage({ maxPageSize: 20 })) {
-	     *   for (const blob of page.blobs) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Example using paging with a marker
-	     * i = 1;
-	     * let iterator = containerClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     * // Prints 2 blob names
-	     * if (response.blobs) {
-	     *   for (const blob of response.blobs) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = containerClient
-	     *   .findBlobsByTags("tagkey='tagvalue'")
-	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     * // Prints 10 blob names
-	     * if (response.blobs) {
-	     *   for (const blob of response.blobs) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param options - Options to find blobs by tags.
-	     */
-	    findBlobsByTags(tagFilterSqlExpression, options = {}) {
-	        // AsyncIterableIterator to iterate over blobs
-	        const listSegmentOptions = {
-	            ...options,
-	        };
-	        const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...listSegmentOptions,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * The Get Account Information operation returns the sku name and account kind
-	     * for the specified account.
-	     * The Get Account Information operation is available on service versions beginning
-	     * with version 2018-03-28.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
-	     *
-	     * @param options - Options to the Service Get Account Info operation.
-	     * @returns Response data for the Service Get Account Info operation.
-	     */
-	    async getAccountInfo(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("ContainerClient-getAccountInfo", options, async (updatedOptions) => {
-	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.getAccountInfo({
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    getContainerNameFromUrl() {
-	        let containerName;
-	        try {
-	            //  URL may look like the following
-	            // "https://myaccount.blob.core.windows.net/mycontainer?sasString";
-	            // "https://myaccount.blob.core.windows.net/mycontainer";
-	            // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername`
-	            // http://localhost:10001/devstoreaccount1/containername
-	            const parsedUrl = new URL(this.url);
-	            if (parsedUrl.hostname.split(".")[1] === "blob") {
-	                // "https://myaccount.blob.core.windows.net/containername".
-	                // "https://customdomain.com/containername".
-	                // .getPath() -> /containername
-	                containerName = parsedUrl.pathname.split("/")[1];
-	            }
-	            else if ((0, utils_common_js_1.isIpEndpointStyle)(parsedUrl)) {
-	                // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername
-	                // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername
-	                // .getPath() -> /devstoreaccount1/containername
-	                containerName = parsedUrl.pathname.split("/")[2];
-	            }
-	            else {
-	                // "https://customdomain.com/containername".
-	                // .getPath() -> /containername
-	                containerName = parsedUrl.pathname.split("/")[1];
-	            }
-	            // decode the encoded containerName - to get all the special characters that might be present in it
-	            containerName = decodeURIComponent(containerName);
-	            if (!containerName) {
-	                throw new Error("Provided containerName is invalid.");
-	            }
-	            return containerName;
-	        }
-	        catch (error) {
-	            throw new Error("Unable to extract containerName with provided information.");
-	        }
-	    }
-	    /**
-	     * Only available for ContainerClient constructed with a shared key credential.
-	     *
-	     * Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties
-	     * and parameters passed in. The SAS is signed by the shared key credential of the client.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateSasUrl(options) {
-	        return new Promise((resolve) => {
-	            if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
-	                throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
-	            }
-	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
-	                containerName: this._containerName,
-	                ...options,
-	            }, this.credential).toString();
-	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
-	        });
-	    }
-	    /**
-	     * Only available for ContainerClient constructed with a shared key credential.
-	     *
-	     * Generates string to sign for a Blob Container Service Shared Access Signature (SAS) URI
-	     * based on the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    generateSasStringToSign(options) {
-	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
-	            throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
-	        }
-	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
-	            containerName: this._containerName,
-	            ...options,
-	        }, this.credential).stringToSign;
-	    }
-	    /**
-	     * Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties
-	     * and parameters passed in. The SAS is signed by the input user delegation key.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateUserDelegationSasUrl(options, userDelegationKey) {
-	        return new Promise((resolve) => {
-	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
-	                containerName: this._containerName,
-	                ...options,
-	            }, userDelegationKey, this.accountName).toString();
-	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
-	        });
-	    }
-	    /**
-	     * Generates string to sign for a Blob Container Service Shared Access Signature (SAS) URI
-	     * based on the client properties and parameters passed in. The SAS is signed by the input user delegation key.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
-	     *
-	     * @param options - Optional parameters.
-	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
-	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateUserDelegationSasStringToSign(options, userDelegationKey) {
-	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
-	            containerName: this._containerName,
-	            ...options,
-	        }, userDelegationKey, this.accountName).stringToSign;
-	    }
-	    /**
-	     * Creates a BlobBatchClient object to conduct batch operations.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
-	     *
-	     * @returns A new BlobBatchClient object for this container.
-	     */
-	    getBlobBatchClient() {
-	        return new BlobBatchClient_js_1.BlobBatchClient(this.url, this.pipeline);
-	    }
-	};
-	ContainerClient.ContainerClient = ContainerClient$1;
-	
-	return ContainerClient;
-}
-
-var AccountSASPermissions = {};
-
-var hasRequiredAccountSASPermissions;
-
-function requireAccountSASPermissions () {
-	if (hasRequiredAccountSASPermissions) return AccountSASPermissions;
-	hasRequiredAccountSASPermissions = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AccountSASPermissions, "__esModule", { value: true });
-	AccountSASPermissions.AccountSASPermissions = void 0;
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * This is a helper class to construct a string representing the permissions granted by an AccountSAS. Setting a value
-	 * to true means that any SAS which uses these permissions will grant permissions for that operation. Once all the
-	 * values are set, this should be serialized with toString and set as the permissions field on an
-	 * {@link AccountSASSignatureValues} object. It is possible to construct the permissions string without this class, but
-	 * the order of the permissions is particular and this class guarantees correctness.
-	 */
-	let AccountSASPermissions$1 = class AccountSASPermissions {
-	    /**
-	     * Parse initializes the AccountSASPermissions fields from a string.
-	     *
-	     * @param permissions -
-	     */
-	    static parse(permissions) {
-	        const accountSASPermissions = new AccountSASPermissions();
-	        for (const c of permissions) {
-	            switch (c) {
-	                case "r":
-	                    accountSASPermissions.read = true;
-	                    break;
-	                case "w":
-	                    accountSASPermissions.write = true;
-	                    break;
-	                case "d":
-	                    accountSASPermissions.delete = true;
-	                    break;
-	                case "x":
-	                    accountSASPermissions.deleteVersion = true;
-	                    break;
-	                case "l":
-	                    accountSASPermissions.list = true;
-	                    break;
-	                case "a":
-	                    accountSASPermissions.add = true;
-	                    break;
-	                case "c":
-	                    accountSASPermissions.create = true;
-	                    break;
-	                case "u":
-	                    accountSASPermissions.update = true;
-	                    break;
-	                case "p":
-	                    accountSASPermissions.process = true;
-	                    break;
-	                case "t":
-	                    accountSASPermissions.tag = true;
-	                    break;
-	                case "f":
-	                    accountSASPermissions.filter = true;
-	                    break;
-	                case "i":
-	                    accountSASPermissions.setImmutabilityPolicy = true;
-	                    break;
-	                case "y":
-	                    accountSASPermissions.permanentDelete = true;
-	                    break;
-	                default:
-	                    throw new RangeError(`Invalid permission character: ${c}`);
-	            }
-	        }
-	        return accountSASPermissions;
-	    }
-	    /**
-	     * Creates a {@link AccountSASPermissions} from a raw object which contains same keys as it
-	     * and boolean values for them.
-	     *
-	     * @param permissionLike -
-	     */
-	    static from(permissionLike) {
-	        const accountSASPermissions = new AccountSASPermissions();
-	        if (permissionLike.read) {
-	            accountSASPermissions.read = true;
-	        }
-	        if (permissionLike.write) {
-	            accountSASPermissions.write = true;
-	        }
-	        if (permissionLike.delete) {
-	            accountSASPermissions.delete = true;
-	        }
-	        if (permissionLike.deleteVersion) {
-	            accountSASPermissions.deleteVersion = true;
-	        }
-	        if (permissionLike.filter) {
-	            accountSASPermissions.filter = true;
-	        }
-	        if (permissionLike.tag) {
-	            accountSASPermissions.tag = true;
-	        }
-	        if (permissionLike.list) {
-	            accountSASPermissions.list = true;
-	        }
-	        if (permissionLike.add) {
-	            accountSASPermissions.add = true;
-	        }
-	        if (permissionLike.create) {
-	            accountSASPermissions.create = true;
-	        }
-	        if (permissionLike.update) {
-	            accountSASPermissions.update = true;
-	        }
-	        if (permissionLike.process) {
-	            accountSASPermissions.process = true;
-	        }
-	        if (permissionLike.setImmutabilityPolicy) {
-	            accountSASPermissions.setImmutabilityPolicy = true;
-	        }
-	        if (permissionLike.permanentDelete) {
-	            accountSASPermissions.permanentDelete = true;
-	        }
-	        return accountSASPermissions;
-	    }
-	    /**
-	     * Permission to read resources and list queues and tables granted.
-	     */
-	    read = false;
-	    /**
-	     * Permission to write resources granted.
-	     */
-	    write = false;
-	    /**
-	     * Permission to delete blobs and files granted.
-	     */
-	    delete = false;
-	    /**
-	     * Permission to delete versions granted.
-	     */
-	    deleteVersion = false;
-	    /**
-	     * Permission to list blob containers, blobs, shares, directories, and files granted.
-	     */
-	    list = false;
-	    /**
-	     * Permission to add messages, table entities, and append to blobs granted.
-	     */
-	    add = false;
-	    /**
-	     * Permission to create blobs and files granted.
-	     */
-	    create = false;
-	    /**
-	     * Permissions to update messages and table entities granted.
-	     */
-	    update = false;
-	    /**
-	     * Permission to get and delete messages granted.
-	     */
-	    process = false;
-	    /**
-	     * Specfies Tag access granted.
-	     */
-	    tag = false;
-	    /**
-	     * Permission to filter blobs.
-	     */
-	    filter = false;
-	    /**
-	     * Permission to set immutability policy.
-	     */
-	    setImmutabilityPolicy = false;
-	    /**
-	     * Specifies that Permanent Delete is permitted.
-	     */
-	    permanentDelete = false;
-	    /**
-	     * Produces the SAS permissions string for an Azure Storage account.
-	     * Call this method to set AccountSASSignatureValues Permissions field.
-	     *
-	     * Using this method will guarantee the resource types are in
-	     * an order accepted by the service.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
-	     *
-	     */
-	    toString() {
-	        // The order of the characters should be as specified here to ensure correctness:
-	        // https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
-	        // Use a string array instead of string concatenating += operator for performance
-	        const permissions = [];
-	        if (this.read) {
-	            permissions.push("r");
-	        }
-	        if (this.write) {
-	            permissions.push("w");
-	        }
-	        if (this.delete) {
-	            permissions.push("d");
-	        }
-	        if (this.deleteVersion) {
-	            permissions.push("x");
-	        }
-	        if (this.filter) {
-	            permissions.push("f");
-	        }
-	        if (this.tag) {
-	            permissions.push("t");
-	        }
-	        if (this.list) {
-	            permissions.push("l");
-	        }
-	        if (this.add) {
-	            permissions.push("a");
-	        }
-	        if (this.create) {
-	            permissions.push("c");
-	        }
-	        if (this.update) {
-	            permissions.push("u");
-	        }
-	        if (this.process) {
-	            permissions.push("p");
-	        }
-	        if (this.setImmutabilityPolicy) {
-	            permissions.push("i");
-	        }
-	        if (this.permanentDelete) {
-	            permissions.push("y");
-	        }
-	        return permissions.join("");
-	    }
-	};
-	AccountSASPermissions.AccountSASPermissions = AccountSASPermissions$1;
-	
-	return AccountSASPermissions;
-}
-
-var AccountSASSignatureValues = {};
-
-var AccountSASResourceTypes = {};
-
-var hasRequiredAccountSASResourceTypes;
-
-function requireAccountSASResourceTypes () {
-	if (hasRequiredAccountSASResourceTypes) return AccountSASResourceTypes;
-	hasRequiredAccountSASResourceTypes = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AccountSASResourceTypes, "__esModule", { value: true });
-	AccountSASResourceTypes.AccountSASResourceTypes = void 0;
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * This is a helper class to construct a string representing the resources accessible by an AccountSAS. Setting a value
-	 * to true means that any SAS which uses these permissions will grant access to that resource type. Once all the
-	 * values are set, this should be serialized with toString and set as the resources field on an
-	 * {@link AccountSASSignatureValues} object. It is possible to construct the resources string without this class, but
-	 * the order of the resources is particular and this class guarantees correctness.
-	 */
-	let AccountSASResourceTypes$1 = class AccountSASResourceTypes {
-	    /**
-	     * Creates an {@link AccountSASResourceTypes} from the specified resource types string. This method will throw an
-	     * Error if it encounters a character that does not correspond to a valid resource type.
-	     *
-	     * @param resourceTypes -
-	     */
-	    static parse(resourceTypes) {
-	        const accountSASResourceTypes = new AccountSASResourceTypes();
-	        for (const c of resourceTypes) {
-	            switch (c) {
-	                case "s":
-	                    accountSASResourceTypes.service = true;
-	                    break;
-	                case "c":
-	                    accountSASResourceTypes.container = true;
-	                    break;
-	                case "o":
-	                    accountSASResourceTypes.object = true;
-	                    break;
-	                default:
-	                    throw new RangeError(`Invalid resource type: ${c}`);
-	            }
-	        }
-	        return accountSASResourceTypes;
-	    }
-	    /**
-	     * Permission to access service level APIs granted.
-	     */
-	    service = false;
-	    /**
-	     * Permission to access container level APIs (Blob Containers, Tables, Queues, File Shares) granted.
-	     */
-	    container = false;
-	    /**
-	     * Permission to access object level APIs (Blobs, Table Entities, Queue Messages, Files) granted.
-	     */
-	    object = false;
-	    /**
-	     * Converts the given resource types to a string.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
-	     *
-	     */
-	    toString() {
-	        const resourceTypes = [];
-	        if (this.service) {
-	            resourceTypes.push("s");
-	        }
-	        if (this.container) {
-	            resourceTypes.push("c");
-	        }
-	        if (this.object) {
-	            resourceTypes.push("o");
-	        }
-	        return resourceTypes.join("");
-	    }
-	};
-	AccountSASResourceTypes.AccountSASResourceTypes = AccountSASResourceTypes$1;
-	
-	return AccountSASResourceTypes;
-}
-
-var AccountSASServices = {};
-
-var hasRequiredAccountSASServices;
-
-function requireAccountSASServices () {
-	if (hasRequiredAccountSASServices) return AccountSASServices;
-	hasRequiredAccountSASServices = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AccountSASServices, "__esModule", { value: true });
-	AccountSASServices.AccountSASServices = void 0;
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * This is a helper class to construct a string representing the services accessible by an AccountSAS. Setting a value
-	 * to true means that any SAS which uses these permissions will grant access to that service. Once all the
-	 * values are set, this should be serialized with toString and set as the services field on an
-	 * {@link AccountSASSignatureValues} object. It is possible to construct the services string without this class, but
-	 * the order of the services is particular and this class guarantees correctness.
-	 */
-	let AccountSASServices$1 = class AccountSASServices {
-	    /**
-	     * Creates an {@link AccountSASServices} from the specified services string. This method will throw an
-	     * Error if it encounters a character that does not correspond to a valid service.
-	     *
-	     * @param services -
-	     */
-	    static parse(services) {
-	        const accountSASServices = new AccountSASServices();
-	        for (const c of services) {
-	            switch (c) {
-	                case "b":
-	                    accountSASServices.blob = true;
-	                    break;
-	                case "f":
-	                    accountSASServices.file = true;
-	                    break;
-	                case "q":
-	                    accountSASServices.queue = true;
-	                    break;
-	                case "t":
-	                    accountSASServices.table = true;
-	                    break;
-	                default:
-	                    throw new RangeError(`Invalid service character: ${c}`);
-	            }
-	        }
-	        return accountSASServices;
-	    }
-	    /**
-	     * Permission to access blob resources granted.
-	     */
-	    blob = false;
-	    /**
-	     * Permission to access file resources granted.
-	     */
-	    file = false;
-	    /**
-	     * Permission to access queue resources granted.
-	     */
-	    queue = false;
-	    /**
-	     * Permission to access table resources granted.
-	     */
-	    table = false;
-	    /**
-	     * Converts the given services to a string.
-	     *
-	     */
-	    toString() {
-	        const services = [];
-	        if (this.blob) {
-	            services.push("b");
-	        }
-	        if (this.table) {
-	            services.push("t");
-	        }
-	        if (this.queue) {
-	            services.push("q");
-	        }
-	        if (this.file) {
-	            services.push("f");
-	        }
-	        return services.join("");
-	    }
-	};
-	AccountSASServices.AccountSASServices = AccountSASServices$1;
-	
-	return AccountSASServices;
-}
-
-var hasRequiredAccountSASSignatureValues;
-
-function requireAccountSASSignatureValues () {
-	if (hasRequiredAccountSASSignatureValues) return AccountSASSignatureValues;
-	hasRequiredAccountSASSignatureValues = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(AccountSASSignatureValues, "__esModule", { value: true });
-	AccountSASSignatureValues.generateAccountSASQueryParameters = generateAccountSASQueryParameters;
-	AccountSASSignatureValues.generateAccountSASQueryParametersInternal = generateAccountSASQueryParametersInternal;
-	const AccountSASPermissions_js_1 = requireAccountSASPermissions();
-	const AccountSASResourceTypes_js_1 = requireAccountSASResourceTypes();
-	const AccountSASServices_js_1 = requireAccountSASServices();
-	const SasIPRange_js_1 = requireSasIPRange();
-	const SASQueryParameters_js_1 = requireSASQueryParameters();
-	const constants_js_1 = requireConstants$3();
-	const utils_common_js_1 = requireUtils_common$2();
-	/**
-	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
-	 *
-	 * Generates a {@link SASQueryParameters} object which contains all SAS query parameters needed to make an actual
-	 * REST request.
-	 *
-	 * @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
-	 *
-	 * @param accountSASSignatureValues -
-	 * @param sharedKeyCredential -
-	 */
-	function generateAccountSASQueryParameters(accountSASSignatureValues, sharedKeyCredential) {
-	    return generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential)
-	        .sasQueryParameters;
-	}
-	function generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential) {
-	    const version = accountSASSignatureValues.version
-	        ? accountSASSignatureValues.version
-	        : constants_js_1.SERVICE_VERSION;
-	    if (accountSASSignatureValues.permissions &&
-	        accountSASSignatureValues.permissions.setImmutabilityPolicy &&
-	        version < "2020-08-04") {
-	        throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission.");
-	    }
-	    if (accountSASSignatureValues.permissions &&
-	        accountSASSignatureValues.permissions.deleteVersion &&
-	        version < "2019-10-10") {
-	        throw RangeError("'version' must be >= '2019-10-10' when provided 'x' permission.");
-	    }
-	    if (accountSASSignatureValues.permissions &&
-	        accountSASSignatureValues.permissions.permanentDelete &&
-	        version < "2019-10-10") {
-	        throw RangeError("'version' must be >= '2019-10-10' when provided 'y' permission.");
-	    }
-	    if (accountSASSignatureValues.permissions &&
-	        accountSASSignatureValues.permissions.tag &&
-	        version < "2019-12-12") {
-	        throw RangeError("'version' must be >= '2019-12-12' when provided 't' permission.");
-	    }
-	    if (accountSASSignatureValues.permissions &&
-	        accountSASSignatureValues.permissions.filter &&
-	        version < "2019-12-12") {
-	        throw RangeError("'version' must be >= '2019-12-12' when provided 'f' permission.");
-	    }
-	    if (accountSASSignatureValues.encryptionScope && version < "2020-12-06") {
-	        throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS.");
-	    }
-	    const parsedPermissions = AccountSASPermissions_js_1.AccountSASPermissions.parse(accountSASSignatureValues.permissions.toString());
-	    const parsedServices = AccountSASServices_js_1.AccountSASServices.parse(accountSASSignatureValues.services).toString();
-	    const parsedResourceTypes = AccountSASResourceTypes_js_1.AccountSASResourceTypes.parse(accountSASSignatureValues.resourceTypes).toString();
-	    let stringToSign;
-	    if (version >= "2020-12-06") {
-	        stringToSign = [
-	            sharedKeyCredential.accountName,
-	            parsedPermissions,
-	            parsedServices,
-	            parsedResourceTypes,
-	            accountSASSignatureValues.startsOn
-	                ? (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.startsOn, false)
-	                : "",
-	            (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.expiresOn, false),
-	            accountSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(accountSASSignatureValues.ipRange) : "",
-	            accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",
-	            version,
-	            accountSASSignatureValues.encryptionScope ? accountSASSignatureValues.encryptionScope : "",
-	            "", // Account SAS requires an additional newline character
-	        ].join("\n");
-	    }
-	    else {
-	        stringToSign = [
-	            sharedKeyCredential.accountName,
-	            parsedPermissions,
-	            parsedServices,
-	            parsedResourceTypes,
-	            accountSASSignatureValues.startsOn
-	                ? (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.startsOn, false)
-	                : "",
-	            (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.expiresOn, false),
-	            accountSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(accountSASSignatureValues.ipRange) : "",
-	            accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",
-	            version,
-	            "", // Account SAS requires an additional newline character
-	        ].join("\n");
-	    }
-	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
-	    return {
-	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(version, signature, parsedPermissions.toString(), parsedServices, parsedResourceTypes, accountSASSignatureValues.protocol, accountSASSignatureValues.startsOn, accountSASSignatureValues.expiresOn, accountSASSignatureValues.ipRange, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, accountSASSignatureValues.encryptionScope),
-	        stringToSign: stringToSign,
-	    };
-	}
-	
-	return AccountSASSignatureValues;
-}
-
-var hasRequiredBlobServiceClient;
-
-function requireBlobServiceClient () {
-	if (hasRequiredBlobServiceClient) return BlobServiceClient;
-	hasRequiredBlobServiceClient = 1;
-	Object.defineProperty(BlobServiceClient, "__esModule", { value: true });
-	BlobServiceClient.BlobServiceClient = void 0;
-	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
-	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
-	const Pipeline_js_1 = requirePipeline();
-	const ContainerClient_js_1 = requireContainerClient();
-	const utils_common_js_1 = requireUtils_common$2();
-	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
-	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
-	const utils_common_js_2 = requireUtils_common$2();
-	const tracing_js_1 = requireTracing();
-	const BlobBatchClient_js_1 = requireBlobBatchClient();
-	const StorageClient_js_1 = requireStorageClient();
-	const AccountSASPermissions_js_1 = requireAccountSASPermissions();
-	const AccountSASSignatureValues_js_1 = requireAccountSASSignatureValues();
-	const AccountSASServices_js_1 = requireAccountSASServices();
-	/**
-	 * A BlobServiceClient represents a Client to the Azure Storage Blob service allowing you
-	 * to manipulate blob containers.
-	 */
-	let BlobServiceClient$1 = class BlobServiceClient extends StorageClient_js_1.StorageClient {
-	    /**
-	     * serviceContext provided by protocol layer.
-	     */
-	    serviceContext;
-	    /**
-	     *
-	     * Creates an instance of BlobServiceClient from connection string.
-	     *
-	     * @param connectionString - Account connection string or a SAS connection string of an Azure storage account.
-	     *                                  [ Note - Account connection string can only be used in NODE.JS runtime. ]
-	     *                                  Account connection string example -
-	     *                                  `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`
-	     *                                  SAS connection string example -
-	     *                                  `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`
-	     * @param options - Optional. Options to configure the HTTP pipeline.
-	     */
-	    static fromConnectionString(connectionString, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        options = options || {};
-	        const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(connectionString);
-	        if (extractedCreds.kind === "AccountConnString") {
-	            if (core_util_1.isNodeLike) {
-	                const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
-	                if (!options.proxyOptions) {
-	                    options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
-	                }
-	                const pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
-	                return new BlobServiceClient(extractedCreds.url, pipeline);
-	            }
-	            else {
-	                throw new Error("Account connection string is only supported in Node.js environment");
-	            }
-	        }
-	        else if (extractedCreds.kind === "SASConnString") {
-	            const pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	            return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline);
-	        }
-	        else {
-	            throw new Error("Connection string must be either an Account connection string or a SAS connection string");
-	        }
-	    }
-	    constructor(url, credentialOrPipeline, 
-	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
-	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
-	    options) {
-	        let pipeline;
-	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipeline)) {
-	            pipeline = credentialOrPipeline;
-	        }
-	        else if ((core_util_1.isNodeLike && credentialOrPipeline instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
-	            credentialOrPipeline instanceof AnonymousCredential_js_1.AnonymousCredential ||
-	            (0, core_auth_1.isTokenCredential)(credentialOrPipeline)) {
-	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipeline, options);
-	        }
-	        else {
-	            // The second parameter is undefined. Use anonymous credential
-	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
-	        }
-	        super(url, pipeline);
-	        this.serviceContext = this.storageClientContext.service;
-	    }
-	    /**
-	     * Creates a {@link ContainerClient} object
-	     *
-	     * @param containerName - A container name
-	     * @returns A new ContainerClient object for the given container name.
-	     *
-	     * Example usage:
-	     *
-	     * ```ts snippet:BlobServiceClientGetContainerClient
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * const containerClient = blobServiceClient.getContainerClient("");
-	     * ```
-	     */
-	    getContainerClient(containerName) {
-	        return new ContainerClient_js_1.ContainerClient((0, utils_common_js_1.appendToURLPath)(this.url, encodeURIComponent(containerName)), this.pipeline);
-	    }
-	    /**
-	     * Create a Blob container. @see https://learn.microsoft.com/rest/api/storageservices/create-container
-	     *
-	     * @param containerName - Name of the container to create.
-	     * @param options - Options to configure Container Create operation.
-	     * @returns Container creation response and the corresponding container client.
-	     */
-	    async createContainer(containerName, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-createContainer", options, async (updatedOptions) => {
-	            const containerClient = this.getContainerClient(containerName);
-	            const containerCreateResponse = await containerClient.create(updatedOptions);
-	            return {
-	                containerClient,
-	                containerCreateResponse,
-	            };
-	        });
-	    }
-	    /**
-	     * Deletes a Blob container.
-	     *
-	     * @param containerName - Name of the container to delete.
-	     * @param options - Options to configure Container Delete operation.
-	     * @returns Container deletion response.
-	     */
-	    async deleteContainer(containerName, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-deleteContainer", options, async (updatedOptions) => {
-	            const containerClient = this.getContainerClient(containerName);
-	            return containerClient.delete(updatedOptions);
-	        });
-	    }
-	    /**
-	     * Restore a previously deleted Blob container.
-	     * This API is only functional if Container Soft Delete is enabled for the storage account associated with the container.
-	     *
-	     * @param deletedContainerName - Name of the previously deleted container.
-	     * @param deletedContainerVersion - Version of the previously deleted container, used to uniquely identify the deleted container.
-	     * @param options - Options to configure Container Restore operation.
-	     * @returns Container deletion response.
-	     */
-	    async undeleteContainer(deletedContainerName, deletedContainerVersion, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-undeleteContainer", options, async (updatedOptions) => {
-	            const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName);
-	            // Hack to access a protected member.
-	            const containerContext = containerClient["storageClientContext"].container;
-	            const containerUndeleteResponse = (0, utils_common_js_2.assertResponse)(await containerContext.restore({
-	                deletedContainerName,
-	                deletedContainerVersion,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            return { containerClient, containerUndeleteResponse };
-	        });
-	    }
-	    /**
-	     * Gets the properties of a storage account’s Blob service, including properties
-	     * for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-properties
-	     *
-	     * @param options - Options to the Service Get Properties operation.
-	     * @returns Response data for the Service Get Properties operation.
-	     */
-	    async getProperties(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getProperties", options, async (updatedOptions) => {
-	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.getProperties({
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Sets properties for a storage account’s Blob service endpoint, including properties
-	     * for Storage Analytics, CORS (Cross-Origin Resource Sharing) rules and soft delete settings.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-service-properties
-	     *
-	     * @param properties -
-	     * @param options - Options to the Service Set Properties operation.
-	     * @returns Response data for the Service Set Properties operation.
-	     */
-	    async setProperties(properties, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-setProperties", options, async (updatedOptions) => {
-	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.setProperties(properties, {
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Retrieves statistics related to replication for the Blob service. It is only
-	     * available on the secondary location endpoint when read-access geo-redundant
-	     * replication is enabled for the storage account.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-stats
-	     *
-	     * @param options - Options to the Service Get Statistics operation.
-	     * @returns Response data for the Service Get Statistics operation.
-	     */
-	    async getStatistics(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getStatistics", options, async (updatedOptions) => {
-	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.getStatistics({
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The Get Account Information operation returns the sku name and account kind
-	     * for the specified account.
-	     * The Get Account Information operation is available on service versions beginning
-	     * with version 2018-03-28.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
-	     *
-	     * @param options - Options to the Service Get Account Info operation.
-	     * @returns Response data for the Service Get Account Info operation.
-	     */
-	    async getAccountInfo(options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getAccountInfo", options, async (updatedOptions) => {
-	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.getAccountInfo({
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * Returns a list of the containers under the specified account.
-	     * @see https://learn.microsoft.com/rest/api/storageservices/list-containers2
-	     *
-	     * @param marker - A string value that identifies the portion of
-	     *                        the list of containers to be returned with the next listing operation. The
-	     *                        operation returns the continuationToken value within the response body if the
-	     *                        listing operation did not return all containers remaining to be listed
-	     *                        with the current page. The continuationToken value can be used as the value for
-	     *                        the marker parameter in a subsequent call to request the next page of list
-	     *                        items. The marker value is opaque to the client.
-	     * @param options - Options to the Service List Container Segment operation.
-	     * @returns Response data for the Service List Container Segment operation.
-	     */
-	    async listContainersSegment(marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-listContainersSegment", options, async (updatedOptions) => {
-	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.listContainersSegment({
-	                abortSignal: options.abortSignal,
-	                marker,
-	                ...options,
-	                include: typeof options.include === "string" ? [options.include] : options.include,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	        });
-	    }
-	    /**
-	     * The Filter Blobs operation enables callers to list blobs across all containers whose tags
-	     * match a given search expression. Filter blobs searches across all containers within a
-	     * storage account but can be scoped within the expression to a single container.
-	     *
-	     * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                        The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                        The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                        however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param marker - A string value that identifies the portion of
-	     *                          the list of blobs to be returned with the next listing operation. The
-	     *                          operation returns the continuationToken value within the response body if the
-	     *                          listing operation did not return all blobs remaining to be listed
-	     *                          with the current page. The continuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of list
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to find blobs by tags.
-	     */
-	    async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-findBlobsByTagsSegment", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_2.assertResponse)(await this.serviceContext.filterBlobs({
-	                abortSignal: options.abortSignal,
-	                where: tagFilterSqlExpression,
-	                marker,
-	                maxPageSize: options.maxPageSize,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const wrappedResponse = {
-	                ...response,
-	                _response: response._response, // _response is made non-enumerable
-	                blobs: response.blobs.map((blob) => {
-	                    let tagValue = "";
-	                    if (blob.tags?.blobTagSet.length === 1) {
-	                        tagValue = blob.tags.blobTagSet[0].value;
-	                    }
-	                    return { ...blob, tags: (0, utils_common_js_1.toTags)(blob.tags), tagValue };
-	                }),
-	            };
-	            return wrappedResponse;
-	        });
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for ServiceFindBlobsByTagsSegmentResponse.
-	     *
-	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param marker - A string value that identifies the portion of
-	     *                          the list of blobs to be returned with the next listing operation. The
-	     *                          operation returns the continuationToken value within the response body if the
-	     *                          listing operation did not return all blobs remaining to be listed
-	     *                          with the current page. The continuationToken value can be used as the value for
-	     *                          the marker parameter in a subsequent call to request the next page of list
-	     *                          items. The marker value is opaque to the client.
-	     * @param options - Options to find blobs by tags.
-	     */
-	    async *findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
-	        let response;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                response = await this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options);
-	                response.blobs = response.blobs || [];
-	                marker = response.continuationToken;
-	                yield response;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for blobs.
-	     *
-	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param options - Options to findBlobsByTagsItems.
-	     */
-	    async *findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
-	        let marker;
-	        for await (const segment of this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)) {
-	            yield* segment.blobs;
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to find all blobs with specified tag
-	     * under the specified account.
-	     *
-	     * .byPage() returns an async iterable iterator to list the blobs in pages.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-properties
-	     *
-	     * ```ts snippet:BlobServiceClientFindBlobsByTags
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * // Use for await to iterate the blobs
-	     * let i = 1;
-	     * for await (const blob of blobServiceClient.findBlobsByTags("tagkey='tagvalue'")) {
-	     *   console.log(`Blob ${i++}: ${blob.name}`);
-	     * }
-	     *
-	     * // Use iter.next() to iterate the blobs
-	     * i = 1;
-	     * const iter = blobServiceClient.findBlobsByTags("tagkey='tagvalue'");
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   console.log(`Blob ${i++}: ${value.name}`);
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Use byPage() to iterate the blobs
-	     * i = 1;
-	     * for await (const page of blobServiceClient
-	     *   .findBlobsByTags("tagkey='tagvalue'")
-	     *   .byPage({ maxPageSize: 20 })) {
-	     *   for (const blob of page.blobs) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Use paging with a marker
-	     * i = 1;
-	     * let iterator = blobServiceClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     * // Prints 2 blob names
-	     * if (response.blobs) {
-	     *   for (const blob of response.blobs) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = blobServiceClient
-	     *   .findBlobsByTags("tagkey='tagvalue'")
-	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     *
-	     * // Prints blob names
-	     * if (response.blobs) {
-	     *   for (const blob of response.blobs) {
-	     *     console.log(`Blob ${i++}: ${blob.name}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
-	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
-	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
-	     * @param options - Options to find blobs by tags.
-	     */
-	    findBlobsByTags(tagFilterSqlExpression, options = {}) {
-	        // AsyncIterableIterator to iterate over blobs
-	        const listSegmentOptions = {
-	            ...options,
-	        };
-	        const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...listSegmentOptions,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for ServiceListContainersSegmentResponses
-	     *
-	     * @param marker - A string value that identifies the portion of
-	     *                        the list of containers to be returned with the next listing operation. The
-	     *                        operation returns the continuationToken value within the response body if the
-	     *                        listing operation did not return all containers remaining to be listed
-	     *                        with the current page. The continuationToken value can be used as the value for
-	     *                        the marker parameter in a subsequent call to request the next page of list
-	     *                        items. The marker value is opaque to the client.
-	     * @param options - Options to list containers operation.
-	     */
-	    async *listSegments(marker, options = {}) {
-	        let listContainersSegmentResponse;
-	        if (!!marker || marker === undefined) {
-	            do {
-	                listContainersSegmentResponse = await this.listContainersSegment(marker, options);
-	                listContainersSegmentResponse.containerItems =
-	                    listContainersSegmentResponse.containerItems || [];
-	                marker = listContainersSegmentResponse.continuationToken;
-	                yield await listContainersSegmentResponse;
-	            } while (marker);
-	        }
-	    }
-	    /**
-	     * Returns an AsyncIterableIterator for Container Items
-	     *
-	     * @param options - Options to list containers operation.
-	     */
-	    async *listItems(options = {}) {
-	        let marker;
-	        for await (const segment of this.listSegments(marker, options)) {
-	            yield* segment.containerItems;
-	        }
-	    }
-	    /**
-	     * Returns an async iterable iterator to list all the containers
-	     * under the specified account.
-	     *
-	     * .byPage() returns an async iterable iterator to list the containers in pages.
-	     *
-	     * ```ts snippet:BlobServiceClientListContainers
-	     * import { BlobServiceClient } from "@azure/storage-blob";
-	     * import { DefaultAzureCredential } from "@azure/identity";
-	     *
-	     * const account = "";
-	     * const blobServiceClient = new BlobServiceClient(
-	     *   `https://${account}.blob.core.windows.net`,
-	     *   new DefaultAzureCredential(),
-	     * );
-	     *
-	     * // Use for await to iterate the containers
-	     * let i = 1;
-	     * for await (const container of blobServiceClient.listContainers()) {
-	     *   console.log(`Container ${i++}: ${container.name}`);
-	     * }
-	     *
-	     * // Use iter.next() to iterate the containers
-	     * i = 1;
-	     * const iter = blobServiceClient.listContainers();
-	     * let { value, done } = await iter.next();
-	     * while (!done) {
-	     *   console.log(`Container ${i++}: ${value.name}`);
-	     *   ({ value, done } = await iter.next());
-	     * }
-	     *
-	     * // Use byPage() to iterate the containers
-	     * i = 1;
-	     * for await (const page of blobServiceClient.listContainers().byPage({ maxPageSize: 20 })) {
-	     *   for (const container of page.containerItems) {
-	     *     console.log(`Container ${i++}: ${container.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Use paging with a marker
-	     * i = 1;
-	     * let iterator = blobServiceClient.listContainers().byPage({ maxPageSize: 2 });
-	     * let response = (await iterator.next()).value;
-	     *
-	     * // Prints 2 container names
-	     * if (response.containerItems) {
-	     *   for (const container of response.containerItems) {
-	     *     console.log(`Container ${i++}: ${container.name}`);
-	     *   }
-	     * }
-	     *
-	     * // Gets next marker
-	     * let marker = response.continuationToken;
-	     * // Passing next marker as continuationToken
-	     * iterator = blobServiceClient
-	     *   .listContainers()
-	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
-	     * response = (await iterator.next()).value;
-	     *
-	     * // Prints 10 container names
-	     * if (response.containerItems) {
-	     *   for (const container of response.containerItems) {
-	     *     console.log(`Container ${i++}: ${container.name}`);
-	     *   }
-	     * }
-	     * ```
-	     *
-	     * @param options - Options to list containers.
-	     * @returns An asyncIterableIterator that supports paging.
-	     */
-	    listContainers(options = {}) {
-	        if (options.prefix === "") {
-	            options.prefix = undefined;
-	        }
-	        const include = [];
-	        if (options.includeDeleted) {
-	            include.push("deleted");
-	        }
-	        if (options.includeMetadata) {
-	            include.push("metadata");
-	        }
-	        if (options.includeSystem) {
-	            include.push("system");
-	        }
-	        // AsyncIterableIterator to iterate over containers
-	        const listSegmentOptions = {
-	            ...options,
-	            ...(include.length > 0 ? { include } : {}),
-	        };
-	        const iter = this.listItems(listSegmentOptions);
-	        return {
-	            /**
-	             * The next method, part of the iteration protocol
-	             */
-	            next() {
-	                return iter.next();
-	            },
-	            /**
-	             * The connection to the async iterator, part of the iteration protocol
-	             */
-	            [Symbol.asyncIterator]() {
-	                return this;
-	            },
-	            /**
-	             * Return an AsyncIterableIterator that works a page at a time
-	             */
-	            byPage: (settings = {}) => {
-	                return this.listSegments(settings.continuationToken, {
-	                    maxPageSize: settings.maxPageSize,
-	                    ...listSegmentOptions,
-	                });
-	            },
-	        };
-	    }
-	    /**
-	     * ONLY AVAILABLE WHEN USING BEARER TOKEN AUTHENTICATION (TokenCredential).
-	     *
-	     * Retrieves a user delegation key for the Blob service. This is only a valid operation when using
-	     * bearer token authentication.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/get-user-delegation-key
-	     *
-	     * @param startsOn -      The start time for the user delegation SAS. Must be within 7 days of the current time
-	     * @param expiresOn -     The end time for the user delegation SAS. Must be within 7 days of the current time
-	     */
-	    async getUserDelegationKey(startsOn, expiresOn, options = {}) {
-	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getUserDelegationKey", options, async (updatedOptions) => {
-	            const response = (0, utils_common_js_2.assertResponse)(await this.serviceContext.getUserDelegationKey({
-	                startsOn: (0, utils_common_js_2.truncatedISO8061Date)(startsOn, false),
-	                expiresOn: (0, utils_common_js_2.truncatedISO8061Date)(expiresOn, false),
-	            }, {
-	                abortSignal: options.abortSignal,
-	                tracingOptions: updatedOptions.tracingOptions,
-	            }));
-	            const userDelegationKey = {
-	                signedObjectId: response.signedObjectId,
-	                signedTenantId: response.signedTenantId,
-	                signedStartsOn: new Date(response.signedStartsOn),
-	                signedExpiresOn: new Date(response.signedExpiresOn),
-	                signedService: response.signedService,
-	                signedVersion: response.signedVersion,
-	                value: response.value,
-	            };
-	            const res = {
-	                _response: response._response,
-	                requestId: response.requestId,
-	                clientRequestId: response.clientRequestId,
-	                version: response.version,
-	                date: response.date,
-	                errorCode: response.errorCode,
-	                ...userDelegationKey,
-	            };
-	            return res;
-	        });
-	    }
-	    /**
-	     * Creates a BlobBatchClient object to conduct batch operations.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
-	     *
-	     * @returns A new BlobBatchClient object for this service.
-	     */
-	    getBlobBatchClient() {
-	        return new BlobBatchClient_js_1.BlobBatchClient(this.url, this.pipeline);
-	    }
-	    /**
-	     * Only available for BlobServiceClient constructed with a shared key credential.
-	     *
-	     * Generates a Blob account Shared Access Signature (SAS) URI based on the client properties
-	     * and parameters passed in. The SAS is signed by the shared key credential of the client.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/create-account-sas
-	     *
-	     * @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
-	     * @param permissions - Specifies the list of permissions to be associated with the SAS.
-	     * @param resourceTypes - Specifies the resource types associated with the shared access signature.
-	     * @param options - Optional parameters.
-	     * @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateAccountSasUrl(expiresOn, permissions = AccountSASPermissions_js_1.AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
-	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
-	            throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
-	        }
-	        if (expiresOn === undefined) {
-	            const now = new Date();
-	            expiresOn = new Date(now.getTime() + 3600 * 1000);
-	        }
-	        const sas = (0, AccountSASSignatureValues_js_1.generateAccountSASQueryParameters)({
-	            permissions,
-	            expiresOn,
-	            resourceTypes,
-	            services: AccountSASServices_js_1.AccountSASServices.parse("b").toString(),
-	            ...options,
-	        }, this.credential).toString();
-	        return (0, utils_common_js_1.appendToURLQuery)(this.url, sas);
-	    }
-	    /**
-	     * Only available for BlobServiceClient constructed with a shared key credential.
-	     *
-	     * Generates string to sign for a Blob account Shared Access Signature (SAS) URI based on
-	     * the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
-	     *
-	     * @see https://learn.microsoft.com/rest/api/storageservices/create-account-sas
-	     *
-	     * @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
-	     * @param permissions - Specifies the list of permissions to be associated with the SAS.
-	     * @param resourceTypes - Specifies the resource types associated with the shared access signature.
-	     * @param options - Optional parameters.
-	     * @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
-	     */
-	    generateSasStringToSign(expiresOn, permissions = AccountSASPermissions_js_1.AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
-	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
-	            throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
-	        }
-	        if (expiresOn === undefined) {
-	            const now = new Date();
-	            expiresOn = new Date(now.getTime() + 3600 * 1000);
-	        }
-	        return (0, AccountSASSignatureValues_js_1.generateAccountSASQueryParametersInternal)({
-	            permissions,
-	            expiresOn,
-	            resourceTypes,
-	            services: AccountSASServices_js_1.AccountSASServices.parse("b").toString(),
-	            ...options,
-	        }, this.credential).stringToSign;
-	    }
-	};
-	BlobServiceClient.BlobServiceClient = BlobServiceClient$1;
-	
-	return BlobServiceClient;
-}
-
-var BatchResponse = {};
-
-var hasRequiredBatchResponse;
-
-function requireBatchResponse () {
-	if (hasRequiredBatchResponse) return BatchResponse;
-	hasRequiredBatchResponse = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(BatchResponse, "__esModule", { value: true });
-	
-	return BatchResponse;
-}
-
-var generatedModels = {};
-
-var hasRequiredGeneratedModels;
-
-function requireGeneratedModels () {
-	if (hasRequiredGeneratedModels) return generatedModels;
-	hasRequiredGeneratedModels = 1;
-	// Copyright (c) Microsoft Corporation.
-	// Licensed under the MIT License.
-	Object.defineProperty(generatedModels, "__esModule", { value: true });
-	generatedModels.KnownEncryptionAlgorithmType = void 0;
-	/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */
-	var KnownEncryptionAlgorithmType;
-	(function (KnownEncryptionAlgorithmType) {
-	    KnownEncryptionAlgorithmType["AES256"] = "AES256";
-	})(KnownEncryptionAlgorithmType || (generatedModels.KnownEncryptionAlgorithmType = KnownEncryptionAlgorithmType = {}));
-	
-	return generatedModels;
-}
-
-var hasRequiredCommonjs;
-
-function requireCommonjs () {
-	if (hasRequiredCommonjs) return commonjs$e;
-	hasRequiredCommonjs = 1;
-	(function (exports$1) {
-		// Copyright (c) Microsoft Corporation.
-		// Licensed under the MIT License.
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.logger = exports$1.RestError = exports$1.BaseRequestPolicy = exports$1.StorageOAuthScopes = exports$1.newPipeline = exports$1.isPipelineLike = exports$1.Pipeline = exports$1.getBlobServiceAccountAudience = exports$1.StorageBlobAudience = exports$1.PremiumPageBlobTier = exports$1.BlockBlobTier = exports$1.generateBlobSASQueryParameters = exports$1.generateAccountSASQueryParameters = void 0;
-		const tslib_1 = require$$0$2;
-		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
-		Object.defineProperty(exports$1, "RestError", { enumerable: true, get: function () { return core_rest_pipeline_1.RestError; } });
-		tslib_1.__exportStar(requireBlobServiceClient(), exports$1);
-		tslib_1.__exportStar(requireClients(), exports$1);
-		tslib_1.__exportStar(requireContainerClient(), exports$1);
-		tslib_1.__exportStar(requireBlobLeaseClient(), exports$1);
-		tslib_1.__exportStar(requireAccountSASPermissions(), exports$1);
-		tslib_1.__exportStar(requireAccountSASResourceTypes(), exports$1);
-		tslib_1.__exportStar(requireAccountSASServices(), exports$1);
-		var AccountSASSignatureValues_js_1 = requireAccountSASSignatureValues();
-		Object.defineProperty(exports$1, "generateAccountSASQueryParameters", { enumerable: true, get: function () { return AccountSASSignatureValues_js_1.generateAccountSASQueryParameters; } });
-		tslib_1.__exportStar(requireBlobBatch(), exports$1);
-		tslib_1.__exportStar(requireBlobBatchClient(), exports$1);
-		tslib_1.__exportStar(requireBatchResponse(), exports$1);
-		tslib_1.__exportStar(requireBlobSASPermissions(), exports$1);
-		var BlobSASSignatureValues_js_1 = requireBlobSASSignatureValues();
-		Object.defineProperty(exports$1, "generateBlobSASQueryParameters", { enumerable: true, get: function () { return BlobSASSignatureValues_js_1.generateBlobSASQueryParameters; } });
-		tslib_1.__exportStar(requireStorageBrowserPolicyFactory(), exports$1);
-		tslib_1.__exportStar(requireContainerSASPermissions(), exports$1);
-		tslib_1.__exportStar(requireAnonymousCredential$1(), exports$1);
-		tslib_1.__exportStar(requireCredential$1(), exports$1);
-		tslib_1.__exportStar(requireStorageSharedKeyCredential$1(), exports$1);
-		var models_js_1 = requireModels();
-		Object.defineProperty(exports$1, "BlockBlobTier", { enumerable: true, get: function () { return models_js_1.BlockBlobTier; } });
-		Object.defineProperty(exports$1, "PremiumPageBlobTier", { enumerable: true, get: function () { return models_js_1.PremiumPageBlobTier; } });
-		Object.defineProperty(exports$1, "StorageBlobAudience", { enumerable: true, get: function () { return models_js_1.StorageBlobAudience; } });
-		Object.defineProperty(exports$1, "getBlobServiceAccountAudience", { enumerable: true, get: function () { return models_js_1.getBlobServiceAccountAudience; } });
-		var Pipeline_js_1 = requirePipeline();
-		Object.defineProperty(exports$1, "Pipeline", { enumerable: true, get: function () { return Pipeline_js_1.Pipeline; } });
-		Object.defineProperty(exports$1, "isPipelineLike", { enumerable: true, get: function () { return Pipeline_js_1.isPipelineLike; } });
-		Object.defineProperty(exports$1, "newPipeline", { enumerable: true, get: function () { return Pipeline_js_1.newPipeline; } });
-		Object.defineProperty(exports$1, "StorageOAuthScopes", { enumerable: true, get: function () { return Pipeline_js_1.StorageOAuthScopes; } });
-		tslib_1.__exportStar(requireStorageRetryPolicyFactory$1(), exports$1);
-		var RequestPolicy_js_1 = requireRequestPolicy$1();
-		Object.defineProperty(exports$1, "BaseRequestPolicy", { enumerable: true, get: function () { return RequestPolicy_js_1.BaseRequestPolicy; } });
-		tslib_1.__exportStar(requireAnonymousCredentialPolicy$1(), exports$1);
-		tslib_1.__exportStar(requireCredentialPolicy$1(), exports$1);
-		tslib_1.__exportStar(requireStorageRetryPolicyFactory$1(), exports$1);
-		tslib_1.__exportStar(requireStorageSharedKeyCredentialPolicy$1(), exports$1);
-		tslib_1.__exportStar(requireSASQueryParameters(), exports$1);
-		tslib_1.__exportStar(requireGeneratedModels(), exports$1);
-		var log_js_1 = requireLog$1();
-		Object.defineProperty(exports$1, "logger", { enumerable: true, get: function () { return log_js_1.logger; } });
-		
-	} (commonjs$e));
-	return commonjs$e;
-}
-
-var errors = {};
-
-var hasRequiredErrors;
-
-function requireErrors () {
-	if (hasRequiredErrors) return errors;
-	hasRequiredErrors = 1;
-	Object.defineProperty(errors, "__esModule", { value: true });
-	errors.UsageError = errors.NetworkError = errors.GHESNotSupportedError = errors.CacheNotFoundError = errors.InvalidResponseError = errors.FilesNotFoundError = void 0;
-	class FilesNotFoundError extends Error {
-	    constructor(files = []) {
-	        let message = 'No files were found to upload';
-	        if (files.length > 0) {
-	            message += `: ${files.join(', ')}`;
-	        }
-	        super(message);
-	        this.files = files;
-	        this.name = 'FilesNotFoundError';
-	    }
-	}
-	errors.FilesNotFoundError = FilesNotFoundError;
-	class InvalidResponseError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = 'InvalidResponseError';
-	    }
-	}
-	errors.InvalidResponseError = InvalidResponseError;
-	class CacheNotFoundError extends Error {
-	    constructor(message = 'Cache not found') {
-	        super(message);
-	        this.name = 'CacheNotFoundError';
-	    }
-	}
-	errors.CacheNotFoundError = CacheNotFoundError;
-	class GHESNotSupportedError extends Error {
-	    constructor(message = '@actions/cache v4.1.4+, actions/cache/save@v4+ and actions/cache/restore@v4+ are not currently supported on GHES.') {
-	        super(message);
-	        this.name = 'GHESNotSupportedError';
-	    }
-	}
-	errors.GHESNotSupportedError = GHESNotSupportedError;
-	class NetworkError extends Error {
-	    constructor(code) {
-	        const message = `Unable to make request: ${code}\nIf you are using self-hosted runners, please make sure your runner has access to all GitHub endpoints: https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#communication-between-self-hosted-runners-and-github`;
-	        super(message);
-	        this.code = code;
-	        this.name = 'NetworkError';
-	    }
-	}
-	errors.NetworkError = NetworkError;
-	NetworkError.isNetworkErrorCode = (code) => {
-	    if (!code)
-	        return false;
-	    return [
-	        'ECONNRESET',
-	        'ENOTFOUND',
-	        'ETIMEDOUT',
-	        'ECONNREFUSED',
-	        'EHOSTUNREACH'
-	    ].includes(code);
-	};
-	class UsageError extends Error {
-	    constructor() {
-	        const message = `Cache storage quota has been hit. Unable to upload any new cache entries. Usage is recalculated every 6-12 hours.\nMore info on storage limits: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#calculating-minute-and-storage-spending`;
-	        super(message);
-	        this.name = 'UsageError';
-	    }
-	}
-	errors.UsageError = UsageError;
-	UsageError.isUsageErrorMessage = (msg) => {
-	    if (!msg)
-	        return false;
-	    return msg.includes('insufficient usage');
-	};
-	
-	return errors;
-}
-
-var hasRequiredUploadUtils;
-
-function requireUploadUtils () {
-	if (hasRequiredUploadUtils) return uploadUtils;
-	hasRequiredUploadUtils = 1;
-	var __createBinding = (uploadUtils && uploadUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (uploadUtils && uploadUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (uploadUtils && uploadUtils.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (uploadUtils && uploadUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(uploadUtils, "__esModule", { value: true });
-	uploadUtils.UploadProgress = void 0;
-	uploadUtils.uploadCacheArchiveSDK = uploadCacheArchiveSDK;
-	const core = __importStar(requireCore$2());
-	const storage_blob_1 = /*@__PURE__*/ requireCommonjs();
-	const errors_1 = requireErrors();
-	/**
-	 * Class for tracking the upload state and displaying stats.
-	 */
-	class UploadProgress {
-	    constructor(contentLength) {
-	        this.contentLength = contentLength;
-	        this.sentBytes = 0;
-	        this.displayedComplete = false;
-	        this.startTime = Date.now();
-	    }
-	    /**
-	     * Sets the number of bytes sent
-	     *
-	     * @param sentBytes the number of bytes sent
-	     */
-	    setSentBytes(sentBytes) {
-	        this.sentBytes = sentBytes;
-	    }
-	    /**
-	     * Returns the total number of bytes transferred.
-	     */
-	    getTransferredBytes() {
-	        return this.sentBytes;
-	    }
-	    /**
-	     * Returns true if the upload is complete.
-	     */
-	    isDone() {
-	        return this.getTransferredBytes() === this.contentLength;
-	    }
-	    /**
-	     * Prints the current upload stats. Once the upload completes, this will print one
-	     * last line and then stop.
-	     */
-	    display() {
-	        if (this.displayedComplete) {
-	            return;
-	        }
-	        const transferredBytes = this.sentBytes;
-	        const percentage = (100 * (transferredBytes / this.contentLength)).toFixed(1);
-	        const elapsedTime = Date.now() - this.startTime;
-	        const uploadSpeed = (transferredBytes /
-	            (1024 * 1024) /
-	            (elapsedTime / 1000)).toFixed(1);
-	        core.info(`Sent ${transferredBytes} of ${this.contentLength} (${percentage}%), ${uploadSpeed} MBs/sec`);
-	        if (this.isDone()) {
-	            this.displayedComplete = true;
-	        }
-	    }
-	    /**
-	     * Returns a function used to handle TransferProgressEvents.
-	     */
-	    onProgress() {
-	        return (progress) => {
-	            this.setSentBytes(progress.loadedBytes);
-	        };
-	    }
-	    /**
-	     * Starts the timer that displays the stats.
-	     *
-	     * @param delayInMs the delay between each write
-	     */
-	    startDisplayTimer(delayInMs = 1000) {
-	        const displayCallback = () => {
-	            this.display();
-	            if (!this.isDone()) {
-	                this.timeoutHandle = setTimeout(displayCallback, delayInMs);
-	            }
-	        };
-	        this.timeoutHandle = setTimeout(displayCallback, delayInMs);
-	    }
-	    /**
-	     * Stops the timer that displays the stats. As this typically indicates the upload
-	     * is complete, this will display one last line, unless the last line has already
-	     * been written.
-	     */
-	    stopDisplayTimer() {
-	        if (this.timeoutHandle) {
-	            clearTimeout(this.timeoutHandle);
-	            this.timeoutHandle = undefined;
-	        }
-	        this.display();
-	    }
-	}
-	uploadUtils.UploadProgress = UploadProgress;
-	/**
-	 * Uploads a cache archive directly to Azure Blob Storage using the Azure SDK.
-	 * This function will display progress information to the console. Concurrency of the
-	 * upload is determined by the calling functions.
-	 *
-	 * @param signedUploadURL
-	 * @param archivePath
-	 * @param options
-	 * @returns
-	 */
-	function uploadCacheArchiveSDK(signedUploadURL, archivePath, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        var _a;
-	        const blobClient = new storage_blob_1.BlobClient(signedUploadURL);
-	        const blockBlobClient = blobClient.getBlockBlobClient();
-	        const uploadProgress = new UploadProgress((_a = options === null || options === void 0 ? void 0 : options.archiveSizeBytes) !== null && _a !== void 0 ? _a : 0);
-	        // Specify data transfer options
-	        const uploadOptions = {
-	            blockSize: options === null || options === void 0 ? void 0 : options.uploadChunkSize,
-	            concurrency: options === null || options === void 0 ? void 0 : options.uploadConcurrency, // maximum number of parallel transfer workers
-	            maxSingleShotSize: 128 * 1024 * 1024, // 128 MiB initial transfer size
-	            onProgress: uploadProgress.onProgress()
-	        };
-	        try {
-	            uploadProgress.startDisplayTimer();
-	            core.debug(`BlobClient: ${blobClient.name}:${blobClient.accountName}:${blobClient.containerName}`);
-	            const response = yield blockBlobClient.uploadFile(archivePath, uploadOptions);
-	            // TODO: better management of non-retryable errors
-	            if (response._response.status >= 400) {
-	                throw new errors_1.InvalidResponseError(`uploadCacheArchiveSDK: upload failed with status code ${response._response.status}`);
-	            }
-	            return response;
-	        }
-	        catch (error) {
-	            core.warning(`uploadCacheArchiveSDK: internal error uploading cache archive: ${error.message}`);
-	            throw error;
-	        }
-	        finally {
-	            uploadProgress.stopDisplayTimer();
-	        }
-	    });
-	}
-	
-	return uploadUtils;
-}
-
-var downloadUtils = {};
-
-var requestUtils = {};
-
-var hasRequiredRequestUtils;
-
-function requireRequestUtils () {
-	if (hasRequiredRequestUtils) return requestUtils;
-	hasRequiredRequestUtils = 1;
-	var __createBinding = (requestUtils && requestUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (requestUtils && requestUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (requestUtils && requestUtils.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (requestUtils && requestUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(requestUtils, "__esModule", { value: true });
-	requestUtils.isSuccessStatusCode = isSuccessStatusCode;
-	requestUtils.isServerErrorStatusCode = isServerErrorStatusCode;
-	requestUtils.isRetryableStatusCode = isRetryableStatusCode;
-	requestUtils.retry = retry;
-	requestUtils.retryTypedResponse = retryTypedResponse;
-	requestUtils.retryHttpClientResponse = retryHttpClientResponse;
-	const core = __importStar(requireCore$2());
-	const http_client_1 = requireLib$3();
-	const constants_1 = requireConstants$6();
-	function isSuccessStatusCode(statusCode) {
-	    if (!statusCode) {
-	        return false;
-	    }
-	    return statusCode >= 200 && statusCode < 300;
-	}
-	function isServerErrorStatusCode(statusCode) {
-	    if (!statusCode) {
-	        return true;
-	    }
-	    return statusCode >= 500;
-	}
-	function isRetryableStatusCode(statusCode) {
-	    if (!statusCode) {
-	        return false;
-	    }
-	    const retryableStatusCodes = [
-	        http_client_1.HttpCodes.BadGateway,
-	        http_client_1.HttpCodes.ServiceUnavailable,
-	        http_client_1.HttpCodes.GatewayTimeout
-	    ];
-	    return retryableStatusCodes.includes(statusCode);
-	}
-	function sleep(milliseconds) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        return new Promise(resolve => setTimeout(resolve, milliseconds));
-	    });
-	}
-	function retry(name_1, method_1, getStatusCode_1) {
-	    return __awaiter(this, arguments, void 0, function* (name, method, getStatusCode, maxAttempts = constants_1.DefaultRetryAttempts, delay = constants_1.DefaultRetryDelay, onError = undefined) {
-	        let errorMessage = '';
-	        let attempt = 1;
-	        while (attempt <= maxAttempts) {
-	            let response = undefined;
-	            let statusCode = undefined;
-	            let isRetryable = false;
-	            try {
-	                response = yield method();
-	            }
-	            catch (error) {
-	                if (onError) {
-	                    response = onError(error);
-	                }
-	                isRetryable = true;
-	                errorMessage = error.message;
-	            }
-	            if (response) {
-	                statusCode = getStatusCode(response);
-	                if (!isServerErrorStatusCode(statusCode)) {
-	                    return response;
-	                }
-	            }
-	            if (statusCode) {
-	                isRetryable = isRetryableStatusCode(statusCode);
-	                errorMessage = `Cache service responded with ${statusCode}`;
-	            }
-	            core.debug(`${name} - Attempt ${attempt} of ${maxAttempts} failed with error: ${errorMessage}`);
-	            if (!isRetryable) {
-	                core.debug(`${name} - Error is not retryable`);
-	                break;
-	            }
-	            yield sleep(delay);
-	            attempt++;
-	        }
-	        throw Error(`${name} failed: ${errorMessage}`);
-	    });
-	}
-	function retryTypedResponse(name_1, method_1) {
-	    return __awaiter(this, arguments, void 0, function* (name, method, maxAttempts = constants_1.DefaultRetryAttempts, delay = constants_1.DefaultRetryDelay) {
-	        return yield retry(name, method, (response) => response.statusCode, maxAttempts, delay, 
-	        // If the error object contains the statusCode property, extract it and return
-	        // an TypedResponse so it can be processed by the retry logic.
-	        (error) => {
-	            if (error instanceof http_client_1.HttpClientError) {
-	                return {
-	                    statusCode: error.statusCode,
-	                    result: null,
-	                    headers: {},
-	                    error
-	                };
-	            }
-	            else {
-	                return undefined;
-	            }
-	        });
-	    });
-	}
-	function retryHttpClientResponse(name_1, method_1) {
-	    return __awaiter(this, arguments, void 0, function* (name, method, maxAttempts = constants_1.DefaultRetryAttempts, delay = constants_1.DefaultRetryDelay) {
-	        return yield retry(name, method, (response) => response.message.statusCode, maxAttempts, delay);
-	    });
-	}
-	
-	return requestUtils;
-}
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT license.
-/// 
-const listenersMap = new WeakMap();
-const abortedMap = new WeakMap();
-/**
- * An aborter instance implements AbortSignal interface, can abort HTTP requests.
- *
- * - Call AbortSignal.none to create a new AbortSignal instance that cannot be cancelled.
- * Use `AbortSignal.none` when you are required to pass a cancellation token but the operation
- * cannot or will not ever be cancelled.
- *
- * @example
- * Abort without timeout
- * ```ts
- * await doAsyncWork(AbortSignal.none);
- * ```
- */
-let AbortSignal$1 = class AbortSignal {
-    constructor() {
-        /**
-         * onabort event listener.
-         */
-        this.onabort = null;
-        listenersMap.set(this, []);
-        abortedMap.set(this, false);
-    }
-    /**
-     * Status of whether aborted or not.
-     *
-     * @readonly
-     */
-    get aborted() {
-        if (!abortedMap.has(this)) {
-            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
-        }
-        return abortedMap.get(this);
-    }
-    /**
-     * Creates a new AbortSignal instance that will never be aborted.
-     *
-     * @readonly
-     */
-    static get none() {
-        return new AbortSignal();
-    }
-    /**
-     * Added new "abort" event listener, only support "abort" event.
-     *
-     * @param _type - Only support "abort" event
-     * @param listener - The listener to be added
-     */
-    addEventListener(
-    // tslint:disable-next-line:variable-name
-    _type, listener) {
-        if (!listenersMap.has(this)) {
-            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
-        }
-        const listeners = listenersMap.get(this);
-        listeners.push(listener);
-    }
-    /**
-     * Remove "abort" event listener, only support "abort" event.
-     *
-     * @param _type - Only support "abort" event
-     * @param listener - The listener to be removed
-     */
-    removeEventListener(
-    // tslint:disable-next-line:variable-name
-    _type, listener) {
-        if (!listenersMap.has(this)) {
-            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
-        }
-        const listeners = listenersMap.get(this);
-        const index = listeners.indexOf(listener);
-        if (index > -1) {
-            listeners.splice(index, 1);
-        }
-    }
-    /**
-     * Dispatches a synthetic event to the AbortSignal.
-     */
-    dispatchEvent(_event) {
-        throw new Error("This is a stub dispatchEvent implementation that should not be used.  It only exists for type-checking purposes.");
-    }
-};
-/**
- * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.
- * Will try to trigger abort event for all linked AbortSignal nodes.
- *
- * - If there is a timeout, the timer will be cancelled.
- * - If aborted is true, nothing will happen.
- *
- * @internal
- */
-// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
-function abortSignal(signal) {
-    if (signal.aborted) {
-        return;
-    }
-    if (signal.onabort) {
-        signal.onabort.call(signal);
-    }
-    const listeners = listenersMap.get(signal);
-    if (listeners) {
-        // Create a copy of listeners so mutations to the array
-        // (e.g. via removeListener calls) don't affect the listeners
-        // we invoke.
-        listeners.slice().forEach((listener) => {
-            listener.call(signal, { type: "abort" });
-        });
-    }
-    abortedMap.set(signal, true);
-}
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT license.
-/**
- * This error is thrown when an asynchronous operation has been aborted.
- * Check for this error by testing the `name` that the name property of the
- * error matches `"AbortError"`.
- *
- * @example
- * ```ts
- * const controller = new AbortController();
- * controller.abort();
- * try {
- *   doAsyncWork(controller.signal)
- * } catch (e) {
- *   if (e.name === 'AbortError') {
- *     // handle abort error here.
- *   }
- * }
- * ```
- */
-class AbortError extends Error {
-    constructor(message) {
-        super(message);
-        this.name = "AbortError";
-    }
-}
-/**
- * An AbortController provides an AbortSignal and the associated controls to signal
- * that an asynchronous operation should be aborted.
- *
- * @example
- * Abort an operation when another event fires
- * ```ts
- * const controller = new AbortController();
- * const signal = controller.signal;
- * doAsyncWork(signal);
- * button.addEventListener('click', () => controller.abort());
- * ```
- *
- * @example
- * Share aborter cross multiple operations in 30s
- * ```ts
- * // Upload the same data to 2 different data centers at the same time,
- * // abort another when any of them is finished
- * const controller = AbortController.withTimeout(30 * 1000);
- * doAsyncWork(controller.signal).then(controller.abort);
- * doAsyncWork(controller.signal).then(controller.abort);
- *```
- *
- * @example
- * Cascaded aborting
- * ```ts
- * // All operations can't take more than 30 seconds
- * const aborter = Aborter.timeout(30 * 1000);
- *
- * // Following 2 operations can't take more than 25 seconds
- * await doAsyncWork(aborter.withTimeout(25 * 1000));
- * await doAsyncWork(aborter.withTimeout(25 * 1000));
- * ```
- */
-let AbortController$1 = class AbortController {
-    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-    constructor(parentSignals) {
-        this._signal = new AbortSignal$1();
-        if (!parentSignals) {
-            return;
-        }
-        // coerce parentSignals into an array
-        if (!Array.isArray(parentSignals)) {
-            // eslint-disable-next-line prefer-rest-params
-            parentSignals = arguments;
-        }
-        for (const parentSignal of parentSignals) {
-            // if the parent signal has already had abort() called,
-            // then call abort on this signal as well.
-            if (parentSignal.aborted) {
-                this.abort();
-            }
-            else {
-                // when the parent signal aborts, this signal should as well.
-                parentSignal.addEventListener("abort", () => {
-                    this.abort();
-                });
-            }
-        }
-    }
-    /**
-     * The AbortSignal associated with this controller that will signal aborted
-     * when the abort method is called on this controller.
-     *
-     * @readonly
-     */
-    get signal() {
-        return this._signal;
-    }
-    /**
-     * Signal that any operations passed this controller's associated abort signal
-     * to cancel any remaining work and throw an `AbortError`.
-     */
-    abort() {
-        abortSignal(this._signal);
-    }
-    /**
-     * Creates a new AbortSignal instance that will abort after the provided ms.
-     * @param ms - Elapsed time in milliseconds to trigger an abort.
-     */
-    static timeout(ms) {
-        const signal = new AbortSignal$1();
-        const timer = setTimeout(abortSignal, ms, signal);
-        // Prevent the active Timer from keeping the Node.js event loop active.
-        if (typeof timer.unref === "function") {
-            timer.unref();
-        }
-        return signal;
-    }
-};
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT license.
-// Changes to Aborter
-// * Rename Aborter to AbortSignal
-// * Remove withValue and getValue - async context should be solved differently/wholistically, not tied to cancellation
-// * Remove withTimeout, it's moved to the controller
-// * AbortSignal constructor no longer takes a parent. Cancellation graphs are created from the controller.
-// Potential changes to align with DOM Spec
-// * dispatchEvent on Signal
-
-var src = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	AbortController: AbortController$1,
-	AbortError: AbortError,
-	AbortSignal: AbortSignal$1
-});
-
-var require$$10 = /*@__PURE__*/getAugmentedNamespace(src);
-
-var hasRequiredDownloadUtils;
-
-function requireDownloadUtils () {
-	if (hasRequiredDownloadUtils) return downloadUtils;
-	hasRequiredDownloadUtils = 1;
-	var __createBinding = (downloadUtils && downloadUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (downloadUtils && downloadUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (downloadUtils && downloadUtils.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (downloadUtils && downloadUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(downloadUtils, "__esModule", { value: true });
-	downloadUtils.DownloadProgress = void 0;
-	downloadUtils.downloadCacheHttpClient = downloadCacheHttpClient;
-	downloadUtils.downloadCacheHttpClientConcurrent = downloadCacheHttpClientConcurrent;
-	downloadUtils.downloadCacheStorageSDK = downloadCacheStorageSDK;
-	const core = __importStar(requireCore$2());
-	const http_client_1 = requireLib$3();
-	const storage_blob_1 = /*@__PURE__*/ requireCommonjs();
-	const buffer = __importStar(require$$7);
-	const fs = __importStar(require$$1__default);
-	const stream = __importStar(require$$0$a);
-	const util = __importStar(require$$0$6);
-	const utils = __importStar(requireCacheUtils());
-	const constants_1 = requireConstants$6();
-	const requestUtils_1 = requireRequestUtils();
-	const abort_controller_1 = require$$10;
-	/**
-	 * Pipes the body of a HTTP response to a stream
-	 *
-	 * @param response the HTTP response
-	 * @param output the writable stream
-	 */
-	function pipeResponseToStream(response, output) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const pipeline = util.promisify(stream.pipeline);
-	        yield pipeline(response.message, output);
-	    });
-	}
-	/**
-	 * Class for tracking the download state and displaying stats.
-	 */
-	class DownloadProgress {
-	    constructor(contentLength) {
-	        this.contentLength = contentLength;
-	        this.segmentIndex = 0;
-	        this.segmentSize = 0;
-	        this.segmentOffset = 0;
-	        this.receivedBytes = 0;
-	        this.displayedComplete = false;
-	        this.startTime = Date.now();
-	    }
-	    /**
-	     * Progress to the next segment. Only call this method when the previous segment
-	     * is complete.
-	     *
-	     * @param segmentSize the length of the next segment
-	     */
-	    nextSegment(segmentSize) {
-	        this.segmentOffset = this.segmentOffset + this.segmentSize;
-	        this.segmentIndex = this.segmentIndex + 1;
-	        this.segmentSize = segmentSize;
-	        this.receivedBytes = 0;
-	        core.debug(`Downloading segment at offset ${this.segmentOffset} with length ${this.segmentSize}...`);
-	    }
-	    /**
-	     * Sets the number of bytes received for the current segment.
-	     *
-	     * @param receivedBytes the number of bytes received
-	     */
-	    setReceivedBytes(receivedBytes) {
-	        this.receivedBytes = receivedBytes;
-	    }
-	    /**
-	     * Returns the total number of bytes transferred.
-	     */
-	    getTransferredBytes() {
-	        return this.segmentOffset + this.receivedBytes;
-	    }
-	    /**
-	     * Returns true if the download is complete.
-	     */
-	    isDone() {
-	        return this.getTransferredBytes() === this.contentLength;
-	    }
-	    /**
-	     * Prints the current download stats. Once the download completes, this will print one
-	     * last line and then stop.
-	     */
-	    display() {
-	        if (this.displayedComplete) {
-	            return;
-	        }
-	        const transferredBytes = this.segmentOffset + this.receivedBytes;
-	        const percentage = (100 * (transferredBytes / this.contentLength)).toFixed(1);
-	        const elapsedTime = Date.now() - this.startTime;
-	        const downloadSpeed = (transferredBytes /
-	            (1024 * 1024) /
-	            (elapsedTime / 1000)).toFixed(1);
-	        core.info(`Received ${transferredBytes} of ${this.contentLength} (${percentage}%), ${downloadSpeed} MBs/sec`);
-	        if (this.isDone()) {
-	            this.displayedComplete = true;
-	        }
-	    }
-	    /**
-	     * Returns a function used to handle TransferProgressEvents.
-	     */
-	    onProgress() {
-	        return (progress) => {
-	            this.setReceivedBytes(progress.loadedBytes);
-	        };
-	    }
-	    /**
-	     * Starts the timer that displays the stats.
-	     *
-	     * @param delayInMs the delay between each write
-	     */
-	    startDisplayTimer(delayInMs = 1000) {
-	        const displayCallback = () => {
-	            this.display();
-	            if (!this.isDone()) {
-	                this.timeoutHandle = setTimeout(displayCallback, delayInMs);
-	            }
-	        };
-	        this.timeoutHandle = setTimeout(displayCallback, delayInMs);
-	    }
-	    /**
-	     * Stops the timer that displays the stats. As this typically indicates the download
-	     * is complete, this will display one last line, unless the last line has already
-	     * been written.
-	     */
-	    stopDisplayTimer() {
-	        if (this.timeoutHandle) {
-	            clearTimeout(this.timeoutHandle);
-	            this.timeoutHandle = undefined;
-	        }
-	        this.display();
-	    }
-	}
-	downloadUtils.DownloadProgress = DownloadProgress;
-	/**
-	 * Download the cache using the Actions toolkit http-client
-	 *
-	 * @param archiveLocation the URL for the cache
-	 * @param archivePath the local path where the cache is saved
-	 */
-	function downloadCacheHttpClient(archiveLocation, archivePath) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const writeStream = fs.createWriteStream(archivePath);
-	        const httpClient = new http_client_1.HttpClient('actions/cache');
-	        const downloadResponse = yield (0, requestUtils_1.retryHttpClientResponse)('downloadCache', () => __awaiter(this, void 0, void 0, function* () { return httpClient.get(archiveLocation); }));
-	        // Abort download if no traffic received over the socket.
-	        downloadResponse.message.socket.setTimeout(constants_1.SocketTimeout, () => {
-	            downloadResponse.message.destroy();
-	            core.debug(`Aborting download, socket timed out after ${constants_1.SocketTimeout} ms`);
-	        });
-	        yield pipeResponseToStream(downloadResponse, writeStream);
-	        // Validate download size.
-	        const contentLengthHeader = downloadResponse.message.headers['content-length'];
-	        if (contentLengthHeader) {
-	            const expectedLength = parseInt(contentLengthHeader);
-	            const actualLength = utils.getArchiveFileSizeInBytes(archivePath);
-	            if (actualLength !== expectedLength) {
-	                throw new Error(`Incomplete download. Expected file size: ${expectedLength}, actual file size: ${actualLength}`);
-	            }
-	        }
-	        else {
-	            core.debug('Unable to validate download, no Content-Length header');
-	        }
-	    });
-	}
-	/**
-	 * Download the cache using the Actions toolkit http-client concurrently
-	 *
-	 * @param archiveLocation the URL for the cache
-	 * @param archivePath the local path where the cache is saved
-	 */
-	function downloadCacheHttpClientConcurrent(archiveLocation, archivePath, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        var _a;
-	        const archiveDescriptor = yield fs.promises.open(archivePath, 'w');
-	        const httpClient = new http_client_1.HttpClient('actions/cache', undefined, {
-	            socketTimeout: options.timeoutInMs,
-	            keepAlive: true
-	        });
-	        try {
-	            const res = yield (0, requestUtils_1.retryHttpClientResponse)('downloadCacheMetadata', () => __awaiter(this, void 0, void 0, function* () { return yield httpClient.request('HEAD', archiveLocation, null, {}); }));
-	            const lengthHeader = res.message.headers['content-length'];
-	            if (lengthHeader === undefined || lengthHeader === null) {
-	                throw new Error('Content-Length not found on blob response');
-	            }
-	            const length = parseInt(lengthHeader);
-	            if (Number.isNaN(length)) {
-	                throw new Error(`Could not interpret Content-Length: ${length}`);
-	            }
-	            const downloads = [];
-	            const blockSize = 4 * 1024 * 1024;
-	            for (let offset = 0; offset < length; offset += blockSize) {
-	                const count = Math.min(blockSize, length - offset);
-	                downloads.push({
-	                    offset,
-	                    promiseGetter: () => __awaiter(this, void 0, void 0, function* () {
-	                        return yield downloadSegmentRetry(httpClient, archiveLocation, offset, count);
-	                    })
-	                });
-	            }
-	            // reverse to use .pop instead of .shift
-	            downloads.reverse();
-	            let actives = 0;
-	            let bytesDownloaded = 0;
-	            const progress = new DownloadProgress(length);
-	            progress.startDisplayTimer();
-	            const progressFn = progress.onProgress();
-	            const activeDownloads = [];
-	            let nextDownload;
-	            const waitAndWrite = () => __awaiter(this, void 0, void 0, function* () {
-	                const segment = yield Promise.race(Object.values(activeDownloads));
-	                yield archiveDescriptor.write(segment.buffer, 0, segment.count, segment.offset);
-	                actives--;
-	                delete activeDownloads[segment.offset];
-	                bytesDownloaded += segment.count;
-	                progressFn({ loadedBytes: bytesDownloaded });
-	            });
-	            while ((nextDownload = downloads.pop())) {
-	                activeDownloads[nextDownload.offset] = nextDownload.promiseGetter();
-	                actives++;
-	                if (actives >= ((_a = options.downloadConcurrency) !== null && _a !== void 0 ? _a : 10)) {
-	                    yield waitAndWrite();
-	                }
-	            }
-	            while (actives > 0) {
-	                yield waitAndWrite();
-	            }
-	        }
-	        finally {
-	            httpClient.dispose();
-	            yield archiveDescriptor.close();
-	        }
-	    });
-	}
-	function downloadSegmentRetry(httpClient, archiveLocation, offset, count) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const retries = 5;
-	        let failures = 0;
-	        while (true) {
-	            try {
-	                const timeout = 30000;
-	                const result = yield promiseWithTimeout(timeout, downloadSegment(httpClient, archiveLocation, offset, count));
-	                if (typeof result === 'string') {
-	                    throw new Error('downloadSegmentRetry failed due to timeout');
-	                }
-	                return result;
-	            }
-	            catch (err) {
-	                if (failures >= retries) {
-	                    throw err;
-	                }
-	                failures++;
-	            }
-	        }
-	    });
-	}
-	function downloadSegment(httpClient, archiveLocation, offset, count) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const partRes = yield (0, requestUtils_1.retryHttpClientResponse)('downloadCachePart', () => __awaiter(this, void 0, void 0, function* () {
-	            return yield httpClient.get(archiveLocation, {
-	                Range: `bytes=${offset}-${offset + count - 1}`
-	            });
-	        }));
-	        if (!partRes.readBodyBuffer) {
-	            throw new Error('Expected HttpClientResponse to implement readBodyBuffer');
-	        }
-	        return {
-	            offset,
-	            count,
-	            buffer: yield partRes.readBodyBuffer()
-	        };
-	    });
-	}
-	/**
-	 * Download the cache using the Azure Storage SDK.  Only call this method if the
-	 * URL points to an Azure Storage endpoint.
-	 *
-	 * @param archiveLocation the URL for the cache
-	 * @param archivePath the local path where the cache is saved
-	 * @param options the download options with the defaults set
-	 */
-	function downloadCacheStorageSDK(archiveLocation, archivePath, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        var _a;
-	        const client = new storage_blob_1.BlockBlobClient(archiveLocation, undefined, {
-	            retryOptions: {
-	                // Override the timeout used when downloading each 4 MB chunk
-	                // The default is 2 min / MB, which is way too slow
-	                tryTimeoutInMs: options.timeoutInMs
-	            }
-	        });
-	        const properties = yield client.getProperties();
-	        const contentLength = (_a = properties.contentLength) !== null && _a !== void 0 ? _a : -1;
-	        if (contentLength < 0) {
-	            // We should never hit this condition, but just in case fall back to downloading the
-	            // file as one large stream
-	            core.debug('Unable to determine content length, downloading file with http-client...');
-	            yield downloadCacheHttpClient(archiveLocation, archivePath);
-	        }
-	        else {
-	            // Use downloadToBuffer for faster downloads, since internally it splits the
-	            // file into 4 MB chunks which can then be parallelized and retried independently
-	            //
-	            // If the file exceeds the buffer maximum length (~1 GB on 32-bit systems and ~2 GB
-	            // on 64-bit systems), split the download into multiple segments
-	            // ~2 GB = 2147483647, beyond this, we start getting out of range error. So, capping it accordingly.
-	            // Updated segment size to 128MB = 134217728 bytes, to complete a segment faster and fail fast
-	            const maxSegmentSize = Math.min(134217728, buffer.constants.MAX_LENGTH);
-	            const downloadProgress = new DownloadProgress(contentLength);
-	            const fd = fs.openSync(archivePath, 'w');
-	            try {
-	                downloadProgress.startDisplayTimer();
-	                const controller = new abort_controller_1.AbortController();
-	                const abortSignal = controller.signal;
-	                while (!downloadProgress.isDone()) {
-	                    const segmentStart = downloadProgress.segmentOffset + downloadProgress.segmentSize;
-	                    const segmentSize = Math.min(maxSegmentSize, contentLength - segmentStart);
-	                    downloadProgress.nextSegment(segmentSize);
-	                    const result = yield promiseWithTimeout(options.segmentTimeoutInMs || 3600000, client.downloadToBuffer(segmentStart, segmentSize, {
-	                        abortSignal,
-	                        concurrency: options.downloadConcurrency,
-	                        onProgress: downloadProgress.onProgress()
-	                    }));
-	                    if (result === 'timeout') {
-	                        controller.abort();
-	                        throw new Error('Aborting cache download as the download time exceeded the timeout.');
-	                    }
-	                    else if (Buffer.isBuffer(result)) {
-	                        fs.writeFileSync(fd, result);
-	                    }
-	                }
-	            }
-	            finally {
-	                downloadProgress.stopDisplayTimer();
-	                fs.closeSync(fd);
-	            }
-	        }
-	    });
-	}
-	const promiseWithTimeout = (timeoutMs, promise) => __awaiter(void 0, void 0, void 0, function* () {
-	    let timeoutHandle;
-	    const timeoutPromise = new Promise(resolve => {
-	        timeoutHandle = setTimeout(() => resolve('timeout'), timeoutMs);
-	    });
-	    return Promise.race([promise, timeoutPromise]).then(result => {
-	        clearTimeout(timeoutHandle);
-	        return result;
-	    });
-	});
-	
-	return downloadUtils;
-}
-
-var options = {};
-
-var hasRequiredOptions;
-
-function requireOptions () {
-	if (hasRequiredOptions) return options;
-	hasRequiredOptions = 1;
-	var __createBinding = (options && options.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (options && options.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (options && options.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	Object.defineProperty(options, "__esModule", { value: true });
-	options.getUploadOptions = getUploadOptions;
-	options.getDownloadOptions = getDownloadOptions;
-	const core = __importStar(requireCore$2());
-	/**
-	 * Returns a copy of the upload options with defaults filled in.
-	 *
-	 * @param copy the original upload options
-	 */
-	function getUploadOptions(copy) {
-	    // Defaults if not overriden
-	    const result = {
-	        useAzureSdk: false,
-	        uploadConcurrency: 4,
-	        uploadChunkSize: 32 * 1024 * 1024
-	    };
-	    if (copy) {
-	        if (typeof copy.useAzureSdk === 'boolean') {
-	            result.useAzureSdk = copy.useAzureSdk;
-	        }
-	        if (typeof copy.uploadConcurrency === 'number') {
-	            result.uploadConcurrency = copy.uploadConcurrency;
-	        }
-	        if (typeof copy.uploadChunkSize === 'number') {
-	            result.uploadChunkSize = copy.uploadChunkSize;
-	        }
-	    }
-	    /**
-	     * Add env var overrides
-	     */
-	    // Cap the uploadConcurrency at 32
-	    result.uploadConcurrency = !isNaN(Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
-	        ? Math.min(32, Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
-	        : result.uploadConcurrency;
-	    // Cap the uploadChunkSize at 128MiB
-	    result.uploadChunkSize = !isNaN(Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']))
-	        ? Math.min(128 * 1024 * 1024, Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']) * 1024 * 1024)
-	        : result.uploadChunkSize;
-	    core.debug(`Use Azure SDK: ${result.useAzureSdk}`);
-	    core.debug(`Upload concurrency: ${result.uploadConcurrency}`);
-	    core.debug(`Upload chunk size: ${result.uploadChunkSize}`);
-	    return result;
-	}
-	/**
-	 * Returns a copy of the download options with defaults filled in.
-	 *
-	 * @param copy the original download options
-	 */
-	function getDownloadOptions(copy) {
-	    const result = {
-	        useAzureSdk: false,
-	        concurrentBlobDownloads: true,
-	        downloadConcurrency: 8,
-	        timeoutInMs: 30000,
-	        segmentTimeoutInMs: 600000,
-	        lookupOnly: false
-	    };
-	    if (copy) {
-	        if (typeof copy.useAzureSdk === 'boolean') {
-	            result.useAzureSdk = copy.useAzureSdk;
-	        }
-	        if (typeof copy.concurrentBlobDownloads === 'boolean') {
-	            result.concurrentBlobDownloads = copy.concurrentBlobDownloads;
-	        }
-	        if (typeof copy.downloadConcurrency === 'number') {
-	            result.downloadConcurrency = copy.downloadConcurrency;
-	        }
-	        if (typeof copy.timeoutInMs === 'number') {
-	            result.timeoutInMs = copy.timeoutInMs;
-	        }
-	        if (typeof copy.segmentTimeoutInMs === 'number') {
-	            result.segmentTimeoutInMs = copy.segmentTimeoutInMs;
-	        }
-	        if (typeof copy.lookupOnly === 'boolean') {
-	            result.lookupOnly = copy.lookupOnly;
-	        }
-	    }
-	    const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS'];
-	    if (segmentDownloadTimeoutMins &&
-	        !isNaN(Number(segmentDownloadTimeoutMins)) &&
-	        isFinite(Number(segmentDownloadTimeoutMins))) {
-	        result.segmentTimeoutInMs = Number(segmentDownloadTimeoutMins) * 60 * 1000;
-	    }
-	    core.debug(`Use Azure SDK: ${result.useAzureSdk}`);
-	    core.debug(`Download concurrency: ${result.downloadConcurrency}`);
-	    core.debug(`Request timeout (ms): ${result.timeoutInMs}`);
-	    core.debug(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`);
-	    core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`);
-	    core.debug(`Lookup only: ${result.lookupOnly}`);
-	    return result;
-	}
-	
-	return options;
-}
-
-var config = {};
-
-var hasRequiredConfig;
-
-function requireConfig () {
-	if (hasRequiredConfig) return config;
-	hasRequiredConfig = 1;
-	Object.defineProperty(config, "__esModule", { value: true });
-	config.isGhes = isGhes;
-	config.getCacheServiceVersion = getCacheServiceVersion;
-	config.getCacheServiceURL = getCacheServiceURL;
-	function isGhes() {
-	    const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
-	    const hostname = ghUrl.hostname.trimEnd().toUpperCase();
-	    const isGitHubHost = hostname === 'GITHUB.COM';
-	    const isGheHost = hostname.endsWith('.GHE.COM');
-	    const isLocalHost = hostname.endsWith('.LOCALHOST');
-	    return !isGitHubHost && !isGheHost && !isLocalHost;
-	}
-	function getCacheServiceVersion() {
-	    // Cache service v2 is not supported on GHES. We will default to
-	    // cache service v1 even if the feature flag was enabled by user.
-	    if (isGhes())
-	        return 'v1';
-	    return process.env['ACTIONS_CACHE_SERVICE_V2'] ? 'v2' : 'v1';
-	}
-	function getCacheServiceURL() {
-	    const version = getCacheServiceVersion();
-	    // Based on the version of the cache service, we will determine which
-	    // URL to use.
-	    switch (version) {
-	        case 'v1':
-	            return (process.env['ACTIONS_CACHE_URL'] ||
-	                process.env['ACTIONS_RESULTS_URL'] ||
-	                '');
-	        case 'v2':
-	            return process.env['ACTIONS_RESULTS_URL'] || '';
-	        default:
-	            throw new Error(`Unsupported cache service version: ${version}`);
-	    }
-	}
-	
-	return config;
-}
-
-var userAgent$1 = {};
-
-var version = "5.0.1";
-var require$$0$1 = {
-	version: version};
-
-var hasRequiredUserAgent;
-
-function requireUserAgent () {
-	if (hasRequiredUserAgent) return userAgent$1;
-	hasRequiredUserAgent = 1;
-	Object.defineProperty(userAgent$1, "__esModule", { value: true });
-	userAgent$1.getUserAgentString = getUserAgentString;
-	// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
-	const packageJson = require$$0$1;
-	/**
-	 * Ensure that this User Agent String is used in all HTTP calls so that we can monitor telemetry between different versions of this package
-	 */
-	function getUserAgentString() {
-	    return `@actions/cache-${packageJson.version}`;
-	}
-	
-	return userAgent$1;
-}
-
-var hasRequiredCacheHttpClient;
-
-function requireCacheHttpClient () {
-	if (hasRequiredCacheHttpClient) return cacheHttpClient;
-	hasRequiredCacheHttpClient = 1;
-	var __createBinding = (cacheHttpClient && cacheHttpClient.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (cacheHttpClient && cacheHttpClient.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (cacheHttpClient && cacheHttpClient.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (cacheHttpClient && cacheHttpClient.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(cacheHttpClient, "__esModule", { value: true });
-	cacheHttpClient.getCacheEntry = getCacheEntry;
-	cacheHttpClient.downloadCache = downloadCache;
-	cacheHttpClient.reserveCache = reserveCache;
-	cacheHttpClient.saveCache = saveCache;
-	const core = __importStar(requireCore$2());
-	const http_client_1 = requireLib$3();
-	const auth_1 = requireAuth$2();
-	const fs = __importStar(require$$1__default);
-	const url_1 = require$$5$1;
-	const utils = __importStar(requireCacheUtils());
-	const uploadUtils_1 = requireUploadUtils();
-	const downloadUtils_1 = requireDownloadUtils();
-	const options_1 = requireOptions();
-	const requestUtils_1 = requireRequestUtils();
-	const config_1 = requireConfig();
-	const user_agent_1 = requireUserAgent();
-	function getCacheApiUrl(resource) {
-	    const baseUrl = (0, config_1.getCacheServiceURL)();
-	    if (!baseUrl) {
-	        throw new Error('Cache Service Url not found, unable to restore cache.');
-	    }
-	    const url = `${baseUrl}_apis/artifactcache/${resource}`;
-	    core.debug(`Resource Url: ${url}`);
-	    return url;
-	}
-	function createAcceptHeader(type, apiVersion) {
-	    return `${type};api-version=${apiVersion}`;
-	}
-	function getRequestOptions() {
-	    const requestOptions = {
-	        headers: {
-	            Accept: createAcceptHeader('application/json', '6.0-preview.1')
-	        }
-	    };
-	    return requestOptions;
-	}
-	function createHttpClient() {
-	    const token = process.env['ACTIONS_RUNTIME_TOKEN'] || '';
-	    const bearerCredentialHandler = new auth_1.BearerCredentialHandler(token);
-	    return new http_client_1.HttpClient((0, user_agent_1.getUserAgentString)(), [bearerCredentialHandler], getRequestOptions());
-	}
-	function getCacheEntry(keys, paths, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const httpClient = createHttpClient();
-	        const version = utils.getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive);
-	        const resource = `cache?keys=${encodeURIComponent(keys.join(','))}&version=${version}`;
-	        const response = yield (0, requestUtils_1.retryTypedResponse)('getCacheEntry', () => __awaiter(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); }));
-	        // Cache not found
-	        if (response.statusCode === 204) {
-	            // List cache for primary key only if cache miss occurs
-	            if (core.isDebug()) {
-	                yield printCachesListForDiagnostics(keys[0], httpClient, version);
-	            }
-	            return null;
-	        }
-	        if (!(0, requestUtils_1.isSuccessStatusCode)(response.statusCode)) {
-	            throw new Error(`Cache service responded with ${response.statusCode}`);
-	        }
-	        const cacheResult = response.result;
-	        const cacheDownloadUrl = cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.archiveLocation;
-	        if (!cacheDownloadUrl) {
-	            // Cache achiveLocation not found. This should never happen, and hence bail out.
-	            throw new Error('Cache not found.');
-	        }
-	        core.setSecret(cacheDownloadUrl);
-	        core.debug(`Cache Result:`);
-	        core.debug(JSON.stringify(cacheResult));
-	        return cacheResult;
-	    });
-	}
-	function printCachesListForDiagnostics(key, httpClient, version) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const resource = `caches?key=${encodeURIComponent(key)}`;
-	        const response = yield (0, requestUtils_1.retryTypedResponse)('listCache', () => __awaiter(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); }));
-	        if (response.statusCode === 200) {
-	            const cacheListResult = response.result;
-	            const totalCount = cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.totalCount;
-	            if (totalCount && totalCount > 0) {
-	                core.debug(`No matching cache found for cache key '${key}', version '${version} and scope ${process.env['GITHUB_REF']}. There exist one or more cache(s) with similar key but they have different version or scope. See more info on cache matching here: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key \nOther caches with similar key:`);
-	                for (const cacheEntry of (cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.artifactCaches) || []) {
-	                    core.debug(`Cache Key: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheKey}, Cache Version: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheVersion}, Cache Scope: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.scope}, Cache Created: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.creationTime}`);
-	                }
-	            }
-	        }
-	    });
-	}
-	function downloadCache(archiveLocation, archivePath, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const archiveUrl = new url_1.URL(archiveLocation);
-	        const downloadOptions = (0, options_1.getDownloadOptions)(options);
-	        if (archiveUrl.hostname.endsWith('.blob.core.windows.net')) {
-	            if (downloadOptions.useAzureSdk) {
-	                // Use Azure storage SDK to download caches hosted on Azure to improve speed and reliability.
-	                yield (0, downloadUtils_1.downloadCacheStorageSDK)(archiveLocation, archivePath, downloadOptions);
-	            }
-	            else if (downloadOptions.concurrentBlobDownloads) {
-	                // Use concurrent implementation with HttpClient to work around blob SDK issue
-	                yield (0, downloadUtils_1.downloadCacheHttpClientConcurrent)(archiveLocation, archivePath, downloadOptions);
-	            }
-	            else {
-	                // Otherwise, download using the Actions http-client.
-	                yield (0, downloadUtils_1.downloadCacheHttpClient)(archiveLocation, archivePath);
-	            }
-	        }
-	        else {
-	            yield (0, downloadUtils_1.downloadCacheHttpClient)(archiveLocation, archivePath);
-	        }
-	    });
-	}
-	// Reserve Cache
-	function reserveCache(key, paths, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const httpClient = createHttpClient();
-	        const version = utils.getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive);
-	        const reserveCacheRequest = {
-	            key,
-	            version,
-	            cacheSize: options === null || options === void 0 ? void 0 : options.cacheSize
-	        };
-	        const response = yield (0, requestUtils_1.retryTypedResponse)('reserveCache', () => __awaiter(this, void 0, void 0, function* () {
-	            return httpClient.postJson(getCacheApiUrl('caches'), reserveCacheRequest);
-	        }));
-	        return response;
-	    });
-	}
-	function getContentRange(start, end) {
-	    // Format: `bytes start-end/filesize
-	    // start and end are inclusive
-	    // filesize can be *
-	    // For a 200 byte chunk starting at byte 0:
-	    // Content-Range: bytes 0-199/*
-	    return `bytes ${start}-${end}/*`;
-	}
-	function uploadChunk(httpClient, resourceUrl, openStream, start, end) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        core.debug(`Uploading chunk of size ${end - start + 1} bytes at offset ${start} with content range: ${getContentRange(start, end)}`);
-	        const additionalHeaders = {
-	            'Content-Type': 'application/octet-stream',
-	            'Content-Range': getContentRange(start, end)
-	        };
-	        const uploadChunkResponse = yield (0, requestUtils_1.retryHttpClientResponse)(`uploadChunk (start: ${start}, end: ${end})`, () => __awaiter(this, void 0, void 0, function* () {
-	            return httpClient.sendStream('PATCH', resourceUrl, openStream(), additionalHeaders);
-	        }));
-	        if (!(0, requestUtils_1.isSuccessStatusCode)(uploadChunkResponse.message.statusCode)) {
-	            throw new Error(`Cache service responded with ${uploadChunkResponse.message.statusCode} during upload chunk.`);
-	        }
-	    });
-	}
-	function uploadFile(httpClient, cacheId, archivePath, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        // Upload Chunks
-	        const fileSize = utils.getArchiveFileSizeInBytes(archivePath);
-	        const resourceUrl = getCacheApiUrl(`caches/${cacheId.toString()}`);
-	        const fd = fs.openSync(archivePath, 'r');
-	        const uploadOptions = (0, options_1.getUploadOptions)(options);
-	        const concurrency = utils.assertDefined('uploadConcurrency', uploadOptions.uploadConcurrency);
-	        const maxChunkSize = utils.assertDefined('uploadChunkSize', uploadOptions.uploadChunkSize);
-	        const parallelUploads = [...new Array(concurrency).keys()];
-	        core.debug('Awaiting all uploads');
-	        let offset = 0;
-	        try {
-	            yield Promise.all(parallelUploads.map(() => __awaiter(this, void 0, void 0, function* () {
-	                while (offset < fileSize) {
-	                    const chunkSize = Math.min(fileSize - offset, maxChunkSize);
-	                    const start = offset;
-	                    const end = offset + chunkSize - 1;
-	                    offset += maxChunkSize;
-	                    yield uploadChunk(httpClient, resourceUrl, () => fs
-	                        .createReadStream(archivePath, {
-	                        fd,
-	                        start,
-	                        end,
-	                        autoClose: false
-	                    })
-	                        .on('error', error => {
-	                        throw new Error(`Cache upload failed because file read failed with ${error.message}`);
-	                    }), start, end);
-	                }
-	            })));
-	        }
-	        finally {
-	            fs.closeSync(fd);
-	        }
-	        return;
-	    });
-	}
-	function commitCache(httpClient, cacheId, filesize) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const commitCacheRequest = { size: filesize };
-	        return yield (0, requestUtils_1.retryTypedResponse)('commitCache', () => __awaiter(this, void 0, void 0, function* () {
-	            return httpClient.postJson(getCacheApiUrl(`caches/${cacheId.toString()}`), commitCacheRequest);
-	        }));
-	    });
-	}
-	function saveCache(cacheId, archivePath, signedUploadURL, options) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const uploadOptions = (0, options_1.getUploadOptions)(options);
-	        if (uploadOptions.useAzureSdk) {
-	            // Use Azure storage SDK to upload caches directly to Azure
-	            if (!signedUploadURL) {
-	                throw new Error('Azure Storage SDK can only be used when a signed URL is provided.');
-	            }
-	            yield (0, uploadUtils_1.uploadCacheArchiveSDK)(signedUploadURL, archivePath, options);
-	        }
-	        else {
-	            const httpClient = createHttpClient();
-	            core.debug('Upload cache');
-	            yield uploadFile(httpClient, cacheId, archivePath, options);
-	            // Commit Cache
-	            core.debug('Commiting cache');
-	            const cacheSize = utils.getArchiveFileSizeInBytes(archivePath);
-	            core.info(`Cache Size: ~${Math.round(cacheSize / (1024 * 1024))} MB (${cacheSize} B)`);
-	            const commitCacheResponse = yield commitCache(httpClient, cacheId, cacheSize);
-	            if (!(0, requestUtils_1.isSuccessStatusCode)(commitCacheResponse.statusCode)) {
-	                throw new Error(`Cache service responded with ${commitCacheResponse.statusCode} during commit cache.`);
-	            }
-	            core.info('Cache saved successfully');
-	        }
-	    });
-	}
-	
-	return cacheHttpClient;
-}
-
-var cacheTwirpClient = {};
-
-var cache_twirpClient = {};
-
-var cache = {};
-
-/**
- * Get the type of a JSON value.
- * Distinguishes between array, null and object.
- */
-function typeofJsonValue(value) {
-    let t = typeof value;
-    if (t == "object") {
-        if (Array.isArray(value))
-            return "array";
-        if (value === null)
-            return "null";
-    }
-    return t;
-}
-/**
- * Is this a JSON object (instead of an array or null)?
- */
-function isJsonObject(value) {
-    return value !== null && typeof value == "object" && !Array.isArray(value);
-}
-
-// lookup table from base64 character to byte
-let encTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
-// lookup table from base64 character *code* to byte because lookup by number is fast
-let decTable = [];
-for (let i = 0; i < encTable.length; i++)
-    decTable[encTable[i].charCodeAt(0)] = i;
-// support base64url variants
-decTable["-".charCodeAt(0)] = encTable.indexOf("+");
-decTable["_".charCodeAt(0)] = encTable.indexOf("/");
-/**
- * Decodes a base64 string to a byte array.
- *
- * - ignores white-space, including line breaks and tabs
- * - allows inner padding (can decode concatenated base64 strings)
- * - does not require padding
- * - understands base64url encoding:
- *   "-" instead of "+",
- *   "_" instead of "/",
- *   no padding
- */
-function base64decode(base64Str) {
-    // estimate byte size, not accounting for inner padding and whitespace
-    let es = base64Str.length * 3 / 4;
-    // if (es % 3 !== 0)
-    // throw new Error('invalid base64 string');
-    if (base64Str[base64Str.length - 2] == '=')
-        es -= 2;
-    else if (base64Str[base64Str.length - 1] == '=')
-        es -= 1;
-    let bytes = new Uint8Array(es), bytePos = 0, // position in byte array
-    groupPos = 0, // position in base64 group
-    b, // current byte
-    p = 0 // previous byte
-    ;
-    for (let i = 0; i < base64Str.length; i++) {
-        b = decTable[base64Str.charCodeAt(i)];
-        if (b === undefined) {
-            // noinspection FallThroughInSwitchStatementJS
-            switch (base64Str[i]) {
-                case '=':
-                    groupPos = 0; // reset state when padding found
-                case '\n':
-                case '\r':
-                case '\t':
-                case ' ':
-                    continue; // skip white-space, and padding
-                default:
-                    throw Error(`invalid base64 string.`);
-            }
-        }
-        switch (groupPos) {
-            case 0:
-                p = b;
-                groupPos = 1;
-                break;
-            case 1:
-                bytes[bytePos++] = p << 2 | (b & 48) >> 4;
-                p = b;
-                groupPos = 2;
-                break;
-            case 2:
-                bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;
-                p = b;
-                groupPos = 3;
-                break;
-            case 3:
-                bytes[bytePos++] = (p & 3) << 6 | b;
-                groupPos = 0;
-                break;
-        }
-    }
-    if (groupPos == 1)
-        throw Error(`invalid base64 string.`);
-    return bytes.subarray(0, bytePos);
-}
-/**
- * Encodes a byte array to a base64 string.
- * Adds padding at the end.
- * Does not insert newlines.
- */
-function base64encode(bytes) {
-    let base64 = '', groupPos = 0, // position in base64 group
-    b, // current byte
-    p = 0; // carry over from previous byte
-    for (let i = 0; i < bytes.length; i++) {
-        b = bytes[i];
-        switch (groupPos) {
-            case 0:
-                base64 += encTable[b >> 2];
-                p = (b & 3) << 4;
-                groupPos = 1;
-                break;
-            case 1:
-                base64 += encTable[p | b >> 4];
-                p = (b & 15) << 2;
-                groupPos = 2;
-                break;
-            case 2:
-                base64 += encTable[p | b >> 6];
-                base64 += encTable[b & 63];
-                groupPos = 0;
-                break;
-        }
-    }
-    // padding required?
-    if (groupPos) {
-        base64 += encTable[p];
-        base64 += '=';
-        if (groupPos == 1)
-            base64 += '=';
-    }
-    return base64;
-}
-
-// Copyright (c) 2016, Daniel Wirtz  All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-//   notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-//   notice, this list of conditions and the following disclaimer in the
-//   documentation and/or other materials provided with the distribution.
-// * Neither the name of its author, nor the names of its contributors
-//   may be used to endorse or promote products derived from this software
-//   without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-const fromCharCodes = (chunk) => String.fromCharCode.apply(String, chunk);
-/**
- * @deprecated This function will no longer be exported with the next major
- * release, since protobuf-ts has switch to TextDecoder API. If you need this
- * function, please migrate to @protobufjs/utf8. For context, see
- * https://github.com/timostamm/protobuf-ts/issues/184
- *
- * Reads UTF8 bytes as a string.
- *
- * See [protobufjs / utf8](https://github.com/protobufjs/protobuf.js/blob/9893e35b854621cce64af4bf6be2cff4fb892796/lib/utf8/index.js#L40)
- *
- * Copyright (c) 2016, Daniel Wirtz
- */
-function utf8read(bytes) {
-    if (bytes.length < 1)
-        return "";
-    let pos = 0, // position in bytes
-    parts = [], chunk = [], i = 0, // char offset
-    t; // temporary
-    let len = bytes.length;
-    while (pos < len) {
-        t = bytes[pos++];
-        if (t < 128)
-            chunk[i++] = t;
-        else if (t > 191 && t < 224)
-            chunk[i++] = (t & 31) << 6 | bytes[pos++] & 63;
-        else if (t > 239 && t < 365) {
-            t = ((t & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 0x10000;
-            chunk[i++] = 0xD800 + (t >> 10);
-            chunk[i++] = 0xDC00 + (t & 1023);
-        }
-        else
-            chunk[i++] = (t & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63;
-        if (i > 8191) {
-            parts.push(fromCharCodes(chunk));
-            i = 0;
-        }
-    }
-    if (parts.length) {
-        if (i)
-            parts.push(fromCharCodes(chunk.slice(0, i)));
-        return parts.join("");
-    }
-    return fromCharCodes(chunk.slice(0, i));
-}
-
-/**
- * This handler implements the default behaviour for unknown fields.
- * When reading data, unknown fields are stored on the message, in a
- * symbol property.
- * When writing data, the symbol property is queried and unknown fields
- * are serialized into the output again.
- */
-var UnknownFieldHandler;
-(function (UnknownFieldHandler) {
-    /**
-     * The symbol used to store unknown fields for a message.
-     * The property must conform to `UnknownFieldContainer`.
-     */
-    UnknownFieldHandler.symbol = Symbol.for("protobuf-ts/unknown");
-    /**
-     * Store an unknown field during binary read directly on the message.
-     * This method is compatible with `BinaryReadOptions.readUnknownField`.
-     */
-    UnknownFieldHandler.onRead = (typeName, message, fieldNo, wireType, data) => {
-        let container = is(message) ? message[UnknownFieldHandler.symbol] : message[UnknownFieldHandler.symbol] = [];
-        container.push({ no: fieldNo, wireType, data });
-    };
-    /**
-     * Write unknown fields stored for the message to the writer.
-     * This method is compatible with `BinaryWriteOptions.writeUnknownFields`.
-     */
-    UnknownFieldHandler.onWrite = (typeName, message, writer) => {
-        for (let { no, wireType, data } of UnknownFieldHandler.list(message))
-            writer.tag(no, wireType).raw(data);
-    };
-    /**
-     * List unknown fields stored for the message.
-     * Note that there may be multiples fields with the same number.
-     */
-    UnknownFieldHandler.list = (message, fieldNo) => {
-        if (is(message)) {
-            let all = message[UnknownFieldHandler.symbol];
-            return fieldNo ? all.filter(uf => uf.no == fieldNo) : all;
-        }
-        return [];
-    };
-    /**
-     * Returns the last unknown field by field number.
-     */
-    UnknownFieldHandler.last = (message, fieldNo) => UnknownFieldHandler.list(message, fieldNo).slice(-1)[0];
-    const is = (message) => message && Array.isArray(message[UnknownFieldHandler.symbol]);
-})(UnknownFieldHandler || (UnknownFieldHandler = {}));
-/**
- * Merges binary write or read options. Later values override earlier values.
- */
-function mergeBinaryOptions(a, b) {
-    return Object.assign(Object.assign({}, a), b);
-}
-/**
- * Protobuf binary format wire types.
- *
- * A wire type provides just enough information to find the length of the
- * following value.
- *
- * See https://developers.google.com/protocol-buffers/docs/encoding#structure
- */
-var WireType;
-(function (WireType) {
-    /**
-     * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum
-     */
-    WireType[WireType["Varint"] = 0] = "Varint";
-    /**
-     * Used for fixed64, sfixed64, double.
-     * Always 8 bytes with little-endian byte order.
-     */
-    WireType[WireType["Bit64"] = 1] = "Bit64";
-    /**
-     * Used for string, bytes, embedded messages, packed repeated fields
-     *
-     * Only repeated numeric types (types which use the varint, 32-bit,
-     * or 64-bit wire types) can be packed. In proto3, such fields are
-     * packed by default.
-     */
-    WireType[WireType["LengthDelimited"] = 2] = "LengthDelimited";
-    /**
-     * Used for groups
-     * @deprecated
-     */
-    WireType[WireType["StartGroup"] = 3] = "StartGroup";
-    /**
-     * Used for groups
-     * @deprecated
-     */
-    WireType[WireType["EndGroup"] = 4] = "EndGroup";
-    /**
-     * Used for fixed32, sfixed32, float.
-     * Always 4 bytes with little-endian byte order.
-     */
-    WireType[WireType["Bit32"] = 5] = "Bit32";
-})(WireType || (WireType = {}));
-
-// Copyright 2008 Google Inc.  All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Code generated by the Protocol Buffer compiler is owned by the owner
-// of the input file used when generating it.  This code is not
-// standalone and requires a support library to be linked with it.  This
-// support library is itself covered by the above license.
-/**
- * Read a 64 bit varint as two JS numbers.
- *
- * Returns tuple:
- * [0]: low bits
- * [0]: high bits
- *
- * Copyright 2008 Google Inc.  All rights reserved.
- *
- * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175
- */
-function varint64read() {
-    let lowBits = 0;
-    let highBits = 0;
-    for (let shift = 0; shift < 28; shift += 7) {
-        let b = this.buf[this.pos++];
-        lowBits |= (b & 0x7F) << shift;
-        if ((b & 0x80) == 0) {
-            this.assertBounds();
-            return [lowBits, highBits];
-        }
-    }
-    let middleByte = this.buf[this.pos++];
-    // last four bits of the first 32 bit number
-    lowBits |= (middleByte & 0x0F) << 28;
-    // 3 upper bits are part of the next 32 bit number
-    highBits = (middleByte & 0x70) >> 4;
-    if ((middleByte & 0x80) == 0) {
-        this.assertBounds();
-        return [lowBits, highBits];
-    }
-    for (let shift = 3; shift <= 31; shift += 7) {
-        let b = this.buf[this.pos++];
-        highBits |= (b & 0x7F) << shift;
-        if ((b & 0x80) == 0) {
-            this.assertBounds();
-            return [lowBits, highBits];
-        }
-    }
-    throw new Error('invalid varint');
-}
-/**
- * Write a 64 bit varint, given as two JS numbers, to the given bytes array.
- *
- * Copyright 2008 Google Inc.  All rights reserved.
- *
- * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344
- */
-function varint64write(lo, hi, bytes) {
-    for (let i = 0; i < 28; i = i + 7) {
-        const shift = lo >>> i;
-        const hasNext = !((shift >>> 7) == 0 && hi == 0);
-        const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;
-        bytes.push(byte);
-        if (!hasNext) {
-            return;
-        }
-    }
-    const splitBits = ((lo >>> 28) & 0x0F) | ((hi & 0x07) << 4);
-    const hasMoreBits = !((hi >> 3) == 0);
-    bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xFF);
-    if (!hasMoreBits) {
-        return;
-    }
-    for (let i = 3; i < 31; i = i + 7) {
-        const shift = hi >>> i;
-        const hasNext = !((shift >>> 7) == 0);
-        const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;
-        bytes.push(byte);
-        if (!hasNext) {
-            return;
-        }
-    }
-    bytes.push((hi >>> 31) & 0x01);
-}
-// constants for binary math
-const TWO_PWR_32_DBL$1 = (1 << 16) * (1 << 16);
-/**
- * Parse decimal string of 64 bit integer value as two JS numbers.
- *
- * Returns tuple:
- * [0]: minus sign?
- * [1]: low bits
- * [2]: high bits
- *
- * Copyright 2008 Google Inc.
- */
-function int64fromString(dec) {
-    // Check for minus sign.
-    let minus = dec[0] == '-';
-    if (minus)
-        dec = dec.slice(1);
-    // Work 6 decimal digits at a time, acting like we're converting base 1e6
-    // digits to binary. This is safe to do with floating point math because
-    // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.
-    const base = 1e6;
-    let lowBits = 0;
-    let highBits = 0;
-    function add1e6digit(begin, end) {
-        // Note: Number('') is 0.
-        const digit1e6 = Number(dec.slice(begin, end));
-        highBits *= base;
-        lowBits = lowBits * base + digit1e6;
-        // Carry bits from lowBits to highBits
-        if (lowBits >= TWO_PWR_32_DBL$1) {
-            highBits = highBits + ((lowBits / TWO_PWR_32_DBL$1) | 0);
-            lowBits = lowBits % TWO_PWR_32_DBL$1;
-        }
-    }
-    add1e6digit(-24, -18);
-    add1e6digit(-18, -12);
-    add1e6digit(-12, -6);
-    add1e6digit(-6);
-    return [minus, lowBits, highBits];
-}
-/**
- * Format 64 bit integer value (as two JS numbers) to decimal string.
- *
- * Copyright 2008 Google Inc.
- */
-function int64toString(bitsLow, bitsHigh) {
-    // Skip the expensive conversion if the number is small enough to use the
-    // built-in conversions.
-    if ((bitsHigh >>> 0) <= 0x1FFFFF) {
-        return '' + (TWO_PWR_32_DBL$1 * bitsHigh + (bitsLow >>> 0));
-    }
-    // What this code is doing is essentially converting the input number from
-    // base-2 to base-1e7, which allows us to represent the 64-bit range with
-    // only 3 (very large) digits. Those digits are then trivial to convert to
-    // a base-10 string.
-    // The magic numbers used here are -
-    // 2^24 = 16777216 = (1,6777216) in base-1e7.
-    // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.
-    // Split 32:32 representation into 16:24:24 representation so our
-    // intermediate digits don't overflow.
-    let low = bitsLow & 0xFFFFFF;
-    let mid = (((bitsLow >>> 24) | (bitsHigh << 8)) >>> 0) & 0xFFFFFF;
-    let high = (bitsHigh >> 16) & 0xFFFF;
-    // Assemble our three base-1e7 digits, ignoring carries. The maximum
-    // value in a digit at this step is representable as a 48-bit integer, which
-    // can be stored in a 64-bit floating point number.
-    let digitA = low + (mid * 6777216) + (high * 6710656);
-    let digitB = mid + (high * 8147497);
-    let digitC = (high * 2);
-    // Apply carries from A to B and from B to C.
-    let base = 10000000;
-    if (digitA >= base) {
-        digitB += Math.floor(digitA / base);
-        digitA %= base;
-    }
-    if (digitB >= base) {
-        digitC += Math.floor(digitB / base);
-        digitB %= base;
-    }
-    // Convert base-1e7 digits to base-10, with optional leading zeroes.
-    function decimalFrom1e7(digit1e7, needLeadingZeros) {
-        let partial = digit1e7 ? String(digit1e7) : '';
-        if (needLeadingZeros) {
-            return '0000000'.slice(partial.length) + partial;
-        }
-        return partial;
-    }
-    return decimalFrom1e7(digitC, /*needLeadingZeros=*/ 0) +
-        decimalFrom1e7(digitB, /*needLeadingZeros=*/ digitC) +
-        // If the final 1e7 digit didn't need leading zeros, we would have
-        // returned via the trivial code path at the top.
-        decimalFrom1e7(digitA, /*needLeadingZeros=*/ 1);
-}
-/**
- * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`
- *
- * Copyright 2008 Google Inc.  All rights reserved.
- *
- * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144
- */
-function varint32write(value, bytes) {
-    if (value >= 0) {
-        // write value as varint 32
-        while (value > 0x7f) {
-            bytes.push((value & 0x7f) | 0x80);
-            value = value >>> 7;
-        }
-        bytes.push(value);
-    }
-    else {
-        for (let i = 0; i < 9; i++) {
-            bytes.push(value & 127 | 128);
-            value = value >> 7;
-        }
-        bytes.push(1);
-    }
-}
-/**
- * Read an unsigned 32 bit varint.
- *
- * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220
- */
-function varint32read() {
-    let b = this.buf[this.pos++];
-    let result = b & 0x7F;
-    if ((b & 0x80) == 0) {
-        this.assertBounds();
-        return result;
-    }
-    b = this.buf[this.pos++];
-    result |= (b & 0x7F) << 7;
-    if ((b & 0x80) == 0) {
-        this.assertBounds();
-        return result;
-    }
-    b = this.buf[this.pos++];
-    result |= (b & 0x7F) << 14;
-    if ((b & 0x80) == 0) {
-        this.assertBounds();
-        return result;
-    }
-    b = this.buf[this.pos++];
-    result |= (b & 0x7F) << 21;
-    if ((b & 0x80) == 0) {
-        this.assertBounds();
-        return result;
-    }
-    // Extract only last 4 bits
-    b = this.buf[this.pos++];
-    result |= (b & 0x0F) << 28;
-    for (let readBytes = 5; ((b & 0x80) !== 0) && readBytes < 10; readBytes++)
-        b = this.buf[this.pos++];
-    if ((b & 0x80) != 0)
-        throw new Error('invalid varint');
-    this.assertBounds();
-    // Result can have 32 bits, convert it to unsigned
-    return result >>> 0;
-}
-
-let BI;
-function detectBi() {
-    const dv = new DataView(new ArrayBuffer(8));
-    const ok = globalThis.BigInt !== undefined
-        && typeof dv.getBigInt64 === "function"
-        && typeof dv.getBigUint64 === "function"
-        && typeof dv.setBigInt64 === "function"
-        && typeof dv.setBigUint64 === "function";
-    BI = ok ? {
-        MIN: BigInt("-9223372036854775808"),
-        MAX: BigInt("9223372036854775807"),
-        UMIN: BigInt("0"),
-        UMAX: BigInt("18446744073709551615"),
-        C: BigInt,
-        V: dv,
-    } : undefined;
-}
-detectBi();
-function assertBi(bi) {
-    if (!bi)
-        throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support");
-}
-// used to validate from(string) input (when bigint is unavailable)
-const RE_DECIMAL_STR = /^-?[0-9]+$/;
-// constants for binary math
-const TWO_PWR_32_DBL = 0x100000000;
-const HALF_2_PWR_32 = 0x080000000;
-// base class for PbLong and PbULong provides shared code
-class SharedPbLong {
-    /**
-     * Create a new instance with the given bits.
-     */
-    constructor(lo, hi) {
-        this.lo = lo | 0;
-        this.hi = hi | 0;
-    }
-    /**
-     * Is this instance equal to 0?
-     */
-    isZero() {
-        return this.lo == 0 && this.hi == 0;
-    }
-    /**
-     * Convert to a native number.
-     */
-    toNumber() {
-        let result = this.hi * TWO_PWR_32_DBL + (this.lo >>> 0);
-        if (!Number.isSafeInteger(result))
-            throw new Error("cannot convert to safe number");
-        return result;
-    }
-}
-/**
- * 64-bit unsigned integer as two 32-bit values.
- * Converts between `string`, `number` and `bigint` representations.
- */
-class PbULong extends SharedPbLong {
-    /**
-     * Create instance from a `string`, `number` or `bigint`.
-     */
-    static from(value) {
-        if (BI)
-            // noinspection FallThroughInSwitchStatementJS
-            switch (typeof value) {
-                case "string":
-                    if (value == "0")
-                        return this.ZERO;
-                    if (value == "")
-                        throw new Error('string is no integer');
-                    value = BI.C(value);
-                case "number":
-                    if (value === 0)
-                        return this.ZERO;
-                    value = BI.C(value);
-                case "bigint":
-                    if (!value)
-                        return this.ZERO;
-                    if (value < BI.UMIN)
-                        throw new Error('signed value for ulong');
-                    if (value > BI.UMAX)
-                        throw new Error('ulong too large');
-                    BI.V.setBigUint64(0, value, true);
-                    return new PbULong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));
-            }
-        else
-            switch (typeof value) {
-                case "string":
-                    if (value == "0")
-                        return this.ZERO;
-                    value = value.trim();
-                    if (!RE_DECIMAL_STR.test(value))
-                        throw new Error('string is no integer');
-                    let [minus, lo, hi] = int64fromString(value);
-                    if (minus)
-                        throw new Error('signed value for ulong');
-                    return new PbULong(lo, hi);
-                case "number":
-                    if (value == 0)
-                        return this.ZERO;
-                    if (!Number.isSafeInteger(value))
-                        throw new Error('number is no integer');
-                    if (value < 0)
-                        throw new Error('signed value for ulong');
-                    return new PbULong(value, value / TWO_PWR_32_DBL);
-            }
-        throw new Error('unknown value ' + typeof value);
-    }
-    /**
-     * Convert to decimal string.
-     */
-    toString() {
-        return BI ? this.toBigInt().toString() : int64toString(this.lo, this.hi);
-    }
-    /**
-     * Convert to native bigint.
-     */
-    toBigInt() {
-        assertBi(BI);
-        BI.V.setInt32(0, this.lo, true);
-        BI.V.setInt32(4, this.hi, true);
-        return BI.V.getBigUint64(0, true);
-    }
-}
-/**
- * ulong 0 singleton.
- */
-PbULong.ZERO = new PbULong(0, 0);
-/**
- * 64-bit signed integer as two 32-bit values.
- * Converts between `string`, `number` and `bigint` representations.
- */
-class PbLong extends SharedPbLong {
-    /**
-     * Create instance from a `string`, `number` or `bigint`.
-     */
-    static from(value) {
-        if (BI)
-            // noinspection FallThroughInSwitchStatementJS
-            switch (typeof value) {
-                case "string":
-                    if (value == "0")
-                        return this.ZERO;
-                    if (value == "")
-                        throw new Error('string is no integer');
-                    value = BI.C(value);
-                case "number":
-                    if (value === 0)
-                        return this.ZERO;
-                    value = BI.C(value);
-                case "bigint":
-                    if (!value)
-                        return this.ZERO;
-                    if (value < BI.MIN)
-                        throw new Error('signed long too small');
-                    if (value > BI.MAX)
-                        throw new Error('signed long too large');
-                    BI.V.setBigInt64(0, value, true);
-                    return new PbLong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));
-            }
-        else
-            switch (typeof value) {
-                case "string":
-                    if (value == "0")
-                        return this.ZERO;
-                    value = value.trim();
-                    if (!RE_DECIMAL_STR.test(value))
-                        throw new Error('string is no integer');
-                    let [minus, lo, hi] = int64fromString(value);
-                    if (minus) {
-                        if (hi > HALF_2_PWR_32 || (hi == HALF_2_PWR_32 && lo != 0))
-                            throw new Error('signed long too small');
-                    }
-                    else if (hi >= HALF_2_PWR_32)
-                        throw new Error('signed long too large');
-                    let pbl = new PbLong(lo, hi);
-                    return minus ? pbl.negate() : pbl;
-                case "number":
-                    if (value == 0)
-                        return this.ZERO;
-                    if (!Number.isSafeInteger(value))
-                        throw new Error('number is no integer');
-                    return value > 0
-                        ? new PbLong(value, value / TWO_PWR_32_DBL)
-                        : new PbLong(-value, -value / TWO_PWR_32_DBL).negate();
-            }
-        throw new Error('unknown value ' + typeof value);
-    }
-    /**
-     * Do we have a minus sign?
-     */
-    isNegative() {
-        return (this.hi & HALF_2_PWR_32) !== 0;
-    }
-    /**
-     * Negate two's complement.
-     * Invert all the bits and add one to the result.
-     */
-    negate() {
-        let hi = ~this.hi, lo = this.lo;
-        if (lo)
-            lo = ~lo + 1;
-        else
-            hi += 1;
-        return new PbLong(lo, hi);
-    }
-    /**
-     * Convert to decimal string.
-     */
-    toString() {
-        if (BI)
-            return this.toBigInt().toString();
-        if (this.isNegative()) {
-            let n = this.negate();
-            return '-' + int64toString(n.lo, n.hi);
-        }
-        return int64toString(this.lo, this.hi);
-    }
-    /**
-     * Convert to native bigint.
-     */
-    toBigInt() {
-        assertBi(BI);
-        BI.V.setInt32(0, this.lo, true);
-        BI.V.setInt32(4, this.hi, true);
-        return BI.V.getBigInt64(0, true);
-    }
-}
-/**
- * long 0 singleton.
- */
-PbLong.ZERO = new PbLong(0, 0);
-
-const defaultsRead$1 = {
-    readUnknownField: true,
-    readerFactory: bytes => new BinaryReader(bytes),
-};
-/**
- * Make options for reading binary data form partial options.
- */
-function binaryReadOptions(options) {
-    return options ? Object.assign(Object.assign({}, defaultsRead$1), options) : defaultsRead$1;
-}
-class BinaryReader {
-    constructor(buf, textDecoder) {
-        this.varint64 = varint64read; // dirty cast for `this`
-        /**
-         * Read a `uint32` field, an unsigned 32 bit varint.
-         */
-        this.uint32 = varint32read; // dirty cast for `this` and access to protected `buf`
-        this.buf = buf;
-        this.len = buf.length;
-        this.pos = 0;
-        this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
-        this.textDecoder = textDecoder !== null && textDecoder !== void 0 ? textDecoder : new TextDecoder("utf-8", {
-            fatal: true,
-            ignoreBOM: true,
-        });
-    }
-    /**
-     * Reads a tag - field number and wire type.
-     */
-    tag() {
-        let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;
-        if (fieldNo <= 0 || wireType < 0 || wireType > 5)
-            throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
-        return [fieldNo, wireType];
-    }
-    /**
-     * Skip one element on the wire and return the skipped data.
-     * Supports WireType.StartGroup since v2.0.0-alpha.23.
-     */
-    skip(wireType) {
-        let start = this.pos;
-        // noinspection FallThroughInSwitchStatementJS
-        switch (wireType) {
-            case WireType.Varint:
-                while (this.buf[this.pos++] & 0x80) {
-                    // ignore
-                }
-                break;
-            case WireType.Bit64:
-                this.pos += 4;
-            case WireType.Bit32:
-                this.pos += 4;
-                break;
-            case WireType.LengthDelimited:
-                let len = this.uint32();
-                this.pos += len;
-                break;
-            case WireType.StartGroup:
-                // From descriptor.proto: Group type is deprecated, not supported in proto3.
-                // But we must still be able to parse and treat as unknown.
-                let t;
-                while ((t = this.tag()[1]) !== WireType.EndGroup) {
-                    this.skip(t);
-                }
-                break;
-            default:
-                throw new Error("cant skip wire type " + wireType);
-        }
-        this.assertBounds();
-        return this.buf.subarray(start, this.pos);
-    }
-    /**
-     * Throws error if position in byte array is out of range.
-     */
-    assertBounds() {
-        if (this.pos > this.len)
-            throw new RangeError("premature EOF");
-    }
-    /**
-     * Read a `int32` field, a signed 32 bit varint.
-     */
-    int32() {
-        return this.uint32() | 0;
-    }
-    /**
-     * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.
-     */
-    sint32() {
-        let zze = this.uint32();
-        // decode zigzag
-        return (zze >>> 1) ^ -(zze & 1);
-    }
-    /**
-     * Read a `int64` field, a signed 64-bit varint.
-     */
-    int64() {
-        return new PbLong(...this.varint64());
-    }
-    /**
-     * Read a `uint64` field, an unsigned 64-bit varint.
-     */
-    uint64() {
-        return new PbULong(...this.varint64());
-    }
-    /**
-     * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.
-     */
-    sint64() {
-        let [lo, hi] = this.varint64();
-        // decode zig zag
-        let s = -(lo & 1);
-        lo = ((lo >>> 1 | (hi & 1) << 31) ^ s);
-        hi = (hi >>> 1 ^ s);
-        return new PbLong(lo, hi);
-    }
-    /**
-     * Read a `bool` field, a variant.
-     */
-    bool() {
-        let [lo, hi] = this.varint64();
-        return lo !== 0 || hi !== 0;
-    }
-    /**
-     * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.
-     */
-    fixed32() {
-        return this.view.getUint32((this.pos += 4) - 4, true);
-    }
-    /**
-     * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.
-     */
-    sfixed32() {
-        return this.view.getInt32((this.pos += 4) - 4, true);
-    }
-    /**
-     * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.
-     */
-    fixed64() {
-        return new PbULong(this.sfixed32(), this.sfixed32());
-    }
-    /**
-     * Read a `fixed64` field, a signed, fixed-length 64-bit integer.
-     */
-    sfixed64() {
-        return new PbLong(this.sfixed32(), this.sfixed32());
-    }
-    /**
-     * Read a `float` field, 32-bit floating point number.
-     */
-    float() {
-        return this.view.getFloat32((this.pos += 4) - 4, true);
-    }
-    /**
-     * Read a `double` field, a 64-bit floating point number.
-     */
-    double() {
-        return this.view.getFloat64((this.pos += 8) - 8, true);
-    }
-    /**
-     * Read a `bytes` field, length-delimited arbitrary data.
-     */
-    bytes() {
-        let len = this.uint32();
-        let start = this.pos;
-        this.pos += len;
-        this.assertBounds();
-        return this.buf.subarray(start, start + len);
-    }
-    /**
-     * Read a `string` field, length-delimited data converted to UTF-8 text.
-     */
-    string() {
-        return this.textDecoder.decode(this.bytes());
-    }
-}
-
-/**
- * assert that condition is true or throw error (with message)
- */
-function assert(condition, msg) {
-    if (!condition) {
-        throw new Error(msg);
-    }
-}
-/**
- * assert that value cannot exist = type `never`. throw runtime error if it does.
- */
-function assertNever(value, msg) {
-    throw new Error(msg !== null && msg !== void 0 ? msg : 'Unexpected object: ' + value);
-}
-const FLOAT32_MAX = 3.4028234663852886e+38, FLOAT32_MIN = -34028234663852886e22, UINT32_MAX = 0xFFFFFFFF, INT32_MAX = 0X7FFFFFFF, INT32_MIN = -2147483648;
-function assertInt32(arg) {
-    if (typeof arg !== "number")
-        throw new Error('invalid int 32: ' + typeof arg);
-    if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)
-        throw new Error('invalid int 32: ' + arg);
-}
-function assertUInt32(arg) {
-    if (typeof arg !== "number")
-        throw new Error('invalid uint 32: ' + typeof arg);
-    if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)
-        throw new Error('invalid uint 32: ' + arg);
-}
-function assertFloat32(arg) {
-    if (typeof arg !== "number")
-        throw new Error('invalid float 32: ' + typeof arg);
-    if (!Number.isFinite(arg))
-        return;
-    if (arg > FLOAT32_MAX || arg < FLOAT32_MIN)
-        throw new Error('invalid float 32: ' + arg);
-}
-
-const defaultsWrite$1 = {
-    writeUnknownFields: true,
-    writerFactory: () => new BinaryWriter(),
-};
-/**
- * Make options for writing binary data form partial options.
- */
-function binaryWriteOptions(options) {
-    return options ? Object.assign(Object.assign({}, defaultsWrite$1), options) : defaultsWrite$1;
-}
-class BinaryWriter {
-    constructor(textEncoder) {
-        /**
-         * Previous fork states.
-         */
-        this.stack = [];
-        this.textEncoder = textEncoder !== null && textEncoder !== void 0 ? textEncoder : new TextEncoder();
-        this.chunks = [];
-        this.buf = [];
-    }
-    /**
-     * Return all bytes written and reset this writer.
-     */
-    finish() {
-        this.chunks.push(new Uint8Array(this.buf)); // flush the buffer
-        let len = 0;
-        for (let i = 0; i < this.chunks.length; i++)
-            len += this.chunks[i].length;
-        let bytes = new Uint8Array(len);
-        let offset = 0;
-        for (let i = 0; i < this.chunks.length; i++) {
-            bytes.set(this.chunks[i], offset);
-            offset += this.chunks[i].length;
-        }
-        this.chunks = [];
-        return bytes;
-    }
-    /**
-     * Start a new fork for length-delimited data like a message
-     * or a packed repeated field.
-     *
-     * Must be joined later with `join()`.
-     */
-    fork() {
-        this.stack.push({ chunks: this.chunks, buf: this.buf });
-        this.chunks = [];
-        this.buf = [];
-        return this;
-    }
-    /**
-     * Join the last fork. Write its length and bytes, then
-     * return to the previous state.
-     */
-    join() {
-        // get chunk of fork
-        let chunk = this.finish();
-        // restore previous state
-        let prev = this.stack.pop();
-        if (!prev)
-            throw new Error('invalid state, fork stack empty');
-        this.chunks = prev.chunks;
-        this.buf = prev.buf;
-        // write length of chunk as varint
-        this.uint32(chunk.byteLength);
-        return this.raw(chunk);
-    }
-    /**
-     * Writes a tag (field number and wire type).
-     *
-     * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.
-     *
-     * Generated code should compute the tag ahead of time and call `uint32()`.
-     */
-    tag(fieldNo, type) {
-        return this.uint32((fieldNo << 3 | type) >>> 0);
-    }
-    /**
-     * Write a chunk of raw bytes.
-     */
-    raw(chunk) {
-        if (this.buf.length) {
-            this.chunks.push(new Uint8Array(this.buf));
-            this.buf = [];
-        }
-        this.chunks.push(chunk);
-        return this;
-    }
-    /**
-     * Write a `uint32` value, an unsigned 32 bit varint.
-     */
-    uint32(value) {
-        assertUInt32(value);
-        // write value as varint 32, inlined for speed
-        while (value > 0x7f) {
-            this.buf.push((value & 0x7f) | 0x80);
-            value = value >>> 7;
-        }
-        this.buf.push(value);
-        return this;
-    }
-    /**
-     * Write a `int32` value, a signed 32 bit varint.
-     */
-    int32(value) {
-        assertInt32(value);
-        varint32write(value, this.buf);
-        return this;
-    }
-    /**
-     * Write a `bool` value, a variant.
-     */
-    bool(value) {
-        this.buf.push(value ? 1 : 0);
-        return this;
-    }
-    /**
-     * Write a `bytes` value, length-delimited arbitrary data.
-     */
-    bytes(value) {
-        this.uint32(value.byteLength); // write length of chunk as varint
-        return this.raw(value);
-    }
-    /**
-     * Write a `string` value, length-delimited data converted to UTF-8 text.
-     */
-    string(value) {
-        let chunk = this.textEncoder.encode(value);
-        this.uint32(chunk.byteLength); // write length of chunk as varint
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `float` value, 32-bit floating point number.
-     */
-    float(value) {
-        assertFloat32(value);
-        let chunk = new Uint8Array(4);
-        new DataView(chunk.buffer).setFloat32(0, value, true);
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `double` value, a 64-bit floating point number.
-     */
-    double(value) {
-        let chunk = new Uint8Array(8);
-        new DataView(chunk.buffer).setFloat64(0, value, true);
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.
-     */
-    fixed32(value) {
-        assertUInt32(value);
-        let chunk = new Uint8Array(4);
-        new DataView(chunk.buffer).setUint32(0, value, true);
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.
-     */
-    sfixed32(value) {
-        assertInt32(value);
-        let chunk = new Uint8Array(4);
-        new DataView(chunk.buffer).setInt32(0, value, true);
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.
-     */
-    sint32(value) {
-        assertInt32(value);
-        // zigzag encode
-        value = ((value << 1) ^ (value >> 31)) >>> 0;
-        varint32write(value, this.buf);
-        return this;
-    }
-    /**
-     * Write a `fixed64` value, a signed, fixed-length 64-bit integer.
-     */
-    sfixed64(value) {
-        let chunk = new Uint8Array(8);
-        let view = new DataView(chunk.buffer);
-        let long = PbLong.from(value);
-        view.setInt32(0, long.lo, true);
-        view.setInt32(4, long.hi, true);
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.
-     */
-    fixed64(value) {
-        let chunk = new Uint8Array(8);
-        let view = new DataView(chunk.buffer);
-        let long = PbULong.from(value);
-        view.setInt32(0, long.lo, true);
-        view.setInt32(4, long.hi, true);
-        return this.raw(chunk);
-    }
-    /**
-     * Write a `int64` value, a signed 64-bit varint.
-     */
-    int64(value) {
-        let long = PbLong.from(value);
-        varint64write(long.lo, long.hi, this.buf);
-        return this;
-    }
-    /**
-     * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.
-     */
-    sint64(value) {
-        let long = PbLong.from(value), 
-        // zigzag encode
-        sign = long.hi >> 31, lo = (long.lo << 1) ^ sign, hi = ((long.hi << 1) | (long.lo >>> 31)) ^ sign;
-        varint64write(lo, hi, this.buf);
-        return this;
-    }
-    /**
-     * Write a `uint64` value, an unsigned 64-bit varint.
-     */
-    uint64(value) {
-        let long = PbULong.from(value);
-        varint64write(long.lo, long.hi, this.buf);
-        return this;
-    }
-}
-
-const defaultsWrite = {
-    emitDefaultValues: false,
-    enumAsInteger: false,
-    useProtoFieldName: false,
-    prettySpaces: 0,
-}, defaultsRead = {
-    ignoreUnknownFields: false,
-};
-/**
- * Make options for reading JSON data from partial options.
- */
-function jsonReadOptions(options) {
-    return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;
-}
-/**
- * Make options for writing JSON data from partial options.
- */
-function jsonWriteOptions(options) {
-    return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;
-}
-/**
- * Merges JSON write or read options. Later values override earlier values. Type registries are merged.
- */
-function mergeJsonOptions(a, b) {
-    var _a, _b;
-    let c = Object.assign(Object.assign({}, a), b);
-    c.typeRegistry = [...((_a = a === null || a === void 0 ? void 0 : a.typeRegistry) !== null && _a !== void 0 ? _a : []), ...((_b = b === null || b === void 0 ? void 0 : b.typeRegistry) !== null && _b !== void 0 ? _b : [])];
-    return c;
-}
-
-/**
- * The symbol used as a key on message objects to store the message type.
- *
- * Note that this is an experimental feature - it is here to stay, but
- * implementation details may change without notice.
- */
-const MESSAGE_TYPE = Symbol.for("protobuf-ts/message-type");
-
-/**
- * Converts snake_case to lowerCamelCase.
- *
- * Should behave like protoc:
- * https://github.com/protocolbuffers/protobuf/blob/e8ae137c96444ea313485ed1118c5e43b2099cf1/src/google/protobuf/compiler/java/java_helpers.cc#L118
- */
-function lowerCamelCase(snakeCase) {
-    let capNext = false;
-    const sb = [];
-    for (let i = 0; i < snakeCase.length; i++) {
-        let next = snakeCase.charAt(i);
-        if (next == '_') {
-            capNext = true;
-        }
-        else if (/\d/.test(next)) {
-            sb.push(next);
-            capNext = true;
-        }
-        else if (capNext) {
-            sb.push(next.toUpperCase());
-            capNext = false;
-        }
-        else if (i == 0) {
-            sb.push(next.toLowerCase());
-        }
-        else {
-            sb.push(next);
-        }
-    }
-    return sb.join('');
-}
-
-/**
- * Scalar value types. This is a subset of field types declared by protobuf
- * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE
- * are omitted, but the numerical values are identical.
- */
-var ScalarType;
-(function (ScalarType) {
-    // 0 is reserved for errors.
-    // Order is weird for historical reasons.
-    ScalarType[ScalarType["DOUBLE"] = 1] = "DOUBLE";
-    ScalarType[ScalarType["FLOAT"] = 2] = "FLOAT";
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-    // negative values are likely.
-    ScalarType[ScalarType["INT64"] = 3] = "INT64";
-    ScalarType[ScalarType["UINT64"] = 4] = "UINT64";
-    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-    // negative values are likely.
-    ScalarType[ScalarType["INT32"] = 5] = "INT32";
-    ScalarType[ScalarType["FIXED64"] = 6] = "FIXED64";
-    ScalarType[ScalarType["FIXED32"] = 7] = "FIXED32";
-    ScalarType[ScalarType["BOOL"] = 8] = "BOOL";
-    ScalarType[ScalarType["STRING"] = 9] = "STRING";
-    // Tag-delimited aggregate.
-    // Group type is deprecated and not supported in proto3. However, Proto3
-    // implementations should still be able to parse the group wire format and
-    // treat group fields as unknown fields.
-    // TYPE_GROUP = 10,
-    // TYPE_MESSAGE = 11,  // Length-delimited aggregate.
-    // New in version 2.
-    ScalarType[ScalarType["BYTES"] = 12] = "BYTES";
-    ScalarType[ScalarType["UINT32"] = 13] = "UINT32";
-    // TYPE_ENUM = 14,
-    ScalarType[ScalarType["SFIXED32"] = 15] = "SFIXED32";
-    ScalarType[ScalarType["SFIXED64"] = 16] = "SFIXED64";
-    ScalarType[ScalarType["SINT32"] = 17] = "SINT32";
-    ScalarType[ScalarType["SINT64"] = 18] = "SINT64";
-})(ScalarType || (ScalarType = {}));
-/**
- * JavaScript representation of 64 bit integral types. Equivalent to the
- * field option "jstype".
- *
- * By default, protobuf-ts represents 64 bit types as `bigint`.
- *
- * You can change the default behaviour by enabling the plugin parameter
- * `long_type_string`, which will represent 64 bit types as `string`.
- *
- * Alternatively, you can change the behaviour for individual fields
- * with the field option "jstype":
- *
- * ```protobuf
- * uint64 my_field = 1 [jstype = JS_STRING];
- * uint64 other_field = 2 [jstype = JS_NUMBER];
- * ```
- */
-var LongType;
-(function (LongType) {
-    /**
-     * Use JavaScript `bigint`.
-     *
-     * Field option `[jstype = JS_NORMAL]`.
-     */
-    LongType[LongType["BIGINT"] = 0] = "BIGINT";
-    /**
-     * Use JavaScript `string`.
-     *
-     * Field option `[jstype = JS_STRING]`.
-     */
-    LongType[LongType["STRING"] = 1] = "STRING";
-    /**
-     * Use JavaScript `number`.
-     *
-     * Large values will loose precision.
-     *
-     * Field option `[jstype = JS_NUMBER]`.
-     */
-    LongType[LongType["NUMBER"] = 2] = "NUMBER";
-})(LongType || (LongType = {}));
-/**
- * Protobuf 2.1.0 introduced packed repeated fields.
- * Setting the field option `[packed = true]` enables packing.
- *
- * In proto3, all repeated fields are packed by default.
- * Setting the field option `[packed = false]` disables packing.
- *
- * Packed repeated fields are encoded with a single tag,
- * then a length-delimiter, then the element values.
- *
- * Unpacked repeated fields are encoded with a tag and
- * value for each element.
- *
- * `bytes` and `string` cannot be packed.
- */
-var RepeatType;
-(function (RepeatType) {
-    /**
-     * The field is not repeated.
-     */
-    RepeatType[RepeatType["NO"] = 0] = "NO";
-    /**
-     * The field is repeated and should be packed.
-     * Invalid for `bytes` and `string`, they cannot be packed.
-     */
-    RepeatType[RepeatType["PACKED"] = 1] = "PACKED";
-    /**
-     * The field is repeated but should not be packed.
-     * The only valid repeat type for repeated `bytes` and `string`.
-     */
-    RepeatType[RepeatType["UNPACKED"] = 2] = "UNPACKED";
-})(RepeatType || (RepeatType = {}));
-/**
- * Turns PartialFieldInfo into FieldInfo.
- */
-function normalizeFieldInfo(field) {
-    var _a, _b, _c, _d;
-    field.localName = (_a = field.localName) !== null && _a !== void 0 ? _a : lowerCamelCase(field.name);
-    field.jsonName = (_b = field.jsonName) !== null && _b !== void 0 ? _b : lowerCamelCase(field.name);
-    field.repeat = (_c = field.repeat) !== null && _c !== void 0 ? _c : RepeatType.NO;
-    field.opt = (_d = field.opt) !== null && _d !== void 0 ? _d : (field.repeat ? false : field.oneof ? false : field.kind == "message");
-    return field;
-}
-/**
- * Read custom field options from a generated message type.
- *
- * @deprecated use readFieldOption()
- */
-function readFieldOptions(messageType, fieldName, extensionName, extensionType) {
-    var _a;
-    const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;
-    return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;
-}
-function readFieldOption(messageType, fieldName, extensionName, extensionType) {
-    var _a;
-    const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;
-    if (!options) {
-        return undefined;
-    }
-    const optionVal = options[extensionName];
-    if (optionVal === undefined) {
-        return optionVal;
-    }
-    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
-}
-function readMessageOption(messageType, extensionName, extensionType) {
-    const options = messageType.options;
-    const optionVal = options[extensionName];
-    if (optionVal === undefined) {
-        return optionVal;
-    }
-    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
-}
-
-/**
- * Is the given value a valid oneof group?
- *
- * We represent protobuf `oneof` as algebraic data types (ADT) in generated
- * code. But when working with messages of unknown type, the ADT does not
- * help us.
- *
- * This type guard checks if the given object adheres to the ADT rules, which
- * are as follows:
- *
- * 1) Must be an object.
- *
- * 2) Must have a "oneofKind" discriminator property.
- *
- * 3) If "oneofKind" is `undefined`, no member field is selected. The object
- * must not have any other properties.
- *
- * 4) If "oneofKind" is a `string`, the member field with this name is
- * selected.
- *
- * 5) If a member field is selected, the object must have a second property
- * with this name. The property must not be `undefined`.
- *
- * 6) No extra properties are allowed. The object has either one property
- * (no selection) or two properties (selection).
- *
- */
-function isOneofGroup(any) {
-    if (typeof any != 'object' || any === null || !any.hasOwnProperty('oneofKind')) {
-        return false;
-    }
-    switch (typeof any.oneofKind) {
-        case "string":
-            if (any[any.oneofKind] === undefined)
-                return false;
-            return Object.keys(any).length == 2;
-        case "undefined":
-            return Object.keys(any).length == 1;
-        default:
-            return false;
-    }
-}
-/**
- * Returns the value of the given field in a oneof group.
- */
-function getOneofValue(oneof, kind) {
-    return oneof[kind];
-}
-function setOneofValue(oneof, kind, value) {
-    if (oneof.oneofKind !== undefined) {
-        delete oneof[oneof.oneofKind];
-    }
-    oneof.oneofKind = kind;
-    if (value !== undefined) {
-        oneof[kind] = value;
-    }
-}
-/**
- * Removes the selected field in a oneof group.
- *
- * Note that the recommended way to modify a oneof group is to set
- * a new object:
- *
- * ```ts
- * message.result = { oneofKind: undefined };
- * ```
- */
-function clearOneofValue(oneof) {
-    if (oneof.oneofKind !== undefined) {
-        delete oneof[oneof.oneofKind];
-    }
-    oneof.oneofKind = undefined;
-}
-/**
- * Returns the selected value of the given oneof group.
- *
- * Not that the recommended way to access a oneof group is to check
- * the "oneofKind" property and let TypeScript narrow down the union
- * type for you:
- *
- * ```ts
- * if (message.result.oneofKind === "error") {
- *   message.result.error; // string
- * }
- * ```
- *
- * In the rare case you just need the value, and do not care about
- * which protobuf field is selected, you can use this function
- * for convenience.
- */
-function getSelectedOneofValue(oneof) {
-    if (oneof.oneofKind === undefined) {
-        return undefined;
-    }
-    return oneof[oneof.oneofKind];
-}
-
-// noinspection JSMethodCanBeStatic
-class ReflectionTypeCheck {
-    constructor(info) {
-        var _a;
-        this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];
-    }
-    prepare() {
-        if (this.data)
-            return;
-        const req = [], known = [], oneofs = [];
-        for (let field of this.fields) {
-            if (field.oneof) {
-                if (!oneofs.includes(field.oneof)) {
-                    oneofs.push(field.oneof);
-                    req.push(field.oneof);
-                    known.push(field.oneof);
-                }
-            }
-            else {
-                known.push(field.localName);
-                switch (field.kind) {
-                    case "scalar":
-                    case "enum":
-                        if (!field.opt || field.repeat)
-                            req.push(field.localName);
-                        break;
-                    case "message":
-                        if (field.repeat)
-                            req.push(field.localName);
-                        break;
-                    case "map":
-                        req.push(field.localName);
-                        break;
-                }
-            }
-        }
-        this.data = { req, known, oneofs: Object.values(oneofs) };
-    }
-    /**
-     * Is the argument a valid message as specified by the
-     * reflection information?
-     *
-     * Checks all field types recursively. The `depth`
-     * specifies how deep into the structure the check will be.
-     *
-     * With a depth of 0, only the presence of fields
-     * is checked.
-     *
-     * With a depth of 1 or more, the field types are checked.
-     *
-     * With a depth of 2 or more, the members of map, repeated
-     * and message fields are checked.
-     *
-     * Message fields will be checked recursively with depth - 1.
-     *
-     * The number of map entries / repeated values being checked
-     * is < depth.
-     */
-    is(message, depth, allowExcessProperties = false) {
-        if (depth < 0)
-            return true;
-        if (message === null || message === undefined || typeof message != 'object')
-            return false;
-        this.prepare();
-        let keys = Object.keys(message), data = this.data;
-        // if a required field is missing in arg, this cannot be a T
-        if (keys.length < data.req.length || data.req.some(n => !keys.includes(n)))
-            return false;
-        if (!allowExcessProperties) {
-            // if the arg contains a key we dont know, this is not a literal T
-            if (keys.some(k => !data.known.includes(k)))
-                return false;
-        }
-        // "With a depth of 0, only the presence and absence of fields is checked."
-        // "With a depth of 1 or more, the field types are checked."
-        if (depth < 1) {
-            return true;
-        }
-        // check oneof group
-        for (const name of data.oneofs) {
-            const group = message[name];
-            if (!isOneofGroup(group))
-                return false;
-            if (group.oneofKind === undefined)
-                continue;
-            const field = this.fields.find(f => f.localName === group.oneofKind);
-            if (!field)
-                return false; // we found no field, but have a kind, something is wrong
-            if (!this.field(group[group.oneofKind], field, allowExcessProperties, depth))
-                return false;
-        }
-        // check types
-        for (const field of this.fields) {
-            if (field.oneof !== undefined)
-                continue;
-            if (!this.field(message[field.localName], field, allowExcessProperties, depth))
-                return false;
-        }
-        return true;
-    }
-    field(arg, field, allowExcessProperties, depth) {
-        let repeated = field.repeat;
-        switch (field.kind) {
-            case "scalar":
-                if (arg === undefined)
-                    return field.opt;
-                if (repeated)
-                    return this.scalars(arg, field.T, depth, field.L);
-                return this.scalar(arg, field.T, field.L);
-            case "enum":
-                if (arg === undefined)
-                    return field.opt;
-                if (repeated)
-                    return this.scalars(arg, ScalarType.INT32, depth);
-                return this.scalar(arg, ScalarType.INT32);
-            case "message":
-                if (arg === undefined)
-                    return true;
-                if (repeated)
-                    return this.messages(arg, field.T(), allowExcessProperties, depth);
-                return this.message(arg, field.T(), allowExcessProperties, depth);
-            case "map":
-                if (typeof arg != 'object' || arg === null)
-                    return false;
-                if (depth < 2)
-                    return true;
-                if (!this.mapKeys(arg, field.K, depth))
-                    return false;
-                switch (field.V.kind) {
-                    case "scalar":
-                        return this.scalars(Object.values(arg), field.V.T, depth, field.V.L);
-                    case "enum":
-                        return this.scalars(Object.values(arg), ScalarType.INT32, depth);
-                    case "message":
-                        return this.messages(Object.values(arg), field.V.T(), allowExcessProperties, depth);
-                }
-                break;
-        }
-        return true;
-    }
-    message(arg, type, allowExcessProperties, depth) {
-        if (allowExcessProperties) {
-            return type.isAssignable(arg, depth);
-        }
-        return type.is(arg, depth);
-    }
-    messages(arg, type, allowExcessProperties, depth) {
-        if (!Array.isArray(arg))
-            return false;
-        if (depth < 2)
-            return true;
-        if (allowExcessProperties) {
-            for (let i = 0; i < arg.length && i < depth; i++)
-                if (!type.isAssignable(arg[i], depth - 1))
-                    return false;
-        }
-        else {
-            for (let i = 0; i < arg.length && i < depth; i++)
-                if (!type.is(arg[i], depth - 1))
-                    return false;
-        }
-        return true;
-    }
-    scalar(arg, type, longType) {
-        let argType = typeof arg;
-        switch (type) {
-            case ScalarType.UINT64:
-            case ScalarType.FIXED64:
-            case ScalarType.INT64:
-            case ScalarType.SFIXED64:
-            case ScalarType.SINT64:
-                switch (longType) {
-                    case LongType.BIGINT:
-                        return argType == "bigint";
-                    case LongType.NUMBER:
-                        return argType == "number" && !isNaN(arg);
-                    default:
-                        return argType == "string";
-                }
-            case ScalarType.BOOL:
-                return argType == 'boolean';
-            case ScalarType.STRING:
-                return argType == 'string';
-            case ScalarType.BYTES:
-                return arg instanceof Uint8Array;
-            case ScalarType.DOUBLE:
-            case ScalarType.FLOAT:
-                return argType == 'number' && !isNaN(arg);
-            default:
-                // case ScalarType.UINT32:
-                // case ScalarType.FIXED32:
-                // case ScalarType.INT32:
-                // case ScalarType.SINT32:
-                // case ScalarType.SFIXED32:
-                return argType == 'number' && Number.isInteger(arg);
-        }
-    }
-    scalars(arg, type, depth, longType) {
-        if (!Array.isArray(arg))
-            return false;
-        if (depth < 2)
-            return true;
-        if (Array.isArray(arg))
-            for (let i = 0; i < arg.length && i < depth; i++)
-                if (!this.scalar(arg[i], type, longType))
-                    return false;
-        return true;
-    }
-    mapKeys(map, type, depth) {
-        let keys = Object.keys(map);
-        switch (type) {
-            case ScalarType.INT32:
-            case ScalarType.FIXED32:
-            case ScalarType.SFIXED32:
-            case ScalarType.SINT32:
-            case ScalarType.UINT32:
-                return this.scalars(keys.slice(0, depth).map(k => parseInt(k)), type, depth);
-            case ScalarType.BOOL:
-                return this.scalars(keys.slice(0, depth).map(k => k == 'true' ? true : k == 'false' ? false : k), type, depth);
-            default:
-                return this.scalars(keys, type, depth, LongType.STRING);
-        }
-    }
-}
-
-/**
- * Utility method to convert a PbLong or PbUlong to a JavaScript
- * representation during runtime.
- *
- * Works with generated field information, `undefined` is equivalent
- * to `STRING`.
- */
-function reflectionLongConvert(long, type) {
-    switch (type) {
-        case LongType.BIGINT:
-            return long.toBigInt();
-        case LongType.NUMBER:
-            return long.toNumber();
-        default:
-            // case undefined:
-            // case LongType.STRING:
-            return long.toString();
-    }
-}
-
-/**
- * Reads proto3 messages in canonical JSON format using reflection information.
- *
- * https://developers.google.com/protocol-buffers/docs/proto3#json
- */
-class ReflectionJsonReader {
-    constructor(info) {
-        this.info = info;
-    }
-    prepare() {
-        var _a;
-        if (this.fMap === undefined) {
-            this.fMap = {};
-            const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];
-            for (const field of fieldsInput) {
-                this.fMap[field.name] = field;
-                this.fMap[field.jsonName] = field;
-                this.fMap[field.localName] = field;
-            }
-        }
-    }
-    // Cannot parse JSON  for #.
-    assert(condition, fieldName, jsonValue) {
-        if (!condition) {
-            let what = typeofJsonValue(jsonValue);
-            if (what == "number" || what == "boolean")
-                what = jsonValue.toString();
-            throw new Error(`Cannot parse JSON ${what} for ${this.info.typeName}#${fieldName}`);
-        }
-    }
-    /**
-     * Reads a message from canonical JSON format into the target message.
-     *
-     * Repeated fields are appended. Map entries are added, overwriting
-     * existing keys.
-     *
-     * If a message field is already present, it will be merged with the
-     * new data.
-     */
-    read(input, message, options) {
-        this.prepare();
-        const oneofsHandled = [];
-        for (const [jsonKey, jsonValue] of Object.entries(input)) {
-            const field = this.fMap[jsonKey];
-            if (!field) {
-                if (!options.ignoreUnknownFields)
-                    throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${jsonKey}`);
-                continue;
-            }
-            const localName = field.localName;
-            // handle oneof ADT
-            let target; // this will be the target for the field value, whether it is member of a oneof or not
-            if (field.oneof) {
-                if (jsonValue === null && (field.kind !== 'enum' || field.T()[0] !== 'google.protobuf.NullValue')) {
-                    continue;
-                }
-                // since json objects are unordered by specification, it is not possible to take the last of multiple oneofs
-                if (oneofsHandled.includes(field.oneof))
-                    throw new Error(`Multiple members of the oneof group "${field.oneof}" of ${this.info.typeName} are present in JSON.`);
-                oneofsHandled.push(field.oneof);
-                target = message[field.oneof] = {
-                    oneofKind: localName
-                };
-            }
-            else {
-                target = message;
-            }
-            // we have handled oneof above. we just have read the value into `target`.
-            if (field.kind == 'map') {
-                if (jsonValue === null) {
-                    continue;
-                }
-                // check input
-                this.assert(isJsonObject(jsonValue), field.name, jsonValue);
-                // our target to put map entries into
-                const fieldObj = target[localName];
-                // read entries
-                for (const [jsonObjKey, jsonObjValue] of Object.entries(jsonValue)) {
-                    this.assert(jsonObjValue !== null, field.name + " map value", null);
-                    // read value
-                    let val;
-                    switch (field.V.kind) {
-                        case "message":
-                            val = field.V.T().internalJsonRead(jsonObjValue, options);
-                            break;
-                        case "enum":
-                            val = this.enum(field.V.T(), jsonObjValue, field.name, options.ignoreUnknownFields);
-                            if (val === false)
-                                continue;
-                            break;
-                        case "scalar":
-                            val = this.scalar(jsonObjValue, field.V.T, field.V.L, field.name);
-                            break;
-                    }
-                    this.assert(val !== undefined, field.name + " map value", jsonObjValue);
-                    // read key
-                    let key = jsonObjKey;
-                    if (field.K == ScalarType.BOOL)
-                        key = key == "true" ? true : key == "false" ? false : key;
-                    key = this.scalar(key, field.K, LongType.STRING, field.name).toString();
-                    fieldObj[key] = val;
-                }
-            }
-            else if (field.repeat) {
-                if (jsonValue === null)
-                    continue;
-                // check input
-                this.assert(Array.isArray(jsonValue), field.name, jsonValue);
-                // our target to put array entries into
-                const fieldArr = target[localName];
-                // read array entries
-                for (const jsonItem of jsonValue) {
-                    this.assert(jsonItem !== null, field.name, null);
-                    let val;
-                    switch (field.kind) {
-                        case "message":
-                            val = field.T().internalJsonRead(jsonItem, options);
-                            break;
-                        case "enum":
-                            val = this.enum(field.T(), jsonItem, field.name, options.ignoreUnknownFields);
-                            if (val === false)
-                                continue;
-                            break;
-                        case "scalar":
-                            val = this.scalar(jsonItem, field.T, field.L, field.name);
-                            break;
-                    }
-                    this.assert(val !== undefined, field.name, jsonValue);
-                    fieldArr.push(val);
-                }
-            }
-            else {
-                switch (field.kind) {
-                    case "message":
-                        if (jsonValue === null && field.T().typeName != 'google.protobuf.Value') {
-                            this.assert(field.oneof === undefined, field.name + " (oneof member)", null);
-                            continue;
-                        }
-                        target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]);
-                        break;
-                    case "enum":
-                        if (jsonValue === null)
-                            continue;
-                        let val = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields);
-                        if (val === false)
-                            continue;
-                        target[localName] = val;
-                        break;
-                    case "scalar":
-                        if (jsonValue === null)
-                            continue;
-                        target[localName] = this.scalar(jsonValue, field.T, field.L, field.name);
-                        break;
-                }
-            }
-        }
-    }
-    /**
-     * Returns `false` for unrecognized string representations.
-     *
-     * google.protobuf.NullValue accepts only JSON `null` (or the old `"NULL_VALUE"`).
-     */
-    enum(type, json, fieldName, ignoreUnknownFields) {
-        if (type[0] == 'google.protobuf.NullValue')
-            assert(json === null || json === "NULL_VALUE", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} only accepts null.`);
-        if (json === null)
-            // we require 0 to be default value for all enums
-            return 0;
-        switch (typeof json) {
-            case "number":
-                assert(Number.isInteger(json), `Unable to parse field ${this.info.typeName}#${fieldName}, enum can only be integral number, got ${json}.`);
-                return json;
-            case "string":
-                let localEnumName = json;
-                if (type[2] && json.substring(0, type[2].length) === type[2])
-                    // lookup without the shared prefix
-                    localEnumName = json.substring(type[2].length);
-                let enumNumber = type[1][localEnumName];
-                if (typeof enumNumber === 'undefined' && ignoreUnknownFields) {
-                    return false;
-                }
-                assert(typeof enumNumber == "number", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} has no value for "${json}".`);
-                return enumNumber;
-        }
-        assert(false, `Unable to parse field ${this.info.typeName}#${fieldName}, cannot parse enum value from ${typeof json}".`);
-    }
-    scalar(json, type, longType, fieldName) {
-        let e;
-        try {
-            switch (type) {
-                // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".
-                // Either numbers or strings are accepted. Exponent notation is also accepted.
-                case ScalarType.DOUBLE:
-                case ScalarType.FLOAT:
-                    if (json === null)
-                        return .0;
-                    if (json === "NaN")
-                        return Number.NaN;
-                    if (json === "Infinity")
-                        return Number.POSITIVE_INFINITY;
-                    if (json === "-Infinity")
-                        return Number.NEGATIVE_INFINITY;
-                    if (json === "") {
-                        e = "empty string";
-                        break;
-                    }
-                    if (typeof json == "string" && json.trim().length !== json.length) {
-                        e = "extra whitespace";
-                        break;
-                    }
-                    if (typeof json != "string" && typeof json != "number") {
-                        break;
-                    }
-                    let float = Number(json);
-                    if (Number.isNaN(float)) {
-                        e = "not a number";
-                        break;
-                    }
-                    if (!Number.isFinite(float)) {
-                        // infinity and -infinity are handled by string representation above, so this is an error
-                        e = "too large or small";
-                        break;
-                    }
-                    if (type == ScalarType.FLOAT)
-                        assertFloat32(float);
-                    return float;
-                // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.
-                case ScalarType.INT32:
-                case ScalarType.FIXED32:
-                case ScalarType.SFIXED32:
-                case ScalarType.SINT32:
-                case ScalarType.UINT32:
-                    if (json === null)
-                        return 0;
-                    let int32;
-                    if (typeof json == "number")
-                        int32 = json;
-                    else if (json === "")
-                        e = "empty string";
-                    else if (typeof json == "string") {
-                        if (json.trim().length !== json.length)
-                            e = "extra whitespace";
-                        else
-                            int32 = Number(json);
-                    }
-                    if (int32 === undefined)
-                        break;
-                    if (type == ScalarType.UINT32)
-                        assertUInt32(int32);
-                    else
-                        assertInt32(int32);
-                    return int32;
-                // int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.
-                case ScalarType.INT64:
-                case ScalarType.SFIXED64:
-                case ScalarType.SINT64:
-                    if (json === null)
-                        return reflectionLongConvert(PbLong.ZERO, longType);
-                    if (typeof json != "number" && typeof json != "string")
-                        break;
-                    return reflectionLongConvert(PbLong.from(json), longType);
-                case ScalarType.FIXED64:
-                case ScalarType.UINT64:
-                    if (json === null)
-                        return reflectionLongConvert(PbULong.ZERO, longType);
-                    if (typeof json != "number" && typeof json != "string")
-                        break;
-                    return reflectionLongConvert(PbULong.from(json), longType);
-                // bool:
-                case ScalarType.BOOL:
-                    if (json === null)
-                        return false;
-                    if (typeof json !== "boolean")
-                        break;
-                    return json;
-                // string:
-                case ScalarType.STRING:
-                    if (json === null)
-                        return "";
-                    if (typeof json !== "string") {
-                        e = "extra whitespace";
-                        break;
-                    }
-                    try {
-                        encodeURIComponent(json);
-                    }
-                    catch (e) {
-                        e = "invalid UTF8";
-                        break;
-                    }
-                    return json;
-                // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
-                // Either standard or URL-safe base64 encoding with/without paddings are accepted.
-                case ScalarType.BYTES:
-                    if (json === null || json === "")
-                        return new Uint8Array(0);
-                    if (typeof json !== 'string')
-                        break;
-                    return base64decode(json);
-            }
-        }
-        catch (error) {
-            e = error.message;
-        }
-        this.assert(false, fieldName + (e ? " - " + e : ""), json);
-    }
-}
-
-/**
- * Writes proto3 messages in canonical JSON format using reflection
- * information.
- *
- * https://developers.google.com/protocol-buffers/docs/proto3#json
- */
-class ReflectionJsonWriter {
-    constructor(info) {
-        var _a;
-        this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];
-    }
-    /**
-     * Converts the message to a JSON object, based on the field descriptors.
-     */
-    write(message, options) {
-        const json = {}, source = message;
-        for (const field of this.fields) {
-            // field is not part of a oneof, simply write as is
-            if (!field.oneof) {
-                let jsonValue = this.field(field, source[field.localName], options);
-                if (jsonValue !== undefined)
-                    json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;
-                continue;
-            }
-            // field is part of a oneof
-            const group = source[field.oneof];
-            if (group.oneofKind !== field.localName)
-                continue; // not selected, skip
-            const opt = field.kind == 'scalar' || field.kind == 'enum'
-                ? Object.assign(Object.assign({}, options), { emitDefaultValues: true }) : options;
-            let jsonValue = this.field(field, group[field.localName], opt);
-            assert(jsonValue !== undefined);
-            json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;
-        }
-        return json;
-    }
-    field(field, value, options) {
-        let jsonValue = undefined;
-        if (field.kind == 'map') {
-            assert(typeof value == "object" && value !== null);
-            const jsonObj = {};
-            switch (field.V.kind) {
-                case "scalar":
-                    for (const [entryKey, entryValue] of Object.entries(value)) {
-                        const val = this.scalar(field.V.T, entryValue, field.name, false, true);
-                        assert(val !== undefined);
-                        jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
-                    }
-                    break;
-                case "message":
-                    const messageType = field.V.T();
-                    for (const [entryKey, entryValue] of Object.entries(value)) {
-                        const val = this.message(messageType, entryValue, field.name, options);
-                        assert(val !== undefined);
-                        jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
-                    }
-                    break;
-                case "enum":
-                    const enumInfo = field.V.T();
-                    for (const [entryKey, entryValue] of Object.entries(value)) {
-                        assert(entryValue === undefined || typeof entryValue == 'number');
-                        const val = this.enum(enumInfo, entryValue, field.name, false, true, options.enumAsInteger);
-                        assert(val !== undefined);
-                        jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
-                    }
-                    break;
-            }
-            if (options.emitDefaultValues || Object.keys(jsonObj).length > 0)
-                jsonValue = jsonObj;
-        }
-        else if (field.repeat) {
-            assert(Array.isArray(value));
-            const jsonArr = [];
-            switch (field.kind) {
-                case "scalar":
-                    for (let i = 0; i < value.length; i++) {
-                        const val = this.scalar(field.T, value[i], field.name, field.opt, true);
-                        assert(val !== undefined);
-                        jsonArr.push(val);
-                    }
-                    break;
-                case "enum":
-                    const enumInfo = field.T();
-                    for (let i = 0; i < value.length; i++) {
-                        assert(value[i] === undefined || typeof value[i] == 'number');
-                        const val = this.enum(enumInfo, value[i], field.name, field.opt, true, options.enumAsInteger);
-                        assert(val !== undefined);
-                        jsonArr.push(val);
-                    }
-                    break;
-                case "message":
-                    const messageType = field.T();
-                    for (let i = 0; i < value.length; i++) {
-                        const val = this.message(messageType, value[i], field.name, options);
-                        assert(val !== undefined);
-                        jsonArr.push(val);
-                    }
-                    break;
-            }
-            // add converted array to json output
-            if (options.emitDefaultValues || jsonArr.length > 0 || options.emitDefaultValues)
-                jsonValue = jsonArr;
-        }
-        else {
-            switch (field.kind) {
-                case "scalar":
-                    jsonValue = this.scalar(field.T, value, field.name, field.opt, options.emitDefaultValues);
-                    break;
-                case "enum":
-                    jsonValue = this.enum(field.T(), value, field.name, field.opt, options.emitDefaultValues, options.enumAsInteger);
-                    break;
-                case "message":
-                    jsonValue = this.message(field.T(), value, field.name, options);
-                    break;
-            }
-        }
-        return jsonValue;
-    }
-    /**
-     * Returns `null` as the default for google.protobuf.NullValue.
-     */
-    enum(type, value, fieldName, optional, emitDefaultValues, enumAsInteger) {
-        if (type[0] == 'google.protobuf.NullValue')
-            return !emitDefaultValues && !optional ? undefined : null;
-        if (value === undefined) {
-            assert(optional);
-            return undefined;
-        }
-        if (value === 0 && !emitDefaultValues && !optional)
-            // we require 0 to be default value for all enums
-            return undefined;
-        assert(typeof value == 'number');
-        assert(Number.isInteger(value));
-        if (enumAsInteger || !type[1].hasOwnProperty(value))
-            // if we don't now the enum value, just return the number
-            return value;
-        if (type[2])
-            // restore the dropped prefix
-            return type[2] + type[1][value];
-        return type[1][value];
-    }
-    message(type, value, fieldName, options) {
-        if (value === undefined)
-            return options.emitDefaultValues ? null : undefined;
-        return type.internalJsonWrite(value, options);
-    }
-    scalar(type, value, fieldName, optional, emitDefaultValues) {
-        if (value === undefined) {
-            assert(optional);
-            return undefined;
-        }
-        const ed = emitDefaultValues || optional;
-        // noinspection FallThroughInSwitchStatementJS
-        switch (type) {
-            // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.
-            case ScalarType.INT32:
-            case ScalarType.SFIXED32:
-            case ScalarType.SINT32:
-                if (value === 0)
-                    return ed ? 0 : undefined;
-                assertInt32(value);
-                return value;
-            case ScalarType.FIXED32:
-            case ScalarType.UINT32:
-                if (value === 0)
-                    return ed ? 0 : undefined;
-                assertUInt32(value);
-                return value;
-            // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".
-            // Either numbers or strings are accepted. Exponent notation is also accepted.
-            case ScalarType.FLOAT:
-                assertFloat32(value);
-            case ScalarType.DOUBLE:
-                if (value === 0)
-                    return ed ? 0 : undefined;
-                assert(typeof value == 'number');
-                if (Number.isNaN(value))
-                    return 'NaN';
-                if (value === Number.POSITIVE_INFINITY)
-                    return 'Infinity';
-                if (value === Number.NEGATIVE_INFINITY)
-                    return '-Infinity';
-                return value;
-            // string:
-            case ScalarType.STRING:
-                if (value === "")
-                    return ed ? '' : undefined;
-                assert(typeof value == 'string');
-                return value;
-            // bool:
-            case ScalarType.BOOL:
-                if (value === false)
-                    return ed ? false : undefined;
-                assert(typeof value == 'boolean');
-                return value;
-            // JSON value will be a decimal string. Either numbers or strings are accepted.
-            case ScalarType.UINT64:
-            case ScalarType.FIXED64:
-                assert(typeof value == 'number' || typeof value == 'string' || typeof value == 'bigint');
-                let ulong = PbULong.from(value);
-                if (ulong.isZero() && !ed)
-                    return undefined;
-                return ulong.toString();
-            // JSON value will be a decimal string. Either numbers or strings are accepted.
-            case ScalarType.INT64:
-            case ScalarType.SFIXED64:
-            case ScalarType.SINT64:
-                assert(typeof value == 'number' || typeof value == 'string' || typeof value == 'bigint');
-                let long = PbLong.from(value);
-                if (long.isZero() && !ed)
-                    return undefined;
-                return long.toString();
-            // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
-            // Either standard or URL-safe base64 encoding with/without paddings are accepted.
-            case ScalarType.BYTES:
-                assert(value instanceof Uint8Array);
-                if (!value.byteLength)
-                    return ed ? "" : undefined;
-                return base64encode(value);
-        }
-    }
-}
-
-/**
- * Creates the default value for a scalar type.
- */
-function reflectionScalarDefault(type, longType = LongType.STRING) {
-    switch (type) {
-        case ScalarType.BOOL:
-            return false;
-        case ScalarType.UINT64:
-        case ScalarType.FIXED64:
-            return reflectionLongConvert(PbULong.ZERO, longType);
-        case ScalarType.INT64:
-        case ScalarType.SFIXED64:
-        case ScalarType.SINT64:
-            return reflectionLongConvert(PbLong.ZERO, longType);
-        case ScalarType.DOUBLE:
-        case ScalarType.FLOAT:
-            return 0.0;
-        case ScalarType.BYTES:
-            return new Uint8Array(0);
-        case ScalarType.STRING:
-            return "";
-        default:
-            // case ScalarType.INT32:
-            // case ScalarType.UINT32:
-            // case ScalarType.SINT32:
-            // case ScalarType.FIXED32:
-            // case ScalarType.SFIXED32:
-            return 0;
-    }
-}
-
-/**
- * Reads proto3 messages in binary format using reflection information.
- *
- * https://developers.google.com/protocol-buffers/docs/encoding
- */
-class ReflectionBinaryReader {
-    constructor(info) {
-        this.info = info;
-    }
-    prepare() {
-        var _a;
-        if (!this.fieldNoToField) {
-            const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];
-            this.fieldNoToField = new Map(fieldsInput.map(field => [field.no, field]));
-        }
-    }
-    /**
-     * Reads a message from binary format into the target message.
-     *
-     * Repeated fields are appended. Map entries are added, overwriting
-     * existing keys.
-     *
-     * If a message field is already present, it will be merged with the
-     * new data.
-     */
-    read(reader, message, options, length) {
-        this.prepare();
-        const end = length === undefined ? reader.len : reader.pos + length;
-        while (reader.pos < end) {
-            // read the tag and find the field
-            const [fieldNo, wireType] = reader.tag(), field = this.fieldNoToField.get(fieldNo);
-            if (!field) {
-                let u = options.readUnknownField;
-                if (u == "throw")
-                    throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.info.typeName}`);
-                let d = reader.skip(wireType);
-                if (u !== false)
-                    (u === true ? UnknownFieldHandler.onRead : u)(this.info.typeName, message, fieldNo, wireType, d);
-                continue;
-            }
-            // target object for the field we are reading
-            let target = message, repeated = field.repeat, localName = field.localName;
-            // if field is member of oneof ADT, use ADT as target
-            if (field.oneof) {
-                target = target[field.oneof];
-                // if other oneof member selected, set new ADT
-                if (target.oneofKind !== localName)
-                    target = message[field.oneof] = {
-                        oneofKind: localName
-                    };
-            }
-            // we have handled oneof above, we just have read the value into `target[localName]`
-            switch (field.kind) {
-                case "scalar":
-                case "enum":
-                    let T = field.kind == "enum" ? ScalarType.INT32 : field.T;
-                    let L = field.kind == "scalar" ? field.L : undefined;
-                    if (repeated) {
-                        let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
-                        if (wireType == WireType.LengthDelimited && T != ScalarType.STRING && T != ScalarType.BYTES) {
-                            let e = reader.uint32() + reader.pos;
-                            while (reader.pos < e)
-                                arr.push(this.scalar(reader, T, L));
-                        }
-                        else
-                            arr.push(this.scalar(reader, T, L));
-                    }
-                    else
-                        target[localName] = this.scalar(reader, T, L);
-                    break;
-                case "message":
-                    if (repeated) {
-                        let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
-                        let msg = field.T().internalBinaryRead(reader, reader.uint32(), options);
-                        arr.push(msg);
-                    }
-                    else
-                        target[localName] = field.T().internalBinaryRead(reader, reader.uint32(), options, target[localName]);
-                    break;
-                case "map":
-                    let [mapKey, mapVal] = this.mapEntry(field, reader, options);
-                    // safe to assume presence of map object, oneof cannot contain repeated values
-                    target[localName][mapKey] = mapVal;
-                    break;
-            }
-        }
-    }
-    /**
-     * Read a map field, expecting key field = 1, value field = 2
-     */
-    mapEntry(field, reader, options) {
-        let length = reader.uint32();
-        let end = reader.pos + length;
-        let key = undefined; // javascript only allows number or string for object properties
-        let val = undefined;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case 1:
-                    if (field.K == ScalarType.BOOL)
-                        key = reader.bool().toString();
-                    else
-                        // long types are read as string, number types are okay as number
-                        key = this.scalar(reader, field.K, LongType.STRING);
-                    break;
-                case 2:
-                    switch (field.V.kind) {
-                        case "scalar":
-                            val = this.scalar(reader, field.V.T, field.V.L);
-                            break;
-                        case "enum":
-                            val = reader.int32();
-                            break;
-                        case "message":
-                            val = field.V.T().internalBinaryRead(reader, reader.uint32(), options);
-                            break;
-                    }
-                    break;
-                default:
-                    throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) in map entry for ${this.info.typeName}#${field.name}`);
-            }
-        }
-        if (key === undefined) {
-            let keyRaw = reflectionScalarDefault(field.K);
-            key = field.K == ScalarType.BOOL ? keyRaw.toString() : keyRaw;
-        }
-        if (val === undefined)
-            switch (field.V.kind) {
-                case "scalar":
-                    val = reflectionScalarDefault(field.V.T, field.V.L);
-                    break;
-                case "enum":
-                    val = 0;
-                    break;
-                case "message":
-                    val = field.V.T().create();
-                    break;
-            }
-        return [key, val];
-    }
-    scalar(reader, type, longType) {
-        switch (type) {
-            case ScalarType.INT32:
-                return reader.int32();
-            case ScalarType.STRING:
-                return reader.string();
-            case ScalarType.BOOL:
-                return reader.bool();
-            case ScalarType.DOUBLE:
-                return reader.double();
-            case ScalarType.FLOAT:
-                return reader.float();
-            case ScalarType.INT64:
-                return reflectionLongConvert(reader.int64(), longType);
-            case ScalarType.UINT64:
-                return reflectionLongConvert(reader.uint64(), longType);
-            case ScalarType.FIXED64:
-                return reflectionLongConvert(reader.fixed64(), longType);
-            case ScalarType.FIXED32:
-                return reader.fixed32();
-            case ScalarType.BYTES:
-                return reader.bytes();
-            case ScalarType.UINT32:
-                return reader.uint32();
-            case ScalarType.SFIXED32:
-                return reader.sfixed32();
-            case ScalarType.SFIXED64:
-                return reflectionLongConvert(reader.sfixed64(), longType);
-            case ScalarType.SINT32:
-                return reader.sint32();
-            case ScalarType.SINT64:
-                return reflectionLongConvert(reader.sint64(), longType);
-        }
-    }
-}
-
-/**
- * Writes proto3 messages in binary format using reflection information.
- *
- * https://developers.google.com/protocol-buffers/docs/encoding
- */
-class ReflectionBinaryWriter {
-    constructor(info) {
-        this.info = info;
-    }
-    prepare() {
-        if (!this.fields) {
-            const fieldsInput = this.info.fields ? this.info.fields.concat() : [];
-            this.fields = fieldsInput.sort((a, b) => a.no - b.no);
-        }
-    }
-    /**
-     * Writes the message to binary format.
-     */
-    write(message, writer, options) {
-        this.prepare();
-        for (const field of this.fields) {
-            let value, // this will be our field value, whether it is member of a oneof or not
-            emitDefault, // whether we emit the default value (only true for oneof members)
-            repeated = field.repeat, localName = field.localName;
-            // handle oneof ADT
-            if (field.oneof) {
-                const group = message[field.oneof];
-                if (group.oneofKind !== localName)
-                    continue; // if field is not selected, skip
-                value = group[localName];
-                emitDefault = true;
-            }
-            else {
-                value = message[localName];
-                emitDefault = false;
-            }
-            // we have handled oneof above. we just have to honor `emitDefault`.
-            switch (field.kind) {
-                case "scalar":
-                case "enum":
-                    let T = field.kind == "enum" ? ScalarType.INT32 : field.T;
-                    if (repeated) {
-                        assert(Array.isArray(value));
-                        if (repeated == RepeatType.PACKED)
-                            this.packed(writer, T, field.no, value);
-                        else
-                            for (const item of value)
-                                this.scalar(writer, T, field.no, item, true);
-                    }
-                    else if (value === undefined)
-                        assert(field.opt);
-                    else
-                        this.scalar(writer, T, field.no, value, emitDefault || field.opt);
-                    break;
-                case "message":
-                    if (repeated) {
-                        assert(Array.isArray(value));
-                        for (const item of value)
-                            this.message(writer, options, field.T(), field.no, item);
-                    }
-                    else {
-                        this.message(writer, options, field.T(), field.no, value);
-                    }
-                    break;
-                case "map":
-                    assert(typeof value == 'object' && value !== null);
-                    for (const [key, val] of Object.entries(value))
-                        this.mapEntry(writer, options, field, key, val);
-                    break;
-            }
-        }
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u === true ? UnknownFieldHandler.onWrite : u)(this.info.typeName, message, writer);
-    }
-    mapEntry(writer, options, field, key, value) {
-        writer.tag(field.no, WireType.LengthDelimited);
-        writer.fork();
-        // javascript only allows number or string for object properties
-        // we convert from our representation to the protobuf type
-        let keyValue = key;
-        switch (field.K) {
-            case ScalarType.INT32:
-            case ScalarType.FIXED32:
-            case ScalarType.UINT32:
-            case ScalarType.SFIXED32:
-            case ScalarType.SINT32:
-                keyValue = Number.parseInt(key);
-                break;
-            case ScalarType.BOOL:
-                assert(key == 'true' || key == 'false');
-                keyValue = key == 'true';
-                break;
-        }
-        // write key, expecting key field number = 1
-        this.scalar(writer, field.K, 1, keyValue, true);
-        // write value, expecting value field number = 2
-        switch (field.V.kind) {
-            case 'scalar':
-                this.scalar(writer, field.V.T, 2, value, true);
-                break;
-            case 'enum':
-                this.scalar(writer, ScalarType.INT32, 2, value, true);
-                break;
-            case 'message':
-                this.message(writer, options, field.V.T(), 2, value);
-                break;
-        }
-        writer.join();
-    }
-    message(writer, options, handler, fieldNo, value) {
-        if (value === undefined)
-            return;
-        handler.internalBinaryWrite(value, writer.tag(fieldNo, WireType.LengthDelimited).fork(), options);
-        writer.join();
-    }
-    /**
-     * Write a single scalar value.
-     */
-    scalar(writer, type, fieldNo, value, emitDefault) {
-        let [wireType, method, isDefault] = this.scalarInfo(type, value);
-        if (!isDefault || emitDefault) {
-            writer.tag(fieldNo, wireType);
-            writer[method](value);
-        }
-    }
-    /**
-     * Write an array of scalar values in packed format.
-     */
-    packed(writer, type, fieldNo, value) {
-        if (!value.length)
-            return;
-        assert(type !== ScalarType.BYTES && type !== ScalarType.STRING);
-        // write tag
-        writer.tag(fieldNo, WireType.LengthDelimited);
-        // begin length-delimited
-        writer.fork();
-        // write values without tags
-        let [, method,] = this.scalarInfo(type);
-        for (let i = 0; i < value.length; i++)
-            writer[method](value[i]);
-        // end length delimited
-        writer.join();
-    }
-    /**
-     * Get information for writing a scalar value.
-     *
-     * Returns tuple:
-     * [0]: appropriate WireType
-     * [1]: name of the appropriate method of IBinaryWriter
-     * [2]: whether the given value is a default value
-     *
-     * If argument `value` is omitted, [2] is always false.
-     */
-    scalarInfo(type, value) {
-        let t = WireType.Varint;
-        let m;
-        let i = value === undefined;
-        let d = value === 0;
-        switch (type) {
-            case ScalarType.INT32:
-                m = "int32";
-                break;
-            case ScalarType.STRING:
-                d = i || !value.length;
-                t = WireType.LengthDelimited;
-                m = "string";
-                break;
-            case ScalarType.BOOL:
-                d = value === false;
-                m = "bool";
-                break;
-            case ScalarType.UINT32:
-                m = "uint32";
-                break;
-            case ScalarType.DOUBLE:
-                t = WireType.Bit64;
-                m = "double";
-                break;
-            case ScalarType.FLOAT:
-                t = WireType.Bit32;
-                m = "float";
-                break;
-            case ScalarType.INT64:
-                d = i || PbLong.from(value).isZero();
-                m = "int64";
-                break;
-            case ScalarType.UINT64:
-                d = i || PbULong.from(value).isZero();
-                m = "uint64";
-                break;
-            case ScalarType.FIXED64:
-                d = i || PbULong.from(value).isZero();
-                t = WireType.Bit64;
-                m = "fixed64";
-                break;
-            case ScalarType.BYTES:
-                d = i || !value.byteLength;
-                t = WireType.LengthDelimited;
-                m = "bytes";
-                break;
-            case ScalarType.FIXED32:
-                t = WireType.Bit32;
-                m = "fixed32";
-                break;
-            case ScalarType.SFIXED32:
-                t = WireType.Bit32;
-                m = "sfixed32";
-                break;
-            case ScalarType.SFIXED64:
-                d = i || PbLong.from(value).isZero();
-                t = WireType.Bit64;
-                m = "sfixed64";
-                break;
-            case ScalarType.SINT32:
-                m = "sint32";
-                break;
-            case ScalarType.SINT64:
-                d = i || PbLong.from(value).isZero();
-                m = "sint64";
-                break;
-        }
-        return [t, m, i || d];
-    }
-}
-
-/**
- * Creates an instance of the generic message, using the field
- * information.
- */
-function reflectionCreate(type) {
-    /**
-     * This ternary can be removed in the next major version.
-     * The `Object.create()` code path utilizes a new `messagePrototype`
-     * property on the `IMessageType` which has this same `MESSAGE_TYPE`
-     * non-enumerable property on it. Doing it this way means that we only
-     * pay the cost of `Object.defineProperty()` once per `IMessageType`
-     * class of once per "instance". The falsy code path is only provided
-     * for backwards compatibility in cases where the runtime library is
-     * updated without also updating the generated code.
-     */
-    const msg = type.messagePrototype
-        ? Object.create(type.messagePrototype)
-        : Object.defineProperty({}, MESSAGE_TYPE, { value: type });
-    for (let field of type.fields) {
-        let name = field.localName;
-        if (field.opt)
-            continue;
-        if (field.oneof)
-            msg[field.oneof] = { oneofKind: undefined };
-        else if (field.repeat)
-            msg[name] = [];
-        else
-            switch (field.kind) {
-                case "scalar":
-                    msg[name] = reflectionScalarDefault(field.T, field.L);
-                    break;
-                case "enum":
-                    // we require 0 to be default value for all enums
-                    msg[name] = 0;
-                    break;
-                case "map":
-                    msg[name] = {};
-                    break;
-            }
-    }
-    return msg;
-}
-
-/**
- * Copy partial data into the target message.
- *
- * If a singular scalar or enum field is present in the source, it
- * replaces the field in the target.
- *
- * If a singular message field is present in the source, it is merged
- * with the target field by calling mergePartial() of the responsible
- * message type.
- *
- * If a repeated field is present in the source, its values replace
- * all values in the target array, removing extraneous values.
- * Repeated message fields are copied, not merged.
- *
- * If a map field is present in the source, entries are added to the
- * target map, replacing entries with the same key. Entries that only
- * exist in the target remain. Entries with message values are copied,
- * not merged.
- *
- * Note that this function differs from protobuf merge semantics,
- * which appends repeated fields.
- */
-function reflectionMergePartial(info, target, source) {
-    let fieldValue, // the field value we are working with
-    input = source, output; // where we want our field value to go
-    for (let field of info.fields) {
-        let name = field.localName;
-        if (field.oneof) {
-            const group = input[field.oneof]; // this is the oneof`s group in the source
-            if ((group === null || group === void 0 ? void 0 : group.oneofKind) == undefined) { // the user is free to omit
-                continue; // we skip this field, and all other members too
-            }
-            fieldValue = group[name]; // our value comes from the the oneof group of the source
-            output = target[field.oneof]; // and our output is the oneof group of the target
-            output.oneofKind = group.oneofKind; // always update discriminator
-            if (fieldValue == undefined) {
-                delete output[name]; // remove any existing value
-                continue; // skip further work on field
-            }
-        }
-        else {
-            fieldValue = input[name]; // we are using the source directly
-            output = target; // we want our field value to go directly into the target
-            if (fieldValue == undefined) {
-                continue; // skip further work on field, existing value is used as is
-            }
-        }
-        if (field.repeat)
-            output[name].length = fieldValue.length; // resize target array to match source array
-        // now we just work with `fieldValue` and `output` to merge the value
-        switch (field.kind) {
-            case "scalar":
-            case "enum":
-                if (field.repeat)
-                    for (let i = 0; i < fieldValue.length; i++)
-                        output[name][i] = fieldValue[i]; // not a reference type
-                else
-                    output[name] = fieldValue; // not a reference type
-                break;
-            case "message":
-                let T = field.T();
-                if (field.repeat)
-                    for (let i = 0; i < fieldValue.length; i++)
-                        output[name][i] = T.create(fieldValue[i]);
-                else if (output[name] === undefined)
-                    output[name] = T.create(fieldValue); // nothing to merge with
-                else
-                    T.mergePartial(output[name], fieldValue);
-                break;
-            case "map":
-                // Map and repeated fields are simply overwritten, not appended or merged
-                switch (field.V.kind) {
-                    case "scalar":
-                    case "enum":
-                        Object.assign(output[name], fieldValue); // elements are not reference types
-                        break;
-                    case "message":
-                        let T = field.V.T();
-                        for (let k of Object.keys(fieldValue))
-                            output[name][k] = T.create(fieldValue[k]);
-                        break;
-                }
-                break;
-        }
-    }
-}
-
-/**
- * Determines whether two message of the same type have the same field values.
- * Checks for deep equality, traversing repeated fields, oneof groups, maps
- * and messages recursively.
- * Will also return true if both messages are `undefined`.
- */
-function reflectionEquals(info, a, b) {
-    if (a === b)
-        return true;
-    if (!a || !b)
-        return false;
-    for (let field of info.fields) {
-        let localName = field.localName;
-        let val_a = field.oneof ? a[field.oneof][localName] : a[localName];
-        let val_b = field.oneof ? b[field.oneof][localName] : b[localName];
-        switch (field.kind) {
-            case "enum":
-            case "scalar":
-                let t = field.kind == "enum" ? ScalarType.INT32 : field.T;
-                if (!(field.repeat
-                    ? repeatedPrimitiveEq(t, val_a, val_b)
-                    : primitiveEq(t, val_a, val_b)))
-                    return false;
-                break;
-            case "map":
-                if (!(field.V.kind == "message"
-                    ? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b))
-                    : repeatedPrimitiveEq(field.V.kind == "enum" ? ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b))))
-                    return false;
-                break;
-            case "message":
-                let T = field.T();
-                if (!(field.repeat
-                    ? repeatedMsgEq(T, val_a, val_b)
-                    : T.equals(val_a, val_b)))
-                    return false;
-                break;
-        }
-    }
-    return true;
-}
-const objectValues = Object.values;
-function primitiveEq(type, a, b) {
-    if (a === b)
-        return true;
-    if (type !== ScalarType.BYTES)
-        return false;
-    let ba = a;
-    let bb = b;
-    if (ba.length !== bb.length)
-        return false;
-    for (let i = 0; i < ba.length; i++)
-        if (ba[i] != bb[i])
-            return false;
-    return true;
-}
-function repeatedPrimitiveEq(type, a, b) {
-    if (a.length !== b.length)
-        return false;
-    for (let i = 0; i < a.length; i++)
-        if (!primitiveEq(type, a[i], b[i]))
-            return false;
-    return true;
-}
-function repeatedMsgEq(type, a, b) {
-    if (a.length !== b.length)
-        return false;
-    for (let i = 0; i < a.length; i++)
-        if (!type.equals(a[i], b[i]))
-            return false;
-    return true;
-}
-
-const baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));
-const messageTypeDescriptor = baseDescriptors[MESSAGE_TYPE] = {};
-/**
- * This standard message type provides reflection-based
- * operations to work with a message.
- */
-class MessageType {
-    constructor(name, fields, options) {
-        this.defaultCheckDepth = 16;
-        this.typeName = name;
-        this.fields = fields.map(normalizeFieldInfo);
-        this.options = options !== null && options !== void 0 ? options : {};
-        messageTypeDescriptor.value = this;
-        this.messagePrototype = Object.create(null, baseDescriptors);
-        this.refTypeCheck = new ReflectionTypeCheck(this);
-        this.refJsonReader = new ReflectionJsonReader(this);
-        this.refJsonWriter = new ReflectionJsonWriter(this);
-        this.refBinReader = new ReflectionBinaryReader(this);
-        this.refBinWriter = new ReflectionBinaryWriter(this);
-    }
-    create(value) {
-        let message = reflectionCreate(this);
-        if (value !== undefined) {
-            reflectionMergePartial(this, message, value);
-        }
-        return message;
-    }
-    /**
-     * Clone the message.
-     *
-     * Unknown fields are discarded.
-     */
-    clone(message) {
-        let copy = this.create();
-        reflectionMergePartial(this, copy, message);
-        return copy;
-    }
-    /**
-     * Determines whether two message of the same type have the same field values.
-     * Checks for deep equality, traversing repeated fields, oneof groups, maps
-     * and messages recursively.
-     * Will also return true if both messages are `undefined`.
-     */
-    equals(a, b) {
-        return reflectionEquals(this, a, b);
-    }
-    /**
-     * Is the given value assignable to our message type
-     * and contains no [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
-     */
-    is(arg, depth = this.defaultCheckDepth) {
-        return this.refTypeCheck.is(arg, depth, false);
-    }
-    /**
-     * Is the given value assignable to our message type,
-     * regardless of [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
-     */
-    isAssignable(arg, depth = this.defaultCheckDepth) {
-        return this.refTypeCheck.is(arg, depth, true);
-    }
-    /**
-     * Copy partial data into the target message.
-     */
-    mergePartial(target, source) {
-        reflectionMergePartial(this, target, source);
-    }
-    /**
-     * Create a new message from binary format.
-     */
-    fromBinary(data, options) {
-        let opt = binaryReadOptions(options);
-        return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt);
-    }
-    /**
-     * Read a new message from a JSON value.
-     */
-    fromJson(json, options) {
-        return this.internalJsonRead(json, jsonReadOptions(options));
-    }
-    /**
-     * Read a new message from a JSON string.
-     * This is equivalent to `T.fromJson(JSON.parse(json))`.
-     */
-    fromJsonString(json, options) {
-        let value = JSON.parse(json);
-        return this.fromJson(value, options);
-    }
-    /**
-     * Write the message to canonical JSON value.
-     */
-    toJson(message, options) {
-        return this.internalJsonWrite(message, jsonWriteOptions(options));
-    }
-    /**
-     * Convert the message to canonical JSON string.
-     * This is equivalent to `JSON.stringify(T.toJson(t))`
-     */
-    toJsonString(message, options) {
-        var _a;
-        let value = this.toJson(message, options);
-        return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);
-    }
-    /**
-     * Write the message to binary format.
-     */
-    toBinary(message, options) {
-        let opt = binaryWriteOptions(options);
-        return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish();
-    }
-    /**
-     * This is an internal method. If you just want to read a message from
-     * JSON, use `fromJson()` or `fromJsonString()`.
-     *
-     * Reads JSON value and merges the fields into the target
-     * according to protobuf rules. If the target is omitted,
-     * a new instance is created first.
-     */
-    internalJsonRead(json, options, target) {
-        if (json !== null && typeof json == "object" && !Array.isArray(json)) {
-            let message = target !== null && target !== void 0 ? target : this.create();
-            this.refJsonReader.read(json, message, options);
-            return message;
-        }
-        throw new Error(`Unable to parse message ${this.typeName} from JSON ${typeofJsonValue(json)}.`);
-    }
-    /**
-     * This is an internal method. If you just want to write a message
-     * to JSON, use `toJson()` or `toJsonString().
-     *
-     * Writes JSON value and returns it.
-     */
-    internalJsonWrite(message, options) {
-        return this.refJsonWriter.write(message, options);
-    }
-    /**
-     * This is an internal method. If you just want to write a message
-     * in binary format, use `toBinary()`.
-     *
-     * Serializes the message in binary format and appends it to the given
-     * writer. Returns passed writer.
-     */
-    internalBinaryWrite(message, writer, options) {
-        this.refBinWriter.write(message, writer, options);
-        return writer;
-    }
-    /**
-     * This is an internal method. If you just want to read a message from
-     * binary data, use `fromBinary()`.
-     *
-     * Reads data from binary format and merges the fields into
-     * the target according to protobuf rules. If the target is
-     * omitted, a new instance is created first.
-     */
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create();
-        this.refBinReader.read(reader, message, options, length);
-        return message;
-    }
-}
-
-/**
- * Check if the provided object is a proto message.
- *
- * Note that this is an experimental feature - it is here to stay, but
- * implementation details may change without notice.
- */
-function containsMessageType(msg) {
-    return msg[MESSAGE_TYPE] != null;
-}
-
-/**
- * Is this a lookup object generated by Typescript, for a Typescript enum
- * generated by protobuf-ts?
- *
- * - No `const enum` (enum must not be inlined, we need reverse mapping).
- * - No string enum (we need int32 for protobuf).
- * - Must have a value for 0 (otherwise, we would need to support custom default values).
- */
-function isEnumObject(arg) {
-    if (typeof arg != 'object' || arg === null) {
-        return false;
-    }
-    if (!arg.hasOwnProperty(0)) {
-        return false;
-    }
-    for (let k of Object.keys(arg)) {
-        let num = parseInt(k);
-        if (!Number.isNaN(num)) {
-            // is there a name for the number?
-            let nam = arg[num];
-            if (nam === undefined)
-                return false;
-            // does the name resolve back to the number?
-            if (arg[nam] !== num)
-                return false;
-        }
-        else {
-            // is there a number for the name?
-            let num = arg[k];
-            if (num === undefined)
-                return false;
-            // is it a string enum?
-            if (typeof num !== 'number')
-                return false;
-            // do we know the number?
-            if (arg[num] === undefined)
-                return false;
-        }
-    }
-    return true;
-}
-/**
- * Lists all values of a Typescript enum, as an array of objects with a "name"
- * property and a "number" property.
- *
- * Note that it is possible that a number appears more than once, because it is
- * possible to have aliases in an enum.
- *
- * Throws if the enum does not adhere to the rules of enums generated by
- * protobuf-ts. See `isEnumObject()`.
- */
-function listEnumValues(enumObject) {
-    if (!isEnumObject(enumObject))
-        throw new Error("not a typescript enum object");
-    let values = [];
-    for (let [name, number] of Object.entries(enumObject))
-        if (typeof number == "number")
-            values.push({ name, number });
-    return values;
-}
-/**
- * Lists the names of a Typescript enum.
- *
- * Throws if the enum does not adhere to the rules of enums generated by
- * protobuf-ts. See `isEnumObject()`.
- */
-function listEnumNames(enumObject) {
-    return listEnumValues(enumObject).map(val => val.name);
-}
-/**
- * Lists the numbers of a Typescript enum.
- *
- * Throws if the enum does not adhere to the rules of enums generated by
- * protobuf-ts. See `isEnumObject()`.
- */
-function listEnumNumbers(enumObject) {
-    return listEnumValues(enumObject)
-        .map(val => val.number)
-        .filter((num, index, arr) => arr.indexOf(num) == index);
-}
-
-// Public API of the protobuf-ts runtime.
-// Note: we do not use `export * from ...` to help tree shakers,
-// webpack verbose output hints that this should be useful
-// Convenience JSON typings and corresponding type guards
-
-var es2015$1 = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	BinaryReader: BinaryReader,
-	BinaryWriter: BinaryWriter,
-	get LongType () { return LongType; },
-	MESSAGE_TYPE: MESSAGE_TYPE,
-	MessageType: MessageType,
-	PbLong: PbLong,
-	PbULong: PbULong,
-	ReflectionBinaryReader: ReflectionBinaryReader,
-	ReflectionBinaryWriter: ReflectionBinaryWriter,
-	ReflectionJsonReader: ReflectionJsonReader,
-	ReflectionJsonWriter: ReflectionJsonWriter,
-	ReflectionTypeCheck: ReflectionTypeCheck,
-	get RepeatType () { return RepeatType; },
-	get ScalarType () { return ScalarType; },
-	get UnknownFieldHandler () { return UnknownFieldHandler; },
-	get WireType () { return WireType; },
-	assert: assert,
-	assertFloat32: assertFloat32,
-	assertInt32: assertInt32,
-	assertNever: assertNever,
-	assertUInt32: assertUInt32,
-	base64decode: base64decode,
-	base64encode: base64encode,
-	binaryReadOptions: binaryReadOptions,
-	binaryWriteOptions: binaryWriteOptions,
-	clearOneofValue: clearOneofValue,
-	containsMessageType: containsMessageType,
-	getOneofValue: getOneofValue,
-	getSelectedOneofValue: getSelectedOneofValue,
-	isEnumObject: isEnumObject,
-	isJsonObject: isJsonObject,
-	isOneofGroup: isOneofGroup,
-	jsonReadOptions: jsonReadOptions,
-	jsonWriteOptions: jsonWriteOptions,
-	listEnumNames: listEnumNames,
-	listEnumNumbers: listEnumNumbers,
-	listEnumValues: listEnumValues,
-	lowerCamelCase: lowerCamelCase,
-	mergeBinaryOptions: mergeBinaryOptions,
-	mergeJsonOptions: mergeJsonOptions,
-	normalizeFieldInfo: normalizeFieldInfo,
-	readFieldOption: readFieldOption,
-	readFieldOptions: readFieldOptions,
-	readMessageOption: readMessageOption,
-	reflectionCreate: reflectionCreate,
-	reflectionEquals: reflectionEquals,
-	reflectionMergePartial: reflectionMergePartial,
-	reflectionScalarDefault: reflectionScalarDefault,
-	setOneofValue: setOneofValue,
-	typeofJsonValue: typeofJsonValue,
-	utf8read: utf8read
-});
-
-/**
- * Turns PartialMethodInfo into MethodInfo.
- */
-function normalizeMethodInfo(method, service) {
-    var _a, _b, _c;
-    let m = method;
-    m.service = service;
-    m.localName = (_a = m.localName) !== null && _a !== void 0 ? _a : lowerCamelCase(m.name);
-    // noinspection PointlessBooleanExpressionJS
-    m.serverStreaming = !!m.serverStreaming;
-    // noinspection PointlessBooleanExpressionJS
-    m.clientStreaming = !!m.clientStreaming;
-    m.options = (_b = m.options) !== null && _b !== void 0 ? _b : {};
-    m.idempotency = (_c = m.idempotency) !== null && _c !== void 0 ? _c : undefined;
-    return m;
-}
-/**
- * Read custom method options from a generated service client.
- *
- * @deprecated use readMethodOption()
- */
-function readMethodOptions(service, methodName, extensionName, extensionType) {
-    var _a;
-    const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;
-    return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;
-}
-function readMethodOption(service, methodName, extensionName, extensionType) {
-    var _a;
-    const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;
-    if (!options) {
-        return undefined;
-    }
-    const optionVal = options[extensionName];
-    if (optionVal === undefined) {
-        return optionVal;
-    }
-    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
-}
-function readServiceOption(service, extensionName, extensionType) {
-    const options = service.options;
-    if (!options) {
-        return undefined;
-    }
-    const optionVal = options[extensionName];
-    if (optionVal === undefined) {
-        return optionVal;
-    }
-    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
-}
-
-class ServiceType {
-    constructor(typeName, methods, options) {
-        this.typeName = typeName;
-        this.methods = methods.map(i => normalizeMethodInfo(i, this));
-        this.options = options !== null && options !== void 0 ? options : {};
-    }
-}
-
-/**
- * An error that occurred while calling a RPC method.
- */
-class RpcError extends Error {
-    constructor(message, code = 'UNKNOWN', meta) {
-        super(message);
-        this.name = 'RpcError';
-        // see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example
-        Object.setPrototypeOf(this, new.target.prototype);
-        this.code = code;
-        this.meta = meta !== null && meta !== void 0 ? meta : {};
-    }
-    toString() {
-        const l = [this.name + ': ' + this.message];
-        if (this.code) {
-            l.push('');
-            l.push('Code: ' + this.code);
-        }
-        if (this.serviceName && this.methodName) {
-            l.push('Method: ' + this.serviceName + '/' + this.methodName);
-        }
-        let m = Object.entries(this.meta);
-        if (m.length) {
-            l.push('');
-            l.push('Meta:');
-            for (let [k, v] of m) {
-                l.push(`  ${k}: ${v}`);
-            }
-        }
-        return l.join('\n');
-    }
-}
-
-/**
- * Merges custom RPC options with defaults. Returns a new instance and keeps
- * the "defaults" and the "options" unmodified.
- *
- * Merges `RpcMetadata` "meta", overwriting values from "defaults" with
- * values from "options". Does not append values to existing entries.
- *
- * Merges "jsonOptions", including "jsonOptions.typeRegistry", by creating
- * a new array that contains types from "options.jsonOptions.typeRegistry"
- * first, then types from "defaults.jsonOptions.typeRegistry".
- *
- * Merges "binaryOptions".
- *
- * Merges "interceptors" by creating a new array that contains interceptors
- * from "defaults" first, then interceptors from "options".
- *
- * Works with objects that extend `RpcOptions`, but only if the added
- * properties are of type Date, primitive like string, boolean, or Array
- * of primitives. If you have other property types, you have to merge them
- * yourself.
- */
-function mergeRpcOptions(defaults, options) {
-    if (!options)
-        return defaults;
-    let o = {};
-    copy(defaults, o);
-    copy(options, o);
-    for (let key of Object.keys(options)) {
-        let val = options[key];
-        switch (key) {
-            case "jsonOptions":
-                o.jsonOptions = mergeJsonOptions(defaults.jsonOptions, o.jsonOptions);
-                break;
-            case "binaryOptions":
-                o.binaryOptions = mergeBinaryOptions(defaults.binaryOptions, o.binaryOptions);
-                break;
-            case "meta":
-                o.meta = {};
-                copy(defaults.meta, o.meta);
-                copy(options.meta, o.meta);
-                break;
-            case "interceptors":
-                o.interceptors = defaults.interceptors ? defaults.interceptors.concat(val) : val.concat();
-                break;
-        }
-    }
-    return o;
-}
-function copy(a, into) {
-    if (!a)
-        return;
-    let c = into;
-    for (let [k, v] of Object.entries(a)) {
-        if (v instanceof Date)
-            c[k] = new Date(v.getTime());
-        else if (Array.isArray(v))
-            c[k] = v.concat();
-        else
-            c[k] = v;
-    }
-}
-
-var DeferredState;
-(function (DeferredState) {
-    DeferredState[DeferredState["PENDING"] = 0] = "PENDING";
-    DeferredState[DeferredState["REJECTED"] = 1] = "REJECTED";
-    DeferredState[DeferredState["RESOLVED"] = 2] = "RESOLVED";
-})(DeferredState || (DeferredState = {}));
-/**
- * A deferred promise. This is a "controller" for a promise, which lets you
- * pass a promise around and reject or resolve it from the outside.
- *
- * Warning: This class is to be used with care. Using it can make code very
- * difficult to read. It is intended for use in library code that exposes
- * promises, not for regular business logic.
- */
-class Deferred {
-    /**
-     * @param preventUnhandledRejectionWarning - prevents the warning
-     * "Unhandled Promise rejection" by adding a noop rejection handler.
-     * Working with calls returned from the runtime-rpc package in an
-     * async function usually means awaiting one call property after
-     * the other. This means that the "status" is not being awaited when
-     * an earlier await for the "headers" is rejected. This causes the
-     * "unhandled promise reject" warning. A more correct behaviour for
-     * calls might be to become aware whether at least one of the
-     * promises is handled and swallow the rejection warning for the
-     * others.
-     */
-    constructor(preventUnhandledRejectionWarning = true) {
-        this._state = DeferredState.PENDING;
-        this._promise = new Promise((resolve, reject) => {
-            this._resolve = resolve;
-            this._reject = reject;
-        });
-        if (preventUnhandledRejectionWarning) {
-            this._promise.catch(_ => { });
-        }
-    }
-    /**
-     * Get the current state of the promise.
-     */
-    get state() {
-        return this._state;
-    }
-    /**
-     * Get the deferred promise.
-     */
-    get promise() {
-        return this._promise;
-    }
-    /**
-     * Resolve the promise. Throws if the promise is already resolved or rejected.
-     */
-    resolve(value) {
-        if (this.state !== DeferredState.PENDING)
-            throw new Error(`cannot resolve ${DeferredState[this.state].toLowerCase()}`);
-        this._resolve(value);
-        this._state = DeferredState.RESOLVED;
-    }
-    /**
-     * Reject the promise. Throws if the promise is already resolved or rejected.
-     */
-    reject(reason) {
-        if (this.state !== DeferredState.PENDING)
-            throw new Error(`cannot reject ${DeferredState[this.state].toLowerCase()}`);
-        this._reject(reason);
-        this._state = DeferredState.REJECTED;
-    }
-    /**
-     * Resolve the promise. Ignore if not pending.
-     */
-    resolvePending(val) {
-        if (this._state === DeferredState.PENDING)
-            this.resolve(val);
-    }
-    /**
-     * Reject the promise. Ignore if not pending.
-     */
-    rejectPending(reason) {
-        if (this._state === DeferredState.PENDING)
-            this.reject(reason);
-    }
-}
-
-/**
- * A `RpcOutputStream` that you control.
- */
-class RpcOutputStreamController {
-    constructor() {
-        this._lis = {
-            nxt: [],
-            msg: [],
-            err: [],
-            cmp: [],
-        };
-        this._closed = false;
-        // --- RpcOutputStream async iterator API
-        // iterator state.
-        // is undefined when no iterator has been acquired yet.
-        this._itState = { q: [] };
-    }
-    // --- RpcOutputStream callback API
-    onNext(callback) {
-        return this.addLis(callback, this._lis.nxt);
-    }
-    onMessage(callback) {
-        return this.addLis(callback, this._lis.msg);
-    }
-    onError(callback) {
-        return this.addLis(callback, this._lis.err);
-    }
-    onComplete(callback) {
-        return this.addLis(callback, this._lis.cmp);
-    }
-    addLis(callback, list) {
-        list.push(callback);
-        return () => {
-            let i = list.indexOf(callback);
-            if (i >= 0)
-                list.splice(i, 1);
-        };
-    }
-    // remove all listeners
-    clearLis() {
-        for (let l of Object.values(this._lis))
-            l.splice(0, l.length);
-    }
-    // --- Controller API
-    /**
-     * Is this stream already closed by a completion or error?
-     */
-    get closed() {
-        return this._closed !== false;
-    }
-    /**
-     * Emit message, close with error, or close successfully, but only one
-     * at a time.
-     * Can be used to wrap a stream by using the other stream's `onNext`.
-     */
-    notifyNext(message, error, complete) {
-        assert((message ? 1 : 0) + (error ? 1 : 0) + (complete ? 1 : 0) <= 1, 'only one emission at a time');
-        if (message)
-            this.notifyMessage(message);
-        if (error)
-            this.notifyError(error);
-        if (complete)
-            this.notifyComplete();
-    }
-    /**
-     * Emits a new message. Throws if stream is closed.
-     *
-     * Triggers onNext and onMessage callbacks.
-     */
-    notifyMessage(message) {
-        assert(!this.closed, 'stream is closed');
-        this.pushIt({ value: message, done: false });
-        this._lis.msg.forEach(l => l(message));
-        this._lis.nxt.forEach(l => l(message, undefined, false));
-    }
-    /**
-     * Closes the stream with an error. Throws if stream is closed.
-     *
-     * Triggers onNext and onError callbacks.
-     */
-    notifyError(error) {
-        assert(!this.closed, 'stream is closed');
-        this._closed = error;
-        this.pushIt(error);
-        this._lis.err.forEach(l => l(error));
-        this._lis.nxt.forEach(l => l(undefined, error, false));
-        this.clearLis();
-    }
-    /**
-     * Closes the stream successfully. Throws if stream is closed.
-     *
-     * Triggers onNext and onComplete callbacks.
-     */
-    notifyComplete() {
-        assert(!this.closed, 'stream is closed');
-        this._closed = true;
-        this.pushIt({ value: null, done: true });
-        this._lis.cmp.forEach(l => l());
-        this._lis.nxt.forEach(l => l(undefined, undefined, true));
-        this.clearLis();
-    }
-    /**
-     * Creates an async iterator (that can be used with `for await {...}`)
-     * to consume the stream.
-     *
-     * Some things to note:
-     * - If an error occurs, the `for await` will throw it.
-     * - If an error occurred before the `for await` was started, `for await`
-     *   will re-throw it.
-     * - If the stream is already complete, the `for await` will be empty.
-     * - If your `for await` consumes slower than the stream produces,
-     *   for example because you are relaying messages in a slow operation,
-     *   messages are queued.
-     */
-    [Symbol.asyncIterator]() {
-        // if we are closed, we are definitely not receiving any more messages.
-        // but we can't let the iterator get stuck. we want to either:
-        // a) finish the new iterator immediately, because we are completed
-        // b) reject the new iterator, because we errored
-        if (this._closed === true)
-            this.pushIt({ value: null, done: true });
-        else if (this._closed !== false)
-            this.pushIt(this._closed);
-        // the async iterator
-        return {
-            next: () => {
-                let state = this._itState;
-                assert(state, "bad state"); // if we don't have a state here, code is broken
-                // there should be no pending result.
-                // did the consumer call next() before we resolved our previous result promise?
-                assert(!state.p, "iterator contract broken");
-                // did we produce faster than the iterator consumed?
-                // return the oldest result from the queue.
-                let first = state.q.shift();
-                if (first)
-                    return ("value" in first) ? Promise.resolve(first) : Promise.reject(first);
-                // we have no result ATM, but we promise one.
-                // as soon as we have a result, we must resolve promise.
-                state.p = new Deferred();
-                return state.p.promise;
-            },
-        };
-    }
-    // "push" a new iterator result.
-    // this either resolves a pending promise, or enqueues the result.
-    pushIt(result) {
-        let state = this._itState;
-        // is the consumer waiting for us?
-        if (state.p) {
-            // yes, consumer is waiting for this promise.
-            const p = state.p;
-            assert(p.state == DeferredState.PENDING, "iterator contract broken");
-            // resolve the promise
-            ("value" in result) ? p.resolve(result) : p.reject(result);
-            // must cleanup, otherwise iterator.next() would pick it up again.
-            delete state.p;
-        }
-        else {
-            // we are producing faster than the iterator consumes.
-            // push result onto queue.
-            state.q.push(result);
-        }
-    }
-}
-
-var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-/**
- * A unary RPC call. Unary means there is exactly one input message and
- * exactly one output message unless an error occurred.
- */
-class UnaryCall {
-    constructor(method, requestHeaders, request, headers, response, status, trailers) {
-        this.method = method;
-        this.requestHeaders = requestHeaders;
-        this.request = request;
-        this.headers = headers;
-        this.response = response;
-        this.status = status;
-        this.trailers = trailers;
-    }
-    /**
-     * If you are only interested in the final outcome of this call,
-     * you can await it to receive a `FinishedUnaryCall`.
-     */
-    then(onfulfilled, onrejected) {
-        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
-    }
-    promiseFinished() {
-        return __awaiter$4(this, void 0, void 0, function* () {
-            let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);
-            return {
-                method: this.method,
-                requestHeaders: this.requestHeaders,
-                request: this.request,
-                headers,
-                response,
-                status,
-                trailers
-            };
-        });
-    }
-}
-
-var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-/**
- * A server streaming RPC call. The client provides exactly one input message
- * but the server may respond with 0, 1, or more messages.
- */
-class ServerStreamingCall {
-    constructor(method, requestHeaders, request, headers, response, status, trailers) {
-        this.method = method;
-        this.requestHeaders = requestHeaders;
-        this.request = request;
-        this.headers = headers;
-        this.responses = response;
-        this.status = status;
-        this.trailers = trailers;
-    }
-    /**
-     * Instead of awaiting the response status and trailers, you can
-     * just as well await this call itself to receive the server outcome.
-     * You should first setup some listeners to the `request` to
-     * see the actual messages the server replied with.
-     */
-    then(onfulfilled, onrejected) {
-        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
-    }
-    promiseFinished() {
-        return __awaiter$3(this, void 0, void 0, function* () {
-            let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);
-            return {
-                method: this.method,
-                requestHeaders: this.requestHeaders,
-                request: this.request,
-                headers,
-                status,
-                trailers,
-            };
-        });
-    }
-}
-
-var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-/**
- * A client streaming RPC call. This means that the clients sends 0, 1, or
- * more messages to the server, and the server replies with exactly one
- * message.
- */
-class ClientStreamingCall {
-    constructor(method, requestHeaders, request, headers, response, status, trailers) {
-        this.method = method;
-        this.requestHeaders = requestHeaders;
-        this.requests = request;
-        this.headers = headers;
-        this.response = response;
-        this.status = status;
-        this.trailers = trailers;
-    }
-    /**
-     * Instead of awaiting the response status and trailers, you can
-     * just as well await this call itself to receive the server outcome.
-     * Note that it may still be valid to send more request messages.
-     */
-    then(onfulfilled, onrejected) {
-        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
-    }
-    promiseFinished() {
-        return __awaiter$2(this, void 0, void 0, function* () {
-            let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);
-            return {
-                method: this.method,
-                requestHeaders: this.requestHeaders,
-                headers,
-                response,
-                status,
-                trailers
-            };
-        });
-    }
-}
-
-var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-/**
- * A duplex streaming RPC call. This means that the clients sends an
- * arbitrary amount of messages to the server, while at the same time,
- * the server sends an arbitrary amount of messages to the client.
- */
-class DuplexStreamingCall {
-    constructor(method, requestHeaders, request, headers, response, status, trailers) {
-        this.method = method;
-        this.requestHeaders = requestHeaders;
-        this.requests = request;
-        this.headers = headers;
-        this.responses = response;
-        this.status = status;
-        this.trailers = trailers;
-    }
-    /**
-     * Instead of awaiting the response status and trailers, you can
-     * just as well await this call itself to receive the server outcome.
-     * Note that it may still be valid to send more request messages.
-     */
-    then(onfulfilled, onrejected) {
-        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
-    }
-    promiseFinished() {
-        return __awaiter$1(this, void 0, void 0, function* () {
-            let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);
-            return {
-                method: this.method,
-                requestHeaders: this.requestHeaders,
-                headers,
-                status,
-                trailers,
-            };
-        });
-    }
-}
-
-var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-/**
- * Transport for testing.
- */
-class TestTransport {
-    /**
-     * Initialize with mock data. Omitted fields have default value.
-     */
-    constructor(data) {
-        /**
-         * Suppress warning / error about uncaught rejections of
-         * "status" and "trailers".
-         */
-        this.suppressUncaughtRejections = true;
-        this.headerDelay = 10;
-        this.responseDelay = 50;
-        this.betweenResponseDelay = 10;
-        this.afterResponseDelay = 10;
-        this.data = data !== null && data !== void 0 ? data : {};
-    }
-    /**
-     * Sent message(s) during the last operation.
-     */
-    get sentMessages() {
-        if (this.lastInput instanceof TestInputStream) {
-            return this.lastInput.sent;
-        }
-        else if (typeof this.lastInput == "object") {
-            return [this.lastInput.single];
-        }
-        return [];
-    }
-    /**
-     * Sending message(s) completed?
-     */
-    get sendComplete() {
-        if (this.lastInput instanceof TestInputStream) {
-            return this.lastInput.completed;
-        }
-        else if (typeof this.lastInput == "object") {
-            return true;
-        }
-        return false;
-    }
-    // Creates a promise for response headers from the mock data.
-    promiseHeaders() {
-        var _a;
-        const headers = (_a = this.data.headers) !== null && _a !== void 0 ? _a : TestTransport.defaultHeaders;
-        return headers instanceof RpcError
-            ? Promise.reject(headers)
-            : Promise.resolve(headers);
-    }
-    // Creates a promise for a single, valid, message from the mock data.
-    promiseSingleResponse(method) {
-        if (this.data.response instanceof RpcError) {
-            return Promise.reject(this.data.response);
-        }
-        let r;
-        if (Array.isArray(this.data.response)) {
-            assert(this.data.response.length > 0);
-            r = this.data.response[0];
-        }
-        else if (this.data.response !== undefined) {
-            r = this.data.response;
-        }
-        else {
-            r = method.O.create();
-        }
-        assert(method.O.is(r));
-        return Promise.resolve(r);
-    }
-    /**
-     * Pushes response messages from the mock data to the output stream.
-     * If an error response, status or trailers are mocked, the stream is
-     * closed with the respective error.
-     * Otherwise, stream is completed successfully.
-     *
-     * The returned promise resolves when the stream is closed. It should
-     * not reject. If it does, code is broken.
-     */
-    streamResponses(method, stream, abort) {
-        return __awaiter(this, void 0, void 0, function* () {
-            // normalize "data.response" into an array of valid output messages
-            const messages = [];
-            if (this.data.response === undefined) {
-                messages.push(method.O.create());
-            }
-            else if (Array.isArray(this.data.response)) {
-                for (let msg of this.data.response) {
-                    assert(method.O.is(msg));
-                    messages.push(msg);
-                }
-            }
-            else if (!(this.data.response instanceof RpcError)) {
-                assert(method.O.is(this.data.response));
-                messages.push(this.data.response);
-            }
-            // start the stream with an initial delay.
-            // if the request is cancelled, notify() error and exit.
-            try {
-                yield delay(this.responseDelay, abort)(undefined);
-            }
-            catch (error) {
-                stream.notifyError(error);
-                return;
-            }
-            // if error response was mocked, notify() error (stream is now closed with error) and exit.
-            if (this.data.response instanceof RpcError) {
-                stream.notifyError(this.data.response);
-                return;
-            }
-            // regular response messages were mocked. notify() them.
-            for (let msg of messages) {
-                stream.notifyMessage(msg);
-                // add a short delay between responses
-                // if the request is cancelled, notify() error and exit.
-                try {
-                    yield delay(this.betweenResponseDelay, abort)(undefined);
-                }
-                catch (error) {
-                    stream.notifyError(error);
-                    return;
-                }
-            }
-            // error status was mocked, notify() error (stream is now closed with error) and exit.
-            if (this.data.status instanceof RpcError) {
-                stream.notifyError(this.data.status);
-                return;
-            }
-            // error trailers were mocked, notify() error (stream is now closed with error) and exit.
-            if (this.data.trailers instanceof RpcError) {
-                stream.notifyError(this.data.trailers);
-                return;
-            }
-            // stream completed successfully
-            stream.notifyComplete();
-        });
-    }
-    // Creates a promise for response status from the mock data.
-    promiseStatus() {
-        var _a;
-        const status = (_a = this.data.status) !== null && _a !== void 0 ? _a : TestTransport.defaultStatus;
-        return status instanceof RpcError
-            ? Promise.reject(status)
-            : Promise.resolve(status);
-    }
-    // Creates a promise for response trailers from the mock data.
-    promiseTrailers() {
-        var _a;
-        const trailers = (_a = this.data.trailers) !== null && _a !== void 0 ? _a : TestTransport.defaultTrailers;
-        return trailers instanceof RpcError
-            ? Promise.reject(trailers)
-            : Promise.resolve(trailers);
-    }
-    maybeSuppressUncaught(...promise) {
-        if (this.suppressUncaughtRejections) {
-            for (let p of promise) {
-                p.catch(() => {
-                });
-            }
-        }
-    }
-    mergeOptions(options) {
-        return mergeRpcOptions({}, options);
-    }
-    unary(method, input, options) {
-        var _a;
-        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
-            .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise
-            .catch(_ => {
-        })
-            .then(delay(this.responseDelay, options.abort))
-            .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise
-            .catch(_ => {
-        })
-            .then(delay(this.afterResponseDelay, options.abort))
-            .then(_ => this.promiseStatus()), trailersPromise = responsePromise
-            .catch(_ => {
-        })
-            .then(delay(this.afterResponseDelay, options.abort))
-            .then(_ => this.promiseTrailers());
-        this.maybeSuppressUncaught(statusPromise, trailersPromise);
-        this.lastInput = { single: input };
-        return new UnaryCall(method, requestHeaders, input, headersPromise, responsePromise, statusPromise, trailersPromise);
-    }
-    serverStreaming(method, input, options) {
-        var _a;
-        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
-            .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise
-            .then(delay(this.responseDelay, options.abort))
-            .catch(() => {
-        })
-            .then(() => this.streamResponses(method, outputStream, options.abort))
-            .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise
-            .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise
-            .then(() => this.promiseTrailers());
-        this.maybeSuppressUncaught(statusPromise, trailersPromise);
-        this.lastInput = { single: input };
-        return new ServerStreamingCall(method, requestHeaders, input, headersPromise, outputStream, statusPromise, trailersPromise);
-    }
-    clientStreaming(method, options) {
-        var _a;
-        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
-            .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise
-            .catch(_ => {
-        })
-            .then(delay(this.responseDelay, options.abort))
-            .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise
-            .catch(_ => {
-        })
-            .then(delay(this.afterResponseDelay, options.abort))
-            .then(_ => this.promiseStatus()), trailersPromise = responsePromise
-            .catch(_ => {
-        })
-            .then(delay(this.afterResponseDelay, options.abort))
-            .then(_ => this.promiseTrailers());
-        this.maybeSuppressUncaught(statusPromise, trailersPromise);
-        this.lastInput = new TestInputStream(this.data, options.abort);
-        return new ClientStreamingCall(method, requestHeaders, this.lastInput, headersPromise, responsePromise, statusPromise, trailersPromise);
-    }
-    duplex(method, options) {
-        var _a;
-        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
-            .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise
-            .then(delay(this.responseDelay, options.abort))
-            .catch(() => {
-        })
-            .then(() => this.streamResponses(method, outputStream, options.abort))
-            .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise
-            .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise
-            .then(() => this.promiseTrailers());
-        this.maybeSuppressUncaught(statusPromise, trailersPromise);
-        this.lastInput = new TestInputStream(this.data, options.abort);
-        return new DuplexStreamingCall(method, requestHeaders, this.lastInput, headersPromise, outputStream, statusPromise, trailersPromise);
-    }
-}
-TestTransport.defaultHeaders = {
-    responseHeader: "test"
-};
-TestTransport.defaultStatus = {
-    code: "OK", detail: "all good"
-};
-TestTransport.defaultTrailers = {
-    responseTrailer: "test"
-};
-function delay(ms, abort) {
-    return (v) => new Promise((resolve, reject) => {
-        if (abort === null || abort === void 0 ? void 0 : abort.aborted) {
-            reject(new RpcError("user cancel", "CANCELLED"));
-        }
-        else {
-            const id = setTimeout(() => resolve(v), ms);
-            if (abort) {
-                abort.addEventListener("abort", ev => {
-                    clearTimeout(id);
-                    reject(new RpcError("user cancel", "CANCELLED"));
-                });
-            }
-        }
-    });
-}
-class TestInputStream {
-    constructor(data, abort) {
-        this._completed = false;
-        this._sent = [];
-        this.data = data;
-        this.abort = abort;
-    }
-    get sent() {
-        return this._sent;
-    }
-    get completed() {
-        return this._completed;
-    }
-    send(message) {
-        if (this.data.inputMessage instanceof RpcError) {
-            return Promise.reject(this.data.inputMessage);
-        }
-        const delayMs = this.data.inputMessage === undefined
-            ? 10
-            : this.data.inputMessage;
-        return Promise.resolve(undefined)
-            .then(() => {
-            this._sent.push(message);
-        })
-            .then(delay(delayMs, this.abort));
-    }
-    complete() {
-        if (this.data.inputComplete instanceof RpcError) {
-            return Promise.reject(this.data.inputComplete);
-        }
-        const delayMs = this.data.inputComplete === undefined
-            ? 10
-            : this.data.inputComplete;
-        return Promise.resolve(undefined)
-            .then(() => {
-            this._completed = true;
-        })
-            .then(delay(delayMs, this.abort));
-    }
-}
-
-/**
- * Creates a "stack" of of all interceptors specified in the given `RpcOptions`.
- * Used by generated client implementations.
- * @internal
- */
-function stackIntercept(kind, transport, method, options, input) {
-    var _a, _b, _c, _d;
-    if (kind == "unary") {
-        let tail = (mtd, inp, opt) => transport.unary(mtd, inp, opt);
-        for (const curr of ((_a = options.interceptors) !== null && _a !== void 0 ? _a : []).filter(i => i.interceptUnary).reverse()) {
-            const next = tail;
-            tail = (mtd, inp, opt) => curr.interceptUnary(next, mtd, inp, opt);
-        }
-        return tail(method, input, options);
-    }
-    if (kind == "serverStreaming") {
-        let tail = (mtd, inp, opt) => transport.serverStreaming(mtd, inp, opt);
-        for (const curr of ((_b = options.interceptors) !== null && _b !== void 0 ? _b : []).filter(i => i.interceptServerStreaming).reverse()) {
-            const next = tail;
-            tail = (mtd, inp, opt) => curr.interceptServerStreaming(next, mtd, inp, opt);
-        }
-        return tail(method, input, options);
-    }
-    if (kind == "clientStreaming") {
-        let tail = (mtd, opt) => transport.clientStreaming(mtd, opt);
-        for (const curr of ((_c = options.interceptors) !== null && _c !== void 0 ? _c : []).filter(i => i.interceptClientStreaming).reverse()) {
-            const next = tail;
-            tail = (mtd, opt) => curr.interceptClientStreaming(next, mtd, opt);
-        }
-        return tail(method, options);
-    }
-    if (kind == "duplex") {
-        let tail = (mtd, opt) => transport.duplex(mtd, opt);
-        for (const curr of ((_d = options.interceptors) !== null && _d !== void 0 ? _d : []).filter(i => i.interceptDuplex).reverse()) {
-            const next = tail;
-            tail = (mtd, opt) => curr.interceptDuplex(next, mtd, opt);
-        }
-        return tail(method, options);
-    }
-    assertNever(kind);
-}
-/**
- * @deprecated replaced by `stackIntercept()`, still here to support older generated code
- */
-function stackUnaryInterceptors(transport, method, input, options) {
-    return stackIntercept("unary", transport, method, options, input);
-}
-/**
- * @deprecated replaced by `stackIntercept()`, still here to support older generated code
- */
-function stackServerStreamingInterceptors(transport, method, input, options) {
-    return stackIntercept("serverStreaming", transport, method, options, input);
-}
-/**
- * @deprecated replaced by `stackIntercept()`, still here to support older generated code
- */
-function stackClientStreamingInterceptors(transport, method, options) {
-    return stackIntercept("clientStreaming", transport, method, options);
-}
-/**
- * @deprecated replaced by `stackIntercept()`, still here to support older generated code
- */
-function stackDuplexStreamingInterceptors(transport, method, options) {
-    return stackIntercept("duplex", transport, method, options);
-}
-
-class ServerCallContextController {
-    constructor(method, headers, deadline, sendResponseHeadersFn, defaultStatus = { code: 'OK', detail: '' }) {
-        this._cancelled = false;
-        this._listeners = [];
-        this.method = method;
-        this.headers = headers;
-        this.deadline = deadline;
-        this.trailers = {};
-        this._sendRH = sendResponseHeadersFn;
-        this.status = defaultStatus;
-    }
-    /**
-     * Set the call cancelled.
-     *
-     * Invokes all callbacks registered with onCancel() and
-     * sets `cancelled = true`.
-     */
-    notifyCancelled() {
-        if (!this._cancelled) {
-            this._cancelled = true;
-            for (let l of this._listeners) {
-                l();
-            }
-        }
-    }
-    /**
-     * Send response headers.
-     */
-    sendResponseHeaders(data) {
-        this._sendRH(data);
-    }
-    /**
-     * Is the call cancelled?
-     *
-     * When the client closes the connection before the server
-     * is done, the call is cancelled.
-     *
-     * If you want to cancel a request on the server, throw a
-     * RpcError with the CANCELLED status code.
-     */
-    get cancelled() {
-        return this._cancelled;
-    }
-    /**
-     * Add a callback for cancellation.
-     */
-    onCancel(callback) {
-        const l = this._listeners;
-        l.push(callback);
-        return () => {
-            let i = l.indexOf(callback);
-            if (i >= 0)
-                l.splice(i, 1);
-        };
-    }
-}
-
-// Public API of the rpc runtime.
-// Note: we do not use `export * from ...` to help tree shakers,
-// webpack verbose output hints that this should be useful
-
-var es2015 = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	ClientStreamingCall: ClientStreamingCall,
-	Deferred: Deferred,
-	get DeferredState () { return DeferredState; },
-	DuplexStreamingCall: DuplexStreamingCall,
-	RpcError: RpcError,
-	RpcOutputStreamController: RpcOutputStreamController,
-	ServerCallContextController: ServerCallContextController,
-	ServerStreamingCall: ServerStreamingCall,
-	ServiceType: ServiceType,
-	TestTransport: TestTransport,
-	UnaryCall: UnaryCall,
-	mergeRpcOptions: mergeRpcOptions,
-	readMethodOption: readMethodOption,
-	readMethodOptions: readMethodOptions,
-	readServiceOption: readServiceOption,
-	stackClientStreamingInterceptors: stackClientStreamingInterceptors,
-	stackDuplexStreamingInterceptors: stackDuplexStreamingInterceptors,
-	stackIntercept: stackIntercept,
-	stackServerStreamingInterceptors: stackServerStreamingInterceptors,
-	stackUnaryInterceptors: stackUnaryInterceptors
-});
-
-var require$$0 = /*@__PURE__*/getAugmentedNamespace(es2015);
-
-var require$$1 = /*@__PURE__*/getAugmentedNamespace(es2015$1);
-
-var cachemetadata = {};
-
-var cachescope = {};
-
-var hasRequiredCachescope;
-
-function requireCachescope () {
-	if (hasRequiredCachescope) return cachescope;
-	hasRequiredCachescope = 1;
-	Object.defineProperty(cachescope, "__esModule", { value: true });
-	cachescope.CacheScope = void 0;
-	const runtime_1 = require$$1;
-	const runtime_2 = require$$1;
-	const runtime_3 = require$$1;
-	const runtime_4 = require$$1;
-	const runtime_5 = require$$1;
-	// @generated message type with reflection information, may provide speed optimized methods
-	class CacheScope$Type extends runtime_5.MessageType {
-	    constructor() {
-	        super("github.actions.results.entities.v1.CacheScope", [
-	            { no: 1, name: "scope", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-	            { no: 2, name: "permission", kind: "scalar", T: 3 /*ScalarType.INT64*/ }
-	        ]);
-	    }
-	    create(value) {
-	        const message = { scope: "", permission: "0" };
-	        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-	        if (value !== undefined)
-	            (0, runtime_3.reflectionMergePartial)(this, message, value);
-	        return message;
-	    }
-	    internalBinaryRead(reader, length, options, target) {
-	        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-	        while (reader.pos < end) {
-	            let [fieldNo, wireType] = reader.tag();
-	            switch (fieldNo) {
-	                case /* string scope */ 1:
-	                    message.scope = reader.string();
-	                    break;
-	                case /* int64 permission */ 2:
-	                    message.permission = reader.int64().toString();
-	                    break;
-	                default:
-	                    let u = options.readUnknownField;
-	                    if (u === "throw")
-	                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-	                    let d = reader.skip(wireType);
-	                    if (u !== false)
-	                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-	            }
-	        }
-	        return message;
-	    }
-	    internalBinaryWrite(message, writer, options) {
-	        /* string scope = 1; */
-	        if (message.scope !== "")
-	            writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.scope);
-	        /* int64 permission = 2; */
-	        if (message.permission !== "0")
-	            writer.tag(2, runtime_1.WireType.Varint).int64(message.permission);
-	        let u = options.writeUnknownFields;
-	        if (u !== false)
-	            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-	        return writer;
-	    }
-	}
-	/**
-	 * @generated MessageType for protobuf message github.actions.results.entities.v1.CacheScope
-	 */
-	cachescope.CacheScope = new CacheScope$Type();
-	
-	return cachescope;
-}
-
-var hasRequiredCachemetadata;
-
-function requireCachemetadata () {
-	if (hasRequiredCachemetadata) return cachemetadata;
-	hasRequiredCachemetadata = 1;
-	Object.defineProperty(cachemetadata, "__esModule", { value: true });
-	cachemetadata.CacheMetadata = void 0;
-	const runtime_1 = require$$1;
-	const runtime_2 = require$$1;
-	const runtime_3 = require$$1;
-	const runtime_4 = require$$1;
-	const runtime_5 = require$$1;
-	const cachescope_1 = requireCachescope();
-	// @generated message type with reflection information, may provide speed optimized methods
-	class CacheMetadata$Type extends runtime_5.MessageType {
-	    constructor() {
-	        super("github.actions.results.entities.v1.CacheMetadata", [
-	            { no: 1, name: "repository_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-	            { no: 2, name: "scope", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => cachescope_1.CacheScope }
-	        ]);
-	    }
-	    create(value) {
-	        const message = { repositoryId: "0", scope: [] };
-	        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-	        if (value !== undefined)
-	            (0, runtime_3.reflectionMergePartial)(this, message, value);
-	        return message;
-	    }
-	    internalBinaryRead(reader, length, options, target) {
-	        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-	        while (reader.pos < end) {
-	            let [fieldNo, wireType] = reader.tag();
-	            switch (fieldNo) {
-	                case /* int64 repository_id */ 1:
-	                    message.repositoryId = reader.int64().toString();
-	                    break;
-	                case /* repeated github.actions.results.entities.v1.CacheScope scope */ 2:
-	                    message.scope.push(cachescope_1.CacheScope.internalBinaryRead(reader, reader.uint32(), options));
-	                    break;
-	                default:
-	                    let u = options.readUnknownField;
-	                    if (u === "throw")
-	                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-	                    let d = reader.skip(wireType);
-	                    if (u !== false)
-	                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-	            }
-	        }
-	        return message;
-	    }
-	    internalBinaryWrite(message, writer, options) {
-	        /* int64 repository_id = 1; */
-	        if (message.repositoryId !== "0")
-	            writer.tag(1, runtime_1.WireType.Varint).int64(message.repositoryId);
-	        /* repeated github.actions.results.entities.v1.CacheScope scope = 2; */
-	        for (let i = 0; i < message.scope.length; i++)
-	            cachescope_1.CacheScope.internalBinaryWrite(message.scope[i], writer.tag(2, runtime_1.WireType.LengthDelimited).fork(), options).join();
-	        let u = options.writeUnknownFields;
-	        if (u !== false)
-	            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-	        return writer;
-	    }
-	}
-	/**
-	 * @generated MessageType for protobuf message github.actions.results.entities.v1.CacheMetadata
-	 */
-	cachemetadata.CacheMetadata = new CacheMetadata$Type();
-	
-	return cachemetadata;
-}
-
-var hasRequiredCache$1;
-
-function requireCache$1 () {
-	if (hasRequiredCache$1) return cache;
-	hasRequiredCache$1 = 1;
-	(function (exports$1) {
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.CacheService = exports$1.GetCacheEntryDownloadURLResponse = exports$1.GetCacheEntryDownloadURLRequest = exports$1.FinalizeCacheEntryUploadResponse = exports$1.FinalizeCacheEntryUploadRequest = exports$1.CreateCacheEntryResponse = exports$1.CreateCacheEntryRequest = void 0;
-		// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies
-		// @generated from protobuf file "results/api/v1/cache.proto" (package "github.actions.results.api.v1", syntax proto3)
-		// tslint:disable
-		const runtime_rpc_1 = require$$0;
-		const runtime_1 = require$$1;
-		const runtime_2 = require$$1;
-		const runtime_3 = require$$1;
-		const runtime_4 = require$$1;
-		const runtime_5 = require$$1;
-		const cachemetadata_1 = requireCachemetadata();
-		// @generated message type with reflection information, may provide speed optimized methods
-		class CreateCacheEntryRequest$Type extends runtime_5.MessageType {
-		    constructor() {
-		        super("github.actions.results.api.v1.CreateCacheEntryRequest", [
-		            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-		            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-		            { no: 3, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-		        ]);
-		    }
-		    create(value) {
-		        const message = { key: "", version: "" };
-		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-		        if (value !== undefined)
-		            (0, runtime_3.reflectionMergePartial)(this, message, value);
-		        return message;
-		    }
-		    internalBinaryRead(reader, length, options, target) {
-		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-		        while (reader.pos < end) {
-		            let [fieldNo, wireType] = reader.tag();
-		            switch (fieldNo) {
-		                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-		                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-		                    break;
-		                case /* string key */ 2:
-		                    message.key = reader.string();
-		                    break;
-		                case /* string version */ 3:
-		                    message.version = reader.string();
-		                    break;
-		                default:
-		                    let u = options.readUnknownField;
-		                    if (u === "throw")
-		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-		                    let d = reader.skip(wireType);
-		                    if (u !== false)
-		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-		            }
-		        }
-		        return message;
-		    }
-		    internalBinaryWrite(message, writer, options) {
-		        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-		        if (message.metadata)
-		            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-		        /* string key = 2; */
-		        if (message.key !== "")
-		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-		        /* string version = 3; */
-		        if (message.version !== "")
-		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.version);
-		        let u = options.writeUnknownFields;
-		        if (u !== false)
-		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-		        return writer;
-		    }
-		}
-		/**
-		 * @generated MessageType for protobuf message github.actions.results.api.v1.CreateCacheEntryRequest
-		 */
-		exports$1.CreateCacheEntryRequest = new CreateCacheEntryRequest$Type();
-		// @generated message type with reflection information, may provide speed optimized methods
-		class CreateCacheEntryResponse$Type extends runtime_5.MessageType {
-		    constructor() {
-		        super("github.actions.results.api.v1.CreateCacheEntryResponse", [
-		            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-		            { no: 2, name: "signed_upload_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-		            { no: 3, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-		        ]);
-		    }
-		    create(value) {
-		        const message = { ok: false, signedUploadUrl: "", message: "" };
-		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-		        if (value !== undefined)
-		            (0, runtime_3.reflectionMergePartial)(this, message, value);
-		        return message;
-		    }
-		    internalBinaryRead(reader, length, options, target) {
-		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-		        while (reader.pos < end) {
-		            let [fieldNo, wireType] = reader.tag();
-		            switch (fieldNo) {
-		                case /* bool ok */ 1:
-		                    message.ok = reader.bool();
-		                    break;
-		                case /* string signed_upload_url */ 2:
-		                    message.signedUploadUrl = reader.string();
-		                    break;
-		                case /* string message */ 3:
-		                    message.message = reader.string();
-		                    break;
-		                default:
-		                    let u = options.readUnknownField;
-		                    if (u === "throw")
-		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-		                    let d = reader.skip(wireType);
-		                    if (u !== false)
-		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-		            }
-		        }
-		        return message;
-		    }
-		    internalBinaryWrite(message, writer, options) {
-		        /* bool ok = 1; */
-		        if (message.ok !== false)
-		            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
-		        /* string signed_upload_url = 2; */
-		        if (message.signedUploadUrl !== "")
-		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedUploadUrl);
-		        /* string message = 3; */
-		        if (message.message !== "")
-		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.message);
-		        let u = options.writeUnknownFields;
-		        if (u !== false)
-		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-		        return writer;
-		    }
-		}
-		/**
-		 * @generated MessageType for protobuf message github.actions.results.api.v1.CreateCacheEntryResponse
-		 */
-		exports$1.CreateCacheEntryResponse = new CreateCacheEntryResponse$Type();
-		// @generated message type with reflection information, may provide speed optimized methods
-		class FinalizeCacheEntryUploadRequest$Type extends runtime_5.MessageType {
-		    constructor() {
-		        super("github.actions.results.api.v1.FinalizeCacheEntryUploadRequest", [
-		            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-		            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-		            { no: 3, name: "size_bytes", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-		            { no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-		        ]);
-		    }
-		    create(value) {
-		        const message = { key: "", sizeBytes: "0", version: "" };
-		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-		        if (value !== undefined)
-		            (0, runtime_3.reflectionMergePartial)(this, message, value);
-		        return message;
-		    }
-		    internalBinaryRead(reader, length, options, target) {
-		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-		        while (reader.pos < end) {
-		            let [fieldNo, wireType] = reader.tag();
-		            switch (fieldNo) {
-		                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-		                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-		                    break;
-		                case /* string key */ 2:
-		                    message.key = reader.string();
-		                    break;
-		                case /* int64 size_bytes */ 3:
-		                    message.sizeBytes = reader.int64().toString();
-		                    break;
-		                case /* string version */ 4:
-		                    message.version = reader.string();
-		                    break;
-		                default:
-		                    let u = options.readUnknownField;
-		                    if (u === "throw")
-		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-		                    let d = reader.skip(wireType);
-		                    if (u !== false)
-		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-		            }
-		        }
-		        return message;
-		    }
-		    internalBinaryWrite(message, writer, options) {
-		        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-		        if (message.metadata)
-		            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-		        /* string key = 2; */
-		        if (message.key !== "")
-		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-		        /* int64 size_bytes = 3; */
-		        if (message.sizeBytes !== "0")
-		            writer.tag(3, runtime_1.WireType.Varint).int64(message.sizeBytes);
-		        /* string version = 4; */
-		        if (message.version !== "")
-		            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.version);
-		        let u = options.writeUnknownFields;
-		        if (u !== false)
-		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-		        return writer;
-		    }
-		}
-		/**
-		 * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeCacheEntryUploadRequest
-		 */
-		exports$1.FinalizeCacheEntryUploadRequest = new FinalizeCacheEntryUploadRequest$Type();
-		// @generated message type with reflection information, may provide speed optimized methods
-		class FinalizeCacheEntryUploadResponse$Type extends runtime_5.MessageType {
-		    constructor() {
-		        super("github.actions.results.api.v1.FinalizeCacheEntryUploadResponse", [
-		            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-		            { no: 2, name: "entry_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-		            { no: 3, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-		        ]);
-		    }
-		    create(value) {
-		        const message = { ok: false, entryId: "0", message: "" };
-		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-		        if (value !== undefined)
-		            (0, runtime_3.reflectionMergePartial)(this, message, value);
-		        return message;
-		    }
-		    internalBinaryRead(reader, length, options, target) {
-		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-		        while (reader.pos < end) {
-		            let [fieldNo, wireType] = reader.tag();
-		            switch (fieldNo) {
-		                case /* bool ok */ 1:
-		                    message.ok = reader.bool();
-		                    break;
-		                case /* int64 entry_id */ 2:
-		                    message.entryId = reader.int64().toString();
-		                    break;
-		                case /* string message */ 3:
-		                    message.message = reader.string();
-		                    break;
-		                default:
-		                    let u = options.readUnknownField;
-		                    if (u === "throw")
-		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-		                    let d = reader.skip(wireType);
-		                    if (u !== false)
-		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-		            }
-		        }
-		        return message;
-		    }
-		    internalBinaryWrite(message, writer, options) {
-		        /* bool ok = 1; */
-		        if (message.ok !== false)
-		            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
-		        /* int64 entry_id = 2; */
-		        if (message.entryId !== "0")
-		            writer.tag(2, runtime_1.WireType.Varint).int64(message.entryId);
-		        /* string message = 3; */
-		        if (message.message !== "")
-		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.message);
-		        let u = options.writeUnknownFields;
-		        if (u !== false)
-		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-		        return writer;
-		    }
-		}
-		/**
-		 * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeCacheEntryUploadResponse
-		 */
-		exports$1.FinalizeCacheEntryUploadResponse = new FinalizeCacheEntryUploadResponse$Type();
-		// @generated message type with reflection information, may provide speed optimized methods
-		class GetCacheEntryDownloadURLRequest$Type extends runtime_5.MessageType {
-		    constructor() {
-		        super("github.actions.results.api.v1.GetCacheEntryDownloadURLRequest", [
-		            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-		            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-		            { no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
-		            { no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-		        ]);
-		    }
-		    create(value) {
-		        const message = { key: "", restoreKeys: [], version: "" };
-		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-		        if (value !== undefined)
-		            (0, runtime_3.reflectionMergePartial)(this, message, value);
-		        return message;
-		    }
-		    internalBinaryRead(reader, length, options, target) {
-		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-		        while (reader.pos < end) {
-		            let [fieldNo, wireType] = reader.tag();
-		            switch (fieldNo) {
-		                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-		                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-		                    break;
-		                case /* string key */ 2:
-		                    message.key = reader.string();
-		                    break;
-		                case /* repeated string restore_keys */ 3:
-		                    message.restoreKeys.push(reader.string());
-		                    break;
-		                case /* string version */ 4:
-		                    message.version = reader.string();
-		                    break;
-		                default:
-		                    let u = options.readUnknownField;
-		                    if (u === "throw")
-		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-		                    let d = reader.skip(wireType);
-		                    if (u !== false)
-		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-		            }
-		        }
-		        return message;
-		    }
-		    internalBinaryWrite(message, writer, options) {
-		        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-		        if (message.metadata)
-		            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-		        /* string key = 2; */
-		        if (message.key !== "")
-		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-		        /* repeated string restore_keys = 3; */
-		        for (let i = 0; i < message.restoreKeys.length; i++)
-		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.restoreKeys[i]);
-		        /* string version = 4; */
-		        if (message.version !== "")
-		            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.version);
-		        let u = options.writeUnknownFields;
-		        if (u !== false)
-		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-		        return writer;
-		    }
-		}
-		/**
-		 * @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLRequest
-		 */
-		exports$1.GetCacheEntryDownloadURLRequest = new GetCacheEntryDownloadURLRequest$Type();
-		// @generated message type with reflection information, may provide speed optimized methods
-		class GetCacheEntryDownloadURLResponse$Type extends runtime_5.MessageType {
-		    constructor() {
-		        super("github.actions.results.api.v1.GetCacheEntryDownloadURLResponse", [
-		            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-		            { no: 2, name: "signed_download_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-		            { no: 3, name: "matched_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-		        ]);
-		    }
-		    create(value) {
-		        const message = { ok: false, signedDownloadUrl: "", matchedKey: "" };
-		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-		        if (value !== undefined)
-		            (0, runtime_3.reflectionMergePartial)(this, message, value);
-		        return message;
-		    }
-		    internalBinaryRead(reader, length, options, target) {
-		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-		        while (reader.pos < end) {
-		            let [fieldNo, wireType] = reader.tag();
-		            switch (fieldNo) {
-		                case /* bool ok */ 1:
-		                    message.ok = reader.bool();
-		                    break;
-		                case /* string signed_download_url */ 2:
-		                    message.signedDownloadUrl = reader.string();
-		                    break;
-		                case /* string matched_key */ 3:
-		                    message.matchedKey = reader.string();
-		                    break;
-		                default:
-		                    let u = options.readUnknownField;
-		                    if (u === "throw")
-		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-		                    let d = reader.skip(wireType);
-		                    if (u !== false)
-		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-		            }
-		        }
-		        return message;
-		    }
-		    internalBinaryWrite(message, writer, options) {
-		        /* bool ok = 1; */
-		        if (message.ok !== false)
-		            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
-		        /* string signed_download_url = 2; */
-		        if (message.signedDownloadUrl !== "")
-		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedDownloadUrl);
-		        /* string matched_key = 3; */
-		        if (message.matchedKey !== "")
-		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.matchedKey);
-		        let u = options.writeUnknownFields;
-		        if (u !== false)
-		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-		        return writer;
-		    }
-		}
-		/**
-		 * @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLResponse
-		 */
-		exports$1.GetCacheEntryDownloadURLResponse = new GetCacheEntryDownloadURLResponse$Type();
-		/**
-		 * @generated ServiceType for protobuf service github.actions.results.api.v1.CacheService
-		 */
-		exports$1.CacheService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.CacheService", [
-		    { name: "CreateCacheEntry", options: {}, I: exports$1.CreateCacheEntryRequest, O: exports$1.CreateCacheEntryResponse },
-		    { name: "FinalizeCacheEntryUpload", options: {}, I: exports$1.FinalizeCacheEntryUploadRequest, O: exports$1.FinalizeCacheEntryUploadResponse },
-		    { name: "GetCacheEntryDownloadURL", options: {}, I: exports$1.GetCacheEntryDownloadURLRequest, O: exports$1.GetCacheEntryDownloadURLResponse }
-		]);
-		
-	} (cache));
-	return cache;
-}
-
-var hasRequiredCache_twirpClient;
-
-function requireCache_twirpClient () {
-	if (hasRequiredCache_twirpClient) return cache_twirpClient;
-	hasRequiredCache_twirpClient = 1;
-	Object.defineProperty(cache_twirpClient, "__esModule", { value: true });
-	cache_twirpClient.CacheServiceClientProtobuf = cache_twirpClient.CacheServiceClientJSON = void 0;
-	const cache_1 = requireCache$1();
-	class CacheServiceClientJSON {
-	    constructor(rpc) {
-	        this.rpc = rpc;
-	        this.CreateCacheEntry.bind(this);
-	        this.FinalizeCacheEntryUpload.bind(this);
-	        this.GetCacheEntryDownloadURL.bind(this);
-	    }
-	    CreateCacheEntry(request) {
-	        const data = cache_1.CreateCacheEntryRequest.toJson(request, {
-	            useProtoFieldName: true,
-	            emitDefaultValues: false,
-	        });
-	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "CreateCacheEntry", "application/json", data);
-	        return promise.then((data) => cache_1.CreateCacheEntryResponse.fromJson(data, {
-	            ignoreUnknownFields: true,
-	        }));
-	    }
-	    FinalizeCacheEntryUpload(request) {
-	        const data = cache_1.FinalizeCacheEntryUploadRequest.toJson(request, {
-	            useProtoFieldName: true,
-	            emitDefaultValues: false,
-	        });
-	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "FinalizeCacheEntryUpload", "application/json", data);
-	        return promise.then((data) => cache_1.FinalizeCacheEntryUploadResponse.fromJson(data, {
-	            ignoreUnknownFields: true,
-	        }));
-	    }
-	    GetCacheEntryDownloadURL(request) {
-	        const data = cache_1.GetCacheEntryDownloadURLRequest.toJson(request, {
-	            useProtoFieldName: true,
-	            emitDefaultValues: false,
-	        });
-	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/json", data);
-	        return promise.then((data) => cache_1.GetCacheEntryDownloadURLResponse.fromJson(data, {
-	            ignoreUnknownFields: true,
-	        }));
-	    }
-	}
-	cache_twirpClient.CacheServiceClientJSON = CacheServiceClientJSON;
-	class CacheServiceClientProtobuf {
-	    constructor(rpc) {
-	        this.rpc = rpc;
-	        this.CreateCacheEntry.bind(this);
-	        this.FinalizeCacheEntryUpload.bind(this);
-	        this.GetCacheEntryDownloadURL.bind(this);
-	    }
-	    CreateCacheEntry(request) {
-	        const data = cache_1.CreateCacheEntryRequest.toBinary(request);
-	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "CreateCacheEntry", "application/protobuf", data);
-	        return promise.then((data) => cache_1.CreateCacheEntryResponse.fromBinary(data));
-	    }
-	    FinalizeCacheEntryUpload(request) {
-	        const data = cache_1.FinalizeCacheEntryUploadRequest.toBinary(request);
-	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "FinalizeCacheEntryUpload", "application/protobuf", data);
-	        return promise.then((data) => cache_1.FinalizeCacheEntryUploadResponse.fromBinary(data));
-	    }
-	    GetCacheEntryDownloadURL(request) {
-	        const data = cache_1.GetCacheEntryDownloadURLRequest.toBinary(request);
-	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/protobuf", data);
-	        return promise.then((data) => cache_1.GetCacheEntryDownloadURLResponse.fromBinary(data));
-	    }
-	}
-	cache_twirpClient.CacheServiceClientProtobuf = CacheServiceClientProtobuf;
-	
-	return cache_twirpClient;
-}
-
-var util = {};
-
-var hasRequiredUtil;
-
-function requireUtil () {
-	if (hasRequiredUtil) return util;
-	hasRequiredUtil = 1;
-	Object.defineProperty(util, "__esModule", { value: true });
-	util.maskSigUrl = maskSigUrl;
-	util.maskSecretUrls = maskSecretUrls;
-	const core_1 = requireCore$2();
-	/**
-	 * Masks the `sig` parameter in a URL and sets it as a secret.
-	 *
-	 * @param url - The URL containing the signature parameter to mask
-	 * @remarks
-	 * This function attempts to parse the provided URL and identify the 'sig' query parameter.
-	 * If found, it registers both the raw and URL-encoded signature values as secrets using
-	 * the Actions `setSecret` API, which prevents them from being displayed in logs.
-	 *
-	 * The function handles errors gracefully if URL parsing fails, logging them as debug messages.
-	 *
-	 * @example
-	 * ```typescript
-	 * // Mask a signature in an Azure SAS token URL
-	 * maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01');
-	 * ```
-	 */
-	function maskSigUrl(url) {
-	    if (!url)
-	        return;
-	    try {
-	        const parsedUrl = new URL(url);
-	        const signature = parsedUrl.searchParams.get('sig');
-	        if (signature) {
-	            (0, core_1.setSecret)(signature);
-	            (0, core_1.setSecret)(encodeURIComponent(signature));
-	        }
-	    }
-	    catch (error) {
-	        (0, core_1.debug)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`);
-	    }
-	}
-	/**
-	 * Masks sensitive information in URLs containing signature parameters.
-	 * Currently supports masking 'sig' parameters in the 'signed_upload_url'
-	 * and 'signed_download_url' properties of the provided object.
-	 *
-	 * @param body - The object should contain a signature
-	 * @remarks
-	 * This function extracts URLs from the object properties and calls maskSigUrl
-	 * on each one to redact sensitive signature information. The function doesn't
-	 * modify the original object; it only marks the signatures as secrets for
-	 * logging purposes.
-	 *
-	 * @example
-	 * ```typescript
-	 * const responseBody = {
-	 *   signed_upload_url: 'https://blob.core.windows.net/?sig=abc123',
-	 *   signed_download_url: 'https://blob.core/windows.net/?sig=def456'
-	 * };
-	 * maskSecretUrls(responseBody);
-	 * ```
-	 */
-	function maskSecretUrls(body) {
-	    if (typeof body !== 'object' || body === null) {
-	        (0, core_1.debug)('body is not an object or is null');
-	        return;
-	    }
-	    if ('signed_upload_url' in body &&
-	        typeof body.signed_upload_url === 'string') {
-	        maskSigUrl(body.signed_upload_url);
-	    }
-	    if ('signed_download_url' in body &&
-	        typeof body.signed_download_url === 'string') {
-	        maskSigUrl(body.signed_download_url);
-	    }
-	}
-	
-	return util;
-}
-
-var hasRequiredCacheTwirpClient;
-
-function requireCacheTwirpClient () {
-	if (hasRequiredCacheTwirpClient) return cacheTwirpClient;
-	hasRequiredCacheTwirpClient = 1;
-	var __awaiter = (cacheTwirpClient && cacheTwirpClient.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(cacheTwirpClient, "__esModule", { value: true });
-	cacheTwirpClient.internalCacheTwirpClient = internalCacheTwirpClient;
-	const core_1 = requireCore$2();
-	const user_agent_1 = requireUserAgent();
-	const errors_1 = requireErrors();
-	const config_1 = requireConfig();
-	const cacheUtils_1 = requireCacheUtils();
-	const auth_1 = requireAuth$2();
-	const http_client_1 = requireLib$3();
-	const cache_twirp_client_1 = requireCache_twirpClient();
-	const util_1 = requireUtil();
-	/**
-	 * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
-	 *
-	 * It adds retry logic to the request method, which is not present in the generated client.
-	 *
-	 * This class is used to interact with cache service v2.
-	 */
-	class CacheServiceClient {
-	    constructor(userAgent, maxAttempts, baseRetryIntervalMilliseconds, retryMultiplier) {
-	        this.maxAttempts = 5;
-	        this.baseRetryIntervalMilliseconds = 3000;
-	        this.retryMultiplier = 1.5;
-	        const token = (0, cacheUtils_1.getRuntimeToken)();
-	        this.baseUrl = (0, config_1.getCacheServiceURL)();
-	        if (maxAttempts) {
-	            this.maxAttempts = maxAttempts;
-	        }
-	        if (baseRetryIntervalMilliseconds) {
-	            this.baseRetryIntervalMilliseconds = baseRetryIntervalMilliseconds;
-	        }
-	        if (retryMultiplier) {
-	            this.retryMultiplier = retryMultiplier;
-	        }
-	        this.httpClient = new http_client_1.HttpClient(userAgent, [
-	            new auth_1.BearerCredentialHandler(token)
-	        ]);
-	    }
-	    // This function satisfies the Rpc interface. It is compatible with the JSON
-	    // JSON generated client.
-	    request(service, method, contentType, data) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const url = new URL(`/twirp/${service}/${method}`, this.baseUrl).href;
-	            (0, core_1.debug)(`[Request] ${method} ${url}`);
-	            const headers = {
-	                'Content-Type': contentType
-	            };
-	            try {
-	                const { body } = yield this.retryableRequest(() => __awaiter(this, void 0, void 0, function* () { return this.httpClient.post(url, JSON.stringify(data), headers); }));
-	                return body;
-	            }
-	            catch (error) {
-	                throw new Error(`Failed to ${method}: ${error.message}`);
-	            }
-	        });
-	    }
-	    retryableRequest(operation) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            let attempt = 0;
-	            let errorMessage = '';
-	            let rawBody = '';
-	            while (attempt < this.maxAttempts) {
-	                let isRetryable = false;
-	                try {
-	                    const response = yield operation();
-	                    const statusCode = response.message.statusCode;
-	                    rawBody = yield response.readBody();
-	                    (0, core_1.debug)(`[Response] - ${response.message.statusCode}`);
-	                    (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);
-	                    const body = JSON.parse(rawBody);
-	                    (0, util_1.maskSecretUrls)(body);
-	                    (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`);
-	                    if (this.isSuccessStatusCode(statusCode)) {
-	                        return { response, body };
-	                    }
-	                    isRetryable = this.isRetryableHttpStatusCode(statusCode);
-	                    errorMessage = `Failed request: (${statusCode}) ${response.message.statusMessage}`;
-	                    if (body.msg) {
-	                        if (errors_1.UsageError.isUsageErrorMessage(body.msg)) {
-	                            throw new errors_1.UsageError();
-	                        }
-	                        errorMessage = `${errorMessage}: ${body.msg}`;
-	                    }
-	                }
-	                catch (error) {
-	                    if (error instanceof SyntaxError) {
-	                        (0, core_1.debug)(`Raw Body: ${rawBody}`);
-	                    }
-	                    if (error instanceof errors_1.UsageError) {
-	                        throw error;
-	                    }
-	                    if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {
-	                        throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code);
-	                    }
-	                    isRetryable = true;
-	                    errorMessage = error.message;
-	                }
-	                if (!isRetryable) {
-	                    throw new Error(`Received non-retryable error: ${errorMessage}`);
-	                }
-	                if (attempt + 1 === this.maxAttempts) {
-	                    throw new Error(`Failed to make request after ${this.maxAttempts} attempts: ${errorMessage}`);
-	                }
-	                const retryTimeMilliseconds = this.getExponentialRetryTimeMilliseconds(attempt);
-	                (0, core_1.info)(`Attempt ${attempt + 1} of ${this.maxAttempts} failed with error: ${errorMessage}. Retrying request in ${retryTimeMilliseconds} ms...`);
-	                yield this.sleep(retryTimeMilliseconds);
-	                attempt++;
-	            }
-	            throw new Error(`Request failed`);
-	        });
-	    }
-	    isSuccessStatusCode(statusCode) {
-	        if (!statusCode)
-	            return false;
-	        return statusCode >= 200 && statusCode < 300;
-	    }
-	    isRetryableHttpStatusCode(statusCode) {
-	        if (!statusCode)
-	            return false;
-	        const retryableStatusCodes = [
-	            http_client_1.HttpCodes.BadGateway,
-	            http_client_1.HttpCodes.GatewayTimeout,
-	            http_client_1.HttpCodes.InternalServerError,
-	            http_client_1.HttpCodes.ServiceUnavailable,
-	            http_client_1.HttpCodes.TooManyRequests
-	        ];
-	        return retryableStatusCodes.includes(statusCode);
-	    }
-	    sleep(milliseconds) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise(resolve => setTimeout(resolve, milliseconds));
-	        });
-	    }
-	    getExponentialRetryTimeMilliseconds(attempt) {
-	        if (attempt < 0) {
-	            throw new Error('attempt should be a positive integer');
-	        }
-	        if (attempt === 0) {
-	            return this.baseRetryIntervalMilliseconds;
-	        }
-	        const minTime = this.baseRetryIntervalMilliseconds * Math.pow(this.retryMultiplier, attempt);
-	        const maxTime = minTime * this.retryMultiplier;
-	        // returns a random number between minTime and maxTime (exclusive)
-	        return Math.trunc(Math.random() * (maxTime - minTime) + minTime);
-	    }
-	}
-	function internalCacheTwirpClient(options) {
-	    const client = new CacheServiceClient((0, user_agent_1.getUserAgentString)(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);
-	    return new cache_twirp_client_1.CacheServiceClientJSON(client);
-	}
-	
-	return cacheTwirpClient;
-}
-
-var tar = {};
-
-var hasRequiredTar;
-
-function requireTar () {
-	if (hasRequiredTar) return tar;
-	hasRequiredTar = 1;
-	var __createBinding = (tar && tar.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (tar && tar.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (tar && tar.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (tar && tar.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(tar, "__esModule", { value: true });
-	tar.listTar = listTar;
-	tar.extractTar = extractTar;
-	tar.createTar = createTar;
-	const exec_1 = requireExec$2();
-	const io = __importStar(requireIo$2());
-	const fs_1 = require$$1__default;
-	const path = __importStar(require$$1$6);
-	const utils = __importStar(requireCacheUtils());
-	const constants_1 = requireConstants$6();
-	const IS_WINDOWS = process.platform === 'win32';
-	// Returns tar path and type: BSD or GNU
-	function getTarPath() {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        switch (process.platform) {
-	            case 'win32': {
-	                const gnuTar = yield utils.getGnuTarPathOnWindows();
-	                const systemTar = constants_1.SystemTarPathOnWindows;
-	                if (gnuTar) {
-	                    // Use GNUtar as default on windows
-	                    return { path: gnuTar, type: constants_1.ArchiveToolType.GNU };
-	                }
-	                else if ((0, fs_1.existsSync)(systemTar)) {
-	                    return { path: systemTar, type: constants_1.ArchiveToolType.BSD };
-	                }
-	                break;
-	            }
-	            case 'darwin': {
-	                const gnuTar = yield io.which('gtar', false);
-	                if (gnuTar) {
-	                    // fix permission denied errors when extracting BSD tar archive with GNU tar - https://github.com/actions/cache/issues/527
-	                    return { path: gnuTar, type: constants_1.ArchiveToolType.GNU };
-	                }
-	                else {
-	                    return {
-	                        path: yield io.which('tar', true),
-	                        type: constants_1.ArchiveToolType.BSD
-	                    };
-	                }
-	            }
-	        }
-	        // Default assumption is GNU tar is present in path
-	        return {
-	            path: yield io.which('tar', true),
-	            type: constants_1.ArchiveToolType.GNU
-	        };
-	    });
-	}
-	// Return arguments for tar as per tarPath, compressionMethod, method type and os
-	function getTarArgs(tarPath_1, compressionMethod_1, type_1) {
-	    return __awaiter(this, arguments, void 0, function* (tarPath, compressionMethod, type, archivePath = '') {
-	        const args = [`"${tarPath.path}"`];
-	        const cacheFileName = utils.getCacheFileName(compressionMethod);
-	        const tarFile = 'cache.tar';
-	        const workingDirectory = getWorkingDirectory();
-	        // Speficic args for BSD tar on windows for workaround
-	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
-	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
-	            IS_WINDOWS;
-	        // Method specific args
-	        switch (type) {
-	            case 'create':
-	                args.push('--posix', '-cf', BSD_TAR_ZSTD
-	                    ? tarFile
-	                    : cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '--exclude', BSD_TAR_ZSTD
-	                    ? tarFile
-	                    : cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '-P', '-C', workingDirectory.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '--files-from', constants_1.ManifestFilename);
-	                break;
-	            case 'extract':
-	                args.push('-xf', BSD_TAR_ZSTD
-	                    ? tarFile
-	                    : archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '-P', '-C', workingDirectory.replace(new RegExp(`\\${path.sep}`, 'g'), '/'));
-	                break;
-	            case 'list':
-	                args.push('-tf', BSD_TAR_ZSTD
-	                    ? tarFile
-	                    : archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '-P');
-	                break;
-	        }
-	        // Platform specific args
-	        if (tarPath.type === constants_1.ArchiveToolType.GNU) {
-	            switch (process.platform) {
-	                case 'win32':
-	                    args.push('--force-local');
-	                    break;
-	                case 'darwin':
-	                    args.push('--delay-directory-restore');
-	                    break;
-	            }
-	        }
-	        return args;
-	    });
-	}
-	// Returns commands to run tar and compression program
-	function getCommands(compressionMethod_1, type_1) {
-	    return __awaiter(this, arguments, void 0, function* (compressionMethod, type, archivePath = '') {
-	        let args;
-	        const tarPath = yield getTarPath();
-	        const tarArgs = yield getTarArgs(tarPath, compressionMethod, type, archivePath);
-	        const compressionArgs = type !== 'create'
-	            ? yield getDecompressionProgram(tarPath, compressionMethod, archivePath)
-	            : yield getCompressionProgram(tarPath, compressionMethod);
-	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
-	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
-	            IS_WINDOWS;
-	        if (BSD_TAR_ZSTD && type !== 'create') {
-	            args = [[...compressionArgs].join(' '), [...tarArgs].join(' ')];
-	        }
-	        else {
-	            args = [[...tarArgs].join(' '), [...compressionArgs].join(' ')];
-	        }
-	        if (BSD_TAR_ZSTD) {
-	            return args;
-	        }
-	        return [args.join(' ')];
-	    });
-	}
-	function getWorkingDirectory() {
-	    var _a;
-	    return (_a = process.env['GITHUB_WORKSPACE']) !== null && _a !== void 0 ? _a : process.cwd();
-	}
-	// Common function for extractTar and listTar to get the compression method
-	function getDecompressionProgram(tarPath, compressionMethod, archivePath) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        // -d: Decompress.
-	        // unzstd is equivalent to 'zstd -d'
-	        // --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
-	        // Using 30 here because we also support 32-bit self-hosted runners.
-	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
-	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
-	            IS_WINDOWS;
-	        switch (compressionMethod) {
-	            case constants_1.CompressionMethod.Zstd:
-	                return BSD_TAR_ZSTD
-	                    ? [
-	                        'zstd -d --long=30 --force -o',
-	                        constants_1.TarFilename,
-	                        archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/')
-	                    ]
-	                    : [
-	                        '--use-compress-program',
-	                        IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30'
-	                    ];
-	            case constants_1.CompressionMethod.ZstdWithoutLong:
-	                return BSD_TAR_ZSTD
-	                    ? [
-	                        'zstd -d --force -o',
-	                        constants_1.TarFilename,
-	                        archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/')
-	                    ]
-	                    : ['--use-compress-program', IS_WINDOWS ? '"zstd -d"' : 'unzstd'];
-	            default:
-	                return ['-z'];
-	        }
-	    });
-	}
-	// Used for creating the archive
-	// -T#: Compress using # working thread. If # is 0, attempt to detect and use the number of physical CPU cores.
-	// zstdmt is equivalent to 'zstd -T0'
-	// --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
-	// Using 30 here because we also support 32-bit self-hosted runners.
-	// Long range mode is added to zstd in v1.3.2 release, so we will not use --long in older version of zstd.
-	function getCompressionProgram(tarPath, compressionMethod) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const cacheFileName = utils.getCacheFileName(compressionMethod);
-	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
-	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
-	            IS_WINDOWS;
-	        switch (compressionMethod) {
-	            case constants_1.CompressionMethod.Zstd:
-	                return BSD_TAR_ZSTD
-	                    ? [
-	                        'zstd -T0 --long=30 --force -o',
-	                        cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
-	                        constants_1.TarFilename
-	                    ]
-	                    : [
-	                        '--use-compress-program',
-	                        IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30'
-	                    ];
-	            case constants_1.CompressionMethod.ZstdWithoutLong:
-	                return BSD_TAR_ZSTD
-	                    ? [
-	                        'zstd -T0 --force -o',
-	                        cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
-	                        constants_1.TarFilename
-	                    ]
-	                    : ['--use-compress-program', IS_WINDOWS ? '"zstd -T0"' : 'zstdmt'];
-	            default:
-	                return ['-z'];
-	        }
-	    });
-	}
-	// Executes all commands as separate processes
-	function execCommands(commands, cwd) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        for (const command of commands) {
-	            try {
-	                yield (0, exec_1.exec)(command, undefined, {
-	                    cwd,
-	                    env: Object.assign(Object.assign({}, process.env), { MSYS: 'winsymlinks:nativestrict' })
-	                });
-	            }
-	            catch (error) {
-	                throw new Error(`${command.split(' ')[0]} failed with error: ${error === null || error === void 0 ? void 0 : error.message}`);
-	            }
-	        }
-	    });
-	}
-	// List the contents of a tar
-	function listTar(archivePath, compressionMethod) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        const commands = yield getCommands(compressionMethod, 'list', archivePath);
-	        yield execCommands(commands);
-	    });
-	}
-	// Extract a tar
-	function extractTar(archivePath, compressionMethod) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        // Create directory to extract tar into
-	        const workingDirectory = getWorkingDirectory();
-	        yield io.mkdirP(workingDirectory);
-	        const commands = yield getCommands(compressionMethod, 'extract', archivePath);
-	        yield execCommands(commands);
-	    });
-	}
-	// Create a tar
-	function createTar(archiveFolder, sourceDirectories, compressionMethod) {
-	    return __awaiter(this, void 0, void 0, function* () {
-	        // Write source directories to manifest.txt to avoid command length limits
-	        (0, fs_1.writeFileSync)(path.join(archiveFolder, constants_1.ManifestFilename), sourceDirectories.join('\n'));
-	        const commands = yield getCommands(compressionMethod, 'create');
-	        yield execCommands(commands, archiveFolder);
-	    });
-	}
-	
-	return tar;
-}
-
-var hasRequiredCache;
-
-function requireCache () {
-	if (hasRequiredCache) return cache$2;
-	hasRequiredCache = 1;
-	var __createBinding = (cache$2 && cache$2.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (cache$2 && cache$2.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (cache$2 && cache$2.__importStar) || (function () {
-	    var ownKeys = function(o) {
-	        ownKeys = Object.getOwnPropertyNames || function (o) {
-	            var ar = [];
-	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
-	            return ar;
-	        };
-	        return ownKeys(o);
-	    };
-	    return function (mod) {
-	        if (mod && mod.__esModule) return mod;
-	        var result = {};
-	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
-	        __setModuleDefault(result, mod);
-	        return result;
-	    };
-	})();
-	var __awaiter = (cache$2 && cache$2.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(cache$2, "__esModule", { value: true });
-	cache$2.FinalizeCacheError = cache$2.ReserveCacheError = cache$2.ValidationError = void 0;
-	cache$2.isFeatureAvailable = isFeatureAvailable;
-	cache$2.restoreCache = restoreCache;
-	cache$2.saveCache = saveCache;
-	const core = __importStar(requireCore$2());
-	const path = __importStar(require$$1$6);
-	const utils = __importStar(requireCacheUtils());
-	const cacheHttpClient = __importStar(requireCacheHttpClient());
-	const cacheTwirpClient = __importStar(requireCacheTwirpClient());
-	const config_1 = requireConfig();
-	const tar_1 = requireTar();
-	const http_client_1 = requireLib$3();
-	class ValidationError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = 'ValidationError';
-	        Object.setPrototypeOf(this, ValidationError.prototype);
-	    }
-	}
-	cache$2.ValidationError = ValidationError;
-	class ReserveCacheError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = 'ReserveCacheError';
-	        Object.setPrototypeOf(this, ReserveCacheError.prototype);
-	    }
-	}
-	cache$2.ReserveCacheError = ReserveCacheError;
-	class FinalizeCacheError extends Error {
-	    constructor(message) {
-	        super(message);
-	        this.name = 'FinalizeCacheError';
-	        Object.setPrototypeOf(this, FinalizeCacheError.prototype);
-	    }
-	}
-	cache$2.FinalizeCacheError = FinalizeCacheError;
-	function checkPaths(paths) {
-	    if (!paths || paths.length === 0) {
-	        throw new ValidationError(`Path Validation Error: At least one directory or file path is required`);
-	    }
-	}
-	function checkKey(key) {
-	    if (key.length > 512) {
-	        throw new ValidationError(`Key Validation Error: ${key} cannot be larger than 512 characters.`);
-	    }
-	    const regex = /^[^,]*$/;
-	    if (!regex.test(key)) {
-	        throw new ValidationError(`Key Validation Error: ${key} cannot contain commas.`);
-	    }
-	}
-	/**
-	 * isFeatureAvailable to check the presence of Actions cache service
-	 *
-	 * @returns boolean return true if Actions cache service feature is available, otherwise false
-	 */
-	function isFeatureAvailable() {
-	    const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
-	    // Check availability based on cache service version
-	    switch (cacheServiceVersion) {
-	        case 'v2':
-	            // For v2, we need ACTIONS_RESULTS_URL
-	            return !!process.env['ACTIONS_RESULTS_URL'];
-	        case 'v1':
-	        default:
-	            // For v1, we only need ACTIONS_CACHE_URL
-	            return !!process.env['ACTIONS_CACHE_URL'];
-	    }
-	}
-	/**
-	 * Restores cache from keys
-	 *
-	 * @param paths a list of file paths to restore from the cache
-	 * @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching.
-	 * @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
-	 * @param downloadOptions cache download options
-	 * @param enableCrossOsArchive an optional boolean enabled to restore on windows any cache created on any platform
-	 * @returns string returns the key for the cache hit, otherwise returns undefined
-	 */
-	function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) {
-	    return __awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
-	        const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
-	        core.debug(`Cache service version: ${cacheServiceVersion}`);
-	        checkPaths(paths);
-	        switch (cacheServiceVersion) {
-	            case 'v2':
-	                return yield restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsArchive);
-	            case 'v1':
-	            default:
-	                return yield restoreCacheV1(paths, primaryKey, restoreKeys, options, enableCrossOsArchive);
-	        }
-	    });
-	}
-	/**
-	 * Restores cache using the legacy Cache Service
-	 *
-	 * @param paths a list of file paths to restore from the cache
-	 * @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching.
-	 * @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
-	 * @param options cache download options
-	 * @param enableCrossOsArchive an optional boolean enabled to restore on Windows any cache created on any platform
-	 * @returns string returns the key for the cache hit, otherwise returns undefined
-	 */
-	function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) {
-	    return __awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
-	        restoreKeys = restoreKeys || [];
-	        const keys = [primaryKey, ...restoreKeys];
-	        core.debug('Resolved Keys:');
-	        core.debug(JSON.stringify(keys));
-	        if (keys.length > 10) {
-	            throw new ValidationError(`Key Validation Error: Keys are limited to a maximum of 10.`);
-	        }
-	        for (const key of keys) {
-	            checkKey(key);
-	        }
-	        const compressionMethod = yield utils.getCompressionMethod();
-	        let archivePath = '';
-	        try {
-	            // path are needed to compute version
-	            const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, {
-	                compressionMethod,
-	                enableCrossOsArchive
-	            });
-	            if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) {
-	                // Cache not found
-	                return undefined;
-	            }
-	            if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
-	                core.info('Lookup only - skipping download');
-	                return cacheEntry.cacheKey;
-	            }
-	            archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod));
-	            core.debug(`Archive Path: ${archivePath}`);
-	            // Download the cache from the cache entry
-	            yield cacheHttpClient.downloadCache(cacheEntry.archiveLocation, archivePath, options);
-	            if (core.isDebug()) {
-	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
-	            }
-	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
-	            core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
-	            yield (0, tar_1.extractTar)(archivePath, compressionMethod);
-	            core.info('Cache restored successfully');
-	            return cacheEntry.cacheKey;
-	        }
-	        catch (error) {
-	            const typedError = error;
-	            if (typedError.name === ValidationError.name) {
-	                throw error;
-	            }
-	            else {
-	                // warn on cache restore failure and continue build
-	                // Log server errors (5xx) as errors, all other errors as warnings
-	                if (typedError instanceof http_client_1.HttpClientError &&
-	                    typeof typedError.statusCode === 'number' &&
-	                    typedError.statusCode >= 500) {
-	                    core.error(`Failed to restore: ${error.message}`);
-	                }
-	                else {
-	                    core.warning(`Failed to restore: ${error.message}`);
-	                }
-	            }
-	        }
-	        finally {
-	            // Try to delete the archive to save space
-	            try {
-	                yield utils.unlinkFile(archivePath);
-	            }
-	            catch (error) {
-	                core.debug(`Failed to delete archive: ${error}`);
-	            }
-	        }
-	        return undefined;
-	    });
-	}
-	/**
-	 * Restores cache using Cache Service v2
-	 *
-	 * @param paths a list of file paths to restore from the cache
-	 * @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching
-	 * @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
-	 * @param downloadOptions cache download options
-	 * @param enableCrossOsArchive an optional boolean enabled to restore on windows any cache created on any platform
-	 * @returns string returns the key for the cache hit, otherwise returns undefined
-	 */
-	function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) {
-	    return __awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
-	        // Override UploadOptions to force the use of Azure
-	        options = Object.assign(Object.assign({}, options), { useAzureSdk: true });
-	        restoreKeys = restoreKeys || [];
-	        const keys = [primaryKey, ...restoreKeys];
-	        core.debug('Resolved Keys:');
-	        core.debug(JSON.stringify(keys));
-	        if (keys.length > 10) {
-	            throw new ValidationError(`Key Validation Error: Keys are limited to a maximum of 10.`);
-	        }
-	        for (const key of keys) {
-	            checkKey(key);
-	        }
-	        let archivePath = '';
-	        try {
-	            const twirpClient = cacheTwirpClient.internalCacheTwirpClient();
-	            const compressionMethod = yield utils.getCompressionMethod();
-	            const request = {
-	                key: primaryKey,
-	                restoreKeys,
-	                version: utils.getCacheVersion(paths, compressionMethod, enableCrossOsArchive)
-	            };
-	            const response = yield twirpClient.GetCacheEntryDownloadURL(request);
-	            if (!response.ok) {
-	                core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`);
-	                return undefined;
-	            }
-	            const isRestoreKeyMatch = request.key !== response.matchedKey;
-	            if (isRestoreKeyMatch) {
-	                core.info(`Cache hit for restore-key: ${response.matchedKey}`);
-	            }
-	            else {
-	                core.info(`Cache hit for: ${response.matchedKey}`);
-	            }
-	            if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
-	                core.info('Lookup only - skipping download');
-	                return response.matchedKey;
-	            }
-	            archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod));
-	            core.debug(`Archive path: ${archivePath}`);
-	            core.debug(`Starting download of archive to: ${archivePath}`);
-	            yield cacheHttpClient.downloadCache(response.signedDownloadUrl, archivePath, options);
-	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
-	            core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
-	            if (core.isDebug()) {
-	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
-	            }
-	            yield (0, tar_1.extractTar)(archivePath, compressionMethod);
-	            core.info('Cache restored successfully');
-	            return response.matchedKey;
-	        }
-	        catch (error) {
-	            const typedError = error;
-	            if (typedError.name === ValidationError.name) {
-	                throw error;
-	            }
-	            else {
-	                // Supress all non-validation cache related errors because caching should be optional
-	                // Log server errors (5xx) as errors, all other errors as warnings
-	                if (typedError instanceof http_client_1.HttpClientError &&
-	                    typeof typedError.statusCode === 'number' &&
-	                    typedError.statusCode >= 500) {
-	                    core.error(`Failed to restore: ${error.message}`);
-	                }
-	                else {
-	                    core.warning(`Failed to restore: ${error.message}`);
-	                }
-	            }
-	        }
-	        finally {
-	            try {
-	                if (archivePath) {
-	                    yield utils.unlinkFile(archivePath);
-	                }
-	            }
-	            catch (error) {
-	                core.debug(`Failed to delete archive: ${error}`);
-	            }
-	        }
-	        return undefined;
-	    });
-	}
-	/**
-	 * Saves a list of files with the specified key
-	 *
-	 * @param paths a list of file paths to be cached
-	 * @param key an explicit key for restoring the cache
-	 * @param enableCrossOsArchive an optional boolean enabled to save cache on windows which could be restored on any platform
-	 * @param options cache upload options
-	 * @returns number returns cacheId if the cache was saved successfully and throws an error if save fails
-	 */
-	function saveCache(paths_1, key_1, options_1) {
-	    return __awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
-	        const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
-	        core.debug(`Cache service version: ${cacheServiceVersion}`);
-	        checkPaths(paths);
-	        checkKey(key);
-	        switch (cacheServiceVersion) {
-	            case 'v2':
-	                return yield saveCacheV2(paths, key, options, enableCrossOsArchive);
-	            case 'v1':
-	            default:
-	                return yield saveCacheV1(paths, key, options, enableCrossOsArchive);
-	        }
-	    });
-	}
-	/**
-	 * Save cache using the legacy Cache Service
-	 *
-	 * @param paths
-	 * @param key
-	 * @param options
-	 * @param enableCrossOsArchive
-	 * @returns
-	 */
-	function saveCacheV1(paths_1, key_1, options_1) {
-	    return __awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
-	        var _a, _b, _c, _d, _e;
-	        const compressionMethod = yield utils.getCompressionMethod();
-	        let cacheId = -1;
-	        const cachePaths = yield utils.resolvePaths(paths);
-	        core.debug('Cache Paths:');
-	        core.debug(`${JSON.stringify(cachePaths)}`);
-	        if (cachePaths.length === 0) {
-	            throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`);
-	        }
-	        const archiveFolder = yield utils.createTempDirectory();
-	        const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod));
-	        core.debug(`Archive Path: ${archivePath}`);
-	        try {
-	            yield (0, tar_1.createTar)(archiveFolder, cachePaths, compressionMethod);
-	            if (core.isDebug()) {
-	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
-	            }
-	            const fileSizeLimit = 10 * 1024 * 1024 * 1024; // 10GB per repo limit
-	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
-	            core.debug(`File Size: ${archiveFileSize}`);
-	            // For GHES, this check will take place in ReserveCache API with enterprise file size limit
-	            if (archiveFileSize > fileSizeLimit && !(0, config_1.isGhes)()) {
-	                throw new Error(`Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the 10GB limit, not saving cache.`);
-	            }
-	            core.debug('Reserving Cache');
-	            const reserveCacheResponse = yield cacheHttpClient.reserveCache(key, paths, {
-	                compressionMethod,
-	                enableCrossOsArchive,
-	                cacheSize: archiveFileSize
-	            });
-	            if ((_a = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.result) === null || _a === void 0 ? void 0 : _a.cacheId) {
-	                cacheId = (_b = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.result) === null || _b === void 0 ? void 0 : _b.cacheId;
-	            }
-	            else if ((reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.statusCode) === 400) {
-	                throw new Error((_d = (_c = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _c === void 0 ? void 0 : _c.message) !== null && _d !== void 0 ? _d : `Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the data cap limit, not saving cache.`);
-	            }
-	            else {
-	                throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache. More details: ${(_e = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _e === void 0 ? void 0 : _e.message}`);
-	            }
-	            core.debug(`Saving Cache (ID: ${cacheId})`);
-	            yield cacheHttpClient.saveCache(cacheId, archivePath, '', options);
-	        }
-	        catch (error) {
-	            const typedError = error;
-	            if (typedError.name === ValidationError.name) {
-	                throw error;
-	            }
-	            else if (typedError.name === ReserveCacheError.name) {
-	                core.info(`Failed to save: ${typedError.message}`);
-	            }
-	            else {
-	                // Log server errors (5xx) as errors, all other errors as warnings
-	                if (typedError instanceof http_client_1.HttpClientError &&
-	                    typeof typedError.statusCode === 'number' &&
-	                    typedError.statusCode >= 500) {
-	                    core.error(`Failed to save: ${typedError.message}`);
-	                }
-	                else {
-	                    core.warning(`Failed to save: ${typedError.message}`);
-	                }
-	            }
-	        }
-	        finally {
-	            // Try to delete the archive to save space
-	            try {
-	                yield utils.unlinkFile(archivePath);
-	            }
-	            catch (error) {
-	                core.debug(`Failed to delete archive: ${error}`);
-	            }
-	        }
-	        return cacheId;
-	    });
-	}
-	/**
-	 * Save cache using Cache Service v2
-	 *
-	 * @param paths a list of file paths to restore from the cache
-	 * @param key an explicit key for restoring the cache
-	 * @param options cache upload options
-	 * @param enableCrossOsArchive an optional boolean enabled to save cache on windows which could be restored on any platform
-	 * @returns
-	 */
-	function saveCacheV2(paths_1, key_1, options_1) {
-	    return __awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
-	        // Override UploadOptions to force the use of Azure
-	        // ...options goes first because we want to override the default values
-	        // set in UploadOptions with these specific figures
-	        options = Object.assign(Object.assign({}, options), { uploadChunkSize: 64 * 1024 * 1024, uploadConcurrency: 8, useAzureSdk: true });
-	        const compressionMethod = yield utils.getCompressionMethod();
-	        const twirpClient = cacheTwirpClient.internalCacheTwirpClient();
-	        let cacheId = -1;
-	        const cachePaths = yield utils.resolvePaths(paths);
-	        core.debug('Cache Paths:');
-	        core.debug(`${JSON.stringify(cachePaths)}`);
-	        if (cachePaths.length === 0) {
-	            throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`);
-	        }
-	        const archiveFolder = yield utils.createTempDirectory();
-	        const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod));
-	        core.debug(`Archive Path: ${archivePath}`);
-	        try {
-	            yield (0, tar_1.createTar)(archiveFolder, cachePaths, compressionMethod);
-	            if (core.isDebug()) {
-	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
-	            }
-	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
-	            core.debug(`File Size: ${archiveFileSize}`);
-	            // Set the archive size in the options, will be used to display the upload progress
-	            options.archiveSizeBytes = archiveFileSize;
-	            core.debug('Reserving Cache');
-	            const version = utils.getCacheVersion(paths, compressionMethod, enableCrossOsArchive);
-	            const request = {
-	                key,
-	                version
-	            };
-	            let signedUploadUrl;
-	            try {
-	                const response = yield twirpClient.CreateCacheEntry(request);
-	                if (!response.ok) {
-	                    if (response.message) {
-	                        core.warning(`Cache reservation failed: ${response.message}`);
-	                    }
-	                    throw new Error(response.message || 'Response was not ok');
-	                }
-	                signedUploadUrl = response.signedUploadUrl;
-	            }
-	            catch (error) {
-	                core.debug(`Failed to reserve cache: ${error}`);
-	                throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache.`);
-	            }
-	            core.debug(`Attempting to upload cache located at: ${archivePath}`);
-	            yield cacheHttpClient.saveCache(cacheId, archivePath, signedUploadUrl, options);
-	            const finalizeRequest = {
-	                key,
-	                version,
-	                sizeBytes: `${archiveFileSize}`
-	            };
-	            const finalizeResponse = yield twirpClient.FinalizeCacheEntryUpload(finalizeRequest);
-	            core.debug(`FinalizeCacheEntryUploadResponse: ${finalizeResponse.ok}`);
-	            if (!finalizeResponse.ok) {
-	                if (finalizeResponse.message) {
-	                    throw new FinalizeCacheError(finalizeResponse.message);
-	                }
-	                throw new Error(`Unable to finalize cache with key ${key}, another job may be finalizing this cache.`);
-	            }
-	            cacheId = parseInt(finalizeResponse.entryId);
-	        }
-	        catch (error) {
-	            const typedError = error;
-	            if (typedError.name === ValidationError.name) {
-	                throw error;
-	            }
-	            else if (typedError.name === ReserveCacheError.name) {
-	                core.info(`Failed to save: ${typedError.message}`);
-	            }
-	            else if (typedError.name === FinalizeCacheError.name) {
-	                core.warning(typedError.message);
-	            }
-	            else {
-	                // Log server errors (5xx) as errors, all other errors as warnings
-	                if (typedError instanceof http_client_1.HttpClientError &&
-	                    typeof typedError.statusCode === 'number' &&
-	                    typedError.statusCode >= 500) {
-	                    core.error(`Failed to save: ${typedError.message}`);
-	                }
-	                else {
-	                    core.warning(`Failed to save: ${typedError.message}`);
-	                }
-	            }
-	        }
-	        finally {
-	            // Try to delete the archive to save space
-	            try {
-	                yield utils.unlinkFile(archivePath);
-	            }
-	            catch (error) {
-	                core.debug(`Failed to delete archive: ${error}`);
-	            }
-	        }
-	        return cacheId;
-	    });
-	}
-	
-	return cache$2;
-}
-
-var cacheExports = requireCache();
-
-var globExports = requireGlob();
-
-/**
- * The MIT License (MIT)
- *
- * Copyright (c) 2018 GitHub, Inc. and contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * Forked from https://github.com/actions/setup-java/blob/5b36705a13905facb447b6812d613a06a07e371d/src/cache.ts
- *
- * @fileoverview this file provides methods handling dependency cache
- */
-const STATE_CACHE_PRIMARY_KEY = 'cache-primary-key';
-const CACHE_MATCHED_KEY = 'cache-matched-key';
-const supportedPackageManager = [
-    {
-        id: 'maven',
-        path: [join(require$$0$3.homedir(), '.m2', 'repository')],
-        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven
-        pattern: ['**/pom.xml']
-    },
-    {
-        id: 'gradle',
-        path: [join(require$$0$3.homedir(), '.gradle', 'caches'), join(require$$0$3.homedir(), '.gradle', 'wrapper')],
-        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle
-        pattern: ['**/*.gradle*', '**/gradle-wrapper.properties', 'buildSrc/**/Versions.kt', 'buildSrc/**/Dependencies.kt']
-    },
-    {
-        id: 'sbt',
-        path: [
-            join(require$$0$3.homedir(), '.ivy2', 'cache'),
-            join(require$$0$3.homedir(), '.sbt'),
-            getCoursierCachePath(),
-            // Some files should not be cached to avoid resolution problems.
-            // In particular the resolution of snapshots (ideological gap between maven/ivy).
-            `!${join(require$$0$3.homedir(), '.sbt', '*.lock')}`,
-            `!${join(require$$0$3.homedir(), '**', 'ivydata-*.properties')}`
-        ],
-        pattern: ['**/*.sbt', '**/project/build.properties', '**/project/**.{scala,sbt}']
-    }
-];
-function getCoursierCachePath() {
-    if (require$$0$3.type() === 'Linux')
-        return join(require$$0$3.homedir(), '.cache', 'coursier');
-    if (require$$0$3.type() === 'Darwin')
-        return join(require$$0$3.homedir(), 'Library', 'Caches', 'Coursier');
-    return join(require$$0$3.homedir(), 'AppData', 'Local', 'Coursier', 'Cache');
-}
-function findPackageManager(id) {
-    const packageManager = supportedPackageManager.find((pm) => pm.id === id);
-    if (packageManager === undefined) {
-        throw new Error(`unknown package manager specified: ${id}`);
-    }
-    return packageManager;
-}
-/**
- * Save the dependency cache
- * @param id ID of the package manager, should be "maven" or "gradle"
- */
-async function save(id) {
-    const packageManager = findPackageManager(id);
-    const matchedKey = coreExports.getState(CACHE_MATCHED_KEY);
-    // Inputs are re-evaluted before the post action, so we want the original key used for restore
-    const primaryKey = coreExports.getState(STATE_CACHE_PRIMARY_KEY);
-    if (!primaryKey) {
-        coreExports.warning('Error retrieving key from state.');
-        return;
-    }
-    else if (matchedKey === primaryKey) {
-        // no change in target directories
-        coreExports.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
-        return;
-    }
-    try {
-        await cacheExports.saveCache(packageManager.path, primaryKey);
-        coreExports.info(`Cache saved with the key: ${primaryKey}`);
-    }
-    catch (error) {
-        if (!(error instanceof Error)) {
-            coreExports.info(`Not an Error: ${error}`);
-            throw error;
-        }
-        if (error.name === cacheExports.ReserveCacheError.name) {
-            coreExports.info(error.message);
-        }
-        else {
-            if (isProbablyGradleDaemonProblem(packageManager, error)) {
-                coreExports.warning('Failed to save Gradle cache on Windows. If tar.exe reported "Permission denied", try to run Gradle with `--no-daemon` option. Refer to https://github.com/actions/cache/issues/454 for details.');
-            }
-            throw error;
-        }
-    }
-}
-/**
- * @param packageManager the specified package manager by user
- * @param error the error thrown by the saveCache
- * @returns true if the given error seems related to the {@link https://github.com/actions/cache/issues/454|running Gradle Daemon issue}.
- * @see {@link https://github.com/actions/cache/issues/454#issuecomment-840493935|why --no-daemon is necessary}
- */
-function isProbablyGradleDaemonProblem(packageManager, error) {
-    if (packageManager.id !== 'gradle' || process.env['RUNNER_OS'] !== 'Windows') {
-        return false;
-    }
-    const message = error.message || '';
-    return message.startsWith('Tar failed with error: ');
-}
-
-var github = {};
-
-var context = {};
-
-var hasRequiredContext;
-
-function requireContext () {
-	if (hasRequiredContext) return context;
-	hasRequiredContext = 1;
-	Object.defineProperty(context, "__esModule", { value: true });
-	context.Context = void 0;
-	const fs_1 = require$$1__default;
-	const os_1 = require$$0$3;
-	class Context {
-	    /**
-	     * Hydrate the context from the environment
-	     */
-	    constructor() {
-	        var _a, _b, _c;
-	        this.payload = {};
-	        if (process.env.GITHUB_EVENT_PATH) {
-	            if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) {
-	                this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));
-	            }
-	            else {
-	                const path = process.env.GITHUB_EVENT_PATH;
-	                process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);
-	            }
-	        }
-	        this.eventName = process.env.GITHUB_EVENT_NAME;
-	        this.sha = process.env.GITHUB_SHA;
-	        this.ref = process.env.GITHUB_REF;
-	        this.workflow = process.env.GITHUB_WORKFLOW;
-	        this.action = process.env.GITHUB_ACTION;
-	        this.actor = process.env.GITHUB_ACTOR;
-	        this.job = process.env.GITHUB_JOB;
-	        this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10);
-	        this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);
-	        this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);
-	        this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;
-	        this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;
-	        this.graphqlUrl =
-	            (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;
-	    }
-	    get issue() {
-	        const payload = this.payload;
-	        return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });
-	    }
-	    get repo() {
-	        if (process.env.GITHUB_REPOSITORY) {
-	            const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
-	            return { owner, repo };
-	        }
-	        if (this.payload.repository) {
-	            return {
-	                owner: this.payload.repository.owner.login,
-	                repo: this.payload.repository.name
-	            };
-	        }
-	        throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'");
-	    }
-	}
-	context.Context = Context;
-	
-	return context;
-}
-
-var utils$2 = {};
-
-var utils$1 = {};
-
-var lib$1 = {};
-
-var proxy$1 = {};
-
-var hasRequiredProxy$1;
-
-function requireProxy$1 () {
-	if (hasRequiredProxy$1) return proxy$1;
-	hasRequiredProxy$1 = 1;
-	Object.defineProperty(proxy$1, "__esModule", { value: true });
-	proxy$1.checkBypass = proxy$1.getProxyUrl = void 0;
-	function getProxyUrl(reqUrl) {
-	    const usingSsl = reqUrl.protocol === 'https:';
-	    if (checkBypass(reqUrl)) {
-	        return undefined;
-	    }
-	    const proxyVar = (() => {
-	        if (usingSsl) {
-	            return process.env['https_proxy'] || process.env['HTTPS_PROXY'];
-	        }
-	        else {
-	            return process.env['http_proxy'] || process.env['HTTP_PROXY'];
-	        }
-	    })();
-	    if (proxyVar) {
-	        try {
-	            return new DecodedURL(proxyVar);
-	        }
-	        catch (_a) {
-	            if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))
-	                return new DecodedURL(`http://${proxyVar}`);
-	        }
-	    }
-	    else {
-	        return undefined;
-	    }
-	}
-	proxy$1.getProxyUrl = getProxyUrl;
-	function checkBypass(reqUrl) {
-	    if (!reqUrl.hostname) {
-	        return false;
-	    }
-	    const reqHost = reqUrl.hostname;
-	    if (isLoopbackAddress(reqHost)) {
-	        return true;
-	    }
-	    const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';
-	    if (!noProxy) {
-	        return false;
-	    }
-	    // Determine the request port
-	    let reqPort;
-	    if (reqUrl.port) {
-	        reqPort = Number(reqUrl.port);
-	    }
-	    else if (reqUrl.protocol === 'http:') {
-	        reqPort = 80;
-	    }
-	    else if (reqUrl.protocol === 'https:') {
-	        reqPort = 443;
-	    }
-	    // Format the request hostname and hostname with port
-	    const upperReqHosts = [reqUrl.hostname.toUpperCase()];
-	    if (typeof reqPort === 'number') {
-	        upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);
-	    }
-	    // Compare request host against noproxy
-	    for (const upperNoProxyItem of noProxy
-	        .split(',')
-	        .map(x => x.trim().toUpperCase())
-	        .filter(x => x)) {
-	        if (upperNoProxyItem === '*' ||
-	            upperReqHosts.some(x => x === upperNoProxyItem ||
-	                x.endsWith(`.${upperNoProxyItem}`) ||
-	                (upperNoProxyItem.startsWith('.') &&
-	                    x.endsWith(`${upperNoProxyItem}`)))) {
-	            return true;
-	        }
-	    }
-	    return false;
-	}
-	proxy$1.checkBypass = checkBypass;
-	function isLoopbackAddress(host) {
-	    const hostLower = host.toLowerCase();
-	    return (hostLower === 'localhost' ||
-	        hostLower.startsWith('127.') ||
-	        hostLower.startsWith('[::1]') ||
-	        hostLower.startsWith('[0:0:0:0:0:0:0:1]'));
-	}
-	class DecodedURL extends URL {
-	    constructor(url, base) {
-	        super(url, base);
-	        this._decodedUsername = decodeURIComponent(super.username);
-	        this._decodedPassword = decodeURIComponent(super.password);
-	    }
-	    get username() {
-	        return this._decodedUsername;
-	    }
-	    get password() {
-	        return this._decodedPassword;
-	    }
-	}
-	
-	return proxy$1;
-}
-
-var hasRequiredLib$1;
-
-function requireLib$1 () {
-	if (hasRequiredLib$1) return lib$1;
-	hasRequiredLib$1 = 1;
-	/* eslint-disable @typescript-eslint/no-explicit-any */
-	var __createBinding = (lib$1 && lib$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (lib$1 && lib$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (lib$1 && lib$1.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (lib$1 && lib$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(lib$1, "__esModule", { value: true });
-	lib$1.HttpClient = lib$1.isHttps = lib$1.HttpClientResponse = lib$1.HttpClientError = lib$1.getProxyUrl = lib$1.MediaTypes = lib$1.Headers = lib$1.HttpCodes = void 0;
-	const http = __importStar(require$$0$5);
-	const https = __importStar(require$$1$2);
-	const pm = __importStar(requireProxy$1());
-	const tunnel = __importStar(requireTunnel());
-	const undici_1 = requireUndici();
-	var HttpCodes;
-	(function (HttpCodes) {
-	    HttpCodes[HttpCodes["OK"] = 200] = "OK";
-	    HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";
-	    HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";
-	    HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";
-	    HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";
-	    HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";
-	    HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";
-	    HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";
-	    HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";
-	    HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";
-	    HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";
-	    HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";
-	    HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";
-	    HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";
-	    HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";
-	    HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";
-	    HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";
-	    HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
-	    HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
-	    HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
-	    HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
-	    HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";
-	    HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
-	    HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
-	    HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
-	    HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";
-	    HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";
-	})(HttpCodes || (lib$1.HttpCodes = HttpCodes = {}));
-	var Headers;
-	(function (Headers) {
-	    Headers["Accept"] = "accept";
-	    Headers["ContentType"] = "content-type";
-	})(Headers || (lib$1.Headers = Headers = {}));
-	var MediaTypes;
-	(function (MediaTypes) {
-	    MediaTypes["ApplicationJson"] = "application/json";
-	})(MediaTypes || (lib$1.MediaTypes = MediaTypes = {}));
-	/**
-	 * Returns the proxy URL, depending upon the supplied url and proxy environment variables.
-	 * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
-	 */
-	function getProxyUrl(serverUrl) {
-	    const proxyUrl = pm.getProxyUrl(new URL(serverUrl));
-	    return proxyUrl ? proxyUrl.href : '';
-	}
-	lib$1.getProxyUrl = getProxyUrl;
-	const HttpRedirectCodes = [
-	    HttpCodes.MovedPermanently,
-	    HttpCodes.ResourceMoved,
-	    HttpCodes.SeeOther,
-	    HttpCodes.TemporaryRedirect,
-	    HttpCodes.PermanentRedirect
-	];
-	const HttpResponseRetryCodes = [
-	    HttpCodes.BadGateway,
-	    HttpCodes.ServiceUnavailable,
-	    HttpCodes.GatewayTimeout
-	];
-	const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
-	const ExponentialBackoffCeiling = 10;
-	const ExponentialBackoffTimeSlice = 5;
-	class HttpClientError extends Error {
-	    constructor(message, statusCode) {
-	        super(message);
-	        this.name = 'HttpClientError';
-	        this.statusCode = statusCode;
-	        Object.setPrototypeOf(this, HttpClientError.prototype);
-	    }
-	}
-	lib$1.HttpClientError = HttpClientError;
-	class HttpClientResponse {
-	    constructor(message) {
-	        this.message = message;
-	    }
-	    readBody() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
-	                let output = Buffer.alloc(0);
-	                this.message.on('data', (chunk) => {
-	                    output = Buffer.concat([output, chunk]);
-	                });
-	                this.message.on('end', () => {
-	                    resolve(output.toString());
-	                });
-	            }));
-	        });
-	    }
-	    readBodyBuffer() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
-	                const chunks = [];
-	                this.message.on('data', (chunk) => {
-	                    chunks.push(chunk);
-	                });
-	                this.message.on('end', () => {
-	                    resolve(Buffer.concat(chunks));
-	                });
-	            }));
-	        });
-	    }
-	}
-	lib$1.HttpClientResponse = HttpClientResponse;
-	function isHttps(requestUrl) {
-	    const parsedUrl = new URL(requestUrl);
-	    return parsedUrl.protocol === 'https:';
-	}
-	lib$1.isHttps = isHttps;
-	class HttpClient {
-	    constructor(userAgent, handlers, requestOptions) {
-	        this._ignoreSslError = false;
-	        this._allowRedirects = true;
-	        this._allowRedirectDowngrade = false;
-	        this._maxRedirects = 50;
-	        this._allowRetries = false;
-	        this._maxRetries = 1;
-	        this._keepAlive = false;
-	        this._disposed = false;
-	        this.userAgent = userAgent;
-	        this.handlers = handlers || [];
-	        this.requestOptions = requestOptions;
-	        if (requestOptions) {
-	            if (requestOptions.ignoreSslError != null) {
-	                this._ignoreSslError = requestOptions.ignoreSslError;
-	            }
-	            this._socketTimeout = requestOptions.socketTimeout;
-	            if (requestOptions.allowRedirects != null) {
-	                this._allowRedirects = requestOptions.allowRedirects;
-	            }
-	            if (requestOptions.allowRedirectDowngrade != null) {
-	                this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;
-	            }
-	            if (requestOptions.maxRedirects != null) {
-	                this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);
-	            }
-	            if (requestOptions.keepAlive != null) {
-	                this._keepAlive = requestOptions.keepAlive;
-	            }
-	            if (requestOptions.allowRetries != null) {
-	                this._allowRetries = requestOptions.allowRetries;
-	            }
-	            if (requestOptions.maxRetries != null) {
-	                this._maxRetries = requestOptions.maxRetries;
-	            }
-	        }
-	    }
-	    options(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    get(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('GET', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    del(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('DELETE', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    post(requestUrl, data, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('POST', requestUrl, data, additionalHeaders || {});
-	        });
-	    }
-	    patch(requestUrl, data, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('PATCH', requestUrl, data, additionalHeaders || {});
-	        });
-	    }
-	    put(requestUrl, data, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('PUT', requestUrl, data, additionalHeaders || {});
-	        });
-	    }
-	    head(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('HEAD', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    sendStream(verb, requestUrl, stream, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request(verb, requestUrl, stream, additionalHeaders);
-	        });
-	    }
-	    /**
-	     * Gets a typed object from an endpoint
-	     * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise
-	     */
-	    getJson(requestUrl, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            const res = yield this.get(requestUrl, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
-	    }
-	    postJson(requestUrl, obj, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const data = JSON.stringify(obj, null, 2);
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
-	            const res = yield this.post(requestUrl, data, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
-	    }
-	    putJson(requestUrl, obj, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const data = JSON.stringify(obj, null, 2);
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
-	            const res = yield this.put(requestUrl, data, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
-	    }
-	    patchJson(requestUrl, obj, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const data = JSON.stringify(obj, null, 2);
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
-	            const res = yield this.patch(requestUrl, data, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
-	    }
-	    /**
-	     * Makes a raw http request.
-	     * All other methods such as get, post, patch, and request ultimately call this.
-	     * Prefer get, del, post and patch
-	     */
-	    request(verb, requestUrl, data, headers) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            if (this._disposed) {
-	                throw new Error('Client has already been disposed.');
-	            }
-	            const parsedUrl = new URL(requestUrl);
-	            let info = this._prepareRequest(verb, parsedUrl, headers);
-	            // Only perform retries on reads since writes may not be idempotent.
-	            const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)
-	                ? this._maxRetries + 1
-	                : 1;
-	            let numTries = 0;
-	            let response;
-	            do {
-	                response = yield this.requestRaw(info, data);
-	                // Check if it's an authentication challenge
-	                if (response &&
-	                    response.message &&
-	                    response.message.statusCode === HttpCodes.Unauthorized) {
-	                    let authenticationHandler;
-	                    for (const handler of this.handlers) {
-	                        if (handler.canHandleAuthentication(response)) {
-	                            authenticationHandler = handler;
-	                            break;
-	                        }
-	                    }
-	                    if (authenticationHandler) {
-	                        return authenticationHandler.handleAuthentication(this, info, data);
-	                    }
-	                    else {
-	                        // We have received an unauthorized response but have no handlers to handle it.
-	                        // Let the response return to the caller.
-	                        return response;
-	                    }
-	                }
-	                let redirectsRemaining = this._maxRedirects;
-	                while (response.message.statusCode &&
-	                    HttpRedirectCodes.includes(response.message.statusCode) &&
-	                    this._allowRedirects &&
-	                    redirectsRemaining > 0) {
-	                    const redirectUrl = response.message.headers['location'];
-	                    if (!redirectUrl) {
-	                        // if there's no location to redirect to, we won't
-	                        break;
-	                    }
-	                    const parsedRedirectUrl = new URL(redirectUrl);
-	                    if (parsedUrl.protocol === 'https:' &&
-	                        parsedUrl.protocol !== parsedRedirectUrl.protocol &&
-	                        !this._allowRedirectDowngrade) {
-	                        throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');
-	                    }
-	                    // we need to finish reading the response before reassigning response
-	                    // which will leak the open socket.
-	                    yield response.readBody();
-	                    // strip authorization header if redirected to a different hostname
-	                    if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {
-	                        for (const header in headers) {
-	                            // header names are case insensitive
-	                            if (header.toLowerCase() === 'authorization') {
-	                                delete headers[header];
-	                            }
-	                        }
-	                    }
-	                    // let's make the request with the new redirectUrl
-	                    info = this._prepareRequest(verb, parsedRedirectUrl, headers);
-	                    response = yield this.requestRaw(info, data);
-	                    redirectsRemaining--;
-	                }
-	                if (!response.message.statusCode ||
-	                    !HttpResponseRetryCodes.includes(response.message.statusCode)) {
-	                    // If not a retry code, return immediately instead of retrying
-	                    return response;
-	                }
-	                numTries += 1;
-	                if (numTries < maxTries) {
-	                    yield response.readBody();
-	                    yield this._performExponentialBackoff(numTries);
-	                }
-	            } while (numTries < maxTries);
-	            return response;
-	        });
-	    }
-	    /**
-	     * Needs to be called if keepAlive is set to true in request options.
-	     */
-	    dispose() {
-	        if (this._agent) {
-	            this._agent.destroy();
-	        }
-	        this._disposed = true;
-	    }
-	    /**
-	     * Raw request.
-	     * @param info
-	     * @param data
-	     */
-	    requestRaw(info, data) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve, reject) => {
-	                function callbackForResult(err, res) {
-	                    if (err) {
-	                        reject(err);
-	                    }
-	                    else if (!res) {
-	                        // If `err` is not passed, then `res` must be passed.
-	                        reject(new Error('Unknown error'));
-	                    }
-	                    else {
-	                        resolve(res);
-	                    }
-	                }
-	                this.requestRawWithCallback(info, data, callbackForResult);
-	            });
-	        });
-	    }
-	    /**
-	     * Raw request with callback.
-	     * @param info
-	     * @param data
-	     * @param onResult
-	     */
-	    requestRawWithCallback(info, data, onResult) {
-	        if (typeof data === 'string') {
-	            if (!info.options.headers) {
-	                info.options.headers = {};
-	            }
-	            info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
-	        }
-	        let callbackCalled = false;
-	        function handleResult(err, res) {
-	            if (!callbackCalled) {
-	                callbackCalled = true;
-	                onResult(err, res);
-	            }
-	        }
-	        const req = info.httpModule.request(info.options, (msg) => {
-	            const res = new HttpClientResponse(msg);
-	            handleResult(undefined, res);
-	        });
-	        let socket;
-	        req.on('socket', sock => {
-	            socket = sock;
-	        });
-	        // If we ever get disconnected, we want the socket to timeout eventually
-	        req.setTimeout(this._socketTimeout || 3 * 60000, () => {
-	            if (socket) {
-	                socket.end();
-	            }
-	            handleResult(new Error(`Request timeout: ${info.options.path}`));
-	        });
-	        req.on('error', function (err) {
-	            // err has statusCode property
-	            // res should have headers
-	            handleResult(err);
-	        });
-	        if (data && typeof data === 'string') {
-	            req.write(data, 'utf8');
-	        }
-	        if (data && typeof data !== 'string') {
-	            data.on('close', function () {
-	                req.end();
-	            });
-	            data.pipe(req);
-	        }
-	        else {
-	            req.end();
-	        }
-	    }
-	    /**
-	     * Gets an http agent. This function is useful when you need an http agent that handles
-	     * routing through a proxy server - depending upon the url and proxy environment variables.
-	     * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
-	     */
-	    getAgent(serverUrl) {
-	        const parsedUrl = new URL(serverUrl);
-	        return this._getAgent(parsedUrl);
-	    }
-	    getAgentDispatcher(serverUrl) {
-	        const parsedUrl = new URL(serverUrl);
-	        const proxyUrl = pm.getProxyUrl(parsedUrl);
-	        const useProxy = proxyUrl && proxyUrl.hostname;
-	        if (!useProxy) {
-	            return;
-	        }
-	        return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);
-	    }
-	    _prepareRequest(method, requestUrl, headers) {
-	        const info = {};
-	        info.parsedUrl = requestUrl;
-	        const usingSsl = info.parsedUrl.protocol === 'https:';
-	        info.httpModule = usingSsl ? https : http;
-	        const defaultPort = usingSsl ? 443 : 80;
-	        info.options = {};
-	        info.options.host = info.parsedUrl.hostname;
-	        info.options.port = info.parsedUrl.port
-	            ? parseInt(info.parsedUrl.port)
-	            : defaultPort;
-	        info.options.path =
-	            (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
-	        info.options.method = method;
-	        info.options.headers = this._mergeHeaders(headers);
-	        if (this.userAgent != null) {
-	            info.options.headers['user-agent'] = this.userAgent;
-	        }
-	        info.options.agent = this._getAgent(info.parsedUrl);
-	        // gives handlers an opportunity to participate
-	        if (this.handlers) {
-	            for (const handler of this.handlers) {
-	                handler.prepareRequest(info.options);
-	            }
-	        }
-	        return info;
-	    }
-	    _mergeHeaders(headers) {
-	        if (this.requestOptions && this.requestOptions.headers) {
-	            return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));
-	        }
-	        return lowercaseKeys(headers || {});
-	    }
-	    _getExistingOrDefaultHeader(additionalHeaders, header, _default) {
-	        let clientHeader;
-	        if (this.requestOptions && this.requestOptions.headers) {
-	            clientHeader = lowercaseKeys(this.requestOptions.headers)[header];
-	        }
-	        return additionalHeaders[header] || clientHeader || _default;
-	    }
-	    _getAgent(parsedUrl) {
-	        let agent;
-	        const proxyUrl = pm.getProxyUrl(parsedUrl);
-	        const useProxy = proxyUrl && proxyUrl.hostname;
-	        if (this._keepAlive && useProxy) {
-	            agent = this._proxyAgent;
-	        }
-	        if (!useProxy) {
-	            agent = this._agent;
-	        }
-	        // if agent is already assigned use that agent.
-	        if (agent) {
-	            return agent;
-	        }
-	        const usingSsl = parsedUrl.protocol === 'https:';
-	        let maxSockets = 100;
-	        if (this.requestOptions) {
-	            maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;
-	        }
-	        // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.
-	        if (proxyUrl && proxyUrl.hostname) {
-	            const agentOptions = {
-	                maxSockets,
-	                keepAlive: this._keepAlive,
-	                proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {
-	                    proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`
-	                })), { host: proxyUrl.hostname, port: proxyUrl.port })
-	            };
-	            let tunnelAgent;
-	            const overHttps = proxyUrl.protocol === 'https:';
-	            if (usingSsl) {
-	                tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;
-	            }
-	            else {
-	                tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;
-	            }
-	            agent = tunnelAgent(agentOptions);
-	            this._proxyAgent = agent;
-	        }
-	        // if tunneling agent isn't assigned create a new agent
-	        if (!agent) {
-	            const options = { keepAlive: this._keepAlive, maxSockets };
-	            agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
-	            this._agent = agent;
-	        }
-	        if (usingSsl && this._ignoreSslError) {
-	            // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
-	            // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
-	            // we have to cast it to any and change it directly
-	            agent.options = Object.assign(agent.options || {}, {
-	                rejectUnauthorized: false
-	            });
-	        }
-	        return agent;
-	    }
-	    _getProxyAgentDispatcher(parsedUrl, proxyUrl) {
-	        let proxyAgent;
-	        if (this._keepAlive) {
-	            proxyAgent = this._proxyAgentDispatcher;
-	        }
-	        // if agent is already assigned use that agent.
-	        if (proxyAgent) {
-	            return proxyAgent;
-	        }
-	        const usingSsl = parsedUrl.protocol === 'https:';
-	        proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {
-	            token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}`
-	        })));
-	        this._proxyAgentDispatcher = proxyAgent;
-	        if (usingSsl && this._ignoreSslError) {
-	            // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
-	            // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
-	            // we have to cast it to any and change it directly
-	            proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {
-	                rejectUnauthorized: false
-	            });
-	        }
-	        return proxyAgent;
-	    }
-	    _performExponentialBackoff(retryNumber) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);
-	            const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);
-	            return new Promise(resolve => setTimeout(() => resolve(), ms));
-	        });
-	    }
-	    _processResponse(res, options) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
-	                const statusCode = res.message.statusCode || 0;
-	                const response = {
-	                    statusCode,
-	                    result: null,
-	                    headers: {}
-	                };
-	                // not found leads to null obj returned
-	                if (statusCode === HttpCodes.NotFound) {
-	                    resolve(response);
-	                }
-	                // get the result from the body
-	                function dateTimeDeserializer(key, value) {
-	                    if (typeof value === 'string') {
-	                        const a = new Date(value);
-	                        if (!isNaN(a.valueOf())) {
-	                            return a;
-	                        }
-	                    }
-	                    return value;
-	                }
-	                let obj;
-	                let contents;
-	                try {
-	                    contents = yield res.readBody();
-	                    if (contents && contents.length > 0) {
-	                        if (options && options.deserializeDates) {
-	                            obj = JSON.parse(contents, dateTimeDeserializer);
-	                        }
-	                        else {
-	                            obj = JSON.parse(contents);
-	                        }
-	                        response.result = obj;
-	                    }
-	                    response.headers = res.message.headers;
-	                }
-	                catch (err) {
-	                    // Invalid resource (contents not json);  leaving result obj null
-	                }
-	                // note that 3xx redirects are handled by the http layer.
-	                if (statusCode > 299) {
-	                    let msg;
-	                    // if exception/error in body, attempt to get better error
-	                    if (obj && obj.message) {
-	                        msg = obj.message;
-	                    }
-	                    else if (contents && contents.length > 0) {
-	                        // it may be the case that the exception is in the body message as string
-	                        msg = contents;
-	                    }
-	                    else {
-	                        msg = `Failed request: (${statusCode})`;
-	                    }
-	                    const err = new HttpClientError(msg, statusCode);
-	                    err.result = response.result;
-	                    reject(err);
-	                }
-	                else {
-	                    resolve(response);
-	                }
-	            }));
-	        });
-	    }
-	}
-	lib$1.HttpClient = HttpClient;
-	const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
-	
-	return lib$1;
-}
-
-var hasRequiredUtils$2;
-
-function requireUtils$2 () {
-	if (hasRequiredUtils$2) return utils$1;
-	hasRequiredUtils$2 = 1;
-	var __createBinding = (utils$1 && utils$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (utils$1 && utils$1.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (utils$1 && utils$1.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (utils$1 && utils$1.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(utils$1, "__esModule", { value: true });
-	utils$1.getApiBaseUrl = utils$1.getProxyFetch = utils$1.getProxyAgentDispatcher = utils$1.getProxyAgent = utils$1.getAuthString = void 0;
-	const httpClient = __importStar(requireLib$1());
-	const undici_1 = requireUndici();
-	function getAuthString(token, options) {
-	    if (!token && !options.auth) {
-	        throw new Error('Parameter token or opts.auth is required');
-	    }
-	    else if (token && options.auth) {
-	        throw new Error('Parameters token and opts.auth may not both be specified');
-	    }
-	    return typeof options.auth === 'string' ? options.auth : `token ${token}`;
-	}
-	utils$1.getAuthString = getAuthString;
-	function getProxyAgent(destinationUrl) {
-	    const hc = new httpClient.HttpClient();
-	    return hc.getAgent(destinationUrl);
-	}
-	utils$1.getProxyAgent = getProxyAgent;
-	function getProxyAgentDispatcher(destinationUrl) {
-	    const hc = new httpClient.HttpClient();
-	    return hc.getAgentDispatcher(destinationUrl);
-	}
-	utils$1.getProxyAgentDispatcher = getProxyAgentDispatcher;
-	function getProxyFetch(destinationUrl) {
-	    const httpDispatcher = getProxyAgentDispatcher(destinationUrl);
-	    const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () {
-	        return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher }));
-	    });
-	    return proxyFetch;
-	}
-	utils$1.getProxyFetch = getProxyFetch;
-	function getApiBaseUrl() {
-	    return process.env['GITHUB_API_URL'] || 'https://api.github.com';
-	}
-	utils$1.getApiBaseUrl = getApiBaseUrl;
-	
-	return utils$1;
-}
-
-function getUserAgent() {
-    if (typeof navigator === "object" && "userAgent" in navigator) {
-        return navigator.userAgent;
-    }
-    if (typeof process === "object" && process.version !== undefined) {
-        return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`;
-    }
-    return "";
-}
-
-var beforeAfterHook = {exports: {}};
-
-var register_1;
-var hasRequiredRegister;
-
-function requireRegister () {
-	if (hasRequiredRegister) return register_1;
-	hasRequiredRegister = 1;
-	register_1 = register;
-
-	function register(state, name, method, options) {
-	  if (typeof method !== "function") {
-	    throw new Error("method for before hook must be a function");
-	  }
-
-	  if (!options) {
-	    options = {};
-	  }
-
-	  if (Array.isArray(name)) {
-	    return name.reverse().reduce(function (callback, name) {
-	      return register.bind(null, state, name, callback, options);
-	    }, method)();
-	  }
-
-	  return Promise.resolve().then(function () {
-	    if (!state.registry[name]) {
-	      return method(options);
-	    }
-
-	    return state.registry[name].reduce(function (method, registered) {
-	      return registered.hook.bind(null, method, options);
-	    }, method)();
-	  });
-	}
-	return register_1;
-}
-
-var add;
-var hasRequiredAdd;
-
-function requireAdd () {
-	if (hasRequiredAdd) return add;
-	hasRequiredAdd = 1;
-	add = addHook;
-
-	function addHook(state, kind, name, hook) {
-	  var orig = hook;
-	  if (!state.registry[name]) {
-	    state.registry[name] = [];
-	  }
-
-	  if (kind === "before") {
-	    hook = function (method, options) {
-	      return Promise.resolve()
-	        .then(orig.bind(null, options))
-	        .then(method.bind(null, options));
-	    };
-	  }
-
-	  if (kind === "after") {
-	    hook = function (method, options) {
-	      var result;
-	      return Promise.resolve()
-	        .then(method.bind(null, options))
-	        .then(function (result_) {
-	          result = result_;
-	          return orig(result, options);
-	        })
-	        .then(function () {
-	          return result;
-	        });
-	    };
-	  }
-
-	  if (kind === "error") {
-	    hook = function (method, options) {
-	      return Promise.resolve()
-	        .then(method.bind(null, options))
-	        .catch(function (error) {
-	          return orig(error, options);
-	        });
-	    };
-	  }
-
-	  state.registry[name].push({
-	    hook: hook,
-	    orig: orig,
-	  });
-	}
-	return add;
-}
-
-var remove;
-var hasRequiredRemove;
-
-function requireRemove () {
-	if (hasRequiredRemove) return remove;
-	hasRequiredRemove = 1;
-	remove = removeHook;
-
-	function removeHook(state, name, method) {
-	  if (!state.registry[name]) {
-	    return;
-	  }
-
-	  var index = state.registry[name]
-	    .map(function (registered) {
-	      return registered.orig;
-	    })
-	    .indexOf(method);
-
-	  if (index === -1) {
-	    return;
-	  }
-
-	  state.registry[name].splice(index, 1);
-	}
-	return remove;
-}
-
-var hasRequiredBeforeAfterHook;
-
-function requireBeforeAfterHook () {
-	if (hasRequiredBeforeAfterHook) return beforeAfterHook.exports;
-	hasRequiredBeforeAfterHook = 1;
-	var register = requireRegister();
-	var addHook = requireAdd();
-	var removeHook = requireRemove();
-
-	// bind with array of arguments: https://stackoverflow.com/a/21792913
-	var bind = Function.bind;
-	var bindable = bind.bind(bind);
-
-	function bindApi(hook, state, name) {
-	  var removeHookRef = bindable(removeHook, null).apply(
-	    null,
-	    name ? [state, name] : [state]
-	  );
-	  hook.api = { remove: removeHookRef };
-	  hook.remove = removeHookRef;
-	  ["before", "error", "after", "wrap"].forEach(function (kind) {
-	    var args = name ? [state, kind, name] : [state, kind];
-	    hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);
-	  });
-	}
-
-	function HookSingular() {
-	  var singularHookName = "h";
-	  var singularHookState = {
-	    registry: {},
-	  };
-	  var singularHook = register.bind(null, singularHookState, singularHookName);
-	  bindApi(singularHook, singularHookState, singularHookName);
-	  return singularHook;
-	}
-
-	function HookCollection() {
-	  var state = {
-	    registry: {},
-	  };
-
-	  var hook = register.bind(null, state);
-	  bindApi(hook, state);
-
-	  return hook;
-	}
-
-	var collectionHookDeprecationMessageDisplayed = false;
-	function Hook() {
-	  if (!collectionHookDeprecationMessageDisplayed) {
-	    console.warn(
-	      '[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4'
-	    );
-	    collectionHookDeprecationMessageDisplayed = true;
-	  }
-	  return HookCollection();
-	}
-
-	Hook.Singular = HookSingular.bind();
-	Hook.Collection = HookCollection.bind();
-
-	beforeAfterHook.exports = Hook;
-	// expose constructors as a named property for TypeScript
-	beforeAfterHook.exports.Hook = Hook;
-	beforeAfterHook.exports.Singular = Hook.Singular;
-	beforeAfterHook.exports.Collection = Hook.Collection;
-	return beforeAfterHook.exports;
-}
-
-var beforeAfterHookExports = requireBeforeAfterHook();
-
-const VERSION$5 = "9.0.6";
-
-const userAgent = `octokit-endpoint.js/${VERSION$5} ${getUserAgent()}`;
-const DEFAULTS = {
-  method: "GET",
-  baseUrl: "https://api.github.com",
-  headers: {
-    accept: "application/vnd.github.v3+json",
-    "user-agent": userAgent
-  },
-  mediaType: {
-    format: ""
-  }
-};
-
-function lowercaseKeys(object) {
-  if (!object) {
-    return {};
-  }
-  return Object.keys(object).reduce((newObj, key) => {
-    newObj[key.toLowerCase()] = object[key];
-    return newObj;
-  }, {});
-}
-
-function isPlainObject$1(value) {
-  if (typeof value !== "object" || value === null)
-    return false;
-  if (Object.prototype.toString.call(value) !== "[object Object]")
-    return false;
-  const proto = Object.getPrototypeOf(value);
-  if (proto === null)
-    return true;
-  const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;
-  return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);
-}
-
-function mergeDeep(defaults, options) {
-  const result = Object.assign({}, defaults);
-  Object.keys(options).forEach((key) => {
-    if (isPlainObject$1(options[key])) {
-      if (!(key in defaults))
-        Object.assign(result, { [key]: options[key] });
-      else
-        result[key] = mergeDeep(defaults[key], options[key]);
-    } else {
-      Object.assign(result, { [key]: options[key] });
-    }
-  });
-  return result;
-}
-
-function removeUndefinedProperties(obj) {
-  for (const key in obj) {
-    if (obj[key] === void 0) {
-      delete obj[key];
-    }
-  }
-  return obj;
-}
-
-function merge(defaults, route, options) {
-  if (typeof route === "string") {
-    let [method, url] = route.split(" ");
-    options = Object.assign(url ? { method, url } : { url: method }, options);
-  } else {
-    options = Object.assign({}, route);
-  }
-  options.headers = lowercaseKeys(options.headers);
-  removeUndefinedProperties(options);
-  removeUndefinedProperties(options.headers);
-  const mergedOptions = mergeDeep(defaults || {}, options);
-  if (options.url === "/graphql") {
-    if (defaults && defaults.mediaType.previews?.length) {
-      mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(
-        (preview) => !mergedOptions.mediaType.previews.includes(preview)
-      ).concat(mergedOptions.mediaType.previews);
-    }
-    mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, ""));
-  }
-  return mergedOptions;
-}
-
-function addQueryParameters(url, parameters) {
-  const separator = /\?/.test(url) ? "&" : "?";
-  const names = Object.keys(parameters);
-  if (names.length === 0) {
-    return url;
-  }
-  return url + separator + names.map((name) => {
-    if (name === "q") {
-      return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");
-    }
-    return `${name}=${encodeURIComponent(parameters[name])}`;
-  }).join("&");
-}
-
-const urlVariableRegex = /\{[^{}}]+\}/g;
-function removeNonChars(variableName) {
-  return variableName.replace(/(?:^\W+)|(?:(? a.concat(b), []);
-}
-
-function omit(object, keysToOmit) {
-  const result = { __proto__: null };
-  for (const key of Object.keys(object)) {
-    if (keysToOmit.indexOf(key) === -1) {
-      result[key] = object[key];
-    }
-  }
-  return result;
-}
-
-function encodeReserved(str) {
-  return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {
-    if (!/%[0-9A-Fa-f]/.test(part)) {
-      part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
-    }
-    return part;
-  }).join("");
-}
-function encodeUnreserved(str) {
-  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
-    return "%" + c.charCodeAt(0).toString(16).toUpperCase();
-  });
-}
-function encodeValue(operator, value, key) {
-  value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
-  if (key) {
-    return encodeUnreserved(key) + "=" + value;
-  } else {
-    return value;
-  }
-}
-function isDefined(value) {
-  return value !== void 0 && value !== null;
-}
-function isKeyOperator(operator) {
-  return operator === ";" || operator === "&" || operator === "?";
-}
-function getValues(context, operator, key, modifier) {
-  var value = context[key], result = [];
-  if (isDefined(value) && value !== "") {
-    if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
-      value = value.toString();
-      if (modifier && modifier !== "*") {
-        value = value.substring(0, parseInt(modifier, 10));
-      }
-      result.push(
-        encodeValue(operator, value, isKeyOperator(operator) ? key : "")
-      );
-    } else {
-      if (modifier === "*") {
-        if (Array.isArray(value)) {
-          value.filter(isDefined).forEach(function(value2) {
-            result.push(
-              encodeValue(operator, value2, isKeyOperator(operator) ? key : "")
-            );
-          });
-        } else {
-          Object.keys(value).forEach(function(k) {
-            if (isDefined(value[k])) {
-              result.push(encodeValue(operator, value[k], k));
-            }
-          });
-        }
-      } else {
-        const tmp = [];
-        if (Array.isArray(value)) {
-          value.filter(isDefined).forEach(function(value2) {
-            tmp.push(encodeValue(operator, value2));
-          });
-        } else {
-          Object.keys(value).forEach(function(k) {
-            if (isDefined(value[k])) {
-              tmp.push(encodeUnreserved(k));
-              tmp.push(encodeValue(operator, value[k].toString()));
-            }
-          });
-        }
-        if (isKeyOperator(operator)) {
-          result.push(encodeUnreserved(key) + "=" + tmp.join(","));
-        } else if (tmp.length !== 0) {
-          result.push(tmp.join(","));
-        }
-      }
-    }
-  } else {
-    if (operator === ";") {
-      if (isDefined(value)) {
-        result.push(encodeUnreserved(key));
-      }
-    } else if (value === "" && (operator === "&" || operator === "?")) {
-      result.push(encodeUnreserved(key) + "=");
-    } else if (value === "") {
-      result.push("");
-    }
-  }
-  return result;
-}
-function parseUrl(template) {
-  return {
-    expand: expand.bind(null, template)
-  };
-}
-function expand(template, context) {
-  var operators = ["+", "#", ".", "/", ";", "?", "&"];
-  template = template.replace(
-    /\{([^\{\}]+)\}|([^\{\}]+)/g,
-    function(_, expression, literal) {
-      if (expression) {
-        let operator = "";
-        const values = [];
-        if (operators.indexOf(expression.charAt(0)) !== -1) {
-          operator = expression.charAt(0);
-          expression = expression.substr(1);
-        }
-        expression.split(/,/g).forEach(function(variable) {
-          var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
-          values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
-        });
-        if (operator && operator !== "+") {
-          var separator = ",";
-          if (operator === "?") {
-            separator = "&";
-          } else if (operator !== "#") {
-            separator = operator;
-          }
-          return (values.length !== 0 ? operator : "") + values.join(separator);
-        } else {
-          return values.join(",");
-        }
-      } else {
-        return encodeReserved(literal);
-      }
-    }
-  );
-  if (template === "/") {
-    return template;
-  } else {
-    return template.replace(/\/$/, "");
-  }
-}
-
-function parse(options) {
-  let method = options.method.toUpperCase();
-  let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}");
-  let headers = Object.assign({}, options.headers);
-  let body;
-  let parameters = omit(options, [
-    "method",
-    "baseUrl",
-    "url",
-    "headers",
-    "request",
-    "mediaType"
-  ]);
-  const urlVariableNames = extractUrlVariableNames(url);
-  url = parseUrl(url).expand(parameters);
-  if (!/^http/.test(url)) {
-    url = options.baseUrl + url;
-  }
-  const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl");
-  const remainingParameters = omit(parameters, omittedParameters);
-  const isBinaryRequest = /application\/octet-stream/i.test(headers.accept);
-  if (!isBinaryRequest) {
-    if (options.mediaType.format) {
-      headers.accept = headers.accept.split(/,/).map(
-        (format) => format.replace(
-          /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/,
-          `application/vnd$1$2.${options.mediaType.format}`
-        )
-      ).join(",");
-    }
-    if (url.endsWith("/graphql")) {
-      if (options.mediaType.previews?.length) {
-        const previewsFromAcceptHeader = headers.accept.match(/(? {
-          const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";
-          return `application/vnd.github.${preview}-preview${format}`;
-        }).join(",");
-      }
-    }
-  }
-  if (["GET", "HEAD"].includes(method)) {
-    url = addQueryParameters(url, remainingParameters);
-  } else {
-    if ("data" in remainingParameters) {
-      body = remainingParameters.data;
-    } else {
-      if (Object.keys(remainingParameters).length) {
-        body = remainingParameters;
-      }
-    }
-  }
-  if (!headers["content-type"] && typeof body !== "undefined") {
-    headers["content-type"] = "application/json; charset=utf-8";
-  }
-  if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
-    body = "";
-  }
-  return Object.assign(
-    { method, url, headers },
-    typeof body !== "undefined" ? { body } : null,
-    options.request ? { request: options.request } : null
-  );
-}
-
-function endpointWithDefaults(defaults, route, options) {
-  return parse(merge(defaults, route, options));
-}
-
-function withDefaults$2(oldDefaults, newDefaults) {
-  const DEFAULTS = merge(oldDefaults, newDefaults);
-  const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
-  return Object.assign(endpoint, {
-    DEFAULTS,
-    defaults: withDefaults$2.bind(null, DEFAULTS),
-    merge: merge.bind(null, DEFAULTS),
-    parse
-  });
-}
-
-const endpoint = withDefaults$2(null, DEFAULTS);
-
-const VERSION$4 = "8.4.1";
-
-function isPlainObject(value) {
-  if (typeof value !== "object" || value === null)
-    return false;
-  if (Object.prototype.toString.call(value) !== "[object Object]")
-    return false;
-  const proto = Object.getPrototypeOf(value);
-  if (proto === null)
-    return true;
-  const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;
-  return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);
-}
-
-class Deprecation extends Error {
-  constructor(message) {
-    super(message); // Maintains proper stack trace (only available on V8)
-
-    /* istanbul ignore next */
-
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(this, this.constructor);
-    }
-
-    this.name = 'Deprecation';
-  }
-
-}
-
-var once$1 = {exports: {}};
-
-var wrappy_1;
-var hasRequiredWrappy;
-
-function requireWrappy () {
-	if (hasRequiredWrappy) return wrappy_1;
-	hasRequiredWrappy = 1;
-	// Returns a wrapper function that returns a wrapped callback
-	// The wrapper function should do some stuff, and return a
-	// presumably different callback function.
-	// This makes sure that own properties are retained, so that
-	// decorations and such are not lost along the way.
-	wrappy_1 = wrappy;
-	function wrappy (fn, cb) {
-	  if (fn && cb) return wrappy(fn)(cb)
-
-	  if (typeof fn !== 'function')
-	    throw new TypeError('need wrapper function')
-
-	  Object.keys(fn).forEach(function (k) {
-	    wrapper[k] = fn[k];
-	  });
-
-	  return wrapper
-
-	  function wrapper() {
-	    var args = new Array(arguments.length);
-	    for (var i = 0; i < args.length; i++) {
-	      args[i] = arguments[i];
-	    }
-	    var ret = fn.apply(this, args);
-	    var cb = args[args.length-1];
-	    if (typeof ret === 'function' && ret !== cb) {
-	      Object.keys(cb).forEach(function (k) {
-	        ret[k] = cb[k];
-	      });
-	    }
-	    return ret
-	  }
-	}
-	return wrappy_1;
-}
-
-var hasRequiredOnce;
-
-function requireOnce () {
-	if (hasRequiredOnce) return once$1.exports;
-	hasRequiredOnce = 1;
-	var wrappy = requireWrappy();
-	once$1.exports = wrappy(once);
-	once$1.exports.strict = wrappy(onceStrict);
-
-	once.proto = once(function () {
-	  Object.defineProperty(Function.prototype, 'once', {
-	    value: function () {
-	      return once(this)
-	    },
-	    configurable: true
-	  });
-
-	  Object.defineProperty(Function.prototype, 'onceStrict', {
-	    value: function () {
-	      return onceStrict(this)
-	    },
-	    configurable: true
-	  });
-	});
-
-	function once (fn) {
-	  var f = function () {
-	    if (f.called) return f.value
-	    f.called = true;
-	    return f.value = fn.apply(this, arguments)
-	  };
-	  f.called = false;
-	  return f
-	}
-
-	function onceStrict (fn) {
-	  var f = function () {
-	    if (f.called)
-	      throw new Error(f.onceError)
-	    f.called = true;
-	    return f.value = fn.apply(this, arguments)
-	  };
-	  var name = fn.name || 'Function wrapped with `once`';
-	  f.onceError = name + " shouldn't be called more than once";
-	  f.called = false;
-	  return f
-	}
-	return once$1.exports;
-}
-
-var onceExports = requireOnce();
-var once = /*@__PURE__*/getDefaultExportFromCjs(onceExports);
-
-const logOnceCode = once((deprecation) => console.warn(deprecation));
-const logOnceHeaders = once((deprecation) => console.warn(deprecation));
-class RequestError extends Error {
-  constructor(message, statusCode, options) {
-    super(message);
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(this, this.constructor);
-    }
-    this.name = "HttpError";
-    this.status = statusCode;
-    let headers;
-    if ("headers" in options && typeof options.headers !== "undefined") {
-      headers = options.headers;
-    }
-    if ("response" in options) {
-      this.response = options.response;
-      headers = options.response.headers;
-    }
-    const requestCopy = Object.assign({}, options.request);
-    if (options.request.headers.authorization) {
-      requestCopy.headers = Object.assign({}, options.request.headers, {
-        authorization: options.request.headers.authorization.replace(
-          /(? {
-    url = response.url;
-    status = response.status;
-    for (const keyAndValue of response.headers) {
-      headers[keyAndValue[0]] = keyAndValue[1];
-    }
-    if ("deprecation" in headers) {
-      const matches = headers.link && headers.link.match(/<([^<>]+)>; rel="deprecation"/);
-      const deprecationLink = matches && matches.pop();
-      log.warn(
-        `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`
-      );
-    }
-    if (status === 204 || status === 205) {
-      return;
-    }
-    if (requestOptions.method === "HEAD") {
-      if (status < 400) {
-        return;
-      }
-      throw new RequestError(response.statusText, status, {
-        response: {
-          url,
-          status,
-          headers,
-          data: void 0
-        },
-        request: requestOptions
-      });
-    }
-    if (status === 304) {
-      throw new RequestError("Not modified", status, {
-        response: {
-          url,
-          status,
-          headers,
-          data: await getResponseData(response)
-        },
-        request: requestOptions
-      });
-    }
-    if (status >= 400) {
-      const data = await getResponseData(response);
-      const error = new RequestError(toErrorMessage(data), status, {
-        response: {
-          url,
-          status,
-          headers,
-          data
-        },
-        request: requestOptions
-      });
-      throw error;
-    }
-    return parseSuccessResponseBody ? await getResponseData(response) : response.body;
-  }).then((data) => {
-    return {
-      status,
-      url,
-      headers,
-      data
-    };
-  }).catch((error) => {
-    if (error instanceof RequestError)
-      throw error;
-    else if (error.name === "AbortError")
-      throw error;
-    let message = error.message;
-    if (error.name === "TypeError" && "cause" in error) {
-      if (error.cause instanceof Error) {
-        message = error.cause.message;
-      } else if (typeof error.cause === "string") {
-        message = error.cause;
-      }
-    }
-    throw new RequestError(message, 500, {
-      request: requestOptions
-    });
-  });
-}
-async function getResponseData(response) {
-  const contentType = response.headers.get("content-type");
-  if (/application\/json/.test(contentType)) {
-    return response.json().catch(() => response.text()).catch(() => "");
-  }
-  if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) {
-    return response.text();
-  }
-  return getBufferResponse(response);
-}
-function toErrorMessage(data) {
-  if (typeof data === "string")
-    return data;
-  let suffix;
-  if ("documentation_url" in data) {
-    suffix = ` - ${data.documentation_url}`;
-  } else {
-    suffix = "";
-  }
-  if ("message" in data) {
-    if (Array.isArray(data.errors)) {
-      return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`;
-    }
-    return `${data.message}${suffix}`;
-  }
-  return `Unknown error: ${JSON.stringify(data)}`;
-}
-
-function withDefaults$1(oldEndpoint, newDefaults) {
-  const endpoint = oldEndpoint.defaults(newDefaults);
-  const newApi = function(route, parameters) {
-    const endpointOptions = endpoint.merge(route, parameters);
-    if (!endpointOptions.request || !endpointOptions.request.hook) {
-      return fetchWrapper(endpoint.parse(endpointOptions));
-    }
-    const request = (route2, parameters2) => {
-      return fetchWrapper(
-        endpoint.parse(endpoint.merge(route2, parameters2))
-      );
-    };
-    Object.assign(request, {
-      endpoint,
-      defaults: withDefaults$1.bind(null, endpoint)
-    });
-    return endpointOptions.request.hook(request, endpointOptions);
-  };
-  return Object.assign(newApi, {
-    endpoint,
-    defaults: withDefaults$1.bind(null, endpoint)
-  });
-}
-
-const request = withDefaults$1(endpoint, {
-  headers: {
-    "user-agent": `octokit-request.js/${VERSION$4} ${getUserAgent()}`
-  }
-});
-
-// pkg/dist-src/index.js
-
-// pkg/dist-src/version.js
-var VERSION$3 = "7.1.1";
-
-// pkg/dist-src/error.js
-function _buildMessageForResponseErrors(data) {
-  return `Request failed due to following response errors:
-` + data.errors.map((e) => ` - ${e.message}`).join("\n");
-}
-var GraphqlResponseError = class extends Error {
-  constructor(request2, headers, response) {
-    super(_buildMessageForResponseErrors(response));
-    this.request = request2;
-    this.headers = headers;
-    this.response = response;
-    this.name = "GraphqlResponseError";
-    this.errors = response.errors;
-    this.data = response.data;
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(this, this.constructor);
-    }
-  }
-};
-
-// pkg/dist-src/graphql.js
-var NON_VARIABLE_OPTIONS = [
-  "method",
-  "baseUrl",
-  "url",
-  "headers",
-  "request",
-  "query",
-  "mediaType"
-];
-var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];
-var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/;
-function graphql(request2, query, options) {
-  if (options) {
-    if (typeof query === "string" && "query" in options) {
-      return Promise.reject(
-        new Error(`[@octokit/graphql] "query" cannot be used as variable name`)
-      );
-    }
-    for (const key in options) {
-      if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;
-      return Promise.reject(
-        new Error(
-          `[@octokit/graphql] "${key}" cannot be used as variable name`
-        )
-      );
-    }
-  }
-  const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;
-  const requestOptions = Object.keys(
-    parsedOptions
-  ).reduce((result, key) => {
-    if (NON_VARIABLE_OPTIONS.includes(key)) {
-      result[key] = parsedOptions[key];
-      return result;
-    }
-    if (!result.variables) {
-      result.variables = {};
-    }
-    result.variables[key] = parsedOptions[key];
-    return result;
-  }, {});
-  const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;
-  if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {
-    requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");
-  }
-  return request2(requestOptions).then((response) => {
-    if (response.data.errors) {
-      const headers = {};
-      for (const key of Object.keys(response.headers)) {
-        headers[key] = response.headers[key];
-      }
-      throw new GraphqlResponseError(
-        requestOptions,
-        headers,
-        response.data
-      );
-    }
-    return response.data.data;
-  });
-}
-
-// pkg/dist-src/with-defaults.js
-function withDefaults(request2, newDefaults) {
-  const newRequest = request2.defaults(newDefaults);
-  const newApi = (query, options) => {
-    return graphql(newRequest, query, options);
-  };
-  return Object.assign(newApi, {
-    defaults: withDefaults.bind(null, newRequest),
-    endpoint: newRequest.endpoint
-  });
-}
-
-// pkg/dist-src/index.js
-withDefaults(request, {
-  headers: {
-    "user-agent": `octokit-graphql.js/${VERSION$3} ${getUserAgent()}`
-  },
-  method: "POST",
-  url: "/graphql"
-});
-function withCustomRequest(customRequest) {
-  return withDefaults(customRequest, {
-    method: "POST",
-    url: "/graphql"
-  });
-}
-
-const REGEX_IS_INSTALLATION_LEGACY = /^v1\./;
-const REGEX_IS_INSTALLATION = /^ghs_/;
-const REGEX_IS_USER_TO_SERVER = /^ghu_/;
-async function auth$1(token) {
-  const isApp = token.split(/\./).length === 3;
-  const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token);
-  const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);
-  const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth";
-  return {
-    type: "token",
-    token,
-    tokenType
-  };
-}
-
-function withAuthorizationPrefix(token) {
-  if (token.split(/\./).length === 3) {
-    return `bearer ${token}`;
-  }
-  return `token ${token}`;
-}
-
-async function hook(token, request, route, parameters) {
-  const endpoint = request.endpoint.merge(
-    route,
-    parameters
-  );
-  endpoint.headers.authorization = withAuthorizationPrefix(token);
-  return request(endpoint);
-}
-
-const createTokenAuth = function createTokenAuth2(token) {
-  if (!token) {
-    throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");
-  }
-  if (typeof token !== "string") {
-    throw new Error(
-      "[@octokit/auth-token] Token passed to createTokenAuth is not a string"
-    );
-  }
-  token = token.replace(/^(token|bearer) +/i, "");
-  return Object.assign(auth$1.bind(null, token), {
-    hook: hook.bind(null, token)
-  });
-};
-
-// pkg/dist-src/index.js
-
-// pkg/dist-src/version.js
-var VERSION$2 = "5.2.0";
-
-// pkg/dist-src/index.js
-var noop = () => {
-};
-var consoleWarn = console.warn.bind(console);
-var consoleError = console.error.bind(console);
-var userAgentTrail = `octokit-core.js/${VERSION$2} ${getUserAgent()}`;
-var Octokit = class {
-  static {
-    this.VERSION = VERSION$2;
-  }
-  static defaults(defaults) {
-    const OctokitWithDefaults = class extends this {
-      constructor(...args) {
-        const options = args[0] || {};
-        if (typeof defaults === "function") {
-          super(defaults(options));
-          return;
-        }
-        super(
-          Object.assign(
-            {},
-            defaults,
-            options,
-            options.userAgent && defaults.userAgent ? {
-              userAgent: `${options.userAgent} ${defaults.userAgent}`
-            } : null
-          )
-        );
-      }
-    };
-    return OctokitWithDefaults;
-  }
-  static {
-    this.plugins = [];
-  }
-  /**
-   * Attach a plugin (or many) to your Octokit instance.
-   *
-   * @example
-   * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)
-   */
-  static plugin(...newPlugins) {
-    const currentPlugins = this.plugins;
-    const NewOctokit = class extends this {
-      static {
-        this.plugins = currentPlugins.concat(
-          newPlugins.filter((plugin) => !currentPlugins.includes(plugin))
-        );
-      }
-    };
-    return NewOctokit;
-  }
-  constructor(options = {}) {
-    const hook = new beforeAfterHookExports.Collection();
-    const requestDefaults = {
-      baseUrl: request.endpoint.DEFAULTS.baseUrl,
-      headers: {},
-      request: Object.assign({}, options.request, {
-        // @ts-ignore internal usage only, no need to type
-        hook: hook.bind(null, "request")
-      }),
-      mediaType: {
-        previews: [],
-        format: ""
-      }
-    };
-    requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;
-    if (options.baseUrl) {
-      requestDefaults.baseUrl = options.baseUrl;
-    }
-    if (options.previews) {
-      requestDefaults.mediaType.previews = options.previews;
-    }
-    if (options.timeZone) {
-      requestDefaults.headers["time-zone"] = options.timeZone;
-    }
-    this.request = request.defaults(requestDefaults);
-    this.graphql = withCustomRequest(this.request).defaults(requestDefaults);
-    this.log = Object.assign(
-      {
-        debug: noop,
-        info: noop,
-        warn: consoleWarn,
-        error: consoleError
-      },
-      options.log
-    );
-    this.hook = hook;
-    if (!options.authStrategy) {
-      if (!options.auth) {
-        this.auth = async () => ({
-          type: "unauthenticated"
-        });
-      } else {
-        const auth = createTokenAuth(options.auth);
-        hook.wrap("request", auth.hook);
-        this.auth = auth;
-      }
-    } else {
-      const { authStrategy, ...otherOptions } = options;
-      const auth = authStrategy(
-        Object.assign(
-          {
-            request: this.request,
-            log: this.log,
-            // we pass the current octokit instance as well as its constructor options
-            // to allow for authentication strategies that return a new octokit instance
-            // that shares the same internal state as the current one. The original
-            // requirement for this was the "event-octokit" authentication strategy
-            // of https://github.com/probot/octokit-auth-probot.
-            octokit: this,
-            octokitOptions: otherOptions
-          },
-          options.auth
-        )
-      );
-      hook.wrap("request", auth.hook);
-      this.auth = auth;
-    }
-    const classConstructor = this.constructor;
-    for (let i = 0; i < classConstructor.plugins.length; ++i) {
-      Object.assign(this, classConstructor.plugins[i](this, options));
-    }
-  }
-};
-
-var distWeb$1 = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	Octokit: Octokit
-});
-
-var require$$2 = /*@__PURE__*/getAugmentedNamespace(distWeb$1);
-
-const VERSION$1 = "10.4.1";
-
-const Endpoints = {
-  actions: {
-    addCustomLabelsToSelfHostedRunnerForOrg: [
-      "POST /orgs/{org}/actions/runners/{runner_id}/labels"
-    ],
-    addCustomLabelsToSelfHostedRunnerForRepo: [
-      "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
-    ],
-    addSelectedRepoToOrgSecret: [
-      "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    addSelectedRepoToOrgVariable: [
-      "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"
-    ],
-    approveWorkflowRun: [
-      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"
-    ],
-    cancelWorkflowRun: [
-      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"
-    ],
-    createEnvironmentVariable: [
-      "POST /repositories/{repository_id}/environments/{environment_name}/variables"
-    ],
-    createOrUpdateEnvironmentSecret: [
-      "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"
-    ],
-    createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"],
-    createOrUpdateRepoSecret: [
-      "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"
-    ],
-    createOrgVariable: ["POST /orgs/{org}/actions/variables"],
-    createRegistrationTokenForOrg: [
-      "POST /orgs/{org}/actions/runners/registration-token"
-    ],
-    createRegistrationTokenForRepo: [
-      "POST /repos/{owner}/{repo}/actions/runners/registration-token"
-    ],
-    createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"],
-    createRemoveTokenForRepo: [
-      "POST /repos/{owner}/{repo}/actions/runners/remove-token"
-    ],
-    createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"],
-    createWorkflowDispatch: [
-      "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"
-    ],
-    deleteActionsCacheById: [
-      "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"
-    ],
-    deleteActionsCacheByKey: [
-      "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"
-    ],
-    deleteArtifact: [
-      "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"
-    ],
-    deleteEnvironmentSecret: [
-      "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"
-    ],
-    deleteEnvironmentVariable: [
-      "DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}"
-    ],
-    deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],
-    deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"],
-    deleteRepoSecret: [
-      "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"
-    ],
-    deleteRepoVariable: [
-      "DELETE /repos/{owner}/{repo}/actions/variables/{name}"
-    ],
-    deleteSelfHostedRunnerFromOrg: [
-      "DELETE /orgs/{org}/actions/runners/{runner_id}"
-    ],
-    deleteSelfHostedRunnerFromRepo: [
-      "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"
-    ],
-    deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],
-    deleteWorkflowRunLogs: [
-      "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"
-    ],
-    disableSelectedRepositoryGithubActionsOrganization: [
-      "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"
-    ],
-    disableWorkflow: [
-      "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"
-    ],
-    downloadArtifact: [
-      "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"
-    ],
-    downloadJobLogsForWorkflowRun: [
-      "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"
-    ],
-    downloadWorkflowRunAttemptLogs: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"
-    ],
-    downloadWorkflowRunLogs: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"
-    ],
-    enableSelectedRepositoryGithubActionsOrganization: [
-      "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"
-    ],
-    enableWorkflow: [
-      "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"
-    ],
-    forceCancelWorkflowRun: [
-      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"
-    ],
-    generateRunnerJitconfigForOrg: [
-      "POST /orgs/{org}/actions/runners/generate-jitconfig"
-    ],
-    generateRunnerJitconfigForRepo: [
-      "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"
-    ],
-    getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],
-    getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],
-    getActionsCacheUsageByRepoForOrg: [
-      "GET /orgs/{org}/actions/cache/usage-by-repository"
-    ],
-    getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],
-    getAllowedActionsOrganization: [
-      "GET /orgs/{org}/actions/permissions/selected-actions"
-    ],
-    getAllowedActionsRepository: [
-      "GET /repos/{owner}/{repo}/actions/permissions/selected-actions"
-    ],
-    getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],
-    getCustomOidcSubClaimForRepo: [
-      "GET /repos/{owner}/{repo}/actions/oidc/customization/sub"
-    ],
-    getEnvironmentPublicKey: [
-      "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"
-    ],
-    getEnvironmentSecret: [
-      "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"
-    ],
-    getEnvironmentVariable: [
-      "GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}"
-    ],
-    getGithubActionsDefaultWorkflowPermissionsOrganization: [
-      "GET /orgs/{org}/actions/permissions/workflow"
-    ],
-    getGithubActionsDefaultWorkflowPermissionsRepository: [
-      "GET /repos/{owner}/{repo}/actions/permissions/workflow"
-    ],
-    getGithubActionsPermissionsOrganization: [
-      "GET /orgs/{org}/actions/permissions"
-    ],
-    getGithubActionsPermissionsRepository: [
-      "GET /repos/{owner}/{repo}/actions/permissions"
-    ],
-    getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],
-    getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],
-    getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],
-    getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"],
-    getPendingDeploymentsForRun: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"
-    ],
-    getRepoPermissions: [
-      "GET /repos/{owner}/{repo}/actions/permissions",
-      {},
-      { renamed: ["actions", "getGithubActionsPermissionsRepository"] }
-    ],
-    getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"],
-    getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],
-    getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"],
-    getReviewsForRun: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"
-    ],
-    getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"],
-    getSelfHostedRunnerForRepo: [
-      "GET /repos/{owner}/{repo}/actions/runners/{runner_id}"
-    ],
-    getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],
-    getWorkflowAccessToRepository: [
-      "GET /repos/{owner}/{repo}/actions/permissions/access"
-    ],
-    getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],
-    getWorkflowRunAttempt: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"
-    ],
-    getWorkflowRunUsage: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"
-    ],
-    getWorkflowUsage: [
-      "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"
-    ],
-    listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"],
-    listEnvironmentSecrets: [
-      "GET /repositories/{repository_id}/environments/{environment_name}/secrets"
-    ],
-    listEnvironmentVariables: [
-      "GET /repositories/{repository_id}/environments/{environment_name}/variables"
-    ],
-    listJobsForWorkflowRun: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"
-    ],
-    listJobsForWorkflowRunAttempt: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"
-    ],
-    listLabelsForSelfHostedRunnerForOrg: [
-      "GET /orgs/{org}/actions/runners/{runner_id}/labels"
-    ],
-    listLabelsForSelfHostedRunnerForRepo: [
-      "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
-    ],
-    listOrgSecrets: ["GET /orgs/{org}/actions/secrets"],
-    listOrgVariables: ["GET /orgs/{org}/actions/variables"],
-    listRepoOrganizationSecrets: [
-      "GET /repos/{owner}/{repo}/actions/organization-secrets"
-    ],
-    listRepoOrganizationVariables: [
-      "GET /repos/{owner}/{repo}/actions/organization-variables"
-    ],
-    listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"],
-    listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"],
-    listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"],
-    listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"],
-    listRunnerApplicationsForRepo: [
-      "GET /repos/{owner}/{repo}/actions/runners/downloads"
-    ],
-    listSelectedReposForOrgSecret: [
-      "GET /orgs/{org}/actions/secrets/{secret_name}/repositories"
-    ],
-    listSelectedReposForOrgVariable: [
-      "GET /orgs/{org}/actions/variables/{name}/repositories"
-    ],
-    listSelectedRepositoriesEnabledGithubActionsOrganization: [
-      "GET /orgs/{org}/actions/permissions/repositories"
-    ],
-    listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"],
-    listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"],
-    listWorkflowRunArtifacts: [
-      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"
-    ],
-    listWorkflowRuns: [
-      "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"
-    ],
-    listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"],
-    reRunJobForWorkflowRun: [
-      "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"
-    ],
-    reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],
-    reRunWorkflowFailedJobs: [
-      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"
-    ],
-    removeAllCustomLabelsFromSelfHostedRunnerForOrg: [
-      "DELETE /orgs/{org}/actions/runners/{runner_id}/labels"
-    ],
-    removeAllCustomLabelsFromSelfHostedRunnerForRepo: [
-      "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
-    ],
-    removeCustomLabelFromSelfHostedRunnerForOrg: [
-      "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"
-    ],
-    removeCustomLabelFromSelfHostedRunnerForRepo: [
-      "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"
-    ],
-    removeSelectedRepoFromOrgSecret: [
-      "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    removeSelectedRepoFromOrgVariable: [
-      "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"
-    ],
-    reviewCustomGatesForRun: [
-      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"
-    ],
-    reviewPendingDeploymentsForRun: [
-      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"
-    ],
-    setAllowedActionsOrganization: [
-      "PUT /orgs/{org}/actions/permissions/selected-actions"
-    ],
-    setAllowedActionsRepository: [
-      "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"
-    ],
-    setCustomLabelsForSelfHostedRunnerForOrg: [
-      "PUT /orgs/{org}/actions/runners/{runner_id}/labels"
-    ],
-    setCustomLabelsForSelfHostedRunnerForRepo: [
-      "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
-    ],
-    setCustomOidcSubClaimForRepo: [
-      "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"
-    ],
-    setGithubActionsDefaultWorkflowPermissionsOrganization: [
-      "PUT /orgs/{org}/actions/permissions/workflow"
-    ],
-    setGithubActionsDefaultWorkflowPermissionsRepository: [
-      "PUT /repos/{owner}/{repo}/actions/permissions/workflow"
-    ],
-    setGithubActionsPermissionsOrganization: [
-      "PUT /orgs/{org}/actions/permissions"
-    ],
-    setGithubActionsPermissionsRepository: [
-      "PUT /repos/{owner}/{repo}/actions/permissions"
-    ],
-    setSelectedReposForOrgSecret: [
-      "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"
-    ],
-    setSelectedReposForOrgVariable: [
-      "PUT /orgs/{org}/actions/variables/{name}/repositories"
-    ],
-    setSelectedRepositoriesEnabledGithubActionsOrganization: [
-      "PUT /orgs/{org}/actions/permissions/repositories"
-    ],
-    setWorkflowAccessToRepository: [
-      "PUT /repos/{owner}/{repo}/actions/permissions/access"
-    ],
-    updateEnvironmentVariable: [
-      "PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}"
-    ],
-    updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"],
-    updateRepoVariable: [
-      "PATCH /repos/{owner}/{repo}/actions/variables/{name}"
-    ]
-  },
-  activity: {
-    checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"],
-    deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"],
-    deleteThreadSubscription: [
-      "DELETE /notifications/threads/{thread_id}/subscription"
-    ],
-    getFeeds: ["GET /feeds"],
-    getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"],
-    getThread: ["GET /notifications/threads/{thread_id}"],
-    getThreadSubscriptionForAuthenticatedUser: [
-      "GET /notifications/threads/{thread_id}/subscription"
-    ],
-    listEventsForAuthenticatedUser: ["GET /users/{username}/events"],
-    listNotificationsForAuthenticatedUser: ["GET /notifications"],
-    listOrgEventsForAuthenticatedUser: [
-      "GET /users/{username}/events/orgs/{org}"
-    ],
-    listPublicEvents: ["GET /events"],
-    listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"],
-    listPublicEventsForUser: ["GET /users/{username}/events/public"],
-    listPublicOrgEvents: ["GET /orgs/{org}/events"],
-    listReceivedEventsForUser: ["GET /users/{username}/received_events"],
-    listReceivedPublicEventsForUser: [
-      "GET /users/{username}/received_events/public"
-    ],
-    listRepoEvents: ["GET /repos/{owner}/{repo}/events"],
-    listRepoNotificationsForAuthenticatedUser: [
-      "GET /repos/{owner}/{repo}/notifications"
-    ],
-    listReposStarredByAuthenticatedUser: ["GET /user/starred"],
-    listReposStarredByUser: ["GET /users/{username}/starred"],
-    listReposWatchedByUser: ["GET /users/{username}/subscriptions"],
-    listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"],
-    listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"],
-    listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],
-    markNotificationsAsRead: ["PUT /notifications"],
-    markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],
-    markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"],
-    markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],
-    setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],
-    setThreadSubscription: [
-      "PUT /notifications/threads/{thread_id}/subscription"
-    ],
-    starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"],
-    unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"]
-  },
-  apps: {
-    addRepoToInstallation: [
-      "PUT /user/installations/{installation_id}/repositories/{repository_id}",
-      {},
-      { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] }
-    ],
-    addRepoToInstallationForAuthenticatedUser: [
-      "PUT /user/installations/{installation_id}/repositories/{repository_id}"
-    ],
-    checkToken: ["POST /applications/{client_id}/token"],
-    createFromManifest: ["POST /app-manifests/{code}/conversions"],
-    createInstallationAccessToken: [
-      "POST /app/installations/{installation_id}/access_tokens"
-    ],
-    deleteAuthorization: ["DELETE /applications/{client_id}/grant"],
-    deleteInstallation: ["DELETE /app/installations/{installation_id}"],
-    deleteToken: ["DELETE /applications/{client_id}/token"],
-    getAuthenticated: ["GET /app"],
-    getBySlug: ["GET /apps/{app_slug}"],
-    getInstallation: ["GET /app/installations/{installation_id}"],
-    getOrgInstallation: ["GET /orgs/{org}/installation"],
-    getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"],
-    getSubscriptionPlanForAccount: [
-      "GET /marketplace_listing/accounts/{account_id}"
-    ],
-    getSubscriptionPlanForAccountStubbed: [
-      "GET /marketplace_listing/stubbed/accounts/{account_id}"
-    ],
-    getUserInstallation: ["GET /users/{username}/installation"],
-    getWebhookConfigForApp: ["GET /app/hook/config"],
-    getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],
-    listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"],
-    listAccountsForPlanStubbed: [
-      "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"
-    ],
-    listInstallationReposForAuthenticatedUser: [
-      "GET /user/installations/{installation_id}/repositories"
-    ],
-    listInstallationRequestsForAuthenticatedApp: [
-      "GET /app/installation-requests"
-    ],
-    listInstallations: ["GET /app/installations"],
-    listInstallationsForAuthenticatedUser: ["GET /user/installations"],
-    listPlans: ["GET /marketplace_listing/plans"],
-    listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"],
-    listReposAccessibleToInstallation: ["GET /installation/repositories"],
-    listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"],
-    listSubscriptionsForAuthenticatedUserStubbed: [
-      "GET /user/marketplace_purchases/stubbed"
-    ],
-    listWebhookDeliveries: ["GET /app/hook/deliveries"],
-    redeliverWebhookDelivery: [
-      "POST /app/hook/deliveries/{delivery_id}/attempts"
-    ],
-    removeRepoFromInstallation: [
-      "DELETE /user/installations/{installation_id}/repositories/{repository_id}",
-      {},
-      { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] }
-    ],
-    removeRepoFromInstallationForAuthenticatedUser: [
-      "DELETE /user/installations/{installation_id}/repositories/{repository_id}"
-    ],
-    resetToken: ["PATCH /applications/{client_id}/token"],
-    revokeInstallationAccessToken: ["DELETE /installation/token"],
-    scopeToken: ["POST /applications/{client_id}/token/scoped"],
-    suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"],
-    unsuspendInstallation: [
-      "DELETE /app/installations/{installation_id}/suspended"
-    ],
-    updateWebhookConfigForApp: ["PATCH /app/hook/config"]
-  },
-  billing: {
-    getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"],
-    getGithubActionsBillingUser: [
-      "GET /users/{username}/settings/billing/actions"
-    ],
-    getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],
-    getGithubPackagesBillingUser: [
-      "GET /users/{username}/settings/billing/packages"
-    ],
-    getSharedStorageBillingOrg: [
-      "GET /orgs/{org}/settings/billing/shared-storage"
-    ],
-    getSharedStorageBillingUser: [
-      "GET /users/{username}/settings/billing/shared-storage"
-    ]
-  },
-  checks: {
-    create: ["POST /repos/{owner}/{repo}/check-runs"],
-    createSuite: ["POST /repos/{owner}/{repo}/check-suites"],
-    get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],
-    getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],
-    listAnnotations: [
-      "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"
-    ],
-    listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],
-    listForSuite: [
-      "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"
-    ],
-    listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],
-    rerequestRun: [
-      "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"
-    ],
-    rerequestSuite: [
-      "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"
-    ],
-    setSuitesPreferences: [
-      "PATCH /repos/{owner}/{repo}/check-suites/preferences"
-    ],
-    update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]
-  },
-  codeScanning: {
-    deleteAnalysis: [
-      "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"
-    ],
-    getAlert: [
-      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",
-      {},
-      { renamedParameters: { alert_id: "alert_number" } }
-    ],
-    getAnalysis: [
-      "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"
-    ],
-    getCodeqlDatabase: [
-      "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"
-    ],
-    getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"],
-    getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],
-    listAlertInstances: [
-      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"
-    ],
-    listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],
-    listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],
-    listAlertsInstances: [
-      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",
-      {},
-      { renamed: ["codeScanning", "listAlertInstances"] }
-    ],
-    listCodeqlDatabases: [
-      "GET /repos/{owner}/{repo}/code-scanning/codeql/databases"
-    ],
-    listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"],
-    updateAlert: [
-      "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"
-    ],
-    updateDefaultSetup: [
-      "PATCH /repos/{owner}/{repo}/code-scanning/default-setup"
-    ],
-    uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"]
-  },
-  codesOfConduct: {
-    getAllCodesOfConduct: ["GET /codes_of_conduct"],
-    getConductCode: ["GET /codes_of_conduct/{key}"]
-  },
-  codespaces: {
-    addRepositoryForSecretForAuthenticatedUser: [
-      "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    addSelectedRepoToOrgSecret: [
-      "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    checkPermissionsForDevcontainer: [
-      "GET /repos/{owner}/{repo}/codespaces/permissions_check"
-    ],
-    codespaceMachinesForAuthenticatedUser: [
-      "GET /user/codespaces/{codespace_name}/machines"
-    ],
-    createForAuthenticatedUser: ["POST /user/codespaces"],
-    createOrUpdateOrgSecret: [
-      "PUT /orgs/{org}/codespaces/secrets/{secret_name}"
-    ],
-    createOrUpdateRepoSecret: [
-      "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"
-    ],
-    createOrUpdateSecretForAuthenticatedUser: [
-      "PUT /user/codespaces/secrets/{secret_name}"
-    ],
-    createWithPrForAuthenticatedUser: [
-      "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"
-    ],
-    createWithRepoForAuthenticatedUser: [
-      "POST /repos/{owner}/{repo}/codespaces"
-    ],
-    deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],
-    deleteFromOrganization: [
-      "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"
-    ],
-    deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],
-    deleteRepoSecret: [
-      "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"
-    ],
-    deleteSecretForAuthenticatedUser: [
-      "DELETE /user/codespaces/secrets/{secret_name}"
-    ],
-    exportForAuthenticatedUser: [
-      "POST /user/codespaces/{codespace_name}/exports"
-    ],
-    getCodespacesForUserInOrg: [
-      "GET /orgs/{org}/members/{username}/codespaces"
-    ],
-    getExportDetailsForAuthenticatedUser: [
-      "GET /user/codespaces/{codespace_name}/exports/{export_id}"
-    ],
-    getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],
-    getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"],
-    getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"],
-    getPublicKeyForAuthenticatedUser: [
-      "GET /user/codespaces/secrets/public-key"
-    ],
-    getRepoPublicKey: [
-      "GET /repos/{owner}/{repo}/codespaces/secrets/public-key"
-    ],
-    getRepoSecret: [
-      "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"
-    ],
-    getSecretForAuthenticatedUser: [
-      "GET /user/codespaces/secrets/{secret_name}"
-    ],
-    listDevcontainersInRepositoryForAuthenticatedUser: [
-      "GET /repos/{owner}/{repo}/codespaces/devcontainers"
-    ],
-    listForAuthenticatedUser: ["GET /user/codespaces"],
-    listInOrganization: [
-      "GET /orgs/{org}/codespaces",
-      {},
-      { renamedParameters: { org_id: "org" } }
-    ],
-    listInRepositoryForAuthenticatedUser: [
-      "GET /repos/{owner}/{repo}/codespaces"
-    ],
-    listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"],
-    listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],
-    listRepositoriesForSecretForAuthenticatedUser: [
-      "GET /user/codespaces/secrets/{secret_name}/repositories"
-    ],
-    listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],
-    listSelectedReposForOrgSecret: [
-      "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"
-    ],
-    preFlightWithRepoForAuthenticatedUser: [
-      "GET /repos/{owner}/{repo}/codespaces/new"
-    ],
-    publishForAuthenticatedUser: [
-      "POST /user/codespaces/{codespace_name}/publish"
-    ],
-    removeRepositoryForSecretForAuthenticatedUser: [
-      "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    removeSelectedRepoFromOrgSecret: [
-      "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    repoMachinesForAuthenticatedUser: [
-      "GET /repos/{owner}/{repo}/codespaces/machines"
-    ],
-    setRepositoriesForSecretForAuthenticatedUser: [
-      "PUT /user/codespaces/secrets/{secret_name}/repositories"
-    ],
-    setSelectedReposForOrgSecret: [
-      "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"
-    ],
-    startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],
-    stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],
-    stopInOrganization: [
-      "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"
-    ],
-    updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
-  },
-  copilot: {
-    addCopilotSeatsForTeams: [
-      "POST /orgs/{org}/copilot/billing/selected_teams"
-    ],
-    addCopilotSeatsForUsers: [
-      "POST /orgs/{org}/copilot/billing/selected_users"
-    ],
-    cancelCopilotSeatAssignmentForTeams: [
-      "DELETE /orgs/{org}/copilot/billing/selected_teams"
-    ],
-    cancelCopilotSeatAssignmentForUsers: [
-      "DELETE /orgs/{org}/copilot/billing/selected_users"
-    ],
-    getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"],
-    getCopilotSeatDetailsForUser: [
-      "GET /orgs/{org}/members/{username}/copilot"
-    ],
-    listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"]
-  },
-  dependabot: {
-    addSelectedRepoToOrgSecret: [
-      "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    createOrUpdateOrgSecret: [
-      "PUT /orgs/{org}/dependabot/secrets/{secret_name}"
-    ],
-    createOrUpdateRepoSecret: [
-      "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"
-    ],
-    deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],
-    deleteRepoSecret: [
-      "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"
-    ],
-    getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],
-    getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],
-    getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],
-    getRepoPublicKey: [
-      "GET /repos/{owner}/{repo}/dependabot/secrets/public-key"
-    ],
-    getRepoSecret: [
-      "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"
-    ],
-    listAlertsForEnterprise: [
-      "GET /enterprises/{enterprise}/dependabot/alerts"
-    ],
-    listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"],
-    listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"],
-    listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],
-    listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],
-    listSelectedReposForOrgSecret: [
-      "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"
-    ],
-    removeSelectedRepoFromOrgSecret: [
-      "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
-    ],
-    setSelectedReposForOrgSecret: [
-      "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"
-    ],
-    updateAlert: [
-      "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"
-    ]
-  },
-  dependencyGraph: {
-    createRepositorySnapshot: [
-      "POST /repos/{owner}/{repo}/dependency-graph/snapshots"
-    ],
-    diffRange: [
-      "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"
-    ],
-    exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"]
-  },
-  emojis: { get: ["GET /emojis"] },
-  gists: {
-    checkIsStarred: ["GET /gists/{gist_id}/star"],
-    create: ["POST /gists"],
-    createComment: ["POST /gists/{gist_id}/comments"],
-    delete: ["DELETE /gists/{gist_id}"],
-    deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"],
-    fork: ["POST /gists/{gist_id}/forks"],
-    get: ["GET /gists/{gist_id}"],
-    getComment: ["GET /gists/{gist_id}/comments/{comment_id}"],
-    getRevision: ["GET /gists/{gist_id}/{sha}"],
-    list: ["GET /gists"],
-    listComments: ["GET /gists/{gist_id}/comments"],
-    listCommits: ["GET /gists/{gist_id}/commits"],
-    listForUser: ["GET /users/{username}/gists"],
-    listForks: ["GET /gists/{gist_id}/forks"],
-    listPublic: ["GET /gists/public"],
-    listStarred: ["GET /gists/starred"],
-    star: ["PUT /gists/{gist_id}/star"],
-    unstar: ["DELETE /gists/{gist_id}/star"],
-    update: ["PATCH /gists/{gist_id}"],
-    updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"]
-  },
-  git: {
-    createBlob: ["POST /repos/{owner}/{repo}/git/blobs"],
-    createCommit: ["POST /repos/{owner}/{repo}/git/commits"],
-    createRef: ["POST /repos/{owner}/{repo}/git/refs"],
-    createTag: ["POST /repos/{owner}/{repo}/git/tags"],
-    createTree: ["POST /repos/{owner}/{repo}/git/trees"],
-    deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],
-    getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],
-    getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],
-    getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"],
-    getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],
-    getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],
-    listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],
-    updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]
-  },
-  gitignore: {
-    getAllTemplates: ["GET /gitignore/templates"],
-    getTemplate: ["GET /gitignore/templates/{name}"]
-  },
-  interactions: {
-    getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],
-    getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],
-    getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"],
-    getRestrictionsForYourPublicRepos: [
-      "GET /user/interaction-limits",
-      {},
-      { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] }
-    ],
-    removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"],
-    removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"],
-    removeRestrictionsForRepo: [
-      "DELETE /repos/{owner}/{repo}/interaction-limits"
-    ],
-    removeRestrictionsForYourPublicRepos: [
-      "DELETE /user/interaction-limits",
-      {},
-      { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] }
-    ],
-    setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"],
-    setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"],
-    setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"],
-    setRestrictionsForYourPublicRepos: [
-      "PUT /user/interaction-limits",
-      {},
-      { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] }
-    ]
-  },
-  issues: {
-    addAssignees: [
-      "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"
-    ],
-    addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],
-    checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"],
-    checkUserCanBeAssignedToIssue: [
-      "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"
-    ],
-    create: ["POST /repos/{owner}/{repo}/issues"],
-    createComment: [
-      "POST /repos/{owner}/{repo}/issues/{issue_number}/comments"
-    ],
-    createLabel: ["POST /repos/{owner}/{repo}/labels"],
-    createMilestone: ["POST /repos/{owner}/{repo}/milestones"],
-    deleteComment: [
-      "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"
-    ],
-    deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"],
-    deleteMilestone: [
-      "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"
-    ],
-    get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"],
-    getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],
-    getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],
-    getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],
-    getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],
-    list: ["GET /issues"],
-    listAssignees: ["GET /repos/{owner}/{repo}/assignees"],
-    listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],
-    listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],
-    listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],
-    listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],
-    listEventsForTimeline: [
-      "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"
-    ],
-    listForAuthenticatedUser: ["GET /user/issues"],
-    listForOrg: ["GET /orgs/{org}/issues"],
-    listForRepo: ["GET /repos/{owner}/{repo}/issues"],
-    listLabelsForMilestone: [
-      "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"
-    ],
-    listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"],
-    listLabelsOnIssue: [
-      "GET /repos/{owner}/{repo}/issues/{issue_number}/labels"
-    ],
-    listMilestones: ["GET /repos/{owner}/{repo}/milestones"],
-    lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],
-    removeAllLabels: [
-      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"
-    ],
-    removeAssignees: [
-      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"
-    ],
-    removeLabel: [
-      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"
-    ],
-    setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],
-    unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],
-    update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],
-    updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],
-    updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"],
-    updateMilestone: [
-      "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"
-    ]
-  },
-  licenses: {
-    get: ["GET /licenses/{license}"],
-    getAllCommonlyUsed: ["GET /licenses"],
-    getForRepo: ["GET /repos/{owner}/{repo}/license"]
-  },
-  markdown: {
-    render: ["POST /markdown"],
-    renderRaw: [
-      "POST /markdown/raw",
-      { headers: { "content-type": "text/plain; charset=utf-8" } }
-    ]
-  },
-  meta: {
-    get: ["GET /meta"],
-    getAllVersions: ["GET /versions"],
-    getOctocat: ["GET /octocat"],
-    getZen: ["GET /zen"],
-    root: ["GET /"]
-  },
-  migrations: {
-    cancelImport: [
-      "DELETE /repos/{owner}/{repo}/import",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import"
-      }
-    ],
-    deleteArchiveForAuthenticatedUser: [
-      "DELETE /user/migrations/{migration_id}/archive"
-    ],
-    deleteArchiveForOrg: [
-      "DELETE /orgs/{org}/migrations/{migration_id}/archive"
-    ],
-    downloadArchiveForOrg: [
-      "GET /orgs/{org}/migrations/{migration_id}/archive"
-    ],
-    getArchiveForAuthenticatedUser: [
-      "GET /user/migrations/{migration_id}/archive"
-    ],
-    getCommitAuthors: [
-      "GET /repos/{owner}/{repo}/import/authors",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors"
-      }
-    ],
-    getImportStatus: [
-      "GET /repos/{owner}/{repo}/import",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status"
-      }
-    ],
-    getLargeFiles: [
-      "GET /repos/{owner}/{repo}/import/large_files",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files"
-      }
-    ],
-    getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"],
-    getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],
-    listForAuthenticatedUser: ["GET /user/migrations"],
-    listForOrg: ["GET /orgs/{org}/migrations"],
-    listReposForAuthenticatedUser: [
-      "GET /user/migrations/{migration_id}/repositories"
-    ],
-    listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],
-    listReposForUser: [
-      "GET /user/migrations/{migration_id}/repositories",
-      {},
-      { renamed: ["migrations", "listReposForAuthenticatedUser"] }
-    ],
-    mapCommitAuthor: [
-      "PATCH /repos/{owner}/{repo}/import/authors/{author_id}",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author"
-      }
-    ],
-    setLfsPreference: [
-      "PATCH /repos/{owner}/{repo}/import/lfs",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference"
-      }
-    ],
-    startForAuthenticatedUser: ["POST /user/migrations"],
-    startForOrg: ["POST /orgs/{org}/migrations"],
-    startImport: [
-      "PUT /repos/{owner}/{repo}/import",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import"
-      }
-    ],
-    unlockRepoForAuthenticatedUser: [
-      "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"
-    ],
-    unlockRepoForOrg: [
-      "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"
-    ],
-    updateImport: [
-      "PATCH /repos/{owner}/{repo}/import",
-      {},
-      {
-        deprecated: "octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import"
-      }
-    ]
-  },
-  oidc: {
-    getOidcCustomSubTemplateForOrg: [
-      "GET /orgs/{org}/actions/oidc/customization/sub"
-    ],
-    updateOidcCustomSubTemplateForOrg: [
-      "PUT /orgs/{org}/actions/oidc/customization/sub"
-    ]
-  },
-  orgs: {
-    addSecurityManagerTeam: [
-      "PUT /orgs/{org}/security-managers/teams/{team_slug}"
-    ],
-    assignTeamToOrgRole: [
-      "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"
-    ],
-    assignUserToOrgRole: [
-      "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"
-    ],
-    blockUser: ["PUT /orgs/{org}/blocks/{username}"],
-    cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],
-    checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],
-    checkMembershipForUser: ["GET /orgs/{org}/members/{username}"],
-    checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"],
-    convertMemberToOutsideCollaborator: [
-      "PUT /orgs/{org}/outside_collaborators/{username}"
-    ],
-    createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"],
-    createInvitation: ["POST /orgs/{org}/invitations"],
-    createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],
-    createOrUpdateCustomPropertiesValuesForRepos: [
-      "PATCH /orgs/{org}/properties/values"
-    ],
-    createOrUpdateCustomProperty: [
-      "PUT /orgs/{org}/properties/schema/{custom_property_name}"
-    ],
-    createWebhook: ["POST /orgs/{org}/hooks"],
-    delete: ["DELETE /orgs/{org}"],
-    deleteCustomOrganizationRole: [
-      "DELETE /orgs/{org}/organization-roles/{role_id}"
-    ],
-    deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
-    enableOrDisableSecurityProductOnAllOrgRepos: [
-      "POST /orgs/{org}/{security_product}/{enablement}"
-    ],
-    get: ["GET /orgs/{org}"],
-    getAllCustomProperties: ["GET /orgs/{org}/properties/schema"],
-    getCustomProperty: [
-      "GET /orgs/{org}/properties/schema/{custom_property_name}"
-    ],
-    getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],
-    getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],
-    getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"],
-    getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],
-    getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],
-    getWebhookDelivery: [
-      "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"
-    ],
-    list: ["GET /organizations"],
-    listAppInstallations: ["GET /orgs/{org}/installations"],
-    listBlockedUsers: ["GET /orgs/{org}/blocks"],
-    listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"],
-    listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],
-    listForAuthenticatedUser: ["GET /user/orgs"],
-    listForUser: ["GET /users/{username}/orgs"],
-    listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],
-    listMembers: ["GET /orgs/{org}/members"],
-    listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],
-    listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"],
-    listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"],
-    listOrgRoles: ["GET /orgs/{org}/organization-roles"],
-    listOrganizationFineGrainedPermissions: [
-      "GET /orgs/{org}/organization-fine-grained-permissions"
-    ],
-    listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],
-    listPatGrantRepositories: [
-      "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"
-    ],
-    listPatGrantRequestRepositories: [
-      "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"
-    ],
-    listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"],
-    listPatGrants: ["GET /orgs/{org}/personal-access-tokens"],
-    listPendingInvitations: ["GET /orgs/{org}/invitations"],
-    listPublicMembers: ["GET /orgs/{org}/public_members"],
-    listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"],
-    listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
-    listWebhooks: ["GET /orgs/{org}/hooks"],
-    patchCustomOrganizationRole: [
-      "PATCH /orgs/{org}/organization-roles/{role_id}"
-    ],
-    pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
-    redeliverWebhookDelivery: [
-      "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"
-    ],
-    removeCustomProperty: [
-      "DELETE /orgs/{org}/properties/schema/{custom_property_name}"
-    ],
-    removeMember: ["DELETE /orgs/{org}/members/{username}"],
-    removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"],
-    removeOutsideCollaborator: [
-      "DELETE /orgs/{org}/outside_collaborators/{username}"
-    ],
-    removePublicMembershipForAuthenticatedUser: [
-      "DELETE /orgs/{org}/public_members/{username}"
-    ],
-    removeSecurityManagerTeam: [
-      "DELETE /orgs/{org}/security-managers/teams/{team_slug}"
-    ],
-    reviewPatGrantRequest: [
-      "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"
-    ],
-    reviewPatGrantRequestsInBulk: [
-      "POST /orgs/{org}/personal-access-token-requests"
-    ],
-    revokeAllOrgRolesTeam: [
-      "DELETE /orgs/{org}/organization-roles/teams/{team_slug}"
-    ],
-    revokeAllOrgRolesUser: [
-      "DELETE /orgs/{org}/organization-roles/users/{username}"
-    ],
-    revokeOrgRoleTeam: [
-      "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"
-    ],
-    revokeOrgRoleUser: [
-      "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"
-    ],
-    setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],
-    setPublicMembershipForAuthenticatedUser: [
-      "PUT /orgs/{org}/public_members/{username}"
-    ],
-    unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],
-    update: ["PATCH /orgs/{org}"],
-    updateMembershipForAuthenticatedUser: [
-      "PATCH /user/memberships/orgs/{org}"
-    ],
-    updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"],
-    updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"],
-    updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"],
-    updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"]
-  },
-  packages: {
-    deletePackageForAuthenticatedUser: [
-      "DELETE /user/packages/{package_type}/{package_name}"
-    ],
-    deletePackageForOrg: [
-      "DELETE /orgs/{org}/packages/{package_type}/{package_name}"
-    ],
-    deletePackageForUser: [
-      "DELETE /users/{username}/packages/{package_type}/{package_name}"
-    ],
-    deletePackageVersionForAuthenticatedUser: [
-      "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"
-    ],
-    deletePackageVersionForOrg: [
-      "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"
-    ],
-    deletePackageVersionForUser: [
-      "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"
-    ],
-    getAllPackageVersionsForAPackageOwnedByAnOrg: [
-      "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",
-      {},
-      { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] }
-    ],
-    getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [
-      "GET /user/packages/{package_type}/{package_name}/versions",
-      {},
-      {
-        renamed: [
-          "packages",
-          "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"
-        ]
-      }
-    ],
-    getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [
-      "GET /user/packages/{package_type}/{package_name}/versions"
-    ],
-    getAllPackageVersionsForPackageOwnedByOrg: [
-      "GET /orgs/{org}/packages/{package_type}/{package_name}/versions"
-    ],
-    getAllPackageVersionsForPackageOwnedByUser: [
-      "GET /users/{username}/packages/{package_type}/{package_name}/versions"
-    ],
-    getPackageForAuthenticatedUser: [
-      "GET /user/packages/{package_type}/{package_name}"
-    ],
-    getPackageForOrganization: [
-      "GET /orgs/{org}/packages/{package_type}/{package_name}"
-    ],
-    getPackageForUser: [
-      "GET /users/{username}/packages/{package_type}/{package_name}"
-    ],
-    getPackageVersionForAuthenticatedUser: [
-      "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"
-    ],
-    getPackageVersionForOrganization: [
-      "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"
-    ],
-    getPackageVersionForUser: [
-      "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"
-    ],
-    listDockerMigrationConflictingPackagesForAuthenticatedUser: [
-      "GET /user/docker/conflicts"
-    ],
-    listDockerMigrationConflictingPackagesForOrganization: [
-      "GET /orgs/{org}/docker/conflicts"
-    ],
-    listDockerMigrationConflictingPackagesForUser: [
-      "GET /users/{username}/docker/conflicts"
-    ],
-    listPackagesForAuthenticatedUser: ["GET /user/packages"],
-    listPackagesForOrganization: ["GET /orgs/{org}/packages"],
-    listPackagesForUser: ["GET /users/{username}/packages"],
-    restorePackageForAuthenticatedUser: [
-      "POST /user/packages/{package_type}/{package_name}/restore{?token}"
-    ],
-    restorePackageForOrg: [
-      "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"
-    ],
-    restorePackageForUser: [
-      "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"
-    ],
-    restorePackageVersionForAuthenticatedUser: [
-      "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"
-    ],
-    restorePackageVersionForOrg: [
-      "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"
-    ],
-    restorePackageVersionForUser: [
-      "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"
-    ]
-  },
-  projects: {
-    addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],
-    createCard: ["POST /projects/columns/{column_id}/cards"],
-    createColumn: ["POST /projects/{project_id}/columns"],
-    createForAuthenticatedUser: ["POST /user/projects"],
-    createForOrg: ["POST /orgs/{org}/projects"],
-    createForRepo: ["POST /repos/{owner}/{repo}/projects"],
-    delete: ["DELETE /projects/{project_id}"],
-    deleteCard: ["DELETE /projects/columns/cards/{card_id}"],
-    deleteColumn: ["DELETE /projects/columns/{column_id}"],
-    get: ["GET /projects/{project_id}"],
-    getCard: ["GET /projects/columns/cards/{card_id}"],
-    getColumn: ["GET /projects/columns/{column_id}"],
-    getPermissionForUser: [
-      "GET /projects/{project_id}/collaborators/{username}/permission"
-    ],
-    listCards: ["GET /projects/columns/{column_id}/cards"],
-    listCollaborators: ["GET /projects/{project_id}/collaborators"],
-    listColumns: ["GET /projects/{project_id}/columns"],
-    listForOrg: ["GET /orgs/{org}/projects"],
-    listForRepo: ["GET /repos/{owner}/{repo}/projects"],
-    listForUser: ["GET /users/{username}/projects"],
-    moveCard: ["POST /projects/columns/cards/{card_id}/moves"],
-    moveColumn: ["POST /projects/columns/{column_id}/moves"],
-    removeCollaborator: [
-      "DELETE /projects/{project_id}/collaborators/{username}"
-    ],
-    update: ["PATCH /projects/{project_id}"],
-    updateCard: ["PATCH /projects/columns/cards/{card_id}"],
-    updateColumn: ["PATCH /projects/columns/{column_id}"]
-  },
-  pulls: {
-    checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
-    create: ["POST /repos/{owner}/{repo}/pulls"],
-    createReplyForReviewComment: [
-      "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"
-    ],
-    createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],
-    createReviewComment: [
-      "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"
-    ],
-    deletePendingReview: [
-      "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"
-    ],
-    deleteReviewComment: [
-      "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"
-    ],
-    dismissReview: [
-      "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"
-    ],
-    get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"],
-    getReview: [
-      "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"
-    ],
-    getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],
-    list: ["GET /repos/{owner}/{repo}/pulls"],
-    listCommentsForReview: [
-      "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"
-    ],
-    listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],
-    listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],
-    listRequestedReviewers: [
-      "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"
-    ],
-    listReviewComments: [
-      "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"
-    ],
-    listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"],
-    listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],
-    merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
-    removeRequestedReviewers: [
-      "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"
-    ],
-    requestReviewers: [
-      "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"
-    ],
-    submitReview: [
-      "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"
-    ],
-    update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],
-    updateBranch: [
-      "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"
-    ],
-    updateReview: [
-      "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"
-    ],
-    updateReviewComment: [
-      "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"
-    ]
-  },
-  rateLimit: { get: ["GET /rate_limit"] },
-  reactions: {
-    createForCommitComment: [
-      "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"
-    ],
-    createForIssue: [
-      "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"
-    ],
-    createForIssueComment: [
-      "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"
-    ],
-    createForPullRequestReviewComment: [
-      "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"
-    ],
-    createForRelease: [
-      "POST /repos/{owner}/{repo}/releases/{release_id}/reactions"
-    ],
-    createForTeamDiscussionCommentInOrg: [
-      "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"
-    ],
-    createForTeamDiscussionInOrg: [
-      "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"
-    ],
-    deleteForCommitComment: [
-      "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"
-    ],
-    deleteForIssue: [
-      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"
-    ],
-    deleteForIssueComment: [
-      "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"
-    ],
-    deleteForPullRequestComment: [
-      "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"
-    ],
-    deleteForRelease: [
-      "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"
-    ],
-    deleteForTeamDiscussion: [
-      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"
-    ],
-    deleteForTeamDiscussionComment: [
-      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"
-    ],
-    listForCommitComment: [
-      "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"
-    ],
-    listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
-    listForIssueComment: [
-      "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"
-    ],
-    listForPullRequestReviewComment: [
-      "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"
-    ],
-    listForRelease: [
-      "GET /repos/{owner}/{repo}/releases/{release_id}/reactions"
-    ],
-    listForTeamDiscussionCommentInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"
-    ],
-    listForTeamDiscussionInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"
-    ]
-  },
-  repos: {
-    acceptInvitation: [
-      "PATCH /user/repository_invitations/{invitation_id}",
-      {},
-      { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] }
-    ],
-    acceptInvitationForAuthenticatedUser: [
-      "PATCH /user/repository_invitations/{invitation_id}"
-    ],
-    addAppAccessRestrictions: [
-      "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",
-      {},
-      { mapToData: "apps" }
-    ],
-    addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"],
-    addStatusCheckContexts: [
-      "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",
-      {},
-      { mapToData: "contexts" }
-    ],
-    addTeamAccessRestrictions: [
-      "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",
-      {},
-      { mapToData: "teams" }
-    ],
-    addUserAccessRestrictions: [
-      "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",
-      {},
-      { mapToData: "users" }
-    ],
-    cancelPagesDeployment: [
-      "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel"
-    ],
-    checkAutomatedSecurityFixes: [
-      "GET /repos/{owner}/{repo}/automated-security-fixes"
-    ],
-    checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"],
-    checkVulnerabilityAlerts: [
-      "GET /repos/{owner}/{repo}/vulnerability-alerts"
-    ],
-    codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],
-    compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],
-    compareCommitsWithBasehead: [
-      "GET /repos/{owner}/{repo}/compare/{basehead}"
-    ],
-    createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],
-    createCommitComment: [
-      "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"
-    ],
-    createCommitSignatureProtection: [
-      "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"
-    ],
-    createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],
-    createDeployKey: ["POST /repos/{owner}/{repo}/keys"],
-    createDeployment: ["POST /repos/{owner}/{repo}/deployments"],
-    createDeploymentBranchPolicy: [
-      "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"
-    ],
-    createDeploymentProtectionRule: [
-      "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"
-    ],
-    createDeploymentStatus: [
-      "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"
-    ],
-    createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"],
-    createForAuthenticatedUser: ["POST /user/repos"],
-    createFork: ["POST /repos/{owner}/{repo}/forks"],
-    createInOrg: ["POST /orgs/{org}/repos"],
-    createOrUpdateCustomPropertiesValues: [
-      "PATCH /repos/{owner}/{repo}/properties/values"
-    ],
-    createOrUpdateEnvironment: [
-      "PUT /repos/{owner}/{repo}/environments/{environment_name}"
-    ],
-    createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],
-    createOrgRuleset: ["POST /orgs/{org}/rulesets"],
-    createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"],
-    createPagesSite: ["POST /repos/{owner}/{repo}/pages"],
-    createRelease: ["POST /repos/{owner}/{repo}/releases"],
-    createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"],
-    createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],
-    createUsingTemplate: [
-      "POST /repos/{template_owner}/{template_repo}/generate"
-    ],
-    createWebhook: ["POST /repos/{owner}/{repo}/hooks"],
-    declineInvitation: [
-      "DELETE /user/repository_invitations/{invitation_id}",
-      {},
-      { renamed: ["repos", "declineInvitationForAuthenticatedUser"] }
-    ],
-    declineInvitationForAuthenticatedUser: [
-      "DELETE /user/repository_invitations/{invitation_id}"
-    ],
-    delete: ["DELETE /repos/{owner}/{repo}"],
-    deleteAccessRestrictions: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"
-    ],
-    deleteAdminBranchProtection: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"
-    ],
-    deleteAnEnvironment: [
-      "DELETE /repos/{owner}/{repo}/environments/{environment_name}"
-    ],
-    deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],
-    deleteBranchProtection: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection"
-    ],
-    deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],
-    deleteCommitSignatureProtection: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"
-    ],
-    deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],
-    deleteDeployment: [
-      "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"
-    ],
-    deleteDeploymentBranchPolicy: [
-      "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"
-    ],
-    deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],
-    deleteInvitation: [
-      "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"
-    ],
-    deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"],
-    deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],
-    deletePullRequestReviewProtection: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"
-    ],
-    deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"],
-    deleteReleaseAsset: [
-      "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"
-    ],
-    deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
-    deleteTagProtection: [
-      "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"
-    ],
-    deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],
-    disableAutomatedSecurityFixes: [
-      "DELETE /repos/{owner}/{repo}/automated-security-fixes"
-    ],
-    disableDeploymentProtectionRule: [
-      "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"
-    ],
-    disablePrivateVulnerabilityReporting: [
-      "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"
-    ],
-    disableVulnerabilityAlerts: [
-      "DELETE /repos/{owner}/{repo}/vulnerability-alerts"
-    ],
-    downloadArchive: [
-      "GET /repos/{owner}/{repo}/zipball/{ref}",
-      {},
-      { renamed: ["repos", "downloadZipballArchive"] }
-    ],
-    downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"],
-    downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"],
-    enableAutomatedSecurityFixes: [
-      "PUT /repos/{owner}/{repo}/automated-security-fixes"
-    ],
-    enablePrivateVulnerabilityReporting: [
-      "PUT /repos/{owner}/{repo}/private-vulnerability-reporting"
-    ],
-    enableVulnerabilityAlerts: [
-      "PUT /repos/{owner}/{repo}/vulnerability-alerts"
-    ],
-    generateReleaseNotes: [
-      "POST /repos/{owner}/{repo}/releases/generate-notes"
-    ],
-    get: ["GET /repos/{owner}/{repo}"],
-    getAccessRestrictions: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"
-    ],
-    getAdminBranchProtection: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"
-    ],
-    getAllDeploymentProtectionRules: [
-      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"
-    ],
-    getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"],
-    getAllStatusCheckContexts: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"
-    ],
-    getAllTopics: ["GET /repos/{owner}/{repo}/topics"],
-    getAppsWithAccessToProtectedBranch: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"
-    ],
-    getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],
-    getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"],
-    getBranchProtection: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection"
-    ],
-    getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"],
-    getClones: ["GET /repos/{owner}/{repo}/traffic/clones"],
-    getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"],
-    getCollaboratorPermissionLevel: [
-      "GET /repos/{owner}/{repo}/collaborators/{username}/permission"
-    ],
-    getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"],
-    getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"],
-    getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"],
-    getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"],
-    getCommitSignatureProtection: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"
-    ],
-    getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"],
-    getContent: ["GET /repos/{owner}/{repo}/contents/{path}"],
-    getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"],
-    getCustomDeploymentProtectionRule: [
-      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"
-    ],
-    getCustomPropertiesValues: ["GET /repos/{owner}/{repo}/properties/values"],
-    getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"],
-    getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],
-    getDeploymentBranchPolicy: [
-      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"
-    ],
-    getDeploymentStatus: [
-      "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"
-    ],
-    getEnvironment: [
-      "GET /repos/{owner}/{repo}/environments/{environment_name}"
-    ],
-    getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"],
-    getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"],
-    getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],
-    getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"],
-    getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"],
-    getOrgRulesets: ["GET /orgs/{org}/rulesets"],
-    getPages: ["GET /repos/{owner}/{repo}/pages"],
-    getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],
-    getPagesDeployment: [
-      "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"
-    ],
-    getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],
-    getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],
-    getPullRequestReviewProtection: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"
-    ],
-    getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"],
-    getReadme: ["GET /repos/{owner}/{repo}/readme"],
-    getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"],
-    getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"],
-    getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],
-    getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"],
-    getRepoRuleSuite: [
-      "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"
-    ],
-    getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"],
-    getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
-    getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"],
-    getStatusChecksProtection: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
-    ],
-    getTeamsWithAccessToProtectedBranch: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"
-    ],
-    getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"],
-    getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"],
-    getUsersWithAccessToProtectedBranch: [
-      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"
-    ],
-    getViews: ["GET /repos/{owner}/{repo}/traffic/views"],
-    getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"],
-    getWebhookConfigForRepo: [
-      "GET /repos/{owner}/{repo}/hooks/{hook_id}/config"
-    ],
-    getWebhookDelivery: [
-      "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"
-    ],
-    listActivities: ["GET /repos/{owner}/{repo}/activity"],
-    listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],
-    listBranches: ["GET /repos/{owner}/{repo}/branches"],
-    listBranchesForHeadCommit: [
-      "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"
-    ],
-    listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"],
-    listCommentsForCommit: [
-      "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"
-    ],
-    listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"],
-    listCommitStatusesForRef: [
-      "GET /repos/{owner}/{repo}/commits/{ref}/statuses"
-    ],
-    listCommits: ["GET /repos/{owner}/{repo}/commits"],
-    listContributors: ["GET /repos/{owner}/{repo}/contributors"],
-    listCustomDeploymentRuleIntegrations: [
-      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"
-    ],
-    listDeployKeys: ["GET /repos/{owner}/{repo}/keys"],
-    listDeploymentBranchPolicies: [
-      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"
-    ],
-    listDeploymentStatuses: [
-      "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"
-    ],
-    listDeployments: ["GET /repos/{owner}/{repo}/deployments"],
-    listForAuthenticatedUser: ["GET /user/repos"],
-    listForOrg: ["GET /orgs/{org}/repos"],
-    listForUser: ["GET /users/{username}/repos"],
-    listForks: ["GET /repos/{owner}/{repo}/forks"],
-    listInvitations: ["GET /repos/{owner}/{repo}/invitations"],
-    listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"],
-    listLanguages: ["GET /repos/{owner}/{repo}/languages"],
-    listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"],
-    listPublic: ["GET /repositories"],
-    listPullRequestsAssociatedWithCommit: [
-      "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"
-    ],
-    listReleaseAssets: [
-      "GET /repos/{owner}/{repo}/releases/{release_id}/assets"
-    ],
-    listReleases: ["GET /repos/{owner}/{repo}/releases"],
-    listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],
-    listTags: ["GET /repos/{owner}/{repo}/tags"],
-    listTeams: ["GET /repos/{owner}/{repo}/teams"],
-    listWebhookDeliveries: [
-      "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"
-    ],
-    listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],
-    merge: ["POST /repos/{owner}/{repo}/merges"],
-    mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],
-    pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],
-    redeliverWebhookDelivery: [
-      "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"
-    ],
-    removeAppAccessRestrictions: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",
-      {},
-      { mapToData: "apps" }
-    ],
-    removeCollaborator: [
-      "DELETE /repos/{owner}/{repo}/collaborators/{username}"
-    ],
-    removeStatusCheckContexts: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",
-      {},
-      { mapToData: "contexts" }
-    ],
-    removeStatusCheckProtection: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
-    ],
-    removeTeamAccessRestrictions: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",
-      {},
-      { mapToData: "teams" }
-    ],
-    removeUserAccessRestrictions: [
-      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",
-      {},
-      { mapToData: "users" }
-    ],
-    renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"],
-    replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"],
-    requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"],
-    setAdminBranchProtection: [
-      "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"
-    ],
-    setAppAccessRestrictions: [
-      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",
-      {},
-      { mapToData: "apps" }
-    ],
-    setStatusCheckContexts: [
-      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",
-      {},
-      { mapToData: "contexts" }
-    ],
-    setTeamAccessRestrictions: [
-      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",
-      {},
-      { mapToData: "teams" }
-    ],
-    setUserAccessRestrictions: [
-      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",
-      {},
-      { mapToData: "users" }
-    ],
-    testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],
-    transfer: ["POST /repos/{owner}/{repo}/transfer"],
-    update: ["PATCH /repos/{owner}/{repo}"],
-    updateBranchProtection: [
-      "PUT /repos/{owner}/{repo}/branches/{branch}/protection"
-    ],
-    updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],
-    updateDeploymentBranchPolicy: [
-      "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"
-    ],
-    updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"],
-    updateInvitation: [
-      "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"
-    ],
-    updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"],
-    updatePullRequestReviewProtection: [
-      "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"
-    ],
-    updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"],
-    updateReleaseAsset: [
-      "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"
-    ],
-    updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
-    updateStatusCheckPotection: [
-      "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",
-      {},
-      { renamed: ["repos", "updateStatusCheckProtection"] }
-    ],
-    updateStatusCheckProtection: [
-      "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
-    ],
-    updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],
-    updateWebhookConfigForRepo: [
-      "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"
-    ],
-    uploadReleaseAsset: [
-      "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",
-      { baseUrl: "https://uploads.github.com" }
-    ]
-  },
-  search: {
-    code: ["GET /search/code"],
-    commits: ["GET /search/commits"],
-    issuesAndPullRequests: ["GET /search/issues"],
-    labels: ["GET /search/labels"],
-    repos: ["GET /search/repositories"],
-    topics: ["GET /search/topics"],
-    users: ["GET /search/users"]
-  },
-  secretScanning: {
-    getAlert: [
-      "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"
-    ],
-    listAlertsForEnterprise: [
-      "GET /enterprises/{enterprise}/secret-scanning/alerts"
-    ],
-    listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],
-    listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],
-    listLocationsForAlert: [
-      "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"
-    ],
-    updateAlert: [
-      "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"
-    ]
-  },
-  securityAdvisories: {
-    createFork: [
-      "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"
-    ],
-    createPrivateVulnerabilityReport: [
-      "POST /repos/{owner}/{repo}/security-advisories/reports"
-    ],
-    createRepositoryAdvisory: [
-      "POST /repos/{owner}/{repo}/security-advisories"
-    ],
-    createRepositoryAdvisoryCveRequest: [
-      "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"
-    ],
-    getGlobalAdvisory: ["GET /advisories/{ghsa_id}"],
-    getRepositoryAdvisory: [
-      "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"
-    ],
-    listGlobalAdvisories: ["GET /advisories"],
-    listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"],
-    listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"],
-    updateRepositoryAdvisory: [
-      "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"
-    ]
-  },
-  teams: {
-    addOrUpdateMembershipForUserInOrg: [
-      "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"
-    ],
-    addOrUpdateProjectPermissionsInOrg: [
-      "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"
-    ],
-    addOrUpdateRepoPermissionsInOrg: [
-      "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
-    ],
-    checkPermissionsForProjectInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"
-    ],
-    checkPermissionsForRepoInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
-    ],
-    create: ["POST /orgs/{org}/teams"],
-    createDiscussionCommentInOrg: [
-      "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"
-    ],
-    createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"],
-    deleteDiscussionCommentInOrg: [
-      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"
-    ],
-    deleteDiscussionInOrg: [
-      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"
-    ],
-    deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"],
-    getByName: ["GET /orgs/{org}/teams/{team_slug}"],
-    getDiscussionCommentInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"
-    ],
-    getDiscussionInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"
-    ],
-    getMembershipForUserInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/memberships/{username}"
-    ],
-    list: ["GET /orgs/{org}/teams"],
-    listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"],
-    listDiscussionCommentsInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"
-    ],
-    listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"],
-    listForAuthenticatedUser: ["GET /user/teams"],
-    listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"],
-    listPendingInvitationsInOrg: [
-      "GET /orgs/{org}/teams/{team_slug}/invitations"
-    ],
-    listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"],
-    listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],
-    removeMembershipForUserInOrg: [
-      "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"
-    ],
-    removeProjectInOrg: [
-      "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"
-    ],
-    removeRepoInOrg: [
-      "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
-    ],
-    updateDiscussionCommentInOrg: [
-      "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"
-    ],
-    updateDiscussionInOrg: [
-      "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"
-    ],
-    updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"]
-  },
-  users: {
-    addEmailForAuthenticated: [
-      "POST /user/emails",
-      {},
-      { renamed: ["users", "addEmailForAuthenticatedUser"] }
-    ],
-    addEmailForAuthenticatedUser: ["POST /user/emails"],
-    addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"],
-    block: ["PUT /user/blocks/{username}"],
-    checkBlocked: ["GET /user/blocks/{username}"],
-    checkFollowingForUser: ["GET /users/{username}/following/{target_user}"],
-    checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"],
-    createGpgKeyForAuthenticated: [
-      "POST /user/gpg_keys",
-      {},
-      { renamed: ["users", "createGpgKeyForAuthenticatedUser"] }
-    ],
-    createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],
-    createPublicSshKeyForAuthenticated: [
-      "POST /user/keys",
-      {},
-      { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] }
-    ],
-    createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
-    createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],
-    deleteEmailForAuthenticated: [
-      "DELETE /user/emails",
-      {},
-      { renamed: ["users", "deleteEmailForAuthenticatedUser"] }
-    ],
-    deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],
-    deleteGpgKeyForAuthenticated: [
-      "DELETE /user/gpg_keys/{gpg_key_id}",
-      {},
-      { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] }
-    ],
-    deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],
-    deletePublicSshKeyForAuthenticated: [
-      "DELETE /user/keys/{key_id}",
-      {},
-      { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] }
-    ],
-    deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],
-    deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"],
-    deleteSshSigningKeyForAuthenticatedUser: [
-      "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"
-    ],
-    follow: ["PUT /user/following/{username}"],
-    getAuthenticated: ["GET /user"],
-    getByUsername: ["GET /users/{username}"],
-    getContextForUser: ["GET /users/{username}/hovercard"],
-    getGpgKeyForAuthenticated: [
-      "GET /user/gpg_keys/{gpg_key_id}",
-      {},
-      { renamed: ["users", "getGpgKeyForAuthenticatedUser"] }
-    ],
-    getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],
-    getPublicSshKeyForAuthenticated: [
-      "GET /user/keys/{key_id}",
-      {},
-      { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] }
-    ],
-    getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],
-    getSshSigningKeyForAuthenticatedUser: [
-      "GET /user/ssh_signing_keys/{ssh_signing_key_id}"
-    ],
-    list: ["GET /users"],
-    listBlockedByAuthenticated: [
-      "GET /user/blocks",
-      {},
-      { renamed: ["users", "listBlockedByAuthenticatedUser"] }
-    ],
-    listBlockedByAuthenticatedUser: ["GET /user/blocks"],
-    listEmailsForAuthenticated: [
-      "GET /user/emails",
-      {},
-      { renamed: ["users", "listEmailsForAuthenticatedUser"] }
-    ],
-    listEmailsForAuthenticatedUser: ["GET /user/emails"],
-    listFollowedByAuthenticated: [
-      "GET /user/following",
-      {},
-      { renamed: ["users", "listFollowedByAuthenticatedUser"] }
-    ],
-    listFollowedByAuthenticatedUser: ["GET /user/following"],
-    listFollowersForAuthenticatedUser: ["GET /user/followers"],
-    listFollowersForUser: ["GET /users/{username}/followers"],
-    listFollowingForUser: ["GET /users/{username}/following"],
-    listGpgKeysForAuthenticated: [
-      "GET /user/gpg_keys",
-      {},
-      { renamed: ["users", "listGpgKeysForAuthenticatedUser"] }
-    ],
-    listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],
-    listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],
-    listPublicEmailsForAuthenticated: [
-      "GET /user/public_emails",
-      {},
-      { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] }
-    ],
-    listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],
-    listPublicKeysForUser: ["GET /users/{username}/keys"],
-    listPublicSshKeysForAuthenticated: [
-      "GET /user/keys",
-      {},
-      { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] }
-    ],
-    listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],
-    listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"],
-    listSocialAccountsForUser: ["GET /users/{username}/social_accounts"],
-    listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"],
-    listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"],
-    setPrimaryEmailVisibilityForAuthenticated: [
-      "PATCH /user/email/visibility",
-      {},
-      { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] }
-    ],
-    setPrimaryEmailVisibilityForAuthenticatedUser: [
-      "PATCH /user/email/visibility"
-    ],
-    unblock: ["DELETE /user/blocks/{username}"],
-    unfollow: ["DELETE /user/following/{username}"],
-    updateAuthenticated: ["PATCH /user"]
-  }
+		    partsMatch(a, b, emptyGSMatch = false) {
+		        let ai = 0;
+		        let bi = 0;
+		        let result = [];
+		        let which = '';
+		        while (ai < a.length && bi < b.length) {
+		            if (a[ai] === b[bi]) {
+		                result.push(which === 'b' ? b[bi] : a[ai]);
+		                ai++;
+		                bi++;
+		            }
+		            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
+		                result.push(a[ai]);
+		                ai++;
+		            }
+		            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
+		                result.push(b[bi]);
+		                bi++;
+		            }
+		            else if (a[ai] === '*' &&
+		                b[bi] &&
+		                (this.options.dot || !b[bi].startsWith('.')) &&
+		                b[bi] !== '**') {
+		                if (which === 'b')
+		                    return false;
+		                which = 'a';
+		                result.push(a[ai]);
+		                ai++;
+		                bi++;
+		            }
+		            else if (b[bi] === '*' &&
+		                a[ai] &&
+		                (this.options.dot || !a[ai].startsWith('.')) &&
+		                a[ai] !== '**') {
+		                if (which === 'a')
+		                    return false;
+		                which = 'b';
+		                result.push(b[bi]);
+		                ai++;
+		                bi++;
+		            }
+		            else {
+		                return false;
+		            }
+		        }
+		        // if we fall out of the loop, it means they two are identical
+		        // as long as their lengths match
+		        return a.length === b.length && result;
+		    }
+		    parseNegate() {
+		        if (this.nonegate)
+		            return;
+		        const pattern = this.pattern;
+		        let negate = false;
+		        let negateOffset = 0;
+		        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
+		            negate = !negate;
+		            negateOffset++;
+		        }
+		        if (negateOffset)
+		            this.pattern = pattern.slice(negateOffset);
+		        this.negate = negate;
+		    }
+		    // set partial to true to test if, for example,
+		    // "/a/b" matches the start of "/*/b/*/d"
+		    // Partial means, if you run out of file before you run
+		    // out of pattern, then that's fine, as long as all
+		    // the parts match.
+		    matchOne(file, pattern, partial = false) {
+		        const options = this.options;
+		        // UNC paths like //?/X:/... can match X:/... and vice versa
+		        // Drive letters in absolute drive or unc paths are always compared
+		        // case-insensitively.
+		        if (this.isWindows) {
+		            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
+		            const fileUNC = !fileDrive &&
+		                file[0] === '' &&
+		                file[1] === '' &&
+		                file[2] === '?' &&
+		                /^[a-z]:$/i.test(file[3]);
+		            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
+		            const patternUNC = !patternDrive &&
+		                pattern[0] === '' &&
+		                pattern[1] === '' &&
+		                pattern[2] === '?' &&
+		                typeof pattern[3] === 'string' &&
+		                /^[a-z]:$/i.test(pattern[3]);
+		            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
+		            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
+		            if (typeof fdi === 'number' && typeof pdi === 'number') {
+		                const [fd, pd] = [file[fdi], pattern[pdi]];
+		                if (fd.toLowerCase() === pd.toLowerCase()) {
+		                    pattern[pdi] = fd;
+		                    if (pdi > fdi) {
+		                        pattern = pattern.slice(pdi);
+		                    }
+		                    else if (fdi > pdi) {
+		                        file = file.slice(fdi);
+		                    }
+		                }
+		            }
+		        }
+		        // resolve and reduce . and .. portions in the file as well.
+		        // dont' need to do the second phase, because it's only one string[]
+		        const { optimizationLevel = 1 } = this.options;
+		        if (optimizationLevel >= 2) {
+		            file = this.levelTwoFileOptimize(file);
+		        }
+		        this.debug('matchOne', this, { file, pattern });
+		        this.debug('matchOne', file.length, pattern.length);
+		        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
+		            this.debug('matchOne loop');
+		            var p = pattern[pi];
+		            var f = file[fi];
+		            this.debug(pattern, p, f);
+		            // should be impossible.
+		            // some invalid regexp stuff in the set.
+		            /* c8 ignore start */
+		            if (p === false) {
+		                return false;
+		            }
+		            /* c8 ignore stop */
+		            if (p === exports$1.GLOBSTAR) {
+		                this.debug('GLOBSTAR', [pattern, p, f]);
+		                // "**"
+		                // a/**/b/**/c would match the following:
+		                // a/b/x/y/z/c
+		                // a/x/y/z/b/c
+		                // a/b/x/b/x/c
+		                // a/b/c
+		                // To do this, take the rest of the pattern after
+		                // the **, and see if it would match the file remainder.
+		                // If so, return success.
+		                // If not, the ** "swallows" a segment, and try again.
+		                // This is recursively awful.
+		                //
+		                // a/**/b/**/c matching a/b/x/y/z/c
+		                // - a matches a
+		                // - doublestar
+		                //   - matchOne(b/x/y/z/c, b/**/c)
+		                //     - b matches b
+		                //     - doublestar
+		                //       - matchOne(x/y/z/c, c) -> no
+		                //       - matchOne(y/z/c, c) -> no
+		                //       - matchOne(z/c, c) -> no
+		                //       - matchOne(c, c) yes, hit
+		                var fr = fi;
+		                var pr = pi + 1;
+		                if (pr === pl) {
+		                    this.debug('** at the end');
+		                    // a ** at the end will just swallow the rest.
+		                    // We have found a match.
+		                    // however, it will not swallow /.x, unless
+		                    // options.dot is set.
+		                    // . and .. are *never* matched by **, for explosively
+		                    // exponential reasons.
+		                    for (; fi < fl; fi++) {
+		                        if (file[fi] === '.' ||
+		                            file[fi] === '..' ||
+		                            (!options.dot && file[fi].charAt(0) === '.'))
+		                            return false;
+		                    }
+		                    return true;
+		                }
+		                // ok, let's see if we can swallow whatever we can.
+		                while (fr < fl) {
+		                    var swallowee = file[fr];
+		                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
+		                    // XXX remove this slice.  Just pass the start index.
+		                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+		                        this.debug('globstar found match!', fr, fl, swallowee);
+		                        // found a match.
+		                        return true;
+		                    }
+		                    else {
+		                        // can't swallow "." or ".." ever.
+		                        // can only swallow ".foo" when explicitly asked.
+		                        if (swallowee === '.' ||
+		                            swallowee === '..' ||
+		                            (!options.dot && swallowee.charAt(0) === '.')) {
+		                            this.debug('dot detected!', file, fr, pattern, pr);
+		                            break;
+		                        }
+		                        // ** swallows a segment, and continue.
+		                        this.debug('globstar swallow a segment, and continue');
+		                        fr++;
+		                    }
+		                }
+		                // no match was found.
+		                // However, in partial mode, we can't say this is necessarily over.
+		                /* c8 ignore start */
+		                if (partial) {
+		                    // ran out of file
+		                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
+		                    if (fr === fl) {
+		                        return true;
+		                    }
+		                }
+		                /* c8 ignore stop */
+		                return false;
+		            }
+		            // something other than **
+		            // non-magic patterns just have to match exactly
+		            // patterns with magic have been turned into regexps.
+		            let hit;
+		            if (typeof p === 'string') {
+		                hit = f === p;
+		                this.debug('string match', p, f, hit);
+		            }
+		            else {
+		                hit = p.test(f);
+		                this.debug('pattern match', p, f, hit);
+		            }
+		            if (!hit)
+		                return false;
+		        }
+		        // Note: ending in / means that we'll get a final ""
+		        // at the end of the pattern.  This can only match a
+		        // corresponding "" at the end of the file.
+		        // If the file ends in /, then it can only match a
+		        // a pattern that ends in /, unless the pattern just
+		        // doesn't have any more for it. But, a/b/ should *not*
+		        // match "a/b/*", even though "" matches against the
+		        // [^/]*? pattern, except in partial mode, where it might
+		        // simply not be reached yet.
+		        // However, a/b/ should still satisfy a/*
+		        // now either we fell off the end of the pattern, or we're done.
+		        if (fi === fl && pi === pl) {
+		            // ran out of pattern and filename at the same time.
+		            // an exact hit!
+		            return true;
+		        }
+		        else if (fi === fl) {
+		            // ran out of file, but still had pattern left.
+		            // this is ok if we're doing the match as part of
+		            // a glob fs traversal.
+		            return partial;
+		        }
+		        else if (pi === pl) {
+		            // ran out of pattern, still have file left.
+		            // this is only acceptable if we're on the very last
+		            // empty segment of a file with a trailing slash.
+		            // a/* should match a/b/
+		            return fi === fl - 1 && file[fi] === '';
+		            /* c8 ignore start */
+		        }
+		        else {
+		            // should be unreachable.
+		            throw new Error('wtf?');
+		        }
+		        /* c8 ignore stop */
+		    }
+		    braceExpand() {
+		        return (0, exports$1.braceExpand)(this.pattern, this.options);
+		    }
+		    parse(pattern) {
+		        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
+		        const options = this.options;
+		        // shortcuts
+		        if (pattern === '**')
+		            return exports$1.GLOBSTAR;
+		        if (pattern === '')
+		            return '';
+		        // far and away, the most common glob pattern parts are
+		        // *, *.*, and *.  Add a fast check method for those.
+		        let m;
+		        let fastTest = null;
+		        if ((m = pattern.match(starRE))) {
+		            fastTest = options.dot ? starTestDot : starTest;
+		        }
+		        else if ((m = pattern.match(starDotExtRE))) {
+		            fastTest = (options.nocase
+		                ? options.dot
+		                    ? starDotExtTestNocaseDot
+		                    : starDotExtTestNocase
+		                : options.dot
+		                    ? starDotExtTestDot
+		                    : starDotExtTest)(m[1]);
+		        }
+		        else if ((m = pattern.match(qmarksRE))) {
+		            fastTest = (options.nocase
+		                ? options.dot
+		                    ? qmarksTestNocaseDot
+		                    : qmarksTestNocase
+		                : options.dot
+		                    ? qmarksTestDot
+		                    : qmarksTest)(m);
+		        }
+		        else if ((m = pattern.match(starDotStarRE))) {
+		            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
+		        }
+		        else if ((m = pattern.match(dotStarRE))) {
+		            fastTest = dotStarTest;
+		        }
+		        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
+		        if (fastTest && typeof re === 'object') {
+		            // Avoids overriding in frozen environments
+		            Reflect.defineProperty(re, 'test', { value: fastTest });
+		        }
+		        return re;
+		    }
+		    makeRe() {
+		        if (this.regexp || this.regexp === false)
+		            return this.regexp;
+		        // at this point, this.set is a 2d array of partial
+		        // pattern strings, or "**".
+		        //
+		        // It's better to use .match().  This function shouldn't
+		        // be used, really, but it's pretty convenient sometimes,
+		        // when you just want to work with a regex.
+		        const set = this.set;
+		        if (!set.length) {
+		            this.regexp = false;
+		            return this.regexp;
+		        }
+		        const options = this.options;
+		        const twoStar = options.noglobstar
+		            ? star
+		            : options.dot
+		                ? twoStarDot
+		                : twoStarNoDot;
+		        const flags = new Set(options.nocase ? ['i'] : []);
+		        // regexpify non-globstar patterns
+		        // if ** is only item, then we just do one twoStar
+		        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
+		        // if ** is last, append (\/twoStar|) to previous
+		        // if ** is in the middle, append (\/|\/twoStar\/) to previous
+		        // then filter out GLOBSTAR symbols
+		        let re = set
+		            .map(pattern => {
+		            const pp = pattern.map(p => {
+		                if (p instanceof RegExp) {
+		                    for (const f of p.flags.split(''))
+		                        flags.add(f);
+		                }
+		                return typeof p === 'string'
+		                    ? regExpEscape(p)
+		                    : p === exports$1.GLOBSTAR
+		                        ? exports$1.GLOBSTAR
+		                        : p._src;
+		            });
+		            pp.forEach((p, i) => {
+		                const next = pp[i + 1];
+		                const prev = pp[i - 1];
+		                if (p !== exports$1.GLOBSTAR || prev === exports$1.GLOBSTAR) {
+		                    return;
+		                }
+		                if (prev === undefined) {
+		                    if (next !== undefined && next !== exports$1.GLOBSTAR) {
+		                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
+		                    }
+		                    else {
+		                        pp[i] = twoStar;
+		                    }
+		                }
+		                else if (next === undefined) {
+		                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
+		                }
+		                else if (next !== exports$1.GLOBSTAR) {
+		                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
+		                    pp[i + 1] = exports$1.GLOBSTAR;
+		                }
+		            });
+		            return pp.filter(p => p !== exports$1.GLOBSTAR).join('/');
+		        })
+		            .join('|');
+		        // need to wrap in parens if we had more than one thing with |,
+		        // otherwise only the first will be anchored to ^ and the last to $
+		        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
+		        // must match entire pattern
+		        // ending in a * or ** will make it less strict.
+		        re = '^' + open + re + close + '$';
+		        // can match anything, as long as it's not this.
+		        if (this.negate)
+		            re = '^(?!' + re + ').+$';
+		        try {
+		            this.regexp = new RegExp(re, [...flags].join(''));
+		            /* c8 ignore start */
+		        }
+		        catch (ex) {
+		            // should be impossible
+		            this.regexp = false;
+		        }
+		        /* c8 ignore stop */
+		        return this.regexp;
+		    }
+		    slashSplit(p) {
+		        // if p starts with // on windows, we preserve that
+		        // so that UNC paths aren't broken.  Otherwise, any number of
+		        // / characters are coalesced into one, unless
+		        // preserveMultipleSlashes is set to true.
+		        if (this.preserveMultipleSlashes) {
+		            return p.split('/');
+		        }
+		        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
+		            // add an extra '' for the one we lose
+		            return ['', ...p.split(/\/+/)];
+		        }
+		        else {
+		            return p.split(/\/+/);
+		        }
+		    }
+		    match(f, partial = this.partial) {
+		        this.debug('match', f, this.pattern);
+		        // short-circuit in the case of busted things.
+		        // comments, etc.
+		        if (this.comment) {
+		            return false;
+		        }
+		        if (this.empty) {
+		            return f === '';
+		        }
+		        if (f === '/' && partial) {
+		            return true;
+		        }
+		        const options = this.options;
+		        // windows: need to use /, not \
+		        if (this.isWindows) {
+		            f = f.split('\\').join('/');
+		        }
+		        // treat the test path as a set of pathparts.
+		        const ff = this.slashSplit(f);
+		        this.debug(this.pattern, 'split', ff);
+		        // just ONE of the pattern sets in this.set needs to match
+		        // in order for it to be valid.  If negating, then just one
+		        // match means that we have failed.
+		        // Either way, return on the first hit.
+		        const set = this.set;
+		        this.debug(this.pattern, 'set', set);
+		        // Find the basename of the path by looking for the last non-empty segment
+		        let filename = ff[ff.length - 1];
+		        if (!filename) {
+		            for (let i = ff.length - 2; !filename && i >= 0; i--) {
+		                filename = ff[i];
+		            }
+		        }
+		        for (let i = 0; i < set.length; i++) {
+		            const pattern = set[i];
+		            let file = ff;
+		            if (options.matchBase && pattern.length === 1) {
+		                file = [filename];
+		            }
+		            const hit = this.matchOne(file, pattern, partial);
+		            if (hit) {
+		                if (options.flipNegate) {
+		                    return true;
+		                }
+		                return !this.negate;
+		            }
+		        }
+		        // didn't get any hits.  this is success if it's a negative
+		        // pattern, failure otherwise.
+		        if (options.flipNegate) {
+		            return false;
+		        }
+		        return this.negate;
+		    }
+		    static defaults(def) {
+		        return exports$1.minimatch.defaults(def).Minimatch;
+		    }
+		}
+		exports$1.Minimatch = Minimatch;
+		/* c8 ignore start */
+		var ast_js_2 = requireAst();
+		Object.defineProperty(exports$1, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
+		var escape_js_2 = require_escape();
+		Object.defineProperty(exports$1, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
+		var unescape_js_2 = require_unescape();
+		Object.defineProperty(exports$1, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
+		/* c8 ignore stop */
+		exports$1.minimatch.AST = ast_js_1.AST;
+		exports$1.minimatch.Minimatch = Minimatch;
+		exports$1.minimatch.escape = escape_js_1.escape;
+		exports$1.minimatch.unescape = unescape_js_1.unescape;
+		
+	} (commonjs$h));
+	return commonjs$h;
+}
+
+var internalPath = {};
+
+var hasRequiredInternalPath;
+
+function requireInternalPath () {
+	if (hasRequiredInternalPath) return internalPath;
+	hasRequiredInternalPath = 1;
+	var __createBinding = (internalPath && internalPath.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (internalPath && internalPath.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (internalPath && internalPath.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __importDefault = (internalPath && internalPath.__importDefault) || function (mod) {
+	    return (mod && mod.__esModule) ? mod : { "default": mod };
+	};
+	Object.defineProperty(internalPath, "__esModule", { value: true });
+	internalPath.Path = void 0;
+	const path = __importStar(require$$1$7);
+	const pathHelper = __importStar(requireInternalPathHelper());
+	const assert_1 = __importDefault(require$$2$1);
+	const IS_WINDOWS = process.platform === 'win32';
+	/**
+	 * Helper class for parsing paths into segments
+	 */
+	class Path {
+	    /**
+	     * Constructs a Path
+	     * @param itemPath Path or array of segments
+	     */
+	    constructor(itemPath) {
+	        this.segments = [];
+	        // String
+	        if (typeof itemPath === 'string') {
+	            (0, assert_1.default)(itemPath, `Parameter 'itemPath' must not be empty`);
+	            // Normalize slashes and trim unnecessary trailing slash
+	            itemPath = pathHelper.safeTrimTrailingSeparator(itemPath);
+	            // Not rooted
+	            if (!pathHelper.hasRoot(itemPath)) {
+	                this.segments = itemPath.split(path.sep);
+	            }
+	            // Rooted
+	            else {
+	                // Add all segments, while not at the root
+	                let remaining = itemPath;
+	                let dir = pathHelper.dirname(remaining);
+	                while (dir !== remaining) {
+	                    // Add the segment
+	                    const basename = path.basename(remaining);
+	                    this.segments.unshift(basename);
+	                    // Truncate the last segment
+	                    remaining = dir;
+	                    dir = pathHelper.dirname(remaining);
+	                }
+	                // Remainder is the root
+	                this.segments.unshift(remaining);
+	            }
+	        }
+	        // Array
+	        else {
+	            // Must not be empty
+	            (0, assert_1.default)(itemPath.length > 0, `Parameter 'itemPath' must not be an empty array`);
+	            // Each segment
+	            for (let i = 0; i < itemPath.length; i++) {
+	                let segment = itemPath[i];
+	                // Must not be empty
+	                (0, assert_1.default)(segment, `Parameter 'itemPath' must not contain any empty segments`);
+	                // Normalize slashes
+	                segment = pathHelper.normalizeSeparators(itemPath[i]);
+	                // Root segment
+	                if (i === 0 && pathHelper.hasRoot(segment)) {
+	                    segment = pathHelper.safeTrimTrailingSeparator(segment);
+	                    (0, assert_1.default)(segment === pathHelper.dirname(segment), `Parameter 'itemPath' root segment contains information for multiple segments`);
+	                    this.segments.push(segment);
+	                }
+	                // All other segments
+	                else {
+	                    // Must not contain slash
+	                    (0, assert_1.default)(!segment.includes(path.sep), `Parameter 'itemPath' contains unexpected path separators`);
+	                    this.segments.push(segment);
+	                }
+	            }
+	        }
+	    }
+	    /**
+	     * Converts the path to it's string representation
+	     */
+	    toString() {
+	        // First segment
+	        let result = this.segments[0];
+	        // All others
+	        let skipSlash = result.endsWith(path.sep) || (IS_WINDOWS && /^[A-Z]:$/i.test(result));
+	        for (let i = 1; i < this.segments.length; i++) {
+	            if (skipSlash) {
+	                skipSlash = false;
+	            }
+	            else {
+	                result += path.sep;
+	            }
+	            result += this.segments[i];
+	        }
+	        return result;
+	    }
+	}
+	internalPath.Path = Path;
+	
+	return internalPath;
+}
+
+var hasRequiredInternalPattern;
+
+function requireInternalPattern () {
+	if (hasRequiredInternalPattern) return internalPattern;
+	hasRequiredInternalPattern = 1;
+	var __createBinding = (internalPattern && internalPattern.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (internalPattern && internalPattern.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (internalPattern && internalPattern.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __importDefault = (internalPattern && internalPattern.__importDefault) || function (mod) {
+	    return (mod && mod.__esModule) ? mod : { "default": mod };
+	};
+	Object.defineProperty(internalPattern, "__esModule", { value: true });
+	internalPattern.Pattern = void 0;
+	const os$1 = __importStar(os);
+	const path = __importStar(require$$1$7);
+	const pathHelper = __importStar(requireInternalPathHelper());
+	const assert_1 = __importDefault(require$$2$1);
+	const minimatch_1 = requireCommonjs$f();
+	const internal_match_kind_1 = requireInternalMatchKind();
+	const internal_path_1 = requireInternalPath();
+	const IS_WINDOWS = process.platform === 'win32';
+	class Pattern {
+	    constructor(patternOrNegate, isImplicitPattern = false, segments, homedir) {
+	        /**
+	         * Indicates whether matches should be excluded from the result set
+	         */
+	        this.negate = false;
+	        // Pattern overload
+	        let pattern;
+	        if (typeof patternOrNegate === 'string') {
+	            pattern = patternOrNegate.trim();
+	        }
+	        // Segments overload
+	        else {
+	            // Convert to pattern
+	            segments = segments || [];
+	            (0, assert_1.default)(segments.length, `Parameter 'segments' must not empty`);
+	            const root = Pattern.getLiteral(segments[0]);
+	            (0, assert_1.default)(root && pathHelper.hasAbsoluteRoot(root), `Parameter 'segments' first element must be a root path`);
+	            pattern = new internal_path_1.Path(segments).toString().trim();
+	            if (patternOrNegate) {
+	                pattern = `!${pattern}`;
+	            }
+	        }
+	        // Negate
+	        while (pattern.startsWith('!')) {
+	            this.negate = !this.negate;
+	            pattern = pattern.substr(1).trim();
+	        }
+	        // Normalize slashes and ensures absolute root
+	        pattern = Pattern.fixupPattern(pattern, homedir);
+	        // Segments
+	        this.segments = new internal_path_1.Path(pattern).segments;
+	        // Trailing slash indicates the pattern should only match directories, not regular files
+	        this.trailingSeparator = pathHelper
+	            .normalizeSeparators(pattern)
+	            .endsWith(path.sep);
+	        pattern = pathHelper.safeTrimTrailingSeparator(pattern);
+	        // Search path (literal path prior to the first glob segment)
+	        let foundGlob = false;
+	        const searchSegments = this.segments
+	            .map(x => Pattern.getLiteral(x))
+	            .filter(x => !foundGlob && !(foundGlob = x === ''));
+	        this.searchPath = new internal_path_1.Path(searchSegments).toString();
+	        // Root RegExp (required when determining partial match)
+	        this.rootRegExp = new RegExp(Pattern.regExpEscape(searchSegments[0]), IS_WINDOWS ? 'i' : '');
+	        this.isImplicitPattern = isImplicitPattern;
+	        // Create minimatch
+	        const minimatchOptions = {
+	            dot: true,
+	            nobrace: true,
+	            nocase: IS_WINDOWS,
+	            nocomment: true,
+	            noext: true,
+	            nonegate: true
+	        };
+	        pattern = IS_WINDOWS ? pattern.replace(/\\/g, '/') : pattern;
+	        this.minimatch = new minimatch_1.Minimatch(pattern, minimatchOptions);
+	    }
+	    /**
+	     * Matches the pattern against the specified path
+	     */
+	    match(itemPath) {
+	        // Last segment is globstar?
+	        if (this.segments[this.segments.length - 1] === '**') {
+	            // Normalize slashes
+	            itemPath = pathHelper.normalizeSeparators(itemPath);
+	            // Append a trailing slash. Otherwise Minimatch will not match the directory immediately
+	            // preceding the globstar. For example, given the pattern `/foo/**`, Minimatch returns
+	            // false for `/foo` but returns true for `/foo/`. Append a trailing slash to handle that quirk.
+	            if (!itemPath.endsWith(path.sep) && this.isImplicitPattern === false) {
+	                // Note, this is safe because the constructor ensures the pattern has an absolute root.
+	                // For example, formats like C: and C:foo on Windows are resolved to an absolute root.
+	                itemPath = `${itemPath}${path.sep}`;
+	            }
+	        }
+	        else {
+	            // Normalize slashes and trim unnecessary trailing slash
+	            itemPath = pathHelper.safeTrimTrailingSeparator(itemPath);
+	        }
+	        // Match
+	        if (this.minimatch.match(itemPath)) {
+	            return this.trailingSeparator ? internal_match_kind_1.MatchKind.Directory : internal_match_kind_1.MatchKind.All;
+	        }
+	        return internal_match_kind_1.MatchKind.None;
+	    }
+	    /**
+	     * Indicates whether the pattern may match descendants of the specified path
+	     */
+	    partialMatch(itemPath) {
+	        // Normalize slashes and trim unnecessary trailing slash
+	        itemPath = pathHelper.safeTrimTrailingSeparator(itemPath);
+	        // matchOne does not handle root path correctly
+	        if (pathHelper.dirname(itemPath) === itemPath) {
+	            return this.rootRegExp.test(itemPath);
+	        }
+	        return this.minimatch.matchOne(itemPath.split(IS_WINDOWS ? /\\+/ : /\/+/), this.minimatch.set[0], true);
+	    }
+	    /**
+	     * Escapes glob patterns within a path
+	     */
+	    static globEscape(s) {
+	        return (IS_WINDOWS ? s : s.replace(/\\/g, '\\\\')) // escape '\' on Linux/macOS
+	            .replace(/(\[)(?=[^/]+\])/g, '[[]') // escape '[' when ']' follows within the path segment
+	            .replace(/\?/g, '[?]') // escape '?'
+	            .replace(/\*/g, '[*]'); // escape '*'
+	    }
+	    /**
+	     * Normalizes slashes and ensures absolute root
+	     */
+	    static fixupPattern(pattern, homedir) {
+	        // Empty
+	        (0, assert_1.default)(pattern, 'pattern cannot be empty');
+	        // Must not contain `.` segment, unless first segment
+	        // Must not contain `..` segment
+	        const literalSegments = new internal_path_1.Path(pattern).segments.map(x => Pattern.getLiteral(x));
+	        (0, assert_1.default)(literalSegments.every((x, i) => (x !== '.' || i === 0) && x !== '..'), `Invalid pattern '${pattern}'. Relative pathing '.' and '..' is not allowed.`);
+	        // Must not contain globs in root, e.g. Windows UNC path \\foo\b*r
+	        (0, assert_1.default)(!pathHelper.hasRoot(pattern) || literalSegments[0], `Invalid pattern '${pattern}'. Root segment must not contain globs.`);
+	        // Normalize slashes
+	        pattern = pathHelper.normalizeSeparators(pattern);
+	        // Replace leading `.` segment
+	        if (pattern === '.' || pattern.startsWith(`.${path.sep}`)) {
+	            pattern = Pattern.globEscape(process.cwd()) + pattern.substr(1);
+	        }
+	        // Replace leading `~` segment
+	        else if (pattern === '~' || pattern.startsWith(`~${path.sep}`)) {
+	            homedir = homedir || os$1.homedir();
+	            (0, assert_1.default)(homedir, 'Unable to determine HOME directory');
+	            (0, assert_1.default)(pathHelper.hasAbsoluteRoot(homedir), `Expected HOME directory to be a rooted path. Actual '${homedir}'`);
+	            pattern = Pattern.globEscape(homedir) + pattern.substr(1);
+	        }
+	        // Replace relative drive root, e.g. pattern is C: or C:foo
+	        else if (IS_WINDOWS &&
+	            (pattern.match(/^[A-Z]:$/i) || pattern.match(/^[A-Z]:[^\\]/i))) {
+	            let root = pathHelper.ensureAbsoluteRoot('C:\\dummy-root', pattern.substr(0, 2));
+	            if (pattern.length > 2 && !root.endsWith('\\')) {
+	                root += '\\';
+	            }
+	            pattern = Pattern.globEscape(root) + pattern.substr(2);
+	        }
+	        // Replace relative root, e.g. pattern is \ or \foo
+	        else if (IS_WINDOWS && (pattern === '\\' || pattern.match(/^\\[^\\]/))) {
+	            let root = pathHelper.ensureAbsoluteRoot('C:\\dummy-root', '\\');
+	            if (!root.endsWith('\\')) {
+	                root += '\\';
+	            }
+	            pattern = Pattern.globEscape(root) + pattern.substr(1);
+	        }
+	        // Otherwise ensure absolute root
+	        else {
+	            pattern = pathHelper.ensureAbsoluteRoot(Pattern.globEscape(process.cwd()), pattern);
+	        }
+	        return pathHelper.normalizeSeparators(pattern);
+	    }
+	    /**
+	     * Attempts to unescape a pattern segment to create a literal path segment.
+	     * Otherwise returns empty string.
+	     */
+	    static getLiteral(segment) {
+	        let literal = '';
+	        for (let i = 0; i < segment.length; i++) {
+	            const c = segment[i];
+	            // Escape
+	            if (c === '\\' && !IS_WINDOWS && i + 1 < segment.length) {
+	                literal += segment[++i];
+	                continue;
+	            }
+	            // Wildcard
+	            else if (c === '*' || c === '?') {
+	                return '';
+	            }
+	            // Character set
+	            else if (c === '[' && i + 1 < segment.length) {
+	                let set = '';
+	                let closed = -1;
+	                for (let i2 = i + 1; i2 < segment.length; i2++) {
+	                    const c2 = segment[i2];
+	                    // Escape
+	                    if (c2 === '\\' && !IS_WINDOWS && i2 + 1 < segment.length) {
+	                        set += segment[++i2];
+	                        continue;
+	                    }
+	                    // Closed
+	                    else if (c2 === ']') {
+	                        closed = i2;
+	                        break;
+	                    }
+	                    // Otherwise
+	                    else {
+	                        set += c2;
+	                    }
+	                }
+	                // Closed?
+	                if (closed >= 0) {
+	                    // Cannot convert
+	                    if (set.length > 1) {
+	                        return '';
+	                    }
+	                    // Convert to literal
+	                    if (set) {
+	                        literal += set;
+	                        i = closed;
+	                        continue;
+	                    }
+	                }
+	                // Otherwise fall thru
+	            }
+	            // Append
+	            literal += c;
+	        }
+	        return literal;
+	    }
+	    /**
+	     * Escapes regexp special characters
+	     * https://javascript.info/regexp-escaping
+	     */
+	    static regExpEscape(s) {
+	        return s.replace(/[[\\^$.|?*+()]/g, '\\$&');
+	    }
+	}
+	internalPattern.Pattern = Pattern;
+	
+	return internalPattern;
+}
+
+var internalSearchState = {};
+
+var hasRequiredInternalSearchState;
+
+function requireInternalSearchState () {
+	if (hasRequiredInternalSearchState) return internalSearchState;
+	hasRequiredInternalSearchState = 1;
+	Object.defineProperty(internalSearchState, "__esModule", { value: true });
+	internalSearchState.SearchState = void 0;
+	class SearchState {
+	    constructor(path, level) {
+	        this.path = path;
+	        this.level = level;
+	    }
+	}
+	internalSearchState.SearchState = SearchState;
+	
+	return internalSearchState;
+}
+
+var hasRequiredInternalGlobber;
+
+function requireInternalGlobber () {
+	if (hasRequiredInternalGlobber) return internalGlobber;
+	hasRequiredInternalGlobber = 1;
+	var __createBinding = (internalGlobber && internalGlobber.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (internalGlobber && internalGlobber.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (internalGlobber && internalGlobber.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (internalGlobber && internalGlobber.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	var __asyncValues = (internalGlobber && internalGlobber.__asyncValues) || function (o) {
+	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+	    var m = o[Symbol.asyncIterator], i;
+	    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+	    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+	    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+	};
+	var __await = (internalGlobber && internalGlobber.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); };
+	var __asyncGenerator = (internalGlobber && internalGlobber.__asyncGenerator) || function (thisArg, _arguments, generator) {
+	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+	    var g = generator.apply(thisArg, _arguments || []), i, q = [];
+	    return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
+	    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
+	    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
+	    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
+	    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
+	    function fulfill(value) { resume("next", value); }
+	    function reject(value) { resume("throw", value); }
+	    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
+	};
+	Object.defineProperty(internalGlobber, "__esModule", { value: true });
+	internalGlobber.DefaultGlobber = void 0;
+	const core = __importStar(requireCore());
+	const fs = __importStar(fs__default);
+	const globOptionsHelper = __importStar(requireInternalGlobOptionsHelper());
+	const path = __importStar(require$$1$7);
+	const patternHelper = __importStar(requireInternalPatternHelper());
+	const internal_match_kind_1 = requireInternalMatchKind();
+	const internal_pattern_1 = requireInternalPattern();
+	const internal_search_state_1 = requireInternalSearchState();
+	const IS_WINDOWS = process.platform === 'win32';
+	class DefaultGlobber {
+	    constructor(options) {
+	        this.patterns = [];
+	        this.searchPaths = [];
+	        this.options = globOptionsHelper.getOptions(options);
+	    }
+	    getSearchPaths() {
+	        // Return a copy
+	        return this.searchPaths.slice();
+	    }
+	    glob() {
+	        return __awaiter(this, void 0, void 0, function* () {
+	            var _a, e_1, _b, _c;
+	            const result = [];
+	            try {
+	                for (var _d = true, _e = __asyncValues(this.globGenerator()), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
+	                    _c = _f.value;
+	                    _d = false;
+	                    const itemPath = _c;
+	                    result.push(itemPath);
+	                }
+	            }
+	            catch (e_1_1) { e_1 = { error: e_1_1 }; }
+	            finally {
+	                try {
+	                    if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
+	                }
+	                finally { if (e_1) throw e_1.error; }
+	            }
+	            return result;
+	        });
+	    }
+	    globGenerator() {
+	        return __asyncGenerator(this, arguments, function* globGenerator_1() {
+	            // Fill in defaults options
+	            const options = globOptionsHelper.getOptions(this.options);
+	            // Implicit descendants?
+	            const patterns = [];
+	            for (const pattern of this.patterns) {
+	                patterns.push(pattern);
+	                if (options.implicitDescendants &&
+	                    (pattern.trailingSeparator ||
+	                        pattern.segments[pattern.segments.length - 1] !== '**')) {
+	                    patterns.push(new internal_pattern_1.Pattern(pattern.negate, true, pattern.segments.concat('**')));
+	                }
+	            }
+	            // Push the search paths
+	            const stack = [];
+	            for (const searchPath of patternHelper.getSearchPaths(patterns)) {
+	                core.debug(`Search path '${searchPath}'`);
+	                // Exists?
+	                try {
+	                    // Intentionally using lstat. Detection for broken symlink
+	                    // will be performed later (if following symlinks).
+	                    yield __await(fs.promises.lstat(searchPath));
+	                }
+	                catch (err) {
+	                    if (err.code === 'ENOENT') {
+	                        continue;
+	                    }
+	                    throw err;
+	                }
+	                stack.unshift(new internal_search_state_1.SearchState(searchPath, 1));
+	            }
+	            // Search
+	            const traversalChain = []; // used to detect cycles
+	            while (stack.length) {
+	                // Pop
+	                const item = stack.pop();
+	                // Match?
+	                const match = patternHelper.match(patterns, item.path);
+	                const partialMatch = !!match || patternHelper.partialMatch(patterns, item.path);
+	                if (!match && !partialMatch) {
+	                    continue;
+	                }
+	                // Stat
+	                const stats = yield __await(DefaultGlobber.stat(item, options, traversalChain)
+	                // Broken symlink, or symlink cycle detected, or no longer exists
+	                );
+	                // Broken symlink, or symlink cycle detected, or no longer exists
+	                if (!stats) {
+	                    continue;
+	                }
+	                // Hidden file or directory?
+	                if (options.excludeHiddenFiles && path.basename(item.path).match(/^\./)) {
+	                    continue;
+	                }
+	                // Directory
+	                if (stats.isDirectory()) {
+	                    // Matched
+	                    if (match & internal_match_kind_1.MatchKind.Directory && options.matchDirectories) {
+	                        yield yield __await(item.path);
+	                    }
+	                    // Descend?
+	                    else if (!partialMatch) {
+	                        continue;
+	                    }
+	                    // Push the child items in reverse
+	                    const childLevel = item.level + 1;
+	                    const childItems = (yield __await(fs.promises.readdir(item.path))).map(x => new internal_search_state_1.SearchState(path.join(item.path, x), childLevel));
+	                    stack.push(...childItems.reverse());
+	                }
+	                // File
+	                else if (match & internal_match_kind_1.MatchKind.File) {
+	                    yield yield __await(item.path);
+	                }
+	            }
+	        });
+	    }
+	    /**
+	     * Constructs a DefaultGlobber
+	     */
+	    static create(patterns, options) {
+	        return __awaiter(this, void 0, void 0, function* () {
+	            const result = new DefaultGlobber(options);
+	            if (IS_WINDOWS) {
+	                patterns = patterns.replace(/\r\n/g, '\n');
+	                patterns = patterns.replace(/\r/g, '\n');
+	            }
+	            const lines = patterns.split('\n').map(x => x.trim());
+	            for (const line of lines) {
+	                // Empty or comment
+	                if (!line || line.startsWith('#')) {
+	                    continue;
+	                }
+	                // Pattern
+	                else {
+	                    result.patterns.push(new internal_pattern_1.Pattern(line));
+	                }
+	            }
+	            result.searchPaths.push(...patternHelper.getSearchPaths(result.patterns));
+	            return result;
+	        });
+	    }
+	    static stat(item, options, traversalChain) {
+	        return __awaiter(this, void 0, void 0, function* () {
+	            // Note:
+	            // `stat` returns info about the target of a symlink (or symlink chain)
+	            // `lstat` returns info about a symlink itself
+	            let stats;
+	            if (options.followSymbolicLinks) {
+	                try {
+	                    // Use `stat` (following symlinks)
+	                    stats = yield fs.promises.stat(item.path);
+	                }
+	                catch (err) {
+	                    if (err.code === 'ENOENT') {
+	                        if (options.omitBrokenSymbolicLinks) {
+	                            core.debug(`Broken symlink '${item.path}'`);
+	                            return undefined;
+	                        }
+	                        throw new Error(`No information found for the path '${item.path}'. This may indicate a broken symbolic link.`);
+	                    }
+	                    throw err;
+	                }
+	            }
+	            else {
+	                // Use `lstat` (not following symlinks)
+	                stats = yield fs.promises.lstat(item.path);
+	            }
+	            // Note, isDirectory() returns false for the lstat of a symlink
+	            if (stats.isDirectory() && options.followSymbolicLinks) {
+	                // Get the realpath
+	                const realPath = yield fs.promises.realpath(item.path);
+	                // Fixup the traversal chain to match the item level
+	                while (traversalChain.length >= item.level) {
+	                    traversalChain.pop();
+	                }
+	                // Test for a cycle
+	                if (traversalChain.some((x) => x === realPath)) {
+	                    core.debug(`Symlink cycle detected for path '${item.path}' and realpath '${realPath}'`);
+	                    return undefined;
+	                }
+	                // Update the traversal chain
+	                traversalChain.push(realPath);
+	            }
+	            return stats;
+	        });
+	    }
+	}
+	internalGlobber.DefaultGlobber = DefaultGlobber;
+	
+	return internalGlobber;
+}
+
+var internalHashFiles = {};
+
+var hasRequiredInternalHashFiles;
+
+function requireInternalHashFiles () {
+	if (hasRequiredInternalHashFiles) return internalHashFiles;
+	hasRequiredInternalHashFiles = 1;
+	var __createBinding = (internalHashFiles && internalHashFiles.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (internalHashFiles && internalHashFiles.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (internalHashFiles && internalHashFiles.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (internalHashFiles && internalHashFiles.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	var __asyncValues = (internalHashFiles && internalHashFiles.__asyncValues) || function (o) {
+	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+	    var m = o[Symbol.asyncIterator], i;
+	    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+	    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+	    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+	};
+	Object.defineProperty(internalHashFiles, "__esModule", { value: true });
+	internalHashFiles.hashFiles = hashFiles;
+	const crypto = __importStar(require$$0$3);
+	const core = __importStar(requireCore());
+	const fs = __importStar(fs__default);
+	const stream = __importStar(require$$3$1);
+	const util = __importStar(require$$6);
+	const path = __importStar(require$$1$7);
+	function hashFiles(globber_1, currentWorkspace_1) {
+	    return __awaiter(this, arguments, void 0, function* (globber, currentWorkspace, verbose = false) {
+	        var _a, e_1, _b, _c;
+	        var _d;
+	        const writeDelegate = verbose ? core.info : core.debug;
+	        let hasMatch = false;
+	        const githubWorkspace = currentWorkspace
+	            ? currentWorkspace
+	            : ((_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd());
+	        const result = crypto.createHash('sha256');
+	        let count = 0;
+	        try {
+	            for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
+	                _c = _g.value;
+	                _e = false;
+	                const file = _c;
+	                writeDelegate(file);
+	                if (!file.startsWith(`${githubWorkspace}${path.sep}`)) {
+	                    writeDelegate(`Ignore '${file}' since it is not under GITHUB_WORKSPACE.`);
+	                    continue;
+	                }
+	                if (fs.statSync(file).isDirectory()) {
+	                    writeDelegate(`Skip directory '${file}'.`);
+	                    continue;
+	                }
+	                const hash = crypto.createHash('sha256');
+	                const pipeline = util.promisify(stream.pipeline);
+	                yield pipeline(fs.createReadStream(file), hash);
+	                result.write(hash.digest());
+	                count++;
+	                if (!hasMatch) {
+	                    hasMatch = true;
+	                }
+	            }
+	        }
+	        catch (e_1_1) { e_1 = { error: e_1_1 }; }
+	        finally {
+	            try {
+	                if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);
+	            }
+	            finally { if (e_1) throw e_1.error; }
+	        }
+	        result.end();
+	        if (hasMatch) {
+	            writeDelegate(`Found ${count} files to hash.`);
+	            return result.digest('hex');
+	        }
+	        else {
+	            writeDelegate(`No matches found for glob`);
+	            return '';
+	        }
+	    });
+	}
+	
+	return internalHashFiles;
+}
+
+var hasRequiredGlob;
+
+function requireGlob () {
+	if (hasRequiredGlob) return glob;
+	hasRequiredGlob = 1;
+	var __awaiter = (glob && glob.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(glob, "__esModule", { value: true });
+	glob.create = create;
+	glob.hashFiles = hashFiles;
+	const internal_globber_1 = requireInternalGlobber();
+	const internal_hash_files_1 = requireInternalHashFiles();
+	/**
+	 * Constructs a globber
+	 *
+	 * @param patterns  Patterns separated by newlines
+	 * @param options   Glob options
+	 */
+	function create(patterns, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        return yield internal_globber_1.DefaultGlobber.create(patterns, options);
+	    });
+	}
+	/**
+	 * Computes the sha256 hash of a glob
+	 *
+	 * @param patterns  Patterns separated by newlines
+	 * @param currentWorkspace  Workspace used when matching files
+	 * @param options   Glob options
+	 * @param verbose   Enables verbose logging
+	 */
+	function hashFiles(patterns_1) {
+	    return __awaiter(this, arguments, void 0, function* (patterns, currentWorkspace = '', options, verbose = false) {
+	        let followSymbolicLinks = true;
+	        if (options && typeof options.followSymbolicLinks === 'boolean') {
+	            followSymbolicLinks = options.followSymbolicLinks;
+	        }
+	        const globber = yield create(patterns, { followSymbolicLinks });
+	        return (0, internal_hash_files_1.hashFiles)(globber, currentWorkspace, verbose);
+	    });
+	}
+	
+	return glob;
+}
+
+var semver$3 = {exports: {}};
+
+var hasRequiredSemver$3;
+
+function requireSemver$3 () {
+	if (hasRequiredSemver$3) return semver$3.exports;
+	hasRequiredSemver$3 = 1;
+	(function (module, exports$1) {
+		exports$1 = module.exports = SemVer;
+
+		var debug;
+		/* istanbul ignore next */
+		if (typeof process === 'object' &&
+		    process.env &&
+		    process.env.NODE_DEBUG &&
+		    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
+		  debug = function () {
+		    var args = Array.prototype.slice.call(arguments, 0);
+		    args.unshift('SEMVER');
+		    console.log.apply(console, args);
+		  };
+		} else {
+		  debug = function () {};
+		}
+
+		// Note: this is the semver.org version of the spec that it implements
+		// Not necessarily the package version of this code.
+		exports$1.SEMVER_SPEC_VERSION = '2.0.0';
+
+		var MAX_LENGTH = 256;
+		var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
+		  /* istanbul ignore next */ 9007199254740991;
+
+		// Max safe segment length for coercion.
+		var MAX_SAFE_COMPONENT_LENGTH = 16;
+
+		var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
+
+		// The actual regexps go on exports.re
+		var re = exports$1.re = [];
+		var safeRe = exports$1.safeRe = [];
+		var src = exports$1.src = [];
+		var t = exports$1.tokens = {};
+		var R = 0;
+
+		function tok (n) {
+		  t[n] = R++;
+		}
+
+		var LETTERDASHNUMBER = '[a-zA-Z0-9-]';
+
+		// Replace some greedy regex tokens to prevent regex dos issues. These regex are
+		// used internally via the safeRe object since all inputs in this library get
+		// normalized first to trim and collapse all extra whitespace. The original
+		// regexes are exported for userland consumption and lower level usage. A
+		// future breaking change could export the safer regex only with a note that
+		// all input should have extra whitespace removed.
+		var safeRegexReplacements = [
+		  ['\\s', 1],
+		  ['\\d', MAX_LENGTH],
+		  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
+		];
+
+		function makeSafeRe (value) {
+		  for (var i = 0; i < safeRegexReplacements.length; i++) {
+		    var token = safeRegexReplacements[i][0];
+		    var max = safeRegexReplacements[i][1];
+		    value = value
+		      .split(token + '*').join(token + '{0,' + max + '}')
+		      .split(token + '+').join(token + '{1,' + max + '}');
+		  }
+		  return value
+		}
+
+		// The following Regular Expressions can be used for tokenizing,
+		// validating, and parsing SemVer version strings.
+
+		// ## Numeric Identifier
+		// A single `0`, or a non-zero digit followed by zero or more digits.
+
+		tok('NUMERICIDENTIFIER');
+		src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*';
+		tok('NUMERICIDENTIFIERLOOSE');
+		src[t.NUMERICIDENTIFIERLOOSE] = '\\d+';
+
+		// ## Non-numeric Identifier
+		// Zero or more digits, followed by a letter or hyphen, and then zero or
+		// more letters, digits, or hyphens.
+
+		tok('NONNUMERICIDENTIFIER');
+		src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*';
+
+		// ## Main Version
+		// Three dot-separated numeric identifiers.
+
+		tok('MAINVERSION');
+		src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
+		                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
+		                   '(' + src[t.NUMERICIDENTIFIER] + ')';
+
+		tok('MAINVERSIONLOOSE');
+		src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
+		                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
+		                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')';
+
+		// ## Pre-release Version Identifier
+		// A numeric identifier, or a non-numeric identifier.
+
+		tok('PRERELEASEIDENTIFIER');
+		src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
+		                            '|' + src[t.NONNUMERICIDENTIFIER] + ')';
+
+		tok('PRERELEASEIDENTIFIERLOOSE');
+		src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
+		                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')';
+
+		// ## Pre-release Version
+		// Hyphen, followed by one or more dot-separated pre-release version
+		// identifiers.
+
+		tok('PRERELEASE');
+		src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
+		                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))';
+
+		tok('PRERELEASELOOSE');
+		src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
+		                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))';
+
+		// ## Build Metadata Identifier
+		// Any combination of digits, letters, or hyphens.
+
+		tok('BUILDIDENTIFIER');
+		src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+';
+
+		// ## Build Metadata
+		// Plus sign, followed by one or more period-separated build metadata
+		// identifiers.
+
+		tok('BUILD');
+		src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] +
+		             '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))';
+
+		// ## Full Version String
+		// A main version, followed optionally by a pre-release version and
+		// build metadata.
+
+		// Note that the only major, minor, patch, and pre-release sections of
+		// the version string are capturing groups.  The build metadata is not a
+		// capturing group, because it should not ever be used in version
+		// comparison.
+
+		tok('FULL');
+		tok('FULLPLAIN');
+		src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
+		                  src[t.PRERELEASE] + '?' +
+		                  src[t.BUILD] + '?';
+
+		src[t.FULL] = '^' + src[t.FULLPLAIN] + '$';
+
+		// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
+		// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
+		// common in the npm registry.
+		tok('LOOSEPLAIN');
+		src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
+		                  src[t.PRERELEASELOOSE] + '?' +
+		                  src[t.BUILD] + '?';
+
+		tok('LOOSE');
+		src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$';
+
+		tok('GTLT');
+		src[t.GTLT] = '((?:<|>)?=?)';
+
+		// Something like "2.*" or "1.2.x".
+		// Note that "x.x" is a valid xRange identifer, meaning "any version"
+		// Only the first item is strictly required.
+		tok('XRANGEIDENTIFIERLOOSE');
+		src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
+		tok('XRANGEIDENTIFIER');
+		src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*';
+
+		tok('XRANGEPLAIN');
+		src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
+		                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
+		                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
+		                   '(?:' + src[t.PRERELEASE] + ')?' +
+		                   src[t.BUILD] + '?' +
+		                   ')?)?';
+
+		tok('XRANGEPLAINLOOSE');
+		src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
+		                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
+		                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
+		                        '(?:' + src[t.PRERELEASELOOSE] + ')?' +
+		                        src[t.BUILD] + '?' +
+		                        ')?)?';
+
+		tok('XRANGE');
+		src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$';
+		tok('XRANGELOOSE');
+		src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$';
+
+		// Coercion.
+		// Extract anything that could conceivably be a part of a valid semver
+		tok('COERCE');
+		src[t.COERCE] = '(^|[^\\d])' +
+		              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
+		              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
+		              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
+		              '(?:$|[^\\d])';
+		tok('COERCERTL');
+		re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g');
+		safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g');
+
+		// Tilde ranges.
+		// Meaning is "reasonably at or greater than"
+		tok('LONETILDE');
+		src[t.LONETILDE] = '(?:~>?)';
+
+		tok('TILDETRIM');
+		src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+';
+		re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g');
+		safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g');
+		var tildeTrimReplace = '$1~';
+
+		tok('TILDE');
+		src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$';
+		tok('TILDELOOSE');
+		src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$';
+
+		// Caret ranges.
+		// Meaning is "at least and backwards compatible with"
+		tok('LONECARET');
+		src[t.LONECARET] = '(?:\\^)';
+
+		tok('CARETTRIM');
+		src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+';
+		re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g');
+		safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g');
+		var caretTrimReplace = '$1^';
+
+		tok('CARET');
+		src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$';
+		tok('CARETLOOSE');
+		src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$';
+
+		// A simple gt/lt/eq thing, or just "" to indicate "any version"
+		tok('COMPARATORLOOSE');
+		src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$';
+		tok('COMPARATOR');
+		src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$';
+
+		// An expression to strip any whitespace between the gtlt and the thing
+		// it modifies, so that `> 1.2.3` ==> `>1.2.3`
+		tok('COMPARATORTRIM');
+		src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
+		                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')';
+
+		// this one has to use the /g flag
+		re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g');
+		safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g');
+		var comparatorTrimReplace = '$1$2$3';
+
+		// Something like `1.2.3 - 1.2.4`
+		// Note that these all use the loose form, because they'll be
+		// checked against either the strict or loose comparator form
+		// later.
+		tok('HYPHENRANGE');
+		src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
+		                   '\\s+-\\s+' +
+		                   '(' + src[t.XRANGEPLAIN] + ')' +
+		                   '\\s*$';
+
+		tok('HYPHENRANGELOOSE');
+		src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
+		                        '\\s+-\\s+' +
+		                        '(' + src[t.XRANGEPLAINLOOSE] + ')' +
+		                        '\\s*$';
+
+		// Star ranges basically just allow anything at all.
+		tok('STAR');
+		src[t.STAR] = '(<|>)?=?\\s*\\*';
+
+		// Compile to actual regexp objects.
+		// All are flag-free, unless they were created above with a flag.
+		for (var i = 0; i < R; i++) {
+		  debug(i, src[i]);
+		  if (!re[i]) {
+		    re[i] = new RegExp(src[i]);
+
+		    // Replace all greedy whitespace to prevent regex dos issues. These regex are
+		    // used internally via the safeRe object since all inputs in this library get
+		    // normalized first to trim and collapse all extra whitespace. The original
+		    // regexes are exported for userland consumption and lower level usage. A
+		    // future breaking change could export the safer regex only with a note that
+		    // all input should have extra whitespace removed.
+		    safeRe[i] = new RegExp(makeSafeRe(src[i]));
+		  }
+		}
+
+		exports$1.parse = parse;
+		function parse (version, options) {
+		  if (!options || typeof options !== 'object') {
+		    options = {
+		      loose: !!options,
+		      includePrerelease: false
+		    };
+		  }
+
+		  if (version instanceof SemVer) {
+		    return version
+		  }
+
+		  if (typeof version !== 'string') {
+		    return null
+		  }
+
+		  if (version.length > MAX_LENGTH) {
+		    return null
+		  }
+
+		  var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL];
+		  if (!r.test(version)) {
+		    return null
+		  }
+
+		  try {
+		    return new SemVer(version, options)
+		  } catch (er) {
+		    return null
+		  }
+		}
+
+		exports$1.valid = valid;
+		function valid (version, options) {
+		  var v = parse(version, options);
+		  return v ? v.version : null
+		}
+
+		exports$1.clean = clean;
+		function clean (version, options) {
+		  var s = parse(version.trim().replace(/^[=v]+/, ''), options);
+		  return s ? s.version : null
+		}
+
+		exports$1.SemVer = SemVer;
+
+		function SemVer (version, options) {
+		  if (!options || typeof options !== 'object') {
+		    options = {
+		      loose: !!options,
+		      includePrerelease: false
+		    };
+		  }
+		  if (version instanceof SemVer) {
+		    if (version.loose === options.loose) {
+		      return version
+		    } else {
+		      version = version.version;
+		    }
+		  } else if (typeof version !== 'string') {
+		    throw new TypeError('Invalid Version: ' + version)
+		  }
+
+		  if (version.length > MAX_LENGTH) {
+		    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
+		  }
+
+		  if (!(this instanceof SemVer)) {
+		    return new SemVer(version, options)
+		  }
+
+		  debug('SemVer', version, options);
+		  this.options = options;
+		  this.loose = !!options.loose;
+
+		  var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]);
+
+		  if (!m) {
+		    throw new TypeError('Invalid Version: ' + version)
+		  }
+
+		  this.raw = version;
+
+		  // these are actually numbers
+		  this.major = +m[1];
+		  this.minor = +m[2];
+		  this.patch = +m[3];
+
+		  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
+		    throw new TypeError('Invalid major version')
+		  }
+
+		  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
+		    throw new TypeError('Invalid minor version')
+		  }
+
+		  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
+		    throw new TypeError('Invalid patch version')
+		  }
+
+		  // numberify any prerelease numeric ids
+		  if (!m[4]) {
+		    this.prerelease = [];
+		  } else {
+		    this.prerelease = m[4].split('.').map(function (id) {
+		      if (/^[0-9]+$/.test(id)) {
+		        var num = +id;
+		        if (num >= 0 && num < MAX_SAFE_INTEGER) {
+		          return num
+		        }
+		      }
+		      return id
+		    });
+		  }
+
+		  this.build = m[5] ? m[5].split('.') : [];
+		  this.format();
+		}
+
+		SemVer.prototype.format = function () {
+		  this.version = this.major + '.' + this.minor + '.' + this.patch;
+		  if (this.prerelease.length) {
+		    this.version += '-' + this.prerelease.join('.');
+		  }
+		  return this.version
+		};
+
+		SemVer.prototype.toString = function () {
+		  return this.version
+		};
+
+		SemVer.prototype.compare = function (other) {
+		  debug('SemVer.compare', this.version, this.options, other);
+		  if (!(other instanceof SemVer)) {
+		    other = new SemVer(other, this.options);
+		  }
+
+		  return this.compareMain(other) || this.comparePre(other)
+		};
+
+		SemVer.prototype.compareMain = function (other) {
+		  if (!(other instanceof SemVer)) {
+		    other = new SemVer(other, this.options);
+		  }
+
+		  return compareIdentifiers(this.major, other.major) ||
+		         compareIdentifiers(this.minor, other.minor) ||
+		         compareIdentifiers(this.patch, other.patch)
+		};
+
+		SemVer.prototype.comparePre = function (other) {
+		  if (!(other instanceof SemVer)) {
+		    other = new SemVer(other, this.options);
+		  }
+
+		  // NOT having a prerelease is > having one
+		  if (this.prerelease.length && !other.prerelease.length) {
+		    return -1
+		  } else if (!this.prerelease.length && other.prerelease.length) {
+		    return 1
+		  } else if (!this.prerelease.length && !other.prerelease.length) {
+		    return 0
+		  }
+
+		  var i = 0;
+		  do {
+		    var a = this.prerelease[i];
+		    var b = other.prerelease[i];
+		    debug('prerelease compare', i, a, b);
+		    if (a === undefined && b === undefined) {
+		      return 0
+		    } else if (b === undefined) {
+		      return 1
+		    } else if (a === undefined) {
+		      return -1
+		    } else if (a === b) {
+		      continue
+		    } else {
+		      return compareIdentifiers(a, b)
+		    }
+		  } while (++i)
+		};
+
+		SemVer.prototype.compareBuild = function (other) {
+		  if (!(other instanceof SemVer)) {
+		    other = new SemVer(other, this.options);
+		  }
+
+		  var i = 0;
+		  do {
+		    var a = this.build[i];
+		    var b = other.build[i];
+		    debug('prerelease compare', i, a, b);
+		    if (a === undefined && b === undefined) {
+		      return 0
+		    } else if (b === undefined) {
+		      return 1
+		    } else if (a === undefined) {
+		      return -1
+		    } else if (a === b) {
+		      continue
+		    } else {
+		      return compareIdentifiers(a, b)
+		    }
+		  } while (++i)
+		};
+
+		// preminor will bump the version up to the next minor release, and immediately
+		// down to pre-release. premajor and prepatch work the same way.
+		SemVer.prototype.inc = function (release, identifier) {
+		  switch (release) {
+		    case 'premajor':
+		      this.prerelease.length = 0;
+		      this.patch = 0;
+		      this.minor = 0;
+		      this.major++;
+		      this.inc('pre', identifier);
+		      break
+		    case 'preminor':
+		      this.prerelease.length = 0;
+		      this.patch = 0;
+		      this.minor++;
+		      this.inc('pre', identifier);
+		      break
+		    case 'prepatch':
+		      // If this is already a prerelease, it will bump to the next version
+		      // drop any prereleases that might already exist, since they are not
+		      // relevant at this point.
+		      this.prerelease.length = 0;
+		      this.inc('patch', identifier);
+		      this.inc('pre', identifier);
+		      break
+		    // If the input is a non-prerelease version, this acts the same as
+		    // prepatch.
+		    case 'prerelease':
+		      if (this.prerelease.length === 0) {
+		        this.inc('patch', identifier);
+		      }
+		      this.inc('pre', identifier);
+		      break
+
+		    case 'major':
+		      // If this is a pre-major version, bump up to the same major version.
+		      // Otherwise increment major.
+		      // 1.0.0-5 bumps to 1.0.0
+		      // 1.1.0 bumps to 2.0.0
+		      if (this.minor !== 0 ||
+		          this.patch !== 0 ||
+		          this.prerelease.length === 0) {
+		        this.major++;
+		      }
+		      this.minor = 0;
+		      this.patch = 0;
+		      this.prerelease = [];
+		      break
+		    case 'minor':
+		      // If this is a pre-minor version, bump up to the same minor version.
+		      // Otherwise increment minor.
+		      // 1.2.0-5 bumps to 1.2.0
+		      // 1.2.1 bumps to 1.3.0
+		      if (this.patch !== 0 || this.prerelease.length === 0) {
+		        this.minor++;
+		      }
+		      this.patch = 0;
+		      this.prerelease = [];
+		      break
+		    case 'patch':
+		      // If this is not a pre-release version, it will increment the patch.
+		      // If it is a pre-release it will bump up to the same patch version.
+		      // 1.2.0-5 patches to 1.2.0
+		      // 1.2.0 patches to 1.2.1
+		      if (this.prerelease.length === 0) {
+		        this.patch++;
+		      }
+		      this.prerelease = [];
+		      break
+		    // This probably shouldn't be used publicly.
+		    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
+		    case 'pre':
+		      if (this.prerelease.length === 0) {
+		        this.prerelease = [0];
+		      } else {
+		        var i = this.prerelease.length;
+		        while (--i >= 0) {
+		          if (typeof this.prerelease[i] === 'number') {
+		            this.prerelease[i]++;
+		            i = -2;
+		          }
+		        }
+		        if (i === -1) {
+		          // didn't increment anything
+		          this.prerelease.push(0);
+		        }
+		      }
+		      if (identifier) {
+		        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
+		        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
+		        if (this.prerelease[0] === identifier) {
+		          if (isNaN(this.prerelease[1])) {
+		            this.prerelease = [identifier, 0];
+		          }
+		        } else {
+		          this.prerelease = [identifier, 0];
+		        }
+		      }
+		      break
+
+		    default:
+		      throw new Error('invalid increment argument: ' + release)
+		  }
+		  this.format();
+		  this.raw = this.version;
+		  return this
+		};
+
+		exports$1.inc = inc;
+		function inc (version, release, loose, identifier) {
+		  if (typeof (loose) === 'string') {
+		    identifier = loose;
+		    loose = undefined;
+		  }
+
+		  try {
+		    return new SemVer(version, loose).inc(release, identifier).version
+		  } catch (er) {
+		    return null
+		  }
+		}
+
+		exports$1.diff = diff;
+		function diff (version1, version2) {
+		  if (eq(version1, version2)) {
+		    return null
+		  } else {
+		    var v1 = parse(version1);
+		    var v2 = parse(version2);
+		    var prefix = '';
+		    if (v1.prerelease.length || v2.prerelease.length) {
+		      prefix = 'pre';
+		      var defaultResult = 'prerelease';
+		    }
+		    for (var key in v1) {
+		      if (key === 'major' || key === 'minor' || key === 'patch') {
+		        if (v1[key] !== v2[key]) {
+		          return prefix + key
+		        }
+		      }
+		    }
+		    return defaultResult // may be undefined
+		  }
+		}
+
+		exports$1.compareIdentifiers = compareIdentifiers;
+
+		var numeric = /^[0-9]+$/;
+		function compareIdentifiers (a, b) {
+		  var anum = numeric.test(a);
+		  var bnum = numeric.test(b);
+
+		  if (anum && bnum) {
+		    a = +a;
+		    b = +b;
+		  }
+
+		  return a === b ? 0
+		    : (anum && !bnum) ? -1
+		    : (bnum && !anum) ? 1
+		    : a < b ? -1
+		    : 1
+		}
+
+		exports$1.rcompareIdentifiers = rcompareIdentifiers;
+		function rcompareIdentifiers (a, b) {
+		  return compareIdentifiers(b, a)
+		}
+
+		exports$1.major = major;
+		function major (a, loose) {
+		  return new SemVer(a, loose).major
+		}
+
+		exports$1.minor = minor;
+		function minor (a, loose) {
+		  return new SemVer(a, loose).minor
+		}
+
+		exports$1.patch = patch;
+		function patch (a, loose) {
+		  return new SemVer(a, loose).patch
+		}
+
+		exports$1.compare = compare;
+		function compare (a, b, loose) {
+		  return new SemVer(a, loose).compare(new SemVer(b, loose))
+		}
+
+		exports$1.compareLoose = compareLoose;
+		function compareLoose (a, b) {
+		  return compare(a, b, true)
+		}
+
+		exports$1.compareBuild = compareBuild;
+		function compareBuild (a, b, loose) {
+		  var versionA = new SemVer(a, loose);
+		  var versionB = new SemVer(b, loose);
+		  return versionA.compare(versionB) || versionA.compareBuild(versionB)
+		}
+
+		exports$1.rcompare = rcompare;
+		function rcompare (a, b, loose) {
+		  return compare(b, a, loose)
+		}
+
+		exports$1.sort = sort;
+		function sort (list, loose) {
+		  return list.sort(function (a, b) {
+		    return exports$1.compareBuild(a, b, loose)
+		  })
+		}
+
+		exports$1.rsort = rsort;
+		function rsort (list, loose) {
+		  return list.sort(function (a, b) {
+		    return exports$1.compareBuild(b, a, loose)
+		  })
+		}
+
+		exports$1.gt = gt;
+		function gt (a, b, loose) {
+		  return compare(a, b, loose) > 0
+		}
+
+		exports$1.lt = lt;
+		function lt (a, b, loose) {
+		  return compare(a, b, loose) < 0
+		}
+
+		exports$1.eq = eq;
+		function eq (a, b, loose) {
+		  return compare(a, b, loose) === 0
+		}
+
+		exports$1.neq = neq;
+		function neq (a, b, loose) {
+		  return compare(a, b, loose) !== 0
+		}
+
+		exports$1.gte = gte;
+		function gte (a, b, loose) {
+		  return compare(a, b, loose) >= 0
+		}
+
+		exports$1.lte = lte;
+		function lte (a, b, loose) {
+		  return compare(a, b, loose) <= 0
+		}
+
+		exports$1.cmp = cmp;
+		function cmp (a, op, b, loose) {
+		  switch (op) {
+		    case '===':
+		      if (typeof a === 'object')
+		        a = a.version;
+		      if (typeof b === 'object')
+		        b = b.version;
+		      return a === b
+
+		    case '!==':
+		      if (typeof a === 'object')
+		        a = a.version;
+		      if (typeof b === 'object')
+		        b = b.version;
+		      return a !== b
+
+		    case '':
+		    case '=':
+		    case '==':
+		      return eq(a, b, loose)
+
+		    case '!=':
+		      return neq(a, b, loose)
+
+		    case '>':
+		      return gt(a, b, loose)
+
+		    case '>=':
+		      return gte(a, b, loose)
+
+		    case '<':
+		      return lt(a, b, loose)
+
+		    case '<=':
+		      return lte(a, b, loose)
+
+		    default:
+		      throw new TypeError('Invalid operator: ' + op)
+		  }
+		}
+
+		exports$1.Comparator = Comparator;
+		function Comparator (comp, options) {
+		  if (!options || typeof options !== 'object') {
+		    options = {
+		      loose: !!options,
+		      includePrerelease: false
+		    };
+		  }
+
+		  if (comp instanceof Comparator) {
+		    if (comp.loose === !!options.loose) {
+		      return comp
+		    } else {
+		      comp = comp.value;
+		    }
+		  }
+
+		  if (!(this instanceof Comparator)) {
+		    return new Comparator(comp, options)
+		  }
+
+		  comp = comp.trim().split(/\s+/).join(' ');
+		  debug('comparator', comp, options);
+		  this.options = options;
+		  this.loose = !!options.loose;
+		  this.parse(comp);
+
+		  if (this.semver === ANY) {
+		    this.value = '';
+		  } else {
+		    this.value = this.operator + this.semver.version;
+		  }
+
+		  debug('comp', this);
+		}
+
+		var ANY = {};
+		Comparator.prototype.parse = function (comp) {
+		  var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR];
+		  var m = comp.match(r);
+
+		  if (!m) {
+		    throw new TypeError('Invalid comparator: ' + comp)
+		  }
+
+		  this.operator = m[1] !== undefined ? m[1] : '';
+		  if (this.operator === '=') {
+		    this.operator = '';
+		  }
+
+		  // if it literally is just '>' or '' then allow anything.
+		  if (!m[2]) {
+		    this.semver = ANY;
+		  } else {
+		    this.semver = new SemVer(m[2], this.options.loose);
+		  }
+		};
+
+		Comparator.prototype.toString = function () {
+		  return this.value
+		};
+
+		Comparator.prototype.test = function (version) {
+		  debug('Comparator.test', version, this.options.loose);
+
+		  if (this.semver === ANY || version === ANY) {
+		    return true
+		  }
+
+		  if (typeof version === 'string') {
+		    try {
+		      version = new SemVer(version, this.options);
+		    } catch (er) {
+		      return false
+		    }
+		  }
+
+		  return cmp(version, this.operator, this.semver, this.options)
+		};
+
+		Comparator.prototype.intersects = function (comp, options) {
+		  if (!(comp instanceof Comparator)) {
+		    throw new TypeError('a Comparator is required')
+		  }
+
+		  if (!options || typeof options !== 'object') {
+		    options = {
+		      loose: !!options,
+		      includePrerelease: false
+		    };
+		  }
+
+		  var rangeTmp;
+
+		  if (this.operator === '') {
+		    if (this.value === '') {
+		      return true
+		    }
+		    rangeTmp = new Range(comp.value, options);
+		    return satisfies(this.value, rangeTmp, options)
+		  } else if (comp.operator === '') {
+		    if (comp.value === '') {
+		      return true
+		    }
+		    rangeTmp = new Range(this.value, options);
+		    return satisfies(comp.semver, rangeTmp, options)
+		  }
+
+		  var sameDirectionIncreasing =
+		    (this.operator === '>=' || this.operator === '>') &&
+		    (comp.operator === '>=' || comp.operator === '>');
+		  var sameDirectionDecreasing =
+		    (this.operator === '<=' || this.operator === '<') &&
+		    (comp.operator === '<=' || comp.operator === '<');
+		  var sameSemVer = this.semver.version === comp.semver.version;
+		  var differentDirectionsInclusive =
+		    (this.operator === '>=' || this.operator === '<=') &&
+		    (comp.operator === '>=' || comp.operator === '<=');
+		  var oppositeDirectionsLessThan =
+		    cmp(this.semver, '<', comp.semver, options) &&
+		    ((this.operator === '>=' || this.operator === '>') &&
+		    (comp.operator === '<=' || comp.operator === '<'));
+		  var oppositeDirectionsGreaterThan =
+		    cmp(this.semver, '>', comp.semver, options) &&
+		    ((this.operator === '<=' || this.operator === '<') &&
+		    (comp.operator === '>=' || comp.operator === '>'));
+
+		  return sameDirectionIncreasing || sameDirectionDecreasing ||
+		    (sameSemVer && differentDirectionsInclusive) ||
+		    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
+		};
+
+		exports$1.Range = Range;
+		function Range (range, options) {
+		  if (!options || typeof options !== 'object') {
+		    options = {
+		      loose: !!options,
+		      includePrerelease: false
+		    };
+		  }
+
+		  if (range instanceof Range) {
+		    if (range.loose === !!options.loose &&
+		        range.includePrerelease === !!options.includePrerelease) {
+		      return range
+		    } else {
+		      return new Range(range.raw, options)
+		    }
+		  }
+
+		  if (range instanceof Comparator) {
+		    return new Range(range.value, options)
+		  }
+
+		  if (!(this instanceof Range)) {
+		    return new Range(range, options)
+		  }
+
+		  this.options = options;
+		  this.loose = !!options.loose;
+		  this.includePrerelease = !!options.includePrerelease;
+
+		  // First reduce all whitespace as much as possible so we do not have to rely
+		  // on potentially slow regexes like \s*. This is then stored and used for
+		  // future error messages as well.
+		  this.raw = range
+		    .trim()
+		    .split(/\s+/)
+		    .join(' ');
+
+		  // First, split based on boolean or ||
+		  this.set = this.raw.split('||').map(function (range) {
+		    return this.parseRange(range.trim())
+		  }, this).filter(function (c) {
+		    // throw out any that are not relevant for whatever reason
+		    return c.length
+		  });
+
+		  if (!this.set.length) {
+		    throw new TypeError('Invalid SemVer Range: ' + this.raw)
+		  }
+
+		  this.format();
+		}
+
+		Range.prototype.format = function () {
+		  this.range = this.set.map(function (comps) {
+		    return comps.join(' ').trim()
+		  }).join('||').trim();
+		  return this.range
+		};
+
+		Range.prototype.toString = function () {
+		  return this.range
+		};
+
+		Range.prototype.parseRange = function (range) {
+		  var loose = this.options.loose;
+		  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
+		  var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE];
+		  range = range.replace(hr, hyphenReplace);
+		  debug('hyphen replace', range);
+		  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
+		  range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace);
+		  debug('comparator trim', range, safeRe[t.COMPARATORTRIM]);
+
+		  // `~ 1.2.3` => `~1.2.3`
+		  range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace);
+
+		  // `^ 1.2.3` => `^1.2.3`
+		  range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace);
+
+		  // normalize spaces
+		  range = range.split(/\s+/).join(' ');
+
+		  // At this point, the range is completely trimmed and
+		  // ready to be split into comparators.
+
+		  var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR];
+		  var set = range.split(' ').map(function (comp) {
+		    return parseComparator(comp, this.options)
+		  }, this).join(' ').split(/\s+/);
+		  if (this.options.loose) {
+		    // in loose mode, throw out any that are not valid comparators
+		    set = set.filter(function (comp) {
+		      return !!comp.match(compRe)
+		    });
+		  }
+		  set = set.map(function (comp) {
+		    return new Comparator(comp, this.options)
+		  }, this);
+
+		  return set
+		};
+
+		Range.prototype.intersects = function (range, options) {
+		  if (!(range instanceof Range)) {
+		    throw new TypeError('a Range is required')
+		  }
+
+		  return this.set.some(function (thisComparators) {
+		    return (
+		      isSatisfiable(thisComparators, options) &&
+		      range.set.some(function (rangeComparators) {
+		        return (
+		          isSatisfiable(rangeComparators, options) &&
+		          thisComparators.every(function (thisComparator) {
+		            return rangeComparators.every(function (rangeComparator) {
+		              return thisComparator.intersects(rangeComparator, options)
+		            })
+		          })
+		        )
+		      })
+		    )
+		  })
+		};
+
+		// take a set of comparators and determine whether there
+		// exists a version which can satisfy it
+		function isSatisfiable (comparators, options) {
+		  var result = true;
+		  var remainingComparators = comparators.slice();
+		  var testComparator = remainingComparators.pop();
+
+		  while (result && remainingComparators.length) {
+		    result = remainingComparators.every(function (otherComparator) {
+		      return testComparator.intersects(otherComparator, options)
+		    });
+
+		    testComparator = remainingComparators.pop();
+		  }
+
+		  return result
+		}
+
+		// Mostly just for testing and legacy API reasons
+		exports$1.toComparators = toComparators;
+		function toComparators (range, options) {
+		  return new Range(range, options).set.map(function (comp) {
+		    return comp.map(function (c) {
+		      return c.value
+		    }).join(' ').trim().split(' ')
+		  })
+		}
+
+		// comprised of xranges, tildes, stars, and gtlt's at this point.
+		// already replaced the hyphen ranges
+		// turn into a set of JUST comparators.
+		function parseComparator (comp, options) {
+		  debug('comp', comp, options);
+		  comp = replaceCarets(comp, options);
+		  debug('caret', comp);
+		  comp = replaceTildes(comp, options);
+		  debug('tildes', comp);
+		  comp = replaceXRanges(comp, options);
+		  debug('xrange', comp);
+		  comp = replaceStars(comp, options);
+		  debug('stars', comp);
+		  return comp
+		}
+
+		function isX (id) {
+		  return !id || id.toLowerCase() === 'x' || id === '*'
+		}
+
+		// ~, ~> --> * (any, kinda silly)
+		// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
+		// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
+		// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
+		// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
+		// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
+		function replaceTildes (comp, options) {
+		  return comp.trim().split(/\s+/).map(function (comp) {
+		    return replaceTilde(comp, options)
+		  }).join(' ')
+		}
+
+		function replaceTilde (comp, options) {
+		  var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE];
+		  return comp.replace(r, function (_, M, m, p, pr) {
+		    debug('tilde', comp, _, M, m, p, pr);
+		    var ret;
+
+		    if (isX(M)) {
+		      ret = '';
+		    } else if (isX(m)) {
+		      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
+		    } else if (isX(p)) {
+		      // ~1.2 == >=1.2.0 <1.3.0
+		      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
+		    } else if (pr) {
+		      debug('replaceTilde pr', pr);
+		      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+		            ' <' + M + '.' + (+m + 1) + '.0';
+		    } else {
+		      // ~1.2.3 == >=1.2.3 <1.3.0
+		      ret = '>=' + M + '.' + m + '.' + p +
+		            ' <' + M + '.' + (+m + 1) + '.0';
+		    }
+
+		    debug('tilde return', ret);
+		    return ret
+		  })
+		}
+
+		// ^ --> * (any, kinda silly)
+		// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
+		// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
+		// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
+		// ^1.2.3 --> >=1.2.3 <2.0.0
+		// ^1.2.0 --> >=1.2.0 <2.0.0
+		function replaceCarets (comp, options) {
+		  return comp.trim().split(/\s+/).map(function (comp) {
+		    return replaceCaret(comp, options)
+		  }).join(' ')
+		}
+
+		function replaceCaret (comp, options) {
+		  debug('caret', comp, options);
+		  var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET];
+		  return comp.replace(r, function (_, M, m, p, pr) {
+		    debug('caret', comp, _, M, m, p, pr);
+		    var ret;
+
+		    if (isX(M)) {
+		      ret = '';
+		    } else if (isX(m)) {
+		      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
+		    } else if (isX(p)) {
+		      if (M === '0') {
+		        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
+		      } else {
+		        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
+		      }
+		    } else if (pr) {
+		      debug('replaceCaret pr', pr);
+		      if (M === '0') {
+		        if (m === '0') {
+		          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+		                ' <' + M + '.' + m + '.' + (+p + 1);
+		        } else {
+		          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+		                ' <' + M + '.' + (+m + 1) + '.0';
+		        }
+		      } else {
+		        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+		              ' <' + (+M + 1) + '.0.0';
+		      }
+		    } else {
+		      debug('no pr');
+		      if (M === '0') {
+		        if (m === '0') {
+		          ret = '>=' + M + '.' + m + '.' + p +
+		                ' <' + M + '.' + m + '.' + (+p + 1);
+		        } else {
+		          ret = '>=' + M + '.' + m + '.' + p +
+		                ' <' + M + '.' + (+m + 1) + '.0';
+		        }
+		      } else {
+		        ret = '>=' + M + '.' + m + '.' + p +
+		              ' <' + (+M + 1) + '.0.0';
+		      }
+		    }
+
+		    debug('caret return', ret);
+		    return ret
+		  })
+		}
+
+		function replaceXRanges (comp, options) {
+		  debug('replaceXRanges', comp, options);
+		  return comp.split(/\s+/).map(function (comp) {
+		    return replaceXRange(comp, options)
+		  }).join(' ')
+		}
+
+		function replaceXRange (comp, options) {
+		  comp = comp.trim();
+		  var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE];
+		  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
+		    debug('xRange', comp, ret, gtlt, M, m, p, pr);
+		    var xM = isX(M);
+		    var xm = xM || isX(m);
+		    var xp = xm || isX(p);
+		    var anyX = xp;
+
+		    if (gtlt === '=' && anyX) {
+		      gtlt = '';
+		    }
+
+		    // if we're including prereleases in the match, then we need
+		    // to fix this to -0, the lowest possible prerelease value
+		    pr = options.includePrerelease ? '-0' : '';
+
+		    if (xM) {
+		      if (gtlt === '>' || gtlt === '<') {
+		        // nothing is allowed
+		        ret = '<0.0.0-0';
+		      } else {
+		        // nothing is forbidden
+		        ret = '*';
+		      }
+		    } else if (gtlt && anyX) {
+		      // we know patch is an x, because we have any x at all.
+		      // replace X with 0
+		      if (xm) {
+		        m = 0;
+		      }
+		      p = 0;
+
+		      if (gtlt === '>') {
+		        // >1 => >=2.0.0
+		        // >1.2 => >=1.3.0
+		        // >1.2.3 => >= 1.2.4
+		        gtlt = '>=';
+		        if (xm) {
+		          M = +M + 1;
+		          m = 0;
+		          p = 0;
+		        } else {
+		          m = +m + 1;
+		          p = 0;
+		        }
+		      } else if (gtlt === '<=') {
+		        // <=0.7.x is actually <0.8.0, since any 0.7.x should
+		        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
+		        gtlt = '<';
+		        if (xm) {
+		          M = +M + 1;
+		        } else {
+		          m = +m + 1;
+		        }
+		      }
+
+		      ret = gtlt + M + '.' + m + '.' + p + pr;
+		    } else if (xm) {
+		      ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr;
+		    } else if (xp) {
+		      ret = '>=' + M + '.' + m + '.0' + pr +
+		        ' <' + M + '.' + (+m + 1) + '.0' + pr;
+		    }
+
+		    debug('xRange return', ret);
+
+		    return ret
+		  })
+		}
+
+		// Because * is AND-ed with everything else in the comparator,
+		// and '' means "any version", just remove the *s entirely.
+		function replaceStars (comp, options) {
+		  debug('replaceStars', comp, options);
+		  // Looseness is ignored here.  star is always as loose as it gets!
+		  return comp.trim().replace(safeRe[t.STAR], '')
+		}
+
+		// This function is passed to string.replace(re[t.HYPHENRANGE])
+		// M, m, patch, prerelease, build
+		// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
+		// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
+		// 1.2 - 3.4 => >=1.2.0 <3.5.0
+		function hyphenReplace ($0,
+		  from, fM, fm, fp, fpr, fb,
+		  to, tM, tm, tp, tpr, tb) {
+		  if (isX(fM)) {
+		    from = '';
+		  } else if (isX(fm)) {
+		    from = '>=' + fM + '.0.0';
+		  } else if (isX(fp)) {
+		    from = '>=' + fM + '.' + fm + '.0';
+		  } else {
+		    from = '>=' + from;
+		  }
+
+		  if (isX(tM)) {
+		    to = '';
+		  } else if (isX(tm)) {
+		    to = '<' + (+tM + 1) + '.0.0';
+		  } else if (isX(tp)) {
+		    to = '<' + tM + '.' + (+tm + 1) + '.0';
+		  } else if (tpr) {
+		    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
+		  } else {
+		    to = '<=' + to;
+		  }
+
+		  return (from + ' ' + to).trim()
+		}
+
+		// if ANY of the sets match ALL of its comparators, then pass
+		Range.prototype.test = function (version) {
+		  if (!version) {
+		    return false
+		  }
+
+		  if (typeof version === 'string') {
+		    try {
+		      version = new SemVer(version, this.options);
+		    } catch (er) {
+		      return false
+		    }
+		  }
+
+		  for (var i = 0; i < this.set.length; i++) {
+		    if (testSet(this.set[i], version, this.options)) {
+		      return true
+		    }
+		  }
+		  return false
+		};
+
+		function testSet (set, version, options) {
+		  for (var i = 0; i < set.length; i++) {
+		    if (!set[i].test(version)) {
+		      return false
+		    }
+		  }
+
+		  if (version.prerelease.length && !options.includePrerelease) {
+		    // Find the set of versions that are allowed to have prereleases
+		    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
+		    // That should allow `1.2.3-pr.2` to pass.
+		    // However, `1.2.4-alpha.notready` should NOT be allowed,
+		    // even though it's within the range set by the comparators.
+		    for (i = 0; i < set.length; i++) {
+		      debug(set[i].semver);
+		      if (set[i].semver === ANY) {
+		        continue
+		      }
+
+		      if (set[i].semver.prerelease.length > 0) {
+		        var allowed = set[i].semver;
+		        if (allowed.major === version.major &&
+		            allowed.minor === version.minor &&
+		            allowed.patch === version.patch) {
+		          return true
+		        }
+		      }
+		    }
+
+		    // Version has a -pre, but it's not one of the ones we like.
+		    return false
+		  }
+
+		  return true
+		}
+
+		exports$1.satisfies = satisfies;
+		function satisfies (version, range, options) {
+		  try {
+		    range = new Range(range, options);
+		  } catch (er) {
+		    return false
+		  }
+		  return range.test(version)
+		}
+
+		exports$1.maxSatisfying = maxSatisfying;
+		function maxSatisfying (versions, range, options) {
+		  var max = null;
+		  var maxSV = null;
+		  try {
+		    var rangeObj = new Range(range, options);
+		  } catch (er) {
+		    return null
+		  }
+		  versions.forEach(function (v) {
+		    if (rangeObj.test(v)) {
+		      // satisfies(v, range, options)
+		      if (!max || maxSV.compare(v) === -1) {
+		        // compare(max, v, true)
+		        max = v;
+		        maxSV = new SemVer(max, options);
+		      }
+		    }
+		  });
+		  return max
+		}
+
+		exports$1.minSatisfying = minSatisfying;
+		function minSatisfying (versions, range, options) {
+		  var min = null;
+		  var minSV = null;
+		  try {
+		    var rangeObj = new Range(range, options);
+		  } catch (er) {
+		    return null
+		  }
+		  versions.forEach(function (v) {
+		    if (rangeObj.test(v)) {
+		      // satisfies(v, range, options)
+		      if (!min || minSV.compare(v) === 1) {
+		        // compare(min, v, true)
+		        min = v;
+		        minSV = new SemVer(min, options);
+		      }
+		    }
+		  });
+		  return min
+		}
+
+		exports$1.minVersion = minVersion;
+		function minVersion (range, loose) {
+		  range = new Range(range, loose);
+
+		  var minver = new SemVer('0.0.0');
+		  if (range.test(minver)) {
+		    return minver
+		  }
+
+		  minver = new SemVer('0.0.0-0');
+		  if (range.test(minver)) {
+		    return minver
+		  }
+
+		  minver = null;
+		  for (var i = 0; i < range.set.length; ++i) {
+		    var comparators = range.set[i];
+
+		    comparators.forEach(function (comparator) {
+		      // Clone to avoid manipulating the comparator's semver object.
+		      var compver = new SemVer(comparator.semver.version);
+		      switch (comparator.operator) {
+		        case '>':
+		          if (compver.prerelease.length === 0) {
+		            compver.patch++;
+		          } else {
+		            compver.prerelease.push(0);
+		          }
+		          compver.raw = compver.format();
+		          /* fallthrough */
+		        case '':
+		        case '>=':
+		          if (!minver || gt(minver, compver)) {
+		            minver = compver;
+		          }
+		          break
+		        case '<':
+		        case '<=':
+		          /* Ignore maximum versions */
+		          break
+		        /* istanbul ignore next */
+		        default:
+		          throw new Error('Unexpected operation: ' + comparator.operator)
+		      }
+		    });
+		  }
+
+		  if (minver && range.test(minver)) {
+		    return minver
+		  }
+
+		  return null
+		}
+
+		exports$1.validRange = validRange;
+		function validRange (range, options) {
+		  try {
+		    // Return '*' instead of '' so that truthiness works.
+		    // This will throw if it's invalid anyway
+		    return new Range(range, options).range || '*'
+		  } catch (er) {
+		    return null
+		  }
+		}
+
+		// Determine if version is less than all the versions possible in the range
+		exports$1.ltr = ltr;
+		function ltr (version, range, options) {
+		  return outside(version, range, '<', options)
+		}
+
+		// Determine if version is greater than all the versions possible in the range.
+		exports$1.gtr = gtr;
+		function gtr (version, range, options) {
+		  return outside(version, range, '>', options)
+		}
+
+		exports$1.outside = outside;
+		function outside (version, range, hilo, options) {
+		  version = new SemVer(version, options);
+		  range = new Range(range, options);
+
+		  var gtfn, ltefn, ltfn, comp, ecomp;
+		  switch (hilo) {
+		    case '>':
+		      gtfn = gt;
+		      ltefn = lte;
+		      ltfn = lt;
+		      comp = '>';
+		      ecomp = '>=';
+		      break
+		    case '<':
+		      gtfn = lt;
+		      ltefn = gte;
+		      ltfn = gt;
+		      comp = '<';
+		      ecomp = '<=';
+		      break
+		    default:
+		      throw new TypeError('Must provide a hilo val of "<" or ">"')
+		  }
+
+		  // If it satisifes the range it is not outside
+		  if (satisfies(version, range, options)) {
+		    return false
+		  }
+
+		  // From now on, variable terms are as if we're in "gtr" mode.
+		  // but note that everything is flipped for the "ltr" function.
+
+		  for (var i = 0; i < range.set.length; ++i) {
+		    var comparators = range.set[i];
+
+		    var high = null;
+		    var low = null;
+
+		    comparators.forEach(function (comparator) {
+		      if (comparator.semver === ANY) {
+		        comparator = new Comparator('>=0.0.0');
+		      }
+		      high = high || comparator;
+		      low = low || comparator;
+		      if (gtfn(comparator.semver, high.semver, options)) {
+		        high = comparator;
+		      } else if (ltfn(comparator.semver, low.semver, options)) {
+		        low = comparator;
+		      }
+		    });
+
+		    // If the edge version comparator has a operator then our version
+		    // isn't outside it
+		    if (high.operator === comp || high.operator === ecomp) {
+		      return false
+		    }
+
+		    // If the lowest version comparator has an operator and our version
+		    // is less than it then it isn't higher than the range
+		    if ((!low.operator || low.operator === comp) &&
+		        ltefn(version, low.semver)) {
+		      return false
+		    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
+		      return false
+		    }
+		  }
+		  return true
+		}
+
+		exports$1.prerelease = prerelease;
+		function prerelease (version, options) {
+		  var parsed = parse(version, options);
+		  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
+		}
+
+		exports$1.intersects = intersects;
+		function intersects (r1, r2, options) {
+		  r1 = new Range(r1, options);
+		  r2 = new Range(r2, options);
+		  return r1.intersects(r2)
+		}
+
+		exports$1.coerce = coerce;
+		function coerce (version, options) {
+		  if (version instanceof SemVer) {
+		    return version
+		  }
+
+		  if (typeof version === 'number') {
+		    version = String(version);
+		  }
+
+		  if (typeof version !== 'string') {
+		    return null
+		  }
+
+		  options = options || {};
+
+		  var match = null;
+		  if (!options.rtl) {
+		    match = version.match(safeRe[t.COERCE]);
+		  } else {
+		    // Find the right-most coercible string that does not share
+		    // a terminus with a more left-ward coercible string.
+		    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
+		    //
+		    // Walk through the string checking with a /g regexp
+		    // Manually set the index so as to pick up overlapping matches.
+		    // Stop when we get a match that ends at the string end, since no
+		    // coercible string can be more right-ward without the same terminus.
+		    var next;
+		    while ((next = safeRe[t.COERCERTL].exec(version)) &&
+		      (!match || match.index + match[0].length !== version.length)
+		    ) {
+		      if (!match ||
+		          next.index + next[0].length !== match.index + match[0].length) {
+		        match = next;
+		      }
+		      safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length;
+		    }
+		    // leave it in a clean state
+		    safeRe[t.COERCERTL].lastIndex = -1;
+		  }
+
+		  if (match === null) {
+		    return null
+		  }
+
+		  return parse(match[2] +
+		    '.' + (match[3] || '0') +
+		    '.' + (match[4] || '0'), options)
+		} 
+	} (semver$3, semver$3.exports));
+	return semver$3.exports;
+}
+
+var constants$b = {};
+
+var hasRequiredConstants$b;
+
+function requireConstants$b () {
+	if (hasRequiredConstants$b) return constants$b;
+	hasRequiredConstants$b = 1;
+	Object.defineProperty(constants$b, "__esModule", { value: true });
+	constants$b.CacheFileSizeLimit = constants$b.ManifestFilename = constants$b.TarFilename = constants$b.SystemTarPathOnWindows = constants$b.GnuTarPathOnWindows = constants$b.SocketTimeout = constants$b.DefaultRetryDelay = constants$b.DefaultRetryAttempts = constants$b.ArchiveToolType = constants$b.CompressionMethod = constants$b.CacheFilename = void 0;
+	var CacheFilename;
+	(function (CacheFilename) {
+	    CacheFilename["Gzip"] = "cache.tgz";
+	    CacheFilename["Zstd"] = "cache.tzst";
+	})(CacheFilename || (constants$b.CacheFilename = CacheFilename = {}));
+	var CompressionMethod;
+	(function (CompressionMethod) {
+	    CompressionMethod["Gzip"] = "gzip";
+	    // Long range mode was added to zstd in v1.3.2.
+	    // This enum is for earlier version of zstd that does not have --long support
+	    CompressionMethod["ZstdWithoutLong"] = "zstd-without-long";
+	    CompressionMethod["Zstd"] = "zstd";
+	})(CompressionMethod || (constants$b.CompressionMethod = CompressionMethod = {}));
+	var ArchiveToolType;
+	(function (ArchiveToolType) {
+	    ArchiveToolType["GNU"] = "gnu";
+	    ArchiveToolType["BSD"] = "bsd";
+	})(ArchiveToolType || (constants$b.ArchiveToolType = ArchiveToolType = {}));
+	// The default number of retry attempts.
+	constants$b.DefaultRetryAttempts = 2;
+	// The default delay in milliseconds between retry attempts.
+	constants$b.DefaultRetryDelay = 5000;
+	// Socket timeout in milliseconds during download.  If no traffic is received
+	// over the socket during this period, the socket is destroyed and the download
+	// is aborted.
+	constants$b.SocketTimeout = 5000;
+	// The default path of GNUtar on hosted Windows runners
+	constants$b.GnuTarPathOnWindows = `${process.env['PROGRAMFILES']}\\Git\\usr\\bin\\tar.exe`;
+	// The default path of BSDtar on hosted Windows runners
+	constants$b.SystemTarPathOnWindows = `${process.env['SYSTEMDRIVE']}\\Windows\\System32\\tar.exe`;
+	constants$b.TarFilename = 'cache.tar';
+	constants$b.ManifestFilename = 'manifest.txt';
+	constants$b.CacheFileSizeLimit = 10 * Math.pow(1024, 3); // 10GiB per repository
+	
+	return constants$b;
+}
+
+var hasRequiredCacheUtils;
+
+function requireCacheUtils () {
+	if (hasRequiredCacheUtils) return cacheUtils;
+	hasRequiredCacheUtils = 1;
+	var __createBinding = (cacheUtils && cacheUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (cacheUtils && cacheUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (cacheUtils && cacheUtils.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (cacheUtils && cacheUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	var __asyncValues = (cacheUtils && cacheUtils.__asyncValues) || function (o) {
+	    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+	    var m = o[Symbol.asyncIterator], i;
+	    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+	    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+	    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+	};
+	Object.defineProperty(cacheUtils, "__esModule", { value: true });
+	cacheUtils.createTempDirectory = createTempDirectory;
+	cacheUtils.getArchiveFileSizeInBytes = getArchiveFileSizeInBytes;
+	cacheUtils.resolvePaths = resolvePaths;
+	cacheUtils.unlinkFile = unlinkFile;
+	cacheUtils.getCompressionMethod = getCompressionMethod;
+	cacheUtils.getCacheFileName = getCacheFileName;
+	cacheUtils.getGnuTarPathOnWindows = getGnuTarPathOnWindows;
+	cacheUtils.assertDefined = assertDefined;
+	cacheUtils.getCacheVersion = getCacheVersion;
+	cacheUtils.getRuntimeToken = getRuntimeToken;
+	const core = __importStar(requireCore());
+	const exec = __importStar(requireExec());
+	const glob = __importStar(requireGlob());
+	const io = __importStar(requireIo());
+	const crypto = __importStar(require$$0$3);
+	const fs = __importStar(fs__default);
+	const path = __importStar(require$$1$7);
+	const semver = __importStar(requireSemver$3());
+	const util = __importStar(require$$6);
+	const constants_1 = requireConstants$b();
+	const versionSalt = '1.0';
+	// From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23
+	function createTempDirectory() {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const IS_WINDOWS = process.platform === 'win32';
+	        let tempDirectory = process.env['RUNNER_TEMP'] || '';
+	        if (!tempDirectory) {
+	            let baseLocation;
+	            if (IS_WINDOWS) {
+	                // On Windows use the USERPROFILE env variable
+	                baseLocation = process.env['USERPROFILE'] || 'C:\\';
+	            }
+	            else {
+	                if (process.platform === 'darwin') {
+	                    baseLocation = '/Users';
+	                }
+	                else {
+	                    baseLocation = '/home';
+	                }
+	            }
+	            tempDirectory = path.join(baseLocation, 'actions', 'temp');
+	        }
+	        const dest = path.join(tempDirectory, crypto.randomUUID());
+	        yield io.mkdirP(dest);
+	        return dest;
+	    });
+	}
+	function getArchiveFileSizeInBytes(filePath) {
+	    return fs.statSync(filePath).size;
+	}
+	function resolvePaths(patterns) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        var _a, e_1, _b, _c;
+	        var _d;
+	        const paths = [];
+	        const workspace = (_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd();
+	        const globber = yield glob.create(patterns.join('\n'), {
+	            implicitDescendants: false
+	        });
+	        try {
+	            for (var _e = true, _f = __asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
+	                _c = _g.value;
+	                _e = false;
+	                const file = _c;
+	                const relativeFile = path
+	                    .relative(workspace, file)
+	                    .replace(new RegExp(`\\${path.sep}`, 'g'), '/');
+	                core.debug(`Matched: ${relativeFile}`);
+	                // Paths are made relative so the tar entries are all relative to the root of the workspace.
+	                if (relativeFile === '') {
+	                    // path.relative returns empty string if workspace and file are equal
+	                    paths.push('.');
+	                }
+	                else {
+	                    paths.push(`${relativeFile}`);
+	                }
+	            }
+	        }
+	        catch (e_1_1) { e_1 = { error: e_1_1 }; }
+	        finally {
+	            try {
+	                if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);
+	            }
+	            finally { if (e_1) throw e_1.error; }
+	        }
+	        return paths;
+	    });
+	}
+	function unlinkFile(filePath) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        return util.promisify(fs.unlink)(filePath);
+	    });
+	}
+	function getVersion(app_1) {
+	    return __awaiter(this, arguments, void 0, function* (app, additionalArgs = []) {
+	        let versionOutput = '';
+	        additionalArgs.push('--version');
+	        core.debug(`Checking ${app} ${additionalArgs.join(' ')}`);
+	        try {
+	            yield exec.exec(`${app}`, additionalArgs, {
+	                ignoreReturnCode: true,
+	                silent: true,
+	                listeners: {
+	                    stdout: (data) => (versionOutput += data.toString()),
+	                    stderr: (data) => (versionOutput += data.toString())
+	                }
+	            });
+	        }
+	        catch (err) {
+	            core.debug(err.message);
+	        }
+	        versionOutput = versionOutput.trim();
+	        core.debug(versionOutput);
+	        return versionOutput;
+	    });
+	}
+	// Use zstandard if possible to maximize cache performance
+	function getCompressionMethod() {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const versionOutput = yield getVersion('zstd', ['--quiet']);
+	        const version = semver.clean(versionOutput);
+	        core.debug(`zstd version: ${version}`);
+	        if (versionOutput === '') {
+	            return constants_1.CompressionMethod.Gzip;
+	        }
+	        else {
+	            return constants_1.CompressionMethod.ZstdWithoutLong;
+	        }
+	    });
+	}
+	function getCacheFileName(compressionMethod) {
+	    return compressionMethod === constants_1.CompressionMethod.Gzip
+	        ? constants_1.CacheFilename.Gzip
+	        : constants_1.CacheFilename.Zstd;
+	}
+	function getGnuTarPathOnWindows() {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        if (fs.existsSync(constants_1.GnuTarPathOnWindows)) {
+	            return constants_1.GnuTarPathOnWindows;
+	        }
+	        const versionOutput = yield getVersion('tar');
+	        return versionOutput.toLowerCase().includes('gnu tar') ? io.which('tar') : '';
+	    });
+	}
+	function assertDefined(name, value) {
+	    if (value === undefined) {
+	        throw Error(`Expected ${name} but value was undefiend`);
+	    }
+	    return value;
+	}
+	function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) {
+	    // don't pass changes upstream
+	    const components = paths.slice();
+	    // Add compression method to cache version to restore
+	    // compressed cache as per compression method
+	    if (compressionMethod) {
+	        components.push(compressionMethod);
+	    }
+	    // Only check for windows platforms if enableCrossOsArchive is false
+	    if (process.platform === 'win32' && !enableCrossOsArchive) {
+	        components.push('windows-only');
+	    }
+	    // Add salt to cache version to support breaking changes in cache entry
+	    components.push(versionSalt);
+	    return crypto.createHash('sha256').update(components.join('|')).digest('hex');
+	}
+	function getRuntimeToken() {
+	    const token = process.env['ACTIONS_RUNTIME_TOKEN'];
+	    if (!token) {
+	        throw new Error('Unable to get the ACTIONS_RUNTIME_TOKEN env variable');
+	    }
+	    return token;
+	}
+	
+	return cacheUtils;
+}
+
+var cacheHttpClient = {};
+
+var uploadUtils = {};
+
+var commonjs$e = {};
+
+/******************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
+
+var extendStatics = function(d, b) {
+    extendStatics = Object.setPrototypeOf ||
+        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+    return extendStatics(d, b);
+};
+
+function __extends(d, b) {
+    if (typeof b !== "function" && b !== null)
+        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+    extendStatics(d, b);
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+
+var __assign = function() {
+    __assign = Object.assign || function __assign(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+
+function __rest(s, e) {
+    var t = {};
+    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+        t[p] = s[p];
+    if (s != null && typeof Object.getOwnPropertySymbols === "function")
+        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+                t[p[i]] = s[p[i]];
+        }
+    return t;
+}
+
+function __decorate(decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+}
+
+function __param(paramIndex, decorator) {
+    return function (target, key) { decorator(target, key, paramIndex); }
+}
+
+function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
+    function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
+    var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
+    var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
+    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
+    var _, done = false;
+    for (var i = decorators.length - 1; i >= 0; i--) {
+        var context = {};
+        for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
+        for (var p in contextIn.access) context.access[p] = contextIn.access[p];
+        context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
+        var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
+        if (kind === "accessor") {
+            if (result === void 0) continue;
+            if (result === null || typeof result !== "object") throw new TypeError("Object expected");
+            if (_ = accept(result.get)) descriptor.get = _;
+            if (_ = accept(result.set)) descriptor.set = _;
+            if (_ = accept(result.init)) initializers.unshift(_);
+        }
+        else if (_ = accept(result)) {
+            if (kind === "field") initializers.unshift(_);
+            else descriptor[key] = _;
+        }
+    }
+    if (target) Object.defineProperty(target, contextIn.name, descriptor);
+    done = true;
+}
+function __runInitializers(thisArg, initializers, value) {
+    var useValue = arguments.length > 2;
+    for (var i = 0; i < initializers.length; i++) {
+        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
+    }
+    return useValue ? value : void 0;
+}
+function __propKey(x) {
+    return typeof x === "symbol" ? x : "".concat(x);
+}
+function __setFunctionName(f, name, prefix) {
+    if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
+    return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
+}
+function __metadata(metadataKey, metadataValue) {
+    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
+}
+
+function __awaiter$6(thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+}
+
+function __generator(thisArg, body) {
+    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
+    return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+    function verb(n) { return function (v) { return step([n, v]); }; }
+    function step(op) {
+        if (f) throw new TypeError("Generator is already executing.");
+        while (g && (g = 0, op[0] && (_ = 0)), _) try {
+            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+            if (y = 0, t) op = [op[0] & 2, t.value];
+            switch (op[0]) {
+                case 0: case 1: t = op; break;
+                case 4: _.label++; return { value: op[1], done: false };
+                case 5: _.label++; y = op[1]; op = [0]; continue;
+                case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                default:
+                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                    if (t[2]) _.ops.pop();
+                    _.trys.pop(); continue;
+            }
+            op = body.call(thisArg, _);
+        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+    }
+}
+
+var __createBinding = Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+        desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+});
+
+function __exportStar(m, o) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
+}
+
+function __values$1(o) {
+    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+    if (m) return m.call(o);
+    if (o && typeof o.length === "number") return {
+        next: function () {
+            if (o && i >= o.length) o = void 0;
+            return { value: o && o[i++], done: !o };
+        }
+    };
+    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+}
+
+function __read(o, n) {
+    var m = typeof Symbol === "function" && o[Symbol.iterator];
+    if (!m) return o;
+    var i = m.call(o), r, ar = [], e;
+    try {
+        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+    }
+    catch (error) { e = { error: error }; }
+    finally {
+        try {
+            if (r && !r.done && (m = i["return"])) m.call(i);
+        }
+        finally { if (e) throw e.error; }
+    }
+    return ar;
+}
+
+/** @deprecated */
+function __spread() {
+    for (var ar = [], i = 0; i < arguments.length; i++)
+        ar = ar.concat(__read(arguments[i]));
+    return ar;
+}
+
+/** @deprecated */
+function __spreadArrays() {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+}
+
+function __spreadArray(to, from, pack) {
+    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+        if (ar || !(i in from)) {
+            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+            ar[i] = from[i];
+        }
+    }
+    return to.concat(ar || Array.prototype.slice.call(from));
+}
+
+function __await(v) {
+    return this instanceof __await ? (this.v = v, this) : new __await(v);
+}
+
+function __asyncGenerator(thisArg, _arguments, generator) {
+    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+    var g = generator.apply(thisArg, _arguments || []), i, q = [];
+    return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
+    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
+    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
+    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
+    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
+    function fulfill(value) { resume("next", value); }
+    function reject(value) { resume("throw", value); }
+    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
+}
+
+function __asyncDelegator(o) {
+    var i, p;
+    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
+    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
+}
+
+function __asyncValues(o) {
+    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+    var m = o[Symbol.asyncIterator], i;
+    return m ? m.call(o) : (o = typeof __values$1 === "function" ? __values$1(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+}
+
+function __makeTemplateObject(cooked, raw) {
+    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
+    return cooked;
+}
+var __setModuleDefault = Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+};
+
+var ownKeys = function(o) {
+    ownKeys = Object.getOwnPropertyNames || function (o) {
+        var ar = [];
+        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+        return ar;
+    };
+    return ownKeys(o);
+};
+
+function __importStar(mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+    __setModuleDefault(result, mod);
+    return result;
+}
+
+function __importDefault(mod) {
+    return (mod && mod.__esModule) ? mod : { default: mod };
+}
+
+function __classPrivateFieldGet(receiver, state, kind, f) {
+    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
+    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
+    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
+}
+
+function __classPrivateFieldSet(receiver, state, value, kind, f) {
+    if (kind === "m") throw new TypeError("Private method is not writable");
+    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
+    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
+    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
+}
+
+function __classPrivateFieldIn(state, receiver) {
+    if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
+    return typeof state === "function" ? receiver === state : state.has(receiver);
+}
+
+function __addDisposableResource(env, value, async) {
+    if (value !== null && value !== void 0) {
+        if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
+        var dispose, inner;
+        if (async) {
+            if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
+            dispose = value[Symbol.asyncDispose];
+        }
+        if (dispose === void 0) {
+            if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
+            dispose = value[Symbol.dispose];
+            if (async) inner = dispose;
+        }
+        if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
+        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
+        env.stack.push({ value: value, dispose: dispose, async: async });
+    }
+    else if (async) {
+        env.stack.push({ async: true });
+    }
+    return value;
+
+}
+
+var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
+    var e = new Error(message);
+    return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
+};
+
+function __disposeResources(env) {
+    function fail(e) {
+        env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
+        env.hasError = true;
+    }
+    var r, s = 0;
+    function next() {
+        while (r = env.stack.pop()) {
+            try {
+                if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
+                if (r.dispose) {
+                    var result = r.dispose.call(r.value);
+                    if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
+                }
+                else s |= 1;
+            }
+            catch (e) {
+                fail(e);
+            }
+        }
+        if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
+        if (env.hasError) throw env.error;
+    }
+    return next();
+}
+
+function __rewriteRelativeImportExtension(path, preserveJsx) {
+    if (typeof path === "string" && /^\.\.?\//.test(path)) {
+        return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
+            return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
+        });
+    }
+    return path;
+}
+
+var tslib_es6 = {
+    __extends: __extends,
+    __assign: __assign,
+    __rest: __rest,
+    __decorate: __decorate,
+    __param: __param,
+    __esDecorate: __esDecorate,
+    __runInitializers: __runInitializers,
+    __propKey: __propKey,
+    __setFunctionName: __setFunctionName,
+    __metadata: __metadata,
+    __awaiter: __awaiter$6,
+    __generator: __generator,
+    __createBinding: __createBinding,
+    __exportStar: __exportStar,
+    __values: __values$1,
+    __read: __read,
+    __spread: __spread,
+    __spreadArrays: __spreadArrays,
+    __spreadArray: __spreadArray,
+    __await: __await,
+    __asyncGenerator: __asyncGenerator,
+    __asyncDelegator: __asyncDelegator,
+    __asyncValues: __asyncValues,
+    __makeTemplateObject: __makeTemplateObject,
+    __importStar: __importStar,
+    __importDefault: __importDefault,
+    __classPrivateFieldGet: __classPrivateFieldGet,
+    __classPrivateFieldSet: __classPrivateFieldSet,
+    __classPrivateFieldIn: __classPrivateFieldIn,
+    __addDisposableResource: __addDisposableResource,
+    __disposeResources: __disposeResources,
+    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
+};
+
+var tslib_es6$1 = /*#__PURE__*/Object.freeze({
+	__proto__: null,
+	__addDisposableResource: __addDisposableResource,
+	get __assign () { return __assign; },
+	__asyncDelegator: __asyncDelegator,
+	__asyncGenerator: __asyncGenerator,
+	__asyncValues: __asyncValues,
+	__await: __await,
+	__awaiter: __awaiter$6,
+	__classPrivateFieldGet: __classPrivateFieldGet,
+	__classPrivateFieldIn: __classPrivateFieldIn,
+	__classPrivateFieldSet: __classPrivateFieldSet,
+	__createBinding: __createBinding,
+	__decorate: __decorate,
+	__disposeResources: __disposeResources,
+	__esDecorate: __esDecorate,
+	__exportStar: __exportStar,
+	__extends: __extends,
+	__generator: __generator,
+	__importDefault: __importDefault,
+	__importStar: __importStar,
+	__makeTemplateObject: __makeTemplateObject,
+	__metadata: __metadata,
+	__param: __param,
+	__propKey: __propKey,
+	__read: __read,
+	__rest: __rest,
+	__rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
+	__runInitializers: __runInitializers,
+	__setFunctionName: __setFunctionName,
+	__spread: __spread,
+	__spreadArray: __spreadArray,
+	__spreadArrays: __spreadArrays,
+	__values: __values$1,
+	default: tslib_es6
+});
+
+var require$$0$2 = /*@__PURE__*/getAugmentedNamespace(tslib_es6$1);
+
+var commonjs$d = {};
+
+var pipeline$2 = {};
+
+var commonjs$c = {};
+
+var AbortError$4 = {};
+
+var hasRequiredAbortError$3;
+
+function requireAbortError$3 () {
+	if (hasRequiredAbortError$3) return AbortError$4;
+	hasRequiredAbortError$3 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AbortError$4, "__esModule", { value: true });
+	AbortError$4.AbortError = void 0;
+	/**
+	 * This error is thrown when an asynchronous operation has been aborted.
+	 * Check for this error by testing the `name` that the name property of the
+	 * error matches `"AbortError"`.
+	 *
+	 * @example
+	 * ```ts snippet:ReadmeSampleAbortError
+	 * import { AbortError } from "@typespec/ts-http-runtime";
+	 *
+	 * async function doAsyncWork(options: { abortSignal: AbortSignal }): Promise {
+	 *   if (options.abortSignal.aborted) {
+	 *     throw new AbortError();
+	 *   }
+	 *
+	 *   // do async work
+	 * }
+	 *
+	 * const controller = new AbortController();
+	 * controller.abort();
+	 *
+	 * try {
+	 *   doAsyncWork({ abortSignal: controller.signal });
+	 * } catch (e) {
+	 *   if (e instanceof Error && e.name === "AbortError") {
+	 *     // handle abort error here.
+	 *   }
+	 * }
+	 * ```
+	 */
+	class AbortError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = "AbortError";
+	    }
+	}
+	AbortError$4.AbortError = AbortError;
+	
+	return AbortError$4;
+}
+
+var logger$1 = {};
+
+var debug = {};
+
+var log$5 = {};
+
+var hasRequiredLog$5;
+
+function requireLog$5 () {
+	if (hasRequiredLog$5) return log$5;
+	hasRequiredLog$5 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(log$5, "__esModule", { value: true });
+	log$5.log = log;
+	const tslib_1 = require$$0$2;
+	const node_os_1 = require$$1$8;
+	const node_util_1 = tslib_1.__importDefault(require$$0$a);
+	const node_process_1 = tslib_1.__importDefault(require$$2$3);
+	function log(message, ...args) {
+	    node_process_1.default.stderr.write(`${node_util_1.default.format(message, ...args)}${node_os_1.EOL}`);
+	}
+	
+	return log$5;
+}
+
+var hasRequiredDebug$1;
+
+function requireDebug$1 () {
+	if (hasRequiredDebug$1) return debug;
+	hasRequiredDebug$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(debug, "__esModule", { value: true });
+	const log_js_1 = requireLog$5();
+	const debugEnvVariable = (typeof process !== "undefined" && process.env && process.env.DEBUG) || undefined;
+	let enabledString;
+	let enabledNamespaces = [];
+	let skippedNamespaces = [];
+	const debuggers = [];
+	if (debugEnvVariable) {
+	    enable(debugEnvVariable);
+	}
+	const debugObj = Object.assign((namespace) => {
+	    return createDebugger(namespace);
+	}, {
+	    enable,
+	    enabled,
+	    disable,
+	    log: log_js_1.log,
+	});
+	function enable(namespaces) {
+	    enabledString = namespaces;
+	    enabledNamespaces = [];
+	    skippedNamespaces = [];
+	    const namespaceList = namespaces.split(",").map((ns) => ns.trim());
+	    for (const ns of namespaceList) {
+	        if (ns.startsWith("-")) {
+	            skippedNamespaces.push(ns.substring(1));
+	        }
+	        else {
+	            enabledNamespaces.push(ns);
+	        }
+	    }
+	    for (const instance of debuggers) {
+	        instance.enabled = enabled(instance.namespace);
+	    }
+	}
+	function enabled(namespace) {
+	    if (namespace.endsWith("*")) {
+	        return true;
+	    }
+	    for (const skipped of skippedNamespaces) {
+	        if (namespaceMatches(namespace, skipped)) {
+	            return false;
+	        }
+	    }
+	    for (const enabledNamespace of enabledNamespaces) {
+	        if (namespaceMatches(namespace, enabledNamespace)) {
+	            return true;
+	        }
+	    }
+	    return false;
+	}
+	/**
+	 * Given a namespace, check if it matches a pattern.
+	 * Patterns only have a single wildcard character which is *.
+	 * The behavior of * is that it matches zero or more other characters.
+	 */
+	function namespaceMatches(namespace, patternToMatch) {
+	    // simple case, no pattern matching required
+	    if (patternToMatch.indexOf("*") === -1) {
+	        return namespace === patternToMatch;
+	    }
+	    let pattern = patternToMatch;
+	    // normalize successive * if needed
+	    if (patternToMatch.indexOf("**") !== -1) {
+	        const patternParts = [];
+	        let lastCharacter = "";
+	        for (const character of patternToMatch) {
+	            if (character === "*" && lastCharacter === "*") {
+	                continue;
+	            }
+	            else {
+	                lastCharacter = character;
+	                patternParts.push(character);
+	            }
+	        }
+	        pattern = patternParts.join("");
+	    }
+	    let namespaceIndex = 0;
+	    let patternIndex = 0;
+	    const patternLength = pattern.length;
+	    const namespaceLength = namespace.length;
+	    let lastWildcard = -1;
+	    let lastWildcardNamespace = -1;
+	    while (namespaceIndex < namespaceLength && patternIndex < patternLength) {
+	        if (pattern[patternIndex] === "*") {
+	            lastWildcard = patternIndex;
+	            patternIndex++;
+	            if (patternIndex === patternLength) {
+	                // if wildcard is the last character, it will match the remaining namespace string
+	                return true;
+	            }
+	            // now we let the wildcard eat characters until we match the next literal in the pattern
+	            while (namespace[namespaceIndex] !== pattern[patternIndex]) {
+	                namespaceIndex++;
+	                // reached the end of the namespace without a match
+	                if (namespaceIndex === namespaceLength) {
+	                    return false;
+	                }
+	            }
+	            // now that we have a match, let's try to continue on
+	            // however, it's possible we could find a later match
+	            // so keep a reference in case we have to backtrack
+	            lastWildcardNamespace = namespaceIndex;
+	            namespaceIndex++;
+	            patternIndex++;
+	            continue;
+	        }
+	        else if (pattern[patternIndex] === namespace[namespaceIndex]) {
+	            // simple case: literal pattern matches so keep going
+	            patternIndex++;
+	            namespaceIndex++;
+	        }
+	        else if (lastWildcard >= 0) {
+	            // special case: we don't have a literal match, but there is a previous wildcard
+	            // which we can backtrack to and try having the wildcard eat the match instead
+	            patternIndex = lastWildcard + 1;
+	            namespaceIndex = lastWildcardNamespace + 1;
+	            // we've reached the end of the namespace without a match
+	            if (namespaceIndex === namespaceLength) {
+	                return false;
+	            }
+	            // similar to the previous logic, let's keep going until we find the next literal match
+	            while (namespace[namespaceIndex] !== pattern[patternIndex]) {
+	                namespaceIndex++;
+	                if (namespaceIndex === namespaceLength) {
+	                    return false;
+	                }
+	            }
+	            lastWildcardNamespace = namespaceIndex;
+	            namespaceIndex++;
+	            patternIndex++;
+	            continue;
+	        }
+	        else {
+	            return false;
+	        }
+	    }
+	    const namespaceDone = namespaceIndex === namespace.length;
+	    const patternDone = patternIndex === pattern.length;
+	    // this is to detect the case of an unneeded final wildcard
+	    // e.g. the pattern `ab*` should match the string `ab`
+	    const trailingWildCard = patternIndex === pattern.length - 1 && pattern[patternIndex] === "*";
+	    return namespaceDone && (patternDone || trailingWildCard);
+	}
+	function disable() {
+	    const result = enabledString || "";
+	    enable("");
+	    return result;
+	}
+	function createDebugger(namespace) {
+	    const newDebugger = Object.assign(debug, {
+	        enabled: enabled(namespace),
+	        destroy,
+	        log: debugObj.log,
+	        namespace,
+	        extend,
+	    });
+	    function debug(...args) {
+	        if (!newDebugger.enabled) {
+	            return;
+	        }
+	        if (args.length > 0) {
+	            args[0] = `${namespace} ${args[0]}`;
+	        }
+	        newDebugger.log(...args);
+	    }
+	    debuggers.push(newDebugger);
+	    return newDebugger;
+	}
+	function destroy() {
+	    const index = debuggers.indexOf(this);
+	    if (index >= 0) {
+	        debuggers.splice(index, 1);
+	        return true;
+	    }
+	    return false;
+	}
+	function extend(namespace) {
+	    const newDebugger = createDebugger(`${this.namespace}:${namespace}`);
+	    newDebugger.log = this.log;
+	    return newDebugger;
+	}
+	debug.default = debugObj;
+	
+	return debug;
+}
+
+var hasRequiredLogger$1;
+
+function requireLogger$1 () {
+	if (hasRequiredLogger$1) return logger$1;
+	hasRequiredLogger$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(logger$1, "__esModule", { value: true });
+	logger$1.TypeSpecRuntimeLogger = void 0;
+	logger$1.createLoggerContext = createLoggerContext;
+	logger$1.setLogLevel = setLogLevel;
+	logger$1.getLogLevel = getLogLevel;
+	logger$1.createClientLogger = createClientLogger;
+	const tslib_1 = require$$0$2;
+	const debug_js_1 = tslib_1.__importDefault(requireDebug$1());
+	const TYPESPEC_RUNTIME_LOG_LEVELS = ["verbose", "info", "warning", "error"];
+	const levelMap = {
+	    verbose: 400,
+	    info: 300,
+	    warning: 200,
+	    error: 100,
+	};
+	function patchLogMethod(parent, child) {
+	    child.log = (...args) => {
+	        parent.log(...args);
+	    };
+	}
+	function isTypeSpecRuntimeLogLevel(level) {
+	    return TYPESPEC_RUNTIME_LOG_LEVELS.includes(level);
+	}
+	/**
+	 * Creates a logger context base on the provided options.
+	 * @param options - The options for creating a logger context.
+	 * @returns The logger context.
+	 */
+	function createLoggerContext(options) {
+	    const registeredLoggers = new Set();
+	    const logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env[options.logLevelEnvVarName]) ||
+	        undefined;
+	    let logLevel;
+	    const clientLogger = (0, debug_js_1.default)(options.namespace);
+	    clientLogger.log = (...args) => {
+	        debug_js_1.default.log(...args);
+	    };
+	    function contextSetLogLevel(level) {
+	        if (level && !isTypeSpecRuntimeLogLevel(level)) {
+	            throw new Error(`Unknown log level '${level}'. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(",")}`);
+	        }
+	        logLevel = level;
+	        const enabledNamespaces = [];
+	        for (const logger of registeredLoggers) {
+	            if (shouldEnable(logger)) {
+	                enabledNamespaces.push(logger.namespace);
+	            }
+	        }
+	        debug_js_1.default.enable(enabledNamespaces.join(","));
+	    }
+	    if (logLevelFromEnv) {
+	        // avoid calling setLogLevel because we don't want a mis-set environment variable to crash
+	        if (isTypeSpecRuntimeLogLevel(logLevelFromEnv)) {
+	            contextSetLogLevel(logLevelFromEnv);
+	        }
+	        else {
+	            console.error(`${options.logLevelEnvVarName} set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(", ")}.`);
+	        }
+	    }
+	    function shouldEnable(logger) {
+	        return Boolean(logLevel && levelMap[logger.level] <= levelMap[logLevel]);
+	    }
+	    function createLogger(parent, level) {
+	        const logger = Object.assign(parent.extend(level), {
+	            level,
+	        });
+	        patchLogMethod(parent, logger);
+	        if (shouldEnable(logger)) {
+	            const enabledNamespaces = debug_js_1.default.disable();
+	            debug_js_1.default.enable(enabledNamespaces + "," + logger.namespace);
+	        }
+	        registeredLoggers.add(logger);
+	        return logger;
+	    }
+	    function contextGetLogLevel() {
+	        return logLevel;
+	    }
+	    function contextCreateClientLogger(namespace) {
+	        const clientRootLogger = clientLogger.extend(namespace);
+	        patchLogMethod(clientLogger, clientRootLogger);
+	        return {
+	            error: createLogger(clientRootLogger, "error"),
+	            warning: createLogger(clientRootLogger, "warning"),
+	            info: createLogger(clientRootLogger, "info"),
+	            verbose: createLogger(clientRootLogger, "verbose"),
+	        };
+	    }
+	    return {
+	        setLogLevel: contextSetLogLevel,
+	        getLogLevel: contextGetLogLevel,
+	        createClientLogger: contextCreateClientLogger,
+	        logger: clientLogger,
+	    };
+	}
+	const context = createLoggerContext({
+	    logLevelEnvVarName: "TYPESPEC_RUNTIME_LOG_LEVEL",
+	    namespace: "typeSpecRuntime",
+	});
+	/**
+	 * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
+	 * @param level - The log level to enable for logging.
+	 * Options from most verbose to least verbose are:
+	 * - verbose
+	 * - info
+	 * - warning
+	 * - error
+	 */
+	// eslint-disable-next-line @typescript-eslint/no-redeclare
+	logger$1.TypeSpecRuntimeLogger = context.logger;
+	/**
+	 * Retrieves the currently specified log level.
+	 */
+	function setLogLevel(logLevel) {
+	    context.setLogLevel(logLevel);
+	}
+	/**
+	 * Retrieves the currently specified log level.
+	 */
+	function getLogLevel() {
+	    return context.getLogLevel();
+	}
+	/**
+	 * Creates a logger for use by the SDKs that inherits from `TypeSpecRuntimeLogger`.
+	 * @param namespace - The name of the SDK package.
+	 * @hidden
+	 */
+	function createClientLogger(namespace) {
+	    return context.createClientLogger(namespace);
+	}
+	
+	return logger$1;
+}
+
+var httpHeaders$1 = {};
+
+var hasRequiredHttpHeaders$1;
+
+function requireHttpHeaders$1 () {
+	if (hasRequiredHttpHeaders$1) return httpHeaders$1;
+	hasRequiredHttpHeaders$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(httpHeaders$1, "__esModule", { value: true });
+	httpHeaders$1.createHttpHeaders = createHttpHeaders;
+	function normalizeName(name) {
+	    return name.toLowerCase();
+	}
+	function* headerIterator(map) {
+	    for (const entry of map.values()) {
+	        yield [entry.name, entry.value];
+	    }
+	}
+	class HttpHeadersImpl {
+	    _headersMap;
+	    constructor(rawHeaders) {
+	        this._headersMap = new Map();
+	        if (rawHeaders) {
+	            for (const headerName of Object.keys(rawHeaders)) {
+	                this.set(headerName, rawHeaders[headerName]);
+	            }
+	        }
+	    }
+	    /**
+	     * Set a header in this collection with the provided name and value. The name is
+	     * case-insensitive.
+	     * @param name - The name of the header to set. This value is case-insensitive.
+	     * @param value - The value of the header to set.
+	     */
+	    set(name, value) {
+	        this._headersMap.set(normalizeName(name), { name, value: String(value).trim() });
+	    }
+	    /**
+	     * Get the header value for the provided header name, or undefined if no header exists in this
+	     * collection with the provided name.
+	     * @param name - The name of the header. This value is case-insensitive.
+	     */
+	    get(name) {
+	        return this._headersMap.get(normalizeName(name))?.value;
+	    }
+	    /**
+	     * Get whether or not this header collection contains a header entry for the provided header name.
+	     * @param name - The name of the header to set. This value is case-insensitive.
+	     */
+	    has(name) {
+	        return this._headersMap.has(normalizeName(name));
+	    }
+	    /**
+	     * Remove the header with the provided headerName.
+	     * @param name - The name of the header to remove.
+	     */
+	    delete(name) {
+	        this._headersMap.delete(normalizeName(name));
+	    }
+	    /**
+	     * Get the JSON object representation of this HTTP header collection.
+	     */
+	    toJSON(options = {}) {
+	        const result = {};
+	        if (options.preserveCase) {
+	            for (const entry of this._headersMap.values()) {
+	                result[entry.name] = entry.value;
+	            }
+	        }
+	        else {
+	            for (const [normalizedName, entry] of this._headersMap) {
+	                result[normalizedName] = entry.value;
+	            }
+	        }
+	        return result;
+	    }
+	    /**
+	     * Get the string representation of this HTTP header collection.
+	     */
+	    toString() {
+	        return JSON.stringify(this.toJSON({ preserveCase: true }));
+	    }
+	    /**
+	     * Iterate over tuples of header [name, value] pairs.
+	     */
+	    [Symbol.iterator]() {
+	        return headerIterator(this._headersMap);
+	    }
+	}
+	/**
+	 * Creates an object that satisfies the `HttpHeaders` interface.
+	 * @param rawHeaders - A simple object representing initial headers
+	 */
+	function createHttpHeaders(rawHeaders) {
+	    return new HttpHeadersImpl(rawHeaders);
+	}
+	
+	return httpHeaders$1;
+}
+
+var schemes = {};
+
+var hasRequiredSchemes;
+
+function requireSchemes () {
+	if (hasRequiredSchemes) return schemes;
+	hasRequiredSchemes = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(schemes, "__esModule", { value: true });
+	
+	return schemes;
+}
+
+var oauth2Flows = {};
+
+var hasRequiredOauth2Flows;
+
+function requireOauth2Flows () {
+	if (hasRequiredOauth2Flows) return oauth2Flows;
+	hasRequiredOauth2Flows = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(oauth2Flows, "__esModule", { value: true });
+	
+	return oauth2Flows;
+}
+
+var pipelineRequest$1 = {};
+
+var uuidUtils = {};
+
+var hasRequiredUuidUtils;
+
+function requireUuidUtils () {
+	if (hasRequiredUuidUtils) return uuidUtils;
+	hasRequiredUuidUtils = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(uuidUtils, "__esModule", { value: true });
+	uuidUtils.randomUUID = randomUUID;
+	/**
+	 * Generated Universally Unique Identifier
+	 *
+	 * @returns RFC4122 v4 UUID.
+	 */
+	function randomUUID() {
+	    return crypto.randomUUID();
+	}
+	
+	return uuidUtils;
+}
+
+var hasRequiredPipelineRequest$1;
+
+function requirePipelineRequest$1 () {
+	if (hasRequiredPipelineRequest$1) return pipelineRequest$1;
+	hasRequiredPipelineRequest$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(pipelineRequest$1, "__esModule", { value: true });
+	pipelineRequest$1.createPipelineRequest = createPipelineRequest;
+	const httpHeaders_js_1 = requireHttpHeaders$1();
+	const uuidUtils_js_1 = requireUuidUtils();
+	class PipelineRequestImpl {
+	    url;
+	    method;
+	    headers;
+	    timeout;
+	    withCredentials;
+	    body;
+	    multipartBody;
+	    formData;
+	    streamResponseStatusCodes;
+	    enableBrowserStreams;
+	    proxySettings;
+	    disableKeepAlive;
+	    abortSignal;
+	    requestId;
+	    allowInsecureConnection;
+	    onUploadProgress;
+	    onDownloadProgress;
+	    requestOverrides;
+	    authSchemes;
+	    constructor(options) {
+	        this.url = options.url;
+	        this.body = options.body;
+	        this.headers = options.headers ?? (0, httpHeaders_js_1.createHttpHeaders)();
+	        this.method = options.method ?? "GET";
+	        this.timeout = options.timeout ?? 0;
+	        this.multipartBody = options.multipartBody;
+	        this.formData = options.formData;
+	        this.disableKeepAlive = options.disableKeepAlive ?? false;
+	        this.proxySettings = options.proxySettings;
+	        this.streamResponseStatusCodes = options.streamResponseStatusCodes;
+	        this.withCredentials = options.withCredentials ?? false;
+	        this.abortSignal = options.abortSignal;
+	        this.onUploadProgress = options.onUploadProgress;
+	        this.onDownloadProgress = options.onDownloadProgress;
+	        this.requestId = options.requestId || (0, uuidUtils_js_1.randomUUID)();
+	        this.allowInsecureConnection = options.allowInsecureConnection ?? false;
+	        this.enableBrowserStreams = options.enableBrowserStreams ?? false;
+	        this.requestOverrides = options.requestOverrides;
+	        this.authSchemes = options.authSchemes;
+	    }
+	}
+	/**
+	 * Creates a new pipeline request with the given options.
+	 * This method is to allow for the easy setting of default values and not required.
+	 * @param options - The options to create the request with.
+	 */
+	function createPipelineRequest(options) {
+	    return new PipelineRequestImpl(options);
+	}
+	
+	return pipelineRequest$1;
+}
+
+var pipeline$1 = {};
+
+var hasRequiredPipeline$3;
+
+function requirePipeline$3 () {
+	if (hasRequiredPipeline$3) return pipeline$1;
+	hasRequiredPipeline$3 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(pipeline$1, "__esModule", { value: true });
+	pipeline$1.createEmptyPipeline = createEmptyPipeline;
+	const ValidPhaseNames = new Set(["Deserialize", "Serialize", "Retry", "Sign"]);
+	/**
+	 * A private implementation of Pipeline.
+	 * Do not export this class from the package.
+	 * @internal
+	 */
+	class HttpPipeline {
+	    _policies = [];
+	    _orderedPolicies;
+	    constructor(policies) {
+	        this._policies = policies?.slice(0) ?? [];
+	        this._orderedPolicies = undefined;
+	    }
+	    addPolicy(policy, options = {}) {
+	        if (options.phase && options.afterPhase) {
+	            throw new Error("Policies inside a phase cannot specify afterPhase.");
+	        }
+	        if (options.phase && !ValidPhaseNames.has(options.phase)) {
+	            throw new Error(`Invalid phase name: ${options.phase}`);
+	        }
+	        if (options.afterPhase && !ValidPhaseNames.has(options.afterPhase)) {
+	            throw new Error(`Invalid afterPhase name: ${options.afterPhase}`);
+	        }
+	        this._policies.push({
+	            policy,
+	            options,
+	        });
+	        this._orderedPolicies = undefined;
+	    }
+	    removePolicy(options) {
+	        const removedPolicies = [];
+	        this._policies = this._policies.filter((policyDescriptor) => {
+	            if ((options.name && policyDescriptor.policy.name === options.name) ||
+	                (options.phase && policyDescriptor.options.phase === options.phase)) {
+	                removedPolicies.push(policyDescriptor.policy);
+	                return false;
+	            }
+	            else {
+	                return true;
+	            }
+	        });
+	        this._orderedPolicies = undefined;
+	        return removedPolicies;
+	    }
+	    sendRequest(httpClient, request) {
+	        const policies = this.getOrderedPolicies();
+	        const pipeline = policies.reduceRight((next, policy) => {
+	            return (req) => {
+	                return policy.sendRequest(req, next);
+	            };
+	        }, (req) => httpClient.sendRequest(req));
+	        return pipeline(request);
+	    }
+	    getOrderedPolicies() {
+	        if (!this._orderedPolicies) {
+	            this._orderedPolicies = this.orderPolicies();
+	        }
+	        return this._orderedPolicies;
+	    }
+	    clone() {
+	        return new HttpPipeline(this._policies);
+	    }
+	    static create() {
+	        return new HttpPipeline();
+	    }
+	    orderPolicies() {
+	        /**
+	         * The goal of this method is to reliably order pipeline policies
+	         * based on their declared requirements when they were added.
+	         *
+	         * Order is first determined by phase:
+	         *
+	         * 1. Serialize Phase
+	         * 2. Policies not in a phase
+	         * 3. Deserialize Phase
+	         * 4. Retry Phase
+	         * 5. Sign Phase
+	         *
+	         * Within each phase, policies are executed in the order
+	         * they were added unless they were specified to execute
+	         * before/after other policies or after a particular phase.
+	         *
+	         * To determine the final order, we will walk the policy list
+	         * in phase order multiple times until all dependencies are
+	         * satisfied.
+	         *
+	         * `afterPolicies` are the set of policies that must be
+	         * executed before a given policy. This requirement is
+	         * considered satisfied when each of the listed policies
+	         * have been scheduled.
+	         *
+	         * `beforePolicies` are the set of policies that must be
+	         * executed after a given policy. Since this dependency
+	         * can be expressed by converting it into a equivalent
+	         * `afterPolicies` declarations, they are normalized
+	         * into that form for simplicity.
+	         *
+	         * An `afterPhase` dependency is considered satisfied when all
+	         * policies in that phase have scheduled.
+	         *
+	         */
+	        const result = [];
+	        // Track all policies we know about.
+	        const policyMap = new Map();
+	        function createPhase(name) {
+	            return {
+	                name,
+	                policies: new Set(),
+	                hasRun: false,
+	                hasAfterPolicies: false,
+	            };
+	        }
+	        // Track policies for each phase.
+	        const serializePhase = createPhase("Serialize");
+	        const noPhase = createPhase("None");
+	        const deserializePhase = createPhase("Deserialize");
+	        const retryPhase = createPhase("Retry");
+	        const signPhase = createPhase("Sign");
+	        // a list of phases in order
+	        const orderedPhases = [serializePhase, noPhase, deserializePhase, retryPhase, signPhase];
+	        // Small helper function to map phase name to each Phase
+	        function getPhase(phase) {
+	            if (phase === "Retry") {
+	                return retryPhase;
+	            }
+	            else if (phase === "Serialize") {
+	                return serializePhase;
+	            }
+	            else if (phase === "Deserialize") {
+	                return deserializePhase;
+	            }
+	            else if (phase === "Sign") {
+	                return signPhase;
+	            }
+	            else {
+	                return noPhase;
+	            }
+	        }
+	        // First walk each policy and create a node to track metadata.
+	        for (const descriptor of this._policies) {
+	            const policy = descriptor.policy;
+	            const options = descriptor.options;
+	            const policyName = policy.name;
+	            if (policyMap.has(policyName)) {
+	                throw new Error("Duplicate policy names not allowed in pipeline");
+	            }
+	            const node = {
+	                policy,
+	                dependsOn: new Set(),
+	                dependants: new Set(),
+	            };
+	            if (options.afterPhase) {
+	                node.afterPhase = getPhase(options.afterPhase);
+	                node.afterPhase.hasAfterPolicies = true;
+	            }
+	            policyMap.set(policyName, node);
+	            const phase = getPhase(options.phase);
+	            phase.policies.add(node);
+	        }
+	        // Now that each policy has a node, connect dependency references.
+	        for (const descriptor of this._policies) {
+	            const { policy, options } = descriptor;
+	            const policyName = policy.name;
+	            const node = policyMap.get(policyName);
+	            if (!node) {
+	                throw new Error(`Missing node for policy ${policyName}`);
+	            }
+	            if (options.afterPolicies) {
+	                for (const afterPolicyName of options.afterPolicies) {
+	                    const afterNode = policyMap.get(afterPolicyName);
+	                    if (afterNode) {
+	                        // Linking in both directions helps later
+	                        // when we want to notify dependants.
+	                        node.dependsOn.add(afterNode);
+	                        afterNode.dependants.add(node);
+	                    }
+	                }
+	            }
+	            if (options.beforePolicies) {
+	                for (const beforePolicyName of options.beforePolicies) {
+	                    const beforeNode = policyMap.get(beforePolicyName);
+	                    if (beforeNode) {
+	                        // To execute before another node, make it
+	                        // depend on the current node.
+	                        beforeNode.dependsOn.add(node);
+	                        node.dependants.add(beforeNode);
+	                    }
+	                }
+	            }
+	        }
+	        function walkPhase(phase) {
+	            phase.hasRun = true;
+	            // Sets iterate in insertion order
+	            for (const node of phase.policies) {
+	                if (node.afterPhase && (!node.afterPhase.hasRun || node.afterPhase.policies.size)) {
+	                    // If this node is waiting on a phase to complete,
+	                    // we need to skip it for now.
+	                    // Even if the phase is empty, we should wait for it
+	                    // to be walked to avoid re-ordering policies.
+	                    continue;
+	                }
+	                if (node.dependsOn.size === 0) {
+	                    // If there's nothing else we're waiting for, we can
+	                    // add this policy to the result list.
+	                    result.push(node.policy);
+	                    // Notify anything that depends on this policy that
+	                    // the policy has been scheduled.
+	                    for (const dependant of node.dependants) {
+	                        dependant.dependsOn.delete(node);
+	                    }
+	                    policyMap.delete(node.policy.name);
+	                    phase.policies.delete(node);
+	                }
+	            }
+	        }
+	        function walkPhases() {
+	            for (const phase of orderedPhases) {
+	                walkPhase(phase);
+	                // if the phase isn't complete
+	                if (phase.policies.size > 0 && phase !== noPhase) {
+	                    if (!noPhase.hasRun) {
+	                        // Try running noPhase to see if that unblocks this phase next tick.
+	                        // This can happen if a phase that happens before noPhase
+	                        // is waiting on a noPhase policy to complete.
+	                        walkPhase(noPhase);
+	                    }
+	                    // Don't proceed to the next phase until this phase finishes.
+	                    return;
+	                }
+	                if (phase.hasAfterPolicies) {
+	                    // Run any policies unblocked by this phase
+	                    walkPhase(noPhase);
+	                }
+	            }
+	        }
+	        // Iterate until we've put every node in the result list.
+	        let iteration = 0;
+	        while (policyMap.size > 0) {
+	            iteration++;
+	            const initialResultLength = result.length;
+	            // Keep walking each phase in order until we can order every node.
+	            walkPhases();
+	            // The result list *should* get at least one larger each time
+	            // after the first full pass.
+	            // Otherwise, we're going to loop forever.
+	            if (result.length <= initialResultLength && iteration > 1) {
+	                throw new Error("Cannot satisfy policy dependencies due to requirements cycle.");
+	            }
+	        }
+	        return result;
+	    }
+	}
+	/**
+	 * Creates a totally empty pipeline.
+	 * Useful for testing or creating a custom one.
+	 */
+	function createEmptyPipeline() {
+	    return HttpPipeline.create();
+	}
+	
+	return pipeline$1;
+}
+
+var restError$2 = {};
+
+var error$1 = {};
+
+var object = {};
+
+var hasRequiredObject;
+
+function requireObject () {
+	if (hasRequiredObject) return object;
+	hasRequiredObject = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(object, "__esModule", { value: true });
+	object.isObject = isObject;
+	/**
+	 * Helper to determine when an input is a generic JS object.
+	 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
+	 */
+	function isObject(input) {
+	    return (typeof input === "object" &&
+	        input !== null &&
+	        !Array.isArray(input) &&
+	        !(input instanceof RegExp) &&
+	        !(input instanceof Date));
+	}
+	
+	return object;
+}
+
+var hasRequiredError$1;
+
+function requireError$1 () {
+	if (hasRequiredError$1) return error$1;
+	hasRequiredError$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(error$1, "__esModule", { value: true });
+	error$1.isError = isError;
+	const object_js_1 = requireObject();
+	/**
+	 * Typeguard for an error object shape (has name and message)
+	 * @param e - Something caught by a catch clause.
+	 */
+	function isError(e) {
+	    if ((0, object_js_1.isObject)(e)) {
+	        const hasName = typeof e.name === "string";
+	        const hasMessage = typeof e.message === "string";
+	        return hasName && hasMessage;
+	    }
+	    return false;
+	}
+	
+	return error$1;
+}
+
+var inspect = {};
+
+var hasRequiredInspect;
+
+function requireInspect () {
+	if (hasRequiredInspect) return inspect;
+	hasRequiredInspect = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(inspect, "__esModule", { value: true });
+	inspect.custom = void 0;
+	const node_util_1 = require$$0$a;
+	inspect.custom = node_util_1.inspect.custom;
+	
+	return inspect;
+}
+
+var sanitizer = {};
+
+var hasRequiredSanitizer;
+
+function requireSanitizer () {
+	if (hasRequiredSanitizer) return sanitizer;
+	hasRequiredSanitizer = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(sanitizer, "__esModule", { value: true });
+	sanitizer.Sanitizer = void 0;
+	const object_js_1 = requireObject();
+	const RedactedString = "REDACTED";
+	// Make sure this list is up-to-date with the one under core/logger/Readme#Keyconcepts
+	const defaultAllowedHeaderNames = [
+	    "x-ms-client-request-id",
+	    "x-ms-return-client-request-id",
+	    "x-ms-useragent",
+	    "x-ms-correlation-request-id",
+	    "x-ms-request-id",
+	    "client-request-id",
+	    "ms-cv",
+	    "return-client-request-id",
+	    "traceparent",
+	    "Access-Control-Allow-Credentials",
+	    "Access-Control-Allow-Headers",
+	    "Access-Control-Allow-Methods",
+	    "Access-Control-Allow-Origin",
+	    "Access-Control-Expose-Headers",
+	    "Access-Control-Max-Age",
+	    "Access-Control-Request-Headers",
+	    "Access-Control-Request-Method",
+	    "Origin",
+	    "Accept",
+	    "Accept-Encoding",
+	    "Cache-Control",
+	    "Connection",
+	    "Content-Length",
+	    "Content-Type",
+	    "Date",
+	    "ETag",
+	    "Expires",
+	    "If-Match",
+	    "If-Modified-Since",
+	    "If-None-Match",
+	    "If-Unmodified-Since",
+	    "Last-Modified",
+	    "Pragma",
+	    "Request-Id",
+	    "Retry-After",
+	    "Server",
+	    "Transfer-Encoding",
+	    "User-Agent",
+	    "WWW-Authenticate",
+	];
+	const defaultAllowedQueryParameters = ["api-version"];
+	/**
+	 * A utility class to sanitize objects for logging.
+	 */
+	class Sanitizer {
+	    allowedHeaderNames;
+	    allowedQueryParameters;
+	    constructor({ additionalAllowedHeaderNames: allowedHeaderNames = [], additionalAllowedQueryParameters: allowedQueryParameters = [], } = {}) {
+	        allowedHeaderNames = defaultAllowedHeaderNames.concat(allowedHeaderNames);
+	        allowedQueryParameters = defaultAllowedQueryParameters.concat(allowedQueryParameters);
+	        this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
+	        this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
+	    }
+	    /**
+	     * Sanitizes an object for logging.
+	     * @param obj - The object to sanitize
+	     * @returns - The sanitized object as a string
+	     */
+	    sanitize(obj) {
+	        const seen = new Set();
+	        return JSON.stringify(obj, (key, value) => {
+	            // Ensure Errors include their interesting non-enumerable members
+	            if (value instanceof Error) {
+	                return {
+	                    ...value,
+	                    name: value.name,
+	                    message: value.message,
+	                };
+	            }
+	            if (key === "headers") {
+	                return this.sanitizeHeaders(value);
+	            }
+	            else if (key === "url") {
+	                return this.sanitizeUrl(value);
+	            }
+	            else if (key === "query") {
+	                return this.sanitizeQuery(value);
+	            }
+	            else if (key === "body") {
+	                // Don't log the request body
+	                return undefined;
+	            }
+	            else if (key === "response") {
+	                // Don't log response again
+	                return undefined;
+	            }
+	            else if (key === "operationSpec") {
+	                // When using sendOperationRequest, the request carries a massive
+	                // field with the autorest spec. No need to log it.
+	                return undefined;
+	            }
+	            else if (Array.isArray(value) || (0, object_js_1.isObject)(value)) {
+	                if (seen.has(value)) {
+	                    return "[Circular]";
+	                }
+	                seen.add(value);
+	            }
+	            return value;
+	        }, 2);
+	    }
+	    /**
+	     * Sanitizes a URL for logging.
+	     * @param value - The URL to sanitize
+	     * @returns - The sanitized URL as a string
+	     */
+	    sanitizeUrl(value) {
+	        if (typeof value !== "string" || value === null || value === "") {
+	            return value;
+	        }
+	        const url = new URL(value);
+	        if (!url.search) {
+	            return value;
+	        }
+	        for (const [key] of url.searchParams) {
+	            if (!this.allowedQueryParameters.has(key.toLowerCase())) {
+	                url.searchParams.set(key, RedactedString);
+	            }
+	        }
+	        return url.toString();
+	    }
+	    sanitizeHeaders(obj) {
+	        const sanitized = {};
+	        for (const key of Object.keys(obj)) {
+	            if (this.allowedHeaderNames.has(key.toLowerCase())) {
+	                sanitized[key] = obj[key];
+	            }
+	            else {
+	                sanitized[key] = RedactedString;
+	            }
+	        }
+	        return sanitized;
+	    }
+	    sanitizeQuery(value) {
+	        if (typeof value !== "object" || value === null) {
+	            return value;
+	        }
+	        const sanitized = {};
+	        for (const k of Object.keys(value)) {
+	            if (this.allowedQueryParameters.has(k.toLowerCase())) {
+	                sanitized[k] = value[k];
+	            }
+	            else {
+	                sanitized[k] = RedactedString;
+	            }
+	        }
+	        return sanitized;
+	    }
+	}
+	sanitizer.Sanitizer = Sanitizer;
+	
+	return sanitizer;
+}
+
+var hasRequiredRestError$2;
+
+function requireRestError$2 () {
+	if (hasRequiredRestError$2) return restError$2;
+	hasRequiredRestError$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(restError$2, "__esModule", { value: true });
+	restError$2.RestError = void 0;
+	restError$2.isRestError = isRestError;
+	const error_js_1 = requireError$1();
+	const inspect_js_1 = requireInspect();
+	const sanitizer_js_1 = requireSanitizer();
+	const errorSanitizer = new sanitizer_js_1.Sanitizer();
+	/**
+	 * A custom error type for failed pipeline requests.
+	 */
+	class RestError extends Error {
+	    /**
+	     * Something went wrong when making the request.
+	     * This means the actual request failed for some reason,
+	     * such as a DNS issue or the connection being lost.
+	     */
+	    static REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
+	    /**
+	     * This means that parsing the response from the server failed.
+	     * It may have been malformed.
+	     */
+	    static PARSE_ERROR = "PARSE_ERROR";
+	    /**
+	     * The code of the error itself (use statics on RestError if possible.)
+	     */
+	    code;
+	    /**
+	     * The HTTP status code of the request (if applicable.)
+	     */
+	    statusCode;
+	    /**
+	     * The request that was made.
+	     * This property is non-enumerable.
+	     */
+	    request;
+	    /**
+	     * The response received (if any.)
+	     * This property is non-enumerable.
+	     */
+	    response;
+	    /**
+	     * Bonus property set by the throw site.
+	     */
+	    details;
+	    constructor(message, options = {}) {
+	        super(message);
+	        this.name = "RestError";
+	        this.code = options.code;
+	        this.statusCode = options.statusCode;
+	        // The request and response may contain sensitive information in the headers or body.
+	        // To help prevent this sensitive information being accidentally logged, the request and response
+	        // properties are marked as non-enumerable here. This prevents them showing up in the output of
+	        // JSON.stringify and console.log.
+	        Object.defineProperty(this, "request", { value: options.request, enumerable: false });
+	        Object.defineProperty(this, "response", { value: options.response, enumerable: false });
+	        // Only include useful agent information in the request for logging, as the full agent object
+	        // may contain large binary data.
+	        const agent = this.request?.agent
+	            ? {
+	                maxFreeSockets: this.request.agent.maxFreeSockets,
+	                maxSockets: this.request.agent.maxSockets,
+	            }
+	            : undefined;
+	        // Logging method for util.inspect in Node
+	        Object.defineProperty(this, inspect_js_1.custom, {
+	            value: () => {
+	                // Extract non-enumerable properties and add them back. This is OK since in this output the request and
+	                // response get sanitized.
+	                return `RestError: ${this.message} \n ${errorSanitizer.sanitize({
+	                    ...this,
+	                    request: { ...this.request, agent },
+	                    response: this.response,
+	                })}`;
+	            },
+	            enumerable: false,
+	        });
+	        Object.setPrototypeOf(this, RestError.prototype);
+	    }
+	}
+	restError$2.RestError = RestError;
+	/**
+	 * Typeguard for RestError
+	 * @param e - Something caught by a catch clause.
+	 */
+	function isRestError(e) {
+	    if (e instanceof RestError) {
+	        return true;
+	    }
+	    return (0, error_js_1.isError)(e) && e.name === "RestError";
+	}
+	
+	return restError$2;
+}
+
+var bytesEncoding = {};
+
+var hasRequiredBytesEncoding;
+
+function requireBytesEncoding () {
+	if (hasRequiredBytesEncoding) return bytesEncoding;
+	hasRequiredBytesEncoding = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(bytesEncoding, "__esModule", { value: true });
+	bytesEncoding.uint8ArrayToString = uint8ArrayToString;
+	bytesEncoding.stringToUint8Array = stringToUint8Array;
+	/**
+	 * The helper that transforms bytes with specific character encoding into string
+	 * @param bytes - the uint8array bytes
+	 * @param format - the format we use to encode the byte
+	 * @returns a string of the encoded string
+	 */
+	function uint8ArrayToString(bytes, format) {
+	    return Buffer.from(bytes).toString(format);
+	}
+	/**
+	 * The helper that transforms string to specific character encoded bytes array.
+	 * @param value - the string to be converted
+	 * @param format - the format we use to decode the value
+	 * @returns a uint8array
+	 */
+	function stringToUint8Array(value, format) {
+	    return Buffer.from(value, format);
+	}
+	
+	return bytesEncoding;
+}
+
+var defaultHttpClient$1 = {};
+
+var nodeHttpClient = {};
+
+var log$4 = {};
+
+var hasRequiredLog$4;
+
+function requireLog$4 () {
+	if (hasRequiredLog$4) return log$4;
+	hasRequiredLog$4 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(log$4, "__esModule", { value: true });
+	log$4.logger = void 0;
+	const logger_js_1 = requireLogger$1();
+	log$4.logger = (0, logger_js_1.createClientLogger)("ts-http-runtime");
+	
+	return log$4;
+}
+
+var hasRequiredNodeHttpClient;
+
+function requireNodeHttpClient () {
+	if (hasRequiredNodeHttpClient) return nodeHttpClient;
+	hasRequiredNodeHttpClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(nodeHttpClient, "__esModule", { value: true });
+	nodeHttpClient.getBodyLength = getBodyLength;
+	nodeHttpClient.createNodeHttpClient = createNodeHttpClient;
+	const tslib_1 = require$$0$2;
+	const node_http_1 = tslib_1.__importDefault(require$$2);
+	const node_https_1 = tslib_1.__importDefault(require$$2$4);
+	const node_zlib_1 = tslib_1.__importDefault(require$$3);
+	const node_stream_1 = require$$0$8;
+	const AbortError_js_1 = requireAbortError$3();
+	const httpHeaders_js_1 = requireHttpHeaders$1();
+	const restError_js_1 = requireRestError$2();
+	const log_js_1 = requireLog$4();
+	const sanitizer_js_1 = requireSanitizer();
+	const DEFAULT_TLS_SETTINGS = {};
+	function isReadableStream(body) {
+	    return body && typeof body.pipe === "function";
+	}
+	function isStreamComplete(stream) {
+	    if (stream.readable === false) {
+	        return Promise.resolve();
+	    }
+	    return new Promise((resolve) => {
+	        const handler = () => {
+	            resolve();
+	            stream.removeListener("close", handler);
+	            stream.removeListener("end", handler);
+	            stream.removeListener("error", handler);
+	        };
+	        stream.on("close", handler);
+	        stream.on("end", handler);
+	        stream.on("error", handler);
+	    });
+	}
+	function isArrayBuffer(body) {
+	    return body && typeof body.byteLength === "number";
+	}
+	class ReportTransform extends node_stream_1.Transform {
+	    loadedBytes = 0;
+	    progressCallback;
+	    // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
+	    _transform(chunk, _encoding, callback) {
+	        this.push(chunk);
+	        this.loadedBytes += chunk.length;
+	        try {
+	            this.progressCallback({ loadedBytes: this.loadedBytes });
+	            callback();
+	        }
+	        catch (e) {
+	            callback(e);
+	        }
+	    }
+	    constructor(progressCallback) {
+	        super();
+	        this.progressCallback = progressCallback;
+	    }
+	}
+	/**
+	 * A HttpClient implementation that uses Node's "https" module to send HTTPS requests.
+	 * @internal
+	 */
+	class NodeHttpClient {
+	    cachedHttpAgent;
+	    cachedHttpsAgents = new WeakMap();
+	    /**
+	     * Makes a request over an underlying transport layer and returns the response.
+	     * @param request - The request to be made.
+	     */
+	    async sendRequest(request) {
+	        const abortController = new AbortController();
+	        let abortListener;
+	        if (request.abortSignal) {
+	            if (request.abortSignal.aborted) {
+	                throw new AbortError_js_1.AbortError("The operation was aborted. Request has already been canceled.");
+	            }
+	            abortListener = (event) => {
+	                if (event.type === "abort") {
+	                    abortController.abort();
+	                }
+	            };
+	            request.abortSignal.addEventListener("abort", abortListener);
+	        }
+	        let timeoutId;
+	        if (request.timeout > 0) {
+	            timeoutId = setTimeout(() => {
+	                const sanitizer = new sanitizer_js_1.Sanitizer();
+	                log_js_1.logger.info(`request to '${sanitizer.sanitizeUrl(request.url)}' timed out. canceling...`);
+	                abortController.abort();
+	            }, request.timeout);
+	        }
+	        const acceptEncoding = request.headers.get("Accept-Encoding");
+	        const shouldDecompress = acceptEncoding?.includes("gzip") || acceptEncoding?.includes("deflate");
+	        let body = typeof request.body === "function" ? request.body() : request.body;
+	        if (body && !request.headers.has("Content-Length")) {
+	            const bodyLength = getBodyLength(body);
+	            if (bodyLength !== null) {
+	                request.headers.set("Content-Length", bodyLength);
+	            }
+	        }
+	        let responseStream;
+	        try {
+	            if (body && request.onUploadProgress) {
+	                const onUploadProgress = request.onUploadProgress;
+	                const uploadReportStream = new ReportTransform(onUploadProgress);
+	                uploadReportStream.on("error", (e) => {
+	                    log_js_1.logger.error("Error in upload progress", e);
+	                });
+	                if (isReadableStream(body)) {
+	                    body.pipe(uploadReportStream);
+	                }
+	                else {
+	                    uploadReportStream.end(body);
+	                }
+	                body = uploadReportStream;
+	            }
+	            const res = await this.makeRequest(request, abortController, body);
+	            if (timeoutId !== undefined) {
+	                clearTimeout(timeoutId);
+	            }
+	            const headers = getResponseHeaders(res);
+	            const status = res.statusCode ?? 0;
+	            const response = {
+	                status,
+	                headers,
+	                request,
+	            };
+	            // Responses to HEAD must not have a body.
+	            // If they do return a body, that body must be ignored.
+	            if (request.method === "HEAD") {
+	                // call resume() and not destroy() to avoid closing the socket
+	                // and losing keep alive
+	                res.resume();
+	                return response;
+	            }
+	            responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;
+	            const onDownloadProgress = request.onDownloadProgress;
+	            if (onDownloadProgress) {
+	                const downloadReportStream = new ReportTransform(onDownloadProgress);
+	                downloadReportStream.on("error", (e) => {
+	                    log_js_1.logger.error("Error in download progress", e);
+	                });
+	                responseStream.pipe(downloadReportStream);
+	                responseStream = downloadReportStream;
+	            }
+	            if (
+	            // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
+	            request.streamResponseStatusCodes?.has(Number.POSITIVE_INFINITY) ||
+	                request.streamResponseStatusCodes?.has(response.status)) {
+	                response.readableStreamBody = responseStream;
+	            }
+	            else {
+	                response.bodyAsText = await streamToText(responseStream);
+	            }
+	            return response;
+	        }
+	        finally {
+	            // clean up event listener
+	            if (request.abortSignal && abortListener) {
+	                let uploadStreamDone = Promise.resolve();
+	                if (isReadableStream(body)) {
+	                    uploadStreamDone = isStreamComplete(body);
+	                }
+	                let downloadStreamDone = Promise.resolve();
+	                if (isReadableStream(responseStream)) {
+	                    downloadStreamDone = isStreamComplete(responseStream);
+	                }
+	                Promise.all([uploadStreamDone, downloadStreamDone])
+	                    .then(() => {
+	                    // eslint-disable-next-line promise/always-return
+	                    if (abortListener) {
+	                        request.abortSignal?.removeEventListener("abort", abortListener);
+	                    }
+	                })
+	                    .catch((e) => {
+	                    log_js_1.logger.warning("Error when cleaning up abortListener on httpRequest", e);
+	                });
+	            }
+	        }
+	    }
+	    makeRequest(request, abortController, body) {
+	        const url = new URL(request.url);
+	        const isInsecure = url.protocol !== "https:";
+	        if (isInsecure && !request.allowInsecureConnection) {
+	            throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
+	        }
+	        const agent = request.agent ?? this.getOrCreateAgent(request, isInsecure);
+	        const options = {
+	            agent,
+	            hostname: url.hostname,
+	            path: `${url.pathname}${url.search}`,
+	            port: url.port,
+	            method: request.method,
+	            headers: request.headers.toJSON({ preserveCase: true }),
+	            ...request.requestOverrides,
+	        };
+	        return new Promise((resolve, reject) => {
+	            const req = isInsecure ? node_http_1.default.request(options, resolve) : node_https_1.default.request(options, resolve);
+	            req.once("error", (err) => {
+	                reject(new restError_js_1.RestError(err.message, { code: err.code ?? restError_js_1.RestError.REQUEST_SEND_ERROR, request }));
+	            });
+	            abortController.signal.addEventListener("abort", () => {
+	                const abortError = new AbortError_js_1.AbortError("The operation was aborted. Rejecting from abort signal callback while making request.");
+	                req.destroy(abortError);
+	                reject(abortError);
+	            });
+	            if (body && isReadableStream(body)) {
+	                body.pipe(req);
+	            }
+	            else if (body) {
+	                if (typeof body === "string" || Buffer.isBuffer(body)) {
+	                    req.end(body);
+	                }
+	                else if (isArrayBuffer(body)) {
+	                    req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body));
+	                }
+	                else {
+	                    log_js_1.logger.error("Unrecognized body type", body);
+	                    reject(new restError_js_1.RestError("Unrecognized body type"));
+	                }
+	            }
+	            else {
+	                // streams don't like "undefined" being passed as data
+	                req.end();
+	            }
+	        });
+	    }
+	    getOrCreateAgent(request, isInsecure) {
+	        const disableKeepAlive = request.disableKeepAlive;
+	        // Handle Insecure requests first
+	        if (isInsecure) {
+	            if (disableKeepAlive) {
+	                // keepAlive:false is the default so we don't need a custom Agent
+	                return node_http_1.default.globalAgent;
+	            }
+	            if (!this.cachedHttpAgent) {
+	                // If there is no cached agent create a new one and cache it.
+	                this.cachedHttpAgent = new node_http_1.default.Agent({ keepAlive: true });
+	            }
+	            return this.cachedHttpAgent;
+	        }
+	        else {
+	            if (disableKeepAlive && !request.tlsSettings) {
+	                // When there are no tlsSettings and keepAlive is false
+	                // we don't need a custom agent
+	                return node_https_1.default.globalAgent;
+	            }
+	            // We use the tlsSettings to index cached clients
+	            const tlsSettings = request.tlsSettings ?? DEFAULT_TLS_SETTINGS;
+	            // Get the cached agent or create a new one with the
+	            // provided values for keepAlive and tlsSettings
+	            let agent = this.cachedHttpsAgents.get(tlsSettings);
+	            if (agent && agent.options.keepAlive === !disableKeepAlive) {
+	                return agent;
+	            }
+	            log_js_1.logger.info("No cached TLS Agent exist, creating a new Agent");
+	            agent = new node_https_1.default.Agent({
+	                // keepAlive is true if disableKeepAlive is false.
+	                keepAlive: !disableKeepAlive,
+	                // Since we are spreading, if no tslSettings were provided, nothing is added to the agent options.
+	                ...tlsSettings,
+	            });
+	            this.cachedHttpsAgents.set(tlsSettings, agent);
+	            return agent;
+	        }
+	    }
+	}
+	function getResponseHeaders(res) {
+	    const headers = (0, httpHeaders_js_1.createHttpHeaders)();
+	    for (const header of Object.keys(res.headers)) {
+	        const value = res.headers[header];
+	        if (Array.isArray(value)) {
+	            if (value.length > 0) {
+	                headers.set(header, value[0]);
+	            }
+	        }
+	        else if (value) {
+	            headers.set(header, value);
+	        }
+	    }
+	    return headers;
+	}
+	function getDecodedResponseStream(stream, headers) {
+	    const contentEncoding = headers.get("Content-Encoding");
+	    if (contentEncoding === "gzip") {
+	        const unzip = node_zlib_1.default.createGunzip();
+	        stream.pipe(unzip);
+	        return unzip;
+	    }
+	    else if (contentEncoding === "deflate") {
+	        const inflate = node_zlib_1.default.createInflate();
+	        stream.pipe(inflate);
+	        return inflate;
+	    }
+	    return stream;
+	}
+	function streamToText(stream) {
+	    return new Promise((resolve, reject) => {
+	        const buffer = [];
+	        stream.on("data", (chunk) => {
+	            if (Buffer.isBuffer(chunk)) {
+	                buffer.push(chunk);
+	            }
+	            else {
+	                buffer.push(Buffer.from(chunk));
+	            }
+	        });
+	        stream.on("end", () => {
+	            resolve(Buffer.concat(buffer).toString("utf8"));
+	        });
+	        stream.on("error", (e) => {
+	            if (e && e?.name === "AbortError") {
+	                reject(e);
+	            }
+	            else {
+	                reject(new restError_js_1.RestError(`Error reading response as text: ${e.message}`, {
+	                    code: restError_js_1.RestError.PARSE_ERROR,
+	                }));
+	            }
+	        });
+	    });
+	}
+	/** @internal */
+	function getBodyLength(body) {
+	    if (!body) {
+	        return 0;
+	    }
+	    else if (Buffer.isBuffer(body)) {
+	        return body.length;
+	    }
+	    else if (isReadableStream(body)) {
+	        return null;
+	    }
+	    else if (isArrayBuffer(body)) {
+	        return body.byteLength;
+	    }
+	    else if (typeof body === "string") {
+	        return Buffer.from(body).length;
+	    }
+	    else {
+	        return null;
+	    }
+	}
+	/**
+	 * Create a new HttpClient instance for the NodeJS environment.
+	 * @internal
+	 */
+	function createNodeHttpClient() {
+	    return new NodeHttpClient();
+	}
+	
+	return nodeHttpClient;
+}
+
+var hasRequiredDefaultHttpClient$1;
+
+function requireDefaultHttpClient$1 () {
+	if (hasRequiredDefaultHttpClient$1) return defaultHttpClient$1;
+	hasRequiredDefaultHttpClient$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(defaultHttpClient$1, "__esModule", { value: true });
+	defaultHttpClient$1.createDefaultHttpClient = createDefaultHttpClient;
+	const nodeHttpClient_js_1 = requireNodeHttpClient();
+	/**
+	 * Create the correct HttpClient for the current environment.
+	 */
+	function createDefaultHttpClient() {
+	    return (0, nodeHttpClient_js_1.createNodeHttpClient)();
+	}
+	
+	return defaultHttpClient$1;
+}
+
+var getClient = {};
+
+var clientHelpers = {};
+
+var createPipelineFromOptions$1 = {};
+
+var logPolicy$1 = {};
+
+var hasRequiredLogPolicy$1;
+
+function requireLogPolicy$1 () {
+	if (hasRequiredLogPolicy$1) return logPolicy$1;
+	hasRequiredLogPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.logPolicyName = void 0;
+		exports$1.logPolicy = logPolicy;
+		const log_js_1 = requireLog$4();
+		const sanitizer_js_1 = requireSanitizer();
+		/**
+		 * The programmatic identifier of the logPolicy.
+		 */
+		exports$1.logPolicyName = "logPolicy";
+		/**
+		 * A policy that logs all requests and responses.
+		 * @param options - Options to configure logPolicy.
+		 */
+		function logPolicy(options = {}) {
+		    const logger = options.logger ?? log_js_1.logger.info;
+		    const sanitizer = new sanitizer_js_1.Sanitizer({
+		        additionalAllowedHeaderNames: options.additionalAllowedHeaderNames,
+		        additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
+		    });
+		    return {
+		        name: exports$1.logPolicyName,
+		        async sendRequest(request, next) {
+		            if (!logger.enabled) {
+		                return next(request);
+		            }
+		            logger(`Request: ${sanitizer.sanitize(request)}`);
+		            const response = await next(request);
+		            logger(`Response status code: ${response.status}`);
+		            logger(`Headers: ${sanitizer.sanitize(response.headers)}`);
+		            return response;
+		        },
+		    };
+		}
+		
+	} (logPolicy$1));
+	return logPolicy$1;
+}
+
+var redirectPolicy$1 = {};
+
+var hasRequiredRedirectPolicy$1;
+
+function requireRedirectPolicy$1 () {
+	if (hasRequiredRedirectPolicy$1) return redirectPolicy$1;
+	hasRequiredRedirectPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.redirectPolicyName = void 0;
+		exports$1.redirectPolicy = redirectPolicy;
+		/**
+		 * The programmatic identifier of the redirectPolicy.
+		 */
+		exports$1.redirectPolicyName = "redirectPolicy";
+		/**
+		 * Methods that are allowed to follow redirects 301 and 302
+		 */
+		const allowedRedirect = ["GET", "HEAD"];
+		/**
+		 * A policy to follow Location headers from the server in order
+		 * to support server-side redirection.
+		 * In the browser, this policy is not used.
+		 * @param options - Options to control policy behavior.
+		 */
+		function redirectPolicy(options = {}) {
+		    const { maxRetries = 20 } = options;
+		    return {
+		        name: exports$1.redirectPolicyName,
+		        async sendRequest(request, next) {
+		            const response = await next(request);
+		            return handleRedirect(next, response, maxRetries);
+		        },
+		    };
+		}
+		async function handleRedirect(next, response, maxRetries, currentRetries = 0) {
+		    const { request, status, headers } = response;
+		    const locationHeader = headers.get("location");
+		    if (locationHeader &&
+		        (status === 300 ||
+		            (status === 301 && allowedRedirect.includes(request.method)) ||
+		            (status === 302 && allowedRedirect.includes(request.method)) ||
+		            (status === 303 && request.method === "POST") ||
+		            status === 307) &&
+		        currentRetries < maxRetries) {
+		        const url = new URL(locationHeader, request.url);
+		        request.url = url.toString();
+		        // POST request with Status code 303 should be converted into a
+		        // redirected GET request if the redirect url is present in the location header
+		        if (status === 303) {
+		            request.method = "GET";
+		            request.headers.delete("Content-Length");
+		            delete request.body;
+		        }
+		        request.headers.delete("Authorization");
+		        const res = await next(request);
+		        return handleRedirect(next, res, maxRetries, currentRetries + 1);
+		    }
+		    return response;
+		}
+		
+	} (redirectPolicy$1));
+	return redirectPolicy$1;
+}
+
+var userAgentPolicy$1 = {};
+
+var userAgent$3 = {};
+
+var userAgentPlatform$1 = {};
+
+var hasRequiredUserAgentPlatform$1;
+
+function requireUserAgentPlatform$1 () {
+	if (hasRequiredUserAgentPlatform$1) return userAgentPlatform$1;
+	hasRequiredUserAgentPlatform$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(userAgentPlatform$1, "__esModule", { value: true });
+	userAgentPlatform$1.getHeaderName = getHeaderName;
+	userAgentPlatform$1.setPlatformSpecificData = setPlatformSpecificData;
+	const tslib_1 = require$$0$2;
+	const node_os_1 = tslib_1.__importDefault(require$$1$8);
+	const node_process_1 = tslib_1.__importDefault(require$$2$3);
+	/**
+	 * @internal
+	 */
+	function getHeaderName() {
+	    return "User-Agent";
+	}
+	/**
+	 * @internal
+	 */
+	async function setPlatformSpecificData(map) {
+	    if (node_process_1.default && node_process_1.default.versions) {
+	        const osInfo = `${node_os_1.default.type()} ${node_os_1.default.release()}; ${node_os_1.default.arch()}`;
+	        const versions = node_process_1.default.versions;
+	        if (versions.bun) {
+	            map.set("Bun", `${versions.bun} (${osInfo})`);
+	        }
+	        else if (versions.deno) {
+	            map.set("Deno", `${versions.deno} (${osInfo})`);
+	        }
+	        else if (versions.node) {
+	            map.set("Node", `${versions.node} (${osInfo})`);
+	        }
+	    }
+	}
+	
+	return userAgentPlatform$1;
+}
+
+var constants$a = {};
+
+var hasRequiredConstants$a;
+
+function requireConstants$a () {
+	if (hasRequiredConstants$a) return constants$a;
+	hasRequiredConstants$a = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(constants$a, "__esModule", { value: true });
+	constants$a.DEFAULT_RETRY_POLICY_COUNT = constants$a.SDK_VERSION = void 0;
+	constants$a.SDK_VERSION = "0.3.2";
+	constants$a.DEFAULT_RETRY_POLICY_COUNT = 3;
+	
+	return constants$a;
+}
+
+var hasRequiredUserAgent$2;
+
+function requireUserAgent$2 () {
+	if (hasRequiredUserAgent$2) return userAgent$3;
+	hasRequiredUserAgent$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(userAgent$3, "__esModule", { value: true });
+	userAgent$3.getUserAgentHeaderName = getUserAgentHeaderName;
+	userAgent$3.getUserAgentValue = getUserAgentValue;
+	const userAgentPlatform_js_1 = requireUserAgentPlatform$1();
+	const constants_js_1 = requireConstants$a();
+	function getUserAgentString(telemetryInfo) {
+	    const parts = [];
+	    for (const [key, value] of telemetryInfo) {
+	        const token = value ? `${key}/${value}` : key;
+	        parts.push(token);
+	    }
+	    return parts.join(" ");
+	}
+	/**
+	 * @internal
+	 */
+	function getUserAgentHeaderName() {
+	    return (0, userAgentPlatform_js_1.getHeaderName)();
+	}
+	/**
+	 * @internal
+	 */
+	async function getUserAgentValue(prefix) {
+	    const runtimeInfo = new Map();
+	    runtimeInfo.set("ts-http-runtime", constants_js_1.SDK_VERSION);
+	    await (0, userAgentPlatform_js_1.setPlatformSpecificData)(runtimeInfo);
+	    const defaultAgent = getUserAgentString(runtimeInfo);
+	    const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
+	    return userAgentValue;
+	}
+	
+	return userAgent$3;
+}
+
+var hasRequiredUserAgentPolicy$1;
+
+function requireUserAgentPolicy$1 () {
+	if (hasRequiredUserAgentPolicy$1) return userAgentPolicy$1;
+	hasRequiredUserAgentPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.userAgentPolicyName = void 0;
+		exports$1.userAgentPolicy = userAgentPolicy;
+		const userAgent_js_1 = requireUserAgent$2();
+		const UserAgentHeaderName = (0, userAgent_js_1.getUserAgentHeaderName)();
+		/**
+		 * The programmatic identifier of the userAgentPolicy.
+		 */
+		exports$1.userAgentPolicyName = "userAgentPolicy";
+		/**
+		 * A policy that sets the User-Agent header (or equivalent) to reflect
+		 * the library version.
+		 * @param options - Options to customize the user agent value.
+		 */
+		function userAgentPolicy(options = {}) {
+		    const userAgentValue = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix);
+		    return {
+		        name: exports$1.userAgentPolicyName,
+		        async sendRequest(request, next) {
+		            if (!request.headers.has(UserAgentHeaderName)) {
+		                request.headers.set(UserAgentHeaderName, await userAgentValue);
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (userAgentPolicy$1));
+	return userAgentPolicy$1;
+}
+
+var decompressResponsePolicy$1 = {};
+
+var hasRequiredDecompressResponsePolicy$1;
+
+function requireDecompressResponsePolicy$1 () {
+	if (hasRequiredDecompressResponsePolicy$1) return decompressResponsePolicy$1;
+	hasRequiredDecompressResponsePolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.decompressResponsePolicyName = void 0;
+		exports$1.decompressResponsePolicy = decompressResponsePolicy;
+		/**
+		 * The programmatic identifier of the decompressResponsePolicy.
+		 */
+		exports$1.decompressResponsePolicyName = "decompressResponsePolicy";
+		/**
+		 * A policy to enable response decompression according to Accept-Encoding header
+		 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
+		 */
+		function decompressResponsePolicy() {
+		    return {
+		        name: exports$1.decompressResponsePolicyName,
+		        async sendRequest(request, next) {
+		            // HEAD requests have no body
+		            if (request.method !== "HEAD") {
+		                request.headers.set("Accept-Encoding", "gzip,deflate");
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (decompressResponsePolicy$1));
+	return decompressResponsePolicy$1;
+}
+
+var defaultRetryPolicy$1 = {};
+
+var exponentialRetryStrategy = {};
+
+var delay$2 = {};
+
+var random = {};
+
+var hasRequiredRandom;
+
+function requireRandom () {
+	if (hasRequiredRandom) return random;
+	hasRequiredRandom = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(random, "__esModule", { value: true });
+	random.getRandomIntegerInclusive = getRandomIntegerInclusive;
+	/**
+	 * Returns a random integer value between a lower and upper bound,
+	 * inclusive of both bounds.
+	 * Note that this uses Math.random and isn't secure. If you need to use
+	 * this for any kind of security purpose, find a better source of random.
+	 * @param min - The smallest integer value allowed.
+	 * @param max - The largest integer value allowed.
+	 */
+	function getRandomIntegerInclusive(min, max) {
+	    // Make sure inputs are integers.
+	    min = Math.ceil(min);
+	    max = Math.floor(max);
+	    // Pick a random offset from zero to the size of the range.
+	    // Since Math.random() can never return 1, we have to make the range one larger
+	    // in order to be inclusive of the maximum value after we take the floor.
+	    const offset = Math.floor(Math.random() * (max - min + 1));
+	    return offset + min;
+	}
+	
+	return random;
+}
+
+var hasRequiredDelay$1;
+
+function requireDelay$1 () {
+	if (hasRequiredDelay$1) return delay$2;
+	hasRequiredDelay$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(delay$2, "__esModule", { value: true });
+	delay$2.calculateRetryDelay = calculateRetryDelay;
+	const random_js_1 = requireRandom();
+	/**
+	 * Calculates the delay interval for retry attempts using exponential delay with jitter.
+	 * @param retryAttempt - The current retry attempt number.
+	 * @param config - The exponential retry configuration.
+	 * @returns An object containing the calculated retry delay.
+	 */
+	function calculateRetryDelay(retryAttempt, config) {
+	    // Exponentially increase the delay each time
+	    const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt);
+	    // Don't let the delay exceed the maximum
+	    const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay);
+	    // Allow the final value to have some "jitter" (within 50% of the delay size) so
+	    // that retries across multiple clients don't occur simultaneously.
+	    const retryAfterInMs = clampedDelay / 2 + (0, random_js_1.getRandomIntegerInclusive)(0, clampedDelay / 2);
+	    return { retryAfterInMs };
+	}
+	
+	return delay$2;
+}
+
+var throttlingRetryStrategy = {};
+
+var helpers$1 = {};
+
+var hasRequiredHelpers$1;
+
+function requireHelpers$1 () {
+	if (hasRequiredHelpers$1) return helpers$1;
+	hasRequiredHelpers$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(helpers$1, "__esModule", { value: true });
+	helpers$1.delay = delay;
+	helpers$1.parseHeaderValueAsNumber = parseHeaderValueAsNumber;
+	const AbortError_js_1 = requireAbortError$3();
+	const StandardAbortMessage = "The operation was aborted.";
+	/**
+	 * A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
+	 * @param delayInMs - The number of milliseconds to be delayed.
+	 * @param value - The value to be resolved with after a timeout of t milliseconds.
+	 * @param options - The options for delay - currently abort options
+	 *                  - abortSignal - The abortSignal associated with containing operation.
+	 *                  - abortErrorMsg - The abort error message associated with containing operation.
+	 * @returns Resolved promise
+	 */
+	function delay(delayInMs, value, options) {
+	    return new Promise((resolve, reject) => {
+	        let timer = undefined;
+	        let onAborted = undefined;
+	        const rejectOnAbort = () => {
+	            return reject(new AbortError_js_1.AbortError(options?.abortErrorMsg ? options?.abortErrorMsg : StandardAbortMessage));
+	        };
+	        const removeListeners = () => {
+	            if (options?.abortSignal && onAborted) {
+	                options.abortSignal.removeEventListener("abort", onAborted);
+	            }
+	        };
+	        onAborted = () => {
+	            if (timer) {
+	                clearTimeout(timer);
+	            }
+	            removeListeners();
+	            return rejectOnAbort();
+	        };
+	        if (options?.abortSignal && options.abortSignal.aborted) {
+	            return rejectOnAbort();
+	        }
+	        timer = setTimeout(() => {
+	            removeListeners();
+	            resolve(value);
+	        }, delayInMs);
+	        if (options?.abortSignal) {
+	            options.abortSignal.addEventListener("abort", onAborted);
+	        }
+	    });
+	}
+	/**
+	 * @internal
+	 * @returns the parsed value or undefined if the parsed value is invalid.
+	 */
+	function parseHeaderValueAsNumber(response, headerName) {
+	    const value = response.headers.get(headerName);
+	    if (!value)
+	        return;
+	    const valueAsNum = Number(value);
+	    if (Number.isNaN(valueAsNum))
+	        return;
+	    return valueAsNum;
+	}
+	
+	return helpers$1;
+}
+
+var hasRequiredThrottlingRetryStrategy;
+
+function requireThrottlingRetryStrategy () {
+	if (hasRequiredThrottlingRetryStrategy) return throttlingRetryStrategy;
+	hasRequiredThrottlingRetryStrategy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(throttlingRetryStrategy, "__esModule", { value: true });
+	throttlingRetryStrategy.isThrottlingRetryResponse = isThrottlingRetryResponse;
+	throttlingRetryStrategy.throttlingRetryStrategy = throttlingRetryStrategy$1;
+	const helpers_js_1 = requireHelpers$1();
+	/**
+	 * The header that comes back from services representing
+	 * the amount of time (minimum) to wait to retry (in seconds or timestamp after which we can retry).
+	 */
+	const RetryAfterHeader = "Retry-After";
+	/**
+	 * The headers that come back from services representing
+	 * the amount of time (minimum) to wait to retry.
+	 *
+	 * "retry-after-ms", "x-ms-retry-after-ms" : milliseconds
+	 * "Retry-After" : seconds or timestamp
+	 */
+	const AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader];
+	/**
+	 * A response is a throttling retry response if it has a throttling status code (429 or 503),
+	 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
+	 *
+	 * Returns the `retryAfterInMs` value if the response is a throttling retry response.
+	 * If not throttling retry response, returns `undefined`.
+	 *
+	 * @internal
+	 */
+	function getRetryAfterInMs(response) {
+	    if (!(response && [429, 503].includes(response.status)))
+	        return undefined;
+	    try {
+	        // Headers: "retry-after-ms", "x-ms-retry-after-ms", "Retry-After"
+	        for (const header of AllRetryAfterHeaders) {
+	            const retryAfterValue = (0, helpers_js_1.parseHeaderValueAsNumber)(response, header);
+	            if (retryAfterValue === 0 || retryAfterValue) {
+	                // "Retry-After" header ==> seconds
+	                // "retry-after-ms", "x-ms-retry-after-ms" headers ==> milli-seconds
+	                const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1;
+	                return retryAfterValue * multiplyingFactor; // in milli-seconds
+	            }
+	        }
+	        // RetryAfterHeader ("Retry-After") has a special case where it might be formatted as a date instead of a number of seconds
+	        const retryAfterHeader = response.headers.get(RetryAfterHeader);
+	        if (!retryAfterHeader)
+	            return;
+	        const date = Date.parse(retryAfterHeader);
+	        const diff = date - Date.now();
+	        // negative diff would mean a date in the past, so retry asap with 0 milliseconds
+	        return Number.isFinite(diff) ? Math.max(0, diff) : undefined;
+	    }
+	    catch {
+	        return undefined;
+	    }
+	}
+	/**
+	 * A response is a retry response if it has a throttling status code (429 or 503),
+	 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
+	 */
+	function isThrottlingRetryResponse(response) {
+	    return Number.isFinite(getRetryAfterInMs(response));
+	}
+	function throttlingRetryStrategy$1() {
+	    return {
+	        name: "throttlingRetryStrategy",
+	        retry({ response }) {
+	            const retryAfterInMs = getRetryAfterInMs(response);
+	            if (!Number.isFinite(retryAfterInMs)) {
+	                return { skipStrategy: true };
+	            }
+	            return {
+	                retryAfterInMs,
+	            };
+	        },
+	    };
+	}
+	
+	return throttlingRetryStrategy;
+}
+
+var hasRequiredExponentialRetryStrategy;
+
+function requireExponentialRetryStrategy () {
+	if (hasRequiredExponentialRetryStrategy) return exponentialRetryStrategy;
+	hasRequiredExponentialRetryStrategy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(exponentialRetryStrategy, "__esModule", { value: true });
+	exponentialRetryStrategy.exponentialRetryStrategy = exponentialRetryStrategy$1;
+	exponentialRetryStrategy.isExponentialRetryResponse = isExponentialRetryResponse;
+	exponentialRetryStrategy.isSystemError = isSystemError;
+	const delay_js_1 = requireDelay$1();
+	const throttlingRetryStrategy_js_1 = requireThrottlingRetryStrategy();
+	// intervals are in milliseconds
+	const DEFAULT_CLIENT_RETRY_INTERVAL = 1000;
+	const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 64;
+	/**
+	 * A retry strategy that retries with an exponentially increasing delay in these two cases:
+	 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
+	 * - Or otherwise if the outgoing request fails (408, greater or equal than 500, except for 501 and 505).
+	 */
+	function exponentialRetryStrategy$1(options = {}) {
+	    const retryInterval = options.retryDelayInMs ?? DEFAULT_CLIENT_RETRY_INTERVAL;
+	    const maxRetryInterval = options.maxRetryDelayInMs ?? DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
+	    return {
+	        name: "exponentialRetryStrategy",
+	        retry({ retryCount, response, responseError }) {
+	            const matchedSystemError = isSystemError(responseError);
+	            const ignoreSystemErrors = matchedSystemError && options.ignoreSystemErrors;
+	            const isExponential = isExponentialRetryResponse(response);
+	            const ignoreExponentialResponse = isExponential && options.ignoreHttpStatusCodes;
+	            const unknownResponse = response && ((0, throttlingRetryStrategy_js_1.isThrottlingRetryResponse)(response) || !isExponential);
+	            if (unknownResponse || ignoreExponentialResponse || ignoreSystemErrors) {
+	                return { skipStrategy: true };
+	            }
+	            if (responseError && !matchedSystemError && !isExponential) {
+	                return { errorToThrow: responseError };
+	            }
+	            return (0, delay_js_1.calculateRetryDelay)(retryCount, {
+	                retryDelayInMs: retryInterval,
+	                maxRetryDelayInMs: maxRetryInterval,
+	            });
+	        },
+	    };
+	}
+	/**
+	 * A response is a retry response if it has status codes:
+	 * - 408, or
+	 * - Greater or equal than 500, except for 501 and 505.
+	 */
+	function isExponentialRetryResponse(response) {
+	    return Boolean(response &&
+	        response.status !== undefined &&
+	        (response.status >= 500 || response.status === 408) &&
+	        response.status !== 501 &&
+	        response.status !== 505);
+	}
+	/**
+	 * Determines whether an error from a pipeline response was triggered in the network layer.
+	 */
+	function isSystemError(err) {
+	    if (!err) {
+	        return false;
+	    }
+	    return (err.code === "ETIMEDOUT" ||
+	        err.code === "ESOCKETTIMEDOUT" ||
+	        err.code === "ECONNREFUSED" ||
+	        err.code === "ECONNRESET" ||
+	        err.code === "ENOENT" ||
+	        err.code === "ENOTFOUND");
+	}
+	
+	return exponentialRetryStrategy;
+}
+
+var retryPolicy$1 = {};
+
+var hasRequiredRetryPolicy$1;
+
+function requireRetryPolicy$1 () {
+	if (hasRequiredRetryPolicy$1) return retryPolicy$1;
+	hasRequiredRetryPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(retryPolicy$1, "__esModule", { value: true });
+	retryPolicy$1.retryPolicy = retryPolicy;
+	const helpers_js_1 = requireHelpers$1();
+	const AbortError_js_1 = requireAbortError$3();
+	const logger_js_1 = requireLogger$1();
+	const constants_js_1 = requireConstants$a();
+	const retryPolicyLogger = (0, logger_js_1.createClientLogger)("ts-http-runtime retryPolicy");
+	/**
+	 * The programmatic identifier of the retryPolicy.
+	 */
+	const retryPolicyName = "retryPolicy";
+	/**
+	 * retryPolicy is a generic policy to enable retrying requests when certain conditions are met
+	 */
+	function retryPolicy(strategies, options = { maxRetries: constants_js_1.DEFAULT_RETRY_POLICY_COUNT }) {
+	    const logger = options.logger || retryPolicyLogger;
+	    return {
+	        name: retryPolicyName,
+	        async sendRequest(request, next) {
+	            let response;
+	            let responseError;
+	            let retryCount = -1;
+	            retryRequest: while (true) {
+	                retryCount += 1;
+	                response = undefined;
+	                responseError = undefined;
+	                try {
+	                    logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId);
+	                    response = await next(request);
+	                    logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId);
+	                }
+	                catch (e) {
+	                    logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId);
+	                    // RestErrors are valid targets for the retry strategies.
+	                    // If none of the retry strategies can work with them, they will be thrown later in this policy.
+	                    // If the received error is not a RestError, it is immediately thrown.
+	                    responseError = e;
+	                    if (!e || responseError.name !== "RestError") {
+	                        throw e;
+	                    }
+	                    response = responseError.response;
+	                }
+	                if (request.abortSignal?.aborted) {
+	                    logger.error(`Retry ${retryCount}: Request aborted.`);
+	                    const abortError = new AbortError_js_1.AbortError();
+	                    throw abortError;
+	                }
+	                if (retryCount >= (options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT)) {
+	                    logger.info(`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`);
+	                    if (responseError) {
+	                        throw responseError;
+	                    }
+	                    else if (response) {
+	                        return response;
+	                    }
+	                    else {
+	                        throw new Error("Maximum retries reached with no response or error to throw");
+	                    }
+	                }
+	                logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`);
+	                strategiesLoop: for (const strategy of strategies) {
+	                    const strategyLogger = strategy.logger || logger;
+	                    strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`);
+	                    const modifiers = strategy.retry({
+	                        retryCount,
+	                        response,
+	                        responseError,
+	                    });
+	                    if (modifiers.skipStrategy) {
+	                        strategyLogger.info(`Retry ${retryCount}: Skipped.`);
+	                        continue strategiesLoop;
+	                    }
+	                    const { errorToThrow, retryAfterInMs, redirectTo } = modifiers;
+	                    if (errorToThrow) {
+	                        strategyLogger.error(`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`, errorToThrow);
+	                        throw errorToThrow;
+	                    }
+	                    if (retryAfterInMs || retryAfterInMs === 0) {
+	                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`);
+	                        await (0, helpers_js_1.delay)(retryAfterInMs, undefined, { abortSignal: request.abortSignal });
+	                        continue retryRequest;
+	                    }
+	                    if (redirectTo) {
+	                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`);
+	                        request.url = redirectTo;
+	                        continue retryRequest;
+	                    }
+	                }
+	                if (responseError) {
+	                    logger.info(`None of the retry strategies could work with the received error. Throwing it.`);
+	                    throw responseError;
+	                }
+	                if (response) {
+	                    logger.info(`None of the retry strategies could work with the received response. Returning it.`);
+	                    return response;
+	                }
+	                // If all the retries skip and there's no response,
+	                // we're still in the retry loop, so a new request will be sent
+	                // until `maxRetries` is reached.
+	            }
+	        },
+	    };
+	}
+	
+	return retryPolicy$1;
+}
+
+var hasRequiredDefaultRetryPolicy$1;
+
+function requireDefaultRetryPolicy$1 () {
+	if (hasRequiredDefaultRetryPolicy$1) return defaultRetryPolicy$1;
+	hasRequiredDefaultRetryPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.defaultRetryPolicyName = void 0;
+		exports$1.defaultRetryPolicy = defaultRetryPolicy;
+		const exponentialRetryStrategy_js_1 = requireExponentialRetryStrategy();
+		const throttlingRetryStrategy_js_1 = requireThrottlingRetryStrategy();
+		const retryPolicy_js_1 = requireRetryPolicy$1();
+		const constants_js_1 = requireConstants$a();
+		/**
+		 * Name of the {@link defaultRetryPolicy}
+		 */
+		exports$1.defaultRetryPolicyName = "defaultRetryPolicy";
+		/**
+		 * A policy that retries according to three strategies:
+		 * - When the server sends a 429 response with a Retry-After header.
+		 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
+		 * - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
+		 */
+		function defaultRetryPolicy(options = {}) {
+		    return {
+		        name: exports$1.defaultRetryPolicyName,
+		        sendRequest: (0, retryPolicy_js_1.retryPolicy)([(0, throttlingRetryStrategy_js_1.throttlingRetryStrategy)(), (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)(options)], {
+		            maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
+		        }).sendRequest,
+		    };
+		}
+		
+	} (defaultRetryPolicy$1));
+	return defaultRetryPolicy$1;
+}
+
+var formDataPolicy$1 = {};
+
+var checkEnvironment = {};
+
+var hasRequiredCheckEnvironment;
+
+function requireCheckEnvironment () {
+	if (hasRequiredCheckEnvironment) return checkEnvironment;
+	hasRequiredCheckEnvironment = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.isReactNative = exports$1.isNodeRuntime = exports$1.isNodeLike = exports$1.isBun = exports$1.isDeno = exports$1.isWebWorker = exports$1.isBrowser = void 0;
+		/**
+		 * A constant that indicates whether the environment the code is running is a Web Browser.
+		 */
+		// eslint-disable-next-line @azure/azure-sdk/ts-no-window
+		exports$1.isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
+		/**
+		 * A constant that indicates whether the environment the code is running is a Web Worker.
+		 */
+		exports$1.isWebWorker = typeof self === "object" &&
+		    typeof self?.importScripts === "function" &&
+		    (self.constructor?.name === "DedicatedWorkerGlobalScope" ||
+		        self.constructor?.name === "ServiceWorkerGlobalScope" ||
+		        self.constructor?.name === "SharedWorkerGlobalScope");
+		/**
+		 * A constant that indicates whether the environment the code is running is Deno.
+		 */
+		exports$1.isDeno = typeof Deno !== "undefined" &&
+		    typeof Deno.version !== "undefined" &&
+		    typeof Deno.version.deno !== "undefined";
+		/**
+		 * A constant that indicates whether the environment the code is running is Bun.sh.
+		 */
+		exports$1.isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined";
+		/**
+		 * A constant that indicates whether the environment the code is running is a Node.js compatible environment.
+		 */
+		exports$1.isNodeLike = typeof globalThis.process !== "undefined" &&
+		    Boolean(globalThis.process.version) &&
+		    Boolean(globalThis.process.versions?.node);
+		/**
+		 * A constant that indicates whether the environment the code is running is Node.JS.
+		 */
+		exports$1.isNodeRuntime = exports$1.isNodeLike && !exports$1.isBun && !exports$1.isDeno;
+		/**
+		 * A constant that indicates whether the environment the code is running is in React-Native.
+		 */
+		// https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js
+		exports$1.isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative";
+		
+	} (checkEnvironment));
+	return checkEnvironment;
+}
+
+var hasRequiredFormDataPolicy$1;
+
+function requireFormDataPolicy$1 () {
+	if (hasRequiredFormDataPolicy$1) return formDataPolicy$1;
+	hasRequiredFormDataPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.formDataPolicyName = void 0;
+		exports$1.formDataPolicy = formDataPolicy;
+		const bytesEncoding_js_1 = requireBytesEncoding();
+		const checkEnvironment_js_1 = requireCheckEnvironment();
+		const httpHeaders_js_1 = requireHttpHeaders$1();
+		/**
+		 * The programmatic identifier of the formDataPolicy.
+		 */
+		exports$1.formDataPolicyName = "formDataPolicy";
+		function formDataToFormDataMap(formData) {
+		    const formDataMap = {};
+		    for (const [key, value] of formData.entries()) {
+		        formDataMap[key] ??= [];
+		        formDataMap[key].push(value);
+		    }
+		    return formDataMap;
+		}
+		/**
+		 * A policy that encodes FormData on the request into the body.
+		 */
+		function formDataPolicy() {
+		    return {
+		        name: exports$1.formDataPolicyName,
+		        async sendRequest(request, next) {
+		            if (checkEnvironment_js_1.isNodeLike && typeof FormData !== "undefined" && request.body instanceof FormData) {
+		                request.formData = formDataToFormDataMap(request.body);
+		                request.body = undefined;
+		            }
+		            if (request.formData) {
+		                const contentType = request.headers.get("Content-Type");
+		                if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) {
+		                    request.body = wwwFormUrlEncode(request.formData);
+		                }
+		                else {
+		                    await prepareFormData(request.formData, request);
+		                }
+		                request.formData = undefined;
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		function wwwFormUrlEncode(formData) {
+		    const urlSearchParams = new URLSearchParams();
+		    for (const [key, value] of Object.entries(formData)) {
+		        if (Array.isArray(value)) {
+		            for (const subValue of value) {
+		                urlSearchParams.append(key, subValue.toString());
+		            }
+		        }
+		        else {
+		            urlSearchParams.append(key, value.toString());
+		        }
+		    }
+		    return urlSearchParams.toString();
+		}
+		async function prepareFormData(formData, request) {
+		    // validate content type (multipart/form-data)
+		    const contentType = request.headers.get("Content-Type");
+		    if (contentType && !contentType.startsWith("multipart/form-data")) {
+		        // content type is specified and is not multipart/form-data. Exit.
+		        return;
+		    }
+		    request.headers.set("Content-Type", contentType ?? "multipart/form-data");
+		    // set body to MultipartRequestBody using content from FormDataMap
+		    const parts = [];
+		    for (const [fieldName, values] of Object.entries(formData)) {
+		        for (const value of Array.isArray(values) ? values : [values]) {
+		            if (typeof value === "string") {
+		                parts.push({
+		                    headers: (0, httpHeaders_js_1.createHttpHeaders)({
+		                        "Content-Disposition": `form-data; name="${fieldName}"`,
+		                    }),
+		                    body: (0, bytesEncoding_js_1.stringToUint8Array)(value, "utf-8"),
+		                });
+		            }
+		            else if (value === undefined || value === null || typeof value !== "object") {
+		                throw new Error(`Unexpected value for key ${fieldName}: ${value}. Value should be serialized to string first.`);
+		            }
+		            else {
+		                // using || instead of ?? here since if value.name is empty we should create a file name
+		                const fileName = value.name || "blob";
+		                const headers = (0, httpHeaders_js_1.createHttpHeaders)();
+		                headers.set("Content-Disposition", `form-data; name="${fieldName}"; filename="${fileName}"`);
+		                // again, || is used since an empty value.type means the content type is unset
+		                headers.set("Content-Type", value.type || "application/octet-stream");
+		                parts.push({
+		                    headers,
+		                    body: value,
+		                });
+		            }
+		        }
+		    }
+		    request.multipartBody = { parts };
+		}
+		
+	} (formDataPolicy$1));
+	return formDataPolicy$1;
+}
+
+var proxyPolicy$1 = {};
+
+var dist$2 = {};
+
+var src$2 = {exports: {}};
+
+var browser = {exports: {}};
+
+/**
+ * Helpers.
+ */
+
+var ms;
+var hasRequiredMs;
+
+function requireMs () {
+	if (hasRequiredMs) return ms;
+	hasRequiredMs = 1;
+	var s = 1000;
+	var m = s * 60;
+	var h = m * 60;
+	var d = h * 24;
+	var w = d * 7;
+	var y = d * 365.25;
+
+	/**
+	 * Parse or format the given `val`.
+	 *
+	 * Options:
+	 *
+	 *  - `long` verbose formatting [false]
+	 *
+	 * @param {String|Number} val
+	 * @param {Object} [options]
+	 * @throws {Error} throw an error if val is not a non-empty string or a number
+	 * @return {String|Number}
+	 * @api public
+	 */
+
+	ms = function (val, options) {
+	  options = options || {};
+	  var type = typeof val;
+	  if (type === 'string' && val.length > 0) {
+	    return parse(val);
+	  } else if (type === 'number' && isFinite(val)) {
+	    return options.long ? fmtLong(val) : fmtShort(val);
+	  }
+	  throw new Error(
+	    'val is not a non-empty string or a valid number. val=' +
+	      JSON.stringify(val)
+	  );
+	};
+
+	/**
+	 * Parse the given `str` and return milliseconds.
+	 *
+	 * @param {String} str
+	 * @return {Number}
+	 * @api private
+	 */
+
+	function parse(str) {
+	  str = String(str);
+	  if (str.length > 100) {
+	    return;
+	  }
+	  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
+	    str
+	  );
+	  if (!match) {
+	    return;
+	  }
+	  var n = parseFloat(match[1]);
+	  var type = (match[2] || 'ms').toLowerCase();
+	  switch (type) {
+	    case 'years':
+	    case 'year':
+	    case 'yrs':
+	    case 'yr':
+	    case 'y':
+	      return n * y;
+	    case 'weeks':
+	    case 'week':
+	    case 'w':
+	      return n * w;
+	    case 'days':
+	    case 'day':
+	    case 'd':
+	      return n * d;
+	    case 'hours':
+	    case 'hour':
+	    case 'hrs':
+	    case 'hr':
+	    case 'h':
+	      return n * h;
+	    case 'minutes':
+	    case 'minute':
+	    case 'mins':
+	    case 'min':
+	    case 'm':
+	      return n * m;
+	    case 'seconds':
+	    case 'second':
+	    case 'secs':
+	    case 'sec':
+	    case 's':
+	      return n * s;
+	    case 'milliseconds':
+	    case 'millisecond':
+	    case 'msecs':
+	    case 'msec':
+	    case 'ms':
+	      return n;
+	    default:
+	      return undefined;
+	  }
+	}
+
+	/**
+	 * Short format for `ms`.
+	 *
+	 * @param {Number} ms
+	 * @return {String}
+	 * @api private
+	 */
+
+	function fmtShort(ms) {
+	  var msAbs = Math.abs(ms);
+	  if (msAbs >= d) {
+	    return Math.round(ms / d) + 'd';
+	  }
+	  if (msAbs >= h) {
+	    return Math.round(ms / h) + 'h';
+	  }
+	  if (msAbs >= m) {
+	    return Math.round(ms / m) + 'm';
+	  }
+	  if (msAbs >= s) {
+	    return Math.round(ms / s) + 's';
+	  }
+	  return ms + 'ms';
+	}
+
+	/**
+	 * Long format for `ms`.
+	 *
+	 * @param {Number} ms
+	 * @return {String}
+	 * @api private
+	 */
+
+	function fmtLong(ms) {
+	  var msAbs = Math.abs(ms);
+	  if (msAbs >= d) {
+	    return plural(ms, msAbs, d, 'day');
+	  }
+	  if (msAbs >= h) {
+	    return plural(ms, msAbs, h, 'hour');
+	  }
+	  if (msAbs >= m) {
+	    return plural(ms, msAbs, m, 'minute');
+	  }
+	  if (msAbs >= s) {
+	    return plural(ms, msAbs, s, 'second');
+	  }
+	  return ms + ' ms';
+	}
+
+	/**
+	 * Pluralization helper.
+	 */
+
+	function plural(ms, msAbs, n, name) {
+	  var isPlural = msAbs >= n * 1.5;
+	  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+	}
+	return ms;
+}
+
+var common;
+var hasRequiredCommon;
+
+function requireCommon () {
+	if (hasRequiredCommon) return common;
+	hasRequiredCommon = 1;
+	/**
+	 * This is the common logic for both the Node.js and web browser
+	 * implementations of `debug()`.
+	 */
+
+	function setup(env) {
+		createDebug.debug = createDebug;
+		createDebug.default = createDebug;
+		createDebug.coerce = coerce;
+		createDebug.disable = disable;
+		createDebug.enable = enable;
+		createDebug.enabled = enabled;
+		createDebug.humanize = requireMs();
+		createDebug.destroy = destroy;
+
+		Object.keys(env).forEach(key => {
+			createDebug[key] = env[key];
+		});
+
+		/**
+		* The currently active debug mode names, and names to skip.
+		*/
+
+		createDebug.names = [];
+		createDebug.skips = [];
+
+		/**
+		* Map of special "%n" handling functions, for the debug "format" argument.
+		*
+		* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+		*/
+		createDebug.formatters = {};
+
+		/**
+		* Selects a color for a debug namespace
+		* @param {String} namespace The namespace string for the debug instance to be colored
+		* @return {Number|String} An ANSI color code for the given namespace
+		* @api private
+		*/
+		function selectColor(namespace) {
+			let hash = 0;
+
+			for (let i = 0; i < namespace.length; i++) {
+				hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
+				hash |= 0; // Convert to 32bit integer
+			}
+
+			return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+		}
+		createDebug.selectColor = selectColor;
+
+		/**
+		* Create a debugger with the given `namespace`.
+		*
+		* @param {String} namespace
+		* @return {Function}
+		* @api public
+		*/
+		function createDebug(namespace) {
+			let prevTime;
+			let enableOverride = null;
+			let namespacesCache;
+			let enabledCache;
+
+			function debug(...args) {
+				// Disabled?
+				if (!debug.enabled) {
+					return;
+				}
+
+				const self = debug;
+
+				// Set `diff` timestamp
+				const curr = Number(new Date());
+				const ms = curr - (prevTime || curr);
+				self.diff = ms;
+				self.prev = prevTime;
+				self.curr = curr;
+				prevTime = curr;
+
+				args[0] = createDebug.coerce(args[0]);
+
+				if (typeof args[0] !== 'string') {
+					// Anything else let's inspect with %O
+					args.unshift('%O');
+				}
+
+				// Apply any `formatters` transformations
+				let index = 0;
+				args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
+					// If we encounter an escaped % then don't increase the array index
+					if (match === '%%') {
+						return '%';
+					}
+					index++;
+					const formatter = createDebug.formatters[format];
+					if (typeof formatter === 'function') {
+						const val = args[index];
+						match = formatter.call(self, val);
+
+						// Now we need to remove `args[index]` since it's inlined in the `format`
+						args.splice(index, 1);
+						index--;
+					}
+					return match;
+				});
+
+				// Apply env-specific formatting (colors, etc.)
+				createDebug.formatArgs.call(self, args);
+
+				const logFn = self.log || createDebug.log;
+				logFn.apply(self, args);
+			}
+
+			debug.namespace = namespace;
+			debug.useColors = createDebug.useColors();
+			debug.color = createDebug.selectColor(namespace);
+			debug.extend = extend;
+			debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
+
+			Object.defineProperty(debug, 'enabled', {
+				enumerable: true,
+				configurable: false,
+				get: () => {
+					if (enableOverride !== null) {
+						return enableOverride;
+					}
+					if (namespacesCache !== createDebug.namespaces) {
+						namespacesCache = createDebug.namespaces;
+						enabledCache = createDebug.enabled(namespace);
+					}
+
+					return enabledCache;
+				},
+				set: v => {
+					enableOverride = v;
+				}
+			});
+
+			// Env-specific initialization logic for debug instances
+			if (typeof createDebug.init === 'function') {
+				createDebug.init(debug);
+			}
+
+			return debug;
+		}
+
+		function extend(namespace, delimiter) {
+			const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+			newDebug.log = this.log;
+			return newDebug;
+		}
+
+		/**
+		* Enables a debug mode by namespaces. This can include modes
+		* separated by a colon and wildcards.
+		*
+		* @param {String} namespaces
+		* @api public
+		*/
+		function enable(namespaces) {
+			createDebug.save(namespaces);
+			createDebug.namespaces = namespaces;
+
+			createDebug.names = [];
+			createDebug.skips = [];
+
+			const split = (typeof namespaces === 'string' ? namespaces : '')
+				.trim()
+				.replace(/\s+/g, ',')
+				.split(',')
+				.filter(Boolean);
+
+			for (const ns of split) {
+				if (ns[0] === '-') {
+					createDebug.skips.push(ns.slice(1));
+				} else {
+					createDebug.names.push(ns);
+				}
+			}
+		}
+
+		/**
+		 * Checks if the given string matches a namespace template, honoring
+		 * asterisks as wildcards.
+		 *
+		 * @param {String} search
+		 * @param {String} template
+		 * @return {Boolean}
+		 */
+		function matchesTemplate(search, template) {
+			let searchIndex = 0;
+			let templateIndex = 0;
+			let starIndex = -1;
+			let matchIndex = 0;
+
+			while (searchIndex < search.length) {
+				if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {
+					// Match character or proceed with wildcard
+					if (template[templateIndex] === '*') {
+						starIndex = templateIndex;
+						matchIndex = searchIndex;
+						templateIndex++; // Skip the '*'
+					} else {
+						searchIndex++;
+						templateIndex++;
+					}
+				} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition
+					// Backtrack to the last '*' and try to match more characters
+					templateIndex = starIndex + 1;
+					matchIndex++;
+					searchIndex = matchIndex;
+				} else {
+					return false; // No match
+				}
+			}
+
+			// Handle trailing '*' in template
+			while (templateIndex < template.length && template[templateIndex] === '*') {
+				templateIndex++;
+			}
+
+			return templateIndex === template.length;
+		}
+
+		/**
+		* Disable debug output.
+		*
+		* @return {String} namespaces
+		* @api public
+		*/
+		function disable() {
+			const namespaces = [
+				...createDebug.names,
+				...createDebug.skips.map(namespace => '-' + namespace)
+			].join(',');
+			createDebug.enable('');
+			return namespaces;
+		}
+
+		/**
+		* Returns true if the given mode name is enabled, false otherwise.
+		*
+		* @param {String} name
+		* @return {Boolean}
+		* @api public
+		*/
+		function enabled(name) {
+			for (const skip of createDebug.skips) {
+				if (matchesTemplate(name, skip)) {
+					return false;
+				}
+			}
+
+			for (const ns of createDebug.names) {
+				if (matchesTemplate(name, ns)) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+
+		/**
+		* Coerce `val`.
+		*
+		* @param {Mixed} val
+		* @return {Mixed}
+		* @api private
+		*/
+		function coerce(val) {
+			if (val instanceof Error) {
+				return val.stack || val.message;
+			}
+			return val;
+		}
+
+		/**
+		* XXX DO NOT USE. This is a temporary stub function.
+		* XXX It WILL be removed in the next major release.
+		*/
+		function destroy() {
+			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+		}
+
+		createDebug.enable(createDebug.load());
+
+		return createDebug;
+	}
+
+	common = setup;
+	return common;
+}
+
+/* eslint-env browser */
+
+var hasRequiredBrowser;
+
+function requireBrowser () {
+	if (hasRequiredBrowser) return browser.exports;
+	hasRequiredBrowser = 1;
+	(function (module, exports$1) {
+		/**
+		 * This is the web browser implementation of `debug()`.
+		 */
+
+		exports$1.formatArgs = formatArgs;
+		exports$1.save = save;
+		exports$1.load = load;
+		exports$1.useColors = useColors;
+		exports$1.storage = localstorage();
+		exports$1.destroy = (() => {
+			let warned = false;
+
+			return () => {
+				if (!warned) {
+					warned = true;
+					console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+				}
+			};
+		})();
+
+		/**
+		 * Colors.
+		 */
+
+		exports$1.colors = [
+			'#0000CC',
+			'#0000FF',
+			'#0033CC',
+			'#0033FF',
+			'#0066CC',
+			'#0066FF',
+			'#0099CC',
+			'#0099FF',
+			'#00CC00',
+			'#00CC33',
+			'#00CC66',
+			'#00CC99',
+			'#00CCCC',
+			'#00CCFF',
+			'#3300CC',
+			'#3300FF',
+			'#3333CC',
+			'#3333FF',
+			'#3366CC',
+			'#3366FF',
+			'#3399CC',
+			'#3399FF',
+			'#33CC00',
+			'#33CC33',
+			'#33CC66',
+			'#33CC99',
+			'#33CCCC',
+			'#33CCFF',
+			'#6600CC',
+			'#6600FF',
+			'#6633CC',
+			'#6633FF',
+			'#66CC00',
+			'#66CC33',
+			'#9900CC',
+			'#9900FF',
+			'#9933CC',
+			'#9933FF',
+			'#99CC00',
+			'#99CC33',
+			'#CC0000',
+			'#CC0033',
+			'#CC0066',
+			'#CC0099',
+			'#CC00CC',
+			'#CC00FF',
+			'#CC3300',
+			'#CC3333',
+			'#CC3366',
+			'#CC3399',
+			'#CC33CC',
+			'#CC33FF',
+			'#CC6600',
+			'#CC6633',
+			'#CC9900',
+			'#CC9933',
+			'#CCCC00',
+			'#CCCC33',
+			'#FF0000',
+			'#FF0033',
+			'#FF0066',
+			'#FF0099',
+			'#FF00CC',
+			'#FF00FF',
+			'#FF3300',
+			'#FF3333',
+			'#FF3366',
+			'#FF3399',
+			'#FF33CC',
+			'#FF33FF',
+			'#FF6600',
+			'#FF6633',
+			'#FF9900',
+			'#FF9933',
+			'#FFCC00',
+			'#FFCC33'
+		];
+
+		/**
+		 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+		 * and the Firebug extension (any Firefox version) are known
+		 * to support "%c" CSS customizations.
+		 *
+		 * TODO: add a `localStorage` variable to explicitly enable/disable colors
+		 */
+
+		// eslint-disable-next-line complexity
+		function useColors() {
+			// NB: In an Electron preload script, document will be defined but not fully
+			// initialized. Since we know we're in Chrome, we'll just detect this case
+			// explicitly
+			if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+				return true;
+			}
+
+			// Internet Explorer and Edge do not support colors.
+			if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+				return false;
+			}
+
+			let m;
+
+			// Is webkit? http://stackoverflow.com/a/16459606/376773
+			// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+			// eslint-disable-next-line no-return-assign
+			return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
+				// Is firebug? http://stackoverflow.com/a/398120/376773
+				(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
+				// Is firefox >= v31?
+				// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+				(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) ||
+				// Double check webkit in userAgent just in case we are in a worker
+				(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
+		}
+
+		/**
+		 * Colorize log arguments if enabled.
+		 *
+		 * @api public
+		 */
+
+		function formatArgs(args) {
+			args[0] = (this.useColors ? '%c' : '') +
+				this.namespace +
+				(this.useColors ? ' %c' : ' ') +
+				args[0] +
+				(this.useColors ? '%c ' : ' ') +
+				'+' + module.exports.humanize(this.diff);
+
+			if (!this.useColors) {
+				return;
+			}
+
+			const c = 'color: ' + this.color;
+			args.splice(1, 0, c, 'color: inherit');
+
+			// The final "%c" is somewhat tricky, because there could be other
+			// arguments passed either before or after the %c, so we need to
+			// figure out the correct index to insert the CSS into
+			let index = 0;
+			let lastC = 0;
+			args[0].replace(/%[a-zA-Z%]/g, match => {
+				if (match === '%%') {
+					return;
+				}
+				index++;
+				if (match === '%c') {
+					// We only are interested in the *last* %c
+					// (the user may have provided their own)
+					lastC = index;
+				}
+			});
+
+			args.splice(lastC, 0, c);
+		}
+
+		/**
+		 * Invokes `console.debug()` when available.
+		 * No-op when `console.debug` is not a "function".
+		 * If `console.debug` is not available, falls back
+		 * to `console.log`.
+		 *
+		 * @api public
+		 */
+		exports$1.log = console.debug || console.log || (() => {});
+
+		/**
+		 * Save `namespaces`.
+		 *
+		 * @param {String} namespaces
+		 * @api private
+		 */
+		function save(namespaces) {
+			try {
+				if (namespaces) {
+					exports$1.storage.setItem('debug', namespaces);
+				} else {
+					exports$1.storage.removeItem('debug');
+				}
+			} catch (error) {
+				// Swallow
+				// XXX (@Qix-) should we be logging these?
+			}
+		}
+
+		/**
+		 * Load `namespaces`.
+		 *
+		 * @return {String} returns the previously persisted debug modes
+		 * @api private
+		 */
+		function load() {
+			let r;
+			try {
+				r = exports$1.storage.getItem('debug') || exports$1.storage.getItem('DEBUG') ;
+			} catch (error) {
+				// Swallow
+				// XXX (@Qix-) should we be logging these?
+			}
+
+			// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+			if (!r && typeof process !== 'undefined' && 'env' in process) {
+				r = process.env.DEBUG;
+			}
+
+			return r;
+		}
+
+		/**
+		 * Localstorage attempts to return the localstorage.
+		 *
+		 * This is necessary because safari throws
+		 * when a user disables cookies/localstorage
+		 * and you attempt to access it.
+		 *
+		 * @return {LocalStorage}
+		 * @api private
+		 */
+
+		function localstorage() {
+			try {
+				// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+				// The Browser also has localStorage in the global context.
+				return localStorage;
+			} catch (error) {
+				// Swallow
+				// XXX (@Qix-) should we be logging these?
+			}
+		}
+
+		module.exports = requireCommon()(exports$1);
+
+		const {formatters} = module.exports;
+
+		/**
+		 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+		 */
+
+		formatters.j = function (v) {
+			try {
+				return JSON.stringify(v);
+			} catch (error) {
+				return '[UnexpectedJSONParseError]: ' + error.message;
+			}
+		}; 
+	} (browser, browser.exports));
+	return browser.exports;
+}
+
+var node = {exports: {}};
+
+var hasFlag;
+var hasRequiredHasFlag;
+
+function requireHasFlag () {
+	if (hasRequiredHasFlag) return hasFlag;
+	hasRequiredHasFlag = 1;
+
+	hasFlag = (flag, argv = process.argv) => {
+		const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
+		const position = argv.indexOf(prefix + flag);
+		const terminatorPosition = argv.indexOf('--');
+		return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
+	};
+	return hasFlag;
+}
+
+var supportsColor_1;
+var hasRequiredSupportsColor;
+
+function requireSupportsColor () {
+	if (hasRequiredSupportsColor) return supportsColor_1;
+	hasRequiredSupportsColor = 1;
+	const os$1 = os;
+	const tty = require$$1$9;
+	const hasFlag = requireHasFlag();
+
+	const {env} = process;
+
+	let forceColor;
+	if (hasFlag('no-color') ||
+		hasFlag('no-colors') ||
+		hasFlag('color=false') ||
+		hasFlag('color=never')) {
+		forceColor = 0;
+	} else if (hasFlag('color') ||
+		hasFlag('colors') ||
+		hasFlag('color=true') ||
+		hasFlag('color=always')) {
+		forceColor = 1;
+	}
+
+	if ('FORCE_COLOR' in env) {
+		if (env.FORCE_COLOR === 'true') {
+			forceColor = 1;
+		} else if (env.FORCE_COLOR === 'false') {
+			forceColor = 0;
+		} else {
+			forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
+		}
+	}
+
+	function translateLevel(level) {
+		if (level === 0) {
+			return false;
+		}
+
+		return {
+			level,
+			hasBasic: true,
+			has256: level >= 2,
+			has16m: level >= 3
+		};
+	}
+
+	function supportsColor(haveStream, streamIsTTY) {
+		if (forceColor === 0) {
+			return 0;
+		}
+
+		if (hasFlag('color=16m') ||
+			hasFlag('color=full') ||
+			hasFlag('color=truecolor')) {
+			return 3;
+		}
+
+		if (hasFlag('color=256')) {
+			return 2;
+		}
+
+		if (haveStream && !streamIsTTY && forceColor === undefined) {
+			return 0;
+		}
+
+		const min = forceColor || 0;
+
+		if (env.TERM === 'dumb') {
+			return min;
+		}
+
+		if (process.platform === 'win32') {
+			// Windows 10 build 10586 is the first Windows release that supports 256 colors.
+			// Windows 10 build 14931 is the first release that supports 16m/TrueColor.
+			const osRelease = os$1.release().split('.');
+			if (
+				Number(osRelease[0]) >= 10 &&
+				Number(osRelease[2]) >= 10586
+			) {
+				return Number(osRelease[2]) >= 14931 ? 3 : 2;
+			}
+
+			return 1;
+		}
+
+		if ('CI' in env) {
+			if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
+				return 1;
+			}
+
+			return min;
+		}
+
+		if ('TEAMCITY_VERSION' in env) {
+			return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
+		}
+
+		if (env.COLORTERM === 'truecolor') {
+			return 3;
+		}
+
+		if ('TERM_PROGRAM' in env) {
+			const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
+
+			switch (env.TERM_PROGRAM) {
+				case 'iTerm.app':
+					return version >= 3 ? 3 : 2;
+				case 'Apple_Terminal':
+					return 2;
+				// No default
+			}
+		}
+
+		if (/-256(color)?$/i.test(env.TERM)) {
+			return 2;
+		}
+
+		if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
+			return 1;
+		}
+
+		if ('COLORTERM' in env) {
+			return 1;
+		}
+
+		return min;
+	}
+
+	function getSupportLevel(stream) {
+		const level = supportsColor(stream, stream && stream.isTTY);
+		return translateLevel(level);
+	}
+
+	supportsColor_1 = {
+		supportsColor: getSupportLevel,
+		stdout: translateLevel(supportsColor(true, tty.isatty(1))),
+		stderr: translateLevel(supportsColor(true, tty.isatty(2)))
+	};
+	return supportsColor_1;
+}
+
+/**
+ * Module dependencies.
+ */
+
+var hasRequiredNode;
+
+function requireNode () {
+	if (hasRequiredNode) return node.exports;
+	hasRequiredNode = 1;
+	(function (module, exports$1) {
+		const tty = require$$1$9;
+		const util = require$$6;
+
+		/**
+		 * This is the Node.js implementation of `debug()`.
+		 */
+
+		exports$1.init = init;
+		exports$1.log = log;
+		exports$1.formatArgs = formatArgs;
+		exports$1.save = save;
+		exports$1.load = load;
+		exports$1.useColors = useColors;
+		exports$1.destroy = util.deprecate(
+			() => {},
+			'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
+		);
+
+		/**
+		 * Colors.
+		 */
+
+		exports$1.colors = [6, 2, 3, 4, 5, 1];
+
+		try {
+			// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
+			// eslint-disable-next-line import/no-extraneous-dependencies
+			const supportsColor = requireSupportsColor();
+
+			if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
+				exports$1.colors = [
+					20,
+					21,
+					26,
+					27,
+					32,
+					33,
+					38,
+					39,
+					40,
+					41,
+					42,
+					43,
+					44,
+					45,
+					56,
+					57,
+					62,
+					63,
+					68,
+					69,
+					74,
+					75,
+					76,
+					77,
+					78,
+					79,
+					80,
+					81,
+					92,
+					93,
+					98,
+					99,
+					112,
+					113,
+					128,
+					129,
+					134,
+					135,
+					148,
+					149,
+					160,
+					161,
+					162,
+					163,
+					164,
+					165,
+					166,
+					167,
+					168,
+					169,
+					170,
+					171,
+					172,
+					173,
+					178,
+					179,
+					184,
+					185,
+					196,
+					197,
+					198,
+					199,
+					200,
+					201,
+					202,
+					203,
+					204,
+					205,
+					206,
+					207,
+					208,
+					209,
+					214,
+					215,
+					220,
+					221
+				];
+			}
+		} catch (error) {
+			// Swallow - we only care if `supports-color` is available; it doesn't have to be.
+		}
+
+		/**
+		 * Build up the default `inspectOpts` object from the environment variables.
+		 *
+		 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
+		 */
+
+		exports$1.inspectOpts = Object.keys(process.env).filter(key => {
+			return /^debug_/i.test(key);
+		}).reduce((obj, key) => {
+			// Camel-case
+			const prop = key
+				.substring(6)
+				.toLowerCase()
+				.replace(/_([a-z])/g, (_, k) => {
+					return k.toUpperCase();
+				});
+
+			// Coerce string value into JS value
+			let val = process.env[key];
+			if (/^(yes|on|true|enabled)$/i.test(val)) {
+				val = true;
+			} else if (/^(no|off|false|disabled)$/i.test(val)) {
+				val = false;
+			} else if (val === 'null') {
+				val = null;
+			} else {
+				val = Number(val);
+			}
+
+			obj[prop] = val;
+			return obj;
+		}, {});
+
+		/**
+		 * Is stdout a TTY? Colored output is enabled when `true`.
+		 */
+
+		function useColors() {
+			return 'colors' in exports$1.inspectOpts ?
+				Boolean(exports$1.inspectOpts.colors) :
+				tty.isatty(process.stderr.fd);
+		}
+
+		/**
+		 * Adds ANSI color escape codes if enabled.
+		 *
+		 * @api public
+		 */
+
+		function formatArgs(args) {
+			const {namespace: name, useColors} = this;
+
+			if (useColors) {
+				const c = this.color;
+				const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
+				const prefix = `  ${colorCode};1m${name} \u001B[0m`;
+
+				args[0] = prefix + args[0].split('\n').join('\n' + prefix);
+				args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
+			} else {
+				args[0] = getDate() + name + ' ' + args[0];
+			}
+		}
+
+		function getDate() {
+			if (exports$1.inspectOpts.hideDate) {
+				return '';
+			}
+			return new Date().toISOString() + ' ';
+		}
+
+		/**
+		 * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.
+		 */
+
+		function log(...args) {
+			return process.stderr.write(util.formatWithOptions(exports$1.inspectOpts, ...args) + '\n');
+		}
+
+		/**
+		 * Save `namespaces`.
+		 *
+		 * @param {String} namespaces
+		 * @api private
+		 */
+		function save(namespaces) {
+			if (namespaces) {
+				process.env.DEBUG = namespaces;
+			} else {
+				// If you set a process.env field to null or undefined, it gets cast to the
+				// string 'null' or 'undefined'. Just delete instead.
+				delete process.env.DEBUG;
+			}
+		}
+
+		/**
+		 * Load `namespaces`.
+		 *
+		 * @return {String} returns the previously persisted debug modes
+		 * @api private
+		 */
+
+		function load() {
+			return process.env.DEBUG;
+		}
+
+		/**
+		 * Init logic for `debug` instances.
+		 *
+		 * Create a new `inspectOpts` object in case `useColors` is set
+		 * differently for a particular `debug` instance.
+		 */
+
+		function init(debug) {
+			debug.inspectOpts = {};
+
+			const keys = Object.keys(exports$1.inspectOpts);
+			for (let i = 0; i < keys.length; i++) {
+				debug.inspectOpts[keys[i]] = exports$1.inspectOpts[keys[i]];
+			}
+		}
+
+		module.exports = requireCommon()(exports$1);
+
+		const {formatters} = module.exports;
+
+		/**
+		 * Map %o to `util.inspect()`, all on a single line.
+		 */
+
+		formatters.o = function (v) {
+			this.inspectOpts.colors = this.useColors;
+			return util.inspect(v, this.inspectOpts)
+				.split('\n')
+				.map(str => str.trim())
+				.join(' ');
+		};
+
+		/**
+		 * Map %O to `util.inspect()`, allowing multiple lines if needed.
+		 */
+
+		formatters.O = function (v) {
+			this.inspectOpts.colors = this.useColors;
+			return util.inspect(v, this.inspectOpts);
+		}; 
+	} (node, node.exports));
+	return node.exports;
+}
+
+/**
+ * Detect Electron renderer / nwjs process, which is node, but we should
+ * treat as a browser.
+ */
+
+var hasRequiredSrc$1;
+
+function requireSrc$1 () {
+	if (hasRequiredSrc$1) return src$2.exports;
+	hasRequiredSrc$1 = 1;
+	if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
+		src$2.exports = requireBrowser();
+	} else {
+		src$2.exports = requireNode();
+	}
+	return src$2.exports;
+}
+
+var dist$1 = {};
+
+var helpers = {};
+
+var hasRequiredHelpers;
+
+function requireHelpers () {
+	if (hasRequiredHelpers) return helpers;
+	hasRequiredHelpers = 1;
+	var __createBinding = (helpers && helpers.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (helpers && helpers.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (helpers && helpers.__importStar) || function (mod) {
+	    if (mod && mod.__esModule) return mod;
+	    var result = {};
+	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+	    __setModuleDefault(result, mod);
+	    return result;
+	};
+	Object.defineProperty(helpers, "__esModule", { value: true });
+	helpers.req = helpers.json = helpers.toBuffer = void 0;
+	const http = __importStar(require$$0$4);
+	const https = __importStar(require$$1$1);
+	async function toBuffer(stream) {
+	    let length = 0;
+	    const chunks = [];
+	    for await (const chunk of stream) {
+	        length += chunk.length;
+	        chunks.push(chunk);
+	    }
+	    return Buffer.concat(chunks, length);
+	}
+	helpers.toBuffer = toBuffer;
+	// eslint-disable-next-line @typescript-eslint/no-explicit-any
+	async function json(stream) {
+	    const buf = await toBuffer(stream);
+	    const str = buf.toString('utf8');
+	    try {
+	        return JSON.parse(str);
+	    }
+	    catch (_err) {
+	        const err = _err;
+	        err.message += ` (input: ${str})`;
+	        throw err;
+	    }
+	}
+	helpers.json = json;
+	function req(url, opts = {}) {
+	    const href = typeof url === 'string' ? url : url.href;
+	    const req = (href.startsWith('https:') ? https : http).request(url, opts);
+	    const promise = new Promise((resolve, reject) => {
+	        req
+	            .once('response', resolve)
+	            .once('error', reject)
+	            .end();
+	    });
+	    req.then = promise.then.bind(promise);
+	    return req;
+	}
+	helpers.req = req;
+	
+	return helpers;
+}
+
+var hasRequiredDist$2;
+
+function requireDist$2 () {
+	if (hasRequiredDist$2) return dist$1;
+	hasRequiredDist$2 = 1;
+	(function (exports$1) {
+		var __createBinding = (dist$1 && dist$1.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+		    if (k2 === undefined) k2 = k;
+		    var desc = Object.getOwnPropertyDescriptor(m, k);
+		    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+		      desc = { enumerable: true, get: function() { return m[k]; } };
+		    }
+		    Object.defineProperty(o, k2, desc);
+		}) : (function(o, m, k, k2) {
+		    if (k2 === undefined) k2 = k;
+		    o[k2] = m[k];
+		}));
+		var __setModuleDefault = (dist$1 && dist$1.__setModuleDefault) || (Object.create ? (function(o, v) {
+		    Object.defineProperty(o, "default", { enumerable: true, value: v });
+		}) : function(o, v) {
+		    o["default"] = v;
+		});
+		var __importStar = (dist$1 && dist$1.__importStar) || function (mod) {
+		    if (mod && mod.__esModule) return mod;
+		    var result = {};
+		    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+		    __setModuleDefault(result, mod);
+		    return result;
+		};
+		var __exportStar = (dist$1 && dist$1.__exportStar) || function(m, exports$1) {
+		    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
+		};
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.Agent = void 0;
+		const net = __importStar(require$$0$c);
+		const http = __importStar(require$$0$4);
+		const https_1 = require$$1$1;
+		__exportStar(requireHelpers(), exports$1);
+		const INTERNAL = Symbol('AgentBaseInternalState');
+		class Agent extends http.Agent {
+		    constructor(opts) {
+		        super(opts);
+		        this[INTERNAL] = {};
+		    }
+		    /**
+		     * Determine whether this is an `http` or `https` request.
+		     */
+		    isSecureEndpoint(options) {
+		        if (options) {
+		            // First check the `secureEndpoint` property explicitly, since this
+		            // means that a parent `Agent` is "passing through" to this instance.
+		            // eslint-disable-next-line @typescript-eslint/no-explicit-any
+		            if (typeof options.secureEndpoint === 'boolean') {
+		                return options.secureEndpoint;
+		            }
+		            // If no explicit `secure` endpoint, check if `protocol` property is
+		            // set. This will usually be the case since using a full string URL
+		            // or `URL` instance should be the most common usage.
+		            if (typeof options.protocol === 'string') {
+		                return options.protocol === 'https:';
+		            }
+		        }
+		        // Finally, if no `protocol` property was set, then fall back to
+		        // checking the stack trace of the current call stack, and try to
+		        // detect the "https" module.
+		        const { stack } = new Error();
+		        if (typeof stack !== 'string')
+		            return false;
+		        return stack
+		            .split('\n')
+		            .some((l) => l.indexOf('(https.js:') !== -1 ||
+		            l.indexOf('node:https:') !== -1);
+		    }
+		    // In order to support async signatures in `connect()` and Node's native
+		    // connection pooling in `http.Agent`, the array of sockets for each origin
+		    // has to be updated synchronously. This is so the length of the array is
+		    // accurate when `addRequest()` is next called. We achieve this by creating a
+		    // fake socket and adding it to `sockets[origin]` and incrementing
+		    // `totalSocketCount`.
+		    incrementSockets(name) {
+		        // If `maxSockets` and `maxTotalSockets` are both Infinity then there is no
+		        // need to create a fake socket because Node.js native connection pooling
+		        // will never be invoked.
+		        if (this.maxSockets === Infinity && this.maxTotalSockets === Infinity) {
+		            return null;
+		        }
+		        // All instances of `sockets` are expected TypeScript errors. The
+		        // alternative is to add it as a private property of this class but that
+		        // will break TypeScript subclassing.
+		        if (!this.sockets[name]) {
+		            // @ts-expect-error `sockets` is readonly in `@types/node`
+		            this.sockets[name] = [];
+		        }
+		        const fakeSocket = new net.Socket({ writable: false });
+		        this.sockets[name].push(fakeSocket);
+		        // @ts-expect-error `totalSocketCount` isn't defined in `@types/node`
+		        this.totalSocketCount++;
+		        return fakeSocket;
+		    }
+		    decrementSockets(name, socket) {
+		        if (!this.sockets[name] || socket === null) {
+		            return;
+		        }
+		        const sockets = this.sockets[name];
+		        const index = sockets.indexOf(socket);
+		        if (index !== -1) {
+		            sockets.splice(index, 1);
+		            // @ts-expect-error  `totalSocketCount` isn't defined in `@types/node`
+		            this.totalSocketCount--;
+		            if (sockets.length === 0) {
+		                // @ts-expect-error `sockets` is readonly in `@types/node`
+		                delete this.sockets[name];
+		            }
+		        }
+		    }
+		    // In order to properly update the socket pool, we need to call `getName()` on
+		    // the core `https.Agent` if it is a secureEndpoint.
+		    getName(options) {
+		        const secureEndpoint = this.isSecureEndpoint(options);
+		        if (secureEndpoint) {
+		            // @ts-expect-error `getName()` isn't defined in `@types/node`
+		            return https_1.Agent.prototype.getName.call(this, options);
+		        }
+		        // @ts-expect-error `getName()` isn't defined in `@types/node`
+		        return super.getName(options);
+		    }
+		    createSocket(req, options, cb) {
+		        const connectOpts = {
+		            ...options,
+		            secureEndpoint: this.isSecureEndpoint(options),
+		        };
+		        const name = this.getName(connectOpts);
+		        const fakeSocket = this.incrementSockets(name);
+		        Promise.resolve()
+		            .then(() => this.connect(req, connectOpts))
+		            .then((socket) => {
+		            this.decrementSockets(name, fakeSocket);
+		            if (socket instanceof http.Agent) {
+		                try {
+		                    // @ts-expect-error `addRequest()` isn't defined in `@types/node`
+		                    return socket.addRequest(req, connectOpts);
+		                }
+		                catch (err) {
+		                    return cb(err);
+		                }
+		            }
+		            this[INTERNAL].currentSocket = socket;
+		            // @ts-expect-error `createSocket()` isn't defined in `@types/node`
+		            super.createSocket(req, options, cb);
+		        }, (err) => {
+		            this.decrementSockets(name, fakeSocket);
+		            cb(err);
+		        });
+		    }
+		    createConnection() {
+		        const socket = this[INTERNAL].currentSocket;
+		        this[INTERNAL].currentSocket = undefined;
+		        if (!socket) {
+		            throw new Error('No socket was returned in the `connect()` function');
+		        }
+		        return socket;
+		    }
+		    get defaultPort() {
+		        return (this[INTERNAL].defaultPort ??
+		            (this.protocol === 'https:' ? 443 : 80));
+		    }
+		    set defaultPort(v) {
+		        if (this[INTERNAL]) {
+		            this[INTERNAL].defaultPort = v;
+		        }
+		    }
+		    get protocol() {
+		        return (this[INTERNAL].protocol ??
+		            (this.isSecureEndpoint() ? 'https:' : 'http:'));
+		    }
+		    set protocol(v) {
+		        if (this[INTERNAL]) {
+		            this[INTERNAL].protocol = v;
+		        }
+		    }
+		}
+		exports$1.Agent = Agent;
+		
+	} (dist$1));
+	return dist$1;
+}
+
+var parseProxyResponse = {};
+
+var hasRequiredParseProxyResponse;
+
+function requireParseProxyResponse () {
+	if (hasRequiredParseProxyResponse) return parseProxyResponse;
+	hasRequiredParseProxyResponse = 1;
+	var __importDefault = (parseProxyResponse && parseProxyResponse.__importDefault) || function (mod) {
+	    return (mod && mod.__esModule) ? mod : { "default": mod };
+	};
+	Object.defineProperty(parseProxyResponse, "__esModule", { value: true });
+	parseProxyResponse.parseProxyResponse = void 0;
+	const debug_1 = __importDefault(requireSrc$1());
+	const debug = (0, debug_1.default)('https-proxy-agent:parse-proxy-response');
+	function parseProxyResponse$1(socket) {
+	    return new Promise((resolve, reject) => {
+	        // we need to buffer any HTTP traffic that happens with the proxy before we get
+	        // the CONNECT response, so that if the response is anything other than an "200"
+	        // response code, then we can re-play the "data" events on the socket once the
+	        // HTTP parser is hooked up...
+	        let buffersLength = 0;
+	        const buffers = [];
+	        function read() {
+	            const b = socket.read();
+	            if (b)
+	                ondata(b);
+	            else
+	                socket.once('readable', read);
+	        }
+	        function cleanup() {
+	            socket.removeListener('end', onend);
+	            socket.removeListener('error', onerror);
+	            socket.removeListener('readable', read);
+	        }
+	        function onend() {
+	            cleanup();
+	            debug('onend');
+	            reject(new Error('Proxy connection ended before receiving CONNECT response'));
+	        }
+	        function onerror(err) {
+	            cleanup();
+	            debug('onerror %o', err);
+	            reject(err);
+	        }
+	        function ondata(b) {
+	            buffers.push(b);
+	            buffersLength += b.length;
+	            const buffered = Buffer.concat(buffers, buffersLength);
+	            const endOfHeaders = buffered.indexOf('\r\n\r\n');
+	            if (endOfHeaders === -1) {
+	                // keep buffering
+	                debug('have not received end of HTTP headers yet...');
+	                read();
+	                return;
+	            }
+	            const headerParts = buffered
+	                .slice(0, endOfHeaders)
+	                .toString('ascii')
+	                .split('\r\n');
+	            const firstLine = headerParts.shift();
+	            if (!firstLine) {
+	                socket.destroy();
+	                return reject(new Error('No header received from proxy CONNECT response'));
+	            }
+	            const firstLineParts = firstLine.split(' ');
+	            const statusCode = +firstLineParts[1];
+	            const statusText = firstLineParts.slice(2).join(' ');
+	            const headers = {};
+	            for (const header of headerParts) {
+	                if (!header)
+	                    continue;
+	                const firstColon = header.indexOf(':');
+	                if (firstColon === -1) {
+	                    socket.destroy();
+	                    return reject(new Error(`Invalid header from proxy CONNECT response: "${header}"`));
+	                }
+	                const key = header.slice(0, firstColon).toLowerCase();
+	                const value = header.slice(firstColon + 1).trimStart();
+	                const current = headers[key];
+	                if (typeof current === 'string') {
+	                    headers[key] = [current, value];
+	                }
+	                else if (Array.isArray(current)) {
+	                    current.push(value);
+	                }
+	                else {
+	                    headers[key] = value;
+	                }
+	            }
+	            debug('got proxy server response: %o %o', firstLine, headers);
+	            cleanup();
+	            resolve({
+	                connect: {
+	                    statusCode,
+	                    statusText,
+	                    headers,
+	                },
+	                buffered,
+	            });
+	        }
+	        socket.on('error', onerror);
+	        socket.on('end', onend);
+	        read();
+	    });
+	}
+	parseProxyResponse.parseProxyResponse = parseProxyResponse$1;
+	
+	return parseProxyResponse;
+}
+
+var hasRequiredDist$1;
+
+function requireDist$1 () {
+	if (hasRequiredDist$1) return dist$2;
+	hasRequiredDist$1 = 1;
+	var __createBinding = (dist$2 && dist$2.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (dist$2 && dist$2.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (dist$2 && dist$2.__importStar) || function (mod) {
+	    if (mod && mod.__esModule) return mod;
+	    var result = {};
+	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+	    __setModuleDefault(result, mod);
+	    return result;
+	};
+	var __importDefault = (dist$2 && dist$2.__importDefault) || function (mod) {
+	    return (mod && mod.__esModule) ? mod : { "default": mod };
+	};
+	Object.defineProperty(dist$2, "__esModule", { value: true });
+	dist$2.HttpsProxyAgent = void 0;
+	const net = __importStar(require$$0$c);
+	const tls = __importStar(require$$1$2);
+	const assert_1 = __importDefault(require$$2$1);
+	const debug_1 = __importDefault(requireSrc$1());
+	const agent_base_1 = requireDist$2();
+	const url_1 = require$$5$4;
+	const parse_proxy_response_1 = requireParseProxyResponse();
+	const debug = (0, debug_1.default)('https-proxy-agent');
+	const setServernameFromNonIpHost = (options) => {
+	    if (options.servername === undefined &&
+	        options.host &&
+	        !net.isIP(options.host)) {
+	        return {
+	            ...options,
+	            servername: options.host,
+	        };
+	    }
+	    return options;
+	};
+	/**
+	 * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to
+	 * the specified "HTTP(s) proxy server" in order to proxy HTTPS requests.
+	 *
+	 * Outgoing HTTP requests are first tunneled through the proxy server using the
+	 * `CONNECT` HTTP request method to establish a connection to the proxy server,
+	 * and then the proxy server connects to the destination target and issues the
+	 * HTTP request from the proxy server.
+	 *
+	 * `https:` requests have their socket connection upgraded to TLS once
+	 * the connection to the proxy server has been established.
+	 */
+	class HttpsProxyAgent extends agent_base_1.Agent {
+	    constructor(proxy, opts) {
+	        super(opts);
+	        this.options = { path: undefined };
+	        this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy;
+	        this.proxyHeaders = opts?.headers ?? {};
+	        debug('Creating new HttpsProxyAgent instance: %o', this.proxy.href);
+	        // Trim off the brackets from IPv6 addresses
+	        const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, '');
+	        const port = this.proxy.port
+	            ? parseInt(this.proxy.port, 10)
+	            : this.proxy.protocol === 'https:'
+	                ? 443
+	                : 80;
+	        this.connectOpts = {
+	            // Attempt to negotiate http/1.1 for proxy servers that support http/2
+	            ALPNProtocols: ['http/1.1'],
+	            ...(opts ? omit(opts, 'headers') : null),
+	            host,
+	            port,
+	        };
+	    }
+	    /**
+	     * Called when the node-core HTTP client library is creating a
+	     * new HTTP request.
+	     */
+	    async connect(req, opts) {
+	        const { proxy } = this;
+	        if (!opts.host) {
+	            throw new TypeError('No "host" provided');
+	        }
+	        // Create a socket connection to the proxy server.
+	        let socket;
+	        if (proxy.protocol === 'https:') {
+	            debug('Creating `tls.Socket`: %o', this.connectOpts);
+	            socket = tls.connect(setServernameFromNonIpHost(this.connectOpts));
+	        }
+	        else {
+	            debug('Creating `net.Socket`: %o', this.connectOpts);
+	            socket = net.connect(this.connectOpts);
+	        }
+	        const headers = typeof this.proxyHeaders === 'function'
+	            ? this.proxyHeaders()
+	            : { ...this.proxyHeaders };
+	        const host = net.isIPv6(opts.host) ? `[${opts.host}]` : opts.host;
+	        let payload = `CONNECT ${host}:${opts.port} HTTP/1.1\r\n`;
+	        // Inject the `Proxy-Authorization` header if necessary.
+	        if (proxy.username || proxy.password) {
+	            const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
+	            headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`;
+	        }
+	        headers.Host = `${host}:${opts.port}`;
+	        if (!headers['Proxy-Connection']) {
+	            headers['Proxy-Connection'] = this.keepAlive
+	                ? 'Keep-Alive'
+	                : 'close';
+	        }
+	        for (const name of Object.keys(headers)) {
+	            payload += `${name}: ${headers[name]}\r\n`;
+	        }
+	        const proxyResponsePromise = (0, parse_proxy_response_1.parseProxyResponse)(socket);
+	        socket.write(`${payload}\r\n`);
+	        const { connect, buffered } = await proxyResponsePromise;
+	        req.emit('proxyConnect', connect);
+	        this.emit('proxyConnect', connect, req);
+	        if (connect.statusCode === 200) {
+	            req.once('socket', resume);
+	            if (opts.secureEndpoint) {
+	                // The proxy is connecting to a TLS server, so upgrade
+	                // this socket connection to a TLS connection.
+	                debug('Upgrading socket connection to TLS');
+	                return tls.connect({
+	                    ...omit(setServernameFromNonIpHost(opts), 'host', 'path', 'port'),
+	                    socket,
+	                });
+	            }
+	            return socket;
+	        }
+	        // Some other status code that's not 200... need to re-play the HTTP
+	        // header "data" events onto the socket once the HTTP machinery is
+	        // attached so that the node core `http` can parse and handle the
+	        // error status code.
+	        // Close the original socket, and a new "fake" socket is returned
+	        // instead, so that the proxy doesn't get the HTTP request
+	        // written to it (which may contain `Authorization` headers or other
+	        // sensitive data).
+	        //
+	        // See: https://hackerone.com/reports/541502
+	        socket.destroy();
+	        const fakeSocket = new net.Socket({ writable: false });
+	        fakeSocket.readable = true;
+	        // Need to wait for the "socket" event to re-play the "data" events.
+	        req.once('socket', (s) => {
+	            debug('Replaying proxy buffer for failed request');
+	            (0, assert_1.default)(s.listenerCount('data') > 0);
+	            // Replay the "buffered" Buffer onto the fake `socket`, since at
+	            // this point the HTTP module machinery has been hooked up for
+	            // the user.
+	            s.push(buffered);
+	            s.push(null);
+	        });
+	        return fakeSocket;
+	    }
+	}
+	HttpsProxyAgent.protocols = ['http', 'https'];
+	dist$2.HttpsProxyAgent = HttpsProxyAgent;
+	function resume(socket) {
+	    socket.resume();
+	}
+	function omit(obj, ...keys) {
+	    const ret = {};
+	    let key;
+	    for (key in obj) {
+	        if (!keys.includes(key)) {
+	            ret[key] = obj[key];
+	        }
+	    }
+	    return ret;
+	}
+	
+	return dist$2;
+}
+
+var dist = {};
+
+var hasRequiredDist;
+
+function requireDist () {
+	if (hasRequiredDist) return dist;
+	hasRequiredDist = 1;
+	var __createBinding = (dist && dist.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (dist && dist.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (dist && dist.__importStar) || function (mod) {
+	    if (mod && mod.__esModule) return mod;
+	    var result = {};
+	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+	    __setModuleDefault(result, mod);
+	    return result;
+	};
+	var __importDefault = (dist && dist.__importDefault) || function (mod) {
+	    return (mod && mod.__esModule) ? mod : { "default": mod };
+	};
+	Object.defineProperty(dist, "__esModule", { value: true });
+	dist.HttpProxyAgent = void 0;
+	const net = __importStar(require$$0$c);
+	const tls = __importStar(require$$1$2);
+	const debug_1 = __importDefault(requireSrc$1());
+	const events_1 = require$$0$5;
+	const agent_base_1 = requireDist$2();
+	const url_1 = require$$5$4;
+	const debug = (0, debug_1.default)('http-proxy-agent');
+	/**
+	 * The `HttpProxyAgent` implements an HTTP Agent subclass that connects
+	 * to the specified "HTTP proxy server" in order to proxy HTTP requests.
+	 */
+	class HttpProxyAgent extends agent_base_1.Agent {
+	    constructor(proxy, opts) {
+	        super(opts);
+	        this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy;
+	        this.proxyHeaders = opts?.headers ?? {};
+	        debug('Creating new HttpProxyAgent instance: %o', this.proxy.href);
+	        // Trim off the brackets from IPv6 addresses
+	        const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, '');
+	        const port = this.proxy.port
+	            ? parseInt(this.proxy.port, 10)
+	            : this.proxy.protocol === 'https:'
+	                ? 443
+	                : 80;
+	        this.connectOpts = {
+	            ...(opts ? omit(opts, 'headers') : null),
+	            host,
+	            port,
+	        };
+	    }
+	    addRequest(req, opts) {
+	        req._header = null;
+	        this.setRequestProps(req, opts);
+	        // @ts-expect-error `addRequest()` isn't defined in `@types/node`
+	        super.addRequest(req, opts);
+	    }
+	    setRequestProps(req, opts) {
+	        const { proxy } = this;
+	        const protocol = opts.secureEndpoint ? 'https:' : 'http:';
+	        const hostname = req.getHeader('host') || 'localhost';
+	        const base = `${protocol}//${hostname}`;
+	        const url = new url_1.URL(req.path, base);
+	        if (opts.port !== 80) {
+	            url.port = String(opts.port);
+	        }
+	        // Change the `http.ClientRequest` instance's "path" field
+	        // to the absolute path of the URL that will be requested.
+	        req.path = String(url);
+	        // Inject the `Proxy-Authorization` header if necessary.
+	        const headers = typeof this.proxyHeaders === 'function'
+	            ? this.proxyHeaders()
+	            : { ...this.proxyHeaders };
+	        if (proxy.username || proxy.password) {
+	            const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
+	            headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`;
+	        }
+	        if (!headers['Proxy-Connection']) {
+	            headers['Proxy-Connection'] = this.keepAlive
+	                ? 'Keep-Alive'
+	                : 'close';
+	        }
+	        for (const name of Object.keys(headers)) {
+	            const value = headers[name];
+	            if (value) {
+	                req.setHeader(name, value);
+	            }
+	        }
+	    }
+	    async connect(req, opts) {
+	        req._header = null;
+	        if (!req.path.includes('://')) {
+	            this.setRequestProps(req, opts);
+	        }
+	        // At this point, the http ClientRequest's internal `_header` field
+	        // might have already been set. If this is the case then we'll need
+	        // to re-generate the string since we just changed the `req.path`.
+	        let first;
+	        let endOfHeaders;
+	        debug('Regenerating stored HTTP header string for request');
+	        req._implicitHeader();
+	        if (req.outputData && req.outputData.length > 0) {
+	            debug('Patching connection write() output buffer with updated header');
+	            first = req.outputData[0].data;
+	            endOfHeaders = first.indexOf('\r\n\r\n') + 4;
+	            req.outputData[0].data =
+	                req._header + first.substring(endOfHeaders);
+	            debug('Output buffer: %o', req.outputData[0].data);
+	        }
+	        // Create a socket connection to the proxy server.
+	        let socket;
+	        if (this.proxy.protocol === 'https:') {
+	            debug('Creating `tls.Socket`: %o', this.connectOpts);
+	            socket = tls.connect(this.connectOpts);
+	        }
+	        else {
+	            debug('Creating `net.Socket`: %o', this.connectOpts);
+	            socket = net.connect(this.connectOpts);
+	        }
+	        // Wait for the socket's `connect` event, so that this `callback()`
+	        // function throws instead of the `http` request machinery. This is
+	        // important for i.e. `PacProxyAgent` which determines a failed proxy
+	        // connection via the `callback()` function throwing.
+	        await (0, events_1.once)(socket, 'connect');
+	        return socket;
+	    }
+	}
+	HttpProxyAgent.protocols = ['http', 'https'];
+	dist.HttpProxyAgent = HttpProxyAgent;
+	function omit(obj, ...keys) {
+	    const ret = {};
+	    let key;
+	    for (key in obj) {
+	        if (!keys.includes(key)) {
+	            ret[key] = obj[key];
+	        }
+	    }
+	    return ret;
+	}
+	
+	return dist;
+}
+
+var hasRequiredProxyPolicy$1;
+
+function requireProxyPolicy$1 () {
+	if (hasRequiredProxyPolicy$1) return proxyPolicy$1;
+	hasRequiredProxyPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.globalNoProxyList = exports$1.proxyPolicyName = void 0;
+		exports$1.loadNoProxy = loadNoProxy;
+		exports$1.getDefaultProxySettings = getDefaultProxySettings;
+		exports$1.proxyPolicy = proxyPolicy;
+		const https_proxy_agent_1 = requireDist$1();
+		const http_proxy_agent_1 = requireDist();
+		const log_js_1 = requireLog$4();
+		const HTTPS_PROXY = "HTTPS_PROXY";
+		const HTTP_PROXY = "HTTP_PROXY";
+		const ALL_PROXY = "ALL_PROXY";
+		const NO_PROXY = "NO_PROXY";
+		/**
+		 * The programmatic identifier of the proxyPolicy.
+		 */
+		exports$1.proxyPolicyName = "proxyPolicy";
+		/**
+		 * Stores the patterns specified in NO_PROXY environment variable.
+		 * @internal
+		 */
+		exports$1.globalNoProxyList = [];
+		let noProxyListLoaded = false;
+		/** A cache of whether a host should bypass the proxy. */
+		const globalBypassedMap = new Map();
+		function getEnvironmentValue(name) {
+		    if (process.env[name]) {
+		        return process.env[name];
+		    }
+		    else if (process.env[name.toLowerCase()]) {
+		        return process.env[name.toLowerCase()];
+		    }
+		    return undefined;
+		}
+		function loadEnvironmentProxyValue() {
+		    if (!process) {
+		        return undefined;
+		    }
+		    const httpsProxy = getEnvironmentValue(HTTPS_PROXY);
+		    const allProxy = getEnvironmentValue(ALL_PROXY);
+		    const httpProxy = getEnvironmentValue(HTTP_PROXY);
+		    return httpsProxy || allProxy || httpProxy;
+		}
+		/**
+		 * Check whether the host of a given `uri` matches any pattern in the no proxy list.
+		 * If there's a match, any request sent to the same host shouldn't have the proxy settings set.
+		 * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
+		 */
+		function isBypassed(uri, noProxyList, bypassedMap) {
+		    if (noProxyList.length === 0) {
+		        return false;
+		    }
+		    const host = new URL(uri).hostname;
+		    if (bypassedMap?.has(host)) {
+		        return bypassedMap.get(host);
+		    }
+		    let isBypassedFlag = false;
+		    for (const pattern of noProxyList) {
+		        if (pattern[0] === ".") {
+		            // This should match either domain it self or any subdomain or host
+		            // .foo.com will match foo.com it self or *.foo.com
+		            if (host.endsWith(pattern)) {
+		                isBypassedFlag = true;
+		            }
+		            else {
+		                if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
+		                    isBypassedFlag = true;
+		                }
+		            }
+		        }
+		        else {
+		            if (host === pattern) {
+		                isBypassedFlag = true;
+		            }
+		        }
+		    }
+		    bypassedMap?.set(host, isBypassedFlag);
+		    return isBypassedFlag;
+		}
+		function loadNoProxy() {
+		    const noProxy = getEnvironmentValue(NO_PROXY);
+		    noProxyListLoaded = true;
+		    if (noProxy) {
+		        return noProxy
+		            .split(",")
+		            .map((item) => item.trim())
+		            .filter((item) => item.length);
+		    }
+		    return [];
+		}
+		/**
+		 * This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
+		 * If no argument is given, it attempts to parse a proxy URL from the environment
+		 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
+		 * @param proxyUrl - The url of the proxy to use. May contain authentication information.
+		 * @deprecated - Internally this method is no longer necessary when setting proxy information.
+		 */
+		function getDefaultProxySettings(proxyUrl) {
+		    if (!proxyUrl) {
+		        proxyUrl = loadEnvironmentProxyValue();
+		        if (!proxyUrl) {
+		            return undefined;
+		        }
+		    }
+		    const parsedUrl = new URL(proxyUrl);
+		    const schema = parsedUrl.protocol ? parsedUrl.protocol + "//" : "";
+		    return {
+		        host: schema + parsedUrl.hostname,
+		        port: Number.parseInt(parsedUrl.port || "80"),
+		        username: parsedUrl.username,
+		        password: parsedUrl.password,
+		    };
+		}
+		/**
+		 * This method attempts to parse a proxy URL from the environment
+		 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
+		 */
+		function getDefaultProxySettingsInternal() {
+		    const envProxy = loadEnvironmentProxyValue();
+		    return envProxy ? new URL(envProxy) : undefined;
+		}
+		function getUrlFromProxySettings(settings) {
+		    let parsedProxyUrl;
+		    try {
+		        parsedProxyUrl = new URL(settings.host);
+		    }
+		    catch {
+		        throw new Error(`Expecting a valid host string in proxy settings, but found "${settings.host}".`);
+		    }
+		    parsedProxyUrl.port = String(settings.port);
+		    if (settings.username) {
+		        parsedProxyUrl.username = settings.username;
+		    }
+		    if (settings.password) {
+		        parsedProxyUrl.password = settings.password;
+		    }
+		    return parsedProxyUrl;
+		}
+		function setProxyAgentOnRequest(request, cachedAgents, proxyUrl) {
+		    // Custom Agent should take precedence so if one is present
+		    // we should skip to avoid overwriting it.
+		    if (request.agent) {
+		        return;
+		    }
+		    const url = new URL(request.url);
+		    const isInsecure = url.protocol !== "https:";
+		    if (request.tlsSettings) {
+		        log_js_1.logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored.");
+		    }
+		    const headers = request.headers.toJSON();
+		    if (isInsecure) {
+		        if (!cachedAgents.httpProxyAgent) {
+		            cachedAgents.httpProxyAgent = new http_proxy_agent_1.HttpProxyAgent(proxyUrl, { headers });
+		        }
+		        request.agent = cachedAgents.httpProxyAgent;
+		    }
+		    else {
+		        if (!cachedAgents.httpsProxyAgent) {
+		            cachedAgents.httpsProxyAgent = new https_proxy_agent_1.HttpsProxyAgent(proxyUrl, { headers });
+		        }
+		        request.agent = cachedAgents.httpsProxyAgent;
+		    }
+		}
+		/**
+		 * A policy that allows one to apply proxy settings to all requests.
+		 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
+		 * or HTTP_PROXY environment variables.
+		 * @param proxySettings - ProxySettings to use on each request.
+		 * @param options - additional settings, for example, custom NO_PROXY patterns
+		 */
+		function proxyPolicy(proxySettings, options) {
+		    if (!noProxyListLoaded) {
+		        exports$1.globalNoProxyList.push(...loadNoProxy());
+		    }
+		    const defaultProxy = proxySettings
+		        ? getUrlFromProxySettings(proxySettings)
+		        : getDefaultProxySettingsInternal();
+		    const cachedAgents = {};
+		    return {
+		        name: exports$1.proxyPolicyName,
+		        async sendRequest(request, next) {
+		            if (!request.proxySettings &&
+		                defaultProxy &&
+		                !isBypassed(request.url, options?.customNoProxyList ?? exports$1.globalNoProxyList, options?.customNoProxyList ? undefined : globalBypassedMap)) {
+		                setProxyAgentOnRequest(request, cachedAgents, defaultProxy);
+		            }
+		            else if (request.proxySettings) {
+		                setProxyAgentOnRequest(request, cachedAgents, getUrlFromProxySettings(request.proxySettings));
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (proxyPolicy$1));
+	return proxyPolicy$1;
+}
+
+var agentPolicy$1 = {};
+
+var hasRequiredAgentPolicy$1;
+
+function requireAgentPolicy$1 () {
+	if (hasRequiredAgentPolicy$1) return agentPolicy$1;
+	hasRequiredAgentPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.agentPolicyName = void 0;
+		exports$1.agentPolicy = agentPolicy;
+		/**
+		 * Name of the Agent Policy
+		 */
+		exports$1.agentPolicyName = "agentPolicy";
+		/**
+		 * Gets a pipeline policy that sets http.agent
+		 */
+		function agentPolicy(agent) {
+		    return {
+		        name: exports$1.agentPolicyName,
+		        sendRequest: async (req, next) => {
+		            // Users may define an agent on the request, honor it over the client level one
+		            if (!req.agent) {
+		                req.agent = agent;
+		            }
+		            return next(req);
+		        },
+		    };
+		}
+		
+	} (agentPolicy$1));
+	return agentPolicy$1;
+}
+
+var tlsPolicy$1 = {};
+
+var hasRequiredTlsPolicy$1;
+
+function requireTlsPolicy$1 () {
+	if (hasRequiredTlsPolicy$1) return tlsPolicy$1;
+	hasRequiredTlsPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.tlsPolicyName = void 0;
+		exports$1.tlsPolicy = tlsPolicy;
+		/**
+		 * Name of the TLS Policy
+		 */
+		exports$1.tlsPolicyName = "tlsPolicy";
+		/**
+		 * Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
+		 */
+		function tlsPolicy(tlsSettings) {
+		    return {
+		        name: exports$1.tlsPolicyName,
+		        sendRequest: async (req, next) => {
+		            // Users may define a request tlsSettings, honor those over the client level one
+		            if (!req.tlsSettings) {
+		                req.tlsSettings = tlsSettings;
+		            }
+		            return next(req);
+		        },
+		    };
+		}
+		
+	} (tlsPolicy$1));
+	return tlsPolicy$1;
+}
+
+var multipartPolicy$1 = {};
+
+var typeGuards$1 = {};
+
+var hasRequiredTypeGuards$1;
+
+function requireTypeGuards$1 () {
+	if (hasRequiredTypeGuards$1) return typeGuards$1;
+	hasRequiredTypeGuards$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(typeGuards$1, "__esModule", { value: true });
+	typeGuards$1.isNodeReadableStream = isNodeReadableStream;
+	typeGuards$1.isWebReadableStream = isWebReadableStream;
+	typeGuards$1.isBinaryBody = isBinaryBody;
+	typeGuards$1.isReadableStream = isReadableStream;
+	typeGuards$1.isBlob = isBlob;
+	function isNodeReadableStream(x) {
+	    return Boolean(x && typeof x["pipe"] === "function");
+	}
+	function isWebReadableStream(x) {
+	    return Boolean(x &&
+	        typeof x.getReader === "function" &&
+	        typeof x.tee === "function");
+	}
+	function isBinaryBody(body) {
+	    return (body !== undefined &&
+	        (body instanceof Uint8Array ||
+	            isReadableStream(body) ||
+	            typeof body === "function" ||
+	            body instanceof Blob));
+	}
+	function isReadableStream(x) {
+	    return isNodeReadableStream(x) || isWebReadableStream(x);
+	}
+	function isBlob(x) {
+	    return typeof x.stream === "function";
+	}
+	
+	return typeGuards$1;
+}
+
+var concat = {};
+
+var hasRequiredConcat;
+
+function requireConcat () {
+	if (hasRequiredConcat) return concat;
+	hasRequiredConcat = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(concat, "__esModule", { value: true });
+	concat.concat = concat$1;
+	const stream_1 = require$$3$1;
+	const typeGuards_js_1 = requireTypeGuards$1();
+	async function* streamAsyncIterator() {
+	    const reader = this.getReader();
+	    try {
+	        while (true) {
+	            const { done, value } = await reader.read();
+	            if (done) {
+	                return;
+	            }
+	            yield value;
+	        }
+	    }
+	    finally {
+	        reader.releaseLock();
+	    }
+	}
+	function makeAsyncIterable(webStream) {
+	    if (!webStream[Symbol.asyncIterator]) {
+	        webStream[Symbol.asyncIterator] = streamAsyncIterator.bind(webStream);
+	    }
+	    if (!webStream.values) {
+	        webStream.values = streamAsyncIterator.bind(webStream);
+	    }
+	}
+	function ensureNodeStream(stream) {
+	    if (stream instanceof ReadableStream) {
+	        makeAsyncIterable(stream);
+	        return stream_1.Readable.fromWeb(stream);
+	    }
+	    else {
+	        return stream;
+	    }
+	}
+	function toStream(source) {
+	    if (source instanceof Uint8Array) {
+	        return stream_1.Readable.from(Buffer.from(source));
+	    }
+	    else if ((0, typeGuards_js_1.isBlob)(source)) {
+	        return ensureNodeStream(source.stream());
+	    }
+	    else {
+	        return ensureNodeStream(source);
+	    }
+	}
+	/**
+	 * Utility function that concatenates a set of binary inputs into one combined output.
+	 *
+	 * @param sources - array of sources for the concatenation
+	 * @returns - in Node, a (() =\> NodeJS.ReadableStream) which, when read, produces a concatenation of all the inputs.
+	 *           In browser, returns a `Blob` representing all the concatenated inputs.
+	 *
+	 * @internal
+	 */
+	async function concat$1(sources) {
+	    return function () {
+	        const streams = sources.map((x) => (typeof x === "function" ? x() : x)).map(toStream);
+	        return stream_1.Readable.from((async function* () {
+	            for (const stream of streams) {
+	                for await (const chunk of stream) {
+	                    yield chunk;
+	                }
+	            }
+	        })());
+	    };
+	}
+	
+	return concat;
+}
+
+var hasRequiredMultipartPolicy$1;
+
+function requireMultipartPolicy$1 () {
+	if (hasRequiredMultipartPolicy$1) return multipartPolicy$1;
+	hasRequiredMultipartPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.multipartPolicyName = void 0;
+		exports$1.multipartPolicy = multipartPolicy;
+		const bytesEncoding_js_1 = requireBytesEncoding();
+		const typeGuards_js_1 = requireTypeGuards$1();
+		const uuidUtils_js_1 = requireUuidUtils();
+		const concat_js_1 = requireConcat();
+		function generateBoundary() {
+		    return `----AzSDKFormBoundary${(0, uuidUtils_js_1.randomUUID)()}`;
+		}
+		function encodeHeaders(headers) {
+		    let result = "";
+		    for (const [key, value] of headers) {
+		        result += `${key}: ${value}\r\n`;
+		    }
+		    return result;
+		}
+		function getLength(source) {
+		    if (source instanceof Uint8Array) {
+		        return source.byteLength;
+		    }
+		    else if ((0, typeGuards_js_1.isBlob)(source)) {
+		        // if was created using createFile then -1 means we have an unknown size
+		        return source.size === -1 ? undefined : source.size;
+		    }
+		    else {
+		        return undefined;
+		    }
+		}
+		function getTotalLength(sources) {
+		    let total = 0;
+		    for (const source of sources) {
+		        const partLength = getLength(source);
+		        if (partLength === undefined) {
+		            return undefined;
+		        }
+		        else {
+		            total += partLength;
+		        }
+		    }
+		    return total;
+		}
+		async function buildRequestBody(request, parts, boundary) {
+		    const sources = [
+		        (0, bytesEncoding_js_1.stringToUint8Array)(`--${boundary}`, "utf-8"),
+		        ...parts.flatMap((part) => [
+		            (0, bytesEncoding_js_1.stringToUint8Array)("\r\n", "utf-8"),
+		            (0, bytesEncoding_js_1.stringToUint8Array)(encodeHeaders(part.headers), "utf-8"),
+		            (0, bytesEncoding_js_1.stringToUint8Array)("\r\n", "utf-8"),
+		            part.body,
+		            (0, bytesEncoding_js_1.stringToUint8Array)(`\r\n--${boundary}`, "utf-8"),
+		        ]),
+		        (0, bytesEncoding_js_1.stringToUint8Array)("--\r\n\r\n", "utf-8"),
+		    ];
+		    const contentLength = getTotalLength(sources);
+		    if (contentLength) {
+		        request.headers.set("Content-Length", contentLength);
+		    }
+		    request.body = await (0, concat_js_1.concat)(sources);
+		}
+		/**
+		 * Name of multipart policy
+		 */
+		exports$1.multipartPolicyName = "multipartPolicy";
+		const maxBoundaryLength = 70;
+		const validBoundaryCharacters = new Set(`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'()+,-./:=?`);
+		function assertValidBoundary(boundary) {
+		    if (boundary.length > maxBoundaryLength) {
+		        throw new Error(`Multipart boundary "${boundary}" exceeds maximum length of 70 characters`);
+		    }
+		    if (Array.from(boundary).some((x) => !validBoundaryCharacters.has(x))) {
+		        throw new Error(`Multipart boundary "${boundary}" contains invalid characters`);
+		    }
+		}
+		/**
+		 * Pipeline policy for multipart requests
+		 */
+		function multipartPolicy() {
+		    return {
+		        name: exports$1.multipartPolicyName,
+		        async sendRequest(request, next) {
+		            if (!request.multipartBody) {
+		                return next(request);
+		            }
+		            if (request.body) {
+		                throw new Error("multipartBody and regular body cannot be set at the same time");
+		            }
+		            let boundary = request.multipartBody.boundary;
+		            const contentTypeHeader = request.headers.get("Content-Type") ?? "multipart/mixed";
+		            const parsedHeader = contentTypeHeader.match(/^(multipart\/[^ ;]+)(?:; *boundary=(.+))?$/);
+		            if (!parsedHeader) {
+		                throw new Error(`Got multipart request body, but content-type header was not multipart: ${contentTypeHeader}`);
+		            }
+		            const [, contentType, parsedBoundary] = parsedHeader;
+		            if (parsedBoundary && boundary && parsedBoundary !== boundary) {
+		                throw new Error(`Multipart boundary was specified as ${parsedBoundary} in the header, but got ${boundary} in the request body`);
+		            }
+		            boundary ??= parsedBoundary;
+		            if (boundary) {
+		                assertValidBoundary(boundary);
+		            }
+		            else {
+		                boundary = generateBoundary();
+		            }
+		            request.headers.set("Content-Type", `${contentType}; boundary=${boundary}`);
+		            await buildRequestBody(request, request.multipartBody.parts, boundary);
+		            request.multipartBody = undefined;
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (multipartPolicy$1));
+	return multipartPolicy$1;
+}
+
+var hasRequiredCreatePipelineFromOptions$1;
+
+function requireCreatePipelineFromOptions$1 () {
+	if (hasRequiredCreatePipelineFromOptions$1) return createPipelineFromOptions$1;
+	hasRequiredCreatePipelineFromOptions$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(createPipelineFromOptions$1, "__esModule", { value: true });
+	createPipelineFromOptions$1.createPipelineFromOptions = createPipelineFromOptions;
+	const logPolicy_js_1 = requireLogPolicy$1();
+	const pipeline_js_1 = requirePipeline$3();
+	const redirectPolicy_js_1 = requireRedirectPolicy$1();
+	const userAgentPolicy_js_1 = requireUserAgentPolicy$1();
+	const decompressResponsePolicy_js_1 = requireDecompressResponsePolicy$1();
+	const defaultRetryPolicy_js_1 = requireDefaultRetryPolicy$1();
+	const formDataPolicy_js_1 = requireFormDataPolicy$1();
+	const checkEnvironment_js_1 = requireCheckEnvironment();
+	const proxyPolicy_js_1 = requireProxyPolicy$1();
+	const agentPolicy_js_1 = requireAgentPolicy$1();
+	const tlsPolicy_js_1 = requireTlsPolicy$1();
+	const multipartPolicy_js_1 = requireMultipartPolicy$1();
+	/**
+	 * Create a new pipeline with a default set of customizable policies.
+	 * @param options - Options to configure a custom pipeline.
+	 */
+	function createPipelineFromOptions(options) {
+	    const pipeline = (0, pipeline_js_1.createEmptyPipeline)();
+	    if (checkEnvironment_js_1.isNodeLike) {
+	        if (options.agent) {
+	            pipeline.addPolicy((0, agentPolicy_js_1.agentPolicy)(options.agent));
+	        }
+	        if (options.tlsOptions) {
+	            pipeline.addPolicy((0, tlsPolicy_js_1.tlsPolicy)(options.tlsOptions));
+	        }
+	        pipeline.addPolicy((0, proxyPolicy_js_1.proxyPolicy)(options.proxyOptions));
+	        pipeline.addPolicy((0, decompressResponsePolicy_js_1.decompressResponsePolicy)());
+	    }
+	    pipeline.addPolicy((0, formDataPolicy_js_1.formDataPolicy)(), { beforePolicies: [multipartPolicy_js_1.multipartPolicyName] });
+	    pipeline.addPolicy((0, userAgentPolicy_js_1.userAgentPolicy)(options.userAgentOptions));
+	    // The multipart policy is added after policies with no phase, so that
+	    // policies can be added between it and formDataPolicy to modify
+	    // properties (e.g., making the boundary constant in recorded tests).
+	    pipeline.addPolicy((0, multipartPolicy_js_1.multipartPolicy)(), { afterPhase: "Deserialize" });
+	    pipeline.addPolicy((0, defaultRetryPolicy_js_1.defaultRetryPolicy)(options.retryOptions), { phase: "Retry" });
+	    if (checkEnvironment_js_1.isNodeLike) {
+	        // Both XHR and Fetch expect to handle redirects automatically,
+	        // so only include this policy when we're in Node.
+	        pipeline.addPolicy((0, redirectPolicy_js_1.redirectPolicy)(options.redirectOptions), { afterPhase: "Retry" });
+	    }
+	    pipeline.addPolicy((0, logPolicy_js_1.logPolicy)(options.loggingOptions), { afterPhase: "Sign" });
+	    return pipeline;
+	}
+	
+	return createPipelineFromOptions$1;
+}
+
+var apiVersionPolicy = {};
+
+var hasRequiredApiVersionPolicy;
+
+function requireApiVersionPolicy () {
+	if (hasRequiredApiVersionPolicy) return apiVersionPolicy;
+	hasRequiredApiVersionPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.apiVersionPolicyName = void 0;
+		exports$1.apiVersionPolicy = apiVersionPolicy;
+		exports$1.apiVersionPolicyName = "ApiVersionPolicy";
+		/**
+		 * Creates a policy that sets the apiVersion as a query parameter on every request
+		 * @param options - Client options
+		 * @returns Pipeline policy that sets the apiVersion as a query parameter on every request
+		 */
+		function apiVersionPolicy(options) {
+		    return {
+		        name: exports$1.apiVersionPolicyName,
+		        sendRequest: (req, next) => {
+		            // Use the apiVesion defined in request url directly
+		            // Append one if there is no apiVesion and we have one at client options
+		            const url = new URL(req.url);
+		            if (!url.searchParams.get("api-version") && options.apiVersion) {
+		                req.url = `${req.url}${Array.from(url.searchParams.keys()).length > 0 ? "&" : "?"}api-version=${options.apiVersion}`;
+		            }
+		            return next(req);
+		        },
+		    };
+		}
+		
+	} (apiVersionPolicy));
+	return apiVersionPolicy;
+}
+
+var credentials = {};
+
+var hasRequiredCredentials;
+
+function requireCredentials () {
+	if (hasRequiredCredentials) return credentials;
+	hasRequiredCredentials = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(credentials, "__esModule", { value: true });
+	credentials.isOAuth2TokenCredential = isOAuth2TokenCredential;
+	credentials.isBearerTokenCredential = isBearerTokenCredential;
+	credentials.isBasicCredential = isBasicCredential;
+	credentials.isApiKeyCredential = isApiKeyCredential;
+	/**
+	 * Type guard to check if a credential is an OAuth2 token credential.
+	 */
+	function isOAuth2TokenCredential(credential) {
+	    return "getOAuth2Token" in credential;
+	}
+	/**
+	 * Type guard to check if a credential is a Bearer token credential.
+	 */
+	function isBearerTokenCredential(credential) {
+	    return "getBearerToken" in credential;
+	}
+	/**
+	 * Type guard to check if a credential is a Basic auth credential.
+	 */
+	function isBasicCredential(credential) {
+	    return "username" in credential && "password" in credential;
+	}
+	/**
+	 * Type guard to check if a credential is an API key credential.
+	 */
+	function isApiKeyCredential(credential) {
+	    return "key" in credential;
+	}
+	
+	return credentials;
+}
+
+var apiKeyAuthenticationPolicy = {};
+
+var checkInsecureConnection = {};
+
+var hasRequiredCheckInsecureConnection;
+
+function requireCheckInsecureConnection () {
+	if (hasRequiredCheckInsecureConnection) return checkInsecureConnection;
+	hasRequiredCheckInsecureConnection = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(checkInsecureConnection, "__esModule", { value: true });
+	checkInsecureConnection.ensureSecureConnection = ensureSecureConnection;
+	const log_js_1 = requireLog$4();
+	// Ensure the warining is only emitted once
+	let insecureConnectionWarningEmmitted = false;
+	/**
+	 * Checks if the request is allowed to be sent over an insecure connection.
+	 *
+	 * A request is allowed to be sent over an insecure connection when:
+	 * - The `allowInsecureConnection` option is set to `true`.
+	 * - The request has the `allowInsecureConnection` property set to `true`.
+	 * - The request is being sent to `localhost` or `127.0.0.1`
+	 */
+	function allowInsecureConnection(request, options) {
+	    if (options.allowInsecureConnection && request.allowInsecureConnection) {
+	        const url = new URL(request.url);
+	        if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
+	            return true;
+	        }
+	    }
+	    return false;
+	}
+	/**
+	 * Logs a warning about sending a token over an insecure connection.
+	 *
+	 * This function will emit a node warning once, but log the warning every time.
+	 */
+	function emitInsecureConnectionWarning() {
+	    const warning = "Sending token over insecure transport. Assume any token issued is compromised.";
+	    log_js_1.logger.warning(warning);
+	    if (typeof process?.emitWarning === "function" && !insecureConnectionWarningEmmitted) {
+	        insecureConnectionWarningEmmitted = true;
+	        process.emitWarning(warning);
+	    }
+	}
+	/**
+	 * Ensures that authentication is only allowed over HTTPS unless explicitly allowed.
+	 * Throws an error if the connection is not secure and not explicitly allowed.
+	 */
+	function ensureSecureConnection(request, options) {
+	    if (!request.url.toLowerCase().startsWith("https://")) {
+	        if (allowInsecureConnection(request, options)) {
+	            emitInsecureConnectionWarning();
+	        }
+	        else {
+	            throw new Error("Authentication is not permitted for non-TLS protected (non-https) URLs when allowInsecureConnection is false.");
+	        }
+	    }
+	}
+	
+	return checkInsecureConnection;
+}
+
+var hasRequiredApiKeyAuthenticationPolicy;
+
+function requireApiKeyAuthenticationPolicy () {
+	if (hasRequiredApiKeyAuthenticationPolicy) return apiKeyAuthenticationPolicy;
+	hasRequiredApiKeyAuthenticationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.apiKeyAuthenticationPolicyName = void 0;
+		exports$1.apiKeyAuthenticationPolicy = apiKeyAuthenticationPolicy;
+		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
+		/**
+		 * Name of the API Key Authentication Policy
+		 */
+		exports$1.apiKeyAuthenticationPolicyName = "apiKeyAuthenticationPolicy";
+		/**
+		 * Gets a pipeline policy that adds API key authentication to requests
+		 */
+		function apiKeyAuthenticationPolicy(options) {
+		    return {
+		        name: exports$1.apiKeyAuthenticationPolicyName,
+		        async sendRequest(request, next) {
+		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
+		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
+		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "apiKey");
+		            // Skip adding authentication header if no API key authentication scheme is found
+		            if (!scheme) {
+		                return next(request);
+		            }
+		            if (scheme.apiKeyLocation !== "header") {
+		                throw new Error(`Unsupported API key location: ${scheme.apiKeyLocation}`);
+		            }
+		            request.headers.set(scheme.name, options.credential.key);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (apiKeyAuthenticationPolicy));
+	return apiKeyAuthenticationPolicy;
+}
+
+var basicAuthenticationPolicy = {};
+
+var hasRequiredBasicAuthenticationPolicy;
+
+function requireBasicAuthenticationPolicy () {
+	if (hasRequiredBasicAuthenticationPolicy) return basicAuthenticationPolicy;
+	hasRequiredBasicAuthenticationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.basicAuthenticationPolicyName = void 0;
+		exports$1.basicAuthenticationPolicy = basicAuthenticationPolicy;
+		const bytesEncoding_js_1 = requireBytesEncoding();
+		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
+		/**
+		 * Name of the Basic Authentication Policy
+		 */
+		exports$1.basicAuthenticationPolicyName = "bearerAuthenticationPolicy";
+		/**
+		 * Gets a pipeline policy that adds basic authentication to requests
+		 */
+		function basicAuthenticationPolicy(options) {
+		    return {
+		        name: exports$1.basicAuthenticationPolicyName,
+		        async sendRequest(request, next) {
+		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
+		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
+		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "http" && x.scheme === "basic");
+		            // Skip adding authentication header if no basic authentication scheme is found
+		            if (!scheme) {
+		                return next(request);
+		            }
+		            const { username, password } = options.credential;
+		            const headerValue = (0, bytesEncoding_js_1.uint8ArrayToString)((0, bytesEncoding_js_1.stringToUint8Array)(`${username}:${password}`, "utf-8"), "base64");
+		            request.headers.set("Authorization", `Basic ${headerValue}`);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (basicAuthenticationPolicy));
+	return basicAuthenticationPolicy;
+}
+
+var bearerAuthenticationPolicy = {};
+
+var hasRequiredBearerAuthenticationPolicy;
+
+function requireBearerAuthenticationPolicy () {
+	if (hasRequiredBearerAuthenticationPolicy) return bearerAuthenticationPolicy;
+	hasRequiredBearerAuthenticationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.bearerAuthenticationPolicyName = void 0;
+		exports$1.bearerAuthenticationPolicy = bearerAuthenticationPolicy;
+		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
+		/**
+		 * Name of the Bearer Authentication Policy
+		 */
+		exports$1.bearerAuthenticationPolicyName = "bearerAuthenticationPolicy";
+		/**
+		 * Gets a pipeline policy that adds bearer token authentication to requests
+		 */
+		function bearerAuthenticationPolicy(options) {
+		    return {
+		        name: exports$1.bearerAuthenticationPolicyName,
+		        async sendRequest(request, next) {
+		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
+		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
+		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "http" && x.scheme === "bearer");
+		            // Skip adding authentication header if no bearer authentication scheme is found
+		            if (!scheme) {
+		                return next(request);
+		            }
+		            const token = await options.credential.getBearerToken({
+		                abortSignal: request.abortSignal,
+		            });
+		            request.headers.set("Authorization", `Bearer ${token}`);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (bearerAuthenticationPolicy));
+	return bearerAuthenticationPolicy;
+}
+
+var oauth2AuthenticationPolicy = {};
+
+var hasRequiredOauth2AuthenticationPolicy;
+
+function requireOauth2AuthenticationPolicy () {
+	if (hasRequiredOauth2AuthenticationPolicy) return oauth2AuthenticationPolicy;
+	hasRequiredOauth2AuthenticationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.oauth2AuthenticationPolicyName = void 0;
+		exports$1.oauth2AuthenticationPolicy = oauth2AuthenticationPolicy;
+		const checkInsecureConnection_js_1 = requireCheckInsecureConnection();
+		/**
+		 * Name of the OAuth2 Authentication Policy
+		 */
+		exports$1.oauth2AuthenticationPolicyName = "oauth2AuthenticationPolicy";
+		/**
+		 * Gets a pipeline policy that adds authorization header from OAuth2 schemes
+		 */
+		function oauth2AuthenticationPolicy(options) {
+		    return {
+		        name: exports$1.oauth2AuthenticationPolicyName,
+		        async sendRequest(request, next) {
+		            // Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
+		            (0, checkInsecureConnection_js_1.ensureSecureConnection)(request, options);
+		            const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "oauth2");
+		            // Skip adding authentication header if no OAuth2 authentication scheme is found
+		            if (!scheme) {
+		                return next(request);
+		            }
+		            const token = await options.credential.getOAuth2Token(scheme.flows, {
+		                abortSignal: request.abortSignal,
+		            });
+		            request.headers.set("Authorization", `Bearer ${token}`);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (oauth2AuthenticationPolicy));
+	return oauth2AuthenticationPolicy;
+}
+
+var hasRequiredClientHelpers;
+
+function requireClientHelpers () {
+	if (hasRequiredClientHelpers) return clientHelpers;
+	hasRequiredClientHelpers = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(clientHelpers, "__esModule", { value: true });
+	clientHelpers.createDefaultPipeline = createDefaultPipeline;
+	clientHelpers.getCachedDefaultHttpsClient = getCachedDefaultHttpsClient;
+	const defaultHttpClient_js_1 = requireDefaultHttpClient$1();
+	const createPipelineFromOptions_js_1 = requireCreatePipelineFromOptions$1();
+	const apiVersionPolicy_js_1 = requireApiVersionPolicy();
+	const credentials_js_1 = requireCredentials();
+	const apiKeyAuthenticationPolicy_js_1 = requireApiKeyAuthenticationPolicy();
+	const basicAuthenticationPolicy_js_1 = requireBasicAuthenticationPolicy();
+	const bearerAuthenticationPolicy_js_1 = requireBearerAuthenticationPolicy();
+	const oauth2AuthenticationPolicy_js_1 = requireOauth2AuthenticationPolicy();
+	let cachedHttpClient;
+	/**
+	 * Creates a default rest pipeline to re-use accross Rest Level Clients
+	 */
+	function createDefaultPipeline(options = {}) {
+	    const pipeline = (0, createPipelineFromOptions_js_1.createPipelineFromOptions)(options);
+	    pipeline.addPolicy((0, apiVersionPolicy_js_1.apiVersionPolicy)(options));
+	    const { credential, authSchemes, allowInsecureConnection } = options;
+	    if (credential) {
+	        if ((0, credentials_js_1.isApiKeyCredential)(credential)) {
+	            pipeline.addPolicy((0, apiKeyAuthenticationPolicy_js_1.apiKeyAuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
+	        }
+	        else if ((0, credentials_js_1.isBasicCredential)(credential)) {
+	            pipeline.addPolicy((0, basicAuthenticationPolicy_js_1.basicAuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
+	        }
+	        else if ((0, credentials_js_1.isBearerTokenCredential)(credential)) {
+	            pipeline.addPolicy((0, bearerAuthenticationPolicy_js_1.bearerAuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
+	        }
+	        else if ((0, credentials_js_1.isOAuth2TokenCredential)(credential)) {
+	            pipeline.addPolicy((0, oauth2AuthenticationPolicy_js_1.oauth2AuthenticationPolicy)({ authSchemes, credential, allowInsecureConnection }));
+	        }
+	    }
+	    return pipeline;
+	}
+	function getCachedDefaultHttpsClient() {
+	    if (!cachedHttpClient) {
+	        cachedHttpClient = (0, defaultHttpClient_js_1.createDefaultHttpClient)();
+	    }
+	    return cachedHttpClient;
+	}
+	
+	return clientHelpers;
+}
+
+var sendRequest = {};
+
+var multipart = {};
+
+var hasRequiredMultipart;
+
+function requireMultipart () {
+	if (hasRequiredMultipart) return multipart;
+	hasRequiredMultipart = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(multipart, "__esModule", { value: true });
+	multipart.buildBodyPart = buildBodyPart;
+	multipart.buildMultipartBody = buildMultipartBody;
+	const restError_js_1 = requireRestError$2();
+	const httpHeaders_js_1 = requireHttpHeaders$1();
+	const bytesEncoding_js_1 = requireBytesEncoding();
+	const typeGuards_js_1 = requireTypeGuards$1();
+	/**
+	 * Get value of a header in the part descriptor ignoring case
+	 */
+	function getHeaderValue(descriptor, headerName) {
+	    if (descriptor.headers) {
+	        const actualHeaderName = Object.keys(descriptor.headers).find((x) => x.toLowerCase() === headerName.toLowerCase());
+	        if (actualHeaderName) {
+	            return descriptor.headers[actualHeaderName];
+	        }
+	    }
+	    return undefined;
+	}
+	function getPartContentType(descriptor) {
+	    const contentTypeHeader = getHeaderValue(descriptor, "content-type");
+	    if (contentTypeHeader) {
+	        return contentTypeHeader;
+	    }
+	    // Special value of null means content type is to be omitted
+	    if (descriptor.contentType === null) {
+	        return undefined;
+	    }
+	    if (descriptor.contentType) {
+	        return descriptor.contentType;
+	    }
+	    const { body } = descriptor;
+	    if (body === null || body === undefined) {
+	        return undefined;
+	    }
+	    if (typeof body === "string" || typeof body === "number" || typeof body === "boolean") {
+	        return "text/plain; charset=UTF-8";
+	    }
+	    if (body instanceof Blob) {
+	        return body.type || "application/octet-stream";
+	    }
+	    if ((0, typeGuards_js_1.isBinaryBody)(body)) {
+	        return "application/octet-stream";
+	    }
+	    // arbitrary non-text object -> generic JSON content type by default. We will try to JSON.stringify the body.
+	    return "application/json";
+	}
+	/**
+	 * Enclose value in quotes and escape special characters, for use in the Content-Disposition header
+	 */
+	function escapeDispositionField(value) {
+	    return JSON.stringify(value);
+	}
+	function getContentDisposition(descriptor) {
+	    const contentDispositionHeader = getHeaderValue(descriptor, "content-disposition");
+	    if (contentDispositionHeader) {
+	        return contentDispositionHeader;
+	    }
+	    if (descriptor.dispositionType === undefined &&
+	        descriptor.name === undefined &&
+	        descriptor.filename === undefined) {
+	        return undefined;
+	    }
+	    const dispositionType = descriptor.dispositionType ?? "form-data";
+	    let disposition = dispositionType;
+	    if (descriptor.name) {
+	        disposition += `; name=${escapeDispositionField(descriptor.name)}`;
+	    }
+	    let filename = undefined;
+	    if (descriptor.filename) {
+	        filename = descriptor.filename;
+	    }
+	    else if (typeof File !== "undefined" && descriptor.body instanceof File) {
+	        const filenameFromFile = descriptor.body.name;
+	        if (filenameFromFile !== "") {
+	            filename = filenameFromFile;
+	        }
+	    }
+	    if (filename) {
+	        disposition += `; filename=${escapeDispositionField(filename)}`;
+	    }
+	    return disposition;
+	}
+	function normalizeBody(body, contentType) {
+	    if (body === undefined) {
+	        // zero-length body
+	        return new Uint8Array([]);
+	    }
+	    // binary and primitives should go straight on the wire regardless of content type
+	    if ((0, typeGuards_js_1.isBinaryBody)(body)) {
+	        return body;
+	    }
+	    if (typeof body === "string" || typeof body === "number" || typeof body === "boolean") {
+	        return (0, bytesEncoding_js_1.stringToUint8Array)(String(body), "utf-8");
+	    }
+	    // stringify objects for JSON-ish content types e.g. application/json, application/merge-patch+json, application/vnd.oci.manifest.v1+json, application.json; charset=UTF-8
+	    if (contentType && /application\/(.+\+)?json(;.+)?/i.test(String(contentType))) {
+	        return (0, bytesEncoding_js_1.stringToUint8Array)(JSON.stringify(body), "utf-8");
+	    }
+	    throw new restError_js_1.RestError(`Unsupported body/content-type combination: ${body}, ${contentType}`);
+	}
+	function buildBodyPart(descriptor) {
+	    const contentType = getPartContentType(descriptor);
+	    const contentDisposition = getContentDisposition(descriptor);
+	    const headers = (0, httpHeaders_js_1.createHttpHeaders)(descriptor.headers ?? {});
+	    if (contentType) {
+	        headers.set("content-type", contentType);
+	    }
+	    if (contentDisposition) {
+	        headers.set("content-disposition", contentDisposition);
+	    }
+	    const body = normalizeBody(descriptor.body, contentType);
+	    return {
+	        headers,
+	        body,
+	    };
+	}
+	function buildMultipartBody(parts) {
+	    return { parts: parts.map(buildBodyPart) };
+	}
+	
+	return multipart;
+}
+
+var hasRequiredSendRequest;
+
+function requireSendRequest () {
+	if (hasRequiredSendRequest) return sendRequest;
+	hasRequiredSendRequest = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(sendRequest, "__esModule", { value: true });
+	sendRequest.sendRequest = sendRequest$1;
+	const restError_js_1 = requireRestError$2();
+	const httpHeaders_js_1 = requireHttpHeaders$1();
+	const pipelineRequest_js_1 = requirePipelineRequest$1();
+	const clientHelpers_js_1 = requireClientHelpers();
+	const typeGuards_js_1 = requireTypeGuards$1();
+	const multipart_js_1 = requireMultipart();
+	/**
+	 * Helper function to send request used by the client
+	 * @param method - method to use to send the request
+	 * @param url - url to send the request to
+	 * @param pipeline - pipeline with the policies to run when sending the request
+	 * @param options - request options
+	 * @param customHttpClient - a custom HttpClient to use when making the request
+	 * @returns returns and HttpResponse
+	 */
+	async function sendRequest$1(method, url, pipeline, options = {}, customHttpClient) {
+	    const httpClient = customHttpClient ?? (0, clientHelpers_js_1.getCachedDefaultHttpsClient)();
+	    const request = buildPipelineRequest(method, url, options);
+	    try {
+	        const response = await pipeline.sendRequest(httpClient, request);
+	        const headers = response.headers.toJSON();
+	        const stream = response.readableStreamBody ?? response.browserStreamBody;
+	        const parsedBody = options.responseAsStream || stream !== undefined ? undefined : getResponseBody(response);
+	        const body = stream ?? parsedBody;
+	        if (options?.onResponse) {
+	            options.onResponse({ ...response, request, rawHeaders: headers, parsedBody });
+	        }
+	        return {
+	            request,
+	            headers,
+	            status: `${response.status}`,
+	            body,
+	        };
+	    }
+	    catch (e) {
+	        if ((0, restError_js_1.isRestError)(e) && e.response && options.onResponse) {
+	            const { response } = e;
+	            const rawHeaders = response.headers.toJSON();
+	            // UNBRANDED DIFFERENCE: onResponse callback does not have a second __legacyError property
+	            options?.onResponse({ ...response, request, rawHeaders }, e);
+	        }
+	        throw e;
+	    }
+	}
+	/**
+	 * Function to determine the request content type
+	 * @param options - request options InternalRequestParameters
+	 * @returns returns the content-type
+	 */
+	function getRequestContentType(options = {}) {
+	    return (options.contentType ??
+	        options.headers?.["content-type"] ??
+	        getContentType(options.body));
+	}
+	/**
+	 * Function to determine the content-type of a body
+	 * this is used if an explicit content-type is not provided
+	 * @param body - body in the request
+	 * @returns returns the content-type
+	 */
+	function getContentType(body) {
+	    if (ArrayBuffer.isView(body)) {
+	        return "application/octet-stream";
+	    }
+	    if (typeof body === "string") {
+	        try {
+	            JSON.parse(body);
+	            return "application/json";
+	        }
+	        catch (error) {
+	            // If we fail to parse the body, it is not json
+	            return undefined;
+	        }
+	    }
+	    // By default return json
+	    return "application/json";
+	}
+	function buildPipelineRequest(method, url, options = {}) {
+	    const requestContentType = getRequestContentType(options);
+	    const { body, multipartBody } = getRequestBody(options.body, requestContentType);
+	    const hasContent = body !== undefined || multipartBody !== undefined;
+	    const headers = (0, httpHeaders_js_1.createHttpHeaders)({
+	        ...(options.headers ? options.headers : {}),
+	        accept: options.accept ?? options.headers?.accept ?? "application/json",
+	        ...(hasContent &&
+	            requestContentType && {
+	            "content-type": requestContentType,
+	        }),
+	    });
+	    return (0, pipelineRequest_js_1.createPipelineRequest)({
+	        url,
+	        method,
+	        body,
+	        multipartBody,
+	        headers,
+	        allowInsecureConnection: options.allowInsecureConnection,
+	        abortSignal: options.abortSignal,
+	        onUploadProgress: options.onUploadProgress,
+	        onDownloadProgress: options.onDownloadProgress,
+	        timeout: options.timeout,
+	        enableBrowserStreams: true,
+	        streamResponseStatusCodes: options.responseAsStream
+	            ? new Set([Number.POSITIVE_INFINITY])
+	            : undefined,
+	    });
+	}
+	/**
+	 * Prepares the body before sending the request
+	 */
+	function getRequestBody(body, contentType = "") {
+	    if (body === undefined) {
+	        return { body: undefined };
+	    }
+	    if (typeof FormData !== "undefined" && body instanceof FormData) {
+	        return { body };
+	    }
+	    if ((0, typeGuards_js_1.isReadableStream)(body)) {
+	        return { body };
+	    }
+	    if (ArrayBuffer.isView(body)) {
+	        return { body: body instanceof Uint8Array ? body : JSON.stringify(body) };
+	    }
+	    const firstType = contentType.split(";")[0];
+	    switch (firstType) {
+	        case "application/json":
+	            return { body: JSON.stringify(body) };
+	        case "multipart/form-data":
+	            if (Array.isArray(body)) {
+	                return { multipartBody: (0, multipart_js_1.buildMultipartBody)(body) };
+	            }
+	            return { body: JSON.stringify(body) };
+	        case "text/plain":
+	            return { body: String(body) };
+	        default:
+	            if (typeof body === "string") {
+	                return { body };
+	            }
+	            return { body: JSON.stringify(body) };
+	    }
+	}
+	/**
+	 * Prepares the response body
+	 */
+	function getResponseBody(response) {
+	    // Set the default response type
+	    const contentType = response.headers.get("content-type") ?? "";
+	    const firstType = contentType.split(";")[0];
+	    const bodyToParse = response.bodyAsText ?? "";
+	    if (firstType === "text/plain") {
+	        return String(bodyToParse);
+	    }
+	    // Default to "application/json" and fallback to string;
+	    try {
+	        return bodyToParse ? JSON.parse(bodyToParse) : undefined;
+	    }
+	    catch (error) {
+	        // If we were supposed to get a JSON object and failed to
+	        // parse, throw a parse error
+	        if (firstType === "application/json") {
+	            throw createParseError(response, error);
+	        }
+	        // We are not sure how to handle the response so we return it as
+	        // plain text.
+	        return String(bodyToParse);
+	    }
+	}
+	function createParseError(response, err) {
+	    const msg = `Error "${err}" occurred while parsing the response body - ${response.bodyAsText}.`;
+	    const errCode = err.code ?? restError_js_1.RestError.PARSE_ERROR;
+	    return new restError_js_1.RestError(msg, {
+	        code: errCode,
+	        statusCode: response.status,
+	        request: response.request,
+	        response: response,
+	    });
+	}
+	
+	return sendRequest;
+}
+
+var urlHelpers$1 = {};
+
+var hasRequiredUrlHelpers$1;
+
+function requireUrlHelpers$1 () {
+	if (hasRequiredUrlHelpers$1) return urlHelpers$1;
+	hasRequiredUrlHelpers$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(urlHelpers$1, "__esModule", { value: true });
+	urlHelpers$1.buildRequestUrl = buildRequestUrl;
+	urlHelpers$1.buildBaseUrl = buildBaseUrl;
+	urlHelpers$1.replaceAll = replaceAll;
+	function isQueryParameterWithOptions(x) {
+	    const value = x.value;
+	    return (value !== undefined && value.toString !== undefined && typeof value.toString === "function");
+	}
+	/**
+	 * Builds the request url, filling in query and path parameters
+	 * @param endpoint - base url which can be a template url
+	 * @param routePath - path to append to the endpoint
+	 * @param pathParameters - values of the path parameters
+	 * @param options - request parameters including query parameters
+	 * @returns a full url with path and query parameters
+	 */
+	function buildRequestUrl(endpoint, routePath, pathParameters, options = {}) {
+	    if (routePath.startsWith("https://") || routePath.startsWith("http://")) {
+	        return routePath;
+	    }
+	    endpoint = buildBaseUrl(endpoint, options);
+	    routePath = buildRoutePath(routePath, pathParameters, options);
+	    const requestUrl = appendQueryParams(`${endpoint}/${routePath}`, options);
+	    const url = new URL(requestUrl);
+	    return (url
+	        .toString()
+	        // Remove double forward slashes
+	        .replace(/([^:]\/)\/+/g, "$1"));
+	}
+	function getQueryParamValue(key, allowReserved, style, param) {
+	    let separator;
+	    if (style === "pipeDelimited") {
+	        separator = "|";
+	    }
+	    else if (style === "spaceDelimited") {
+	        separator = "%20";
+	    }
+	    else {
+	        separator = ",";
+	    }
+	    let paramValues;
+	    if (Array.isArray(param)) {
+	        paramValues = param;
+	    }
+	    else if (typeof param === "object" && param.toString === Object.prototype.toString) {
+	        // If the parameter is an object without a custom toString implementation (e.g. a Date),
+	        // then we should deconstruct the object into an array [key1, value1, key2, value2, ...].
+	        paramValues = Object.entries(param).flat();
+	    }
+	    else {
+	        paramValues = [param];
+	    }
+	    const value = paramValues
+	        .map((p) => {
+	        if (p === null || p === undefined) {
+	            return "";
+	        }
+	        if (!p.toString || typeof p.toString !== "function") {
+	            throw new Error(`Query parameters must be able to be represented as string, ${key} can't`);
+	        }
+	        const rawValue = p.toISOString !== undefined ? p.toISOString() : p.toString();
+	        return allowReserved ? rawValue : encodeURIComponent(rawValue);
+	    })
+	        .join(separator);
+	    return `${allowReserved ? key : encodeURIComponent(key)}=${value}`;
+	}
+	function appendQueryParams(url, options = {}) {
+	    if (!options.queryParameters) {
+	        return url;
+	    }
+	    const parsedUrl = new URL(url);
+	    const queryParams = options.queryParameters;
+	    const paramStrings = [];
+	    for (const key of Object.keys(queryParams)) {
+	        const param = queryParams[key];
+	        if (param === undefined || param === null) {
+	            continue;
+	        }
+	        const hasMetadata = isQueryParameterWithOptions(param);
+	        const rawValue = hasMetadata ? param.value : param;
+	        const explode = hasMetadata ? (param.explode ?? false) : false;
+	        const style = hasMetadata && param.style ? param.style : "form";
+	        if (explode) {
+	            if (Array.isArray(rawValue)) {
+	                for (const item of rawValue) {
+	                    paramStrings.push(getQueryParamValue(key, options.skipUrlEncoding ?? false, style, item));
+	                }
+	            }
+	            else if (typeof rawValue === "object") {
+	                // For object explode, the name of the query parameter is ignored and we use the object key instead
+	                for (const [actualKey, value] of Object.entries(rawValue)) {
+	                    paramStrings.push(getQueryParamValue(actualKey, options.skipUrlEncoding ?? false, style, value));
+	                }
+	            }
+	            else {
+	                // Explode doesn't really make sense for primitives
+	                throw new Error("explode can only be set to true for objects and arrays");
+	            }
+	        }
+	        else {
+	            paramStrings.push(getQueryParamValue(key, options.skipUrlEncoding ?? false, style, rawValue));
+	        }
+	    }
+	    if (parsedUrl.search !== "") {
+	        parsedUrl.search += "&";
+	    }
+	    parsedUrl.search += paramStrings.join("&");
+	    return parsedUrl.toString();
+	}
+	function buildBaseUrl(endpoint, options) {
+	    if (!options.pathParameters) {
+	        return endpoint;
+	    }
+	    const pathParams = options.pathParameters;
+	    for (const [key, param] of Object.entries(pathParams)) {
+	        if (param === undefined || param === null) {
+	            throw new Error(`Path parameters ${key} must not be undefined or null`);
+	        }
+	        if (!param.toString || typeof param.toString !== "function") {
+	            throw new Error(`Path parameters must be able to be represented as string, ${key} can't`);
+	        }
+	        let value = param.toISOString !== undefined ? param.toISOString() : String(param);
+	        if (!options.skipUrlEncoding) {
+	            value = encodeURIComponent(param);
+	        }
+	        endpoint = replaceAll(endpoint, `{${key}}`, value) ?? "";
+	    }
+	    return endpoint;
+	}
+	function buildRoutePath(routePath, pathParameters, options = {}) {
+	    for (const pathParam of pathParameters) {
+	        const allowReserved = typeof pathParam === "object" && (pathParam.allowReserved ?? false);
+	        let value = typeof pathParam === "object" ? pathParam.value : pathParam;
+	        if (!options.skipUrlEncoding && !allowReserved) {
+	            value = encodeURIComponent(value);
+	        }
+	        routePath = routePath.replace(/\{[\w-]+\}/, String(value));
+	    }
+	    return routePath;
+	}
+	/**
+	 * Replace all of the instances of searchValue in value with the provided replaceValue.
+	 * @param value - The value to search and replace in.
+	 * @param searchValue - The value to search for in the value argument.
+	 * @param replaceValue - The value to replace searchValue with in the value argument.
+	 * @returns The value where each instance of searchValue was replaced with replacedValue.
+	 */
+	function replaceAll(value, searchValue, replaceValue) {
+	    return !value || !searchValue ? value : value.split(searchValue).join(replaceValue || "");
+	}
+	
+	return urlHelpers$1;
+}
+
+var hasRequiredGetClient;
+
+function requireGetClient () {
+	if (hasRequiredGetClient) return getClient;
+	hasRequiredGetClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(getClient, "__esModule", { value: true });
+	getClient.getClient = getClient$1;
+	const clientHelpers_js_1 = requireClientHelpers();
+	const sendRequest_js_1 = requireSendRequest();
+	const urlHelpers_js_1 = requireUrlHelpers$1();
+	const checkEnvironment_js_1 = requireCheckEnvironment();
+	/**
+	 * Creates a client with a default pipeline
+	 * @param endpoint - Base endpoint for the client
+	 * @param credentials - Credentials to authenticate the requests
+	 * @param options - Client options
+	 */
+	function getClient$1(endpoint, clientOptions = {}) {
+	    const pipeline = clientOptions.pipeline ?? (0, clientHelpers_js_1.createDefaultPipeline)(clientOptions);
+	    if (clientOptions.additionalPolicies?.length) {
+	        for (const { policy, position } of clientOptions.additionalPolicies) {
+	            // Sign happens after Retry and is commonly needed to occur
+	            // before policies that intercept post-retry.
+	            const afterPhase = position === "perRetry" ? "Sign" : undefined;
+	            pipeline.addPolicy(policy, {
+	                afterPhase,
+	            });
+	        }
+	    }
+	    const { allowInsecureConnection, httpClient } = clientOptions;
+	    const endpointUrl = clientOptions.endpoint ?? endpoint;
+	    const client = (path, ...args) => {
+	        const getUrl = (requestOptions) => (0, urlHelpers_js_1.buildRequestUrl)(endpointUrl, path, args, { allowInsecureConnection, ...requestOptions });
+	        return {
+	            get: (requestOptions = {}) => {
+	                return buildOperation("GET", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            post: (requestOptions = {}) => {
+	                return buildOperation("POST", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            put: (requestOptions = {}) => {
+	                return buildOperation("PUT", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            patch: (requestOptions = {}) => {
+	                return buildOperation("PATCH", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            delete: (requestOptions = {}) => {
+	                return buildOperation("DELETE", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            head: (requestOptions = {}) => {
+	                return buildOperation("HEAD", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            options: (requestOptions = {}) => {
+	                return buildOperation("OPTIONS", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	            trace: (requestOptions = {}) => {
+	                return buildOperation("TRACE", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
+	            },
+	        };
+	    };
+	    return {
+	        path: client,
+	        pathUnchecked: client,
+	        pipeline,
+	    };
+	}
+	function buildOperation(method, url, pipeline, options, allowInsecureConnection, httpClient) {
+	    allowInsecureConnection = options.allowInsecureConnection ?? allowInsecureConnection;
+	    return {
+	        then: function (onFulfilled, onrejected) {
+	            return (0, sendRequest_js_1.sendRequest)(method, url, pipeline, { ...options, allowInsecureConnection }, httpClient).then(onFulfilled, onrejected);
+	        },
+	        async asBrowserStream() {
+	            if (checkEnvironment_js_1.isNodeLike) {
+	                throw new Error("`asBrowserStream` is supported only in the browser environment. Use `asNodeStream` instead to obtain the response body stream. If you require a Web stream of the response in Node, consider using `Readable.toWeb` on the result of `asNodeStream`.");
+	            }
+	            else {
+	                return (0, sendRequest_js_1.sendRequest)(method, url, pipeline, { ...options, allowInsecureConnection, responseAsStream: true }, httpClient);
+	            }
+	        },
+	        async asNodeStream() {
+	            if (checkEnvironment_js_1.isNodeLike) {
+	                return (0, sendRequest_js_1.sendRequest)(method, url, pipeline, { ...options, allowInsecureConnection, responseAsStream: true }, httpClient);
+	            }
+	            else {
+	                throw new Error("`isNodeStream` is not supported in the browser environment. Use `asBrowserStream` to obtain the response body stream.");
+	            }
+	        },
+	    };
+	}
+	
+	return getClient;
+}
+
+var operationOptionHelpers = {};
+
+var hasRequiredOperationOptionHelpers;
+
+function requireOperationOptionHelpers () {
+	if (hasRequiredOperationOptionHelpers) return operationOptionHelpers;
+	hasRequiredOperationOptionHelpers = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(operationOptionHelpers, "__esModule", { value: true });
+	operationOptionHelpers.operationOptionsToRequestParameters = operationOptionsToRequestParameters;
+	/**
+	 * Helper function to convert OperationOptions to RequestParameters
+	 * @param options - the options that are used by Modular layer to send the request
+	 * @returns the result of the conversion in RequestParameters of RLC layer
+	 */
+	function operationOptionsToRequestParameters(options) {
+	    return {
+	        allowInsecureConnection: options.requestOptions?.allowInsecureConnection,
+	        timeout: options.requestOptions?.timeout,
+	        skipUrlEncoding: options.requestOptions?.skipUrlEncoding,
+	        abortSignal: options.abortSignal,
+	        onUploadProgress: options.requestOptions?.onUploadProgress,
+	        onDownloadProgress: options.requestOptions?.onDownloadProgress,
+	        headers: { ...options.requestOptions?.headers },
+	        onResponse: options.onResponse,
+	    };
+	}
+	
+	return operationOptionHelpers;
+}
+
+var restError$1 = {};
+
+var hasRequiredRestError$1;
+
+function requireRestError$1 () {
+	if (hasRequiredRestError$1) return restError$1;
+	hasRequiredRestError$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(restError$1, "__esModule", { value: true });
+	restError$1.createRestError = createRestError;
+	const restError_js_1 = requireRestError$2();
+	const httpHeaders_js_1 = requireHttpHeaders$1();
+	function createRestError(messageOrResponse, response) {
+	    const resp = typeof messageOrResponse === "string" ? response : messageOrResponse;
+	    const internalError = resp.body?.error ?? resp.body;
+	    const message = typeof messageOrResponse === "string"
+	        ? messageOrResponse
+	        : (internalError?.message ?? `Unexpected status code: ${resp.status}`);
+	    return new restError_js_1.RestError(message, {
+	        statusCode: statusCodeToNumber(resp.status),
+	        code: internalError?.code,
+	        request: resp.request,
+	        response: toPipelineResponse(resp),
+	    });
+	}
+	function toPipelineResponse(response) {
+	    return {
+	        headers: (0, httpHeaders_js_1.createHttpHeaders)(response.headers),
+	        request: response.request,
+	        status: statusCodeToNumber(response.status) ?? -1,
+	    };
+	}
+	function statusCodeToNumber(statusCode) {
+	    const status = Number.parseInt(statusCode);
+	    return Number.isNaN(status) ? undefined : status;
+	}
+	
+	return restError$1;
+}
+
+var hasRequiredCommonjs$e;
+
+function requireCommonjs$e () {
+	if (hasRequiredCommonjs$e) return commonjs$c;
+	hasRequiredCommonjs$e = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.createRestError = exports$1.operationOptionsToRequestParameters = exports$1.getClient = exports$1.createDefaultHttpClient = exports$1.uint8ArrayToString = exports$1.stringToUint8Array = exports$1.isRestError = exports$1.RestError = exports$1.createEmptyPipeline = exports$1.createPipelineRequest = exports$1.createHttpHeaders = exports$1.TypeSpecRuntimeLogger = exports$1.setLogLevel = exports$1.getLogLevel = exports$1.createClientLogger = exports$1.AbortError = void 0;
+		const tslib_1 = require$$0$2;
+		var AbortError_js_1 = requireAbortError$3();
+		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
+		var logger_js_1 = requireLogger$1();
+		Object.defineProperty(exports$1, "createClientLogger", { enumerable: true, get: function () { return logger_js_1.createClientLogger; } });
+		Object.defineProperty(exports$1, "getLogLevel", { enumerable: true, get: function () { return logger_js_1.getLogLevel; } });
+		Object.defineProperty(exports$1, "setLogLevel", { enumerable: true, get: function () { return logger_js_1.setLogLevel; } });
+		Object.defineProperty(exports$1, "TypeSpecRuntimeLogger", { enumerable: true, get: function () { return logger_js_1.TypeSpecRuntimeLogger; } });
+		var httpHeaders_js_1 = requireHttpHeaders$1();
+		Object.defineProperty(exports$1, "createHttpHeaders", { enumerable: true, get: function () { return httpHeaders_js_1.createHttpHeaders; } });
+		tslib_1.__exportStar(requireSchemes(), exports$1);
+		tslib_1.__exportStar(requireOauth2Flows(), exports$1);
+		var pipelineRequest_js_1 = requirePipelineRequest$1();
+		Object.defineProperty(exports$1, "createPipelineRequest", { enumerable: true, get: function () { return pipelineRequest_js_1.createPipelineRequest; } });
+		var pipeline_js_1 = requirePipeline$3();
+		Object.defineProperty(exports$1, "createEmptyPipeline", { enumerable: true, get: function () { return pipeline_js_1.createEmptyPipeline; } });
+		var restError_js_1 = requireRestError$2();
+		Object.defineProperty(exports$1, "RestError", { enumerable: true, get: function () { return restError_js_1.RestError; } });
+		Object.defineProperty(exports$1, "isRestError", { enumerable: true, get: function () { return restError_js_1.isRestError; } });
+		var bytesEncoding_js_1 = requireBytesEncoding();
+		Object.defineProperty(exports$1, "stringToUint8Array", { enumerable: true, get: function () { return bytesEncoding_js_1.stringToUint8Array; } });
+		Object.defineProperty(exports$1, "uint8ArrayToString", { enumerable: true, get: function () { return bytesEncoding_js_1.uint8ArrayToString; } });
+		var defaultHttpClient_js_1 = requireDefaultHttpClient$1();
+		Object.defineProperty(exports$1, "createDefaultHttpClient", { enumerable: true, get: function () { return defaultHttpClient_js_1.createDefaultHttpClient; } });
+		var getClient_js_1 = requireGetClient();
+		Object.defineProperty(exports$1, "getClient", { enumerable: true, get: function () { return getClient_js_1.getClient; } });
+		var operationOptionHelpers_js_1 = requireOperationOptionHelpers();
+		Object.defineProperty(exports$1, "operationOptionsToRequestParameters", { enumerable: true, get: function () { return operationOptionHelpers_js_1.operationOptionsToRequestParameters; } });
+		var restError_js_2 = requireRestError$1();
+		Object.defineProperty(exports$1, "createRestError", { enumerable: true, get: function () { return restError_js_2.createRestError; } });
+		
+	} (commonjs$c));
+	return commonjs$c;
+}
+
+var hasRequiredPipeline$2;
+
+function requirePipeline$2 () {
+	if (hasRequiredPipeline$2) return pipeline$2;
+	hasRequiredPipeline$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(pipeline$2, "__esModule", { value: true });
+	pipeline$2.createEmptyPipeline = createEmptyPipeline;
+	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
+	/**
+	 * Creates a totally empty pipeline.
+	 * Useful for testing or creating a custom one.
+	 */
+	function createEmptyPipeline() {
+	    return (0, ts_http_runtime_1.createEmptyPipeline)();
+	}
+	
+	return pipeline$2;
+}
+
+var createPipelineFromOptions = {};
+
+var logPolicy = {};
+
+var log$3 = {};
+
+var commonjs$b = {};
+
+var internal$2 = {};
+
+var hasRequiredInternal$2;
+
+function requireInternal$2 () {
+	if (hasRequiredInternal$2) return internal$2;
+	hasRequiredInternal$2 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.createLoggerContext = void 0;
+		var logger_js_1 = requireLogger$1();
+		Object.defineProperty(exports$1, "createLoggerContext", { enumerable: true, get: function () { return logger_js_1.createLoggerContext; } });
+		
+	} (internal$2));
+	return internal$2;
+}
+
+var hasRequiredCommonjs$d;
+
+function requireCommonjs$d () {
+	if (hasRequiredCommonjs$d) return commonjs$b;
+	hasRequiredCommonjs$d = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(commonjs$b, "__esModule", { value: true });
+	commonjs$b.AzureLogger = void 0;
+	commonjs$b.setLogLevel = setLogLevel;
+	commonjs$b.getLogLevel = getLogLevel;
+	commonjs$b.createClientLogger = createClientLogger;
+	const logger_1 = /*@__PURE__*/ requireInternal$2();
+	const context = (0, logger_1.createLoggerContext)({
+	    logLevelEnvVarName: "AZURE_LOG_LEVEL",
+	    namespace: "azure",
+	});
+	/**
+	 * The AzureLogger provides a mechanism for overriding where logs are output to.
+	 * By default, logs are sent to stderr.
+	 * Override the `log` method to redirect logs to another location.
+	 */
+	commonjs$b.AzureLogger = context.logger;
+	/**
+	 * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
+	 * @param level - The log level to enable for logging.
+	 * Options from most verbose to least verbose are:
+	 * - verbose
+	 * - info
+	 * - warning
+	 * - error
+	 */
+	function setLogLevel(level) {
+	    context.setLogLevel(level);
+	}
+	/**
+	 * Retrieves the currently specified log level.
+	 */
+	function getLogLevel() {
+	    return context.getLogLevel();
+	}
+	/**
+	 * Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.
+	 * @param namespace - The name of the SDK package.
+	 * @hidden
+	 */
+	function createClientLogger(namespace) {
+	    return context.createClientLogger(namespace);
+	}
+	
+	return commonjs$b;
+}
+
+var hasRequiredLog$3;
+
+function requireLog$3 () {
+	if (hasRequiredLog$3) return log$3;
+	hasRequiredLog$3 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(log$3, "__esModule", { value: true });
+	log$3.logger = void 0;
+	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
+	log$3.logger = (0, logger_1.createClientLogger)("core-rest-pipeline");
+	
+	return log$3;
+}
+
+var internal$1 = {};
+
+var exponentialRetryPolicy$1 = {};
+
+var hasRequiredExponentialRetryPolicy$1;
+
+function requireExponentialRetryPolicy$1 () {
+	if (hasRequiredExponentialRetryPolicy$1) return exponentialRetryPolicy$1;
+	hasRequiredExponentialRetryPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(exponentialRetryPolicy$1, "__esModule", { value: true });
+	exponentialRetryPolicy$1.exponentialRetryPolicyName = void 0;
+	exponentialRetryPolicy$1.exponentialRetryPolicy = exponentialRetryPolicy;
+	const exponentialRetryStrategy_js_1 = requireExponentialRetryStrategy();
+	const retryPolicy_js_1 = requireRetryPolicy$1();
+	const constants_js_1 = requireConstants$a();
+	/**
+	 * The programmatic identifier of the exponentialRetryPolicy.
+	 */
+	exponentialRetryPolicy$1.exponentialRetryPolicyName = "exponentialRetryPolicy";
+	/**
+	 * A policy that attempts to retry requests while introducing an exponentially increasing delay.
+	 * @param options - Options that configure retry logic.
+	 */
+	function exponentialRetryPolicy(options = {}) {
+	    return (0, retryPolicy_js_1.retryPolicy)([
+	        (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)({
+	            ...options,
+	            ignoreSystemErrors: true,
+	        }),
+	    ], {
+	        maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
+	    });
+	}
+	
+	return exponentialRetryPolicy$1;
+}
+
+var systemErrorRetryPolicy$1 = {};
+
+var hasRequiredSystemErrorRetryPolicy$1;
+
+function requireSystemErrorRetryPolicy$1 () {
+	if (hasRequiredSystemErrorRetryPolicy$1) return systemErrorRetryPolicy$1;
+	hasRequiredSystemErrorRetryPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.systemErrorRetryPolicyName = void 0;
+		exports$1.systemErrorRetryPolicy = systemErrorRetryPolicy;
+		const exponentialRetryStrategy_js_1 = requireExponentialRetryStrategy();
+		const retryPolicy_js_1 = requireRetryPolicy$1();
+		const constants_js_1 = requireConstants$a();
+		/**
+		 * Name of the {@link systemErrorRetryPolicy}
+		 */
+		exports$1.systemErrorRetryPolicyName = "systemErrorRetryPolicy";
+		/**
+		 * A retry policy that specifically seeks to handle errors in the
+		 * underlying transport layer (e.g. DNS lookup failures) rather than
+		 * retryable error codes from the server itself.
+		 * @param options - Options that customize the policy.
+		 */
+		function systemErrorRetryPolicy(options = {}) {
+		    return {
+		        name: exports$1.systemErrorRetryPolicyName,
+		        sendRequest: (0, retryPolicy_js_1.retryPolicy)([
+		            (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)({
+		                ...options,
+		                ignoreHttpStatusCodes: true,
+		            }),
+		        ], {
+		            maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
+		        }).sendRequest,
+		    };
+		}
+		
+	} (systemErrorRetryPolicy$1));
+	return systemErrorRetryPolicy$1;
+}
+
+var throttlingRetryPolicy$1 = {};
+
+var hasRequiredThrottlingRetryPolicy$1;
+
+function requireThrottlingRetryPolicy$1 () {
+	if (hasRequiredThrottlingRetryPolicy$1) return throttlingRetryPolicy$1;
+	hasRequiredThrottlingRetryPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.throttlingRetryPolicyName = void 0;
+		exports$1.throttlingRetryPolicy = throttlingRetryPolicy;
+		const throttlingRetryStrategy_js_1 = requireThrottlingRetryStrategy();
+		const retryPolicy_js_1 = requireRetryPolicy$1();
+		const constants_js_1 = requireConstants$a();
+		/**
+		 * Name of the {@link throttlingRetryPolicy}
+		 */
+		exports$1.throttlingRetryPolicyName = "throttlingRetryPolicy";
+		/**
+		 * A policy that retries when the server sends a 429 response with a Retry-After header.
+		 *
+		 * To learn more, please refer to
+		 * https://learn.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits,
+		 * https://learn.microsoft.com/azure/azure-subscription-service-limits and
+		 * https://learn.microsoft.com/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
+		 *
+		 * @param options - Options that configure retry logic.
+		 */
+		function throttlingRetryPolicy(options = {}) {
+		    return {
+		        name: exports$1.throttlingRetryPolicyName,
+		        sendRequest: (0, retryPolicy_js_1.retryPolicy)([(0, throttlingRetryStrategy_js_1.throttlingRetryStrategy)()], {
+		            maxRetries: options.maxRetries ?? constants_js_1.DEFAULT_RETRY_POLICY_COUNT,
+		        }).sendRequest,
+		    };
+		}
+		
+	} (throttlingRetryPolicy$1));
+	return throttlingRetryPolicy$1;
+}
+
+var hasRequiredInternal$1;
+
+function requireInternal$1 () {
+	if (hasRequiredInternal$1) return internal$1;
+	hasRequiredInternal$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.userAgentPolicyName = exports$1.userAgentPolicy = exports$1.tlsPolicyName = exports$1.tlsPolicy = exports$1.redirectPolicyName = exports$1.redirectPolicy = exports$1.getDefaultProxySettings = exports$1.proxyPolicyName = exports$1.proxyPolicy = exports$1.multipartPolicyName = exports$1.multipartPolicy = exports$1.logPolicyName = exports$1.logPolicy = exports$1.formDataPolicyName = exports$1.formDataPolicy = exports$1.throttlingRetryPolicyName = exports$1.throttlingRetryPolicy = exports$1.systemErrorRetryPolicyName = exports$1.systemErrorRetryPolicy = exports$1.retryPolicy = exports$1.exponentialRetryPolicyName = exports$1.exponentialRetryPolicy = exports$1.defaultRetryPolicyName = exports$1.defaultRetryPolicy = exports$1.decompressResponsePolicyName = exports$1.decompressResponsePolicy = exports$1.agentPolicyName = exports$1.agentPolicy = void 0;
+		var agentPolicy_js_1 = requireAgentPolicy$1();
+		Object.defineProperty(exports$1, "agentPolicy", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicy; } });
+		Object.defineProperty(exports$1, "agentPolicyName", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicyName; } });
+		var decompressResponsePolicy_js_1 = requireDecompressResponsePolicy$1();
+		Object.defineProperty(exports$1, "decompressResponsePolicy", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicy; } });
+		Object.defineProperty(exports$1, "decompressResponsePolicyName", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicyName; } });
+		var defaultRetryPolicy_js_1 = requireDefaultRetryPolicy$1();
+		Object.defineProperty(exports$1, "defaultRetryPolicy", { enumerable: true, get: function () { return defaultRetryPolicy_js_1.defaultRetryPolicy; } });
+		Object.defineProperty(exports$1, "defaultRetryPolicyName", { enumerable: true, get: function () { return defaultRetryPolicy_js_1.defaultRetryPolicyName; } });
+		var exponentialRetryPolicy_js_1 = requireExponentialRetryPolicy$1();
+		Object.defineProperty(exports$1, "exponentialRetryPolicy", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicy; } });
+		Object.defineProperty(exports$1, "exponentialRetryPolicyName", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicyName; } });
+		var retryPolicy_js_1 = requireRetryPolicy$1();
+		Object.defineProperty(exports$1, "retryPolicy", { enumerable: true, get: function () { return retryPolicy_js_1.retryPolicy; } });
+		var systemErrorRetryPolicy_js_1 = requireSystemErrorRetryPolicy$1();
+		Object.defineProperty(exports$1, "systemErrorRetryPolicy", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicy; } });
+		Object.defineProperty(exports$1, "systemErrorRetryPolicyName", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicyName; } });
+		var throttlingRetryPolicy_js_1 = requireThrottlingRetryPolicy$1();
+		Object.defineProperty(exports$1, "throttlingRetryPolicy", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicy; } });
+		Object.defineProperty(exports$1, "throttlingRetryPolicyName", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicyName; } });
+		var formDataPolicy_js_1 = requireFormDataPolicy$1();
+		Object.defineProperty(exports$1, "formDataPolicy", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicy; } });
+		Object.defineProperty(exports$1, "formDataPolicyName", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicyName; } });
+		var logPolicy_js_1 = requireLogPolicy$1();
+		Object.defineProperty(exports$1, "logPolicy", { enumerable: true, get: function () { return logPolicy_js_1.logPolicy; } });
+		Object.defineProperty(exports$1, "logPolicyName", { enumerable: true, get: function () { return logPolicy_js_1.logPolicyName; } });
+		var multipartPolicy_js_1 = requireMultipartPolicy$1();
+		Object.defineProperty(exports$1, "multipartPolicy", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicy; } });
+		Object.defineProperty(exports$1, "multipartPolicyName", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicyName; } });
+		var proxyPolicy_js_1 = requireProxyPolicy$1();
+		Object.defineProperty(exports$1, "proxyPolicy", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicy; } });
+		Object.defineProperty(exports$1, "proxyPolicyName", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicyName; } });
+		Object.defineProperty(exports$1, "getDefaultProxySettings", { enumerable: true, get: function () { return proxyPolicy_js_1.getDefaultProxySettings; } });
+		var redirectPolicy_js_1 = requireRedirectPolicy$1();
+		Object.defineProperty(exports$1, "redirectPolicy", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicy; } });
+		Object.defineProperty(exports$1, "redirectPolicyName", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicyName; } });
+		var tlsPolicy_js_1 = requireTlsPolicy$1();
+		Object.defineProperty(exports$1, "tlsPolicy", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicy; } });
+		Object.defineProperty(exports$1, "tlsPolicyName", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicyName; } });
+		var userAgentPolicy_js_1 = requireUserAgentPolicy$1();
+		Object.defineProperty(exports$1, "userAgentPolicy", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicy; } });
+		Object.defineProperty(exports$1, "userAgentPolicyName", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicyName; } });
+		
+	} (internal$1));
+	return internal$1;
+}
+
+var hasRequiredLogPolicy;
+
+function requireLogPolicy () {
+	if (hasRequiredLogPolicy) return logPolicy;
+	hasRequiredLogPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(logPolicy, "__esModule", { value: true });
+	logPolicy.logPolicyName = void 0;
+	logPolicy.logPolicy = logPolicy$1;
+	const log_js_1 = requireLog$3();
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * The programmatic identifier of the logPolicy.
+	 */
+	logPolicy.logPolicyName = policies_1.logPolicyName;
+	/**
+	 * A policy that logs all requests and responses.
+	 * @param options - Options to configure logPolicy.
+	 */
+	function logPolicy$1(options = {}) {
+	    return (0, policies_1.logPolicy)({
+	        logger: log_js_1.logger.info,
+	        ...options,
+	    });
+	}
+	
+	return logPolicy;
+}
+
+var redirectPolicy = {};
+
+var hasRequiredRedirectPolicy;
+
+function requireRedirectPolicy () {
+	if (hasRequiredRedirectPolicy) return redirectPolicy;
+	hasRequiredRedirectPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(redirectPolicy, "__esModule", { value: true });
+	redirectPolicy.redirectPolicyName = void 0;
+	redirectPolicy.redirectPolicy = redirectPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * The programmatic identifier of the redirectPolicy.
+	 */
+	redirectPolicy.redirectPolicyName = policies_1.redirectPolicyName;
+	/**
+	 * A policy to follow Location headers from the server in order
+	 * to support server-side redirection.
+	 * In the browser, this policy is not used.
+	 * @param options - Options to control policy behavior.
+	 */
+	function redirectPolicy$1(options = {}) {
+	    return (0, policies_1.redirectPolicy)(options);
+	}
+	
+	return redirectPolicy;
+}
+
+var userAgentPolicy = {};
+
+var userAgent$2 = {};
+
+var userAgentPlatform = {};
+
+var hasRequiredUserAgentPlatform;
+
+function requireUserAgentPlatform () {
+	if (hasRequiredUserAgentPlatform) return userAgentPlatform;
+	hasRequiredUserAgentPlatform = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(userAgentPlatform, "__esModule", { value: true });
+	userAgentPlatform.getHeaderName = getHeaderName;
+	userAgentPlatform.setPlatformSpecificData = setPlatformSpecificData;
+	const tslib_1 = require$$0$2;
+	const node_os_1 = tslib_1.__importDefault(require$$1$8);
+	const node_process_1 = tslib_1.__importDefault(require$$2$3);
+	/**
+	 * @internal
+	 */
+	function getHeaderName() {
+	    return "User-Agent";
+	}
+	/**
+	 * @internal
+	 */
+	async function setPlatformSpecificData(map) {
+	    if (node_process_1.default && node_process_1.default.versions) {
+	        const osInfo = `${node_os_1.default.type()} ${node_os_1.default.release()}; ${node_os_1.default.arch()}`;
+	        const versions = node_process_1.default.versions;
+	        if (versions.bun) {
+	            map.set("Bun", `${versions.bun} (${osInfo})`);
+	        }
+	        else if (versions.deno) {
+	            map.set("Deno", `${versions.deno} (${osInfo})`);
+	        }
+	        else if (versions.node) {
+	            map.set("Node", `${versions.node} (${osInfo})`);
+	        }
+	    }
+	}
+	
+	return userAgentPlatform;
+}
+
+var constants$9 = {};
+
+var hasRequiredConstants$9;
+
+function requireConstants$9 () {
+	if (hasRequiredConstants$9) return constants$9;
+	hasRequiredConstants$9 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(constants$9, "__esModule", { value: true });
+	constants$9.DEFAULT_RETRY_POLICY_COUNT = constants$9.SDK_VERSION = void 0;
+	constants$9.SDK_VERSION = "1.22.2";
+	constants$9.DEFAULT_RETRY_POLICY_COUNT = 3;
+	
+	return constants$9;
+}
+
+var hasRequiredUserAgent$1;
+
+function requireUserAgent$1 () {
+	if (hasRequiredUserAgent$1) return userAgent$2;
+	hasRequiredUserAgent$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(userAgent$2, "__esModule", { value: true });
+	userAgent$2.getUserAgentHeaderName = getUserAgentHeaderName;
+	userAgent$2.getUserAgentValue = getUserAgentValue;
+	const userAgentPlatform_js_1 = requireUserAgentPlatform();
+	const constants_js_1 = requireConstants$9();
+	function getUserAgentString(telemetryInfo) {
+	    const parts = [];
+	    for (const [key, value] of telemetryInfo) {
+	        const token = value ? `${key}/${value}` : key;
+	        parts.push(token);
+	    }
+	    return parts.join(" ");
+	}
+	/**
+	 * @internal
+	 */
+	function getUserAgentHeaderName() {
+	    return (0, userAgentPlatform_js_1.getHeaderName)();
+	}
+	/**
+	 * @internal
+	 */
+	async function getUserAgentValue(prefix) {
+	    const runtimeInfo = new Map();
+	    runtimeInfo.set("core-rest-pipeline", constants_js_1.SDK_VERSION);
+	    await (0, userAgentPlatform_js_1.setPlatformSpecificData)(runtimeInfo);
+	    const defaultAgent = getUserAgentString(runtimeInfo);
+	    const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
+	    return userAgentValue;
+	}
+	
+	return userAgent$2;
+}
+
+var hasRequiredUserAgentPolicy;
+
+function requireUserAgentPolicy () {
+	if (hasRequiredUserAgentPolicy) return userAgentPolicy;
+	hasRequiredUserAgentPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.userAgentPolicyName = void 0;
+		exports$1.userAgentPolicy = userAgentPolicy;
+		const userAgent_js_1 = requireUserAgent$1();
+		const UserAgentHeaderName = (0, userAgent_js_1.getUserAgentHeaderName)();
+		/**
+		 * The programmatic identifier of the userAgentPolicy.
+		 */
+		exports$1.userAgentPolicyName = "userAgentPolicy";
+		/**
+		 * A policy that sets the User-Agent header (or equivalent) to reflect
+		 * the library version.
+		 * @param options - Options to customize the user agent value.
+		 */
+		function userAgentPolicy(options = {}) {
+		    const userAgentValue = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix);
+		    return {
+		        name: exports$1.userAgentPolicyName,
+		        async sendRequest(request, next) {
+		            if (!request.headers.has(UserAgentHeaderName)) {
+		                request.headers.set(UserAgentHeaderName, await userAgentValue);
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (userAgentPolicy));
+	return userAgentPolicy;
+}
+
+var multipartPolicy = {};
+
+var file$1 = {};
+
+var commonjs$a = {};
+
+var internal = {};
+
+var sha256 = {};
+
+var hasRequiredSha256;
+
+function requireSha256 () {
+	if (hasRequiredSha256) return sha256;
+	hasRequiredSha256 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(sha256, "__esModule", { value: true });
+	sha256.computeSha256Hmac = computeSha256Hmac;
+	sha256.computeSha256Hash = computeSha256Hash;
+	const node_crypto_1 = require$$0$d;
+	/**
+	 * Generates a SHA-256 HMAC signature.
+	 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
+	 * @param stringToSign - The data to be signed.
+	 * @param encoding - The textual encoding to use for the returned HMAC digest.
+	 */
+	async function computeSha256Hmac(key, stringToSign, encoding) {
+	    const decodedKey = Buffer.from(key, "base64");
+	    return (0, node_crypto_1.createHmac)("sha256", decodedKey).update(stringToSign).digest(encoding);
+	}
+	/**
+	 * Generates a SHA-256 hash.
+	 * @param content - The data to be included in the hash.
+	 * @param encoding - The textual encoding to use for the returned hash.
+	 */
+	async function computeSha256Hash(content, encoding) {
+	    return (0, node_crypto_1.createHash)("sha256").update(content).digest(encoding);
+	}
+	
+	return sha256;
+}
+
+var hasRequiredInternal;
+
+function requireInternal () {
+	if (hasRequiredInternal) return internal;
+	hasRequiredInternal = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.Sanitizer = exports$1.uint8ArrayToString = exports$1.stringToUint8Array = exports$1.isWebWorker = exports$1.isReactNative = exports$1.isDeno = exports$1.isNodeRuntime = exports$1.isNodeLike = exports$1.isBun = exports$1.isBrowser = exports$1.randomUUID = exports$1.computeSha256Hmac = exports$1.computeSha256Hash = exports$1.isError = exports$1.isObject = exports$1.getRandomIntegerInclusive = exports$1.calculateRetryDelay = void 0;
+		var delay_js_1 = requireDelay$1();
+		Object.defineProperty(exports$1, "calculateRetryDelay", { enumerable: true, get: function () { return delay_js_1.calculateRetryDelay; } });
+		var random_js_1 = requireRandom();
+		Object.defineProperty(exports$1, "getRandomIntegerInclusive", { enumerable: true, get: function () { return random_js_1.getRandomIntegerInclusive; } });
+		var object_js_1 = requireObject();
+		Object.defineProperty(exports$1, "isObject", { enumerable: true, get: function () { return object_js_1.isObject; } });
+		var error_js_1 = requireError$1();
+		Object.defineProperty(exports$1, "isError", { enumerable: true, get: function () { return error_js_1.isError; } });
+		var sha256_js_1 = requireSha256();
+		Object.defineProperty(exports$1, "computeSha256Hash", { enumerable: true, get: function () { return sha256_js_1.computeSha256Hash; } });
+		Object.defineProperty(exports$1, "computeSha256Hmac", { enumerable: true, get: function () { return sha256_js_1.computeSha256Hmac; } });
+		var uuidUtils_js_1 = requireUuidUtils();
+		Object.defineProperty(exports$1, "randomUUID", { enumerable: true, get: function () { return uuidUtils_js_1.randomUUID; } });
+		var checkEnvironment_js_1 = requireCheckEnvironment();
+		Object.defineProperty(exports$1, "isBrowser", { enumerable: true, get: function () { return checkEnvironment_js_1.isBrowser; } });
+		Object.defineProperty(exports$1, "isBun", { enumerable: true, get: function () { return checkEnvironment_js_1.isBun; } });
+		Object.defineProperty(exports$1, "isNodeLike", { enumerable: true, get: function () { return checkEnvironment_js_1.isNodeLike; } });
+		Object.defineProperty(exports$1, "isNodeRuntime", { enumerable: true, get: function () { return checkEnvironment_js_1.isNodeRuntime; } });
+		Object.defineProperty(exports$1, "isDeno", { enumerable: true, get: function () { return checkEnvironment_js_1.isDeno; } });
+		Object.defineProperty(exports$1, "isReactNative", { enumerable: true, get: function () { return checkEnvironment_js_1.isReactNative; } });
+		Object.defineProperty(exports$1, "isWebWorker", { enumerable: true, get: function () { return checkEnvironment_js_1.isWebWorker; } });
+		var bytesEncoding_js_1 = requireBytesEncoding();
+		Object.defineProperty(exports$1, "stringToUint8Array", { enumerable: true, get: function () { return bytesEncoding_js_1.stringToUint8Array; } });
+		Object.defineProperty(exports$1, "uint8ArrayToString", { enumerable: true, get: function () { return bytesEncoding_js_1.uint8ArrayToString; } });
+		var sanitizer_js_1 = requireSanitizer();
+		Object.defineProperty(exports$1, "Sanitizer", { enumerable: true, get: function () { return sanitizer_js_1.Sanitizer; } });
+		
+	} (internal));
+	return internal;
+}
+
+var aborterUtils = {};
+
+var hasRequiredAborterUtils;
+
+function requireAborterUtils () {
+	if (hasRequiredAborterUtils) return aborterUtils;
+	hasRequiredAborterUtils = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(aborterUtils, "__esModule", { value: true });
+	aborterUtils.cancelablePromiseRace = cancelablePromiseRace;
+	/**
+	 * promise.race() wrapper that aborts rest of promises as soon as the first promise settles.
+	 */
+	async function cancelablePromiseRace(abortablePromiseBuilders, options) {
+	    const aborter = new AbortController();
+	    function abortHandler() {
+	        aborter.abort();
+	    }
+	    options?.abortSignal?.addEventListener("abort", abortHandler);
+	    try {
+	        return await Promise.race(abortablePromiseBuilders.map((p) => p({ abortSignal: aborter.signal })));
+	    }
+	    finally {
+	        aborter.abort();
+	        options?.abortSignal?.removeEventListener("abort", abortHandler);
+	    }
+	}
+	
+	return aborterUtils;
+}
+
+var createAbortablePromise = {};
+
+var commonjs$9 = {};
+
+var AbortError$3 = {};
+
+var hasRequiredAbortError$2;
+
+function requireAbortError$2 () {
+	if (hasRequiredAbortError$2) return AbortError$3;
+	hasRequiredAbortError$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(AbortError$3, "__esModule", { value: true });
+	AbortError$3.AbortError = void 0;
+	/**
+	 * This error is thrown when an asynchronous operation has been aborted.
+	 * Check for this error by testing the `name` that the name property of the
+	 * error matches `"AbortError"`.
+	 *
+	 * @example
+	 * ```ts
+	 * const controller = new AbortController();
+	 * controller.abort();
+	 * try {
+	 *   doAsyncWork(controller.signal)
+	 * } catch (e) {
+	 *   if (e.name === 'AbortError') {
+	 *     // handle abort error here.
+	 *   }
+	 * }
+	 * ```
+	 */
+	class AbortError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = "AbortError";
+	    }
+	}
+	AbortError$3.AbortError = AbortError;
+	
+	return AbortError$3;
+}
+
+var hasRequiredCommonjs$c;
+
+function requireCommonjs$c () {
+	if (hasRequiredCommonjs$c) return commonjs$9;
+	hasRequiredCommonjs$c = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT license.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.AbortError = void 0;
+		var AbortError_js_1 = requireAbortError$2();
+		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
+		
+	} (commonjs$9));
+	return commonjs$9;
+}
+
+var hasRequiredCreateAbortablePromise;
+
+function requireCreateAbortablePromise () {
+	if (hasRequiredCreateAbortablePromise) return createAbortablePromise;
+	hasRequiredCreateAbortablePromise = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(createAbortablePromise, "__esModule", { value: true });
+	createAbortablePromise.createAbortablePromise = createAbortablePromise$1;
+	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$c();
+	/**
+	 * Creates an abortable promise.
+	 * @param buildPromise - A function that takes the resolve and reject functions as parameters.
+	 * @param options - The options for the abortable promise.
+	 * @returns A promise that can be aborted.
+	 */
+	function createAbortablePromise$1(buildPromise, options) {
+	    const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options ?? {};
+	    return new Promise((resolve, reject) => {
+	        function rejectOnAbort() {
+	            reject(new abort_controller_1.AbortError(abortErrorMsg ?? "The operation was aborted."));
+	        }
+	        function removeListeners() {
+	            abortSignal?.removeEventListener("abort", onAbort);
+	        }
+	        function onAbort() {
+	            cleanupBeforeAbort?.();
+	            removeListeners();
+	            rejectOnAbort();
+	        }
+	        if (abortSignal?.aborted) {
+	            return rejectOnAbort();
+	        }
+	        try {
+	            buildPromise((x) => {
+	                removeListeners();
+	                resolve(x);
+	            }, (x) => {
+	                removeListeners();
+	                reject(x);
+	            });
+	        }
+	        catch (err) {
+	            reject(err);
+	        }
+	        abortSignal?.addEventListener("abort", onAbort);
+	    });
+	}
+	
+	return createAbortablePromise;
+}
+
+var delay$1 = {};
+
+var hasRequiredDelay;
+
+function requireDelay () {
+	if (hasRequiredDelay) return delay$1;
+	hasRequiredDelay = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(delay$1, "__esModule", { value: true });
+	delay$1.delay = delay;
+	delay$1.calculateRetryDelay = calculateRetryDelay;
+	const createAbortablePromise_js_1 = requireCreateAbortablePromise();
+	const util_1 = /*@__PURE__*/ requireInternal();
+	const StandardAbortMessage = "The delay was aborted.";
+	/**
+	 * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.
+	 * @param timeInMs - The number of milliseconds to be delayed.
+	 * @param options - The options for delay - currently abort options
+	 * @returns Promise that is resolved after timeInMs
+	 */
+	function delay(timeInMs, options) {
+	    let token;
+	    const { abortSignal, abortErrorMsg } = options ?? {};
+	    return (0, createAbortablePromise_js_1.createAbortablePromise)((resolve) => {
+	        token = setTimeout(resolve, timeInMs);
+	    }, {
+	        cleanupBeforeAbort: () => clearTimeout(token),
+	        abortSignal,
+	        abortErrorMsg: abortErrorMsg ?? StandardAbortMessage,
+	    });
+	}
+	/**
+	 * Calculates the delay interval for retry attempts using exponential delay with jitter.
+	 * @param retryAttempt - The current retry attempt number.
+	 * @param config - The exponential retry configuration.
+	 * @returns An object containing the calculated retry delay.
+	 */
+	function calculateRetryDelay(retryAttempt, config) {
+	    // Exponentially increase the delay each time
+	    const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt);
+	    // Don't let the delay exceed the maximum
+	    const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay);
+	    // Allow the final value to have some "jitter" (within 50% of the delay size) so
+	    // that retries across multiple clients don't occur simultaneously.
+	    const retryAfterInMs = clampedDelay / 2 + (0, util_1.getRandomIntegerInclusive)(0, clampedDelay / 2);
+	    return { retryAfterInMs };
+	}
+	
+	return delay$1;
+}
+
+var error = {};
+
+var hasRequiredError;
+
+function requireError () {
+	if (hasRequiredError) return error;
+	hasRequiredError = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(error, "__esModule", { value: true });
+	error.getErrorMessage = getErrorMessage;
+	const util_1 = /*@__PURE__*/ requireInternal();
+	/**
+	 * Given what is thought to be an error object, return the message if possible.
+	 * If the message is missing, returns a stringified version of the input.
+	 * @param e - Something thrown from a try block
+	 * @returns The error message or a string of the input
+	 */
+	function getErrorMessage(e) {
+	    if ((0, util_1.isError)(e)) {
+	        return e.message;
+	    }
+	    else {
+	        let stringified;
+	        try {
+	            if (typeof e === "object" && e) {
+	                stringified = JSON.stringify(e);
+	            }
+	            else {
+	                stringified = String(e);
+	            }
+	        }
+	        catch (err) {
+	            stringified = "[unable to stringify input]";
+	        }
+	        return `Unknown error ${stringified}`;
+	    }
+	}
+	
+	return error;
+}
+
+var typeGuards = {};
+
+var hasRequiredTypeGuards;
+
+function requireTypeGuards () {
+	if (hasRequiredTypeGuards) return typeGuards;
+	hasRequiredTypeGuards = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(typeGuards, "__esModule", { value: true });
+	typeGuards.isDefined = isDefined;
+	typeGuards.isObjectWithProperties = isObjectWithProperties;
+	typeGuards.objectHasProperty = objectHasProperty;
+	/**
+	 * Helper TypeGuard that checks if something is defined or not.
+	 * @param thing - Anything
+	 */
+	function isDefined(thing) {
+	    return typeof thing !== "undefined" && thing !== null;
+	}
+	/**
+	 * Helper TypeGuard that checks if the input is an object with the specified properties.
+	 * @param thing - Anything.
+	 * @param properties - The name of the properties that should appear in the object.
+	 */
+	function isObjectWithProperties(thing, properties) {
+	    if (!isDefined(thing) || typeof thing !== "object") {
+	        return false;
+	    }
+	    for (const property of properties) {
+	        if (!objectHasProperty(thing, property)) {
+	            return false;
+	        }
+	    }
+	    return true;
+	}
+	/**
+	 * Helper TypeGuard that checks if the input is an object with the specified property.
+	 * @param thing - Any object.
+	 * @param property - The name of the property that should appear in the object.
+	 */
+	function objectHasProperty(thing, property) {
+	    return (isDefined(thing) && typeof thing === "object" && property in thing);
+	}
+	
+	return typeGuards;
+}
+
+var hasRequiredCommonjs$b;
+
+function requireCommonjs$b () {
+	if (hasRequiredCommonjs$b) return commonjs$a;
+	hasRequiredCommonjs$b = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.isWebWorker = exports$1.isReactNative = exports$1.isNodeRuntime = exports$1.isNodeLike = exports$1.isNode = exports$1.isDeno = exports$1.isBun = exports$1.isBrowser = exports$1.objectHasProperty = exports$1.isObjectWithProperties = exports$1.isDefined = exports$1.getErrorMessage = exports$1.delay = exports$1.createAbortablePromise = exports$1.cancelablePromiseRace = void 0;
+		exports$1.calculateRetryDelay = calculateRetryDelay;
+		exports$1.computeSha256Hash = computeSha256Hash;
+		exports$1.computeSha256Hmac = computeSha256Hmac;
+		exports$1.getRandomIntegerInclusive = getRandomIntegerInclusive;
+		exports$1.isError = isError;
+		exports$1.isObject = isObject;
+		exports$1.randomUUID = randomUUID;
+		exports$1.uint8ArrayToString = uint8ArrayToString;
+		exports$1.stringToUint8Array = stringToUint8Array;
+		const tslib_1 = require$$0$2;
+		const tspRuntime = tslib_1.__importStar(/*@__PURE__*/ requireInternal());
+		var aborterUtils_js_1 = requireAborterUtils();
+		Object.defineProperty(exports$1, "cancelablePromiseRace", { enumerable: true, get: function () { return aborterUtils_js_1.cancelablePromiseRace; } });
+		var createAbortablePromise_js_1 = requireCreateAbortablePromise();
+		Object.defineProperty(exports$1, "createAbortablePromise", { enumerable: true, get: function () { return createAbortablePromise_js_1.createAbortablePromise; } });
+		var delay_js_1 = requireDelay();
+		Object.defineProperty(exports$1, "delay", { enumerable: true, get: function () { return delay_js_1.delay; } });
+		var error_js_1 = requireError();
+		Object.defineProperty(exports$1, "getErrorMessage", { enumerable: true, get: function () { return error_js_1.getErrorMessage; } });
+		var typeGuards_js_1 = requireTypeGuards();
+		Object.defineProperty(exports$1, "isDefined", { enumerable: true, get: function () { return typeGuards_js_1.isDefined; } });
+		Object.defineProperty(exports$1, "isObjectWithProperties", { enumerable: true, get: function () { return typeGuards_js_1.isObjectWithProperties; } });
+		Object.defineProperty(exports$1, "objectHasProperty", { enumerable: true, get: function () { return typeGuards_js_1.objectHasProperty; } });
+		/**
+		 * Calculates the delay interval for retry attempts using exponential delay with jitter.
+		 *
+		 * @param retryAttempt - The current retry attempt number.
+		 *
+		 * @param config - The exponential retry configuration.
+		 *
+		 * @returns An object containing the calculated retry delay.
+		 */
+		function calculateRetryDelay(retryAttempt, config) {
+		    return tspRuntime.calculateRetryDelay(retryAttempt, config);
+		}
+		/**
+		 * Generates a SHA-256 hash.
+		 *
+		 * @param content - The data to be included in the hash.
+		 *
+		 * @param encoding - The textual encoding to use for the returned hash.
+		 */
+		function computeSha256Hash(content, encoding) {
+		    return tspRuntime.computeSha256Hash(content, encoding);
+		}
+		/**
+		 * Generates a SHA-256 HMAC signature.
+		 *
+		 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
+		 *
+		 * @param stringToSign - The data to be signed.
+		 *
+		 * @param encoding - The textual encoding to use for the returned HMAC digest.
+		 */
+		function computeSha256Hmac(key, stringToSign, encoding) {
+		    return tspRuntime.computeSha256Hmac(key, stringToSign, encoding);
+		}
+		/**
+		 * Returns a random integer value between a lower and upper bound, inclusive of both bounds. Note that this uses Math.random and isn't secure. If you need to use this for any kind of security purpose, find a better source of random.
+		 *
+		 * @param min - The smallest integer value allowed.
+		 *
+		 * @param max - The largest integer value allowed.
+		 */
+		function getRandomIntegerInclusive(min, max) {
+		    return tspRuntime.getRandomIntegerInclusive(min, max);
+		}
+		/**
+		 * Typeguard for an error object shape (has name and message)
+		 *
+		 * @param e - Something caught by a catch clause.
+		 */
+		function isError(e) {
+		    return tspRuntime.isError(e);
+		}
+		/**
+		 * Helper to determine when an input is a generic JS object.
+		 *
+		 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
+		 */
+		function isObject(input) {
+		    return tspRuntime.isObject(input);
+		}
+		/**
+		 * Generated Universally Unique Identifier
+		 *
+		 * @returns RFC4122 v4 UUID.
+		 */
+		function randomUUID() {
+		    return tspRuntime.randomUUID();
+		}
+		/**
+		 * A constant that indicates whether the environment the code is running is a Web Browser.
+		 */
+		exports$1.isBrowser = tspRuntime.isBrowser;
+		/**
+		 * A constant that indicates whether the environment the code is running is Bun.sh.
+		 */
+		exports$1.isBun = tspRuntime.isBun;
+		/**
+		 * A constant that indicates whether the environment the code is running is Deno.
+		 */
+		exports$1.isDeno = tspRuntime.isDeno;
+		/**
+		 * A constant that indicates whether the environment the code is running is a Node.js compatible environment.
+		 *
+		 * @deprecated
+		 *
+		 * Use `isNodeLike` instead.
+		 */
+		exports$1.isNode = tspRuntime.isNodeLike;
+		/**
+		 * A constant that indicates whether the environment the code is running is a Node.js compatible environment.
+		 */
+		exports$1.isNodeLike = tspRuntime.isNodeLike;
+		/**
+		 * A constant that indicates whether the environment the code is running is Node.JS.
+		 */
+		exports$1.isNodeRuntime = tspRuntime.isNodeRuntime;
+		/**
+		 * A constant that indicates whether the environment the code is running is in React-Native.
+		 */
+		exports$1.isReactNative = tspRuntime.isReactNative;
+		/**
+		 * A constant that indicates whether the environment the code is running is a Web Worker.
+		 */
+		exports$1.isWebWorker = tspRuntime.isWebWorker;
+		/**
+		 * The helper that transforms bytes with specific character encoding into string
+		 * @param bytes - the uint8array bytes
+		 * @param format - the format we use to encode the byte
+		 * @returns a string of the encoded string
+		 */
+		function uint8ArrayToString(bytes, format) {
+		    return tspRuntime.uint8ArrayToString(bytes, format);
+		}
+		/**
+		 * The helper that transforms string to specific character encoded bytes array.
+		 * @param value - the string to be converted
+		 * @param format - the format we use to decode the value
+		 * @returns a uint8array
+		 */
+		function stringToUint8Array(value, format) {
+		    return tspRuntime.stringToUint8Array(value, format);
+		}
+		
+	} (commonjs$a));
+	return commonjs$a;
+}
+
+var hasRequiredFile$1;
+
+function requireFile$1 () {
+	if (hasRequiredFile$1) return file$1;
+	hasRequiredFile$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(file$1, "__esModule", { value: true });
+	file$1.hasRawContent = hasRawContent;
+	file$1.getRawContent = getRawContent;
+	file$1.createFileFromStream = createFileFromStream;
+	file$1.createFile = createFile;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	function isNodeReadableStream(x) {
+	    return Boolean(x && typeof x["pipe"] === "function");
+	}
+	const unimplementedMethods = {
+	    arrayBuffer: () => {
+	        throw new Error("Not implemented");
+	    },
+	    bytes: () => {
+	        throw new Error("Not implemented");
+	    },
+	    slice: () => {
+	        throw new Error("Not implemented");
+	    },
+	    text: () => {
+	        throw new Error("Not implemented");
+	    },
+	};
+	/**
+	 * Private symbol used as key on objects created using createFile containing the
+	 * original source of the file object.
+	 *
+	 * This is used in Node to access the original Node stream without using Blob#stream, which
+	 * returns a web stream. This is done to avoid a couple of bugs to do with Blob#stream and
+	 * Readable#to/fromWeb in Node versions we support:
+	 * - https://github.com/nodejs/node/issues/42694 (fixed in Node 18.14)
+	 * - https://github.com/nodejs/node/issues/48916 (fixed in Node 20.6)
+	 *
+	 * Once these versions are no longer supported, we may be able to stop doing this.
+	 *
+	 * @internal
+	 */
+	const rawContent = Symbol("rawContent");
+	/**
+	 * Type guard to check if a given object is a blob-like object with a raw content property.
+	 */
+	function hasRawContent(x) {
+	    return typeof x[rawContent] === "function";
+	}
+	/**
+	 * Extract the raw content from a given blob-like object. If the input was created using createFile
+	 * or createFileFromStream, the exact content passed into createFile/createFileFromStream will be used.
+	 * For true instances of Blob and File, returns the actual blob.
+	 *
+	 * @internal
+	 */
+	function getRawContent(blob) {
+	    if (hasRawContent(blob)) {
+	        return blob[rawContent]();
+	    }
+	    else {
+	        return blob;
+	    }
+	}
+	/**
+	 * Create an object that implements the File interface. This object is intended to be
+	 * passed into RequestBodyType.formData, and is not guaranteed to work as expected in
+	 * other situations.
+	 *
+	 * Use this function to:
+	 * - Create a File object for use in RequestBodyType.formData in environments where the
+	 *   global File object is unavailable.
+	 * - Create a File-like object from a readable stream without reading the stream into memory.
+	 *
+	 * @param stream - the content of the file as a callback returning a stream. When a File object made using createFile is
+	 *                  passed in a request's form data map, the stream will not be read into memory
+	 *                  and instead will be streamed when the request is made. In the event of a retry, the
+	 *                  stream needs to be read again, so this callback SHOULD return a fresh stream if possible.
+	 * @param name - the name of the file.
+	 * @param options - optional metadata about the file, e.g. file name, file size, MIME type.
+	 */
+	function createFileFromStream(stream, name, options = {}) {
+	    return {
+	        ...unimplementedMethods,
+	        type: options.type ?? "",
+	        lastModified: options.lastModified ?? new Date().getTime(),
+	        webkitRelativePath: options.webkitRelativePath ?? "",
+	        size: options.size ?? -1,
+	        name,
+	        stream: () => {
+	            const s = stream();
+	            if (isNodeReadableStream(s)) {
+	                throw new Error("Not supported: a Node stream was provided as input to createFileFromStream.");
+	            }
+	            return s;
+	        },
+	        [rawContent]: stream,
+	    };
+	}
+	/**
+	 * Create an object that implements the File interface. This object is intended to be
+	 * passed into RequestBodyType.formData, and is not guaranteed to work as expected in
+	 * other situations.
+	 *
+	 * Use this function create a File object for use in RequestBodyType.formData in environments where the global File object is unavailable.
+	 *
+	 * @param content - the content of the file as a Uint8Array in memory.
+	 * @param name - the name of the file.
+	 * @param options - optional metadata about the file, e.g. file name, file size, MIME type.
+	 */
+	function createFile(content, name, options = {}) {
+	    if (core_util_1.isNodeLike) {
+	        return {
+	            ...unimplementedMethods,
+	            type: options.type ?? "",
+	            lastModified: options.lastModified ?? new Date().getTime(),
+	            webkitRelativePath: options.webkitRelativePath ?? "",
+	            size: content.byteLength,
+	            name,
+	            arrayBuffer: async () => content.buffer,
+	            stream: () => new Blob([toArrayBuffer(content)]).stream(),
+	            [rawContent]: () => content,
+	        };
+	    }
+	    else {
+	        return new File([toArrayBuffer(content)], name, options);
+	    }
+	}
+	function toArrayBuffer(source) {
+	    if ("resize" in source.buffer) {
+	        // ArrayBuffer
+	        return source;
+	    }
+	    // SharedArrayBuffer
+	    return source.map((x) => x);
+	}
+	
+	return file$1;
+}
+
+var hasRequiredMultipartPolicy;
+
+function requireMultipartPolicy () {
+	if (hasRequiredMultipartPolicy) return multipartPolicy;
+	hasRequiredMultipartPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.multipartPolicyName = void 0;
+		exports$1.multipartPolicy = multipartPolicy;
+		const policies_1 = /*@__PURE__*/ requireInternal$1();
+		const file_js_1 = requireFile$1();
+		/**
+		 * Name of multipart policy
+		 */
+		exports$1.multipartPolicyName = policies_1.multipartPolicyName;
+		/**
+		 * Pipeline policy for multipart requests
+		 */
+		function multipartPolicy() {
+		    const tspPolicy = (0, policies_1.multipartPolicy)();
+		    return {
+		        name: exports$1.multipartPolicyName,
+		        sendRequest: async (request, next) => {
+		            if (request.multipartBody) {
+		                for (const part of request.multipartBody.parts) {
+		                    if ((0, file_js_1.hasRawContent)(part.body)) {
+		                        part.body = (0, file_js_1.getRawContent)(part.body);
+		                    }
+		                }
+		            }
+		            return tspPolicy.sendRequest(request, next);
+		        },
+		    };
+		}
+		
+	} (multipartPolicy));
+	return multipartPolicy;
+}
+
+var decompressResponsePolicy = {};
+
+var hasRequiredDecompressResponsePolicy;
+
+function requireDecompressResponsePolicy () {
+	if (hasRequiredDecompressResponsePolicy) return decompressResponsePolicy;
+	hasRequiredDecompressResponsePolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(decompressResponsePolicy, "__esModule", { value: true });
+	decompressResponsePolicy.decompressResponsePolicyName = void 0;
+	decompressResponsePolicy.decompressResponsePolicy = decompressResponsePolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * The programmatic identifier of the decompressResponsePolicy.
+	 */
+	decompressResponsePolicy.decompressResponsePolicyName = policies_1.decompressResponsePolicyName;
+	/**
+	 * A policy to enable response decompression according to Accept-Encoding header
+	 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
+	 */
+	function decompressResponsePolicy$1() {
+	    return (0, policies_1.decompressResponsePolicy)();
+	}
+	
+	return decompressResponsePolicy;
+}
+
+var defaultRetryPolicy = {};
+
+var hasRequiredDefaultRetryPolicy;
+
+function requireDefaultRetryPolicy () {
+	if (hasRequiredDefaultRetryPolicy) return defaultRetryPolicy;
+	hasRequiredDefaultRetryPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(defaultRetryPolicy, "__esModule", { value: true });
+	defaultRetryPolicy.defaultRetryPolicyName = void 0;
+	defaultRetryPolicy.defaultRetryPolicy = defaultRetryPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * Name of the {@link defaultRetryPolicy}
+	 */
+	defaultRetryPolicy.defaultRetryPolicyName = policies_1.defaultRetryPolicyName;
+	/**
+	 * A policy that retries according to three strategies:
+	 * - When the server sends a 429 response with a Retry-After header.
+	 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
+	 * - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
+	 */
+	function defaultRetryPolicy$1(options = {}) {
+	    return (0, policies_1.defaultRetryPolicy)(options);
+	}
+	
+	return defaultRetryPolicy;
+}
+
+var formDataPolicy = {};
+
+var hasRequiredFormDataPolicy;
+
+function requireFormDataPolicy () {
+	if (hasRequiredFormDataPolicy) return formDataPolicy;
+	hasRequiredFormDataPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(formDataPolicy, "__esModule", { value: true });
+	formDataPolicy.formDataPolicyName = void 0;
+	formDataPolicy.formDataPolicy = formDataPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * The programmatic identifier of the formDataPolicy.
+	 */
+	formDataPolicy.formDataPolicyName = policies_1.formDataPolicyName;
+	/**
+	 * A policy that encodes FormData on the request into the body.
+	 */
+	function formDataPolicy$1() {
+	    return (0, policies_1.formDataPolicy)();
+	}
+	
+	return formDataPolicy;
+}
+
+var proxyPolicy = {};
+
+var hasRequiredProxyPolicy;
+
+function requireProxyPolicy () {
+	if (hasRequiredProxyPolicy) return proxyPolicy;
+	hasRequiredProxyPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(proxyPolicy, "__esModule", { value: true });
+	proxyPolicy.proxyPolicyName = void 0;
+	proxyPolicy.getDefaultProxySettings = getDefaultProxySettings;
+	proxyPolicy.proxyPolicy = proxyPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * The programmatic identifier of the proxyPolicy.
+	 */
+	proxyPolicy.proxyPolicyName = policies_1.proxyPolicyName;
+	/**
+	 * This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
+	 * If no argument is given, it attempts to parse a proxy URL from the environment
+	 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
+	 * @param proxyUrl - The url of the proxy to use. May contain authentication information.
+	 * @deprecated - Internally this method is no longer necessary when setting proxy information.
+	 */
+	function getDefaultProxySettings(proxyUrl) {
+	    return (0, policies_1.getDefaultProxySettings)(proxyUrl);
+	}
+	/**
+	 * A policy that allows one to apply proxy settings to all requests.
+	 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
+	 * or HTTP_PROXY environment variables.
+	 * @param proxySettings - ProxySettings to use on each request.
+	 * @param options - additional settings, for example, custom NO_PROXY patterns
+	 */
+	function proxyPolicy$1(proxySettings, options) {
+	    return (0, policies_1.proxyPolicy)(proxySettings, options);
+	}
+	
+	return proxyPolicy;
+}
+
+var setClientRequestIdPolicy = {};
+
+var hasRequiredSetClientRequestIdPolicy;
+
+function requireSetClientRequestIdPolicy () {
+	if (hasRequiredSetClientRequestIdPolicy) return setClientRequestIdPolicy;
+	hasRequiredSetClientRequestIdPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.setClientRequestIdPolicyName = void 0;
+		exports$1.setClientRequestIdPolicy = setClientRequestIdPolicy;
+		/**
+		 * The programmatic identifier of the setClientRequestIdPolicy.
+		 */
+		exports$1.setClientRequestIdPolicyName = "setClientRequestIdPolicy";
+		/**
+		 * Each PipelineRequest gets a unique id upon creation.
+		 * This policy passes that unique id along via an HTTP header to enable better
+		 * telemetry and tracing.
+		 * @param requestIdHeaderName - The name of the header to pass the request ID to.
+		 */
+		function setClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
+		    return {
+		        name: exports$1.setClientRequestIdPolicyName,
+		        async sendRequest(request, next) {
+		            if (!request.headers.has(requestIdHeaderName)) {
+		                request.headers.set(requestIdHeaderName, request.requestId);
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (setClientRequestIdPolicy));
+	return setClientRequestIdPolicy;
+}
+
+var agentPolicy = {};
+
+var hasRequiredAgentPolicy;
+
+function requireAgentPolicy () {
+	if (hasRequiredAgentPolicy) return agentPolicy;
+	hasRequiredAgentPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(agentPolicy, "__esModule", { value: true });
+	agentPolicy.agentPolicyName = void 0;
+	agentPolicy.agentPolicy = agentPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * Name of the Agent Policy
+	 */
+	agentPolicy.agentPolicyName = policies_1.agentPolicyName;
+	/**
+	 * Gets a pipeline policy that sets http.agent
+	 */
+	function agentPolicy$1(agent) {
+	    return (0, policies_1.agentPolicy)(agent);
+	}
+	
+	return agentPolicy;
+}
+
+var tlsPolicy = {};
+
+var hasRequiredTlsPolicy;
+
+function requireTlsPolicy () {
+	if (hasRequiredTlsPolicy) return tlsPolicy;
+	hasRequiredTlsPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(tlsPolicy, "__esModule", { value: true });
+	tlsPolicy.tlsPolicyName = void 0;
+	tlsPolicy.tlsPolicy = tlsPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * Name of the TLS Policy
+	 */
+	tlsPolicy.tlsPolicyName = policies_1.tlsPolicyName;
+	/**
+	 * Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
+	 */
+	function tlsPolicy$1(tlsSettings) {
+	    return (0, policies_1.tlsPolicy)(tlsSettings);
+	}
+	
+	return tlsPolicy;
+}
+
+var tracingPolicy = {};
+
+var commonjs$8 = {};
+
+var instrumenter = {};
+
+var tracingContext = {};
+
+var hasRequiredTracingContext;
+
+function requireTracingContext () {
+	if (hasRequiredTracingContext) return tracingContext;
+	hasRequiredTracingContext = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.TracingContextImpl = exports$1.knownContextKeys = void 0;
+		exports$1.createTracingContext = createTracingContext;
+		/** @internal */
+		exports$1.knownContextKeys = {
+		    span: Symbol.for("@azure/core-tracing span"),
+		    namespace: Symbol.for("@azure/core-tracing namespace"),
+		};
+		/**
+		 * Creates a new {@link TracingContext} with the given options.
+		 * @param options - A set of known keys that may be set on the context.
+		 * @returns A new {@link TracingContext} with the given options.
+		 *
+		 * @internal
+		 */
+		function createTracingContext(options = {}) {
+		    let context = new TracingContextImpl(options.parentContext);
+		    if (options.span) {
+		        context = context.setValue(exports$1.knownContextKeys.span, options.span);
+		    }
+		    if (options.namespace) {
+		        context = context.setValue(exports$1.knownContextKeys.namespace, options.namespace);
+		    }
+		    return context;
+		}
+		/** @internal */
+		class TracingContextImpl {
+		    _contextMap;
+		    constructor(initialContext) {
+		        this._contextMap =
+		            initialContext instanceof TracingContextImpl
+		                ? new Map(initialContext._contextMap)
+		                : new Map();
+		    }
+		    setValue(key, value) {
+		        const newContext = new TracingContextImpl(this);
+		        newContext._contextMap.set(key, value);
+		        return newContext;
+		    }
+		    getValue(key) {
+		        return this._contextMap.get(key);
+		    }
+		    deleteValue(key) {
+		        const newContext = new TracingContextImpl(this);
+		        newContext._contextMap.delete(key);
+		        return newContext;
+		    }
+		}
+		exports$1.TracingContextImpl = TracingContextImpl;
+		
+	} (tracingContext));
+	return tracingContext;
+}
+
+var state$1 = {};
+
+var hasRequiredState$1;
+
+function requireState$1 () {
+	if (hasRequiredState$1) return state$1;
+	hasRequiredState$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(state$1, "__esModule", { value: true });
+	state$1.state = void 0;
+	/**
+	 * @internal
+	 *
+	 * Holds the singleton instrumenter, to be shared across CJS and ESM imports.
+	 */
+	state$1.state = {
+	    instrumenterImplementation: undefined,
+	};
+	
+	return state$1;
+}
+
+var hasRequiredInstrumenter;
+
+function requireInstrumenter () {
+	if (hasRequiredInstrumenter) return instrumenter;
+	hasRequiredInstrumenter = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(instrumenter, "__esModule", { value: true });
+	instrumenter.createDefaultTracingSpan = createDefaultTracingSpan;
+	instrumenter.createDefaultInstrumenter = createDefaultInstrumenter;
+	instrumenter.useInstrumenter = useInstrumenter;
+	instrumenter.getInstrumenter = getInstrumenter;
+	const tracingContext_js_1 = requireTracingContext();
+	const state_js_1 = requireState$1();
+	function createDefaultTracingSpan() {
+	    return {
+	        end: () => {
+	            // noop
+	        },
+	        isRecording: () => false,
+	        recordException: () => {
+	            // noop
+	        },
+	        setAttribute: () => {
+	            // noop
+	        },
+	        setStatus: () => {
+	            // noop
+	        },
+	        addEvent: () => {
+	            // noop
+	        },
+	    };
+	}
+	function createDefaultInstrumenter() {
+	    return {
+	        createRequestHeaders: () => {
+	            return {};
+	        },
+	        parseTraceparentHeader: () => {
+	            return undefined;
+	        },
+	        startSpan: (_name, spanOptions) => {
+	            return {
+	                span: createDefaultTracingSpan(),
+	                tracingContext: (0, tracingContext_js_1.createTracingContext)({ parentContext: spanOptions.tracingContext }),
+	            };
+	        },
+	        withContext(_context, callback, ...callbackArgs) {
+	            return callback(...callbackArgs);
+	        },
+	    };
+	}
+	/**
+	 * Extends the Azure SDK with support for a given instrumenter implementation.
+	 *
+	 * @param instrumenter - The instrumenter implementation to use.
+	 */
+	function useInstrumenter(instrumenter) {
+	    state_js_1.state.instrumenterImplementation = instrumenter;
+	}
+	/**
+	 * Gets the currently set instrumenter, a No-Op instrumenter by default.
+	 *
+	 * @returns The currently set instrumenter
+	 */
+	function getInstrumenter() {
+	    if (!state_js_1.state.instrumenterImplementation) {
+	        state_js_1.state.instrumenterImplementation = createDefaultInstrumenter();
+	    }
+	    return state_js_1.state.instrumenterImplementation;
+	}
+	
+	return instrumenter;
+}
+
+var tracingClient = {};
+
+var hasRequiredTracingClient;
+
+function requireTracingClient () {
+	if (hasRequiredTracingClient) return tracingClient;
+	hasRequiredTracingClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(tracingClient, "__esModule", { value: true });
+	tracingClient.createTracingClient = createTracingClient;
+	const instrumenter_js_1 = requireInstrumenter();
+	const tracingContext_js_1 = requireTracingContext();
+	/**
+	 * Creates a new tracing client.
+	 *
+	 * @param options - Options used to configure the tracing client.
+	 * @returns - An instance of {@link TracingClient}.
+	 */
+	function createTracingClient(options) {
+	    const { namespace, packageName, packageVersion } = options;
+	    function startSpan(name, operationOptions, spanOptions) {
+	        const startSpanResult = (0, instrumenter_js_1.getInstrumenter)().startSpan(name, {
+	            ...spanOptions,
+	            packageName: packageName,
+	            packageVersion: packageVersion,
+	            tracingContext: operationOptions?.tracingOptions?.tracingContext,
+	        });
+	        let tracingContext = startSpanResult.tracingContext;
+	        const span = startSpanResult.span;
+	        if (!tracingContext.getValue(tracingContext_js_1.knownContextKeys.namespace)) {
+	            tracingContext = tracingContext.setValue(tracingContext_js_1.knownContextKeys.namespace, namespace);
+	        }
+	        span.setAttribute("az.namespace", tracingContext.getValue(tracingContext_js_1.knownContextKeys.namespace));
+	        const updatedOptions = Object.assign({}, operationOptions, {
+	            tracingOptions: { ...operationOptions?.tracingOptions, tracingContext },
+	        });
+	        return {
+	            span,
+	            updatedOptions,
+	        };
+	    }
+	    async function withSpan(name, operationOptions, callback, spanOptions) {
+	        const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions);
+	        try {
+	            const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => Promise.resolve(callback(updatedOptions, span)));
+	            span.setStatus({ status: "success" });
+	            return result;
+	        }
+	        catch (err) {
+	            span.setStatus({ status: "error", error: err });
+	            throw err;
+	        }
+	        finally {
+	            span.end();
+	        }
+	    }
+	    function withContext(context, callback, ...callbackArgs) {
+	        return (0, instrumenter_js_1.getInstrumenter)().withContext(context, callback, ...callbackArgs);
+	    }
+	    /**
+	     * Parses a traceparent header value into a span identifier.
+	     *
+	     * @param traceparentHeader - The traceparent header to parse.
+	     * @returns An implementation-specific identifier for the span.
+	     */
+	    function parseTraceparentHeader(traceparentHeader) {
+	        return (0, instrumenter_js_1.getInstrumenter)().parseTraceparentHeader(traceparentHeader);
+	    }
+	    /**
+	     * Creates a set of request headers to propagate tracing information to a backend.
+	     *
+	     * @param tracingContext - The context containing the span to serialize.
+	     * @returns The set of headers to add to a request.
+	     */
+	    function createRequestHeaders(tracingContext) {
+	        return (0, instrumenter_js_1.getInstrumenter)().createRequestHeaders(tracingContext);
+	    }
+	    return {
+	        startSpan,
+	        withSpan,
+	        withContext,
+	        parseTraceparentHeader,
+	        createRequestHeaders,
+	    };
+	}
+	
+	return tracingClient;
+}
+
+var hasRequiredCommonjs$a;
+
+function requireCommonjs$a () {
+	if (hasRequiredCommonjs$a) return commonjs$8;
+	hasRequiredCommonjs$a = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.createTracingClient = exports$1.useInstrumenter = void 0;
+		var instrumenter_js_1 = requireInstrumenter();
+		Object.defineProperty(exports$1, "useInstrumenter", { enumerable: true, get: function () { return instrumenter_js_1.useInstrumenter; } });
+		var tracingClient_js_1 = requireTracingClient();
+		Object.defineProperty(exports$1, "createTracingClient", { enumerable: true, get: function () { return tracingClient_js_1.createTracingClient; } });
+		
+	} (commonjs$8));
+	return commonjs$8;
+}
+
+var restError = {};
+
+var hasRequiredRestError;
+
+function requireRestError () {
+	if (hasRequiredRestError) return restError;
+	hasRequiredRestError = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(restError, "__esModule", { value: true });
+	restError.RestError = void 0;
+	restError.isRestError = isRestError;
+	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
+	/**
+	 * A custom error type for failed pipeline requests.
+	 */
+	// eslint-disable-next-line @typescript-eslint/no-redeclare
+	restError.RestError = ts_http_runtime_1.RestError;
+	/**
+	 * Typeguard for RestError
+	 * @param e - Something caught by a catch clause.
+	 */
+	function isRestError(e) {
+	    return (0, ts_http_runtime_1.isRestError)(e);
+	}
+	
+	return restError;
+}
+
+var hasRequiredTracingPolicy;
+
+function requireTracingPolicy () {
+	if (hasRequiredTracingPolicy) return tracingPolicy;
+	hasRequiredTracingPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.tracingPolicyName = void 0;
+		exports$1.tracingPolicy = tracingPolicy;
+		const core_tracing_1 = /*@__PURE__*/ requireCommonjs$a();
+		const constants_js_1 = requireConstants$9();
+		const userAgent_js_1 = requireUserAgent$1();
+		const log_js_1 = requireLog$3();
+		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+		const restError_js_1 = requireRestError();
+		const util_1 = /*@__PURE__*/ requireInternal();
+		/**
+		 * The programmatic identifier of the tracingPolicy.
+		 */
+		exports$1.tracingPolicyName = "tracingPolicy";
+		/**
+		 * A simple policy to create OpenTelemetry Spans for each request made by the pipeline
+		 * that has SpanOptions with a parent.
+		 * Requests made without a parent Span will not be recorded.
+		 * @param options - Options to configure the telemetry logged by the tracing policy.
+		 */
+		function tracingPolicy(options = {}) {
+		    const userAgentPromise = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix);
+		    const sanitizer = new util_1.Sanitizer({
+		        additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
+		    });
+		    const tracingClient = tryCreateTracingClient();
+		    return {
+		        name: exports$1.tracingPolicyName,
+		        async sendRequest(request, next) {
+		            if (!tracingClient) {
+		                return next(request);
+		            }
+		            const userAgent = await userAgentPromise;
+		            const spanAttributes = {
+		                "http.url": sanitizer.sanitizeUrl(request.url),
+		                "http.method": request.method,
+		                "http.user_agent": userAgent,
+		                requestId: request.requestId,
+		            };
+		            if (userAgent) {
+		                spanAttributes["http.user_agent"] = userAgent;
+		            }
+		            const { span, tracingContext } = tryCreateSpan(tracingClient, request, spanAttributes) ?? {};
+		            if (!span || !tracingContext) {
+		                return next(request);
+		            }
+		            try {
+		                const response = await tracingClient.withContext(tracingContext, next, request);
+		                tryProcessResponse(span, response);
+		                return response;
+		            }
+		            catch (err) {
+		                tryProcessError(span, err);
+		                throw err;
+		            }
+		        },
+		    };
+		}
+		function tryCreateTracingClient() {
+		    try {
+		        return (0, core_tracing_1.createTracingClient)({
+		            namespace: "",
+		            packageName: "@azure/core-rest-pipeline",
+		            packageVersion: constants_js_1.SDK_VERSION,
+		        });
+		    }
+		    catch (e) {
+		        log_js_1.logger.warning(`Error when creating the TracingClient: ${(0, core_util_1.getErrorMessage)(e)}`);
+		        return undefined;
+		    }
+		}
+		function tryCreateSpan(tracingClient, request, spanAttributes) {
+		    try {
+		        // As per spec, we do not need to differentiate between HTTP and HTTPS in span name.
+		        const { span, updatedOptions } = tracingClient.startSpan(`HTTP ${request.method}`, { tracingOptions: request.tracingOptions }, {
+		            spanKind: "client",
+		            spanAttributes,
+		        });
+		        // If the span is not recording, don't do any more work.
+		        if (!span.isRecording()) {
+		            span.end();
+		            return undefined;
+		        }
+		        // set headers
+		        const headers = tracingClient.createRequestHeaders(updatedOptions.tracingOptions.tracingContext);
+		        for (const [key, value] of Object.entries(headers)) {
+		            request.headers.set(key, value);
+		        }
+		        return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };
+		    }
+		    catch (e) {
+		        log_js_1.logger.warning(`Skipping creating a tracing span due to an error: ${(0, core_util_1.getErrorMessage)(e)}`);
+		        return undefined;
+		    }
+		}
+		function tryProcessError(span, error) {
+		    try {
+		        span.setStatus({
+		            status: "error",
+		            error: (0, core_util_1.isError)(error) ? error : undefined,
+		        });
+		        if ((0, restError_js_1.isRestError)(error) && error.statusCode) {
+		            span.setAttribute("http.status_code", error.statusCode);
+		        }
+		        span.end();
+		    }
+		    catch (e) {
+		        log_js_1.logger.warning(`Skipping tracing span processing due to an error: ${(0, core_util_1.getErrorMessage)(e)}`);
+		    }
+		}
+		function tryProcessResponse(span, response) {
+		    try {
+		        span.setAttribute("http.status_code", response.status);
+		        const serviceRequestId = response.headers.get("x-ms-request-id");
+		        if (serviceRequestId) {
+		            span.setAttribute("serviceRequestId", serviceRequestId);
+		        }
+		        // Per semantic conventions, only set the status to error if the status code is 4xx or 5xx.
+		        // Otherwise, the status MUST remain unset.
+		        // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
+		        if (response.status >= 400) {
+		            span.setStatus({
+		                status: "error",
+		            });
+		        }
+		        span.end();
+		    }
+		    catch (e) {
+		        log_js_1.logger.warning(`Skipping tracing span processing due to an error: ${(0, core_util_1.getErrorMessage)(e)}`);
+		    }
+		}
+		
+	} (tracingPolicy));
+	return tracingPolicy;
+}
+
+var wrapAbortSignalLikePolicy = {};
+
+var wrapAbortSignal = {};
+
+var hasRequiredWrapAbortSignal;
+
+function requireWrapAbortSignal () {
+	if (hasRequiredWrapAbortSignal) return wrapAbortSignal;
+	hasRequiredWrapAbortSignal = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(wrapAbortSignal, "__esModule", { value: true });
+	wrapAbortSignal.wrapAbortSignalLike = wrapAbortSignalLike;
+	/**
+	 * Creates a native AbortSignal which reflects the state of the provided AbortSignalLike.
+	 * If the AbortSignalLike is already a native AbortSignal, it is returned as is.
+	 * @param abortSignalLike - The AbortSignalLike to wrap.
+	 * @returns - An object containing the native AbortSignal and an optional cleanup function. The cleanup function should be called when the AbortSignal is no longer needed.
+	 */
+	function wrapAbortSignalLike(abortSignalLike) {
+	    if (abortSignalLike instanceof AbortSignal) {
+	        return { abortSignal: abortSignalLike };
+	    }
+	    if (abortSignalLike.aborted) {
+	        return { abortSignal: AbortSignal.abort(abortSignalLike.reason) };
+	    }
+	    const controller = new AbortController();
+	    let needsCleanup = true;
+	    function cleanup() {
+	        if (needsCleanup) {
+	            abortSignalLike.removeEventListener("abort", listener);
+	            needsCleanup = false;
+	        }
+	    }
+	    function listener() {
+	        controller.abort(abortSignalLike.reason);
+	        cleanup();
+	    }
+	    abortSignalLike.addEventListener("abort", listener);
+	    return { abortSignal: controller.signal, cleanup };
+	}
+	
+	return wrapAbortSignal;
+}
+
+var hasRequiredWrapAbortSignalLikePolicy;
+
+function requireWrapAbortSignalLikePolicy () {
+	if (hasRequiredWrapAbortSignalLikePolicy) return wrapAbortSignalLikePolicy;
+	hasRequiredWrapAbortSignalLikePolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.wrapAbortSignalLikePolicyName = void 0;
+		exports$1.wrapAbortSignalLikePolicy = wrapAbortSignalLikePolicy;
+		const wrapAbortSignal_js_1 = requireWrapAbortSignal();
+		exports$1.wrapAbortSignalLikePolicyName = "wrapAbortSignalLikePolicy";
+		/**
+		 * Policy that ensure that any AbortSignalLike is wrapped in a native AbortSignal for processing by the pipeline.
+		 * Since the ts-http-runtime expects a native AbortSignal, this policy is used to ensure that any AbortSignalLike is wrapped in a native AbortSignal.
+		 *
+		 * @returns - created policy
+		 */
+		function wrapAbortSignalLikePolicy() {
+		    return {
+		        name: exports$1.wrapAbortSignalLikePolicyName,
+		        sendRequest: async (request, next) => {
+		            if (!request.abortSignal) {
+		                return next(request);
+		            }
+		            const { abortSignal, cleanup } = (0, wrapAbortSignal_js_1.wrapAbortSignalLike)(request.abortSignal);
+		            request.abortSignal = abortSignal;
+		            try {
+		                return await next(request);
+		            }
+		            finally {
+		                cleanup?.();
+		            }
+		        },
+		    };
+		}
+		
+	} (wrapAbortSignalLikePolicy));
+	return wrapAbortSignalLikePolicy;
+}
+
+var hasRequiredCreatePipelineFromOptions;
+
+function requireCreatePipelineFromOptions () {
+	if (hasRequiredCreatePipelineFromOptions) return createPipelineFromOptions;
+	hasRequiredCreatePipelineFromOptions = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(createPipelineFromOptions, "__esModule", { value: true });
+	createPipelineFromOptions.createPipelineFromOptions = createPipelineFromOptions$1;
+	const logPolicy_js_1 = requireLogPolicy();
+	const pipeline_js_1 = requirePipeline$2();
+	const redirectPolicy_js_1 = requireRedirectPolicy();
+	const userAgentPolicy_js_1 = requireUserAgentPolicy();
+	const multipartPolicy_js_1 = requireMultipartPolicy();
+	const decompressResponsePolicy_js_1 = requireDecompressResponsePolicy();
+	const defaultRetryPolicy_js_1 = requireDefaultRetryPolicy();
+	const formDataPolicy_js_1 = requireFormDataPolicy();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const proxyPolicy_js_1 = requireProxyPolicy();
+	const setClientRequestIdPolicy_js_1 = requireSetClientRequestIdPolicy();
+	const agentPolicy_js_1 = requireAgentPolicy();
+	const tlsPolicy_js_1 = requireTlsPolicy();
+	const tracingPolicy_js_1 = requireTracingPolicy();
+	const wrapAbortSignalLikePolicy_js_1 = requireWrapAbortSignalLikePolicy();
+	/**
+	 * Create a new pipeline with a default set of customizable policies.
+	 * @param options - Options to configure a custom pipeline.
+	 */
+	function createPipelineFromOptions$1(options) {
+	    const pipeline = (0, pipeline_js_1.createEmptyPipeline)();
+	    if (core_util_1.isNodeLike) {
+	        if (options.agent) {
+	            pipeline.addPolicy((0, agentPolicy_js_1.agentPolicy)(options.agent));
+	        }
+	        if (options.tlsOptions) {
+	            pipeline.addPolicy((0, tlsPolicy_js_1.tlsPolicy)(options.tlsOptions));
+	        }
+	        pipeline.addPolicy((0, proxyPolicy_js_1.proxyPolicy)(options.proxyOptions));
+	        pipeline.addPolicy((0, decompressResponsePolicy_js_1.decompressResponsePolicy)());
+	    }
+	    pipeline.addPolicy((0, wrapAbortSignalLikePolicy_js_1.wrapAbortSignalLikePolicy)());
+	    pipeline.addPolicy((0, formDataPolicy_js_1.formDataPolicy)(), { beforePolicies: [multipartPolicy_js_1.multipartPolicyName] });
+	    pipeline.addPolicy((0, userAgentPolicy_js_1.userAgentPolicy)(options.userAgentOptions));
+	    pipeline.addPolicy((0, setClientRequestIdPolicy_js_1.setClientRequestIdPolicy)(options.telemetryOptions?.clientRequestIdHeaderName));
+	    // The multipart policy is added after policies with no phase, so that
+	    // policies can be added between it and formDataPolicy to modify
+	    // properties (e.g., making the boundary constant in recorded tests).
+	    pipeline.addPolicy((0, multipartPolicy_js_1.multipartPolicy)(), { afterPhase: "Deserialize" });
+	    pipeline.addPolicy((0, defaultRetryPolicy_js_1.defaultRetryPolicy)(options.retryOptions), { phase: "Retry" });
+	    pipeline.addPolicy((0, tracingPolicy_js_1.tracingPolicy)({ ...options.userAgentOptions, ...options.loggingOptions }), {
+	        afterPhase: "Retry",
+	    });
+	    if (core_util_1.isNodeLike) {
+	        // Both XHR and Fetch expect to handle redirects automatically,
+	        // so only include this policy when we're in Node.
+	        pipeline.addPolicy((0, redirectPolicy_js_1.redirectPolicy)(options.redirectOptions), { afterPhase: "Retry" });
+	    }
+	    pipeline.addPolicy((0, logPolicy_js_1.logPolicy)(options.loggingOptions), { afterPhase: "Sign" });
+	    return pipeline;
+	}
+	
+	return createPipelineFromOptions;
+}
+
+var defaultHttpClient = {};
+
+var hasRequiredDefaultHttpClient;
+
+function requireDefaultHttpClient () {
+	if (hasRequiredDefaultHttpClient) return defaultHttpClient;
+	hasRequiredDefaultHttpClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(defaultHttpClient, "__esModule", { value: true });
+	defaultHttpClient.createDefaultHttpClient = createDefaultHttpClient;
+	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
+	const wrapAbortSignal_js_1 = requireWrapAbortSignal();
+	/**
+	 * Create the correct HttpClient for the current environment.
+	 */
+	function createDefaultHttpClient() {
+	    const client = (0, ts_http_runtime_1.createDefaultHttpClient)();
+	    return {
+	        async sendRequest(request) {
+	            // we wrap any AbortSignalLike here since the TypeSpec runtime expects a native AbortSignal.
+	            // 99% of the time, this should be a no-op since a native AbortSignal is passed in.
+	            const { abortSignal, cleanup } = request.abortSignal
+	                ? (0, wrapAbortSignal_js_1.wrapAbortSignalLike)(request.abortSignal)
+	                : {};
+	            try {
+	                request.abortSignal = abortSignal;
+	                return await client.sendRequest(request);
+	            }
+	            finally {
+	                cleanup?.();
+	            }
+	        },
+	    };
+	}
+	
+	return defaultHttpClient;
+}
+
+var httpHeaders = {};
+
+var hasRequiredHttpHeaders;
+
+function requireHttpHeaders () {
+	if (hasRequiredHttpHeaders) return httpHeaders;
+	hasRequiredHttpHeaders = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(httpHeaders, "__esModule", { value: true });
+	httpHeaders.createHttpHeaders = createHttpHeaders;
+	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
+	/**
+	 * Creates an object that satisfies the `HttpHeaders` interface.
+	 * @param rawHeaders - A simple object representing initial headers
+	 */
+	function createHttpHeaders(rawHeaders) {
+	    return (0, ts_http_runtime_1.createHttpHeaders)(rawHeaders);
+	}
+	
+	return httpHeaders;
+}
+
+var pipelineRequest = {};
+
+var hasRequiredPipelineRequest;
+
+function requirePipelineRequest () {
+	if (hasRequiredPipelineRequest) return pipelineRequest;
+	hasRequiredPipelineRequest = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(pipelineRequest, "__esModule", { value: true });
+	pipelineRequest.createPipelineRequest = createPipelineRequest;
+	const ts_http_runtime_1 = /*@__PURE__*/ requireCommonjs$e();
+	/**
+	 * Creates a new pipeline request with the given options.
+	 * This method is to allow for the easy setting of default values and not required.
+	 * @param options - The options to create the request with.
+	 */
+	function createPipelineRequest(options) {
+	    // Cast required due to difference between ts-http-runtime requiring AbortSignal while core-rest-pipeline allows
+	    // the more generic AbortSignalLike. The wrapAbortSignalLike pipeline policy will take care of ensuring that any AbortSignalLike in the request
+	    // is converted into a true AbortSignal.
+	    return (0, ts_http_runtime_1.createPipelineRequest)(options);
+	}
+	
+	return pipelineRequest;
+}
+
+var exponentialRetryPolicy = {};
+
+var hasRequiredExponentialRetryPolicy;
+
+function requireExponentialRetryPolicy () {
+	if (hasRequiredExponentialRetryPolicy) return exponentialRetryPolicy;
+	hasRequiredExponentialRetryPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(exponentialRetryPolicy, "__esModule", { value: true });
+	exponentialRetryPolicy.exponentialRetryPolicyName = void 0;
+	exponentialRetryPolicy.exponentialRetryPolicy = exponentialRetryPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * The programmatic identifier of the exponentialRetryPolicy.
+	 */
+	exponentialRetryPolicy.exponentialRetryPolicyName = policies_1.exponentialRetryPolicyName;
+	/**
+	 * A policy that attempts to retry requests while introducing an exponentially increasing delay.
+	 * @param options - Options that configure retry logic.
+	 */
+	function exponentialRetryPolicy$1(options = {}) {
+	    return (0, policies_1.exponentialRetryPolicy)(options);
+	}
+	
+	return exponentialRetryPolicy;
+}
+
+var systemErrorRetryPolicy = {};
+
+var hasRequiredSystemErrorRetryPolicy;
+
+function requireSystemErrorRetryPolicy () {
+	if (hasRequiredSystemErrorRetryPolicy) return systemErrorRetryPolicy;
+	hasRequiredSystemErrorRetryPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(systemErrorRetryPolicy, "__esModule", { value: true });
+	systemErrorRetryPolicy.systemErrorRetryPolicyName = void 0;
+	systemErrorRetryPolicy.systemErrorRetryPolicy = systemErrorRetryPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * Name of the {@link systemErrorRetryPolicy}
+	 */
+	systemErrorRetryPolicy.systemErrorRetryPolicyName = policies_1.systemErrorRetryPolicyName;
+	/**
+	 * A retry policy that specifically seeks to handle errors in the
+	 * underlying transport layer (e.g. DNS lookup failures) rather than
+	 * retryable error codes from the server itself.
+	 * @param options - Options that customize the policy.
+	 */
+	function systemErrorRetryPolicy$1(options = {}) {
+	    return (0, policies_1.systemErrorRetryPolicy)(options);
+	}
+	
+	return systemErrorRetryPolicy;
+}
+
+var throttlingRetryPolicy = {};
+
+var hasRequiredThrottlingRetryPolicy;
+
+function requireThrottlingRetryPolicy () {
+	if (hasRequiredThrottlingRetryPolicy) return throttlingRetryPolicy;
+	hasRequiredThrottlingRetryPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(throttlingRetryPolicy, "__esModule", { value: true });
+	throttlingRetryPolicy.throttlingRetryPolicyName = void 0;
+	throttlingRetryPolicy.throttlingRetryPolicy = throttlingRetryPolicy$1;
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	/**
+	 * Name of the {@link throttlingRetryPolicy}
+	 */
+	throttlingRetryPolicy.throttlingRetryPolicyName = policies_1.throttlingRetryPolicyName;
+	/**
+	 * A policy that retries when the server sends a 429 response with a Retry-After header.
+	 *
+	 * To learn more, please refer to
+	 * https://learn.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits,
+	 * https://learn.microsoft.com/azure/azure-subscription-service-limits and
+	 * https://learn.microsoft.com/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
+	 *
+	 * @param options - Options that configure retry logic.
+	 */
+	function throttlingRetryPolicy$1(options = {}) {
+	    return (0, policies_1.throttlingRetryPolicy)(options);
+	}
+	
+	return throttlingRetryPolicy;
+}
+
+var retryPolicy = {};
+
+var hasRequiredRetryPolicy;
+
+function requireRetryPolicy () {
+	if (hasRequiredRetryPolicy) return retryPolicy;
+	hasRequiredRetryPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(retryPolicy, "__esModule", { value: true });
+	retryPolicy.retryPolicy = retryPolicy$1;
+	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
+	const constants_js_1 = requireConstants$9();
+	const policies_1 = /*@__PURE__*/ requireInternal$1();
+	const retryPolicyLogger = (0, logger_1.createClientLogger)("core-rest-pipeline retryPolicy");
+	/**
+	 * retryPolicy is a generic policy to enable retrying requests when certain conditions are met
+	 */
+	function retryPolicy$1(strategies, options = { maxRetries: constants_js_1.DEFAULT_RETRY_POLICY_COUNT }) {
+	    // Cast is required since the TSP runtime retry strategy type is slightly different
+	    // very deep down (using real AbortSignal vs. AbortSignalLike in RestError).
+	    // In practice the difference doesn't actually matter.
+	    return (0, policies_1.retryPolicy)(strategies, {
+	        logger: retryPolicyLogger,
+	        ...options,
+	    });
+	}
+	
+	return retryPolicy;
+}
+
+var bearerTokenAuthenticationPolicy = {};
+
+var tokenCycler = {};
+
+var hasRequiredTokenCycler;
+
+function requireTokenCycler () {
+	if (hasRequiredTokenCycler) return tokenCycler;
+	hasRequiredTokenCycler = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.DEFAULT_CYCLER_OPTIONS = void 0;
+		exports$1.createTokenCycler = createTokenCycler;
+		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+		// Default options for the cycler if none are provided
+		exports$1.DEFAULT_CYCLER_OPTIONS = {
+		    forcedRefreshWindowInMs: 1000, // Force waiting for a refresh 1s before the token expires
+		    retryIntervalInMs: 3000, // Allow refresh attempts every 3s
+		    refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
+		};
+		/**
+		 * Converts an an unreliable access token getter (which may resolve with null)
+		 * into an AccessTokenGetter by retrying the unreliable getter in a regular
+		 * interval.
+		 *
+		 * @param getAccessToken - A function that produces a promise of an access token that may fail by returning null.
+		 * @param retryIntervalInMs - The time (in milliseconds) to wait between retry attempts.
+		 * @param refreshTimeout - The timestamp after which the refresh attempt will fail, throwing an exception.
+		 * @returns - A promise that, if it resolves, will resolve with an access token.
+		 */
+		async function beginRefresh(getAccessToken, retryIntervalInMs, refreshTimeout) {
+		    // This wrapper handles exceptions gracefully as long as we haven't exceeded
+		    // the timeout.
+		    async function tryGetAccessToken() {
+		        if (Date.now() < refreshTimeout) {
+		            try {
+		                return await getAccessToken();
+		            }
+		            catch {
+		                return null;
+		            }
+		        }
+		        else {
+		            const finalToken = await getAccessToken();
+		            // Timeout is up, so throw if it's still null
+		            if (finalToken === null) {
+		                throw new Error("Failed to refresh access token.");
+		            }
+		            return finalToken;
+		        }
+		    }
+		    let token = await tryGetAccessToken();
+		    while (token === null) {
+		        await (0, core_util_1.delay)(retryIntervalInMs);
+		        token = await tryGetAccessToken();
+		    }
+		    return token;
+		}
+		/**
+		 * Creates a token cycler from a credential, scopes, and optional settings.
+		 *
+		 * A token cycler represents a way to reliably retrieve a valid access token
+		 * from a TokenCredential. It will handle initializing the token, refreshing it
+		 * when it nears expiration, and synchronizes refresh attempts to avoid
+		 * concurrency hazards.
+		 *
+		 * @param credential - the underlying TokenCredential that provides the access
+		 * token
+		 * @param tokenCyclerOptions - optionally override default settings for the cycler
+		 *
+		 * @returns - a function that reliably produces a valid access token
+		 */
+		function createTokenCycler(credential, tokenCyclerOptions) {
+		    let refreshWorker = null;
+		    let token = null;
+		    let tenantId;
+		    const options = {
+		        ...exports$1.DEFAULT_CYCLER_OPTIONS,
+		        ...tokenCyclerOptions,
+		    };
+		    /**
+		     * This little holder defines several predicates that we use to construct
+		     * the rules of refreshing the token.
+		     */
+		    const cycler = {
+		        /**
+		         * Produces true if a refresh job is currently in progress.
+		         */
+		        get isRefreshing() {
+		            return refreshWorker !== null;
+		        },
+		        /**
+		         * Produces true if the cycler SHOULD refresh (we are within the refresh
+		         * window and not already refreshing)
+		         */
+		        get shouldRefresh() {
+		            if (cycler.isRefreshing) {
+		                return false;
+		            }
+		            if (token?.refreshAfterTimestamp && token.refreshAfterTimestamp < Date.now()) {
+		                return true;
+		            }
+		            return (token?.expiresOnTimestamp ?? 0) - options.refreshWindowInMs < Date.now();
+		        },
+		        /**
+		         * Produces true if the cycler MUST refresh (null or nearly-expired
+		         * token).
+		         */
+		        get mustRefresh() {
+		            return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
+		        },
+		    };
+		    /**
+		     * Starts a refresh job or returns the existing job if one is already
+		     * running.
+		     */
+		    function refresh(scopes, getTokenOptions) {
+		        if (!cycler.isRefreshing) {
+		            // We bind `scopes` here to avoid passing it around a lot
+		            const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
+		            // Take advantage of promise chaining to insert an assignment to `token`
+		            // before the refresh can be considered done.
+		            refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, 
+		            // If we don't have a token, then we should timeout immediately
+		            token?.expiresOnTimestamp ?? Date.now())
+		                .then((_token) => {
+		                refreshWorker = null;
+		                token = _token;
+		                tenantId = getTokenOptions.tenantId;
+		                return token;
+		            })
+		                .catch((reason) => {
+		                // We also should reset the refresher if we enter a failed state.  All
+		                // existing awaiters will throw, but subsequent requests will start a
+		                // new retry chain.
+		                refreshWorker = null;
+		                token = null;
+		                tenantId = undefined;
+		                throw reason;
+		            });
+		        }
+		        return refreshWorker;
+		    }
+		    return async (scopes, tokenOptions) => {
+		        //
+		        // Simple rules:
+		        // - If we MUST refresh, then return the refresh task, blocking
+		        //   the pipeline until a token is available.
+		        // - If we SHOULD refresh, then run refresh but don't return it
+		        //   (we can still use the cached token).
+		        // - Return the token, since it's fine if we didn't return in
+		        //   step 1.
+		        //
+		        const hasClaimChallenge = Boolean(tokenOptions.claims);
+		        const tenantIdChanged = tenantId !== tokenOptions.tenantId;
+		        if (hasClaimChallenge) {
+		            // If we've received a claim, we know the existing token isn't valid
+		            // We want to clear it so that that refresh worker won't use the old expiration time as a timeout
+		            token = null;
+		        }
+		        // If the tenantId passed in token options is different to the one we have
+		        // Or if we are in claim challenge and the token was rejected and a new access token need to be issued, we need to
+		        // refresh the token with the new tenantId or token.
+		        const mustRefresh = tenantIdChanged || hasClaimChallenge || cycler.mustRefresh;
+		        if (mustRefresh) {
+		            return refresh(scopes, tokenOptions);
+		        }
+		        if (cycler.shouldRefresh) {
+		            refresh(scopes, tokenOptions);
+		        }
+		        return token;
+		    };
+		}
+		
+	} (tokenCycler));
+	return tokenCycler;
+}
+
+var hasRequiredBearerTokenAuthenticationPolicy;
+
+function requireBearerTokenAuthenticationPolicy () {
+	if (hasRequiredBearerTokenAuthenticationPolicy) return bearerTokenAuthenticationPolicy;
+	hasRequiredBearerTokenAuthenticationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.bearerTokenAuthenticationPolicyName = void 0;
+		exports$1.bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy;
+		exports$1.parseChallenges = parseChallenges;
+		const tokenCycler_js_1 = requireTokenCycler();
+		const log_js_1 = requireLog$3();
+		const restError_js_1 = requireRestError();
+		/**
+		 * The programmatic identifier of the bearerTokenAuthenticationPolicy.
+		 */
+		exports$1.bearerTokenAuthenticationPolicyName = "bearerTokenAuthenticationPolicy";
+		/**
+		 * Try to send the given request.
+		 *
+		 * When a response is received, returns a tuple of the response received and, if the response was received
+		 * inside a thrown RestError, the RestError that was thrown.
+		 *
+		 * Otherwise, if an error was thrown while sending the request that did not provide an underlying response, it
+		 * will be rethrown.
+		 */
+		async function trySendRequest(request, next) {
+		    try {
+		        return [await next(request), undefined];
+		    }
+		    catch (e) {
+		        if ((0, restError_js_1.isRestError)(e) && e.response) {
+		            return [e.response, e];
+		        }
+		        else {
+		            throw e;
+		        }
+		    }
+		}
+		/**
+		 * Default authorize request handler
+		 */
+		async function defaultAuthorizeRequest(options) {
+		    const { scopes, getAccessToken, request } = options;
+		    // Enable CAE true by default
+		    const getTokenOptions = {
+		        abortSignal: request.abortSignal,
+		        tracingOptions: request.tracingOptions,
+		        enableCae: true,
+		    };
+		    const accessToken = await getAccessToken(scopes, getTokenOptions);
+		    if (accessToken) {
+		        options.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
+		    }
+		}
+		/**
+		 * We will retrieve the challenge only if the response status code was 401,
+		 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
+		 */
+		function isChallengeResponse(response) {
+		    return response.status === 401 && response.headers.has("WWW-Authenticate");
+		}
+		/**
+		 * Re-authorize the request for CAE challenge.
+		 * The response containing the challenge is `options.response`.
+		 * If this method returns true, the underlying request will be sent once again.
+		 */
+		async function authorizeRequestOnCaeChallenge(onChallengeOptions, caeClaims) {
+		    const { scopes } = onChallengeOptions;
+		    const accessToken = await onChallengeOptions.getAccessToken(scopes, {
+		        enableCae: true,
+		        claims: caeClaims,
+		    });
+		    if (!accessToken) {
+		        return false;
+		    }
+		    onChallengeOptions.request.headers.set("Authorization", `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
+		    return true;
+		}
+		/**
+		 * A policy that can request a token from a TokenCredential implementation and
+		 * then apply it to the Authorization header of a request as a Bearer token.
+		 */
+		function bearerTokenAuthenticationPolicy(options) {
+		    const { credential, scopes, challengeCallbacks } = options;
+		    const logger = options.logger || log_js_1.logger;
+		    const callbacks = {
+		        authorizeRequest: challengeCallbacks?.authorizeRequest?.bind(challengeCallbacks) ?? defaultAuthorizeRequest,
+		        authorizeRequestOnChallenge: challengeCallbacks?.authorizeRequestOnChallenge?.bind(challengeCallbacks),
+		    };
+		    // This function encapsulates the entire process of reliably retrieving the token
+		    // The options are left out of the public API until there's demand to configure this.
+		    // Remember to extend `BearerTokenAuthenticationPolicyOptions` with `TokenCyclerOptions`
+		    // in order to pass through the `options` object.
+		    const getAccessToken = credential
+		        ? (0, tokenCycler_js_1.createTokenCycler)(credential /* , options */)
+		        : () => Promise.resolve(null);
+		    return {
+		        name: exports$1.bearerTokenAuthenticationPolicyName,
+		        /**
+		         * If there's no challenge parameter:
+		         * - It will try to retrieve the token using the cache, or the credential's getToken.
+		         * - Then it will try the next policy with or without the retrieved token.
+		         *
+		         * It uses the challenge parameters to:
+		         * - Skip a first attempt to get the token from the credential if there's no cached token,
+		         *   since it expects the token to be retrievable only after the challenge.
+		         * - Prepare the outgoing request if the `prepareRequest` method has been provided.
+		         * - Send an initial request to receive the challenge if it fails.
+		         * - Process a challenge if the response contains it.
+		         * - Retrieve a token with the challenge information, then re-send the request.
+		         */
+		        async sendRequest(request, next) {
+		            if (!request.url.toLowerCase().startsWith("https://")) {
+		                throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
+		            }
+		            await callbacks.authorizeRequest({
+		                scopes: Array.isArray(scopes) ? scopes : [scopes],
+		                request,
+		                getAccessToken,
+		                logger,
+		            });
+		            let response;
+		            let error;
+		            let shouldSendRequest;
+		            [response, error] = await trySendRequest(request, next);
+		            if (isChallengeResponse(response)) {
+		                let claims = getCaeChallengeClaims(response.headers.get("WWW-Authenticate"));
+		                // Handle CAE by default when receive CAE claim
+		                if (claims) {
+		                    let parsedClaim;
+		                    // Return the response immediately if claims is not a valid base64 encoded string
+		                    try {
+		                        parsedClaim = atob(claims);
+		                    }
+		                    catch (e) {
+		                        logger.warning(`The WWW-Authenticate header contains "claims" that cannot be parsed. Unable to perform the Continuous Access Evaluation authentication flow. Unparsable claims: ${claims}`);
+		                        return response;
+		                    }
+		                    shouldSendRequest = await authorizeRequestOnCaeChallenge({
+		                        scopes: Array.isArray(scopes) ? scopes : [scopes],
+		                        response,
+		                        request,
+		                        getAccessToken,
+		                        logger,
+		                    }, parsedClaim);
+		                    // Send updated request and handle response for RestError
+		                    if (shouldSendRequest) {
+		                        [response, error] = await trySendRequest(request, next);
+		                    }
+		                }
+		                else if (callbacks.authorizeRequestOnChallenge) {
+		                    // Handle custom challenges when client provides custom callback
+		                    shouldSendRequest = await callbacks.authorizeRequestOnChallenge({
+		                        scopes: Array.isArray(scopes) ? scopes : [scopes],
+		                        request,
+		                        response,
+		                        getAccessToken,
+		                        logger,
+		                    });
+		                    // Send updated request and handle response for RestError
+		                    if (shouldSendRequest) {
+		                        [response, error] = await trySendRequest(request, next);
+		                    }
+		                    // If we get another CAE Claim, we will handle it by default and return whatever value we receive for this
+		                    if (isChallengeResponse(response)) {
+		                        claims = getCaeChallengeClaims(response.headers.get("WWW-Authenticate"));
+		                        if (claims) {
+		                            let parsedClaim;
+		                            try {
+		                                parsedClaim = atob(claims);
+		                            }
+		                            catch (e) {
+		                                logger.warning(`The WWW-Authenticate header contains "claims" that cannot be parsed. Unable to perform the Continuous Access Evaluation authentication flow. Unparsable claims: ${claims}`);
+		                                return response;
+		                            }
+		                            shouldSendRequest = await authorizeRequestOnCaeChallenge({
+		                                scopes: Array.isArray(scopes) ? scopes : [scopes],
+		                                response,
+		                                request,
+		                                getAccessToken,
+		                                logger,
+		                            }, parsedClaim);
+		                            // Send updated request and handle response for RestError
+		                            if (shouldSendRequest) {
+		                                [response, error] = await trySendRequest(request, next);
+		                            }
+		                        }
+		                    }
+		                }
+		            }
+		            if (error) {
+		                throw error;
+		            }
+		            else {
+		                return response;
+		            }
+		        },
+		    };
+		}
+		/**
+		 * Converts: `Bearer a="b", c="d", Pop e="f", g="h"`.
+		 * Into: `[ { scheme: 'Bearer', params: { a: 'b', c: 'd' } }, { scheme: 'Pop', params: { e: 'f', g: 'h' } } ]`.
+		 *
+		 * @internal
+		 */
+		function parseChallenges(challenges) {
+		    // Challenge regex seperates the string to individual challenges with different schemes in the format `Scheme a="b", c=d`
+		    // The challenge regex captures parameteres with either quotes values or unquoted values
+		    const challengeRegex = /(\w+)\s+((?:\w+=(?:"[^"]*"|[^,]*),?\s*)+)/g;
+		    // Parameter regex captures the claims group removed from the scheme in the format `a="b"` and `c="d"`
+		    // CAE challenge always have quoted parameters. For more reference, https://learn.microsoft.com/entra/identity-platform/claims-challenge
+		    const paramRegex = /(\w+)="([^"]*)"/g;
+		    const parsedChallenges = [];
+		    let match;
+		    // Iterate over each challenge match
+		    while ((match = challengeRegex.exec(challenges)) !== null) {
+		        const scheme = match[1];
+		        const paramsString = match[2];
+		        const params = {};
+		        let paramMatch;
+		        // Iterate over each parameter match
+		        while ((paramMatch = paramRegex.exec(paramsString)) !== null) {
+		            params[paramMatch[1]] = paramMatch[2];
+		        }
+		        parsedChallenges.push({ scheme, params });
+		    }
+		    return parsedChallenges;
+		}
+		/**
+		 * Parse a pipeline response and look for a CAE challenge with "Bearer" scheme
+		 * Return the value in the header without parsing the challenge
+		 * @internal
+		 */
+		function getCaeChallengeClaims(challenges) {
+		    if (!challenges) {
+		        return;
+		    }
+		    // Find all challenges present in the header
+		    const parsedChallenges = parseChallenges(challenges);
+		    return parsedChallenges.find((x) => x.scheme === "Bearer" && x.params.claims && x.params.error === "insufficient_claims")?.params.claims;
+		}
+		
+	} (bearerTokenAuthenticationPolicy));
+	return bearerTokenAuthenticationPolicy;
+}
+
+var ndJsonPolicy = {};
+
+var hasRequiredNdJsonPolicy;
+
+function requireNdJsonPolicy () {
+	if (hasRequiredNdJsonPolicy) return ndJsonPolicy;
+	hasRequiredNdJsonPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.ndJsonPolicyName = void 0;
+		exports$1.ndJsonPolicy = ndJsonPolicy;
+		/**
+		 * The programmatic identifier of the ndJsonPolicy.
+		 */
+		exports$1.ndJsonPolicyName = "ndJsonPolicy";
+		/**
+		 * ndJsonPolicy is a policy used to control keep alive settings for every request.
+		 */
+		function ndJsonPolicy() {
+		    return {
+		        name: exports$1.ndJsonPolicyName,
+		        async sendRequest(request, next) {
+		            // There currently isn't a good way to bypass the serializer
+		            if (typeof request.body === "string" && request.body.startsWith("[")) {
+		                const body = JSON.parse(request.body);
+		                if (Array.isArray(body)) {
+		                    request.body = body.map((item) => JSON.stringify(item) + "\n").join("");
+		                }
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (ndJsonPolicy));
+	return ndJsonPolicy;
+}
+
+var auxiliaryAuthenticationHeaderPolicy = {};
+
+var hasRequiredAuxiliaryAuthenticationHeaderPolicy;
+
+function requireAuxiliaryAuthenticationHeaderPolicy () {
+	if (hasRequiredAuxiliaryAuthenticationHeaderPolicy) return auxiliaryAuthenticationHeaderPolicy;
+	hasRequiredAuxiliaryAuthenticationHeaderPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.auxiliaryAuthenticationHeaderPolicyName = void 0;
+		exports$1.auxiliaryAuthenticationHeaderPolicy = auxiliaryAuthenticationHeaderPolicy;
+		const tokenCycler_js_1 = requireTokenCycler();
+		const log_js_1 = requireLog$3();
+		/**
+		 * The programmatic identifier of the auxiliaryAuthenticationHeaderPolicy.
+		 */
+		exports$1.auxiliaryAuthenticationHeaderPolicyName = "auxiliaryAuthenticationHeaderPolicy";
+		const AUTHORIZATION_AUXILIARY_HEADER = "x-ms-authorization-auxiliary";
+		async function sendAuthorizeRequest(options) {
+		    const { scopes, getAccessToken, request } = options;
+		    const getTokenOptions = {
+		        abortSignal: request.abortSignal,
+		        tracingOptions: request.tracingOptions,
+		    };
+		    return (await getAccessToken(scopes, getTokenOptions))?.token ?? "";
+		}
+		/**
+		 * A policy for external tokens to `x-ms-authorization-auxiliary` header.
+		 * This header will be used when creating a cross-tenant application we may need to handle authentication requests
+		 * for resources that are in different tenants.
+		 * You could see [ARM docs](https://learn.microsoft.com/azure/azure-resource-manager/management/authenticate-multi-tenant) for a rundown of how this feature works
+		 */
+		function auxiliaryAuthenticationHeaderPolicy(options) {
+		    const { credentials, scopes } = options;
+		    const logger = options.logger || log_js_1.logger;
+		    const tokenCyclerMap = new WeakMap();
+		    return {
+		        name: exports$1.auxiliaryAuthenticationHeaderPolicyName,
+		        async sendRequest(request, next) {
+		            if (!request.url.toLowerCase().startsWith("https://")) {
+		                throw new Error("Bearer token authentication for auxiliary header is not permitted for non-TLS protected (non-https) URLs.");
+		            }
+		            if (!credentials || credentials.length === 0) {
+		                logger.info(`${exports$1.auxiliaryAuthenticationHeaderPolicyName} header will not be set due to empty credentials.`);
+		                return next(request);
+		            }
+		            const tokenPromises = [];
+		            for (const credential of credentials) {
+		                let getAccessToken = tokenCyclerMap.get(credential);
+		                if (!getAccessToken) {
+		                    getAccessToken = (0, tokenCycler_js_1.createTokenCycler)(credential);
+		                    tokenCyclerMap.set(credential, getAccessToken);
+		                }
+		                tokenPromises.push(sendAuthorizeRequest({
+		                    scopes: Array.isArray(scopes) ? scopes : [scopes],
+		                    request,
+		                    getAccessToken}));
+		            }
+		            const auxiliaryTokens = (await Promise.all(tokenPromises)).filter((token) => Boolean(token));
+		            if (auxiliaryTokens.length === 0) {
+		                logger.warning(`None of the auxiliary tokens are valid. ${AUTHORIZATION_AUXILIARY_HEADER} header will not be set.`);
+		                return next(request);
+		            }
+		            request.headers.set(AUTHORIZATION_AUXILIARY_HEADER, auxiliaryTokens.map((token) => `Bearer ${token}`).join(", "));
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (auxiliaryAuthenticationHeaderPolicy));
+	return auxiliaryAuthenticationHeaderPolicy;
+}
+
+var hasRequiredCommonjs$9;
+
+function requireCommonjs$9 () {
+	if (hasRequiredCommonjs$9) return commonjs$d;
+	hasRequiredCommonjs$9 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.createFileFromStream = exports$1.createFile = exports$1.agentPolicyName = exports$1.agentPolicy = exports$1.auxiliaryAuthenticationHeaderPolicyName = exports$1.auxiliaryAuthenticationHeaderPolicy = exports$1.ndJsonPolicyName = exports$1.ndJsonPolicy = exports$1.bearerTokenAuthenticationPolicyName = exports$1.bearerTokenAuthenticationPolicy = exports$1.formDataPolicyName = exports$1.formDataPolicy = exports$1.tlsPolicyName = exports$1.tlsPolicy = exports$1.userAgentPolicyName = exports$1.userAgentPolicy = exports$1.defaultRetryPolicy = exports$1.tracingPolicyName = exports$1.tracingPolicy = exports$1.retryPolicy = exports$1.throttlingRetryPolicyName = exports$1.throttlingRetryPolicy = exports$1.systemErrorRetryPolicyName = exports$1.systemErrorRetryPolicy = exports$1.redirectPolicyName = exports$1.redirectPolicy = exports$1.getDefaultProxySettings = exports$1.proxyPolicyName = exports$1.proxyPolicy = exports$1.multipartPolicyName = exports$1.multipartPolicy = exports$1.logPolicyName = exports$1.logPolicy = exports$1.setClientRequestIdPolicyName = exports$1.setClientRequestIdPolicy = exports$1.exponentialRetryPolicyName = exports$1.exponentialRetryPolicy = exports$1.decompressResponsePolicyName = exports$1.decompressResponsePolicy = exports$1.isRestError = exports$1.RestError = exports$1.createPipelineRequest = exports$1.createHttpHeaders = exports$1.createDefaultHttpClient = exports$1.createPipelineFromOptions = exports$1.createEmptyPipeline = void 0;
+		var pipeline_js_1 = requirePipeline$2();
+		Object.defineProperty(exports$1, "createEmptyPipeline", { enumerable: true, get: function () { return pipeline_js_1.createEmptyPipeline; } });
+		var createPipelineFromOptions_js_1 = requireCreatePipelineFromOptions();
+		Object.defineProperty(exports$1, "createPipelineFromOptions", { enumerable: true, get: function () { return createPipelineFromOptions_js_1.createPipelineFromOptions; } });
+		var defaultHttpClient_js_1 = requireDefaultHttpClient();
+		Object.defineProperty(exports$1, "createDefaultHttpClient", { enumerable: true, get: function () { return defaultHttpClient_js_1.createDefaultHttpClient; } });
+		var httpHeaders_js_1 = requireHttpHeaders();
+		Object.defineProperty(exports$1, "createHttpHeaders", { enumerable: true, get: function () { return httpHeaders_js_1.createHttpHeaders; } });
+		var pipelineRequest_js_1 = requirePipelineRequest();
+		Object.defineProperty(exports$1, "createPipelineRequest", { enumerable: true, get: function () { return pipelineRequest_js_1.createPipelineRequest; } });
+		var restError_js_1 = requireRestError();
+		Object.defineProperty(exports$1, "RestError", { enumerable: true, get: function () { return restError_js_1.RestError; } });
+		Object.defineProperty(exports$1, "isRestError", { enumerable: true, get: function () { return restError_js_1.isRestError; } });
+		var decompressResponsePolicy_js_1 = requireDecompressResponsePolicy();
+		Object.defineProperty(exports$1, "decompressResponsePolicy", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicy; } });
+		Object.defineProperty(exports$1, "decompressResponsePolicyName", { enumerable: true, get: function () { return decompressResponsePolicy_js_1.decompressResponsePolicyName; } });
+		var exponentialRetryPolicy_js_1 = requireExponentialRetryPolicy();
+		Object.defineProperty(exports$1, "exponentialRetryPolicy", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicy; } });
+		Object.defineProperty(exports$1, "exponentialRetryPolicyName", { enumerable: true, get: function () { return exponentialRetryPolicy_js_1.exponentialRetryPolicyName; } });
+		var setClientRequestIdPolicy_js_1 = requireSetClientRequestIdPolicy();
+		Object.defineProperty(exports$1, "setClientRequestIdPolicy", { enumerable: true, get: function () { return setClientRequestIdPolicy_js_1.setClientRequestIdPolicy; } });
+		Object.defineProperty(exports$1, "setClientRequestIdPolicyName", { enumerable: true, get: function () { return setClientRequestIdPolicy_js_1.setClientRequestIdPolicyName; } });
+		var logPolicy_js_1 = requireLogPolicy();
+		Object.defineProperty(exports$1, "logPolicy", { enumerable: true, get: function () { return logPolicy_js_1.logPolicy; } });
+		Object.defineProperty(exports$1, "logPolicyName", { enumerable: true, get: function () { return logPolicy_js_1.logPolicyName; } });
+		var multipartPolicy_js_1 = requireMultipartPolicy();
+		Object.defineProperty(exports$1, "multipartPolicy", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicy; } });
+		Object.defineProperty(exports$1, "multipartPolicyName", { enumerable: true, get: function () { return multipartPolicy_js_1.multipartPolicyName; } });
+		var proxyPolicy_js_1 = requireProxyPolicy();
+		Object.defineProperty(exports$1, "proxyPolicy", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicy; } });
+		Object.defineProperty(exports$1, "proxyPolicyName", { enumerable: true, get: function () { return proxyPolicy_js_1.proxyPolicyName; } });
+		Object.defineProperty(exports$1, "getDefaultProxySettings", { enumerable: true, get: function () { return proxyPolicy_js_1.getDefaultProxySettings; } });
+		var redirectPolicy_js_1 = requireRedirectPolicy();
+		Object.defineProperty(exports$1, "redirectPolicy", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicy; } });
+		Object.defineProperty(exports$1, "redirectPolicyName", { enumerable: true, get: function () { return redirectPolicy_js_1.redirectPolicyName; } });
+		var systemErrorRetryPolicy_js_1 = requireSystemErrorRetryPolicy();
+		Object.defineProperty(exports$1, "systemErrorRetryPolicy", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicy; } });
+		Object.defineProperty(exports$1, "systemErrorRetryPolicyName", { enumerable: true, get: function () { return systemErrorRetryPolicy_js_1.systemErrorRetryPolicyName; } });
+		var throttlingRetryPolicy_js_1 = requireThrottlingRetryPolicy();
+		Object.defineProperty(exports$1, "throttlingRetryPolicy", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicy; } });
+		Object.defineProperty(exports$1, "throttlingRetryPolicyName", { enumerable: true, get: function () { return throttlingRetryPolicy_js_1.throttlingRetryPolicyName; } });
+		var retryPolicy_js_1 = requireRetryPolicy();
+		Object.defineProperty(exports$1, "retryPolicy", { enumerable: true, get: function () { return retryPolicy_js_1.retryPolicy; } });
+		var tracingPolicy_js_1 = requireTracingPolicy();
+		Object.defineProperty(exports$1, "tracingPolicy", { enumerable: true, get: function () { return tracingPolicy_js_1.tracingPolicy; } });
+		Object.defineProperty(exports$1, "tracingPolicyName", { enumerable: true, get: function () { return tracingPolicy_js_1.tracingPolicyName; } });
+		var defaultRetryPolicy_js_1 = requireDefaultRetryPolicy();
+		Object.defineProperty(exports$1, "defaultRetryPolicy", { enumerable: true, get: function () { return defaultRetryPolicy_js_1.defaultRetryPolicy; } });
+		var userAgentPolicy_js_1 = requireUserAgentPolicy();
+		Object.defineProperty(exports$1, "userAgentPolicy", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicy; } });
+		Object.defineProperty(exports$1, "userAgentPolicyName", { enumerable: true, get: function () { return userAgentPolicy_js_1.userAgentPolicyName; } });
+		var tlsPolicy_js_1 = requireTlsPolicy();
+		Object.defineProperty(exports$1, "tlsPolicy", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicy; } });
+		Object.defineProperty(exports$1, "tlsPolicyName", { enumerable: true, get: function () { return tlsPolicy_js_1.tlsPolicyName; } });
+		var formDataPolicy_js_1 = requireFormDataPolicy();
+		Object.defineProperty(exports$1, "formDataPolicy", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicy; } });
+		Object.defineProperty(exports$1, "formDataPolicyName", { enumerable: true, get: function () { return formDataPolicy_js_1.formDataPolicyName; } });
+		var bearerTokenAuthenticationPolicy_js_1 = requireBearerTokenAuthenticationPolicy();
+		Object.defineProperty(exports$1, "bearerTokenAuthenticationPolicy", { enumerable: true, get: function () { return bearerTokenAuthenticationPolicy_js_1.bearerTokenAuthenticationPolicy; } });
+		Object.defineProperty(exports$1, "bearerTokenAuthenticationPolicyName", { enumerable: true, get: function () { return bearerTokenAuthenticationPolicy_js_1.bearerTokenAuthenticationPolicyName; } });
+		var ndJsonPolicy_js_1 = requireNdJsonPolicy();
+		Object.defineProperty(exports$1, "ndJsonPolicy", { enumerable: true, get: function () { return ndJsonPolicy_js_1.ndJsonPolicy; } });
+		Object.defineProperty(exports$1, "ndJsonPolicyName", { enumerable: true, get: function () { return ndJsonPolicy_js_1.ndJsonPolicyName; } });
+		var auxiliaryAuthenticationHeaderPolicy_js_1 = requireAuxiliaryAuthenticationHeaderPolicy();
+		Object.defineProperty(exports$1, "auxiliaryAuthenticationHeaderPolicy", { enumerable: true, get: function () { return auxiliaryAuthenticationHeaderPolicy_js_1.auxiliaryAuthenticationHeaderPolicy; } });
+		Object.defineProperty(exports$1, "auxiliaryAuthenticationHeaderPolicyName", { enumerable: true, get: function () { return auxiliaryAuthenticationHeaderPolicy_js_1.auxiliaryAuthenticationHeaderPolicyName; } });
+		var agentPolicy_js_1 = requireAgentPolicy();
+		Object.defineProperty(exports$1, "agentPolicy", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicy; } });
+		Object.defineProperty(exports$1, "agentPolicyName", { enumerable: true, get: function () { return agentPolicy_js_1.agentPolicyName; } });
+		var file_js_1 = requireFile$1();
+		Object.defineProperty(exports$1, "createFile", { enumerable: true, get: function () { return file_js_1.createFile; } });
+		Object.defineProperty(exports$1, "createFileFromStream", { enumerable: true, get: function () { return file_js_1.createFileFromStream; } });
+		
+	} (commonjs$d));
+	return commonjs$d;
+}
+
+var BlobServiceClient = {};
+
+var commonjs$7 = {};
+
+var azureKeyCredential = {};
+
+var hasRequiredAzureKeyCredential;
+
+function requireAzureKeyCredential () {
+	if (hasRequiredAzureKeyCredential) return azureKeyCredential;
+	hasRequiredAzureKeyCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(azureKeyCredential, "__esModule", { value: true });
+	azureKeyCredential.AzureKeyCredential = void 0;
+	/**
+	 * A static-key-based credential that supports updating
+	 * the underlying key value.
+	 */
+	class AzureKeyCredential {
+	    _key;
+	    /**
+	     * The value of the key to be used in authentication
+	     */
+	    get key() {
+	        return this._key;
+	    }
+	    /**
+	     * Create an instance of an AzureKeyCredential for use
+	     * with a service client.
+	     *
+	     * @param key - The initial value of the key to use in authentication
+	     */
+	    constructor(key) {
+	        if (!key) {
+	            throw new Error("key must be a non-empty string");
+	        }
+	        this._key = key;
+	    }
+	    /**
+	     * Change the value of the key.
+	     *
+	     * Updates will take effect upon the next request after
+	     * updating the key value.
+	     *
+	     * @param newKey - The new key value to be used
+	     */
+	    update(newKey) {
+	        this._key = newKey;
+	    }
+	}
+	azureKeyCredential.AzureKeyCredential = AzureKeyCredential;
+	
+	return azureKeyCredential;
+}
+
+var keyCredential = {};
+
+var hasRequiredKeyCredential;
+
+function requireKeyCredential () {
+	if (hasRequiredKeyCredential) return keyCredential;
+	hasRequiredKeyCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(keyCredential, "__esModule", { value: true });
+	keyCredential.isKeyCredential = isKeyCredential;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	/**
+	 * Tests an object to determine whether it implements KeyCredential.
+	 *
+	 * @param credential - The assumed KeyCredential to be tested.
+	 */
+	function isKeyCredential(credential) {
+	    return (0, core_util_1.isObjectWithProperties)(credential, ["key"]) && typeof credential.key === "string";
+	}
+	
+	return keyCredential;
+}
+
+var azureNamedKeyCredential = {};
+
+var hasRequiredAzureNamedKeyCredential;
+
+function requireAzureNamedKeyCredential () {
+	if (hasRequiredAzureNamedKeyCredential) return azureNamedKeyCredential;
+	hasRequiredAzureNamedKeyCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(azureNamedKeyCredential, "__esModule", { value: true });
+	azureNamedKeyCredential.AzureNamedKeyCredential = void 0;
+	azureNamedKeyCredential.isNamedKeyCredential = isNamedKeyCredential;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	/**
+	 * A static name/key-based credential that supports updating
+	 * the underlying name and key values.
+	 */
+	class AzureNamedKeyCredential {
+	    _key;
+	    _name;
+	    /**
+	     * The value of the key to be used in authentication.
+	     */
+	    get key() {
+	        return this._key;
+	    }
+	    /**
+	     * The value of the name to be used in authentication.
+	     */
+	    get name() {
+	        return this._name;
+	    }
+	    /**
+	     * Create an instance of an AzureNamedKeyCredential for use
+	     * with a service client.
+	     *
+	     * @param name - The initial value of the name to use in authentication.
+	     * @param key - The initial value of the key to use in authentication.
+	     */
+	    constructor(name, key) {
+	        if (!name || !key) {
+	            throw new TypeError("name and key must be non-empty strings");
+	        }
+	        this._name = name;
+	        this._key = key;
+	    }
+	    /**
+	     * Change the value of the key.
+	     *
+	     * Updates will take effect upon the next request after
+	     * updating the key value.
+	     *
+	     * @param newName - The new name value to be used.
+	     * @param newKey - The new key value to be used.
+	     */
+	    update(newName, newKey) {
+	        if (!newName || !newKey) {
+	            throw new TypeError("newName and newKey must be non-empty strings");
+	        }
+	        this._name = newName;
+	        this._key = newKey;
+	    }
+	}
+	azureNamedKeyCredential.AzureNamedKeyCredential = AzureNamedKeyCredential;
+	/**
+	 * Tests an object to determine whether it implements NamedKeyCredential.
+	 *
+	 * @param credential - The assumed NamedKeyCredential to be tested.
+	 */
+	function isNamedKeyCredential(credential) {
+	    return ((0, core_util_1.isObjectWithProperties)(credential, ["name", "key"]) &&
+	        typeof credential.key === "string" &&
+	        typeof credential.name === "string");
+	}
+	
+	return azureNamedKeyCredential;
+}
+
+var azureSASCredential = {};
+
+var hasRequiredAzureSASCredential;
+
+function requireAzureSASCredential () {
+	if (hasRequiredAzureSASCredential) return azureSASCredential;
+	hasRequiredAzureSASCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(azureSASCredential, "__esModule", { value: true });
+	azureSASCredential.AzureSASCredential = void 0;
+	azureSASCredential.isSASCredential = isSASCredential;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	/**
+	 * A static-signature-based credential that supports updating
+	 * the underlying signature value.
+	 */
+	class AzureSASCredential {
+	    _signature;
+	    /**
+	     * The value of the shared access signature to be used in authentication
+	     */
+	    get signature() {
+	        return this._signature;
+	    }
+	    /**
+	     * Create an instance of an AzureSASCredential for use
+	     * with a service client.
+	     *
+	     * @param signature - The initial value of the shared access signature to use in authentication
+	     */
+	    constructor(signature) {
+	        if (!signature) {
+	            throw new Error("shared access signature must be a non-empty string");
+	        }
+	        this._signature = signature;
+	    }
+	    /**
+	     * Change the value of the signature.
+	     *
+	     * Updates will take effect upon the next request after
+	     * updating the signature value.
+	     *
+	     * @param newSignature - The new shared access signature value to be used
+	     */
+	    update(newSignature) {
+	        if (!newSignature) {
+	            throw new Error("shared access signature must be a non-empty string");
+	        }
+	        this._signature = newSignature;
+	    }
+	}
+	azureSASCredential.AzureSASCredential = AzureSASCredential;
+	/**
+	 * Tests an object to determine whether it implements SASCredential.
+	 *
+	 * @param credential - The assumed SASCredential to be tested.
+	 */
+	function isSASCredential(credential) {
+	    return ((0, core_util_1.isObjectWithProperties)(credential, ["signature"]) && typeof credential.signature === "string");
+	}
+	
+	return azureSASCredential;
+}
+
+var tokenCredential = {};
+
+var hasRequiredTokenCredential;
+
+function requireTokenCredential () {
+	if (hasRequiredTokenCredential) return tokenCredential;
+	hasRequiredTokenCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(tokenCredential, "__esModule", { value: true });
+	tokenCredential.isBearerToken = isBearerToken;
+	tokenCredential.isPopToken = isPopToken;
+	tokenCredential.isTokenCredential = isTokenCredential;
+	/**
+	 * @internal
+	 * @param accessToken - Access token
+	 * @returns Whether a token is bearer type or not
+	 */
+	function isBearerToken(accessToken) {
+	    return !accessToken.tokenType || accessToken.tokenType === "Bearer";
+	}
+	/**
+	 * @internal
+	 * @param accessToken - Access token
+	 * @returns Whether a token is Pop token or not
+	 */
+	function isPopToken(accessToken) {
+	    return accessToken.tokenType === "pop";
+	}
+	/**
+	 * Tests an object to determine whether it implements TokenCredential.
+	 *
+	 * @param credential - The assumed TokenCredential to be tested.
+	 */
+	function isTokenCredential(credential) {
+	    // Check for an object with a 'getToken' function and possibly with
+	    // a 'signRequest' function.  We do this check to make sure that
+	    // a ServiceClientCredentials implementor (like TokenClientCredentials
+	    // in ms-rest-nodeauth) doesn't get mistaken for a TokenCredential if
+	    // it doesn't actually implement TokenCredential also.
+	    const castCredential = credential;
+	    return (castCredential &&
+	        typeof castCredential.getToken === "function" &&
+	        (castCredential.signRequest === undefined || castCredential.getToken.length > 0));
+	}
+	
+	return tokenCredential;
+}
+
+var hasRequiredCommonjs$8;
+
+function requireCommonjs$8 () {
+	if (hasRequiredCommonjs$8) return commonjs$7;
+	hasRequiredCommonjs$8 = 1;
+	(function (exports$1) {
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.isTokenCredential = exports$1.isSASCredential = exports$1.AzureSASCredential = exports$1.isNamedKeyCredential = exports$1.AzureNamedKeyCredential = exports$1.isKeyCredential = exports$1.AzureKeyCredential = void 0;
+		var azureKeyCredential_js_1 = requireAzureKeyCredential();
+		Object.defineProperty(exports$1, "AzureKeyCredential", { enumerable: true, get: function () { return azureKeyCredential_js_1.AzureKeyCredential; } });
+		var keyCredential_js_1 = requireKeyCredential();
+		Object.defineProperty(exports$1, "isKeyCredential", { enumerable: true, get: function () { return keyCredential_js_1.isKeyCredential; } });
+		var azureNamedKeyCredential_js_1 = requireAzureNamedKeyCredential();
+		Object.defineProperty(exports$1, "AzureNamedKeyCredential", { enumerable: true, get: function () { return azureNamedKeyCredential_js_1.AzureNamedKeyCredential; } });
+		Object.defineProperty(exports$1, "isNamedKeyCredential", { enumerable: true, get: function () { return azureNamedKeyCredential_js_1.isNamedKeyCredential; } });
+		var azureSASCredential_js_1 = requireAzureSASCredential();
+		Object.defineProperty(exports$1, "AzureSASCredential", { enumerable: true, get: function () { return azureSASCredential_js_1.AzureSASCredential; } });
+		Object.defineProperty(exports$1, "isSASCredential", { enumerable: true, get: function () { return azureSASCredential_js_1.isSASCredential; } });
+		var tokenCredential_js_1 = requireTokenCredential();
+		Object.defineProperty(exports$1, "isTokenCredential", { enumerable: true, get: function () { return tokenCredential_js_1.isTokenCredential; } });
+		
+	} (commonjs$7));
+	return commonjs$7;
+}
+
+var Pipeline = {};
+
+var commonjs$6 = {};
+
+var extendedClient = {};
+
+var disableKeepAlivePolicy = {};
+
+var hasRequiredDisableKeepAlivePolicy;
+
+function requireDisableKeepAlivePolicy () {
+	if (hasRequiredDisableKeepAlivePolicy) return disableKeepAlivePolicy;
+	hasRequiredDisableKeepAlivePolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.disableKeepAlivePolicyName = void 0;
+		exports$1.createDisableKeepAlivePolicy = createDisableKeepAlivePolicy;
+		exports$1.pipelineContainsDisableKeepAlivePolicy = pipelineContainsDisableKeepAlivePolicy;
+		exports$1.disableKeepAlivePolicyName = "DisableKeepAlivePolicy";
+		function createDisableKeepAlivePolicy() {
+		    return {
+		        name: exports$1.disableKeepAlivePolicyName,
+		        async sendRequest(request, next) {
+		            request.disableKeepAlive = true;
+		            return next(request);
+		        },
+		    };
+		}
+		/**
+		 * @internal
+		 */
+		function pipelineContainsDisableKeepAlivePolicy(pipeline) {
+		    return pipeline.getOrderedPolicies().some((policy) => policy.name === exports$1.disableKeepAlivePolicyName);
+		}
+		
+	} (disableKeepAlivePolicy));
+	return disableKeepAlivePolicy;
+}
+
+var commonjs$5 = {};
+
+var serializer = {};
+
+var base64 = {};
+
+var hasRequiredBase64;
+
+function requireBase64 () {
+	if (hasRequiredBase64) return base64;
+	hasRequiredBase64 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(base64, "__esModule", { value: true });
+	base64.encodeString = encodeString;
+	base64.encodeByteArray = encodeByteArray;
+	base64.decodeString = decodeString;
+	base64.decodeStringToString = decodeStringToString;
+	/**
+	 * Encodes a string in base64 format.
+	 * @param value - the string to encode
+	 * @internal
+	 */
+	function encodeString(value) {
+	    return Buffer.from(value).toString("base64");
+	}
+	/**
+	 * Encodes a byte array in base64 format.
+	 * @param value - the Uint8Aray to encode
+	 * @internal
+	 */
+	function encodeByteArray(value) {
+	    const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);
+	    return bufferValue.toString("base64");
+	}
+	/**
+	 * Decodes a base64 string into a byte array.
+	 * @param value - the base64 string to decode
+	 * @internal
+	 */
+	function decodeString(value) {
+	    return Buffer.from(value, "base64");
+	}
+	/**
+	 * Decodes a base64 string into a string.
+	 * @param value - the base64 string to decode
+	 * @internal
+	 */
+	function decodeStringToString(value) {
+	    return Buffer.from(value, "base64").toString();
+	}
+	
+	return base64;
+}
+
+var interfaces = {};
+
+var hasRequiredInterfaces;
+
+function requireInterfaces () {
+	if (hasRequiredInterfaces) return interfaces;
+	hasRequiredInterfaces = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(interfaces, "__esModule", { value: true });
+	interfaces.XML_CHARKEY = interfaces.XML_ATTRKEY = void 0;
+	/**
+	 * Default key used to access the XML attributes.
+	 */
+	interfaces.XML_ATTRKEY = "$";
+	/**
+	 * Default key used to access the XML value content.
+	 */
+	interfaces.XML_CHARKEY = "_";
+	
+	return interfaces;
+}
+
+var utils$2 = {};
+
+var hasRequiredUtils$2;
+
+function requireUtils$2 () {
+	if (hasRequiredUtils$2) return utils$2;
+	hasRequiredUtils$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(utils$2, "__esModule", { value: true });
+	utils$2.isPrimitiveBody = isPrimitiveBody;
+	utils$2.isDuration = isDuration;
+	utils$2.isValidUuid = isValidUuid;
+	utils$2.flattenResponse = flattenResponse;
+	/**
+	 * A type guard for a primitive response body.
+	 * @param value - Value to test
+	 *
+	 * @internal
+	 */
+	function isPrimitiveBody(value, mapperTypeName) {
+	    return (mapperTypeName !== "Composite" &&
+	        mapperTypeName !== "Dictionary" &&
+	        (typeof value === "string" ||
+	            typeof value === "number" ||
+	            typeof value === "boolean" ||
+	            mapperTypeName?.match(/^(Date|DateTime|DateTimeRfc1123|UnixTime|ByteArray|Base64Url)$/i) !==
+	                null ||
+	            value === undefined ||
+	            value === null));
+	}
+	const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
+	/**
+	 * Returns true if the given string is in ISO 8601 format.
+	 * @param value - The value to be validated for ISO 8601 duration format.
+	 * @internal
+	 */
+	function isDuration(value) {
+	    return validateISODuration.test(value);
+	}
+	const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
+	/**
+	 * Returns true if the provided uuid is valid.
+	 *
+	 * @param uuid - The uuid that needs to be validated.
+	 *
+	 * @internal
+	 */
+	function isValidUuid(uuid) {
+	    return validUuidRegex.test(uuid);
+	}
+	/**
+	 * Maps the response as follows:
+	 * - wraps the response body if needed (typically if its type is primitive).
+	 * - returns null if the combination of the headers and the body is empty.
+	 * - otherwise, returns the combination of the headers and the body.
+	 *
+	 * @param responseObject - a representation of the parsed response
+	 * @returns the response that will be returned to the user which can be null and/or wrapped
+	 *
+	 * @internal
+	 */
+	function handleNullableResponseAndWrappableBody(responseObject) {
+	    const combinedHeadersAndBody = {
+	        ...responseObject.headers,
+	        ...responseObject.body,
+	    };
+	    if (responseObject.hasNullableType &&
+	        Object.getOwnPropertyNames(combinedHeadersAndBody).length === 0) {
+	        return responseObject.shouldWrapBody ? { body: null } : null;
+	    }
+	    else {
+	        return responseObject.shouldWrapBody
+	            ? {
+	                ...responseObject.headers,
+	                body: responseObject.body,
+	            }
+	            : combinedHeadersAndBody;
+	    }
+	}
+	/**
+	 * Take a `FullOperationResponse` and turn it into a flat
+	 * response object to hand back to the consumer.
+	 * @param fullResponse - The processed response from the operation request
+	 * @param responseSpec - The response map from the OperationSpec
+	 *
+	 * @internal
+	 */
+	function flattenResponse(fullResponse, responseSpec) {
+	    const parsedHeaders = fullResponse.parsedHeaders;
+	    // head methods never have a body, but we return a boolean set to body property
+	    // to indicate presence/absence of the resource
+	    if (fullResponse.request.method === "HEAD") {
+	        return {
+	            ...parsedHeaders,
+	            body: fullResponse.parsedBody,
+	        };
+	    }
+	    const bodyMapper = responseSpec && responseSpec.bodyMapper;
+	    const isNullable = Boolean(bodyMapper?.nullable);
+	    const expectedBodyTypeName = bodyMapper?.type.name;
+	    /** If the body is asked for, we look at the expected body type to handle it */
+	    if (expectedBodyTypeName === "Stream") {
+	        return {
+	            ...parsedHeaders,
+	            blobBody: fullResponse.blobBody,
+	            readableStreamBody: fullResponse.readableStreamBody,
+	        };
+	    }
+	    const modelProperties = (expectedBodyTypeName === "Composite" &&
+	        bodyMapper.type.modelProperties) ||
+	        {};
+	    const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
+	    if (expectedBodyTypeName === "Sequence" || isPageableResponse) {
+	        const arrayResponse = fullResponse.parsedBody ?? [];
+	        for (const key of Object.keys(modelProperties)) {
+	            if (modelProperties[key].serializedName) {
+	                arrayResponse[key] = fullResponse.parsedBody?.[key];
+	            }
+	        }
+	        if (parsedHeaders) {
+	            for (const key of Object.keys(parsedHeaders)) {
+	                arrayResponse[key] = parsedHeaders[key];
+	            }
+	        }
+	        return isNullable &&
+	            !fullResponse.parsedBody &&
+	            !parsedHeaders &&
+	            Object.getOwnPropertyNames(modelProperties).length === 0
+	            ? null
+	            : arrayResponse;
+	    }
+	    return handleNullableResponseAndWrappableBody({
+	        body: fullResponse.parsedBody,
+	        headers: parsedHeaders,
+	        hasNullableType: isNullable,
+	        shouldWrapBody: isPrimitiveBody(fullResponse.parsedBody, expectedBodyTypeName),
+	    });
+	}
+	
+	return utils$2;
+}
+
+var hasRequiredSerializer;
+
+function requireSerializer () {
+	if (hasRequiredSerializer) return serializer;
+	hasRequiredSerializer = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(serializer, "__esModule", { value: true });
+	serializer.MapperTypeNames = void 0;
+	serializer.createSerializer = createSerializer;
+	const tslib_1 = require$$0$2;
+	const base64 = tslib_1.__importStar(requireBase64());
+	const interfaces_js_1 = requireInterfaces();
+	const utils_js_1 = requireUtils$2();
+	class SerializerImpl {
+	    modelMappers;
+	    isXML;
+	    constructor(modelMappers = {}, isXML = false) {
+	        this.modelMappers = modelMappers;
+	        this.isXML = isXML;
+	    }
+	    /**
+	     * @deprecated Removing the constraints validation on client side.
+	     */
+	    validateConstraints(mapper, value, objectName) {
+	        const failValidation = (constraintName, constraintValue) => {
+	            throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
+	        };
+	        if (mapper.constraints && value !== undefined && value !== null) {
+	            const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
+	            if (ExclusiveMaximum !== undefined && value >= ExclusiveMaximum) {
+	                failValidation("ExclusiveMaximum", ExclusiveMaximum);
+	            }
+	            if (ExclusiveMinimum !== undefined && value <= ExclusiveMinimum) {
+	                failValidation("ExclusiveMinimum", ExclusiveMinimum);
+	            }
+	            if (InclusiveMaximum !== undefined && value > InclusiveMaximum) {
+	                failValidation("InclusiveMaximum", InclusiveMaximum);
+	            }
+	            if (InclusiveMinimum !== undefined && value < InclusiveMinimum) {
+	                failValidation("InclusiveMinimum", InclusiveMinimum);
+	            }
+	            if (MaxItems !== undefined && value.length > MaxItems) {
+	                failValidation("MaxItems", MaxItems);
+	            }
+	            if (MaxLength !== undefined && value.length > MaxLength) {
+	                failValidation("MaxLength", MaxLength);
+	            }
+	            if (MinItems !== undefined && value.length < MinItems) {
+	                failValidation("MinItems", MinItems);
+	            }
+	            if (MinLength !== undefined && value.length < MinLength) {
+	                failValidation("MinLength", MinLength);
+	            }
+	            if (MultipleOf !== undefined && value % MultipleOf !== 0) {
+	                failValidation("MultipleOf", MultipleOf);
+	            }
+	            if (Pattern) {
+	                const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
+	                if (typeof value !== "string" || value.match(pattern) === null) {
+	                    failValidation("Pattern", Pattern);
+	                }
+	            }
+	            if (UniqueItems &&
+	                value.some((item, i, ar) => ar.indexOf(item) !== i)) {
+	                failValidation("UniqueItems", UniqueItems);
+	            }
+	        }
+	    }
+	    /**
+	     * Serialize the given object based on its metadata defined in the mapper
+	     *
+	     * @param mapper - The mapper which defines the metadata of the serializable object
+	     *
+	     * @param object - A valid Javascript object to be serialized
+	     *
+	     * @param objectName - Name of the serialized object
+	     *
+	     * @param options - additional options to serialization
+	     *
+	     * @returns A valid serialized Javascript object
+	     */
+	    serialize(mapper, object, objectName, options = { xml: {} }) {
+	        const updatedOptions = {
+	            xml: {
+	                rootName: options.xml.rootName ?? "",
+	                includeRoot: options.xml.includeRoot ?? false,
+	                xmlCharKey: options.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
+	            },
+	        };
+	        let payload = {};
+	        const mapperType = mapper.type.name;
+	        if (!objectName) {
+	            objectName = mapper.serializedName;
+	        }
+	        if (mapperType.match(/^Sequence$/i) !== null) {
+	            payload = [];
+	        }
+	        if (mapper.isConstant) {
+	            object = mapper.defaultValue;
+	        }
+	        // This table of allowed values should help explain
+	        // the mapper.required and mapper.nullable properties.
+	        // X means "neither undefined or null are allowed".
+	        //           || required
+	        //           || true      | false
+	        //  nullable || ==========================
+	        //      true || null      | undefined/null
+	        //     false || X         | undefined
+	        // undefined || X         | undefined/null
+	        const { required, nullable } = mapper;
+	        if (required && nullable && object === undefined) {
+	            throw new Error(`${objectName} cannot be undefined.`);
+	        }
+	        if (required && !nullable && (object === undefined || object === null)) {
+	            throw new Error(`${objectName} cannot be null or undefined.`);
+	        }
+	        if (!required && nullable === false && object === null) {
+	            throw new Error(`${objectName} cannot be null.`);
+	        }
+	        if (object === undefined || object === null) {
+	            payload = object;
+	        }
+	        else {
+	            if (mapperType.match(/^any$/i) !== null) {
+	                payload = object;
+	            }
+	            else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
+	                payload = serializeBasicTypes(mapperType, objectName, object);
+	            }
+	            else if (mapperType.match(/^Enum$/i) !== null) {
+	                const enumMapper = mapper;
+	                payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
+	            }
+	            else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
+	                payload = serializeDateTypes(mapperType, object, objectName);
+	            }
+	            else if (mapperType.match(/^ByteArray$/i) !== null) {
+	                payload = serializeByteArrayType(objectName, object);
+	            }
+	            else if (mapperType.match(/^Base64Url$/i) !== null) {
+	                payload = serializeBase64UrlType(objectName, object);
+	            }
+	            else if (mapperType.match(/^Sequence$/i) !== null) {
+	                payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
+	            }
+	            else if (mapperType.match(/^Dictionary$/i) !== null) {
+	                payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
+	            }
+	            else if (mapperType.match(/^Composite$/i) !== null) {
+	                payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
+	            }
+	        }
+	        return payload;
+	    }
+	    /**
+	     * Deserialize the given object based on its metadata defined in the mapper
+	     *
+	     * @param mapper - The mapper which defines the metadata of the serializable object
+	     *
+	     * @param responseBody - A valid Javascript entity to be deserialized
+	     *
+	     * @param objectName - Name of the deserialized object
+	     *
+	     * @param options - Controls behavior of XML parser and builder.
+	     *
+	     * @returns A valid deserialized Javascript object
+	     */
+	    deserialize(mapper, responseBody, objectName, options = { xml: {} }) {
+	        const updatedOptions = {
+	            xml: {
+	                rootName: options.xml.rootName ?? "",
+	                includeRoot: options.xml.includeRoot ?? false,
+	                xmlCharKey: options.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
+	            },
+	            ignoreUnknownProperties: options.ignoreUnknownProperties ?? false,
+	        };
+	        if (responseBody === undefined || responseBody === null) {
+	            if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
+	                // Edge case for empty XML non-wrapped lists. xml2js can't distinguish
+	                // between the list being empty versus being missing,
+	                // so let's do the more user-friendly thing and return an empty list.
+	                responseBody = [];
+	            }
+	            // specifically check for undefined as default value can be a falsey value `0, "", false, null`
+	            if (mapper.defaultValue !== undefined) {
+	                responseBody = mapper.defaultValue;
+	            }
+	            return responseBody;
+	        }
+	        let payload;
+	        const mapperType = mapper.type.name;
+	        if (!objectName) {
+	            objectName = mapper.serializedName;
+	        }
+	        if (mapperType.match(/^Composite$/i) !== null) {
+	            payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
+	        }
+	        else {
+	            if (this.isXML) {
+	                const xmlCharKey = updatedOptions.xml.xmlCharKey;
+	                /**
+	                 * If the mapper specifies this as a non-composite type value but the responseBody contains
+	                 * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
+	                 * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
+	                 */
+	                if (responseBody[interfaces_js_1.XML_ATTRKEY] !== undefined && responseBody[xmlCharKey] !== undefined) {
+	                    responseBody = responseBody[xmlCharKey];
+	                }
+	            }
+	            if (mapperType.match(/^Number$/i) !== null) {
+	                payload = parseFloat(responseBody);
+	                if (isNaN(payload)) {
+	                    payload = responseBody;
+	                }
+	            }
+	            else if (mapperType.match(/^Boolean$/i) !== null) {
+	                if (responseBody === "true") {
+	                    payload = true;
+	                }
+	                else if (responseBody === "false") {
+	                    payload = false;
+	                }
+	                else {
+	                    payload = responseBody;
+	                }
+	            }
+	            else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
+	                payload = responseBody;
+	            }
+	            else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
+	                payload = new Date(responseBody);
+	            }
+	            else if (mapperType.match(/^UnixTime$/i) !== null) {
+	                payload = unixTimeToDate(responseBody);
+	            }
+	            else if (mapperType.match(/^ByteArray$/i) !== null) {
+	                payload = base64.decodeString(responseBody);
+	            }
+	            else if (mapperType.match(/^Base64Url$/i) !== null) {
+	                payload = base64UrlToByteArray(responseBody);
+	            }
+	            else if (mapperType.match(/^Sequence$/i) !== null) {
+	                payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
+	            }
+	            else if (mapperType.match(/^Dictionary$/i) !== null) {
+	                payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
+	            }
+	        }
+	        if (mapper.isConstant) {
+	            payload = mapper.defaultValue;
+	        }
+	        return payload;
+	    }
+	}
+	/**
+	 * Method that creates and returns a Serializer.
+	 * @param modelMappers - Known models to map
+	 * @param isXML - If XML should be supported
+	 */
+	function createSerializer(modelMappers = {}, isXML = false) {
+	    return new SerializerImpl(modelMappers, isXML);
+	}
+	function trimEnd(str, ch) {
+	    let len = str.length;
+	    while (len - 1 >= 0 && str[len - 1] === ch) {
+	        --len;
+	    }
+	    return str.substr(0, len);
+	}
+	function bufferToBase64Url(buffer) {
+	    if (!buffer) {
+	        return undefined;
+	    }
+	    if (!(buffer instanceof Uint8Array)) {
+	        throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
+	    }
+	    // Uint8Array to Base64.
+	    const str = base64.encodeByteArray(buffer);
+	    // Base64 to Base64Url.
+	    return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
+	}
+	function base64UrlToByteArray(str) {
+	    if (!str) {
+	        return undefined;
+	    }
+	    if (str && typeof str.valueOf() !== "string") {
+	        throw new Error("Please provide an input of type string for converting to Uint8Array");
+	    }
+	    // Base64Url to Base64.
+	    str = str.replace(/-/g, "+").replace(/_/g, "/");
+	    // Base64 to Uint8Array.
+	    return base64.decodeString(str);
+	}
+	function splitSerializeName(prop) {
+	    const classes = [];
+	    let partialclass = "";
+	    if (prop) {
+	        const subwords = prop.split(".");
+	        for (const item of subwords) {
+	            if (item.charAt(item.length - 1) === "\\") {
+	                partialclass += item.substr(0, item.length - 1) + ".";
+	            }
+	            else {
+	                partialclass += item;
+	                classes.push(partialclass);
+	                partialclass = "";
+	            }
+	        }
+	    }
+	    return classes;
+	}
+	function dateToUnixTime(d) {
+	    if (!d) {
+	        return undefined;
+	    }
+	    if (typeof d.valueOf() === "string") {
+	        d = new Date(d);
+	    }
+	    return Math.floor(d.getTime() / 1000);
+	}
+	function unixTimeToDate(n) {
+	    if (!n) {
+	        return undefined;
+	    }
+	    return new Date(n * 1000);
+	}
+	function serializeBasicTypes(typeName, objectName, value) {
+	    if (value !== null && value !== undefined) {
+	        if (typeName.match(/^Number$/i) !== null) {
+	            if (typeof value !== "number") {
+	                throw new Error(`${objectName} with value ${value} must be of type number.`);
+	            }
+	        }
+	        else if (typeName.match(/^String$/i) !== null) {
+	            if (typeof value.valueOf() !== "string") {
+	                throw new Error(`${objectName} with value "${value}" must be of type string.`);
+	            }
+	        }
+	        else if (typeName.match(/^Uuid$/i) !== null) {
+	            if (!(typeof value.valueOf() === "string" && (0, utils_js_1.isValidUuid)(value))) {
+	                throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
+	            }
+	        }
+	        else if (typeName.match(/^Boolean$/i) !== null) {
+	            if (typeof value !== "boolean") {
+	                throw new Error(`${objectName} with value ${value} must be of type boolean.`);
+	            }
+	        }
+	        else if (typeName.match(/^Stream$/i) !== null) {
+	            const objectType = typeof value;
+	            if (objectType !== "string" &&
+	                typeof value.pipe !== "function" && // NodeJS.ReadableStream
+	                typeof value.tee !== "function" && // browser ReadableStream
+	                !(value instanceof ArrayBuffer) &&
+	                !ArrayBuffer.isView(value) &&
+	                // File objects count as a type of Blob, so we want to use instanceof explicitly
+	                !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob) &&
+	                objectType !== "function") {
+	                throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, ReadableStream, or () => ReadableStream.`);
+	            }
+	        }
+	    }
+	    return value;
+	}
+	function serializeEnumType(objectName, allowedValues, value) {
+	    if (!allowedValues) {
+	        throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
+	    }
+	    const isPresent = allowedValues.some((item) => {
+	        if (typeof item.valueOf() === "string") {
+	            return item.toLowerCase() === value.toLowerCase();
+	        }
+	        return item === value;
+	    });
+	    if (!isPresent) {
+	        throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
+	    }
+	    return value;
+	}
+	function serializeByteArrayType(objectName, value) {
+	    if (value !== undefined && value !== null) {
+	        if (!(value instanceof Uint8Array)) {
+	            throw new Error(`${objectName} must be of type Uint8Array.`);
+	        }
+	        value = base64.encodeByteArray(value);
+	    }
+	    return value;
+	}
+	function serializeBase64UrlType(objectName, value) {
+	    if (value !== undefined && value !== null) {
+	        if (!(value instanceof Uint8Array)) {
+	            throw new Error(`${objectName} must be of type Uint8Array.`);
+	        }
+	        value = bufferToBase64Url(value);
+	    }
+	    return value;
+	}
+	function serializeDateTypes(typeName, value, objectName) {
+	    if (value !== undefined && value !== null) {
+	        if (typeName.match(/^Date$/i) !== null) {
+	            if (!(value instanceof Date ||
+	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
+	                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
+	            }
+	            value =
+	                value instanceof Date
+	                    ? value.toISOString().substring(0, 10)
+	                    : new Date(value).toISOString().substring(0, 10);
+	        }
+	        else if (typeName.match(/^DateTime$/i) !== null) {
+	            if (!(value instanceof Date ||
+	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
+	                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
+	            }
+	            value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
+	        }
+	        else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
+	            if (!(value instanceof Date ||
+	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
+	                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
+	            }
+	            value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
+	        }
+	        else if (typeName.match(/^UnixTime$/i) !== null) {
+	            if (!(value instanceof Date ||
+	                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
+	                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
+	                    `for it to be serialized in UnixTime/Epoch format.`);
+	            }
+	            value = dateToUnixTime(value);
+	        }
+	        else if (typeName.match(/^TimeSpan$/i) !== null) {
+	            if (!(0, utils_js_1.isDuration)(value)) {
+	                throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
+	            }
+	        }
+	    }
+	    return value;
+	}
+	function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
+	    if (!Array.isArray(object)) {
+	        throw new Error(`${objectName} must be of type Array.`);
+	    }
+	    let elementType = mapper.type.element;
+	    if (!elementType || typeof elementType !== "object") {
+	        throw new Error(`element" metadata for an Array must be defined in the ` +
+	            `mapper and it must of type "object" in ${objectName}.`);
+	    }
+	    // Quirk: Composite mappers referenced by `element` might
+	    // not have *all* properties declared (like uberParent),
+	    // so let's try to look up the full definition by name.
+	    if (elementType.type.name === "Composite" && elementType.type.className) {
+	        elementType = serializer.modelMappers[elementType.type.className] ?? elementType;
+	    }
+	    const tempArray = [];
+	    for (let i = 0; i < object.length; i++) {
+	        const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
+	        if (isXml && elementType.xmlNamespace) {
+	            const xmlnsKey = elementType.xmlNamespacePrefix
+	                ? `xmlns:${elementType.xmlNamespacePrefix}`
+	                : "xmlns";
+	            if (elementType.type.name === "Composite") {
+	                tempArray[i] = { ...serializedValue };
+	                tempArray[i][interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
+	            }
+	            else {
+	                tempArray[i] = {};
+	                tempArray[i][options.xml.xmlCharKey] = serializedValue;
+	                tempArray[i][interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
+	            }
+	        }
+	        else {
+	            tempArray[i] = serializedValue;
+	        }
+	    }
+	    return tempArray;
+	}
+	function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
+	    if (typeof object !== "object") {
+	        throw new Error(`${objectName} must be of type object.`);
+	    }
+	    const valueType = mapper.type.value;
+	    if (!valueType || typeof valueType !== "object") {
+	        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
+	            `mapper and it must of type "object" in ${objectName}.`);
+	    }
+	    const tempDictionary = {};
+	    for (const key of Object.keys(object)) {
+	        const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
+	        // If the element needs an XML namespace we need to add it within the $ property
+	        tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
+	    }
+	    // Add the namespace to the root element if needed
+	    if (isXml && mapper.xmlNamespace) {
+	        const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
+	        const result = tempDictionary;
+	        result[interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
+	        return result;
+	    }
+	    return tempDictionary;
+	}
+	/**
+	 * Resolves the additionalProperties property from a referenced mapper
+	 * @param serializer - the serializer containing the entire set of mappers
+	 * @param mapper - the composite mapper to resolve
+	 * @param objectName - name of the object being serialized
+	 */
+	function resolveAdditionalProperties(serializer, mapper, objectName) {
+	    const additionalProperties = mapper.type.additionalProperties;
+	    if (!additionalProperties && mapper.type.className) {
+	        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
+	        return modelMapper?.type.additionalProperties;
+	    }
+	    return additionalProperties;
+	}
+	/**
+	 * Finds the mapper referenced by className
+	 * @param serializer - the serializer containing the entire set of mappers
+	 * @param mapper - the composite mapper to resolve
+	 * @param objectName - name of the object being serialized
+	 */
+	function resolveReferencedMapper(serializer, mapper, objectName) {
+	    const className = mapper.type.className;
+	    if (!className) {
+	        throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
+	    }
+	    return serializer.modelMappers[className];
+	}
+	/**
+	 * Resolves a composite mapper's modelProperties.
+	 * @param serializer - the serializer containing the entire set of mappers
+	 * @param mapper - the composite mapper to resolve
+	 */
+	function resolveModelProperties(serializer, mapper, objectName) {
+	    let modelProps = mapper.type.modelProperties;
+	    if (!modelProps) {
+	        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
+	        if (!modelMapper) {
+	            throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
+	        }
+	        modelProps = modelMapper?.type.modelProperties;
+	        if (!modelProps) {
+	            throw new Error(`modelProperties cannot be null or undefined in the ` +
+	                `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
+	        }
+	    }
+	    return modelProps;
+	}
+	function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
+	    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
+	        mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
+	    }
+	    if (object !== undefined && object !== null) {
+	        const payload = {};
+	        const modelProps = resolveModelProperties(serializer, mapper, objectName);
+	        for (const key of Object.keys(modelProps)) {
+	            const propertyMapper = modelProps[key];
+	            if (propertyMapper.readOnly) {
+	                continue;
+	            }
+	            let propName;
+	            let parentObject = payload;
+	            if (serializer.isXML) {
+	                if (propertyMapper.xmlIsWrapped) {
+	                    propName = propertyMapper.xmlName;
+	                }
+	                else {
+	                    propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
+	                }
+	            }
+	            else {
+	                const paths = splitSerializeName(propertyMapper.serializedName);
+	                propName = paths.pop();
+	                for (const pathName of paths) {
+	                    const childObject = parentObject[pathName];
+	                    if ((childObject === undefined || childObject === null) &&
+	                        ((object[key] !== undefined && object[key] !== null) ||
+	                            propertyMapper.defaultValue !== undefined)) {
+	                        parentObject[pathName] = {};
+	                    }
+	                    parentObject = parentObject[pathName];
+	                }
+	            }
+	            if (parentObject !== undefined && parentObject !== null) {
+	                if (isXml && mapper.xmlNamespace) {
+	                    const xmlnsKey = mapper.xmlNamespacePrefix
+	                        ? `xmlns:${mapper.xmlNamespacePrefix}`
+	                        : "xmlns";
+	                    parentObject[interfaces_js_1.XML_ATTRKEY] = {
+	                        ...parentObject[interfaces_js_1.XML_ATTRKEY],
+	                        [xmlnsKey]: mapper.xmlNamespace,
+	                    };
+	                }
+	                const propertyObjectName = propertyMapper.serializedName !== ""
+	                    ? objectName + "." + propertyMapper.serializedName
+	                    : objectName;
+	                let toSerialize = object[key];
+	                const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
+	                if (polymorphicDiscriminator &&
+	                    polymorphicDiscriminator.clientName === key &&
+	                    (toSerialize === undefined || toSerialize === null)) {
+	                    toSerialize = mapper.serializedName;
+	                }
+	                const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
+	                if (serializedValue !== undefined && propName !== undefined && propName !== null) {
+	                    const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
+	                    if (isXml && propertyMapper.xmlIsAttribute) {
+	                        // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
+	                        // This keeps things simple while preventing name collision
+	                        // with names in user documents.
+	                        parentObject[interfaces_js_1.XML_ATTRKEY] = parentObject[interfaces_js_1.XML_ATTRKEY] || {};
+	                        parentObject[interfaces_js_1.XML_ATTRKEY][propName] = serializedValue;
+	                    }
+	                    else if (isXml && propertyMapper.xmlIsWrapped) {
+	                        parentObject[propName] = { [propertyMapper.xmlElementName]: value };
+	                    }
+	                    else {
+	                        parentObject[propName] = value;
+	                    }
+	                }
+	            }
+	        }
+	        const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
+	        if (additionalPropertiesMapper) {
+	            const propNames = Object.keys(modelProps);
+	            for (const clientPropName in object) {
+	                const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
+	                if (isAdditionalProperty) {
+	                    payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options);
+	                }
+	            }
+	        }
+	        return payload;
+	    }
+	    return object;
+	}
+	function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
+	    if (!isXml || !propertyMapper.xmlNamespace) {
+	        return serializedValue;
+	    }
+	    const xmlnsKey = propertyMapper.xmlNamespacePrefix
+	        ? `xmlns:${propertyMapper.xmlNamespacePrefix}`
+	        : "xmlns";
+	    const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
+	    if (["Composite"].includes(propertyMapper.type.name)) {
+	        if (serializedValue[interfaces_js_1.XML_ATTRKEY]) {
+	            return serializedValue;
+	        }
+	        else {
+	            const result = { ...serializedValue };
+	            result[interfaces_js_1.XML_ATTRKEY] = xmlNamespace;
+	            return result;
+	        }
+	    }
+	    const result = {};
+	    result[options.xml.xmlCharKey] = serializedValue;
+	    result[interfaces_js_1.XML_ATTRKEY] = xmlNamespace;
+	    return result;
+	}
+	function isSpecialXmlProperty(propertyName, options) {
+	    return [interfaces_js_1.XML_ATTRKEY, options.xml.xmlCharKey].includes(propertyName);
+	}
+	function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
+	    const xmlCharKey = options.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY;
+	    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
+	        mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
+	    }
+	    const modelProps = resolveModelProperties(serializer, mapper, objectName);
+	    let instance = {};
+	    const handledPropertyNames = [];
+	    for (const key of Object.keys(modelProps)) {
+	        const propertyMapper = modelProps[key];
+	        const paths = splitSerializeName(modelProps[key].serializedName);
+	        handledPropertyNames.push(paths[0]);
+	        const { serializedName, xmlName, xmlElementName } = propertyMapper;
+	        let propertyObjectName = objectName;
+	        if (serializedName !== "" && serializedName !== undefined) {
+	            propertyObjectName = objectName + "." + serializedName;
+	        }
+	        const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
+	        if (headerCollectionPrefix) {
+	            const dictionary = {};
+	            for (const headerKey of Object.keys(responseBody)) {
+	                if (headerKey.startsWith(headerCollectionPrefix)) {
+	                    dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
+	                }
+	                handledPropertyNames.push(headerKey);
+	            }
+	            instance[key] = dictionary;
+	        }
+	        else if (serializer.isXML) {
+	            if (propertyMapper.xmlIsAttribute && responseBody[interfaces_js_1.XML_ATTRKEY]) {
+	                instance[key] = serializer.deserialize(propertyMapper, responseBody[interfaces_js_1.XML_ATTRKEY][xmlName], propertyObjectName, options);
+	            }
+	            else if (propertyMapper.xmlIsMsText) {
+	                if (responseBody[xmlCharKey] !== undefined) {
+	                    instance[key] = responseBody[xmlCharKey];
+	                }
+	                else if (typeof responseBody === "string") {
+	                    // The special case where xml parser parses "content" into JSON of
+	                    //   `{ name: "content"}` instead of `{ name: { "_": "content" }}`
+	                    instance[key] = responseBody;
+	                }
+	            }
+	            else {
+	                const propertyName = xmlElementName || xmlName || serializedName;
+	                if (propertyMapper.xmlIsWrapped) {
+	                    /* a list of  wrapped by 
+	                      For the xml example below
+	                        
+	                          ...
+	                          ...
+	                        
+	                      the responseBody has
+	                        {
+	                          Cors: {
+	                            CorsRule: [{...}, {...}]
+	                          }
+	                        }
+	                      xmlName is "Cors" and xmlElementName is"CorsRule".
+	                    */
+	                    const wrapped = responseBody[xmlName];
+	                    const elementList = wrapped?.[xmlElementName] ?? [];
+	                    instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);
+	                    handledPropertyNames.push(xmlName);
+	                }
+	                else {
+	                    const property = responseBody[propertyName];
+	                    instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
+	                    handledPropertyNames.push(propertyName);
+	                }
+	            }
+	        }
+	        else {
+	            // deserialize the property if it is present in the provided responseBody instance
+	            let propertyInstance;
+	            let res = responseBody;
+	            // traversing the object step by step.
+	            let steps = 0;
+	            for (const item of paths) {
+	                if (!res)
+	                    break;
+	                steps++;
+	                res = res[item];
+	            }
+	            // only accept null when reaching the last position of object otherwise it would be undefined
+	            if (res === null && steps < paths.length) {
+	                res = undefined;
+	            }
+	            propertyInstance = res;
+	            const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
+	            // checking that the model property name (key)(ex: "fishtype") and the
+	            // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
+	            // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
+	            // is a better approach. The generator is not consistent with escaping '\.' in the
+	            // serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
+	            // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
+	            // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
+	            // the transformation of model property name (ex: "fishtype") is done consistently.
+	            // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
+	            if (polymorphicDiscriminator &&
+	                key === polymorphicDiscriminator.clientName &&
+	                (propertyInstance === undefined || propertyInstance === null)) {
+	                propertyInstance = mapper.serializedName;
+	            }
+	            let serializedValue;
+	            // paging
+	            if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
+	                propertyInstance = responseBody[key];
+	                const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
+	                // Copy over any properties that have already been added into the instance, where they do
+	                // not exist on the newly de-serialized array
+	                for (const [k, v] of Object.entries(instance)) {
+	                    if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
+	                        arrayInstance[k] = v;
+	                    }
+	                }
+	                instance = arrayInstance;
+	            }
+	            else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
+	                serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
+	                instance[key] = serializedValue;
+	            }
+	        }
+	    }
+	    const additionalPropertiesMapper = mapper.type.additionalProperties;
+	    if (additionalPropertiesMapper) {
+	        const isAdditionalProperty = (responsePropName) => {
+	            for (const clientPropName in modelProps) {
+	                const paths = splitSerializeName(modelProps[clientPropName].serializedName);
+	                if (paths[0] === responsePropName) {
+	                    return false;
+	                }
+	            }
+	            return true;
+	        };
+	        for (const responsePropName in responseBody) {
+	            if (isAdditionalProperty(responsePropName)) {
+	                instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
+	            }
+	        }
+	    }
+	    else if (responseBody && !options.ignoreUnknownProperties) {
+	        for (const key of Object.keys(responseBody)) {
+	            if (instance[key] === undefined &&
+	                !handledPropertyNames.includes(key) &&
+	                !isSpecialXmlProperty(key, options)) {
+	                instance[key] = responseBody[key];
+	            }
+	        }
+	    }
+	    return instance;
+	}
+	function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
+	    /* jshint validthis: true */
+	    const value = mapper.type.value;
+	    if (!value || typeof value !== "object") {
+	        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
+	            `mapper and it must of type "object" in ${objectName}`);
+	    }
+	    if (responseBody) {
+	        const tempDictionary = {};
+	        for (const key of Object.keys(responseBody)) {
+	            tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
+	        }
+	        return tempDictionary;
+	    }
+	    return responseBody;
+	}
+	function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
+	    let element = mapper.type.element;
+	    if (!element || typeof element !== "object") {
+	        throw new Error(`element" metadata for an Array must be defined in the ` +
+	            `mapper and it must of type "object" in ${objectName}`);
+	    }
+	    if (responseBody) {
+	        if (!Array.isArray(responseBody)) {
+	            // xml2js will interpret a single element array as just the element, so force it to be an array
+	            responseBody = [responseBody];
+	        }
+	        // Quirk: Composite mappers referenced by `element` might
+	        // not have *all* properties declared (like uberParent),
+	        // so let's try to look up the full definition by name.
+	        if (element.type.name === "Composite" && element.type.className) {
+	            element = serializer.modelMappers[element.type.className] ?? element;
+	        }
+	        const tempArray = [];
+	        for (let i = 0; i < responseBody.length; i++) {
+	            tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
+	        }
+	        return tempArray;
+	    }
+	    return responseBody;
+	}
+	function getIndexDiscriminator(discriminators, discriminatorValue, typeName) {
+	    const typeNamesToCheck = [typeName];
+	    while (typeNamesToCheck.length) {
+	        const currentName = typeNamesToCheck.shift();
+	        const indexDiscriminator = discriminatorValue === currentName
+	            ? discriminatorValue
+	            : currentName + "." + discriminatorValue;
+	        if (Object.prototype.hasOwnProperty.call(discriminators, indexDiscriminator)) {
+	            return discriminators[indexDiscriminator];
+	        }
+	        else {
+	            for (const [name, mapper] of Object.entries(discriminators)) {
+	                if (name.startsWith(currentName + ".") &&
+	                    mapper.type.uberParent === currentName &&
+	                    mapper.type.className) {
+	                    typeNamesToCheck.push(mapper.type.className);
+	                }
+	            }
+	        }
+	    }
+	    return undefined;
+	}
+	function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
+	    const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
+	    if (polymorphicDiscriminator) {
+	        let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
+	        if (discriminatorName) {
+	            // The serializedName might have \\, which we just want to ignore
+	            if (polymorphicPropertyName === "serializedName") {
+	                discriminatorName = discriminatorName.replace(/\\/gi, "");
+	            }
+	            const discriminatorValue = object[discriminatorName];
+	            const typeName = mapper.type.uberParent ?? mapper.type.className;
+	            if (typeof discriminatorValue === "string" && typeName) {
+	                const polymorphicMapper = getIndexDiscriminator(serializer.modelMappers.discriminators, discriminatorValue, typeName);
+	                if (polymorphicMapper) {
+	                    mapper = polymorphicMapper;
+	                }
+	            }
+	        }
+	    }
+	    return mapper;
+	}
+	function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
+	    return (mapper.type.polymorphicDiscriminator ||
+	        getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
+	        getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
+	}
+	function getPolymorphicDiscriminatorSafely(serializer, typeName) {
+	    return (typeName &&
+	        serializer.modelMappers[typeName] &&
+	        serializer.modelMappers[typeName].type.polymorphicDiscriminator);
+	}
+	/**
+	 * Known types of Mappers
+	 */
+	serializer.MapperTypeNames = {
+	    Base64Url: "Base64Url",
+	    Boolean: "Boolean",
+	    ByteArray: "ByteArray",
+	    Composite: "Composite",
+	    Date: "Date",
+	    DateTime: "DateTime",
+	    DateTimeRfc1123: "DateTimeRfc1123",
+	    Dictionary: "Dictionary",
+	    Enum: "Enum",
+	    Number: "Number",
+	    Object: "Object",
+	    Sequence: "Sequence",
+	    String: "String",
+	    Stream: "Stream",
+	    TimeSpan: "TimeSpan",
+	    UnixTime: "UnixTime",
+	};
+	
+	return serializer;
+}
+
+var serviceClient = {};
+
+var pipeline = {};
+
+var deserializationPolicy = {};
+
+var operationHelpers = {};
+
+var state = {};
+
+var hasRequiredState;
+
+function requireState () {
+	if (hasRequiredState) return state;
+	hasRequiredState = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(state, "__esModule", { value: true });
+	state.state = void 0;
+	/**
+	 * Holds the singleton operationRequestMap, to be shared across CJS and ESM imports.
+	 */
+	state.state = {
+	    operationRequestMap: new WeakMap(),
+	};
+	
+	return state;
+}
+
+var hasRequiredOperationHelpers;
+
+function requireOperationHelpers () {
+	if (hasRequiredOperationHelpers) return operationHelpers;
+	hasRequiredOperationHelpers = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(operationHelpers, "__esModule", { value: true });
+	operationHelpers.getOperationArgumentValueFromParameter = getOperationArgumentValueFromParameter;
+	operationHelpers.getOperationRequestInfo = getOperationRequestInfo;
+	const state_js_1 = requireState();
+	/**
+	 * @internal
+	 * Retrieves the value to use for a given operation argument
+	 * @param operationArguments - The arguments passed from the generated client
+	 * @param parameter - The parameter description
+	 * @param fallbackObject - If something isn't found in the arguments bag, look here.
+	 *  Generally used to look at the service client properties.
+	 */
+	function getOperationArgumentValueFromParameter(operationArguments, parameter, fallbackObject) {
+	    let parameterPath = parameter.parameterPath;
+	    const parameterMapper = parameter.mapper;
+	    let value;
+	    if (typeof parameterPath === "string") {
+	        parameterPath = [parameterPath];
+	    }
+	    if (Array.isArray(parameterPath)) {
+	        if (parameterPath.length > 0) {
+	            if (parameterMapper.isConstant) {
+	                value = parameterMapper.defaultValue;
+	            }
+	            else {
+	                let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
+	                if (!propertySearchResult.propertyFound && fallbackObject) {
+	                    propertySearchResult = getPropertyFromParameterPath(fallbackObject, parameterPath);
+	                }
+	                let useDefaultValue = false;
+	                if (!propertySearchResult.propertyFound) {
+	                    useDefaultValue =
+	                        parameterMapper.required ||
+	                            (parameterPath[0] === "options" && parameterPath.length === 2);
+	                }
+	                value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
+	            }
+	        }
+	    }
+	    else {
+	        if (parameterMapper.required) {
+	            value = {};
+	        }
+	        for (const propertyName in parameterPath) {
+	            const propertyMapper = parameterMapper.type.modelProperties[propertyName];
+	            const propertyPath = parameterPath[propertyName];
+	            const propertyValue = getOperationArgumentValueFromParameter(operationArguments, {
+	                parameterPath: propertyPath,
+	                mapper: propertyMapper,
+	            }, fallbackObject);
+	            if (propertyValue !== undefined) {
+	                if (!value) {
+	                    value = {};
+	                }
+	                value[propertyName] = propertyValue;
+	            }
+	        }
+	    }
+	    return value;
+	}
+	function getPropertyFromParameterPath(parent, parameterPath) {
+	    const result = { propertyFound: false };
+	    let i = 0;
+	    for (; i < parameterPath.length; ++i) {
+	        const parameterPathPart = parameterPath[i];
+	        // Make sure to check inherited properties too, so don't use hasOwnProperty().
+	        if (parent && parameterPathPart in parent) {
+	            parent = parent[parameterPathPart];
+	        }
+	        else {
+	            break;
+	        }
+	    }
+	    if (i === parameterPath.length) {
+	        result.propertyValue = parent;
+	        result.propertyFound = true;
+	    }
+	    return result;
+	}
+	const originalRequestSymbol = Symbol.for("@azure/core-client original request");
+	function hasOriginalRequest(request) {
+	    return originalRequestSymbol in request;
+	}
+	function getOperationRequestInfo(request) {
+	    if (hasOriginalRequest(request)) {
+	        return getOperationRequestInfo(request[originalRequestSymbol]);
+	    }
+	    let info = state_js_1.state.operationRequestMap.get(request);
+	    if (!info) {
+	        info = {};
+	        state_js_1.state.operationRequestMap.set(request, info);
+	    }
+	    return info;
+	}
+	
+	return operationHelpers;
+}
+
+var hasRequiredDeserializationPolicy;
+
+function requireDeserializationPolicy () {
+	if (hasRequiredDeserializationPolicy) return deserializationPolicy;
+	hasRequiredDeserializationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.deserializationPolicyName = void 0;
+		exports$1.deserializationPolicy = deserializationPolicy;
+		const interfaces_js_1 = requireInterfaces();
+		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+		const serializer_js_1 = requireSerializer();
+		const operationHelpers_js_1 = requireOperationHelpers();
+		const defaultJsonContentTypes = ["application/json", "text/json"];
+		const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
+		/**
+		 * The programmatic identifier of the deserializationPolicy.
+		 */
+		exports$1.deserializationPolicyName = "deserializationPolicy";
+		/**
+		 * This policy handles parsing out responses according to OperationSpecs on the request.
+		 */
+		function deserializationPolicy(options = {}) {
+		    const jsonContentTypes = options.expectedContentTypes?.json ?? defaultJsonContentTypes;
+		    const xmlContentTypes = options.expectedContentTypes?.xml ?? defaultXmlContentTypes;
+		    const parseXML = options.parseXML;
+		    const serializerOptions = options.serializerOptions;
+		    const updatedOptions = {
+		        xml: {
+		            rootName: serializerOptions?.xml.rootName ?? "",
+		            includeRoot: serializerOptions?.xml.includeRoot ?? false,
+		            xmlCharKey: serializerOptions?.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
+		        },
+		    };
+		    return {
+		        name: exports$1.deserializationPolicyName,
+		        async sendRequest(request, next) {
+		            const response = await next(request);
+		            return deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, updatedOptions, parseXML);
+		        },
+		    };
+		}
+		function getOperationResponseMap(parsedResponse) {
+		    let result;
+		    const request = parsedResponse.request;
+		    const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
+		    const operationSpec = operationInfo?.operationSpec;
+		    if (operationSpec) {
+		        if (!operationInfo?.operationResponseGetter) {
+		            result = operationSpec.responses[parsedResponse.status];
+		        }
+		        else {
+		            result = operationInfo?.operationResponseGetter(operationSpec, parsedResponse);
+		        }
+		    }
+		    return result;
+		}
+		function shouldDeserializeResponse(parsedResponse) {
+		    const request = parsedResponse.request;
+		    const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
+		    const shouldDeserialize = operationInfo?.shouldDeserialize;
+		    let result;
+		    if (shouldDeserialize === undefined) {
+		        result = true;
+		    }
+		    else if (typeof shouldDeserialize === "boolean") {
+		        result = shouldDeserialize;
+		    }
+		    else {
+		        result = shouldDeserialize(parsedResponse);
+		    }
+		    return result;
+		}
+		async function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options, parseXML) {
+		    const parsedResponse = await parse(jsonContentTypes, xmlContentTypes, response, options, parseXML);
+		    if (!shouldDeserializeResponse(parsedResponse)) {
+		        return parsedResponse;
+		    }
+		    const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(parsedResponse.request);
+		    const operationSpec = operationInfo?.operationSpec;
+		    if (!operationSpec || !operationSpec.responses) {
+		        return parsedResponse;
+		    }
+		    const responseSpec = getOperationResponseMap(parsedResponse);
+		    const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec, options);
+		    if (error) {
+		        throw error;
+		    }
+		    else if (shouldReturnResponse) {
+		        return parsedResponse;
+		    }
+		    // An operation response spec does exist for current status code, so
+		    // use it to deserialize the response.
+		    if (responseSpec) {
+		        if (responseSpec.bodyMapper) {
+		            let valueToDeserialize = parsedResponse.parsedBody;
+		            if (operationSpec.isXML && responseSpec.bodyMapper.type.name === serializer_js_1.MapperTypeNames.Sequence) {
+		                valueToDeserialize =
+		                    typeof valueToDeserialize === "object"
+		                        ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
+		                        : [];
+		            }
+		            try {
+		                parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);
+		            }
+		            catch (deserializeError) {
+		                const restError = new core_rest_pipeline_1.RestError(`Error ${deserializeError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, {
+		                    statusCode: parsedResponse.status,
+		                    request: parsedResponse.request,
+		                    response: parsedResponse,
+		                });
+		                throw restError;
+		            }
+		        }
+		        else if (operationSpec.httpMethod === "HEAD") {
+		            // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
+		            parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
+		        }
+		        if (responseSpec.headersMapper) {
+		            parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders", { xml: {}, ignoreUnknownProperties: true });
+		        }
+		    }
+		    return parsedResponse;
+		}
+		function isOperationSpecEmpty(operationSpec) {
+		    const expectedStatusCodes = Object.keys(operationSpec.responses);
+		    return (expectedStatusCodes.length === 0 ||
+		        (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
+		}
+		function handleErrorResponse(parsedResponse, operationSpec, responseSpec, options) {
+		    const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
+		    const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
+		        ? isSuccessByStatus
+		        : !!responseSpec;
+		    if (isExpectedStatusCode) {
+		        if (responseSpec) {
+		            if (!responseSpec.isError) {
+		                return { error: null, shouldReturnResponse: false };
+		            }
+		        }
+		        else {
+		            return { error: null, shouldReturnResponse: false };
+		        }
+		    }
+		    const errorResponseSpec = responseSpec ?? operationSpec.responses.default;
+		    const initialErrorMessage = parsedResponse.request.streamResponseStatusCodes?.has(parsedResponse.status)
+		        ? `Unexpected status code: ${parsedResponse.status}`
+		        : parsedResponse.bodyAsText;
+		    const error = new core_rest_pipeline_1.RestError(initialErrorMessage, {
+		        statusCode: parsedResponse.status,
+		        request: parsedResponse.request,
+		        response: parsedResponse,
+		    });
+		    // If the item failed but there's no error spec or default spec to deserialize the error,
+		    // and the parsed body doesn't look like an error object,
+		    // we should fail so we just throw the parsed response
+		    if (!errorResponseSpec &&
+		        !(parsedResponse.parsedBody?.error?.code && parsedResponse.parsedBody?.error?.message)) {
+		        throw error;
+		    }
+		    const defaultBodyMapper = errorResponseSpec?.bodyMapper;
+		    const defaultHeadersMapper = errorResponseSpec?.headersMapper;
+		    try {
+		        // If error response has a body, try to deserialize it using default body mapper.
+		        // Then try to extract error code & message from it
+		        if (parsedResponse.parsedBody) {
+		            const parsedBody = parsedResponse.parsedBody;
+		            let deserializedError;
+		            if (defaultBodyMapper) {
+		                let valueToDeserialize = parsedBody;
+		                if (operationSpec.isXML && defaultBodyMapper.type.name === serializer_js_1.MapperTypeNames.Sequence) {
+		                    valueToDeserialize = [];
+		                    const elementName = defaultBodyMapper.xmlElementName;
+		                    if (typeof parsedBody === "object" && elementName) {
+		                        valueToDeserialize = parsedBody[elementName];
+		                    }
+		                }
+		                deserializedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody", options);
+		            }
+		            const internalError = parsedBody.error || deserializedError || parsedBody;
+		            error.code = internalError.code;
+		            if (internalError.message) {
+		                error.message = internalError.message;
+		            }
+		            if (defaultBodyMapper) {
+		                error.response.parsedBody = deserializedError;
+		            }
+		        }
+		        // If error response has headers, try to deserialize it using default header mapper
+		        if (parsedResponse.headers && defaultHeadersMapper) {
+		            error.response.parsedHeaders =
+		                operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
+		        }
+		    }
+		    catch (defaultError) {
+		        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
+		    }
+		    return { error, shouldReturnResponse: false };
+		}
+		async function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts, parseXML) {
+		    if (!operationResponse.request.streamResponseStatusCodes?.has(operationResponse.status) &&
+		        operationResponse.bodyAsText) {
+		        const text = operationResponse.bodyAsText;
+		        const contentType = operationResponse.headers.get("Content-Type") || "";
+		        const contentComponents = !contentType
+		            ? []
+		            : contentType.split(";").map((component) => component.toLowerCase());
+		        try {
+		            if (contentComponents.length === 0 ||
+		                contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
+		                operationResponse.parsedBody = JSON.parse(text);
+		                return operationResponse;
+		            }
+		            else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
+		                if (!parseXML) {
+		                    throw new Error("Parsing XML not supported.");
+		                }
+		                const body = await parseXML(text, opts.xml);
+		                operationResponse.parsedBody = body;
+		                return operationResponse;
+		            }
+		        }
+		        catch (err) {
+		            const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
+		            const errCode = err.code || core_rest_pipeline_1.RestError.PARSE_ERROR;
+		            const e = new core_rest_pipeline_1.RestError(msg, {
+		                code: errCode,
+		                statusCode: operationResponse.status,
+		                request: operationResponse.request,
+		                response: operationResponse,
+		            });
+		            throw e;
+		        }
+		    }
+		    return operationResponse;
+		}
+		
+	} (deserializationPolicy));
+	return deserializationPolicy;
+}
+
+var serializationPolicy = {};
+
+var interfaceHelpers = {};
+
+var hasRequiredInterfaceHelpers;
+
+function requireInterfaceHelpers () {
+	if (hasRequiredInterfaceHelpers) return interfaceHelpers;
+	hasRequiredInterfaceHelpers = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(interfaceHelpers, "__esModule", { value: true });
+	interfaceHelpers.getStreamingResponseStatusCodes = getStreamingResponseStatusCodes;
+	interfaceHelpers.getPathStringFromParameter = getPathStringFromParameter;
+	const serializer_js_1 = requireSerializer();
+	/**
+	 * Gets the list of status codes for streaming responses.
+	 * @internal
+	 */
+	function getStreamingResponseStatusCodes(operationSpec) {
+	    const result = new Set();
+	    for (const statusCode in operationSpec.responses) {
+	        const operationResponse = operationSpec.responses[statusCode];
+	        if (operationResponse.bodyMapper &&
+	            operationResponse.bodyMapper.type.name === serializer_js_1.MapperTypeNames.Stream) {
+	            result.add(Number(statusCode));
+	        }
+	    }
+	    return result;
+	}
+	/**
+	 * Get the path to this parameter's value as a dotted string (a.b.c).
+	 * @param parameter - The parameter to get the path string for.
+	 * @returns The path to this parameter's value as a dotted string.
+	 * @internal
+	 */
+	function getPathStringFromParameter(parameter) {
+	    const { parameterPath, mapper } = parameter;
+	    let result;
+	    if (typeof parameterPath === "string") {
+	        result = parameterPath;
+	    }
+	    else if (Array.isArray(parameterPath)) {
+	        result = parameterPath.join(".");
+	    }
+	    else {
+	        result = mapper.serializedName;
+	    }
+	    return result;
+	}
+	
+	return interfaceHelpers;
+}
+
+var hasRequiredSerializationPolicy;
+
+function requireSerializationPolicy () {
+	if (hasRequiredSerializationPolicy) return serializationPolicy;
+	hasRequiredSerializationPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.serializationPolicyName = void 0;
+		exports$1.serializationPolicy = serializationPolicy;
+		exports$1.serializeHeaders = serializeHeaders;
+		exports$1.serializeRequestBody = serializeRequestBody;
+		const interfaces_js_1 = requireInterfaces();
+		const operationHelpers_js_1 = requireOperationHelpers();
+		const serializer_js_1 = requireSerializer();
+		const interfaceHelpers_js_1 = requireInterfaceHelpers();
+		/**
+		 * The programmatic identifier of the serializationPolicy.
+		 */
+		exports$1.serializationPolicyName = "serializationPolicy";
+		/**
+		 * This policy handles assembling the request body and headers using
+		 * an OperationSpec and OperationArguments on the request.
+		 */
+		function serializationPolicy(options = {}) {
+		    const stringifyXML = options.stringifyXML;
+		    return {
+		        name: exports$1.serializationPolicyName,
+		        async sendRequest(request, next) {
+		            const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
+		            const operationSpec = operationInfo?.operationSpec;
+		            const operationArguments = operationInfo?.operationArguments;
+		            if (operationSpec && operationArguments) {
+		                serializeHeaders(request, operationArguments, operationSpec);
+		                serializeRequestBody(request, operationArguments, operationSpec, stringifyXML);
+		            }
+		            return next(request);
+		        },
+		    };
+		}
+		/**
+		 * @internal
+		 */
+		function serializeHeaders(request, operationArguments, operationSpec) {
+		    if (operationSpec.headerParameters) {
+		        for (const headerParameter of operationSpec.headerParameters) {
+		            let headerValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, headerParameter);
+		            if ((headerValue !== null && headerValue !== undefined) || headerParameter.mapper.required) {
+		                headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(headerParameter));
+		                const headerCollectionPrefix = headerParameter.mapper
+		                    .headerCollectionPrefix;
+		                if (headerCollectionPrefix) {
+		                    for (const key of Object.keys(headerValue)) {
+		                        request.headers.set(headerCollectionPrefix + key, headerValue[key]);
+		                    }
+		                }
+		                else {
+		                    request.headers.set(headerParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(headerParameter), headerValue);
+		                }
+		            }
+		        }
+		    }
+		    const customHeaders = operationArguments.options?.requestOptions?.customHeaders;
+		    if (customHeaders) {
+		        for (const customHeaderName of Object.keys(customHeaders)) {
+		            request.headers.set(customHeaderName, customHeaders[customHeaderName]);
+		        }
+		    }
+		}
+		/**
+		 * @internal
+		 */
+		function serializeRequestBody(request, operationArguments, operationSpec, stringifyXML = function () {
+		    throw new Error("XML serialization unsupported!");
+		}) {
+		    const serializerOptions = operationArguments.options?.serializerOptions;
+		    const updatedOptions = {
+		        xml: {
+		            rootName: serializerOptions?.xml.rootName ?? "",
+		            includeRoot: serializerOptions?.xml.includeRoot ?? false,
+		            xmlCharKey: serializerOptions?.xml.xmlCharKey ?? interfaces_js_1.XML_CHARKEY,
+		        },
+		    };
+		    const xmlCharKey = updatedOptions.xml.xmlCharKey;
+		    if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
+		        request.body = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, operationSpec.requestBody);
+		        const bodyMapper = operationSpec.requestBody.mapper;
+		        const { required, serializedName, xmlName, xmlElementName, xmlNamespace, xmlNamespacePrefix, nullable, } = bodyMapper;
+		        const typeName = bodyMapper.type.name;
+		        try {
+		            if ((request.body !== undefined && request.body !== null) ||
+		                (nullable && request.body === null) ||
+		                required) {
+		                const requestBodyParameterPathString = (0, interfaceHelpers_js_1.getPathStringFromParameter)(operationSpec.requestBody);
+		                request.body = operationSpec.serializer.serialize(bodyMapper, request.body, requestBodyParameterPathString, updatedOptions);
+		                const isStream = typeName === serializer_js_1.MapperTypeNames.Stream;
+		                if (operationSpec.isXML) {
+		                    const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
+		                    const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, request.body, updatedOptions);
+		                    if (typeName === serializer_js_1.MapperTypeNames.Sequence) {
+		                        request.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), { rootName: xmlName || serializedName, xmlCharKey });
+		                    }
+		                    else if (!isStream) {
+		                        request.body = stringifyXML(value, {
+		                            rootName: xmlName || serializedName,
+		                            xmlCharKey,
+		                        });
+		                    }
+		                }
+		                else if (typeName === serializer_js_1.MapperTypeNames.String &&
+		                    (operationSpec.contentType?.match("text/plain") || operationSpec.mediaType === "text")) {
+		                    // the String serializer has validated that request body is a string
+		                    // so just send the string.
+		                    return;
+		                }
+		                else if (!isStream) {
+		                    request.body = JSON.stringify(request.body);
+		                }
+		            }
+		        }
+		        catch (error) {
+		            throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, "  ")}.`);
+		        }
+		    }
+		    else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
+		        request.formData = {};
+		        for (const formDataParameter of operationSpec.formDataParameters) {
+		            const formDataParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, formDataParameter);
+		            if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
+		                const formDataParameterPropertyName = formDataParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(formDataParameter);
+		                request.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(formDataParameter), updatedOptions);
+		            }
+		        }
+		    }
+		}
+		/**
+		 * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
+		 */
+		function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
+		    // Composite and Sequence schemas already got their root namespace set during serialization
+		    // We just need to add xmlns to the other schema types
+		    if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
+		        const result = {};
+		        result[options.xml.xmlCharKey] = serializedValue;
+		        result[interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
+		        return result;
+		    }
+		    return serializedValue;
+		}
+		function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
+		    if (!Array.isArray(obj)) {
+		        obj = [obj];
+		    }
+		    if (!xmlNamespaceKey || !xmlNamespace) {
+		        return { [elementName]: obj };
+		    }
+		    const result = { [elementName]: obj };
+		    result[interfaces_js_1.XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
+		    return result;
+		}
+		
+	} (serializationPolicy));
+	return serializationPolicy;
+}
+
+var hasRequiredPipeline$1;
+
+function requirePipeline$1 () {
+	if (hasRequiredPipeline$1) return pipeline;
+	hasRequiredPipeline$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(pipeline, "__esModule", { value: true });
+	pipeline.createClientPipeline = createClientPipeline;
+	const deserializationPolicy_js_1 = requireDeserializationPolicy();
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const serializationPolicy_js_1 = requireSerializationPolicy();
+	/**
+	 * Creates a new Pipeline for use with a Service Client.
+	 * Adds in deserializationPolicy by default.
+	 * Also adds in bearerTokenAuthenticationPolicy if passed a TokenCredential.
+	 * @param options - Options to customize the created pipeline.
+	 */
+	function createClientPipeline(options = {}) {
+	    const pipeline = (0, core_rest_pipeline_1.createPipelineFromOptions)(options ?? {});
+	    if (options.credentialOptions) {
+	        pipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({
+	            credential: options.credentialOptions.credential,
+	            scopes: options.credentialOptions.credentialScopes,
+	        }));
+	    }
+	    pipeline.addPolicy((0, serializationPolicy_js_1.serializationPolicy)(options.serializationOptions), { phase: "Serialize" });
+	    pipeline.addPolicy((0, deserializationPolicy_js_1.deserializationPolicy)(options.deserializationOptions), {
+	        phase: "Deserialize",
+	    });
+	    return pipeline;
+	}
+	
+	return pipeline;
+}
+
+var httpClientCache = {};
+
+var hasRequiredHttpClientCache;
+
+function requireHttpClientCache () {
+	if (hasRequiredHttpClientCache) return httpClientCache;
+	hasRequiredHttpClientCache = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(httpClientCache, "__esModule", { value: true });
+	httpClientCache.getCachedDefaultHttpClient = getCachedDefaultHttpClient;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	let cachedHttpClient;
+	function getCachedDefaultHttpClient() {
+	    if (!cachedHttpClient) {
+	        cachedHttpClient = (0, core_rest_pipeline_1.createDefaultHttpClient)();
+	    }
+	    return cachedHttpClient;
+	}
+	
+	return httpClientCache;
+}
+
+var urlHelpers = {};
+
+var hasRequiredUrlHelpers;
+
+function requireUrlHelpers () {
+	if (hasRequiredUrlHelpers) return urlHelpers;
+	hasRequiredUrlHelpers = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(urlHelpers, "__esModule", { value: true });
+	urlHelpers.getRequestUrl = getRequestUrl;
+	urlHelpers.appendQueryParams = appendQueryParams;
+	const operationHelpers_js_1 = requireOperationHelpers();
+	const interfaceHelpers_js_1 = requireInterfaceHelpers();
+	const CollectionFormatToDelimiterMap = {
+	    CSV: ",",
+	    SSV: " ",
+	    Multi: "Multi",
+	    TSV: "\t",
+	    Pipes: "|",
+	};
+	function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
+	    const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject);
+	    let isAbsolutePath = false;
+	    let requestUrl = replaceAll(baseUri, urlReplacements);
+	    if (operationSpec.path) {
+	        let path = replaceAll(operationSpec.path, urlReplacements);
+	        // QUIRK: sometimes we get a path component like /{nextLink}
+	        // which may be a fully formed URL with a leading /. In that case, we should
+	        // remove the leading /
+	        if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
+	            path = path.substring(1);
+	        }
+	        // QUIRK: sometimes we get a path component like {nextLink}
+	        // which may be a fully formed URL. In that case, we should
+	        // ignore the baseUri.
+	        if (isAbsoluteUrl(path)) {
+	            requestUrl = path;
+	            isAbsolutePath = true;
+	        }
+	        else {
+	            requestUrl = appendPath(requestUrl, path);
+	        }
+	    }
+	    const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject);
+	    /**
+	     * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`
+	     * is an absolute path. This ensures that existing query parameter values in `requestUrl`
+	     * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it
+	     * is still being built so there is nothing to overwrite.
+	     */
+	    requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
+	    return requestUrl;
+	}
+	function replaceAll(input, replacements) {
+	    let result = input;
+	    for (const [searchValue, replaceValue] of replacements) {
+	        result = result.split(searchValue).join(replaceValue);
+	    }
+	    return result;
+	}
+	function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) {
+	    const result = new Map();
+	    if (operationSpec.urlParameters?.length) {
+	        for (const urlParameter of operationSpec.urlParameters) {
+	            let urlParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, urlParameter, fallbackObject);
+	            const parameterPathString = (0, interfaceHelpers_js_1.getPathStringFromParameter)(urlParameter);
+	            urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString);
+	            if (!urlParameter.skipEncoding) {
+	                urlParameterValue = encodeURIComponent(urlParameterValue);
+	            }
+	            result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue);
+	        }
+	    }
+	    return result;
+	}
+	function isAbsoluteUrl(url) {
+	    return url.includes("://");
+	}
+	function appendPath(url, pathToAppend) {
+	    if (!pathToAppend) {
+	        return url;
+	    }
+	    const parsedUrl = new URL(url);
+	    let newPath = parsedUrl.pathname;
+	    if (!newPath.endsWith("/")) {
+	        newPath = `${newPath}/`;
+	    }
+	    if (pathToAppend.startsWith("/")) {
+	        pathToAppend = pathToAppend.substring(1);
+	    }
+	    const searchStart = pathToAppend.indexOf("?");
+	    if (searchStart !== -1) {
+	        const path = pathToAppend.substring(0, searchStart);
+	        const search = pathToAppend.substring(searchStart + 1);
+	        newPath = newPath + path;
+	        if (search) {
+	            parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
+	        }
+	    }
+	    else {
+	        newPath = newPath + pathToAppend;
+	    }
+	    parsedUrl.pathname = newPath;
+	    return parsedUrl.toString();
+	}
+	function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) {
+	    const result = new Map();
+	    const sequenceParams = new Set();
+	    if (operationSpec.queryParameters?.length) {
+	        for (const queryParameter of operationSpec.queryParameters) {
+	            if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
+	                sequenceParams.add(queryParameter.mapper.serializedName);
+	            }
+	            let queryParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, queryParameter, fallbackObject);
+	            if ((queryParameterValue !== undefined && queryParameterValue !== null) ||
+	                queryParameter.mapper.required) {
+	                queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(queryParameter));
+	                const delimiter = queryParameter.collectionFormat
+	                    ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]
+	                    : "";
+	                if (Array.isArray(queryParameterValue)) {
+	                    // replace null and undefined
+	                    queryParameterValue = queryParameterValue.map((item) => {
+	                        if (item === null || item === undefined) {
+	                            return "";
+	                        }
+	                        return item;
+	                    });
+	                }
+	                if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
+	                    continue;
+	                }
+	                else if (Array.isArray(queryParameterValue) &&
+	                    (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
+	                    queryParameterValue = queryParameterValue.join(delimiter);
+	                }
+	                if (!queryParameter.skipEncoding) {
+	                    if (Array.isArray(queryParameterValue)) {
+	                        queryParameterValue = queryParameterValue.map((item) => {
+	                            return encodeURIComponent(item);
+	                        });
+	                    }
+	                    else {
+	                        queryParameterValue = encodeURIComponent(queryParameterValue);
+	                    }
+	                }
+	                // Join pipes and CSV *after* encoding, or the server will be upset.
+	                if (Array.isArray(queryParameterValue) &&
+	                    (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
+	                    queryParameterValue = queryParameterValue.join(delimiter);
+	                }
+	                result.set(queryParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(queryParameter), queryParameterValue);
+	            }
+	        }
+	    }
+	    return {
+	        queryParams: result,
+	        sequenceParams,
+	    };
+	}
+	function simpleParseQueryParams(queryString) {
+	    const result = new Map();
+	    if (!queryString || queryString[0] !== "?") {
+	        return result;
+	    }
+	    // remove the leading ?
+	    queryString = queryString.slice(1);
+	    const pairs = queryString.split("&");
+	    for (const pair of pairs) {
+	        const [name, value] = pair.split("=", 2);
+	        const existingValue = result.get(name);
+	        if (existingValue) {
+	            if (Array.isArray(existingValue)) {
+	                existingValue.push(value);
+	            }
+	            else {
+	                result.set(name, [existingValue, value]);
+	            }
+	        }
+	        else {
+	            result.set(name, value);
+	        }
+	    }
+	    return result;
+	}
+	/** @internal */
+	function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
+	    if (queryParams.size === 0) {
+	        return url;
+	    }
+	    const parsedUrl = new URL(url);
+	    // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which
+	    // can change their meaning to the server, such as in the case of a SAS signature.
+	    // To avoid accidentally un-encoding a query param, we parse the key/values ourselves
+	    const combinedParams = simpleParseQueryParams(parsedUrl.search);
+	    for (const [name, value] of queryParams) {
+	        const existingValue = combinedParams.get(name);
+	        if (Array.isArray(existingValue)) {
+	            if (Array.isArray(value)) {
+	                existingValue.push(...value);
+	                const valueSet = new Set(existingValue);
+	                combinedParams.set(name, Array.from(valueSet));
+	            }
+	            else {
+	                existingValue.push(value);
+	            }
+	        }
+	        else if (existingValue) {
+	            if (Array.isArray(value)) {
+	                value.unshift(existingValue);
+	            }
+	            else if (sequenceParams.has(name)) {
+	                combinedParams.set(name, [existingValue, value]);
+	            }
+	            if (!noOverwrite) {
+	                combinedParams.set(name, value);
+	            }
+	        }
+	        else {
+	            combinedParams.set(name, value);
+	        }
+	    }
+	    const searchPieces = [];
+	    for (const [name, value] of combinedParams) {
+	        if (typeof value === "string") {
+	            searchPieces.push(`${name}=${value}`);
+	        }
+	        else if (Array.isArray(value)) {
+	            // QUIRK: If we get an array of values, include multiple key/value pairs
+	            for (const subValue of value) {
+	                searchPieces.push(`${name}=${subValue}`);
+	            }
+	        }
+	        else {
+	            searchPieces.push(`${name}=${value}`);
+	        }
+	    }
+	    // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.
+	    parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
+	    return parsedUrl.toString();
+	}
+	
+	return urlHelpers;
+}
+
+var log$2 = {};
+
+var hasRequiredLog$2;
+
+function requireLog$2 () {
+	if (hasRequiredLog$2) return log$2;
+	hasRequiredLog$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(log$2, "__esModule", { value: true });
+	log$2.logger = void 0;
+	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
+	log$2.logger = (0, logger_1.createClientLogger)("core-client");
+	
+	return log$2;
+}
+
+var hasRequiredServiceClient;
+
+function requireServiceClient () {
+	if (hasRequiredServiceClient) return serviceClient;
+	hasRequiredServiceClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(serviceClient, "__esModule", { value: true });
+	serviceClient.ServiceClient = void 0;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const pipeline_js_1 = requirePipeline$1();
+	const utils_js_1 = requireUtils$2();
+	const httpClientCache_js_1 = requireHttpClientCache();
+	const operationHelpers_js_1 = requireOperationHelpers();
+	const urlHelpers_js_1 = requireUrlHelpers();
+	const interfaceHelpers_js_1 = requireInterfaceHelpers();
+	const log_js_1 = requireLog$2();
+	/**
+	 * Initializes a new instance of the ServiceClient.
+	 */
+	class ServiceClient {
+	    /**
+	     * If specified, this is the base URI that requests will be made against for this ServiceClient.
+	     * If it is not specified, then all OperationSpecs must contain a baseUrl property.
+	     */
+	    _endpoint;
+	    /**
+	     * The default request content type for the service.
+	     * Used if no requestContentType is present on an OperationSpec.
+	     */
+	    _requestContentType;
+	    /**
+	     * Set to true if the request is sent over HTTP instead of HTTPS
+	     */
+	    _allowInsecureConnection;
+	    /**
+	     * The HTTP client that will be used to send requests.
+	     */
+	    _httpClient;
+	    /**
+	     * The pipeline used by this client to make requests
+	     */
+	    pipeline;
+	    /**
+	     * The ServiceClient constructor
+	     * @param options - The service client options that govern the behavior of the client.
+	     */
+	    constructor(options = {}) {
+	        this._requestContentType = options.requestContentType;
+	        this._endpoint = options.endpoint ?? options.baseUri;
+	        if (options.baseUri) {
+	            log_js_1.logger.warning("The baseUri option for SDK Clients has been deprecated, please use endpoint instead.");
+	        }
+	        this._allowInsecureConnection = options.allowInsecureConnection;
+	        this._httpClient = options.httpClient || (0, httpClientCache_js_1.getCachedDefaultHttpClient)();
+	        this.pipeline = options.pipeline || createDefaultPipeline(options);
+	        if (options.additionalPolicies?.length) {
+	            for (const { policy, position } of options.additionalPolicies) {
+	                // Sign happens after Retry and is commonly needed to occur
+	                // before policies that intercept post-retry.
+	                const afterPhase = position === "perRetry" ? "Sign" : undefined;
+	                this.pipeline.addPolicy(policy, {
+	                    afterPhase,
+	                });
+	            }
+	        }
+	    }
+	    /**
+	     * Send the provided httpRequest.
+	     */
+	    async sendRequest(request) {
+	        return this.pipeline.sendRequest(this._httpClient, request);
+	    }
+	    /**
+	     * Send an HTTP request that is populated using the provided OperationSpec.
+	     * @typeParam T - The typed result of the request, based on the OperationSpec.
+	     * @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
+	     * @param operationSpec - The OperationSpec to use to populate the httpRequest.
+	     */
+	    async sendOperationRequest(operationArguments, operationSpec) {
+	        const endpoint = operationSpec.baseUrl || this._endpoint;
+	        if (!endpoint) {
+	            throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use.");
+	        }
+	        // Templatized URLs sometimes reference properties on the ServiceClient child class,
+	        // so we have to pass `this` below in order to search these properties if they're
+	        // not part of OperationArguments
+	        const url = (0, urlHelpers_js_1.getRequestUrl)(endpoint, operationSpec, operationArguments, this);
+	        const request = (0, core_rest_pipeline_1.createPipelineRequest)({
+	            url,
+	        });
+	        request.method = operationSpec.httpMethod;
+	        const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request);
+	        operationInfo.operationSpec = operationSpec;
+	        operationInfo.operationArguments = operationArguments;
+	        const contentType = operationSpec.contentType || this._requestContentType;
+	        if (contentType && operationSpec.requestBody) {
+	            request.headers.set("Content-Type", contentType);
+	        }
+	        const options = operationArguments.options;
+	        if (options) {
+	            const requestOptions = options.requestOptions;
+	            if (requestOptions) {
+	                if (requestOptions.timeout) {
+	                    request.timeout = requestOptions.timeout;
+	                }
+	                if (requestOptions.onUploadProgress) {
+	                    request.onUploadProgress = requestOptions.onUploadProgress;
+	                }
+	                if (requestOptions.onDownloadProgress) {
+	                    request.onDownloadProgress = requestOptions.onDownloadProgress;
+	                }
+	                if (requestOptions.shouldDeserialize !== undefined) {
+	                    operationInfo.shouldDeserialize = requestOptions.shouldDeserialize;
+	                }
+	                if (requestOptions.allowInsecureConnection) {
+	                    request.allowInsecureConnection = true;
+	                }
+	            }
+	            if (options.abortSignal) {
+	                request.abortSignal = options.abortSignal;
+	            }
+	            if (options.tracingOptions) {
+	                request.tracingOptions = options.tracingOptions;
+	            }
+	        }
+	        if (this._allowInsecureConnection) {
+	            request.allowInsecureConnection = true;
+	        }
+	        if (request.streamResponseStatusCodes === undefined) {
+	            request.streamResponseStatusCodes = (0, interfaceHelpers_js_1.getStreamingResponseStatusCodes)(operationSpec);
+	        }
+	        try {
+	            const rawResponse = await this.sendRequest(request);
+	            const flatResponse = (0, utils_js_1.flattenResponse)(rawResponse, operationSpec.responses[rawResponse.status]);
+	            if (options?.onResponse) {
+	                options.onResponse(rawResponse, flatResponse);
+	            }
+	            return flatResponse;
+	        }
+	        catch (error) {
+	            if (typeof error === "object" && error?.response) {
+	                const rawResponse = error.response;
+	                const flatResponse = (0, utils_js_1.flattenResponse)(rawResponse, operationSpec.responses[error.statusCode] || operationSpec.responses["default"]);
+	                error.details = flatResponse;
+	                if (options?.onResponse) {
+	                    options.onResponse(rawResponse, flatResponse, error);
+	                }
+	            }
+	            throw error;
+	        }
+	    }
+	}
+	serviceClient.ServiceClient = ServiceClient;
+	function createDefaultPipeline(options) {
+	    const credentialScopes = getCredentialScopes(options);
+	    const credentialOptions = options.credential && credentialScopes
+	        ? { credentialScopes, credential: options.credential }
+	        : undefined;
+	    return (0, pipeline_js_1.createClientPipeline)({
+	        ...options,
+	        credentialOptions,
+	    });
+	}
+	function getCredentialScopes(options) {
+	    if (options.credentialScopes) {
+	        return options.credentialScopes;
+	    }
+	    if (options.endpoint) {
+	        return `${options.endpoint}/.default`;
+	    }
+	    if (options.baseUri) {
+	        return `${options.baseUri}/.default`;
+	    }
+	    if (options.credential && !options.credentialScopes) {
+	        throw new Error(`When using credentials, the ServiceClientOptions must contain either a endpoint or a credentialScopes. Unable to create a bearerTokenAuthenticationPolicy`);
+	    }
+	    return undefined;
+	}
+	
+	return serviceClient;
+}
+
+var authorizeRequestOnClaimChallenge = {};
+
+var hasRequiredAuthorizeRequestOnClaimChallenge;
+
+function requireAuthorizeRequestOnClaimChallenge () {
+	if (hasRequiredAuthorizeRequestOnClaimChallenge) return authorizeRequestOnClaimChallenge;
+	hasRequiredAuthorizeRequestOnClaimChallenge = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(authorizeRequestOnClaimChallenge, "__esModule", { value: true });
+	authorizeRequestOnClaimChallenge.parseCAEChallenge = parseCAEChallenge;
+	authorizeRequestOnClaimChallenge.authorizeRequestOnClaimChallenge = authorizeRequestOnClaimChallenge$1;
+	const log_js_1 = requireLog$2();
+	const base64_js_1 = requireBase64();
+	/**
+	 * Converts: `Bearer a="b", c="d", Bearer d="e", f="g"`.
+	 * Into: `[ { a: 'b', c: 'd' }, { d: 'e', f: 'g' } ]`.
+	 *
+	 * @internal
+	 */
+	function parseCAEChallenge(challenges) {
+	    const bearerChallenges = `, ${challenges.trim()}`.split(", Bearer ").filter((x) => x);
+	    return bearerChallenges.map((challenge) => {
+	        const challengeParts = `${challenge.trim()}, `.split('", ').filter((x) => x);
+	        const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split('="')));
+	        // Key-value pairs to plain object:
+	        return keyValuePairs.reduce((a, b) => ({ ...a, ...b }), {});
+	    });
+	}
+	/**
+	 * This function can be used as a callback for the `bearerTokenAuthenticationPolicy` of `@azure/core-rest-pipeline`, to support CAE challenges:
+	 * [Continuous Access Evaluation](https://learn.microsoft.com/azure/active-directory/conditional-access/concept-continuous-access-evaluation).
+	 *
+	 * Call the `bearerTokenAuthenticationPolicy` with the following options:
+	 *
+	 * ```ts snippet:AuthorizeRequestOnClaimChallenge
+	 * import { bearerTokenAuthenticationPolicy } from "@azure/core-rest-pipeline";
+	 * import { authorizeRequestOnClaimChallenge } from "@azure/core-client";
+	 *
+	 * const policy = bearerTokenAuthenticationPolicy({
+	 *   challengeCallbacks: {
+	 *     authorizeRequestOnChallenge: authorizeRequestOnClaimChallenge,
+	 *   },
+	 *   scopes: ["https://service/.default"],
+	 * });
+	 * ```
+	 *
+	 * Once provided, the `bearerTokenAuthenticationPolicy` policy will internally handle Continuous Access Evaluation (CAE) challenges.
+	 * When it can't complete a challenge it will return the 401 (unauthorized) response from ARM.
+	 *
+	 * Example challenge with claims:
+	 *
+	 * ```
+	 * Bearer authorization_uri="https://login.windows-ppe.net/", error="invalid_token",
+	 * error_description="User session has been revoked",
+	 * claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwMzc0MjgwMCJ9fX0="
+	 * ```
+	 */
+	async function authorizeRequestOnClaimChallenge$1(onChallengeOptions) {
+	    const { scopes, response } = onChallengeOptions;
+	    const logger = onChallengeOptions.logger || log_js_1.logger;
+	    const challenge = response.headers.get("WWW-Authenticate");
+	    if (!challenge) {
+	        logger.info(`The WWW-Authenticate header was missing. Failed to perform the Continuous Access Evaluation authentication flow.`);
+	        return false;
+	    }
+	    const challenges = parseCAEChallenge(challenge) || [];
+	    const parsedChallenge = challenges.find((x) => x.claims);
+	    if (!parsedChallenge) {
+	        logger.info(`The WWW-Authenticate header was missing the necessary "claims" to perform the Continuous Access Evaluation authentication flow.`);
+	        return false;
+	    }
+	    const accessToken = await onChallengeOptions.getAccessToken(parsedChallenge.scope ? [parsedChallenge.scope] : scopes, {
+	        claims: (0, base64_js_1.decodeStringToString)(parsedChallenge.claims),
+	    });
+	    if (!accessToken) {
+	        return false;
+	    }
+	    onChallengeOptions.request.headers.set("Authorization", `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
+	    return true;
+	}
+	
+	return authorizeRequestOnClaimChallenge;
+}
+
+var authorizeRequestOnTenantChallenge = {};
+
+var hasRequiredAuthorizeRequestOnTenantChallenge;
+
+function requireAuthorizeRequestOnTenantChallenge () {
+	if (hasRequiredAuthorizeRequestOnTenantChallenge) return authorizeRequestOnTenantChallenge;
+	hasRequiredAuthorizeRequestOnTenantChallenge = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(authorizeRequestOnTenantChallenge, "__esModule", { value: true });
+	authorizeRequestOnTenantChallenge.authorizeRequestOnTenantChallenge = void 0;
+	/**
+	 * A set of constants used internally when processing requests.
+	 */
+	const Constants = {
+	    DefaultScope: "/.default",
+	    /**
+	     * Defines constants for use with HTTP headers.
+	     */
+	    HeaderConstants: {
+	        /**
+	         * The Authorization header.
+	         */
+	        AUTHORIZATION: "authorization",
+	    },
+	};
+	function isUuid(text) {
+	    return /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/.test(text);
+	}
+	/**
+	 * Defines a callback to handle auth challenge for Storage APIs.
+	 * This implements the bearer challenge process described here: https://learn.microsoft.com/rest/api/storageservices/authorize-with-azure-active-directory#bearer-challenge
+	 * Handling has specific features for storage that departs to the general AAD challenge docs.
+	 **/
+	const authorizeRequestOnTenantChallenge$1 = async (challengeOptions) => {
+	    const requestOptions = requestToOptions(challengeOptions.request);
+	    const challenge = getChallenge(challengeOptions.response);
+	    if (challenge) {
+	        const challengeInfo = parseChallenge(challenge);
+	        const challengeScopes = buildScopes(challengeOptions, challengeInfo);
+	        const tenantId = extractTenantId(challengeInfo);
+	        if (!tenantId) {
+	            return false;
+	        }
+	        const accessToken = await challengeOptions.getAccessToken(challengeScopes, {
+	            ...requestOptions,
+	            tenantId,
+	        });
+	        if (!accessToken) {
+	            return false;
+	        }
+	        challengeOptions.request.headers.set(Constants.HeaderConstants.AUTHORIZATION, `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
+	        return true;
+	    }
+	    return false;
+	};
+	authorizeRequestOnTenantChallenge.authorizeRequestOnTenantChallenge = authorizeRequestOnTenantChallenge$1;
+	/**
+	 * Extracts the tenant id from the challenge information
+	 * The tenant id is contained in the authorization_uri as the first
+	 * path part.
+	 */
+	function extractTenantId(challengeInfo) {
+	    const parsedAuthUri = new URL(challengeInfo.authorization_uri);
+	    const pathSegments = parsedAuthUri.pathname.split("/");
+	    const tenantId = pathSegments[1];
+	    if (tenantId && isUuid(tenantId)) {
+	        return tenantId;
+	    }
+	    return undefined;
+	}
+	/**
+	 * Builds the authentication scopes based on the information that comes in the
+	 * challenge information. Scopes url is present in the resource_id, if it is empty
+	 * we keep using the original scopes.
+	 */
+	function buildScopes(challengeOptions, challengeInfo) {
+	    if (!challengeInfo.resource_id) {
+	        return challengeOptions.scopes;
+	    }
+	    const challengeScopes = new URL(challengeInfo.resource_id);
+	    challengeScopes.pathname = Constants.DefaultScope;
+	    let scope = challengeScopes.toString();
+	    if (scope === "https://disk.azure.com/.default") {
+	        // the extra slash is required by the service
+	        scope = "https://disk.azure.com//.default";
+	    }
+	    return [scope];
+	}
+	/**
+	 * We will retrieve the challenge only if the response status code was 401,
+	 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
+	 */
+	function getChallenge(response) {
+	    const challenge = response.headers.get("WWW-Authenticate");
+	    if (response.status === 401 && challenge) {
+	        return challenge;
+	    }
+	    return;
+	}
+	/**
+	 * Converts: `Bearer a="b" c="d"`.
+	 * Into: `[ { a: 'b', c: 'd' }]`.
+	 *
+	 * @internal
+	 */
+	function parseChallenge(challenge) {
+	    const bearerChallenge = challenge.slice("Bearer ".length);
+	    const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);
+	    const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));
+	    // Key-value pairs to plain object:
+	    return keyValuePairs.reduce((a, b) => ({ ...a, ...b }), {});
+	}
+	/**
+	 * Extracts the options form a Pipeline Request for later re-use
+	 */
+	function requestToOptions(request) {
+	    return {
+	        abortSignal: request.abortSignal,
+	        requestOptions: {
+	            timeout: request.timeout,
+	        },
+	        tracingOptions: request.tracingOptions,
+	    };
+	}
+	
+	return authorizeRequestOnTenantChallenge;
+}
+
+var hasRequiredCommonjs$7;
+
+function requireCommonjs$7 () {
+	if (hasRequiredCommonjs$7) return commonjs$5;
+	hasRequiredCommonjs$7 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.authorizeRequestOnTenantChallenge = exports$1.authorizeRequestOnClaimChallenge = exports$1.serializationPolicyName = exports$1.serializationPolicy = exports$1.deserializationPolicyName = exports$1.deserializationPolicy = exports$1.XML_CHARKEY = exports$1.XML_ATTRKEY = exports$1.createClientPipeline = exports$1.ServiceClient = exports$1.MapperTypeNames = exports$1.createSerializer = void 0;
+		var serializer_js_1 = requireSerializer();
+		Object.defineProperty(exports$1, "createSerializer", { enumerable: true, get: function () { return serializer_js_1.createSerializer; } });
+		Object.defineProperty(exports$1, "MapperTypeNames", { enumerable: true, get: function () { return serializer_js_1.MapperTypeNames; } });
+		var serviceClient_js_1 = requireServiceClient();
+		Object.defineProperty(exports$1, "ServiceClient", { enumerable: true, get: function () { return serviceClient_js_1.ServiceClient; } });
+		var pipeline_js_1 = requirePipeline$1();
+		Object.defineProperty(exports$1, "createClientPipeline", { enumerable: true, get: function () { return pipeline_js_1.createClientPipeline; } });
+		var interfaces_js_1 = requireInterfaces();
+		Object.defineProperty(exports$1, "XML_ATTRKEY", { enumerable: true, get: function () { return interfaces_js_1.XML_ATTRKEY; } });
+		Object.defineProperty(exports$1, "XML_CHARKEY", { enumerable: true, get: function () { return interfaces_js_1.XML_CHARKEY; } });
+		var deserializationPolicy_js_1 = requireDeserializationPolicy();
+		Object.defineProperty(exports$1, "deserializationPolicy", { enumerable: true, get: function () { return deserializationPolicy_js_1.deserializationPolicy; } });
+		Object.defineProperty(exports$1, "deserializationPolicyName", { enumerable: true, get: function () { return deserializationPolicy_js_1.deserializationPolicyName; } });
+		var serializationPolicy_js_1 = requireSerializationPolicy();
+		Object.defineProperty(exports$1, "serializationPolicy", { enumerable: true, get: function () { return serializationPolicy_js_1.serializationPolicy; } });
+		Object.defineProperty(exports$1, "serializationPolicyName", { enumerable: true, get: function () { return serializationPolicy_js_1.serializationPolicyName; } });
+		var authorizeRequestOnClaimChallenge_js_1 = requireAuthorizeRequestOnClaimChallenge();
+		Object.defineProperty(exports$1, "authorizeRequestOnClaimChallenge", { enumerable: true, get: function () { return authorizeRequestOnClaimChallenge_js_1.authorizeRequestOnClaimChallenge; } });
+		var authorizeRequestOnTenantChallenge_js_1 = requireAuthorizeRequestOnTenantChallenge();
+		Object.defineProperty(exports$1, "authorizeRequestOnTenantChallenge", { enumerable: true, get: function () { return authorizeRequestOnTenantChallenge_js_1.authorizeRequestOnTenantChallenge; } });
+		
+	} (commonjs$5));
+	return commonjs$5;
+}
+
+var response$1 = {};
+
+var util$9 = {};
+
+var hasRequiredUtil$9;
+
+function requireUtil$9 () {
+	if (hasRequiredUtil$9) return util$9;
+	hasRequiredUtil$9 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(util$9, "__esModule", { value: true });
+	util$9.HttpHeaders = void 0;
+	util$9.toPipelineRequest = toPipelineRequest;
+	util$9.toWebResourceLike = toWebResourceLike;
+	util$9.toHttpHeadersLike = toHttpHeadersLike;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	// We use a custom symbol to cache a reference to the original request without
+	// exposing it on the public interface.
+	const originalRequestSymbol = Symbol("Original PipelineRequest");
+	// Symbol.for() will return the same symbol if it's already been created
+	// This particular one is used in core-client to handle the case of when a request is
+	// cloned but we need to retrieve the OperationSpec and OperationArguments from the
+	// original request.
+	const originalClientRequestSymbol = Symbol.for("@azure/core-client original request");
+	function toPipelineRequest(webResource, options = {}) {
+	    const compatWebResource = webResource;
+	    const request = compatWebResource[originalRequestSymbol];
+	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)(webResource.headers.toJson({ preserveCase: true }));
+	    if (request) {
+	        request.headers = headers;
+	        return request;
+	    }
+	    else {
+	        const newRequest = (0, core_rest_pipeline_1.createPipelineRequest)({
+	            url: webResource.url,
+	            method: webResource.method,
+	            headers,
+	            withCredentials: webResource.withCredentials,
+	            timeout: webResource.timeout,
+	            requestId: webResource.requestId,
+	            abortSignal: webResource.abortSignal,
+	            body: webResource.body,
+	            formData: webResource.formData,
+	            disableKeepAlive: !!webResource.keepAlive,
+	            onDownloadProgress: webResource.onDownloadProgress,
+	            onUploadProgress: webResource.onUploadProgress,
+	            proxySettings: webResource.proxySettings,
+	            streamResponseStatusCodes: webResource.streamResponseStatusCodes,
+	            agent: webResource.agent,
+	            requestOverrides: webResource.requestOverrides,
+	        });
+	        if (options.originalRequest) {
+	            newRequest[originalClientRequestSymbol] =
+	                options.originalRequest;
+	        }
+	        return newRequest;
+	    }
+	}
+	function toWebResourceLike(request, options) {
+	    const originalRequest = options?.originalRequest ?? request;
+	    const webResource = {
+	        url: request.url,
+	        method: request.method,
+	        headers: toHttpHeadersLike(request.headers),
+	        withCredentials: request.withCredentials,
+	        timeout: request.timeout,
+	        requestId: request.headers.get("x-ms-client-request-id") || request.requestId,
+	        abortSignal: request.abortSignal,
+	        body: request.body,
+	        formData: request.formData,
+	        keepAlive: !!request.disableKeepAlive,
+	        onDownloadProgress: request.onDownloadProgress,
+	        onUploadProgress: request.onUploadProgress,
+	        proxySettings: request.proxySettings,
+	        streamResponseStatusCodes: request.streamResponseStatusCodes,
+	        agent: request.agent,
+	        requestOverrides: request.requestOverrides,
+	        clone() {
+	            throw new Error("Cannot clone a non-proxied WebResourceLike");
+	        },
+	        prepare() {
+	            throw new Error("WebResourceLike.prepare() is not supported by @azure/core-http-compat");
+	        },
+	        validateRequestProperties() {
+	            /** do nothing */
+	        },
+	    };
+	    if (options?.createProxy) {
+	        return new Proxy(webResource, {
+	            get(target, prop, receiver) {
+	                if (prop === originalRequestSymbol) {
+	                    return request;
+	                }
+	                else if (prop === "clone") {
+	                    return () => {
+	                        return toWebResourceLike(toPipelineRequest(webResource, { originalRequest }), {
+	                            createProxy: true,
+	                            originalRequest,
+	                        });
+	                    };
+	                }
+	                return Reflect.get(target, prop, receiver);
+	            },
+	            set(target, prop, value, receiver) {
+	                if (prop === "keepAlive") {
+	                    request.disableKeepAlive = !value;
+	                }
+	                const passThroughProps = [
+	                    "url",
+	                    "method",
+	                    "withCredentials",
+	                    "timeout",
+	                    "requestId",
+	                    "abortSignal",
+	                    "body",
+	                    "formData",
+	                    "onDownloadProgress",
+	                    "onUploadProgress",
+	                    "proxySettings",
+	                    "streamResponseStatusCodes",
+	                    "agent",
+	                    "requestOverrides",
+	                ];
+	                if (typeof prop === "string" && passThroughProps.includes(prop)) {
+	                    request[prop] = value;
+	                }
+	                return Reflect.set(target, prop, value, receiver);
+	            },
+	        });
+	    }
+	    else {
+	        return webResource;
+	    }
+	}
+	/**
+	 * Converts HttpHeaders from core-rest-pipeline to look like
+	 * HttpHeaders from core-http.
+	 * @param headers - HttpHeaders from core-rest-pipeline
+	 * @returns HttpHeaders as they looked in core-http
+	 */
+	function toHttpHeadersLike(headers) {
+	    return new HttpHeaders(headers.toJSON({ preserveCase: true }));
+	}
+	/**
+	 * A collection of HttpHeaders that can be sent with a HTTP request.
+	 */
+	function getHeaderKey(headerName) {
+	    return headerName.toLowerCase();
+	}
+	/**
+	 * A collection of HTTP header key/value pairs.
+	 */
+	class HttpHeaders {
+	    _headersMap;
+	    constructor(rawHeaders) {
+	        this._headersMap = {};
+	        if (rawHeaders) {
+	            for (const headerName in rawHeaders) {
+	                this.set(headerName, rawHeaders[headerName]);
+	            }
+	        }
+	    }
+	    /**
+	     * Set a header in this collection with the provided name and value. The name is
+	     * case-insensitive.
+	     * @param headerName - The name of the header to set. This value is case-insensitive.
+	     * @param headerValue - The value of the header to set.
+	     */
+	    set(headerName, headerValue) {
+	        this._headersMap[getHeaderKey(headerName)] = {
+	            name: headerName,
+	            value: headerValue.toString(),
+	        };
+	    }
+	    /**
+	     * Get the header value for the provided header name, or undefined if no header exists in this
+	     * collection with the provided name.
+	     * @param headerName - The name of the header.
+	     */
+	    get(headerName) {
+	        const header = this._headersMap[getHeaderKey(headerName)];
+	        return !header ? undefined : header.value;
+	    }
+	    /**
+	     * Get whether or not this header collection contains a header entry for the provided header name.
+	     */
+	    contains(headerName) {
+	        return !!this._headersMap[getHeaderKey(headerName)];
+	    }
+	    /**
+	     * Remove the header with the provided headerName. Return whether or not the header existed and
+	     * was removed.
+	     * @param headerName - The name of the header to remove.
+	     */
+	    remove(headerName) {
+	        const result = this.contains(headerName);
+	        delete this._headersMap[getHeaderKey(headerName)];
+	        return result;
+	    }
+	    /**
+	     * Get the headers that are contained this collection as an object.
+	     */
+	    rawHeaders() {
+	        return this.toJson({ preserveCase: true });
+	    }
+	    /**
+	     * Get the headers that are contained in this collection as an array.
+	     */
+	    headersArray() {
+	        const headers = [];
+	        for (const headerKey in this._headersMap) {
+	            headers.push(this._headersMap[headerKey]);
+	        }
+	        return headers;
+	    }
+	    /**
+	     * Get the header names that are contained in this collection.
+	     */
+	    headerNames() {
+	        const headerNames = [];
+	        const headers = this.headersArray();
+	        for (let i = 0; i < headers.length; ++i) {
+	            headerNames.push(headers[i].name);
+	        }
+	        return headerNames;
+	    }
+	    /**
+	     * Get the header values that are contained in this collection.
+	     */
+	    headerValues() {
+	        const headerValues = [];
+	        const headers = this.headersArray();
+	        for (let i = 0; i < headers.length; ++i) {
+	            headerValues.push(headers[i].value);
+	        }
+	        return headerValues;
+	    }
+	    /**
+	     * Get the JSON object representation of this HTTP header collection.
+	     */
+	    toJson(options = {}) {
+	        const result = {};
+	        if (options.preserveCase) {
+	            for (const headerKey in this._headersMap) {
+	                const header = this._headersMap[headerKey];
+	                result[header.name] = header.value;
+	            }
+	        }
+	        else {
+	            for (const headerKey in this._headersMap) {
+	                const header = this._headersMap[headerKey];
+	                result[getHeaderKey(header.name)] = header.value;
+	            }
+	        }
+	        return result;
+	    }
+	    /**
+	     * Get the string representation of this HTTP header collection.
+	     */
+	    toString() {
+	        return JSON.stringify(this.toJson({ preserveCase: true }));
+	    }
+	    /**
+	     * Create a deep clone/copy of this HttpHeaders collection.
+	     */
+	    clone() {
+	        const resultPreservingCasing = {};
+	        for (const headerKey in this._headersMap) {
+	            const header = this._headersMap[headerKey];
+	            resultPreservingCasing[header.name] = header.value;
+	        }
+	        return new HttpHeaders(resultPreservingCasing);
+	    }
+	}
+	util$9.HttpHeaders = HttpHeaders;
+	
+	return util$9;
+}
+
+var hasRequiredResponse$1;
+
+function requireResponse$1 () {
+	if (hasRequiredResponse$1) return response$1;
+	hasRequiredResponse$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(response$1, "__esModule", { value: true });
+	response$1.toCompatResponse = toCompatResponse;
+	response$1.toPipelineResponse = toPipelineResponse;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const util_js_1 = requireUtil$9();
+	const originalResponse = Symbol("Original FullOperationResponse");
+	/**
+	 * A helper to convert response objects from the new pipeline back to the old one.
+	 * @param response - A response object from core-client.
+	 * @returns A response compatible with `HttpOperationResponse` from core-http.
+	 */
+	function toCompatResponse(response, options) {
+	    let request = (0, util_js_1.toWebResourceLike)(response.request);
+	    let headers = (0, util_js_1.toHttpHeadersLike)(response.headers);
+	    if (options?.createProxy) {
+	        return new Proxy(response, {
+	            get(target, prop, receiver) {
+	                if (prop === "headers") {
+	                    return headers;
+	                }
+	                else if (prop === "request") {
+	                    return request;
+	                }
+	                else if (prop === originalResponse) {
+	                    return response;
+	                }
+	                return Reflect.get(target, prop, receiver);
+	            },
+	            set(target, prop, value, receiver) {
+	                if (prop === "headers") {
+	                    headers = value;
+	                }
+	                else if (prop === "request") {
+	                    request = value;
+	                }
+	                return Reflect.set(target, prop, value, receiver);
+	            },
+	        });
+	    }
+	    else {
+	        return {
+	            ...response,
+	            request,
+	            headers,
+	        };
+	    }
+	}
+	/**
+	 * A helper to convert back to a PipelineResponse
+	 * @param compatResponse - A response compatible with `HttpOperationResponse` from core-http.
+	 */
+	function toPipelineResponse(compatResponse) {
+	    const extendedCompatResponse = compatResponse;
+	    const response = extendedCompatResponse[originalResponse];
+	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)(compatResponse.headers.toJson({ preserveCase: true }));
+	    if (response) {
+	        response.headers = headers;
+	        return response;
+	    }
+	    else {
+	        return {
+	            ...compatResponse,
+	            headers,
+	            request: (0, util_js_1.toPipelineRequest)(compatResponse.request),
+	        };
+	    }
+	}
+	
+	return response$1;
+}
+
+var hasRequiredExtendedClient;
+
+function requireExtendedClient () {
+	if (hasRequiredExtendedClient) return extendedClient;
+	hasRequiredExtendedClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(extendedClient, "__esModule", { value: true });
+	extendedClient.ExtendedServiceClient = void 0;
+	const disableKeepAlivePolicy_js_1 = requireDisableKeepAlivePolicy();
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_client_1 = /*@__PURE__*/ requireCommonjs$7();
+	const response_js_1 = requireResponse$1();
+	/**
+	 * Client to provide compatability between core V1 & V2.
+	 */
+	class ExtendedServiceClient extends core_client_1.ServiceClient {
+	    constructor(options) {
+	        super(options);
+	        if (options.keepAliveOptions?.enable === false &&
+	            !(0, disableKeepAlivePolicy_js_1.pipelineContainsDisableKeepAlivePolicy)(this.pipeline)) {
+	            this.pipeline.addPolicy((0, disableKeepAlivePolicy_js_1.createDisableKeepAlivePolicy)());
+	        }
+	        if (options.redirectOptions?.handleRedirects === false) {
+	            this.pipeline.removePolicy({
+	                name: core_rest_pipeline_1.redirectPolicyName,
+	            });
+	        }
+	    }
+	    /**
+	     * Compatible send operation request function.
+	     *
+	     * @param operationArguments - Operation arguments
+	     * @param operationSpec - Operation Spec
+	     * @returns
+	     */
+	    async sendOperationRequest(operationArguments, operationSpec) {
+	        const userProvidedCallBack = operationArguments?.options?.onResponse;
+	        let lastResponse;
+	        function onResponse(rawResponse, flatResponse, error) {
+	            lastResponse = rawResponse;
+	            if (userProvidedCallBack) {
+	                userProvidedCallBack(rawResponse, flatResponse, error);
+	            }
+	        }
+	        operationArguments.options = {
+	            ...operationArguments.options,
+	            onResponse,
+	        };
+	        const result = await super.sendOperationRequest(operationArguments, operationSpec);
+	        if (lastResponse) {
+	            Object.defineProperty(result, "_response", {
+	                value: (0, response_js_1.toCompatResponse)(lastResponse),
+	            });
+	        }
+	        return result;
+	    }
+	}
+	extendedClient.ExtendedServiceClient = ExtendedServiceClient;
+	
+	return extendedClient;
+}
+
+var requestPolicyFactoryPolicy = {};
+
+var hasRequiredRequestPolicyFactoryPolicy;
+
+function requireRequestPolicyFactoryPolicy () {
+	if (hasRequiredRequestPolicyFactoryPolicy) return requestPolicyFactoryPolicy;
+	hasRequiredRequestPolicyFactoryPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.requestPolicyFactoryPolicyName = exports$1.HttpPipelineLogLevel = void 0;
+		exports$1.createRequestPolicyFactoryPolicy = createRequestPolicyFactoryPolicy;
+		const util_js_1 = requireUtil$9();
+		const response_js_1 = requireResponse$1();
+		/**
+		 * An enum for compatibility with RequestPolicy
+		 */
+		var HttpPipelineLogLevel;
+		(function (HttpPipelineLogLevel) {
+		    HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";
+		    HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";
+		    HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";
+		    HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";
+		})(HttpPipelineLogLevel || (exports$1.HttpPipelineLogLevel = HttpPipelineLogLevel = {}));
+		const mockRequestPolicyOptions = {
+		    log(_logLevel, _message) {
+		        /* do nothing */
+		    },
+		    shouldLog(_logLevel) {
+		        return false;
+		    },
+		};
+		/**
+		 * The name of the RequestPolicyFactoryPolicy
+		 */
+		exports$1.requestPolicyFactoryPolicyName = "RequestPolicyFactoryPolicy";
+		/**
+		 * A policy that wraps policies written for core-http.
+		 * @param factories - An array of `RequestPolicyFactory` objects from a core-http pipeline
+		 */
+		function createRequestPolicyFactoryPolicy(factories) {
+		    const orderedFactories = factories.slice().reverse();
+		    return {
+		        name: exports$1.requestPolicyFactoryPolicyName,
+		        async sendRequest(request, next) {
+		            let httpPipeline = {
+		                async sendRequest(httpRequest) {
+		                    const response = await next((0, util_js_1.toPipelineRequest)(httpRequest));
+		                    return (0, response_js_1.toCompatResponse)(response, { createProxy: true });
+		                },
+		            };
+		            for (const factory of orderedFactories) {
+		                httpPipeline = factory.create(httpPipeline, mockRequestPolicyOptions);
+		            }
+		            const webResourceLike = (0, util_js_1.toWebResourceLike)(request, { createProxy: true });
+		            const response = await httpPipeline.sendRequest(webResourceLike);
+		            return (0, response_js_1.toPipelineResponse)(response);
+		        },
+		    };
+		}
+		
+	} (requestPolicyFactoryPolicy));
+	return requestPolicyFactoryPolicy;
+}
+
+var httpClientAdapter = {};
+
+var hasRequiredHttpClientAdapter;
+
+function requireHttpClientAdapter () {
+	if (hasRequiredHttpClientAdapter) return httpClientAdapter;
+	hasRequiredHttpClientAdapter = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(httpClientAdapter, "__esModule", { value: true });
+	httpClientAdapter.convertHttpClient = convertHttpClient;
+	const response_js_1 = requireResponse$1();
+	const util_js_1 = requireUtil$9();
+	/**
+	 * Converts a RequestPolicy based HttpClient to a PipelineRequest based HttpClient.
+	 * @param requestPolicyClient - A HttpClient compatible with core-http
+	 * @returns A HttpClient compatible with core-rest-pipeline
+	 */
+	function convertHttpClient(requestPolicyClient) {
+	    return {
+	        sendRequest: async (request) => {
+	            const response = await requestPolicyClient.sendRequest((0, util_js_1.toWebResourceLike)(request, { createProxy: true }));
+	            return (0, response_js_1.toPipelineResponse)(response);
+	        },
+	    };
+	}
+	
+	return httpClientAdapter;
+}
+
+var hasRequiredCommonjs$6;
+
+function requireCommonjs$6 () {
+	if (hasRequiredCommonjs$6) return commonjs$6;
+	hasRequiredCommonjs$6 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.toHttpHeadersLike = exports$1.convertHttpClient = exports$1.disableKeepAlivePolicyName = exports$1.HttpPipelineLogLevel = exports$1.createRequestPolicyFactoryPolicy = exports$1.requestPolicyFactoryPolicyName = exports$1.ExtendedServiceClient = void 0;
+		/**
+		 * A Shim Library that provides compatibility between Core V1 & V2 Packages.
+		 *
+		 * @packageDocumentation
+		 */
+		var extendedClient_js_1 = requireExtendedClient();
+		Object.defineProperty(exports$1, "ExtendedServiceClient", { enumerable: true, get: function () { return extendedClient_js_1.ExtendedServiceClient; } });
+		var requestPolicyFactoryPolicy_js_1 = requireRequestPolicyFactoryPolicy();
+		Object.defineProperty(exports$1, "requestPolicyFactoryPolicyName", { enumerable: true, get: function () { return requestPolicyFactoryPolicy_js_1.requestPolicyFactoryPolicyName; } });
+		Object.defineProperty(exports$1, "createRequestPolicyFactoryPolicy", { enumerable: true, get: function () { return requestPolicyFactoryPolicy_js_1.createRequestPolicyFactoryPolicy; } });
+		Object.defineProperty(exports$1, "HttpPipelineLogLevel", { enumerable: true, get: function () { return requestPolicyFactoryPolicy_js_1.HttpPipelineLogLevel; } });
+		var disableKeepAlivePolicy_js_1 = requireDisableKeepAlivePolicy();
+		Object.defineProperty(exports$1, "disableKeepAlivePolicyName", { enumerable: true, get: function () { return disableKeepAlivePolicy_js_1.disableKeepAlivePolicyName; } });
+		var httpClientAdapter_js_1 = requireHttpClientAdapter();
+		Object.defineProperty(exports$1, "convertHttpClient", { enumerable: true, get: function () { return httpClientAdapter_js_1.convertHttpClient; } });
+		var util_js_1 = requireUtil$9();
+		Object.defineProperty(exports$1, "toHttpHeadersLike", { enumerable: true, get: function () { return util_js_1.toHttpHeadersLike; } });
+		
+	} (commonjs$6));
+	return commonjs$6;
+}
+
+var commonjs$4 = {};
+
+var xml = {};
+
+var fxp = {exports: {}};
+
+var hasRequiredFxp;
+
+function requireFxp () {
+	if (hasRequiredFxp) return fxp.exports;
+	hasRequiredFxp = 1;
+	(()=>{var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:true,get:i[n]});},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:true});}},e={};t.r(e),t.d(e,{XMLBuilder:()=>lt,XMLParser:()=>tt,XMLValidator:()=>pt});const i=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+i+"]["+i+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const i=[];let n=e.exec(t);for(;n;){const s=[];s.startIndex=e.lastIndex-n[0].length;const r=n.length;for(let t=0;t"!==t[o]&&" "!==t[o]&&"\t"!==t[o]&&"\n"!==t[o]&&"\r"!==t[o];o++)p+=t[o];if(p=p.trim(),"/"===p[p.length-1]&&(p=p.substring(0,p.length-1),o--),!r(p)){let e;return e=0===p.trim().length?"Invalid space after '<'.":"Tag '"+p+"' is an invalid name.",x("InvalidTag",e,b(t,o))}const c=f(t,o);if(false===c)return x("InvalidAttr","Attributes for '"+p+"' have open quote.",b(t,o));let N=c.value;if(o=c.index,"/"===N[N.length-1]){const i=o-N.length;N=N.substring(0,N.length-1);const s=g(N,e);if(true!==s)return x(s.err.code,s.err.msg,b(t,i+s.err.line));n=true;}else if(d){if(!c.tagClosed)return x("InvalidTag","Closing tag '"+p+"' doesn't have proper closing.",b(t,o));if(N.trim().length>0)return x("InvalidTag","Closing tag '"+p+"' can't have attributes or invalid starting.",b(t,a));if(0===i.length)return x("InvalidTag","Closing tag '"+p+"' has not been opened.",b(t,a));{const e=i.pop();if(p!==e.tagName){let i=b(t,e.tagStartPos);return x("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+i.line+", col "+i.col+") instead of closing tag '"+p+"'.",b(t,a))}0==i.length&&(s=true);}}else {const r=g(N,e);if(true!==r)return x(r.err.code,r.err.msg,b(t,o-N.length+r.err.line));if(true===s)return x("InvalidXml","Multiple possible root nodes found.",b(t,o));-1!==e.unpairedTags.indexOf(p)||i.push({tagName:p,tagStartPos:a}),n=true;}for(o++;o0)||x("InvalidXml","Invalid '"+JSON.stringify(i.map((t=>t.tagName)),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):x("InvalidXml","Start tag expected.",1)}function l(t){return " "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const i=e;for(;e5&&"xml"===n)return x("InvalidXml","XML declaration allowed only at the start of the document.",b(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function h(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let i=1;for(e+=8;e"===t[e]&&(i--,0===i))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const d='"',p="'";function f(t,e){let i="",n="",s=false;for(;e"===t[e]&&""===n){s=true;break}i+=t[e];}return ""===n&&{value:i,index:e,tagClosed:s}}const c=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function g(t,e){const i=s(t,c),n={};for(let t=0;tfalse,commentPropName:false,unpairedTags:[],processEntities:true,htmlEntities:false,ignoreDeclaration:false,ignorePiTags:false,transformTagName:false,transformAttributeName:false,updateTag:function(t,e,i){return t},captureMetaData:false};let T;T="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class y{constructor(t){this.tagname=t,this.child=[],this[":@"]={};}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e});}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][T]={startIndex:e});}static getMetaDataSymbol(){return T}}class w{constructor(t){this.suppressValidationErr=!t;}readDocType(t,e){const i={};if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let n=1,s=false,r=false,o="";for(;e"===t[e]){if(r?"-"===t[e-1]&&"-"===t[e-2]&&(r=false,n--):n--,0===n)break}else "["===t[e]?s=true:o+=t[e];else {if(s&&P(t,"!ENTITY",e)){let n,s;e+=7,[n,s,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===s.indexOf("&")&&(i[n]={regx:RegExp(`&${n};`,"g"),val:s});}else if(s&&P(t,"!ELEMENT",e)){e+=8;const{index:i}=this.readElementExp(t,e+1);e=i;}else if(s&&P(t,"!ATTLIST",e))e+=8;else if(s&&P(t,"!NOTATION",e)){e+=9;const{index:i}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=i;}else {if(!P(t,"!--",e))throw new Error("Invalid DOCTYPE");r=true;}n++,o="";}if(0!==n)throw new Error("Unclosed DOCTYPE")}return {entities:i,i:e}}readEntityExp(t,e){e=I(t,e);let i="";for(;e{for(;e{for(const i of t){if("string"==typeof i&&e===i)return  true;if(i instanceof RegExp&&i.test(e))return  true}}:()=>false}class D{constructor(t){if(this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:(t,e)=>String.fromCodePoint(Number.parseInt(e,10))},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:(t,e)=>String.fromCodePoint(Number.parseInt(e,16))}},this.addExternalEntities=j,this.parseXml=L,this.parseTextData=M,this.resolveNameSpace=F,this.buildAttributesMap=k,this.isItStopNode=Y,this.replaceEntitiesValue=B,this.readStopNodeData=W,this.saveTextToParentTag=R,this.addChild=U,this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.options.stopNodes&&this.options.stopNodes.length>0){this.stopNodesExact=new Set,this.stopNodesWildcard=new Set;for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t));const n=this.options.tagValueProcessor(e,t,i,s,r);return null==n?t:typeof n!=typeof t||n!==t?n:this.options.trimValues||t.trim()===t?q(t,this.options.parseTagValue,this.options.numberParseOptions):t}}function F(t){if(this.options.removeNSPrefix){const e=t.split(":"),i="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return "";2===e.length&&(t=i+e[1]);}return t}const _=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function k(t,e){if(true!==this.options.ignoreAttributes&&"string"==typeof t){const i=s(t,_),n=i.length,r={};for(let t=0;t",o,"Closing Tag is not closed.");let r=t.substring(o+2,e).trim();if(this.options.removeNSPrefix){const t=r.indexOf(":");-1!==t&&(r=r.substr(t+1));}this.options.transformTagName&&(r=this.options.transformTagName(r)),i&&(n=this.saveTextToParentTag(n,i,s));const a=s.substring(s.lastIndexOf(".")+1);if(r&&-1!==this.options.unpairedTags.indexOf(r))throw new Error(`Unpaired tag can not be used as closing tag: `);let l=0;a&&-1!==this.options.unpairedTags.indexOf(a)?(l=s.lastIndexOf(".",s.lastIndexOf(".")-1),this.tagsNodeStack.pop()):l=s.lastIndexOf("."),s=s.substring(0,l),i=this.tagsNodeStack.pop(),n="",o=e;}else if("?"===t[o+1]){let e=X(t,o,false,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,i,s),this.options.ignoreDeclaration&&"?xml"===e.tagName||this.options.ignorePiTags);else {const t=new y(e.tagName);t.add(this.options.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,s)),this.addChild(i,t,s,o);}o=e.closeIndex+1;}else if("!--"===t.substr(o+1,3)){const e=G(t,"--\x3e",o+4,"Comment is not closed.");if(this.options.commentPropName){const r=t.substring(o+4,e-2);n=this.saveTextToParentTag(n,i,s),i.add(this.options.commentPropName,[{[this.options.textNodeName]:r}]);}o=e;}else if("!D"===t.substr(o+1,2)){const e=r.readDocType(t,o);this.docTypeEntities=e.entities,o=e.i;}else if("!["===t.substr(o+1,2)){const e=G(t,"]]>",o,"CDATA is not closed.")-2,r=t.substring(o+9,e);n=this.saveTextToParentTag(n,i,s);let a=this.parseTextData(r,i.tagname,s,true,false,true,true);null==a&&(a=""),this.options.cdataPropName?i.add(this.options.cdataPropName,[{[this.options.textNodeName]:r}]):i.add(this.options.textNodeName,a),o=e+2;}else {let r=X(t,o,this.options.removeNSPrefix),a=r.tagName;const l=r.rawTagName;let u=r.tagExp,h=r.attrExpPresent,d=r.closeIndex;if(this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t;}i&&n&&"!xml"!==i.tagname&&(n=this.saveTextToParentTag(n,i,s,false));const p=i;p&&-1!==this.options.unpairedTags.indexOf(p.tagname)&&(i=this.tagsNodeStack.pop(),s=s.substring(0,s.lastIndexOf("."))),a!==e.tagname&&(s+=s?"."+a:a);const f=o;if(this.isItStopNode(this.stopNodesExact,this.stopNodesWildcard,s,a)){let e="";if(u.length>0&&u.lastIndexOf("/")===u.length-1)"/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),o=r.closeIndex;else if(-1!==this.options.unpairedTags.indexOf(a))o=r.closeIndex;else {const i=this.readStopNodeData(t,l,d+1);if(!i)throw new Error(`Unexpected end of ${l}`);o=i.i,e=i.tagContent;}const n=new y(a);a!==u&&h&&(n[":@"]=this.buildAttributesMap(u,s)),e&&(e=this.parseTextData(e,a,s,true,h,true,true)),s=s.substr(0,s.lastIndexOf(".")),n.add(this.options.textNodeName,e),this.addChild(i,n,s,f);}else {if(u.length>0&&u.lastIndexOf("/")===u.length-1){if("/"===a[a.length-1]?(a=a.substr(0,a.length-1),s=s.substr(0,s.length-1),u=a):u=u.substr(0,u.length-1),this.options.transformTagName){const t=this.options.transformTagName(a);u===a&&(u=t),a=t;}const t=new y(a);a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),s=s.substr(0,s.lastIndexOf("."));}else {const t=new y(a);this.tagsNodeStack.push(i),a!==u&&h&&(t[":@"]=this.buildAttributesMap(u,s)),this.addChild(i,t,s,f),i=t;}n="",o=d;}}else n+=t[o];return e.child};function U(t,e,i,n){this.options.captureMetaData||(n=void 0);const s=this.options.updateTag(e.tagname,i,e[":@"]);false===s||("string"==typeof s?(e.tagname=s,t.addChild(e,n)):t.addChild(e,n));}const B=function(t){if(this.options.processEntities){for(let e in this.docTypeEntities){const i=this.docTypeEntities[e];t=t.replace(i.regx,i.val);}for(let e in this.lastEntities){const i=this.lastEntities[e];t=t.replace(i.regex,i.val);}if(this.options.htmlEntities)for(let e in this.htmlEntities){const i=this.htmlEntities[e];t=t.replace(i.regex,i.val);}t=t.replace(this.ampEntity.regex,this.ampEntity.val);}return t};function R(t,e,i,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,i,false,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Y(t,e,i,n){return !(!e||!e.has(n))||!(!t||!t.has(i))}function G(t,e,i,n){const s=t.indexOf(e,i);if(-1===s)throw new Error(n);return s+e.length-1}function X(t,e,i,n=">"){const s=function(t,e,i=">"){let n,s="";for(let r=e;r",i,`${e} is not closed`);if(t.substring(i+2,r).trim()===e&&(s--,0===s))return {tagContent:t.substring(n,i),i:r};i=r;}else if("?"===t[i+1])i=G(t,"?>",i+1,"StopNode is not closed.");else if("!--"===t.substr(i+1,3))i=G(t,"--\x3e",i+3,"StopNode is not closed.");else if("!["===t.substr(i+1,2))i=G(t,"]]>",i,"StopNode is not closed.")-2;else {const n=X(t,i,">");n&&((n&&n.tagName)===e&&"/"!==n.tagExp[n.tagExp.length-1]&&s++,i=n.closeIndex);}}function q(t,e,i){if(e&&"string"==typeof t){const e=t.trim();return "true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},C,e),!t||"string"!=typeof t)return t;let i=t.trim();if(void 0!==e.skipLike&&e.skipLike.test(i))return t;if("0"===t)return 0;if(e.hex&&A.test(i))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(i);if(-1!==i.search(/.+[eE].+/))return function(t,e,i){if(!i.eNotation)return t;const n=e.match(V);if(n){let s=n[1]||"";const r=-1===n[3].indexOf("e")?"E":"e",o=n[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:1!==o.length||!n[3].startsWith(`.${r}`)&&n[3][0]!==r?i.leadingZeros&&!a?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,i,e);{const s=S.exec(i);if(s){const r=s[1]||"",o=s[2];let a=(n=s[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!l))return t;{const n=Number(i),s=String(n);if(0===n||-0===n)return n;if(-1!==s.search(/[eE]/))return e.eNotation?n:t;if(-1!==i.indexOf("."))return "0"===s||s===a||s===`${r}${a}`?n:t;let l=o?a:i;return o?l===s||r+l===s?n:t:l===s||l===r+s?n:t}}return t}var n;}(t,i)}return void 0!==t?t:""}const Z=y.getMetaDataSymbol();function K(t,e){return Q(t,e)}function Q(t,e,i){let n;const s={};for(let r=0;r0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function z(t){const e=Object.keys(t);for(let t=0;t0&&(i="\n"),it(t,e,"",i)}function it(t,e,i,n){let s="",r=false;for(let o=0;o`,r=false;continue}if(l===e.commentPropName){s+=n+`\x3c!--${a[l][0][e.textNodeName]}--\x3e`,r=true;continue}if("?"===l[0]){const t=st(a[":@"],e),i="?xml"===l?"":n;let o=a[l][0][e.textNodeName];o=0!==o.length?" "+o:"",s+=i+`<${l}${o}${t}?>`,r=true;continue}let h=n;""!==h&&(h+=e.indentBy);const d=n+`<${l}${st(a[":@"],e)}`,p=it(a[l],e,u,h);-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=d+">":s+=d+"/>":p&&0!==p.length||!e.suppressEmptyNode?p&&p.endsWith(">")?s+=d+`>${p}${n}`:(s+=d+">",p&&""!==n&&(p.includes("/>")||p.includes("`):s+=d+"/>",r=true;}return s}function nt(t){const e=Object.keys(t);for(let i=0;i0&&e.processEntities)for(let i=0;i","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:true,stopNodes:[],oneListGroup:false};function lt(t){this.options=Object.assign({},at,t),true===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return  false}:(this.ignoreAttributesFn=$(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=dt),this.processTextOrObjNode=ut,this.options.format?(this.indentate=ht,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return ""},this.tagEndChar=">",this.newLine="");}function ut(t,e,i,n){const s=this.j2x(t,i+1,n.concat(e));return void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,i):this.buildObjectNode(s.val,e,s.attrStr,i)}function ht(t){return this.options.indentBy.repeat(t)}function dt(t){return !(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}lt.prototype.build=function(t){return this.options.preserveOrder?et(t,this.options):(Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t}),this.j2x(t,0,[]).val)},lt.prototype.j2x=function(t,e,i){let n="",s="";const r=i.join(".");for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o))if(void 0===t[o])this.isAttribute(o)&&(s+="");else if(null===t[o])this.isAttribute(o)||o===this.options.cdataPropName?s+="":"?"===o[0]?s+=this.indentate(e)+"<"+o+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+o+"/"+this.tagEndChar;else if(t[o]instanceof Date)s+=this.buildTextValNode(t[o],o,"",e);else if("object"!=typeof t[o]){const i=this.isAttribute(o);if(i&&!this.ignoreAttributesFn(i,r))n+=this.buildAttrPairStr(i,""+t[o]);else if(!i)if(o===this.options.textNodeName){let e=this.options.tagValueProcessor(o,""+t[o]);s+=this.replaceEntitiesValue(e);}else s+=this.buildTextValNode(t[o],o,"",e);}else if(Array.isArray(t[o])){const n=t[o].length;let r="",a="";for(let l=0;l"+t+s}},lt.prototype.closeTag=function(t){let e="";return  -1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(false!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(n)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(n)+"<"+e+i+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(n)+"<"+e+i+this.closeTag(e)+this.tagEndChar:this.indentate(n)+"<"+e+i+">"+s+"0&&this.options.processEntities)for(let e=0;e${xmlData}`.replace(/\n/g, "");
+	}
+	/**
+	 * Converts given XML string into JSON
+	 * @param str - String containing the XML content to be parsed into JSON
+	 * @param opts - Options that govern the parsing of given xml string
+	 * `includeRoot` indicates whether the root element is to be included or not in the output
+	 */
+	async function parseXML(str, opts = {}) {
+	    if (!str) {
+	        throw new Error("Document is empty");
+	    }
+	    const validation = fast_xml_parser_1.XMLValidator.validate(str);
+	    if (validation !== true) {
+	        throw validation;
+	    }
+	    const parser = new fast_xml_parser_1.XMLParser(getParserOptions(opts));
+	    const parsedXml = parser.parse(str);
+	    // Remove the  node.
+	    // This is a change in behavior on fxp v4. Issue #424
+	    if (parsedXml["?xml"]) {
+	        delete parsedXml["?xml"];
+	    }
+	    if (!opts.includeRoot) {
+	        for (const key of Object.keys(parsedXml)) {
+	            const value = parsedXml[key];
+	            return typeof value === "object" ? Object.assign({}, value) : value;
+	        }
+	    }
+	    return parsedXml;
+	}
+	
+	return xml;
+}
+
+var hasRequiredCommonjs$5;
+
+function requireCommonjs$5 () {
+	if (hasRequiredCommonjs$5) return commonjs$4;
+	hasRequiredCommonjs$5 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.XML_CHARKEY = exports$1.XML_ATTRKEY = exports$1.parseXML = exports$1.stringifyXML = void 0;
+		var xml_js_1 = requireXml();
+		Object.defineProperty(exports$1, "stringifyXML", { enumerable: true, get: function () { return xml_js_1.stringifyXML; } });
+		Object.defineProperty(exports$1, "parseXML", { enumerable: true, get: function () { return xml_js_1.parseXML; } });
+		var xml_common_js_1 = requireXml_common();
+		Object.defineProperty(exports$1, "XML_ATTRKEY", { enumerable: true, get: function () { return xml_common_js_1.XML_ATTRKEY; } });
+		Object.defineProperty(exports$1, "XML_CHARKEY", { enumerable: true, get: function () { return xml_common_js_1.XML_CHARKEY; } });
+		
+	} (commonjs$4));
+	return commonjs$4;
+}
+
+var log$1 = {};
+
+var hasRequiredLog$1;
+
+function requireLog$1 () {
+	if (hasRequiredLog$1) return log$1;
+	hasRequiredLog$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(log$1, "__esModule", { value: true });
+	log$1.logger = void 0;
+	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
+	/**
+	 * The `@azure/logger` configuration for this package.
+	 */
+	log$1.logger = (0, logger_1.createClientLogger)("storage-blob");
+	
+	return log$1;
+}
+
+var StorageRetryPolicyFactory$1 = {};
+
+var StorageRetryPolicy$1 = {};
+
+var commonjs$3 = {};
+
+var AbortError$2 = {};
+
+var hasRequiredAbortError$1;
+
+function requireAbortError$1 () {
+	if (hasRequiredAbortError$1) return AbortError$2;
+	hasRequiredAbortError$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(AbortError$2, "__esModule", { value: true });
+	AbortError$2.AbortError = void 0;
+	/**
+	 * This error is thrown when an asynchronous operation has been aborted.
+	 * Check for this error by testing the `name` that the name property of the
+	 * error matches `"AbortError"`.
+	 *
+	 * @example
+	 * ```ts
+	 * const controller = new AbortController();
+	 * controller.abort();
+	 * try {
+	 *   doAsyncWork(controller.signal)
+	 * } catch (e) {
+	 *   if (e.name === 'AbortError') {
+	 *     // handle abort error here.
+	 *   }
+	 * }
+	 * ```
+	 */
+	class AbortError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = "AbortError";
+	    }
+	}
+	AbortError$2.AbortError = AbortError;
+	
+	return AbortError$2;
+}
+
+var hasRequiredCommonjs$4;
+
+function requireCommonjs$4 () {
+	if (hasRequiredCommonjs$4) return commonjs$3;
+	hasRequiredCommonjs$4 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT license.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.AbortError = void 0;
+		var AbortError_js_1 = requireAbortError$1();
+		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
+		
+	} (commonjs$3));
+	return commonjs$3;
+}
+
+var RequestPolicy$1 = {};
+
+var hasRequiredRequestPolicy$1;
+
+function requireRequestPolicy$1 () {
+	if (hasRequiredRequestPolicy$1) return RequestPolicy$1;
+	hasRequiredRequestPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(RequestPolicy$1, "__esModule", { value: true });
+	RequestPolicy$1.BaseRequestPolicy = void 0;
+	/**
+	 * The base class from which all request policies derive.
+	 */
+	class BaseRequestPolicy {
+	    _nextPolicy;
+	    _options;
+	    /**
+	     * The main method to implement that manipulates a request/response.
+	     */
+	    constructor(
+	    /**
+	     * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
+	     */
+	    _nextPolicy, 
+	    /**
+	     * The options that can be passed to a given request policy.
+	     */
+	    _options) {
+	        this._nextPolicy = _nextPolicy;
+	        this._options = _options;
+	    }
+	    /**
+	     * Get whether or not a log with the provided log level should be logged.
+	     * @param logLevel - The log level of the log that will be logged.
+	     * @returns Whether or not a log with the provided log level should be logged.
+	     */
+	    shouldLog(logLevel) {
+	        return this._options.shouldLog(logLevel);
+	    }
+	    /**
+	     * Attempt to log the provided message to the provided logger. If no logger was provided or if
+	     * the log level does not meat the logger's threshold, then nothing will be logged.
+	     * @param logLevel - The log level of this log.
+	     * @param message - The message of this log.
+	     */
+	    log(logLevel, message) {
+	        this._options.log(logLevel, message);
+	    }
+	}
+	RequestPolicy$1.BaseRequestPolicy = BaseRequestPolicy;
+	
+	return RequestPolicy$1;
+}
+
+var constants$8 = {};
+
+var hasRequiredConstants$8;
+
+function requireConstants$8 () {
+	if (hasRequiredConstants$8) return constants$8;
+	hasRequiredConstants$8 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.PathStylePorts = exports$1.BlobDoesNotUseCustomerSpecifiedEncryption = exports$1.BlobUsesCustomerSpecifiedEncryptionMsg = exports$1.StorageBlobLoggingAllowedQueryParameters = exports$1.StorageBlobLoggingAllowedHeaderNames = exports$1.DevelopmentConnectionString = exports$1.EncryptionAlgorithmAES25 = exports$1.HTTP_VERSION_1_1 = exports$1.HTTP_LINE_ENDING = exports$1.BATCH_MAX_PAYLOAD_IN_BYTES = exports$1.BATCH_MAX_REQUEST = exports$1.SIZE_1_MB = exports$1.ETagAny = exports$1.ETagNone = exports$1.HeaderConstants = exports$1.HTTPURLConnection = exports$1.URLConstants = exports$1.StorageOAuthScopes = exports$1.REQUEST_TIMEOUT = exports$1.DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = exports$1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = exports$1.DEFAULT_BLOCK_BUFFER_SIZE_BYTES = exports$1.BLOCK_BLOB_MAX_BLOCKS = exports$1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = exports$1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = exports$1.SERVICE_VERSION = exports$1.SDK_VERSION = void 0;
+		exports$1.SDK_VERSION = "12.29.1";
+		exports$1.SERVICE_VERSION = "2025-11-05";
+		exports$1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; // 256MB
+		exports$1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; // 4000MB
+		exports$1.BLOCK_BLOB_MAX_BLOCKS = 50000;
+		exports$1.DEFAULT_BLOCK_BUFFER_SIZE_BYTES = 8 * 1024 * 1024; // 8MB
+		exports$1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = 4 * 1024 * 1024; // 4MB
+		exports$1.DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = 5;
+		exports$1.REQUEST_TIMEOUT = 100 * 1000; // In ms
+		/**
+		 * The OAuth scope to use with Azure Storage.
+		 */
+		exports$1.StorageOAuthScopes = "https://storage.azure.com/.default";
+		exports$1.URLConstants = {
+		    Parameters: {
+		        FORCE_BROWSER_NO_CACHE: "_",
+		        SIGNATURE: "sig",
+		        SNAPSHOT: "snapshot",
+		        VERSIONID: "versionid",
+		        TIMEOUT: "timeout",
+		    },
+		};
+		exports$1.HTTPURLConnection = {
+		    HTTP_ACCEPTED: 202,
+		    HTTP_CONFLICT: 409,
+		    HTTP_NOT_FOUND: 404,
+		    HTTP_PRECON_FAILED: 412,
+		    HTTP_RANGE_NOT_SATISFIABLE: 416,
+		};
+		exports$1.HeaderConstants = {
+		    AUTHORIZATION: "Authorization",
+		    AUTHORIZATION_SCHEME: "Bearer",
+		    CONTENT_ENCODING: "Content-Encoding",
+		    CONTENT_ID: "Content-ID",
+		    CONTENT_LANGUAGE: "Content-Language",
+		    CONTENT_LENGTH: "Content-Length",
+		    CONTENT_MD5: "Content-Md5",
+		    CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",
+		    CONTENT_TYPE: "Content-Type",
+		    COOKIE: "Cookie",
+		    DATE: "date",
+		    IF_MATCH: "if-match",
+		    IF_MODIFIED_SINCE: "if-modified-since",
+		    IF_NONE_MATCH: "if-none-match",
+		    IF_UNMODIFIED_SINCE: "if-unmodified-since",
+		    PREFIX_FOR_STORAGE: "x-ms-",
+		    RANGE: "Range",
+		    USER_AGENT: "User-Agent",
+		    X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",
+		    X_MS_COPY_SOURCE: "x-ms-copy-source",
+		    X_MS_DATE: "x-ms-date",
+		    X_MS_ERROR_CODE: "x-ms-error-code",
+		    X_MS_VERSION: "x-ms-version",
+		    X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code",
+		};
+		exports$1.ETagNone = "";
+		exports$1.ETagAny = "*";
+		exports$1.SIZE_1_MB = 1 * 1024 * 1024;
+		exports$1.BATCH_MAX_REQUEST = 256;
+		exports$1.BATCH_MAX_PAYLOAD_IN_BYTES = 4 * exports$1.SIZE_1_MB;
+		exports$1.HTTP_LINE_ENDING = "\r\n";
+		exports$1.HTTP_VERSION_1_1 = "HTTP/1.1";
+		exports$1.EncryptionAlgorithmAES25 = "AES256";
+		exports$1.DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;
+		exports$1.StorageBlobLoggingAllowedHeaderNames = [
+		    "Access-Control-Allow-Origin",
+		    "Cache-Control",
+		    "Content-Length",
+		    "Content-Type",
+		    "Date",
+		    "Request-Id",
+		    "traceparent",
+		    "Transfer-Encoding",
+		    "User-Agent",
+		    "x-ms-client-request-id",
+		    "x-ms-date",
+		    "x-ms-error-code",
+		    "x-ms-request-id",
+		    "x-ms-return-client-request-id",
+		    "x-ms-version",
+		    "Accept-Ranges",
+		    "Content-Disposition",
+		    "Content-Encoding",
+		    "Content-Language",
+		    "Content-MD5",
+		    "Content-Range",
+		    "ETag",
+		    "Last-Modified",
+		    "Server",
+		    "Vary",
+		    "x-ms-content-crc64",
+		    "x-ms-copy-action",
+		    "x-ms-copy-completion-time",
+		    "x-ms-copy-id",
+		    "x-ms-copy-progress",
+		    "x-ms-copy-status",
+		    "x-ms-has-immutability-policy",
+		    "x-ms-has-legal-hold",
+		    "x-ms-lease-state",
+		    "x-ms-lease-status",
+		    "x-ms-range",
+		    "x-ms-request-server-encrypted",
+		    "x-ms-server-encrypted",
+		    "x-ms-snapshot",
+		    "x-ms-source-range",
+		    "If-Match",
+		    "If-Modified-Since",
+		    "If-None-Match",
+		    "If-Unmodified-Since",
+		    "x-ms-access-tier",
+		    "x-ms-access-tier-change-time",
+		    "x-ms-access-tier-inferred",
+		    "x-ms-account-kind",
+		    "x-ms-archive-status",
+		    "x-ms-blob-append-offset",
+		    "x-ms-blob-cache-control",
+		    "x-ms-blob-committed-block-count",
+		    "x-ms-blob-condition-appendpos",
+		    "x-ms-blob-condition-maxsize",
+		    "x-ms-blob-content-disposition",
+		    "x-ms-blob-content-encoding",
+		    "x-ms-blob-content-language",
+		    "x-ms-blob-content-length",
+		    "x-ms-blob-content-md5",
+		    "x-ms-blob-content-type",
+		    "x-ms-blob-public-access",
+		    "x-ms-blob-sequence-number",
+		    "x-ms-blob-type",
+		    "x-ms-copy-destination-snapshot",
+		    "x-ms-creation-time",
+		    "x-ms-default-encryption-scope",
+		    "x-ms-delete-snapshots",
+		    "x-ms-delete-type-permanent",
+		    "x-ms-deny-encryption-scope-override",
+		    "x-ms-encryption-algorithm",
+		    "x-ms-if-sequence-number-eq",
+		    "x-ms-if-sequence-number-le",
+		    "x-ms-if-sequence-number-lt",
+		    "x-ms-incremental-copy",
+		    "x-ms-lease-action",
+		    "x-ms-lease-break-period",
+		    "x-ms-lease-duration",
+		    "x-ms-lease-id",
+		    "x-ms-lease-time",
+		    "x-ms-page-write",
+		    "x-ms-proposed-lease-id",
+		    "x-ms-range-get-content-md5",
+		    "x-ms-rehydrate-priority",
+		    "x-ms-sequence-number-action",
+		    "x-ms-sku-name",
+		    "x-ms-source-content-md5",
+		    "x-ms-source-if-match",
+		    "x-ms-source-if-modified-since",
+		    "x-ms-source-if-none-match",
+		    "x-ms-source-if-unmodified-since",
+		    "x-ms-tag-count",
+		    "x-ms-encryption-key-sha256",
+		    "x-ms-copy-source-error-code",
+		    "x-ms-copy-source-status-code",
+		    "x-ms-if-tags",
+		    "x-ms-source-if-tags",
+		];
+		exports$1.StorageBlobLoggingAllowedQueryParameters = [
+		    "comp",
+		    "maxresults",
+		    "rscc",
+		    "rscd",
+		    "rsce",
+		    "rscl",
+		    "rsct",
+		    "se",
+		    "si",
+		    "sip",
+		    "sp",
+		    "spr",
+		    "sr",
+		    "srt",
+		    "ss",
+		    "st",
+		    "sv",
+		    "include",
+		    "marker",
+		    "prefix",
+		    "copyid",
+		    "restype",
+		    "blockid",
+		    "blocklisttype",
+		    "delimiter",
+		    "prevsnapshot",
+		    "ske",
+		    "skoid",
+		    "sks",
+		    "skt",
+		    "sktid",
+		    "skv",
+		    "snapshot",
+		];
+		exports$1.BlobUsesCustomerSpecifiedEncryptionMsg = "BlobUsesCustomerSpecifiedEncryption";
+		exports$1.BlobDoesNotUseCustomerSpecifiedEncryption = "BlobDoesNotUseCustomerSpecifiedEncryption";
+		/// List of ports used for path style addressing.
+		/// Path style addressing means that storage account is put in URI's Path segment in instead of in host.
+		exports$1.PathStylePorts = [
+		    "10000",
+		    "10001",
+		    "10002",
+		    "10003",
+		    "10004",
+		    "10100",
+		    "10101",
+		    "10102",
+		    "10103",
+		    "10104",
+		    "11000",
+		    "11001",
+		    "11002",
+		    "11003",
+		    "11004",
+		    "11100",
+		    "11101",
+		    "11102",
+		    "11103",
+		    "11104",
+		];
+		
+	} (constants$8));
+	return constants$8;
+}
+
+var utils_common$2 = {};
+
+var hasRequiredUtils_common$2;
+
+function requireUtils_common$2 () {
+	if (hasRequiredUtils_common$2) return utils_common$2;
+	hasRequiredUtils_common$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(utils_common$2, "__esModule", { value: true });
+	utils_common$2.escapeURLPath = escapeURLPath;
+	utils_common$2.getValueInConnString = getValueInConnString;
+	utils_common$2.extractConnectionStringParts = extractConnectionStringParts;
+	utils_common$2.appendToURLPath = appendToURLPath;
+	utils_common$2.setURLParameter = setURLParameter;
+	utils_common$2.getURLParameter = getURLParameter;
+	utils_common$2.setURLHost = setURLHost;
+	utils_common$2.getURLPath = getURLPath;
+	utils_common$2.getURLScheme = getURLScheme;
+	utils_common$2.getURLPathAndQuery = getURLPathAndQuery;
+	utils_common$2.getURLQueries = getURLQueries;
+	utils_common$2.appendToURLQuery = appendToURLQuery;
+	utils_common$2.truncatedISO8061Date = truncatedISO8061Date;
+	utils_common$2.base64encode = base64encode;
+	utils_common$2.base64decode = base64decode;
+	utils_common$2.generateBlockID = generateBlockID;
+	utils_common$2.delay = delay;
+	utils_common$2.padStart = padStart;
+	utils_common$2.sanitizeURL = sanitizeURL;
+	utils_common$2.sanitizeHeaders = sanitizeHeaders;
+	utils_common$2.iEqual = iEqual;
+	utils_common$2.getAccountNameFromUrl = getAccountNameFromUrl;
+	utils_common$2.isIpEndpointStyle = isIpEndpointStyle;
+	utils_common$2.toBlobTagsString = toBlobTagsString;
+	utils_common$2.toBlobTags = toBlobTags;
+	utils_common$2.toTags = toTags;
+	utils_common$2.toQuerySerialization = toQuerySerialization;
+	utils_common$2.parseObjectReplicationRecord = parseObjectReplicationRecord;
+	utils_common$2.attachCredential = attachCredential;
+	utils_common$2.httpAuthorizationToString = httpAuthorizationToString;
+	utils_common$2.BlobNameToString = BlobNameToString;
+	utils_common$2.ConvertInternalResponseOfListBlobFlat = ConvertInternalResponseOfListBlobFlat;
+	utils_common$2.ConvertInternalResponseOfListBlobHierarchy = ConvertInternalResponseOfListBlobHierarchy;
+	utils_common$2.ExtractPageRangeInfoItems = ExtractPageRangeInfoItems;
+	utils_common$2.EscapePath = EscapePath;
+	utils_common$2.assertResponse = assertResponse;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const constants_js_1 = requireConstants$8();
+	/**
+	 * Reserved URL characters must be properly escaped for Storage services like Blob or File.
+	 *
+	 * ## URL encode and escape strategy for JS SDKs
+	 *
+	 * When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.
+	 * But before sending to Azure Storage server, the URL must be encoded. However, it's hard for a SDK to guess whether the URL
+	 * string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.
+	 *
+	 * ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.
+	 *
+	 * This is what legacy V2 SDK does, simple and works for most of the cases.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
+	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
+	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.
+	 *
+	 * But this strategy will make it not possible to create a blob with "?" in it's name. Because when customer URL string is
+	 * "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.
+	 * If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.
+	 * V2 SDK doesn't have this issue because it doesn't allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.
+	 * We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:
+	 *
+	 * ### Strategy Two: SDK doesn't assume the URL has been encoded or not. It will just escape the special characters.
+	 *
+	 * This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
+	 *   SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
+	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",
+	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.
+	 *
+	 * This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string
+	 * is not encoded, there shouldn't a "%" in the URL string, otherwise the URL is not a valid URL.
+	 * If customer needs to create a blob with "%" in it's blob name, use "%25" instead of "%". Just like above 3rd sample.
+	 * And following URL strings are invalid:
+	 * - "http://account.blob.core.windows.net/con/b%"
+	 * - "http://account.blob.core.windows.net/con/b%2"
+	 * - "http://account.blob.core.windows.net/con/b%G"
+	 *
+	 * Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.
+	 *
+	 * ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`
+	 *
+	 * We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.
+	 *
+	 * @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
+	 * @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata
+	 *
+	 * @param url -
+	 */
+	function escapeURLPath(url) {
+	    const urlParsed = new URL(url);
+	    let path = urlParsed.pathname;
+	    path = path || "/";
+	    path = escape(path);
+	    urlParsed.pathname = path;
+	    return urlParsed.toString();
+	}
+	function getProxyUriFromDevConnString(connectionString) {
+	    // Development Connection String
+	    // https://learn.microsoft.com/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key
+	    let proxyUri = "";
+	    if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {
+	        // CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri
+	        const matchCredentials = connectionString.split(";");
+	        for (const element of matchCredentials) {
+	            if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {
+	                proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];
+	            }
+	        }
+	    }
+	    return proxyUri;
+	}
+	function getValueInConnString(connectionString, argument) {
+	    const elements = connectionString.split(";");
+	    for (const element of elements) {
+	        if (element.trim().startsWith(argument)) {
+	            return element.trim().match(argument + "=(.*)")[1];
+	        }
+	    }
+	    return "";
+	}
+	/**
+	 * Extracts the parts of an Azure Storage account connection string.
+	 *
+	 * @param connectionString - Connection string.
+	 * @returns String key value pairs of the storage account's url and credentials.
+	 */
+	function extractConnectionStringParts(connectionString) {
+	    let proxyUri = "";
+	    if (connectionString.startsWith("UseDevelopmentStorage=true")) {
+	        // Development connection string
+	        proxyUri = getProxyUriFromDevConnString(connectionString);
+	        connectionString = constants_js_1.DevelopmentConnectionString;
+	    }
+	    // Matching BlobEndpoint in the Account connection string
+	    let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");
+	    // Slicing off '/' at the end if exists
+	    // (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)
+	    blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;
+	    if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&
+	        connectionString.search("AccountKey=") !== -1) {
+	        // Account connection string
+	        let defaultEndpointsProtocol = "";
+	        let accountName = "";
+	        let accountKey = Buffer.from("accountKey", "base64");
+	        let endpointSuffix = "";
+	        // Get account name and key
+	        accountName = getValueInConnString(connectionString, "AccountName");
+	        accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64");
+	        if (!blobEndpoint) {
+	            // BlobEndpoint is not present in the Account connection string
+	            // Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`
+	            defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");
+	            const protocol = defaultEndpointsProtocol.toLowerCase();
+	            if (protocol !== "https" && protocol !== "http") {
+	                throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'");
+	            }
+	            endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");
+	            if (!endpointSuffix) {
+	                throw new Error("Invalid EndpointSuffix in the provided Connection String");
+	            }
+	            blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
+	        }
+	        if (!accountName) {
+	            throw new Error("Invalid AccountName in the provided Connection String");
+	        }
+	        else if (accountKey.length === 0) {
+	            throw new Error("Invalid AccountKey in the provided Connection String");
+	        }
+	        return {
+	            kind: "AccountConnString",
+	            url: blobEndpoint,
+	            accountName,
+	            accountKey,
+	            proxyUri,
+	        };
+	    }
+	    else {
+	        // SAS connection string
+	        let accountSas = getValueInConnString(connectionString, "SharedAccessSignature");
+	        let accountName = getValueInConnString(connectionString, "AccountName");
+	        // if accountName is empty, try to read it from BlobEndpoint
+	        if (!accountName) {
+	            accountName = getAccountNameFromUrl(blobEndpoint);
+	        }
+	        if (!blobEndpoint) {
+	            throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");
+	        }
+	        else if (!accountSas) {
+	            throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");
+	        }
+	        // client constructors assume accountSas does *not* start with ?
+	        if (accountSas.startsWith("?")) {
+	            accountSas = accountSas.substring(1);
+	        }
+	        return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };
+	    }
+	}
+	/**
+	 * Internal escape method implemented Strategy Two mentioned in escapeURL() description.
+	 *
+	 * @param text -
+	 */
+	function escape(text) {
+	    return encodeURIComponent(text)
+	        .replace(/%2F/g, "/") // Don't escape for "/"
+	        .replace(/'/g, "%27") // Escape for "'"
+	        .replace(/\+/g, "%20")
+	        .replace(/%25/g, "%"); // Revert encoded "%"
+	}
+	/**
+	 * Append a string to URL path. Will remove duplicated "/" in front of the string
+	 * when URL path ends with a "/".
+	 *
+	 * @param url - Source URL string
+	 * @param name - String to be appended to URL
+	 * @returns An updated URL string
+	 */
+	function appendToURLPath(url, name) {
+	    const urlParsed = new URL(url);
+	    let path = urlParsed.pathname;
+	    path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;
+	    urlParsed.pathname = path;
+	    return urlParsed.toString();
+	}
+	/**
+	 * Set URL parameter name and value. If name exists in URL parameters, old value
+	 * will be replaced by name key. If not provide value, the parameter will be deleted.
+	 *
+	 * @param url - Source URL string
+	 * @param name - Parameter name
+	 * @param value - Parameter value
+	 * @returns An updated URL string
+	 */
+	function setURLParameter(url, name, value) {
+	    const urlParsed = new URL(url);
+	    const encodedName = encodeURIComponent(name);
+	    const encodedValue = value ? encodeURIComponent(value) : undefined;
+	    // mutating searchParams will change the encoding, so we have to do this ourselves
+	    const searchString = urlParsed.search === "" ? "?" : urlParsed.search;
+	    const searchPieces = [];
+	    for (const pair of searchString.slice(1).split("&")) {
+	        if (pair) {
+	            const [key] = pair.split("=", 2);
+	            if (key !== encodedName) {
+	                searchPieces.push(pair);
+	            }
+	        }
+	    }
+	    if (encodedValue) {
+	        searchPieces.push(`${encodedName}=${encodedValue}`);
+	    }
+	    urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
+	    return urlParsed.toString();
+	}
+	/**
+	 * Get URL parameter by name.
+	 *
+	 * @param url -
+	 * @param name -
+	 */
+	function getURLParameter(url, name) {
+	    const urlParsed = new URL(url);
+	    return urlParsed.searchParams.get(name) ?? undefined;
+	}
+	/**
+	 * Set URL host.
+	 *
+	 * @param url - Source URL string
+	 * @param host - New host string
+	 * @returns An updated URL string
+	 */
+	function setURLHost(url, host) {
+	    const urlParsed = new URL(url);
+	    urlParsed.hostname = host;
+	    return urlParsed.toString();
+	}
+	/**
+	 * Get URL path from an URL string.
+	 *
+	 * @param url - Source URL string
+	 */
+	function getURLPath(url) {
+	    try {
+	        const urlParsed = new URL(url);
+	        return urlParsed.pathname;
+	    }
+	    catch (e) {
+	        return undefined;
+	    }
+	}
+	/**
+	 * Get URL scheme from an URL string.
+	 *
+	 * @param url - Source URL string
+	 */
+	function getURLScheme(url) {
+	    try {
+	        const urlParsed = new URL(url);
+	        return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol;
+	    }
+	    catch (e) {
+	        return undefined;
+	    }
+	}
+	/**
+	 * Get URL path and query from an URL string.
+	 *
+	 * @param url - Source URL string
+	 */
+	function getURLPathAndQuery(url) {
+	    const urlParsed = new URL(url);
+	    const pathString = urlParsed.pathname;
+	    if (!pathString) {
+	        throw new RangeError("Invalid url without valid path.");
+	    }
+	    let queryString = urlParsed.search || "";
+	    queryString = queryString.trim();
+	    if (queryString !== "") {
+	        queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with '?'
+	    }
+	    return `${pathString}${queryString}`;
+	}
+	/**
+	 * Get URL query key value pairs from an URL string.
+	 *
+	 * @param url -
+	 */
+	function getURLQueries(url) {
+	    let queryString = new URL(url).search;
+	    if (!queryString) {
+	        return {};
+	    }
+	    queryString = queryString.trim();
+	    queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString;
+	    let querySubStrings = queryString.split("&");
+	    querySubStrings = querySubStrings.filter((value) => {
+	        const indexOfEqual = value.indexOf("=");
+	        const lastIndexOfEqual = value.lastIndexOf("=");
+	        return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);
+	    });
+	    const queries = {};
+	    for (const querySubString of querySubStrings) {
+	        const splitResults = querySubString.split("=");
+	        const key = splitResults[0];
+	        const value = splitResults[1];
+	        queries[key] = value;
+	    }
+	    return queries;
+	}
+	/**
+	 * Append a string to URL query.
+	 *
+	 * @param url - Source URL string.
+	 * @param queryParts - String to be appended to the URL query.
+	 * @returns An updated URL string.
+	 */
+	function appendToURLQuery(url, queryParts) {
+	    const urlParsed = new URL(url);
+	    let query = urlParsed.search;
+	    if (query) {
+	        query += "&" + queryParts;
+	    }
+	    else {
+	        query = queryParts;
+	    }
+	    urlParsed.search = query;
+	    return urlParsed.toString();
+	}
+	/**
+	 * Rounds a date off to seconds.
+	 *
+	 * @param date -
+	 * @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;
+	 *                                          If false, YYYY-MM-DDThh:mm:ssZ will be returned.
+	 * @returns Date string in ISO8061 format, with or without 7 milliseconds component
+	 */
+	function truncatedISO8061Date(date, withMilliseconds = true) {
+	    // Date.toISOString() will return like "2018-10-29T06:34:36.139Z"
+	    const dateString = date.toISOString();
+	    return withMilliseconds
+	        ? dateString.substring(0, dateString.length - 1) + "0000" + "Z"
+	        : dateString.substring(0, dateString.length - 5) + "Z";
+	}
+	/**
+	 * Base64 encode.
+	 *
+	 * @param content -
+	 */
+	function base64encode(content) {
+	    return !core_util_1.isNodeLike ? btoa(content) : Buffer.from(content).toString("base64");
+	}
+	/**
+	 * Base64 decode.
+	 *
+	 * @param encodedString -
+	 */
+	function base64decode(encodedString) {
+	    return !core_util_1.isNodeLike ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();
+	}
+	/**
+	 * Generate a 64 bytes base64 block ID string.
+	 *
+	 * @param blockIndex -
+	 */
+	function generateBlockID(blockIDPrefix, blockIndex) {
+	    // To generate a 64 bytes base64 string, source string should be 48
+	    const maxSourceStringLength = 48;
+	    // A blob can have a maximum of 100,000 uncommitted blocks at any given time
+	    const maxBlockIndexLength = 6;
+	    const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;
+	    if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {
+	        blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);
+	    }
+	    const res = blockIDPrefix +
+	        padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");
+	    return base64encode(res);
+	}
+	/**
+	 * Delay specified time interval.
+	 *
+	 * @param timeInMs -
+	 * @param aborter -
+	 * @param abortError -
+	 */
+	async function delay(timeInMs, aborter, abortError) {
+	    return new Promise((resolve, reject) => {
+	        /* eslint-disable-next-line prefer-const */
+	        let timeout;
+	        const abortHandler = () => {
+	            if (timeout !== undefined) {
+	                clearTimeout(timeout);
+	            }
+	            reject(abortError);
+	        };
+	        const resolveHandler = () => {
+	            if (aborter !== undefined) {
+	                aborter.removeEventListener("abort", abortHandler);
+	            }
+	            resolve();
+	        };
+	        timeout = setTimeout(resolveHandler, timeInMs);
+	        if (aborter !== undefined) {
+	            aborter.addEventListener("abort", abortHandler);
+	        }
+	    });
+	}
+	/**
+	 * String.prototype.padStart()
+	 *
+	 * @param currentString -
+	 * @param targetLength -
+	 * @param padString -
+	 */
+	function padStart(currentString, targetLength, padString = " ") {
+	    // @ts-expect-error: TS doesn't know this code needs to run downlevel sometimes
+	    if (String.prototype.padStart) {
+	        return currentString.padStart(targetLength, padString);
+	    }
+	    padString = padString || " ";
+	    if (currentString.length > targetLength) {
+	        return currentString;
+	    }
+	    else {
+	        targetLength = targetLength - currentString.length;
+	        if (targetLength > padString.length) {
+	            padString += padString.repeat(targetLength / padString.length);
+	        }
+	        return padString.slice(0, targetLength) + currentString;
+	    }
+	}
+	function sanitizeURL(url) {
+	    let safeURL = url;
+	    if (getURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE)) {
+	        safeURL = setURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE, "*****");
+	    }
+	    return safeURL;
+	}
+	function sanitizeHeaders(originalHeader) {
+	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)();
+	    for (const [name, value] of originalHeader) {
+	        if (name.toLowerCase() === constants_js_1.HeaderConstants.AUTHORIZATION.toLowerCase()) {
+	            headers.set(name, "*****");
+	        }
+	        else if (name.toLowerCase() === constants_js_1.HeaderConstants.X_MS_COPY_SOURCE) {
+	            headers.set(name, sanitizeURL(value));
+	        }
+	        else {
+	            headers.set(name, value);
+	        }
+	    }
+	    return headers;
+	}
+	/**
+	 * If two strings are equal when compared case insensitive.
+	 *
+	 * @param str1 -
+	 * @param str2 -
+	 */
+	function iEqual(str1, str2) {
+	    return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();
+	}
+	/**
+	 * Extracts account name from the url
+	 * @param url - url to extract the account name from
+	 * @returns with the account name
+	 */
+	function getAccountNameFromUrl(url) {
+	    const parsedUrl = new URL(url);
+	    let accountName;
+	    try {
+	        if (parsedUrl.hostname.split(".")[1] === "blob") {
+	            // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
+	            accountName = parsedUrl.hostname.split(".")[0];
+	        }
+	        else if (isIpEndpointStyle(parsedUrl)) {
+	            // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/
+	            // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/
+	            // .getPath() -> /devstoreaccount1/
+	            accountName = parsedUrl.pathname.split("/")[1];
+	        }
+	        else {
+	            // Custom domain case: "https://customdomain.com/containername/blob".
+	            accountName = "";
+	        }
+	        return accountName;
+	    }
+	    catch (error) {
+	        throw new Error("Unable to extract accountName with provided information.");
+	    }
+	}
+	function isIpEndpointStyle(parsedUrl) {
+	    const host = parsedUrl.host;
+	    // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'.
+	    // Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.
+	    // Case 3: Ipv4, use broad regex which just check if host contains Ipv4.
+	    // For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.
+	    return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||
+	        (Boolean(parsedUrl.port) && constants_js_1.PathStylePorts.includes(parsedUrl.port)));
+	}
+	/**
+	 * Convert Tags to encoded string.
+	 *
+	 * @param tags -
+	 */
+	function toBlobTagsString(tags) {
+	    if (tags === undefined) {
+	        return undefined;
+	    }
+	    const tagPairs = [];
+	    for (const key in tags) {
+	        if (Object.prototype.hasOwnProperty.call(tags, key)) {
+	            const value = tags[key];
+	            tagPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
+	        }
+	    }
+	    return tagPairs.join("&");
+	}
+	/**
+	 * Convert Tags type to BlobTags.
+	 *
+	 * @param tags -
+	 */
+	function toBlobTags(tags) {
+	    if (tags === undefined) {
+	        return undefined;
+	    }
+	    const res = {
+	        blobTagSet: [],
+	    };
+	    for (const key in tags) {
+	        if (Object.prototype.hasOwnProperty.call(tags, key)) {
+	            const value = tags[key];
+	            res.blobTagSet.push({
+	                key,
+	                value,
+	            });
+	        }
+	    }
+	    return res;
+	}
+	/**
+	 * Covert BlobTags to Tags type.
+	 *
+	 * @param tags -
+	 */
+	function toTags(tags) {
+	    if (tags === undefined) {
+	        return undefined;
+	    }
+	    const res = {};
+	    for (const blobTag of tags.blobTagSet) {
+	        res[blobTag.key] = blobTag.value;
+	    }
+	    return res;
+	}
+	/**
+	 * Convert BlobQueryTextConfiguration to QuerySerialization type.
+	 *
+	 * @param textConfiguration -
+	 */
+	function toQuerySerialization(textConfiguration) {
+	    if (textConfiguration === undefined) {
+	        return undefined;
+	    }
+	    switch (textConfiguration.kind) {
+	        case "csv":
+	            return {
+	                format: {
+	                    type: "delimited",
+	                    delimitedTextConfiguration: {
+	                        columnSeparator: textConfiguration.columnSeparator || ",",
+	                        fieldQuote: textConfiguration.fieldQuote || "",
+	                        recordSeparator: textConfiguration.recordSeparator,
+	                        escapeChar: textConfiguration.escapeCharacter || "",
+	                        headersPresent: textConfiguration.hasHeaders || false,
+	                    },
+	                },
+	            };
+	        case "json":
+	            return {
+	                format: {
+	                    type: "json",
+	                    jsonTextConfiguration: {
+	                        recordSeparator: textConfiguration.recordSeparator,
+	                    },
+	                },
+	            };
+	        case "arrow":
+	            return {
+	                format: {
+	                    type: "arrow",
+	                    arrowConfiguration: {
+	                        schema: textConfiguration.schema,
+	                    },
+	                },
+	            };
+	        case "parquet":
+	            return {
+	                format: {
+	                    type: "parquet",
+	                },
+	            };
+	        default:
+	            throw Error("Invalid BlobQueryTextConfiguration.");
+	    }
+	}
+	function parseObjectReplicationRecord(objectReplicationRecord) {
+	    if (!objectReplicationRecord) {
+	        return undefined;
+	    }
+	    if ("policy-id" in objectReplicationRecord) {
+	        // If the dictionary contains a key with policy id, we are not required to do any parsing since
+	        // the policy id should already be stored in the ObjectReplicationDestinationPolicyId.
+	        return undefined;
+	    }
+	    const orProperties = [];
+	    for (const key in objectReplicationRecord) {
+	        const ids = key.split("_");
+	        const policyPrefix = "or-";
+	        if (ids[0].startsWith(policyPrefix)) {
+	            ids[0] = ids[0].substring(policyPrefix.length);
+	        }
+	        const rule = {
+	            ruleId: ids[1],
+	            replicationStatus: objectReplicationRecord[key],
+	        };
+	        const policyIndex = orProperties.findIndex((policy) => policy.policyId === ids[0]);
+	        if (policyIndex > -1) {
+	            orProperties[policyIndex].rules.push(rule);
+	        }
+	        else {
+	            orProperties.push({
+	                policyId: ids[0],
+	                rules: [rule],
+	            });
+	        }
+	    }
+	    return orProperties;
+	}
+	/**
+	 * Attach a TokenCredential to an object.
+	 *
+	 * @param thing -
+	 * @param credential -
+	 */
+	function attachCredential(thing, credential) {
+	    thing.credential = credential;
+	    return thing;
+	}
+	function httpAuthorizationToString(httpAuthorization) {
+	    return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;
+	}
+	function BlobNameToString(name) {
+	    if (name.encoded) {
+	        return decodeURIComponent(name.content);
+	    }
+	    else {
+	        return name.content;
+	    }
+	}
+	function ConvertInternalResponseOfListBlobFlat(internalResponse) {
+	    return {
+	        ...internalResponse,
+	        segment: {
+	            blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {
+	                const blobItem = {
+	                    ...blobItemInteral,
+	                    name: BlobNameToString(blobItemInteral.name),
+	                };
+	                return blobItem;
+	            }),
+	        },
+	    };
+	}
+	function ConvertInternalResponseOfListBlobHierarchy(internalResponse) {
+	    return {
+	        ...internalResponse,
+	        segment: {
+	            blobPrefixes: internalResponse.segment.blobPrefixes?.map((blobPrefixInternal) => {
+	                const blobPrefix = {
+	                    ...blobPrefixInternal,
+	                    name: BlobNameToString(blobPrefixInternal.name),
+	                };
+	                return blobPrefix;
+	            }),
+	            blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {
+	                const blobItem = {
+	                    ...blobItemInteral,
+	                    name: BlobNameToString(blobItemInteral.name),
+	                };
+	                return blobItem;
+	            }),
+	        },
+	    };
+	}
+	function* ExtractPageRangeInfoItems(getPageRangesSegment) {
+	    let pageRange = [];
+	    let clearRange = [];
+	    if (getPageRangesSegment.pageRange)
+	        pageRange = getPageRangesSegment.pageRange;
+	    if (getPageRangesSegment.clearRange)
+	        clearRange = getPageRangesSegment.clearRange;
+	    let pageRangeIndex = 0;
+	    let clearRangeIndex = 0;
+	    while (pageRangeIndex < pageRange.length && clearRangeIndex < clearRange.length) {
+	        if (pageRange[pageRangeIndex].start < clearRange[clearRangeIndex].start) {
+	            yield {
+	                start: pageRange[pageRangeIndex].start,
+	                end: pageRange[pageRangeIndex].end,
+	                isClear: false,
+	            };
+	            ++pageRangeIndex;
+	        }
+	        else {
+	            yield {
+	                start: clearRange[clearRangeIndex].start,
+	                end: clearRange[clearRangeIndex].end,
+	                isClear: true,
+	            };
+	            ++clearRangeIndex;
+	        }
+	    }
+	    for (; pageRangeIndex < pageRange.length; ++pageRangeIndex) {
+	        yield {
+	            start: pageRange[pageRangeIndex].start,
+	            end: pageRange[pageRangeIndex].end,
+	            isClear: false,
+	        };
+	    }
+	    for (; clearRangeIndex < clearRange.length; ++clearRangeIndex) {
+	        yield {
+	            start: clearRange[clearRangeIndex].start,
+	            end: clearRange[clearRangeIndex].end,
+	            isClear: true,
+	        };
+	    }
+	}
+	/**
+	 * Escape the blobName but keep path separator ('/').
+	 */
+	function EscapePath(blobName) {
+	    const split = blobName.split("/");
+	    for (let i = 0; i < split.length; i++) {
+	        split[i] = encodeURIComponent(split[i]);
+	    }
+	    return split.join("/");
+	}
+	/**
+	 * A typesafe helper for ensuring that a given response object has
+	 * the original _response attached.
+	 * @param response - A response object from calling a client operation
+	 * @returns The same object, but with known _response property
+	 */
+	function assertResponse(response) {
+	    if (`_response` in response) {
+	        return response;
+	    }
+	    throw new TypeError(`Unexpected response object ${response}`);
+	}
+	
+	return utils_common$2;
+}
+
+var StorageRetryPolicyType$1 = {};
+
+var hasRequiredStorageRetryPolicyType$1;
+
+function requireStorageRetryPolicyType$1 () {
+	if (hasRequiredStorageRetryPolicyType$1) return StorageRetryPolicyType$1;
+	hasRequiredStorageRetryPolicyType$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageRetryPolicyType$1, "__esModule", { value: true });
+	StorageRetryPolicyType$1.StorageRetryPolicyType = void 0;
+	/**
+	 * RetryPolicy types.
+	 */
+	var StorageRetryPolicyType;
+	(function (StorageRetryPolicyType) {
+	    /**
+	     * Exponential retry. Retry time delay grows exponentially.
+	     */
+	    StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";
+	    /**
+	     * Linear retry. Retry time delay grows linearly.
+	     */
+	    StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";
+	})(StorageRetryPolicyType || (StorageRetryPolicyType$1.StorageRetryPolicyType = StorageRetryPolicyType = {}));
+	
+	return StorageRetryPolicyType$1;
+}
+
+var hasRequiredStorageRetryPolicy$1;
+
+function requireStorageRetryPolicy$1 () {
+	if (hasRequiredStorageRetryPolicy$1) return StorageRetryPolicy$1;
+	hasRequiredStorageRetryPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageRetryPolicy$1, "__esModule", { value: true });
+	StorageRetryPolicy$1.StorageRetryPolicy = void 0;
+	StorageRetryPolicy$1.NewRetryPolicyFactory = NewRetryPolicyFactory;
+	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
+	const RequestPolicy_js_1 = requireRequestPolicy$1();
+	const constants_js_1 = requireConstants$8();
+	const utils_common_js_1 = requireUtils_common$2();
+	const log_js_1 = requireLog$1();
+	const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType$1();
+	/**
+	 * A factory method used to generated a RetryPolicy factory.
+	 *
+	 * @param retryOptions -
+	 */
+	function NewRetryPolicyFactory(retryOptions) {
+	    return {
+	        create: (nextPolicy, options) => {
+	            return new StorageRetryPolicy(nextPolicy, options, retryOptions);
+	        },
+	    };
+	}
+	// Default values of StorageRetryOptions
+	const DEFAULT_RETRY_OPTIONS = {
+	    maxRetryDelayInMs: 120 * 1000,
+	    maxTries: 4,
+	    retryDelayInMs: 4 * 1000,
+	    retryPolicyType: StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL,
+	    secondaryHost: "",
+	    tryTimeoutInMs: undefined, // Use server side default timeout strategy
+	};
+	const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
+	/**
+	 * Retry policy with exponential retry and linear retry implemented.
+	 */
+	class StorageRetryPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
+	    /**
+	     * RetryOptions.
+	     */
+	    retryOptions;
+	    /**
+	     * Creates an instance of RetryPolicy.
+	     *
+	     * @param nextPolicy -
+	     * @param options -
+	     * @param retryOptions -
+	     */
+	    constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {
+	        super(nextPolicy, options);
+	        // Initialize retry options
+	        this.retryOptions = {
+	            retryPolicyType: retryOptions.retryPolicyType
+	                ? retryOptions.retryPolicyType
+	                : DEFAULT_RETRY_OPTIONS.retryPolicyType,
+	            maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1
+	                ? Math.floor(retryOptions.maxTries)
+	                : DEFAULT_RETRY_OPTIONS.maxTries,
+	            tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0
+	                ? retryOptions.tryTimeoutInMs
+	                : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,
+	            retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0
+	                ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs
+	                    ? retryOptions.maxRetryDelayInMs
+	                    : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)
+	                : DEFAULT_RETRY_OPTIONS.retryDelayInMs,
+	            maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0
+	                ? retryOptions.maxRetryDelayInMs
+	                : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,
+	            secondaryHost: retryOptions.secondaryHost
+	                ? retryOptions.secondaryHost
+	                : DEFAULT_RETRY_OPTIONS.secondaryHost,
+	        };
+	    }
+	    /**
+	     * Sends request.
+	     *
+	     * @param request -
+	     */
+	    async sendRequest(request) {
+	        return this.attemptSendRequest(request, false, 1);
+	    }
+	    /**
+	     * Decide and perform next retry. Won't mutate request parameter.
+	     *
+	     * @param request -
+	     * @param secondaryHas404 -  If attempt was against the secondary & it returned a StatusNotFound (404), then
+	     *                                   the resource was not found. This may be due to replication delay. So, in this
+	     *                                   case, we'll never try the secondary again for this operation.
+	     * @param attempt -           How many retries has been attempted to performed, starting from 1, which includes
+	     *                                   the attempt will be performed by this method call.
+	     */
+	    async attemptSendRequest(request, secondaryHas404, attempt) {
+	        const newRequest = request.clone();
+	        const isPrimaryRetry = secondaryHas404 ||
+	            !this.retryOptions.secondaryHost ||
+	            !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||
+	            attempt % 2 === 1;
+	        if (!isPrimaryRetry) {
+	            newRequest.url = (0, utils_common_js_1.setURLHost)(newRequest.url, this.retryOptions.secondaryHost);
+	        }
+	        // Set the server-side timeout query parameter "timeout=[seconds]"
+	        if (this.retryOptions.tryTimeoutInMs) {
+	            newRequest.url = (0, utils_common_js_1.setURLParameter)(newRequest.url, constants_js_1.URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());
+	        }
+	        let response;
+	        try {
+	            log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
+	            response = await this._nextPolicy.sendRequest(newRequest);
+	            if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {
+	                return response;
+	            }
+	            secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
+	        }
+	        catch (err) {
+	            log_js_1.logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);
+	            if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {
+	                throw err;
+	            }
+	        }
+	        await this.delay(isPrimaryRetry, attempt, request.abortSignal);
+	        return this.attemptSendRequest(request, secondaryHas404, ++attempt);
+	    }
+	    /**
+	     * Decide whether to retry according to last HTTP response and retry counters.
+	     *
+	     * @param isPrimaryRetry -
+	     * @param attempt -
+	     * @param response -
+	     * @param err -
+	     */
+	    shouldRetry(isPrimaryRetry, attempt, response, err) {
+	        if (attempt >= this.retryOptions.maxTries) {
+	            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions
+	                .maxTries}, no further try.`);
+	            return false;
+	        }
+	        // Handle network failures, you may need to customize the list when you implement
+	        // your own http client
+	        const retriableErrors = [
+	            "ETIMEDOUT",
+	            "ESOCKETTIMEDOUT",
+	            "ECONNREFUSED",
+	            "ECONNRESET",
+	            "ENOENT",
+	            "ENOTFOUND",
+	            "TIMEOUT",
+	            "EPIPE",
+	            "REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js
+	        ];
+	        if (err) {
+	            for (const retriableError of retriableErrors) {
+	                if (err.name.toUpperCase().includes(retriableError) ||
+	                    err.message.toUpperCase().includes(retriableError) ||
+	                    (err.code && err.code.toString().toUpperCase() === retriableError)) {
+	                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
+	                    return true;
+	                }
+	            }
+	        }
+	        // If attempt was against the secondary & it returned a StatusNotFound (404), then
+	        // the resource was not found. This may be due to replication delay. So, in this
+	        // case, we'll never try the secondary again for this operation.
+	        if (response || err) {
+	            const statusCode = response ? response.status : err ? err.statusCode : 0;
+	            if (!isPrimaryRetry && statusCode === 404) {
+	                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
+	                return true;
+	            }
+	            // Server internal error or server timeout
+	            if (statusCode === 503 || statusCode === 500) {
+	                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
+	                return true;
+	            }
+	        }
+	        if (response) {
+	            // Retry select Copy Source Error Codes.
+	            if (response?.status >= 400) {
+	                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
+	                if (copySourceError !== undefined) {
+	                    switch (copySourceError) {
+	                        case "InternalError":
+	                        case "OperationTimedOut":
+	                        case "ServerBusy":
+	                            return true;
+	                    }
+	                }
+	            }
+	        }
+	        if (err?.code === "PARSE_ERROR" && err?.message.startsWith(`Error "Error: Unclosed root tag`)) {
+	            log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
+	            return true;
+	        }
+	        return false;
+	    }
+	    /**
+	     * Delay a calculated time between retries.
+	     *
+	     * @param isPrimaryRetry -
+	     * @param attempt -
+	     * @param abortSignal -
+	     */
+	    async delay(isPrimaryRetry, attempt, abortSignal) {
+	        let delayTimeInMs = 0;
+	        if (isPrimaryRetry) {
+	            switch (this.retryOptions.retryPolicyType) {
+	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL:
+	                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);
+	                    break;
+	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.FIXED:
+	                    delayTimeInMs = this.retryOptions.retryDelayInMs;
+	                    break;
+	            }
+	        }
+	        else {
+	            delayTimeInMs = Math.random() * 1000;
+	        }
+	        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
+	        return (0, utils_common_js_1.delay)(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);
+	    }
+	}
+	StorageRetryPolicy$1.StorageRetryPolicy = StorageRetryPolicy;
+	
+	return StorageRetryPolicy$1;
+}
+
+var hasRequiredStorageRetryPolicyFactory$1;
+
+function requireStorageRetryPolicyFactory$1 () {
+	if (hasRequiredStorageRetryPolicyFactory$1) return StorageRetryPolicyFactory$1;
+	hasRequiredStorageRetryPolicyFactory$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.StorageRetryPolicyFactory = exports$1.StorageRetryPolicy = exports$1.StorageRetryPolicyType = void 0;
+		const StorageRetryPolicy_js_1 = requireStorageRetryPolicy$1();
+		Object.defineProperty(exports$1, "StorageRetryPolicy", { enumerable: true, get: function () { return StorageRetryPolicy_js_1.StorageRetryPolicy; } });
+		const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType$1();
+		Object.defineProperty(exports$1, "StorageRetryPolicyType", { enumerable: true, get: function () { return StorageRetryPolicyType_js_1.StorageRetryPolicyType; } });
+		/**
+		 * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.
+		 */
+		class StorageRetryPolicyFactory {
+		    retryOptions;
+		    /**
+		     * Creates an instance of StorageRetryPolicyFactory.
+		     * @param retryOptions -
+		     */
+		    constructor(retryOptions) {
+		        this.retryOptions = retryOptions;
+		    }
+		    /**
+		     * Creates a StorageRetryPolicy object.
+		     *
+		     * @param nextPolicy -
+		     * @param options -
+		     */
+		    create(nextPolicy, options) {
+		        return new StorageRetryPolicy_js_1.StorageRetryPolicy(nextPolicy, options, this.retryOptions);
+		    }
+		}
+		exports$1.StorageRetryPolicyFactory = StorageRetryPolicyFactory;
+		
+	} (StorageRetryPolicyFactory$1));
+	return StorageRetryPolicyFactory$1;
+}
+
+var StorageSharedKeyCredential$1 = {};
+
+var StorageSharedKeyCredentialPolicy$1 = {};
+
+var CredentialPolicy$1 = {};
+
+var hasRequiredCredentialPolicy$1;
+
+function requireCredentialPolicy$1 () {
+	if (hasRequiredCredentialPolicy$1) return CredentialPolicy$1;
+	hasRequiredCredentialPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(CredentialPolicy$1, "__esModule", { value: true });
+	CredentialPolicy$1.CredentialPolicy = void 0;
+	const RequestPolicy_js_1 = requireRequestPolicy$1();
+	/**
+	 * Credential policy used to sign HTTP(S) requests before sending. This is an
+	 * abstract class.
+	 */
+	class CredentialPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
+	    /**
+	     * Sends out request.
+	     *
+	     * @param request -
+	     */
+	    sendRequest(request) {
+	        return this._nextPolicy.sendRequest(this.signRequest(request));
+	    }
+	    /**
+	     * Child classes must implement this method with request signing. This method
+	     * will be executed in {@link sendRequest}.
+	     *
+	     * @param request -
+	     */
+	    signRequest(request) {
+	        // Child classes must override this method with request signing. This method
+	        // will be executed in sendRequest().
+	        return request;
+	    }
+	}
+	CredentialPolicy$1.CredentialPolicy = CredentialPolicy;
+	
+	return CredentialPolicy$1;
+}
+
+var SharedKeyComparator$1 = {};
+
+var hasRequiredSharedKeyComparator$1;
+
+function requireSharedKeyComparator$1 () {
+	if (hasRequiredSharedKeyComparator$1) return SharedKeyComparator$1;
+	hasRequiredSharedKeyComparator$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(SharedKeyComparator$1, "__esModule", { value: true });
+	SharedKeyComparator$1.compareHeader = compareHeader;
+	/*
+	 * We need to imitate .Net culture-aware sorting, which is used in storage service.
+	 * Below tables contain sort-keys for en-US culture.
+	 */
+	const table_lv0 = new Uint32Array([
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721,
+	    0x723, 0x725, 0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e,
+	    0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe02, 0xe09, 0xe0a,
+	    0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89,
+	    0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x0, 0x0, 0x743, 0x744, 0x748,
+	    0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70,
+	    0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c,
+	    0x0, 0x750, 0x0,
+	]);
+	const table_lv2 = new Uint32Array([
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+	    0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+	    0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	]);
+	const table_lv4 = new Uint32Array([
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	]);
+	function compareHeader(lhs, rhs) {
+	    if (isLessThan(lhs, rhs))
+	        return -1;
+	    return 1;
+	}
+	function isLessThan(lhs, rhs) {
+	    const tables = [table_lv0, table_lv2, table_lv4];
+	    let curr_level = 0;
+	    let i = 0;
+	    let j = 0;
+	    while (curr_level < tables.length) {
+	        if (curr_level === tables.length - 1 && i !== j) {
+	            return i > j;
+	        }
+	        const weight1 = i < lhs.length ? tables[curr_level][lhs[i].charCodeAt(0)] : 0x1;
+	        const weight2 = j < rhs.length ? tables[curr_level][rhs[j].charCodeAt(0)] : 0x1;
+	        if (weight1 === 0x1 && weight2 === 0x1) {
+	            i = 0;
+	            j = 0;
+	            ++curr_level;
+	        }
+	        else if (weight1 === weight2) {
+	            ++i;
+	            ++j;
+	        }
+	        else if (weight1 === 0) {
+	            ++i;
+	        }
+	        else if (weight2 === 0) {
+	            ++j;
+	        }
+	        else {
+	            return weight1 < weight2;
+	        }
+	    }
+	    return false;
+	}
+	
+	return SharedKeyComparator$1;
+}
+
+var hasRequiredStorageSharedKeyCredentialPolicy$1;
+
+function requireStorageSharedKeyCredentialPolicy$1 () {
+	if (hasRequiredStorageSharedKeyCredentialPolicy$1) return StorageSharedKeyCredentialPolicy$1;
+	hasRequiredStorageSharedKeyCredentialPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageSharedKeyCredentialPolicy$1, "__esModule", { value: true });
+	StorageSharedKeyCredentialPolicy$1.StorageSharedKeyCredentialPolicy = void 0;
+	const constants_js_1 = requireConstants$8();
+	const utils_common_js_1 = requireUtils_common$2();
+	const CredentialPolicy_js_1 = requireCredentialPolicy$1();
+	const SharedKeyComparator_js_1 = requireSharedKeyComparator$1();
+	/**
+	 * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.
+	 */
+	class StorageSharedKeyCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
+	    /**
+	     * Reference to StorageSharedKeyCredential which generates StorageSharedKeyCredentialPolicy
+	     */
+	    factory;
+	    /**
+	     * Creates an instance of StorageSharedKeyCredentialPolicy.
+	     * @param nextPolicy -
+	     * @param options -
+	     * @param factory -
+	     */
+	    constructor(nextPolicy, options, factory) {
+	        super(nextPolicy, options);
+	        this.factory = factory;
+	    }
+	    /**
+	     * Signs request.
+	     *
+	     * @param request -
+	     */
+	    signRequest(request) {
+	        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
+	        if (request.body &&
+	            (typeof request.body === "string" || request.body !== undefined) &&
+	            request.body.length > 0) {
+	            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
+	        }
+	        const stringToSign = [
+	            request.method.toUpperCase(),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
+	        ].join("\n") +
+	            "\n" +
+	            this.getCanonicalizedHeadersString(request) +
+	            this.getCanonicalizedResourceString(request);
+	        const signature = this.factory.computeHMACSHA256(stringToSign);
+	        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);
+	        // console.log(`[URL]:${request.url}`);
+	        // console.log(`[HEADERS]:${request.headers.toString()}`);
+	        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
+	        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
+	        return request;
+	    }
+	    /**
+	     * Retrieve header value according to shared key sign rules.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
+	     *
+	     * @param request -
+	     * @param headerName -
+	     */
+	    getHeaderValueToSign(request, headerName) {
+	        const value = request.headers.get(headerName);
+	        if (!value) {
+	            return "";
+	        }
+	        // When using version 2015-02-21 or later, if Content-Length is zero, then
+	        // set the Content-Length part of the StringToSign to an empty string.
+	        // https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
+	        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
+	            return "";
+	        }
+	        return value;
+	    }
+	    /**
+	     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
+	     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
+	     * 2. Convert each HTTP header name to lowercase.
+	     * 3. Sort the headers lexicographically by header name, in ascending order.
+	     *    Each header may appear only once in the string.
+	     * 4. Replace any linear whitespace in the header value with a single space.
+	     * 5. Trim any whitespace around the colon in the header.
+	     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
+	     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
+	     *
+	     * @param request -
+	     */
+	    getCanonicalizedHeadersString(request) {
+	        let headersArray = request.headers.headersArray().filter((value) => {
+	            return value.name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE);
+	        });
+	        headersArray.sort((a, b) => {
+	            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
+	        });
+	        // Remove duplicate headers
+	        headersArray = headersArray.filter((value, index, array) => {
+	            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
+	                return false;
+	            }
+	            return true;
+	        });
+	        let canonicalizedHeadersStringToSign = "";
+	        headersArray.forEach((header) => {
+	            canonicalizedHeadersStringToSign += `${header.name
+	                .toLowerCase()
+	                .trimRight()}:${header.value.trimLeft()}\n`;
+	        });
+	        return canonicalizedHeadersStringToSign;
+	    }
+	    /**
+	     * Retrieves the webResource canonicalized resource string.
+	     *
+	     * @param request -
+	     */
+	    getCanonicalizedResourceString(request) {
+	        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
+	        let canonicalizedResourceString = "";
+	        canonicalizedResourceString += `/${this.factory.accountName}${path}`;
+	        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
+	        const lowercaseQueries = {};
+	        if (queries) {
+	            const queryKeys = [];
+	            for (const key in queries) {
+	                if (Object.prototype.hasOwnProperty.call(queries, key)) {
+	                    const lowercaseKey = key.toLowerCase();
+	                    lowercaseQueries[lowercaseKey] = queries[key];
+	                    queryKeys.push(lowercaseKey);
+	                }
+	            }
+	            queryKeys.sort();
+	            for (const key of queryKeys) {
+	                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
+	            }
+	        }
+	        return canonicalizedResourceString;
+	    }
+	}
+	StorageSharedKeyCredentialPolicy$1.StorageSharedKeyCredentialPolicy = StorageSharedKeyCredentialPolicy;
+	
+	return StorageSharedKeyCredentialPolicy$1;
+}
+
+var Credential$1 = {};
+
+var hasRequiredCredential$1;
+
+function requireCredential$1 () {
+	if (hasRequiredCredential$1) return Credential$1;
+	hasRequiredCredential$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(Credential$1, "__esModule", { value: true });
+	Credential$1.Credential = void 0;
+	/**
+	 * Credential is an abstract class for Azure Storage HTTP requests signing. This
+	 * class will host an credentialPolicyCreator factory which generates CredentialPolicy.
+	 */
+	class Credential {
+	    /**
+	     * Creates a RequestPolicy object.
+	     *
+	     * @param _nextPolicy -
+	     * @param _options -
+	     */
+	    create(_nextPolicy, _options) {
+	        throw new Error("Method should be implemented in children classes.");
+	    }
+	}
+	Credential$1.Credential = Credential;
+	
+	return Credential$1;
+}
+
+var hasRequiredStorageSharedKeyCredential$1;
+
+function requireStorageSharedKeyCredential$1 () {
+	if (hasRequiredStorageSharedKeyCredential$1) return StorageSharedKeyCredential$1;
+	hasRequiredStorageSharedKeyCredential$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageSharedKeyCredential$1, "__esModule", { value: true });
+	StorageSharedKeyCredential$1.StorageSharedKeyCredential = void 0;
+	const node_crypto_1 = require$$0$d;
+	const StorageSharedKeyCredentialPolicy_js_1 = requireStorageSharedKeyCredentialPolicy$1();
+	const Credential_js_1 = requireCredential$1();
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * StorageSharedKeyCredential for account key authorization of Azure Storage service.
+	 */
+	class StorageSharedKeyCredential extends Credential_js_1.Credential {
+	    /**
+	     * Azure Storage account name; readonly.
+	     */
+	    accountName;
+	    /**
+	     * Azure Storage account key; readonly.
+	     */
+	    accountKey;
+	    /**
+	     * Creates an instance of StorageSharedKeyCredential.
+	     * @param accountName -
+	     * @param accountKey -
+	     */
+	    constructor(accountName, accountKey) {
+	        super();
+	        this.accountName = accountName;
+	        this.accountKey = Buffer.from(accountKey, "base64");
+	    }
+	    /**
+	     * Creates a StorageSharedKeyCredentialPolicy object.
+	     *
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    create(nextPolicy, options) {
+	        return new StorageSharedKeyCredentialPolicy_js_1.StorageSharedKeyCredentialPolicy(nextPolicy, options, this);
+	    }
+	    /**
+	     * Generates a hash signature for an HTTP request or for a SAS.
+	     *
+	     * @param stringToSign -
+	     */
+	    computeHMACSHA256(stringToSign) {
+	        return (0, node_crypto_1.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");
+	    }
+	}
+	StorageSharedKeyCredential$1.StorageSharedKeyCredential = StorageSharedKeyCredential;
+	
+	return StorageSharedKeyCredential$1;
+}
+
+var AnonymousCredential$1 = {};
+
+var AnonymousCredentialPolicy$1 = {};
+
+var hasRequiredAnonymousCredentialPolicy$1;
+
+function requireAnonymousCredentialPolicy$1 () {
+	if (hasRequiredAnonymousCredentialPolicy$1) return AnonymousCredentialPolicy$1;
+	hasRequiredAnonymousCredentialPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AnonymousCredentialPolicy$1, "__esModule", { value: true });
+	AnonymousCredentialPolicy$1.AnonymousCredentialPolicy = void 0;
+	const CredentialPolicy_js_1 = requireCredentialPolicy$1();
+	/**
+	 * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources
+	 * or for use with Shared Access Signatures (SAS).
+	 */
+	class AnonymousCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
+	    /**
+	     * Creates an instance of AnonymousCredentialPolicy.
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
+	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
+	    constructor(nextPolicy, options) {
+	        super(nextPolicy, options);
+	    }
+	}
+	AnonymousCredentialPolicy$1.AnonymousCredentialPolicy = AnonymousCredentialPolicy;
+	
+	return AnonymousCredentialPolicy$1;
+}
+
+var hasRequiredAnonymousCredential$1;
+
+function requireAnonymousCredential$1 () {
+	if (hasRequiredAnonymousCredential$1) return AnonymousCredential$1;
+	hasRequiredAnonymousCredential$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AnonymousCredential$1, "__esModule", { value: true });
+	AnonymousCredential$1.AnonymousCredential = void 0;
+	const AnonymousCredentialPolicy_js_1 = requireAnonymousCredentialPolicy$1();
+	const Credential_js_1 = requireCredential$1();
+	/**
+	 * AnonymousCredential provides a credentialPolicyCreator member used to create
+	 * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with
+	 * HTTP(S) requests that read public resources or for use with Shared Access
+	 * Signatures (SAS).
+	 */
+	class AnonymousCredential extends Credential_js_1.Credential {
+	    /**
+	     * Creates an {@link AnonymousCredentialPolicy} object.
+	     *
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    create(nextPolicy, options) {
+	        return new AnonymousCredentialPolicy_js_1.AnonymousCredentialPolicy(nextPolicy, options);
+	    }
+	}
+	AnonymousCredential$1.AnonymousCredential = AnonymousCredential;
+	
+	return AnonymousCredential$1;
+}
+
+var commonjs$2 = {};
+
+var BufferScheduler = {};
+
+var PooledBuffer = {};
+
+var BuffersStream = {};
+
+var hasRequiredBuffersStream;
+
+function requireBuffersStream () {
+	if (hasRequiredBuffersStream) return BuffersStream;
+	hasRequiredBuffersStream = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BuffersStream, "__esModule", { value: true });
+	BuffersStream.BuffersStream = void 0;
+	const node_stream_1 = require$$0$8;
+	/**
+	 * This class generates a readable stream from the data in an array of buffers.
+	 */
+	let BuffersStream$1 = class BuffersStream extends node_stream_1.Readable {
+	    buffers;
+	    byteLength;
+	    /**
+	     * The offset of data to be read in the current buffer.
+	     */
+	    byteOffsetInCurrentBuffer;
+	    /**
+	     * The index of buffer to be read in the array of buffers.
+	     */
+	    bufferIndex;
+	    /**
+	     * The total length of data already read.
+	     */
+	    pushedBytesLength;
+	    /**
+	     * Creates an instance of BuffersStream that will emit the data
+	     * contained in the array of buffers.
+	     *
+	     * @param buffers - Array of buffers containing the data
+	     * @param byteLength - The total length of data contained in the buffers
+	     */
+	    constructor(buffers, byteLength, options) {
+	        super(options);
+	        this.buffers = buffers;
+	        this.byteLength = byteLength;
+	        this.byteOffsetInCurrentBuffer = 0;
+	        this.bufferIndex = 0;
+	        this.pushedBytesLength = 0;
+	        // check byteLength is no larger than buffers[] total length
+	        let buffersLength = 0;
+	        for (const buf of this.buffers) {
+	            buffersLength += buf.byteLength;
+	        }
+	        if (buffersLength < this.byteLength) {
+	            throw new Error("Data size shouldn't be larger than the total length of buffers.");
+	        }
+	    }
+	    /**
+	     * Internal _read() that will be called when the stream wants to pull more data in.
+	     *
+	     * @param size - Optional. The size of data to be read
+	     */
+	    _read(size) {
+	        if (this.pushedBytesLength >= this.byteLength) {
+	            this.push(null);
+	        }
+	        if (!size) {
+	            size = this.readableHighWaterMark;
+	        }
+	        const outBuffers = [];
+	        let i = 0;
+	        while (i < size && this.pushedBytesLength < this.byteLength) {
+	            // The last buffer may be longer than the data it contains.
+	            const remainingDataInAllBuffers = this.byteLength - this.pushedBytesLength;
+	            const remainingCapacityInThisBuffer = this.buffers[this.bufferIndex].byteLength - this.byteOffsetInCurrentBuffer;
+	            const remaining = Math.min(remainingCapacityInThisBuffer, remainingDataInAllBuffers);
+	            if (remaining > size - i) {
+	                // chunkSize = size - i
+	                const end = this.byteOffsetInCurrentBuffer + size - i;
+	                outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));
+	                this.pushedBytesLength += size - i;
+	                this.byteOffsetInCurrentBuffer = end;
+	                i = size;
+	                break;
+	            }
+	            else {
+	                // chunkSize = remaining
+	                const end = this.byteOffsetInCurrentBuffer + remaining;
+	                outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));
+	                if (remaining === remainingCapacityInThisBuffer) {
+	                    // this.buffers[this.bufferIndex] used up, shift to next one
+	                    this.byteOffsetInCurrentBuffer = 0;
+	                    this.bufferIndex++;
+	                }
+	                else {
+	                    this.byteOffsetInCurrentBuffer = end;
+	                }
+	                this.pushedBytesLength += remaining;
+	                i += remaining;
+	            }
+	        }
+	        if (outBuffers.length > 1) {
+	            this.push(Buffer.concat(outBuffers));
+	        }
+	        else if (outBuffers.length === 1) {
+	            this.push(outBuffers[0]);
+	        }
+	    }
+	};
+	BuffersStream.BuffersStream = BuffersStream$1;
+	
+	return BuffersStream;
+}
+
+var hasRequiredPooledBuffer;
+
+function requirePooledBuffer () {
+	if (hasRequiredPooledBuffer) return PooledBuffer;
+	hasRequiredPooledBuffer = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(PooledBuffer, "__esModule", { value: true });
+	PooledBuffer.PooledBuffer = void 0;
+	const tslib_1 = require$$0$2;
+	const BuffersStream_js_1 = requireBuffersStream();
+	const node_buffer_1 = tslib_1.__importDefault(require$$0$6);
+	/**
+	 * maxBufferLength is max size of each buffer in the pooled buffers.
+	 */
+	const maxBufferLength = node_buffer_1.default.constants.MAX_LENGTH;
+	/**
+	 * This class provides a buffer container which conceptually has no hard size limit.
+	 * It accepts a capacity, an array of input buffers and the total length of input data.
+	 * It will allocate an internal "buffer" of the capacity and fill the data in the input buffers
+	 * into the internal "buffer" serially with respect to the total length.
+	 * Then by calling PooledBuffer.getReadableStream(), you can get a readable stream
+	 * assembled from all the data in the internal "buffer".
+	 */
+	let PooledBuffer$1 = class PooledBuffer {
+	    /**
+	     * Internal buffers used to keep the data.
+	     * Each buffer has a length of the maxBufferLength except last one.
+	     */
+	    buffers = [];
+	    /**
+	     * The total size of internal buffers.
+	     */
+	    capacity;
+	    /**
+	     * The total size of data contained in internal buffers.
+	     */
+	    _size;
+	    /**
+	     * The size of the data contained in the pooled buffers.
+	     */
+	    get size() {
+	        return this._size;
+	    }
+	    constructor(capacity, buffers, totalLength) {
+	        this.capacity = capacity;
+	        this._size = 0;
+	        // allocate
+	        const bufferNum = Math.ceil(capacity / maxBufferLength);
+	        for (let i = 0; i < bufferNum; i++) {
+	            let len = i === bufferNum - 1 ? capacity % maxBufferLength : maxBufferLength;
+	            if (len === 0) {
+	                len = maxBufferLength;
+	            }
+	            this.buffers.push(Buffer.allocUnsafe(len));
+	        }
+	        if (buffers) {
+	            this.fill(buffers, totalLength);
+	        }
+	    }
+	    /**
+	     * Fill the internal buffers with data in the input buffers serially
+	     * with respect to the total length and the total capacity of the internal buffers.
+	     * Data copied will be shift out of the input buffers.
+	     *
+	     * @param buffers - Input buffers containing the data to be filled in the pooled buffer
+	     * @param totalLength - Total length of the data to be filled in.
+	     *
+	     */
+	    fill(buffers, totalLength) {
+	        this._size = Math.min(this.capacity, totalLength);
+	        let i = 0, j = 0, targetOffset = 0, sourceOffset = 0, totalCopiedNum = 0;
+	        while (totalCopiedNum < this._size) {
+	            const source = buffers[i];
+	            const target = this.buffers[j];
+	            const copiedNum = source.copy(target, targetOffset, sourceOffset);
+	            totalCopiedNum += copiedNum;
+	            sourceOffset += copiedNum;
+	            targetOffset += copiedNum;
+	            if (sourceOffset === source.length) {
+	                i++;
+	                sourceOffset = 0;
+	            }
+	            if (targetOffset === target.length) {
+	                j++;
+	                targetOffset = 0;
+	            }
+	        }
+	        // clear copied from source buffers
+	        buffers.splice(0, i);
+	        if (buffers.length > 0) {
+	            buffers[0] = buffers[0].slice(sourceOffset);
+	        }
+	    }
+	    /**
+	     * Get the readable stream assembled from all the data in the internal buffers.
+	     *
+	     */
+	    getReadableStream() {
+	        return new BuffersStream_js_1.BuffersStream(this.buffers, this.size);
+	    }
+	};
+	PooledBuffer.PooledBuffer = PooledBuffer$1;
+	
+	return PooledBuffer;
+}
+
+var hasRequiredBufferScheduler;
+
+function requireBufferScheduler () {
+	if (hasRequiredBufferScheduler) return BufferScheduler;
+	hasRequiredBufferScheduler = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BufferScheduler, "__esModule", { value: true });
+	BufferScheduler.BufferScheduler = void 0;
+	const events_1 = require$$0$5;
+	const PooledBuffer_js_1 = requirePooledBuffer();
+	/**
+	 * This class accepts a Node.js Readable stream as input, and keeps reading data
+	 * from the stream into the internal buffer structure, until it reaches maxBuffers.
+	 * Every available buffer will try to trigger outgoingHandler.
+	 *
+	 * The internal buffer structure includes an incoming buffer array, and a outgoing
+	 * buffer array. The incoming buffer array includes the "empty" buffers can be filled
+	 * with new incoming data. The outgoing array includes the filled buffers to be
+	 * handled by outgoingHandler. Every above buffer size is defined by parameter bufferSize.
+	 *
+	 * NUM_OF_ALL_BUFFERS = BUFFERS_IN_INCOMING + BUFFERS_IN_OUTGOING + BUFFERS_UNDER_HANDLING
+	 *
+	 * NUM_OF_ALL_BUFFERS lesser than or equal to maxBuffers
+	 *
+	 * PERFORMANCE IMPROVEMENT TIPS:
+	 * 1. Input stream highWaterMark is better to set a same value with bufferSize
+	 *    parameter, which will avoid Buffer.concat() operations.
+	 * 2. concurrency should set a smaller value than maxBuffers, which is helpful to
+	 *    reduce the possibility when a outgoing handler waits for the stream data.
+	 *    in this situation, outgoing handlers are blocked.
+	 *    Outgoing queue shouldn't be empty.
+	 */
+	let BufferScheduler$1 = class BufferScheduler {
+	    /**
+	     * Size of buffers in incoming and outgoing queues. This class will try to align
+	     * data read from Readable stream into buffer chunks with bufferSize defined.
+	     */
+	    bufferSize;
+	    /**
+	     * How many buffers can be created or maintained.
+	     */
+	    maxBuffers;
+	    /**
+	     * A Node.js Readable stream.
+	     */
+	    readable;
+	    /**
+	     * OutgoingHandler is an async function triggered by BufferScheduler when there
+	     * are available buffers in outgoing array.
+	     */
+	    outgoingHandler;
+	    /**
+	     * An internal event emitter.
+	     */
+	    emitter = new events_1.EventEmitter();
+	    /**
+	     * Concurrency of executing outgoingHandlers. (0 lesser than concurrency lesser than or equal to maxBuffers)
+	     */
+	    concurrency;
+	    /**
+	     * An internal offset marker to track data offset in bytes of next outgoingHandler.
+	     */
+	    offset = 0;
+	    /**
+	     * An internal marker to track whether stream is end.
+	     */
+	    isStreamEnd = false;
+	    /**
+	     * An internal marker to track whether stream or outgoingHandler returns error.
+	     */
+	    isError = false;
+	    /**
+	     * How many handlers are executing.
+	     */
+	    executingOutgoingHandlers = 0;
+	    /**
+	     * Encoding of the input Readable stream which has string data type instead of Buffer.
+	     */
+	    encoding;
+	    /**
+	     * How many buffers have been allocated.
+	     */
+	    numBuffers = 0;
+	    /**
+	     * Because this class doesn't know how much data every time stream pops, which
+	     * is defined by highWaterMarker of the stream. So BufferScheduler will cache
+	     * data received from the stream, when data in unresolvedDataArray exceeds the
+	     * blockSize defined, it will try to concat a blockSize of buffer, fill into available
+	     * buffers from incoming and push to outgoing array.
+	     */
+	    unresolvedDataArray = [];
+	    /**
+	     * How much data consisted in unresolvedDataArray.
+	     */
+	    unresolvedLength = 0;
+	    /**
+	     * The array includes all the available buffers can be used to fill data from stream.
+	     */
+	    incoming = [];
+	    /**
+	     * The array (queue) includes all the buffers filled from stream data.
+	     */
+	    outgoing = [];
+	    /**
+	     * Creates an instance of BufferScheduler.
+	     *
+	     * @param readable - A Node.js Readable stream
+	     * @param bufferSize - Buffer size of every maintained buffer
+	     * @param maxBuffers - How many buffers can be allocated
+	     * @param outgoingHandler - An async function scheduled to be
+	     *                                          triggered when a buffer fully filled
+	     *                                          with stream data
+	     * @param concurrency - Concurrency of executing outgoingHandlers (>0)
+	     * @param encoding - [Optional] Encoding of Readable stream when it's a string stream
+	     */
+	    constructor(readable, bufferSize, maxBuffers, outgoingHandler, concurrency, encoding) {
+	        if (bufferSize <= 0) {
+	            throw new RangeError(`bufferSize must be larger than 0, current is ${bufferSize}`);
+	        }
+	        if (maxBuffers <= 0) {
+	            throw new RangeError(`maxBuffers must be larger than 0, current is ${maxBuffers}`);
+	        }
+	        if (concurrency <= 0) {
+	            throw new RangeError(`concurrency must be larger than 0, current is ${concurrency}`);
+	        }
+	        this.bufferSize = bufferSize;
+	        this.maxBuffers = maxBuffers;
+	        this.readable = readable;
+	        this.outgoingHandler = outgoingHandler;
+	        this.concurrency = concurrency;
+	        this.encoding = encoding;
+	    }
+	    /**
+	     * Start the scheduler, will return error when stream of any of the outgoingHandlers
+	     * returns error.
+	     *
+	     */
+	    async do() {
+	        return new Promise((resolve, reject) => {
+	            this.readable.on("data", (data) => {
+	                data = typeof data === "string" ? Buffer.from(data, this.encoding) : data;
+	                this.appendUnresolvedData(data);
+	                if (!this.resolveData()) {
+	                    this.readable.pause();
+	                }
+	            });
+	            this.readable.on("error", (err) => {
+	                this.emitter.emit("error", err);
+	            });
+	            this.readable.on("end", () => {
+	                this.isStreamEnd = true;
+	                this.emitter.emit("checkEnd");
+	            });
+	            this.emitter.on("error", (err) => {
+	                this.isError = true;
+	                this.readable.pause();
+	                reject(err);
+	            });
+	            this.emitter.on("checkEnd", () => {
+	                if (this.outgoing.length > 0) {
+	                    this.triggerOutgoingHandlers();
+	                    return;
+	                }
+	                if (this.isStreamEnd && this.executingOutgoingHandlers === 0) {
+	                    if (this.unresolvedLength > 0 && this.unresolvedLength < this.bufferSize) {
+	                        const buffer = this.shiftBufferFromUnresolvedDataArray();
+	                        this.outgoingHandler(() => buffer.getReadableStream(), buffer.size, this.offset)
+	                            .then(resolve)
+	                            .catch(reject);
+	                    }
+	                    else if (this.unresolvedLength >= this.bufferSize) {
+	                        return;
+	                    }
+	                    else {
+	                        resolve();
+	                    }
+	                }
+	            });
+	        });
+	    }
+	    /**
+	     * Insert a new data into unresolved array.
+	     *
+	     * @param data -
+	     */
+	    appendUnresolvedData(data) {
+	        this.unresolvedDataArray.push(data);
+	        this.unresolvedLength += data.length;
+	    }
+	    /**
+	     * Try to shift a buffer with size in blockSize. The buffer returned may be less
+	     * than blockSize when data in unresolvedDataArray is less than bufferSize.
+	     *
+	     */
+	    shiftBufferFromUnresolvedDataArray(buffer) {
+	        if (!buffer) {
+	            buffer = new PooledBuffer_js_1.PooledBuffer(this.bufferSize, this.unresolvedDataArray, this.unresolvedLength);
+	        }
+	        else {
+	            buffer.fill(this.unresolvedDataArray, this.unresolvedLength);
+	        }
+	        this.unresolvedLength -= buffer.size;
+	        return buffer;
+	    }
+	    /**
+	     * Resolve data in unresolvedDataArray. For every buffer with size in blockSize
+	     * shifted, it will try to get (or allocate a buffer) from incoming, and fill it,
+	     * then push it into outgoing to be handled by outgoing handler.
+	     *
+	     * Return false when available buffers in incoming are not enough, else true.
+	     *
+	     * @returns Return false when buffers in incoming are not enough, else true.
+	     */
+	    resolveData() {
+	        while (this.unresolvedLength >= this.bufferSize) {
+	            let buffer;
+	            if (this.incoming.length > 0) {
+	                buffer = this.incoming.shift();
+	                this.shiftBufferFromUnresolvedDataArray(buffer);
+	            }
+	            else {
+	                if (this.numBuffers < this.maxBuffers) {
+	                    buffer = this.shiftBufferFromUnresolvedDataArray();
+	                    this.numBuffers++;
+	                }
+	                else {
+	                    // No available buffer, wait for buffer returned
+	                    return false;
+	                }
+	            }
+	            this.outgoing.push(buffer);
+	            this.triggerOutgoingHandlers();
+	        }
+	        return true;
+	    }
+	    /**
+	     * Try to trigger a outgoing handler for every buffer in outgoing. Stop when
+	     * concurrency reaches.
+	     */
+	    async triggerOutgoingHandlers() {
+	        let buffer;
+	        do {
+	            if (this.executingOutgoingHandlers >= this.concurrency) {
+	                return;
+	            }
+	            buffer = this.outgoing.shift();
+	            if (buffer) {
+	                this.triggerOutgoingHandler(buffer);
+	            }
+	        } while (buffer);
+	    }
+	    /**
+	     * Trigger a outgoing handler for a buffer shifted from outgoing.
+	     *
+	     * @param buffer -
+	     */
+	    async triggerOutgoingHandler(buffer) {
+	        const bufferLength = buffer.size;
+	        this.executingOutgoingHandlers++;
+	        this.offset += bufferLength;
+	        try {
+	            await this.outgoingHandler(() => buffer.getReadableStream(), bufferLength, this.offset - bufferLength);
+	        }
+	        catch (err) {
+	            this.emitter.emit("error", err);
+	            return;
+	        }
+	        this.executingOutgoingHandlers--;
+	        this.reuseBuffer(buffer);
+	        this.emitter.emit("checkEnd");
+	    }
+	    /**
+	     * Return buffer used by outgoing handler into incoming.
+	     *
+	     * @param buffer -
+	     */
+	    reuseBuffer(buffer) {
+	        this.incoming.push(buffer);
+	        if (!this.isError && this.resolveData() && !this.isStreamEnd) {
+	            this.readable.resume();
+	        }
+	    }
+	};
+	BufferScheduler.BufferScheduler = BufferScheduler$1;
+	
+	return BufferScheduler;
+}
+
+var cache$2 = {};
+
+var hasRequiredCache$3;
+
+function requireCache$3 () {
+	if (hasRequiredCache$3) return cache$2;
+	hasRequiredCache$3 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(cache$2, "__esModule", { value: true });
+	cache$2.getCachedDefaultHttpClient = getCachedDefaultHttpClient;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	let _defaultHttpClient;
+	function getCachedDefaultHttpClient() {
+	    if (!_defaultHttpClient) {
+	        _defaultHttpClient = (0, core_rest_pipeline_1.createDefaultHttpClient)();
+	    }
+	    return _defaultHttpClient;
+	}
+	
+	return cache$2;
+}
+
+var StorageBrowserPolicyFactory$1 = {};
+
+var StorageBrowserPolicy$1 = {};
+
+var RequestPolicy = {};
+
+var hasRequiredRequestPolicy;
+
+function requireRequestPolicy () {
+	if (hasRequiredRequestPolicy) return RequestPolicy;
+	hasRequiredRequestPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(RequestPolicy, "__esModule", { value: true });
+	RequestPolicy.BaseRequestPolicy = void 0;
+	/**
+	 * The base class from which all request policies derive.
+	 */
+	class BaseRequestPolicy {
+	    _nextPolicy;
+	    _options;
+	    /**
+	     * The main method to implement that manipulates a request/response.
+	     */
+	    constructor(
+	    /**
+	     * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
+	     */
+	    _nextPolicy, 
+	    /**
+	     * The options that can be passed to a given request policy.
+	     */
+	    _options) {
+	        this._nextPolicy = _nextPolicy;
+	        this._options = _options;
+	    }
+	    /**
+	     * Get whether or not a log with the provided log level should be logged.
+	     * @param logLevel - The log level of the log that will be logged.
+	     * @returns Whether or not a log with the provided log level should be logged.
+	     */
+	    shouldLog(logLevel) {
+	        return this._options.shouldLog(logLevel);
+	    }
+	    /**
+	     * Attempt to log the provided message to the provided logger. If no logger was provided or if
+	     * the log level does not meat the logger's threshold, then nothing will be logged.
+	     * @param logLevel - The log level of this log.
+	     * @param message - The message of this log.
+	     */
+	    log(logLevel, message) {
+	        this._options.log(logLevel, message);
+	    }
+	}
+	RequestPolicy.BaseRequestPolicy = BaseRequestPolicy;
+	
+	return RequestPolicy;
+}
+
+var constants$7 = {};
+
+var hasRequiredConstants$7;
+
+function requireConstants$7 () {
+	if (hasRequiredConstants$7) return constants$7;
+	hasRequiredConstants$7 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(constants$7, "__esModule", { value: true });
+	constants$7.PathStylePorts = constants$7.DevelopmentConnectionString = constants$7.HeaderConstants = constants$7.URLConstants = constants$7.SDK_VERSION = void 0;
+	constants$7.SDK_VERSION = "1.0.0";
+	constants$7.URLConstants = {
+	    Parameters: {
+	        FORCE_BROWSER_NO_CACHE: "_",
+	        SIGNATURE: "sig",
+	        SNAPSHOT: "snapshot",
+	        VERSIONID: "versionid",
+	        TIMEOUT: "timeout",
+	    },
+	};
+	constants$7.HeaderConstants = {
+	    AUTHORIZATION: "Authorization",
+	    AUTHORIZATION_SCHEME: "Bearer",
+	    CONTENT_ENCODING: "Content-Encoding",
+	    CONTENT_ID: "Content-ID",
+	    CONTENT_LANGUAGE: "Content-Language",
+	    CONTENT_LENGTH: "Content-Length",
+	    CONTENT_MD5: "Content-Md5",
+	    CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",
+	    CONTENT_TYPE: "Content-Type",
+	    COOKIE: "Cookie",
+	    DATE: "date",
+	    IF_MATCH: "if-match",
+	    IF_MODIFIED_SINCE: "if-modified-since",
+	    IF_NONE_MATCH: "if-none-match",
+	    IF_UNMODIFIED_SINCE: "if-unmodified-since",
+	    PREFIX_FOR_STORAGE: "x-ms-",
+	    RANGE: "Range",
+	    USER_AGENT: "User-Agent",
+	    X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",
+	    X_MS_COPY_SOURCE: "x-ms-copy-source",
+	    X_MS_DATE: "x-ms-date",
+	    X_MS_ERROR_CODE: "x-ms-error-code",
+	    X_MS_VERSION: "x-ms-version",
+	    X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code",
+	};
+	constants$7.DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;
+	/// List of ports used for path style addressing.
+	/// Path style addressing means that storage account is put in URI's Path segment in instead of in host.
+	constants$7.PathStylePorts = [
+	    "10000",
+	    "10001",
+	    "10002",
+	    "10003",
+	    "10004",
+	    "10100",
+	    "10101",
+	    "10102",
+	    "10103",
+	    "10104",
+	    "11000",
+	    "11001",
+	    "11002",
+	    "11003",
+	    "11004",
+	    "11100",
+	    "11101",
+	    "11102",
+	    "11103",
+	    "11104",
+	];
+	
+	return constants$7;
+}
+
+var utils_common$1 = {};
+
+var hasRequiredUtils_common$1;
+
+function requireUtils_common$1 () {
+	if (hasRequiredUtils_common$1) return utils_common$1;
+	hasRequiredUtils_common$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(utils_common$1, "__esModule", { value: true });
+	utils_common$1.escapeURLPath = escapeURLPath;
+	utils_common$1.getValueInConnString = getValueInConnString;
+	utils_common$1.extractConnectionStringParts = extractConnectionStringParts;
+	utils_common$1.appendToURLPath = appendToURLPath;
+	utils_common$1.setURLParameter = setURLParameter;
+	utils_common$1.getURLParameter = getURLParameter;
+	utils_common$1.setURLHost = setURLHost;
+	utils_common$1.getURLPath = getURLPath;
+	utils_common$1.getURLScheme = getURLScheme;
+	utils_common$1.getURLPathAndQuery = getURLPathAndQuery;
+	utils_common$1.getURLQueries = getURLQueries;
+	utils_common$1.appendToURLQuery = appendToURLQuery;
+	utils_common$1.truncatedISO8061Date = truncatedISO8061Date;
+	utils_common$1.base64encode = base64encode;
+	utils_common$1.base64decode = base64decode;
+	utils_common$1.generateBlockID = generateBlockID;
+	utils_common$1.delay = delay;
+	utils_common$1.padStart = padStart;
+	utils_common$1.sanitizeURL = sanitizeURL;
+	utils_common$1.sanitizeHeaders = sanitizeHeaders;
+	utils_common$1.iEqual = iEqual;
+	utils_common$1.getAccountNameFromUrl = getAccountNameFromUrl;
+	utils_common$1.isIpEndpointStyle = isIpEndpointStyle;
+	utils_common$1.attachCredential = attachCredential;
+	utils_common$1.httpAuthorizationToString = httpAuthorizationToString;
+	utils_common$1.EscapePath = EscapePath;
+	utils_common$1.assertResponse = assertResponse;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const constants_js_1 = requireConstants$7();
+	/**
+	 * Reserved URL characters must be properly escaped for Storage services like Blob or File.
+	 *
+	 * ## URL encode and escape strategy for JS SDKs
+	 *
+	 * When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.
+	 * But before sending to Azure Storage server, the URL must be encoded. However, it's hard for a SDK to guess whether the URL
+	 * string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.
+	 *
+	 * ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.
+	 *
+	 * This is what legacy V2 SDK does, simple and works for most of the cases.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
+	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
+	 *   SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.
+	 *
+	 * But this strategy will make it not possible to create a blob with "?" in it's name. Because when customer URL string is
+	 * "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.
+	 * If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.
+	 * V2 SDK doesn't have this issue because it doesn't allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.
+	 * We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:
+	 *
+	 * ### Strategy Two: SDK doesn't assume the URL has been encoded or not. It will just escape the special characters.
+	 *
+	 * This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b:",
+	 *   SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
+	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.
+	 * - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",
+	 *   There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.
+	 *
+	 * This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string
+	 * is not encoded, there shouldn't a "%" in the URL string, otherwise the URL is not a valid URL.
+	 * If customer needs to create a blob with "%" in it's blob name, use "%25" instead of "%". Just like above 3rd sample.
+	 * And following URL strings are invalid:
+	 * - "http://account.blob.core.windows.net/con/b%"
+	 * - "http://account.blob.core.windows.net/con/b%2"
+	 * - "http://account.blob.core.windows.net/con/b%G"
+	 *
+	 * Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.
+	 *
+	 * ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`
+	 *
+	 * We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.
+	 *
+	 * @see https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
+	 * @see https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata
+	 *
+	 * @param url -
+	 */
+	function escapeURLPath(url) {
+	    const urlParsed = new URL(url);
+	    let path = urlParsed.pathname;
+	    path = path || "/";
+	    path = escape(path);
+	    urlParsed.pathname = path;
+	    return urlParsed.toString();
+	}
+	function getProxyUriFromDevConnString(connectionString) {
+	    // Development Connection String
+	    // https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key
+	    let proxyUri = "";
+	    if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {
+	        // CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri
+	        const matchCredentials = connectionString.split(";");
+	        for (const element of matchCredentials) {
+	            if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {
+	                proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];
+	            }
+	        }
+	    }
+	    return proxyUri;
+	}
+	function getValueInConnString(connectionString, argument) {
+	    const elements = connectionString.split(";");
+	    for (const element of elements) {
+	        if (element.trim().startsWith(argument)) {
+	            return element.trim().match(argument + "=(.*)")[1];
+	        }
+	    }
+	    return "";
+	}
+	/**
+	 * Extracts the parts of an Azure Storage account connection string.
+	 *
+	 * @param connectionString - Connection string.
+	 * @returns String key value pairs of the storage account's url and credentials.
+	 */
+	function extractConnectionStringParts(connectionString) {
+	    let proxyUri = "";
+	    if (connectionString.startsWith("UseDevelopmentStorage=true")) {
+	        // Development connection string
+	        proxyUri = getProxyUriFromDevConnString(connectionString);
+	        connectionString = constants_js_1.DevelopmentConnectionString;
+	    }
+	    // Matching BlobEndpoint in the Account connection string
+	    let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");
+	    // Slicing off '/' at the end if exists
+	    // (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)
+	    blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;
+	    if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&
+	        connectionString.search("AccountKey=") !== -1) {
+	        // Account connection string
+	        let defaultEndpointsProtocol = "";
+	        let accountName = "";
+	        let accountKey = Buffer.from("accountKey", "base64");
+	        let endpointSuffix = "";
+	        // Get account name and key
+	        accountName = getValueInConnString(connectionString, "AccountName");
+	        accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64");
+	        if (!blobEndpoint) {
+	            // BlobEndpoint is not present in the Account connection string
+	            // Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`
+	            defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");
+	            const protocol = defaultEndpointsProtocol.toLowerCase();
+	            if (protocol !== "https" && protocol !== "http") {
+	                throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'");
+	            }
+	            endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");
+	            if (!endpointSuffix) {
+	                throw new Error("Invalid EndpointSuffix in the provided Connection String");
+	            }
+	            blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
+	        }
+	        if (!accountName) {
+	            throw new Error("Invalid AccountName in the provided Connection String");
+	        }
+	        else if (accountKey.length === 0) {
+	            throw new Error("Invalid AccountKey in the provided Connection String");
+	        }
+	        return {
+	            kind: "AccountConnString",
+	            url: blobEndpoint,
+	            accountName,
+	            accountKey,
+	            proxyUri,
+	        };
+	    }
+	    else {
+	        // SAS connection string
+	        let accountSas = getValueInConnString(connectionString, "SharedAccessSignature");
+	        let accountName = getValueInConnString(connectionString, "AccountName");
+	        // if accountName is empty, try to read it from BlobEndpoint
+	        if (!accountName) {
+	            accountName = getAccountNameFromUrl(blobEndpoint);
+	        }
+	        if (!blobEndpoint) {
+	            throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");
+	        }
+	        else if (!accountSas) {
+	            throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");
+	        }
+	        // client constructors assume accountSas does *not* start with ?
+	        if (accountSas.startsWith("?")) {
+	            accountSas = accountSas.substring(1);
+	        }
+	        return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };
+	    }
+	}
+	/**
+	 * Internal escape method implemented Strategy Two mentioned in escapeURL() description.
+	 *
+	 * @param text -
+	 */
+	function escape(text) {
+	    return encodeURIComponent(text)
+	        .replace(/%2F/g, "/") // Don't escape for "/"
+	        .replace(/'/g, "%27") // Escape for "'"
+	        .replace(/\+/g, "%20")
+	        .replace(/%25/g, "%"); // Revert encoded "%"
+	}
+	/**
+	 * Append a string to URL path. Will remove duplicated "/" in front of the string
+	 * when URL path ends with a "/".
+	 *
+	 * @param url - Source URL string
+	 * @param name - String to be appended to URL
+	 * @returns An updated URL string
+	 */
+	function appendToURLPath(url, name) {
+	    const urlParsed = new URL(url);
+	    let path = urlParsed.pathname;
+	    path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;
+	    urlParsed.pathname = path;
+	    return urlParsed.toString();
+	}
+	/**
+	 * Set URL parameter name and value. If name exists in URL parameters, old value
+	 * will be replaced by name key. If not provide value, the parameter will be deleted.
+	 *
+	 * @param url - Source URL string
+	 * @param name - Parameter name
+	 * @param value - Parameter value
+	 * @returns An updated URL string
+	 */
+	function setURLParameter(url, name, value) {
+	    const urlParsed = new URL(url);
+	    const encodedName = encodeURIComponent(name);
+	    const encodedValue = value ? encodeURIComponent(value) : undefined;
+	    // mutating searchParams will change the encoding, so we have to do this ourselves
+	    const searchString = urlParsed.search === "" ? "?" : urlParsed.search;
+	    const searchPieces = [];
+	    for (const pair of searchString.slice(1).split("&")) {
+	        if (pair) {
+	            const [key] = pair.split("=", 2);
+	            if (key !== encodedName) {
+	                searchPieces.push(pair);
+	            }
+	        }
+	    }
+	    if (encodedValue) {
+	        searchPieces.push(`${encodedName}=${encodedValue}`);
+	    }
+	    urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
+	    return urlParsed.toString();
+	}
+	/**
+	 * Get URL parameter by name.
+	 *
+	 * @param url -
+	 * @param name -
+	 */
+	function getURLParameter(url, name) {
+	    const urlParsed = new URL(url);
+	    return urlParsed.searchParams.get(name) ?? undefined;
+	}
+	/**
+	 * Set URL host.
+	 *
+	 * @param url - Source URL string
+	 * @param host - New host string
+	 * @returns An updated URL string
+	 */
+	function setURLHost(url, host) {
+	    const urlParsed = new URL(url);
+	    urlParsed.hostname = host;
+	    return urlParsed.toString();
+	}
+	/**
+	 * Get URL path from an URL string.
+	 *
+	 * @param url - Source URL string
+	 */
+	function getURLPath(url) {
+	    try {
+	        const urlParsed = new URL(url);
+	        return urlParsed.pathname;
+	    }
+	    catch (e) {
+	        return undefined;
+	    }
+	}
+	/**
+	 * Get URL scheme from an URL string.
+	 *
+	 * @param url - Source URL string
+	 */
+	function getURLScheme(url) {
+	    try {
+	        const urlParsed = new URL(url);
+	        return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol;
+	    }
+	    catch (e) {
+	        return undefined;
+	    }
+	}
+	/**
+	 * Get URL path and query from an URL string.
+	 *
+	 * @param url - Source URL string
+	 */
+	function getURLPathAndQuery(url) {
+	    const urlParsed = new URL(url);
+	    const pathString = urlParsed.pathname;
+	    if (!pathString) {
+	        throw new RangeError("Invalid url without valid path.");
+	    }
+	    let queryString = urlParsed.search || "";
+	    queryString = queryString.trim();
+	    if (queryString !== "") {
+	        queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with '?'
+	    }
+	    return `${pathString}${queryString}`;
+	}
+	/**
+	 * Get URL query key value pairs from an URL string.
+	 *
+	 * @param url -
+	 */
+	function getURLQueries(url) {
+	    let queryString = new URL(url).search;
+	    if (!queryString) {
+	        return {};
+	    }
+	    queryString = queryString.trim();
+	    queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString;
+	    let querySubStrings = queryString.split("&");
+	    querySubStrings = querySubStrings.filter((value) => {
+	        const indexOfEqual = value.indexOf("=");
+	        const lastIndexOfEqual = value.lastIndexOf("=");
+	        return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);
+	    });
+	    const queries = {};
+	    for (const querySubString of querySubStrings) {
+	        const splitResults = querySubString.split("=");
+	        const key = splitResults[0];
+	        const value = splitResults[1];
+	        queries[key] = value;
+	    }
+	    return queries;
+	}
+	/**
+	 * Append a string to URL query.
+	 *
+	 * @param url - Source URL string.
+	 * @param queryParts - String to be appended to the URL query.
+	 * @returns An updated URL string.
+	 */
+	function appendToURLQuery(url, queryParts) {
+	    const urlParsed = new URL(url);
+	    let query = urlParsed.search;
+	    if (query) {
+	        query += "&" + queryParts;
+	    }
+	    else {
+	        query = queryParts;
+	    }
+	    urlParsed.search = query;
+	    return urlParsed.toString();
+	}
+	/**
+	 * Rounds a date off to seconds.
+	 *
+	 * @param date -
+	 * @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;
+	 *                                          If false, YYYY-MM-DDThh:mm:ssZ will be returned.
+	 * @returns Date string in ISO8061 format, with or without 7 milliseconds component
+	 */
+	function truncatedISO8061Date(date, withMilliseconds = true) {
+	    // Date.toISOString() will return like "2018-10-29T06:34:36.139Z"
+	    const dateString = date.toISOString();
+	    return withMilliseconds
+	        ? dateString.substring(0, dateString.length - 1) + "0000" + "Z"
+	        : dateString.substring(0, dateString.length - 5) + "Z";
+	}
+	/**
+	 * Base64 encode.
+	 *
+	 * @param content -
+	 */
+	function base64encode(content) {
+	    return !core_util_1.isNodeLike ? btoa(content) : Buffer.from(content).toString("base64");
+	}
+	/**
+	 * Base64 decode.
+	 *
+	 * @param encodedString -
+	 */
+	function base64decode(encodedString) {
+	    return !core_util_1.isNodeLike ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();
+	}
+	/**
+	 * Generate a 64 bytes base64 block ID string.
+	 *
+	 * @param blockIndex -
+	 */
+	function generateBlockID(blockIDPrefix, blockIndex) {
+	    // To generate a 64 bytes base64 string, source string should be 48
+	    const maxSourceStringLength = 48;
+	    // A blob can have a maximum of 100,000 uncommitted blocks at any given time
+	    const maxBlockIndexLength = 6;
+	    const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;
+	    if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {
+	        blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);
+	    }
+	    const res = blockIDPrefix +
+	        padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");
+	    return base64encode(res);
+	}
+	/**
+	 * Delay specified time interval.
+	 *
+	 * @param timeInMs -
+	 * @param aborter -
+	 * @param abortError -
+	 */
+	async function delay(timeInMs, aborter, abortError) {
+	    return new Promise((resolve, reject) => {
+	        /* eslint-disable-next-line prefer-const */
+	        let timeout;
+	        const abortHandler = () => {
+	            if (timeout !== undefined) {
+	                clearTimeout(timeout);
+	            }
+	            reject(abortError);
+	        };
+	        const resolveHandler = () => {
+	            if (aborter !== undefined) {
+	                aborter.removeEventListener("abort", abortHandler);
+	            }
+	            resolve();
+	        };
+	        timeout = setTimeout(resolveHandler, timeInMs);
+	        if (aborter !== undefined) {
+	            aborter.addEventListener("abort", abortHandler);
+	        }
+	    });
+	}
+	/**
+	 * String.prototype.padStart()
+	 *
+	 * @param currentString -
+	 * @param targetLength -
+	 * @param padString -
+	 */
+	function padStart(currentString, targetLength, padString = " ") {
+	    // @ts-expect-error: TS doesn't know this code needs to run downlevel sometimes
+	    if (String.prototype.padStart) {
+	        return currentString.padStart(targetLength, padString);
+	    }
+	    padString = padString || " ";
+	    if (currentString.length > targetLength) {
+	        return currentString;
+	    }
+	    else {
+	        targetLength = targetLength - currentString.length;
+	        if (targetLength > padString.length) {
+	            padString += padString.repeat(targetLength / padString.length);
+	        }
+	        return padString.slice(0, targetLength) + currentString;
+	    }
+	}
+	function sanitizeURL(url) {
+	    let safeURL = url;
+	    if (getURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE)) {
+	        safeURL = setURLParameter(safeURL, constants_js_1.URLConstants.Parameters.SIGNATURE, "*****");
+	    }
+	    return safeURL;
+	}
+	function sanitizeHeaders(originalHeader) {
+	    const headers = (0, core_rest_pipeline_1.createHttpHeaders)();
+	    for (const [name, value] of originalHeader) {
+	        if (name.toLowerCase() === constants_js_1.HeaderConstants.AUTHORIZATION.toLowerCase()) {
+	            headers.set(name, "*****");
+	        }
+	        else if (name.toLowerCase() === constants_js_1.HeaderConstants.X_MS_COPY_SOURCE) {
+	            headers.set(name, sanitizeURL(value));
+	        }
+	        else {
+	            headers.set(name, value);
+	        }
+	    }
+	    return headers;
+	}
+	/**
+	 * If two strings are equal when compared case insensitive.
+	 *
+	 * @param str1 -
+	 * @param str2 -
+	 */
+	function iEqual(str1, str2) {
+	    return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();
+	}
+	/**
+	 * Extracts account name from the url
+	 * @param url - url to extract the account name from
+	 * @returns with the account name
+	 */
+	function getAccountNameFromUrl(url) {
+	    const parsedUrl = new URL(url);
+	    let accountName;
+	    try {
+	        if (parsedUrl.hostname.split(".")[1] === "blob") {
+	            // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
+	            accountName = parsedUrl.hostname.split(".")[0];
+	        }
+	        else if (isIpEndpointStyle(parsedUrl)) {
+	            // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/
+	            // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/
+	            // .getPath() -> /devstoreaccount1/
+	            accountName = parsedUrl.pathname.split("/")[1];
+	        }
+	        else {
+	            // Custom domain case: "https://customdomain.com/containername/blob".
+	            accountName = "";
+	        }
+	        return accountName;
+	    }
+	    catch (error) {
+	        throw new Error("Unable to extract accountName with provided information.");
+	    }
+	}
+	function isIpEndpointStyle(parsedUrl) {
+	    const host = parsedUrl.host;
+	    // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'.
+	    // Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.
+	    // Case 3: Ipv4, use broad regex which just check if host contains Ipv4.
+	    // For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.
+	    return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||
+	        (Boolean(parsedUrl.port) && constants_js_1.PathStylePorts.includes(parsedUrl.port)));
+	}
+	/**
+	 * Attach a TokenCredential to an object.
+	 *
+	 * @param thing -
+	 * @param credential -
+	 */
+	function attachCredential(thing, credential) {
+	    thing.credential = credential;
+	    return thing;
+	}
+	function httpAuthorizationToString(httpAuthorization) {
+	    return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;
+	}
+	/**
+	 * Escape the blobName but keep path separator ('/').
+	 */
+	function EscapePath(blobName) {
+	    const split = blobName.split("/");
+	    for (let i = 0; i < split.length; i++) {
+	        split[i] = encodeURIComponent(split[i]);
+	    }
+	    return split.join("/");
+	}
+	/**
+	 * A typesafe helper for ensuring that a given response object has
+	 * the original _response attached.
+	 * @param response - A response object from calling a client operation
+	 * @returns The same object, but with known _response property
+	 */
+	function assertResponse(response) {
+	    if (`_response` in response) {
+	        return response;
+	    }
+	    throw new TypeError(`Unexpected response object ${response}`);
+	}
+	
+	return utils_common$1;
+}
+
+var hasRequiredStorageBrowserPolicy$1;
+
+function requireStorageBrowserPolicy$1 () {
+	if (hasRequiredStorageBrowserPolicy$1) return StorageBrowserPolicy$1;
+	hasRequiredStorageBrowserPolicy$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageBrowserPolicy$1, "__esModule", { value: true });
+	StorageBrowserPolicy$1.StorageBrowserPolicy = void 0;
+	const RequestPolicy_js_1 = requireRequestPolicy();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const constants_js_1 = requireConstants$7();
+	const utils_common_js_1 = requireUtils_common$1();
+	/**
+	 * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:
+	 *
+	 * 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.
+	 * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL
+	 * thus avoid the browser cache.
+	 *
+	 * 2. Remove cookie header for security
+	 *
+	 * 3. Remove content-length header to avoid browsers warning
+	 */
+	class StorageBrowserPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
+	    /**
+	     * Creates an instance of StorageBrowserPolicy.
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
+	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
+	    constructor(nextPolicy, options) {
+	        super(nextPolicy, options);
+	    }
+	    /**
+	     * Sends out request.
+	     *
+	     * @param request -
+	     */
+	    async sendRequest(request) {
+	        if (core_util_1.isNodeLike) {
+	            return this._nextPolicy.sendRequest(request);
+	        }
+	        if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {
+	            request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
+	        }
+	        request.headers.remove(constants_js_1.HeaderConstants.COOKIE);
+	        // According to XHR standards, content-length should be fully controlled by browsers
+	        request.headers.remove(constants_js_1.HeaderConstants.CONTENT_LENGTH);
+	        return this._nextPolicy.sendRequest(request);
+	    }
+	}
+	StorageBrowserPolicy$1.StorageBrowserPolicy = StorageBrowserPolicy;
+	
+	return StorageBrowserPolicy$1;
+}
+
+var hasRequiredStorageBrowserPolicyFactory$1;
+
+function requireStorageBrowserPolicyFactory$1 () {
+	if (hasRequiredStorageBrowserPolicyFactory$1) return StorageBrowserPolicyFactory$1;
+	hasRequiredStorageBrowserPolicyFactory$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.StorageBrowserPolicyFactory = exports$1.StorageBrowserPolicy = void 0;
+		const StorageBrowserPolicy_js_1 = requireStorageBrowserPolicy$1();
+		Object.defineProperty(exports$1, "StorageBrowserPolicy", { enumerable: true, get: function () { return StorageBrowserPolicy_js_1.StorageBrowserPolicy; } });
+		/**
+		 * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.
+		 */
+		class StorageBrowserPolicyFactory {
+		    /**
+		     * Creates a StorageBrowserPolicyFactory object.
+		     *
+		     * @param nextPolicy -
+		     * @param options -
+		     */
+		    create(nextPolicy, options) {
+		        return new StorageBrowserPolicy_js_1.StorageBrowserPolicy(nextPolicy, options);
+		    }
+		}
+		exports$1.StorageBrowserPolicyFactory = StorageBrowserPolicyFactory;
+		
+	} (StorageBrowserPolicyFactory$1));
+	return StorageBrowserPolicyFactory$1;
+}
+
+var AnonymousCredential = {};
+
+var AnonymousCredentialPolicy = {};
+
+var CredentialPolicy = {};
+
+var hasRequiredCredentialPolicy;
+
+function requireCredentialPolicy () {
+	if (hasRequiredCredentialPolicy) return CredentialPolicy;
+	hasRequiredCredentialPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(CredentialPolicy, "__esModule", { value: true });
+	CredentialPolicy.CredentialPolicy = void 0;
+	const RequestPolicy_js_1 = requireRequestPolicy();
+	/**
+	 * Credential policy used to sign HTTP(S) requests before sending. This is an
+	 * abstract class.
+	 */
+	let CredentialPolicy$1 = class CredentialPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
+	    /**
+	     * Sends out request.
+	     *
+	     * @param request -
+	     */
+	    sendRequest(request) {
+	        return this._nextPolicy.sendRequest(this.signRequest(request));
+	    }
+	    /**
+	     * Child classes must implement this method with request signing. This method
+	     * will be executed in {@link sendRequest}.
+	     *
+	     * @param request -
+	     */
+	    signRequest(request) {
+	        // Child classes must override this method with request signing. This method
+	        // will be executed in sendRequest().
+	        return request;
+	    }
+	};
+	CredentialPolicy.CredentialPolicy = CredentialPolicy$1;
+	
+	return CredentialPolicy;
+}
+
+var hasRequiredAnonymousCredentialPolicy;
+
+function requireAnonymousCredentialPolicy () {
+	if (hasRequiredAnonymousCredentialPolicy) return AnonymousCredentialPolicy;
+	hasRequiredAnonymousCredentialPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AnonymousCredentialPolicy, "__esModule", { value: true });
+	AnonymousCredentialPolicy.AnonymousCredentialPolicy = void 0;
+	const CredentialPolicy_js_1 = requireCredentialPolicy();
+	/**
+	 * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources
+	 * or for use with Shared Access Signatures (SAS).
+	 */
+	let AnonymousCredentialPolicy$1 = class AnonymousCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
+	    /**
+	     * Creates an instance of AnonymousCredentialPolicy.
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
+	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
+	    constructor(nextPolicy, options) {
+	        super(nextPolicy, options);
+	    }
+	};
+	AnonymousCredentialPolicy.AnonymousCredentialPolicy = AnonymousCredentialPolicy$1;
+	
+	return AnonymousCredentialPolicy;
+}
+
+var Credential = {};
+
+var hasRequiredCredential;
+
+function requireCredential () {
+	if (hasRequiredCredential) return Credential;
+	hasRequiredCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(Credential, "__esModule", { value: true });
+	Credential.Credential = void 0;
+	/**
+	 * Credential is an abstract class for Azure Storage HTTP requests signing. This
+	 * class will host an credentialPolicyCreator factory which generates CredentialPolicy.
+	 */
+	let Credential$1 = class Credential {
+	    /**
+	     * Creates a RequestPolicy object.
+	     *
+	     * @param _nextPolicy -
+	     * @param _options -
+	     */
+	    create(_nextPolicy, _options) {
+	        throw new Error("Method should be implemented in children classes.");
+	    }
+	};
+	Credential.Credential = Credential$1;
+	
+	return Credential;
+}
+
+var hasRequiredAnonymousCredential;
+
+function requireAnonymousCredential () {
+	if (hasRequiredAnonymousCredential) return AnonymousCredential;
+	hasRequiredAnonymousCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AnonymousCredential, "__esModule", { value: true });
+	AnonymousCredential.AnonymousCredential = void 0;
+	const AnonymousCredentialPolicy_js_1 = requireAnonymousCredentialPolicy();
+	const Credential_js_1 = requireCredential();
+	/**
+	 * AnonymousCredential provides a credentialPolicyCreator member used to create
+	 * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with
+	 * HTTP(S) requests that read public resources or for use with Shared Access
+	 * Signatures (SAS).
+	 */
+	let AnonymousCredential$1 = class AnonymousCredential extends Credential_js_1.Credential {
+	    /**
+	     * Creates an {@link AnonymousCredentialPolicy} object.
+	     *
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    create(nextPolicy, options) {
+	        return new AnonymousCredentialPolicy_js_1.AnonymousCredentialPolicy(nextPolicy, options);
+	    }
+	};
+	AnonymousCredential.AnonymousCredential = AnonymousCredential$1;
+	
+	return AnonymousCredential;
+}
+
+var StorageSharedKeyCredential = {};
+
+var StorageSharedKeyCredentialPolicy = {};
+
+var SharedKeyComparator = {};
+
+var hasRequiredSharedKeyComparator;
+
+function requireSharedKeyComparator () {
+	if (hasRequiredSharedKeyComparator) return SharedKeyComparator;
+	hasRequiredSharedKeyComparator = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(SharedKeyComparator, "__esModule", { value: true });
+	SharedKeyComparator.compareHeader = compareHeader;
+	/*
+	 * We need to imitate .Net culture-aware sorting, which is used in storage service.
+	 * Below tables contain sort-keys for en-US culture.
+	 */
+	const table_lv0 = new Uint32Array([
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721,
+	    0x723, 0x725, 0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e,
+	    0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe02, 0xe09, 0xe0a,
+	    0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89,
+	    0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x0, 0x0, 0x743, 0x744, 0x748,
+	    0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70,
+	    0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c,
+	    0x0, 0x750, 0x0,
+	]);
+	const table_lv2 = new Uint32Array([
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+	    0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+	    0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	]);
+	const table_lv4 = new Uint32Array([
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	]);
+	function compareHeader(lhs, rhs) {
+	    if (isLessThan(lhs, rhs))
+	        return -1;
+	    return 1;
+	}
+	function isLessThan(lhs, rhs) {
+	    const tables = [table_lv0, table_lv2, table_lv4];
+	    let curr_level = 0;
+	    let i = 0;
+	    let j = 0;
+	    while (curr_level < tables.length) {
+	        if (curr_level === tables.length - 1 && i !== j) {
+	            return i > j;
+	        }
+	        const weight1 = i < lhs.length ? tables[curr_level][lhs[i].charCodeAt(0)] : 0x1;
+	        const weight2 = j < rhs.length ? tables[curr_level][rhs[j].charCodeAt(0)] : 0x1;
+	        if (weight1 === 0x1 && weight2 === 0x1) {
+	            i = 0;
+	            j = 0;
+	            ++curr_level;
+	        }
+	        else if (weight1 === weight2) {
+	            ++i;
+	            ++j;
+	        }
+	        else if (weight1 === 0) {
+	            ++i;
+	        }
+	        else if (weight2 === 0) {
+	            ++j;
+	        }
+	        else {
+	            return weight1 < weight2;
+	        }
+	    }
+	    return false;
+	}
+	
+	return SharedKeyComparator;
+}
+
+var hasRequiredStorageSharedKeyCredentialPolicy;
+
+function requireStorageSharedKeyCredentialPolicy () {
+	if (hasRequiredStorageSharedKeyCredentialPolicy) return StorageSharedKeyCredentialPolicy;
+	hasRequiredStorageSharedKeyCredentialPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageSharedKeyCredentialPolicy, "__esModule", { value: true });
+	StorageSharedKeyCredentialPolicy.StorageSharedKeyCredentialPolicy = void 0;
+	const constants_js_1 = requireConstants$7();
+	const utils_common_js_1 = requireUtils_common$1();
+	const CredentialPolicy_js_1 = requireCredentialPolicy();
+	const SharedKeyComparator_js_1 = requireSharedKeyComparator();
+	/**
+	 * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.
+	 */
+	let StorageSharedKeyCredentialPolicy$1 = class StorageSharedKeyCredentialPolicy extends CredentialPolicy_js_1.CredentialPolicy {
+	    /**
+	     * Reference to StorageSharedKeyCredential which generates StorageSharedKeyCredentialPolicy
+	     */
+	    factory;
+	    /**
+	     * Creates an instance of StorageSharedKeyCredentialPolicy.
+	     * @param nextPolicy -
+	     * @param options -
+	     * @param factory -
+	     */
+	    constructor(nextPolicy, options, factory) {
+	        super(nextPolicy, options);
+	        this.factory = factory;
+	    }
+	    /**
+	     * Signs request.
+	     *
+	     * @param request -
+	     */
+	    signRequest(request) {
+	        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
+	        if (request.body &&
+	            (typeof request.body === "string" || request.body !== undefined) &&
+	            request.body.length > 0) {
+	            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
+	        }
+	        const stringToSign = [
+	            request.method.toUpperCase(),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
+	            this.getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
+	        ].join("\n") +
+	            "\n" +
+	            this.getCanonicalizedHeadersString(request) +
+	            this.getCanonicalizedResourceString(request);
+	        const signature = this.factory.computeHMACSHA256(stringToSign);
+	        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);
+	        // console.log(`[URL]:${request.url}`);
+	        // console.log(`[HEADERS]:${request.headers.toString()}`);
+	        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
+	        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
+	        return request;
+	    }
+	    /**
+	     * Retrieve header value according to shared key sign rules.
+	     * @see https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
+	     *
+	     * @param request -
+	     * @param headerName -
+	     */
+	    getHeaderValueToSign(request, headerName) {
+	        const value = request.headers.get(headerName);
+	        if (!value) {
+	            return "";
+	        }
+	        // When using version 2015-02-21 or later, if Content-Length is zero, then
+	        // set the Content-Length part of the StringToSign to an empty string.
+	        // https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
+	        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
+	            return "";
+	        }
+	        return value;
+	    }
+	    /**
+	     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
+	     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
+	     * 2. Convert each HTTP header name to lowercase.
+	     * 3. Sort the headers lexicographically by header name, in ascending order.
+	     *    Each header may appear only once in the string.
+	     * 4. Replace any linear whitespace in the header value with a single space.
+	     * 5. Trim any whitespace around the colon in the header.
+	     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
+	     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
+	     *
+	     * @param request -
+	     */
+	    getCanonicalizedHeadersString(request) {
+	        let headersArray = request.headers.headersArray().filter((value) => {
+	            return value.name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE);
+	        });
+	        headersArray.sort((a, b) => {
+	            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
+	        });
+	        // Remove duplicate headers
+	        headersArray = headersArray.filter((value, index, array) => {
+	            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
+	                return false;
+	            }
+	            return true;
+	        });
+	        let canonicalizedHeadersStringToSign = "";
+	        headersArray.forEach((header) => {
+	            canonicalizedHeadersStringToSign += `${header.name
+	                .toLowerCase()
+	                .trimRight()}:${header.value.trimLeft()}\n`;
+	        });
+	        return canonicalizedHeadersStringToSign;
+	    }
+	    /**
+	     * Retrieves the webResource canonicalized resource string.
+	     *
+	     * @param request -
+	     */
+	    getCanonicalizedResourceString(request) {
+	        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
+	        let canonicalizedResourceString = "";
+	        canonicalizedResourceString += `/${this.factory.accountName}${path}`;
+	        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
+	        const lowercaseQueries = {};
+	        if (queries) {
+	            const queryKeys = [];
+	            for (const key in queries) {
+	                if (Object.prototype.hasOwnProperty.call(queries, key)) {
+	                    const lowercaseKey = key.toLowerCase();
+	                    lowercaseQueries[lowercaseKey] = queries[key];
+	                    queryKeys.push(lowercaseKey);
+	                }
+	            }
+	            queryKeys.sort();
+	            for (const key of queryKeys) {
+	                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
+	            }
+	        }
+	        return canonicalizedResourceString;
+	    }
+	};
+	StorageSharedKeyCredentialPolicy.StorageSharedKeyCredentialPolicy = StorageSharedKeyCredentialPolicy$1;
+	
+	return StorageSharedKeyCredentialPolicy;
+}
+
+var hasRequiredStorageSharedKeyCredential;
+
+function requireStorageSharedKeyCredential () {
+	if (hasRequiredStorageSharedKeyCredential) return StorageSharedKeyCredential;
+	hasRequiredStorageSharedKeyCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageSharedKeyCredential, "__esModule", { value: true });
+	StorageSharedKeyCredential.StorageSharedKeyCredential = void 0;
+	const node_crypto_1 = require$$0$d;
+	const StorageSharedKeyCredentialPolicy_js_1 = requireStorageSharedKeyCredentialPolicy();
+	const Credential_js_1 = requireCredential();
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * StorageSharedKeyCredential for account key authorization of Azure Storage service.
+	 */
+	let StorageSharedKeyCredential$1 = class StorageSharedKeyCredential extends Credential_js_1.Credential {
+	    /**
+	     * Azure Storage account name; readonly.
+	     */
+	    accountName;
+	    /**
+	     * Azure Storage account key; readonly.
+	     */
+	    accountKey;
+	    /**
+	     * Creates an instance of StorageSharedKeyCredential.
+	     * @param accountName -
+	     * @param accountKey -
+	     */
+	    constructor(accountName, accountKey) {
+	        super();
+	        this.accountName = accountName;
+	        this.accountKey = Buffer.from(accountKey, "base64");
+	    }
+	    /**
+	     * Creates a StorageSharedKeyCredentialPolicy object.
+	     *
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    create(nextPolicy, options) {
+	        return new StorageSharedKeyCredentialPolicy_js_1.StorageSharedKeyCredentialPolicy(nextPolicy, options, this);
+	    }
+	    /**
+	     * Generates a hash signature for an HTTP request or for a SAS.
+	     *
+	     * @param stringToSign -
+	     */
+	    computeHMACSHA256(stringToSign) {
+	        return (0, node_crypto_1.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");
+	    }
+	};
+	StorageSharedKeyCredential.StorageSharedKeyCredential = StorageSharedKeyCredential$1;
+	
+	return StorageSharedKeyCredential;
+}
+
+var StorageRetryPolicyFactory = {};
+
+var StorageRetryPolicy = {};
+
+var commonjs$1 = {};
+
+var AbortError$1 = {};
+
+var hasRequiredAbortError;
+
+function requireAbortError () {
+	if (hasRequiredAbortError) return AbortError$1;
+	hasRequiredAbortError = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(AbortError$1, "__esModule", { value: true });
+	AbortError$1.AbortError = void 0;
+	/**
+	 * This error is thrown when an asynchronous operation has been aborted.
+	 * Check for this error by testing the `name` that the name property of the
+	 * error matches `"AbortError"`.
+	 *
+	 * @example
+	 * ```ts
+	 * const controller = new AbortController();
+	 * controller.abort();
+	 * try {
+	 *   doAsyncWork(controller.signal)
+	 * } catch (e) {
+	 *   if (e.name === 'AbortError') {
+	 *     // handle abort error here.
+	 *   }
+	 * }
+	 * ```
+	 */
+	class AbortError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = "AbortError";
+	    }
+	}
+	AbortError$1.AbortError = AbortError;
+	
+	return AbortError$1;
+}
+
+var hasRequiredCommonjs$3;
+
+function requireCommonjs$3 () {
+	if (hasRequiredCommonjs$3) return commonjs$1;
+	hasRequiredCommonjs$3 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT license.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.AbortError = void 0;
+		var AbortError_js_1 = requireAbortError();
+		Object.defineProperty(exports$1, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.AbortError; } });
+		
+	} (commonjs$1));
+	return commonjs$1;
+}
+
+var log = {};
+
+var hasRequiredLog;
+
+function requireLog () {
+	if (hasRequiredLog) return log;
+	hasRequiredLog = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(log, "__esModule", { value: true });
+	log.logger = void 0;
+	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
+	/**
+	 * The `@azure/logger` configuration for this package.
+	 */
+	log.logger = (0, logger_1.createClientLogger)("storage-common");
+	
+	return log;
+}
+
+var StorageRetryPolicyType = {};
+
+var hasRequiredStorageRetryPolicyType;
+
+function requireStorageRetryPolicyType () {
+	if (hasRequiredStorageRetryPolicyType) return StorageRetryPolicyType;
+	hasRequiredStorageRetryPolicyType = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageRetryPolicyType, "__esModule", { value: true });
+	StorageRetryPolicyType.StorageRetryPolicyType = void 0;
+	/**
+	 * RetryPolicy types.
+	 */
+	var StorageRetryPolicyType$1;
+	(function (StorageRetryPolicyType) {
+	    /**
+	     * Exponential retry. Retry time delay grows exponentially.
+	     */
+	    StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";
+	    /**
+	     * Linear retry. Retry time delay grows linearly.
+	     */
+	    StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";
+	})(StorageRetryPolicyType$1 || (StorageRetryPolicyType.StorageRetryPolicyType = StorageRetryPolicyType$1 = {}));
+	
+	return StorageRetryPolicyType;
+}
+
+var hasRequiredStorageRetryPolicy;
+
+function requireStorageRetryPolicy () {
+	if (hasRequiredStorageRetryPolicy) return StorageRetryPolicy;
+	hasRequiredStorageRetryPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageRetryPolicy, "__esModule", { value: true });
+	StorageRetryPolicy.StorageRetryPolicy = void 0;
+	StorageRetryPolicy.NewRetryPolicyFactory = NewRetryPolicyFactory;
+	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$3();
+	const RequestPolicy_js_1 = requireRequestPolicy();
+	const constants_js_1 = requireConstants$7();
+	const utils_common_js_1 = requireUtils_common$1();
+	const log_js_1 = requireLog();
+	const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType();
+	/**
+	 * A factory method used to generated a RetryPolicy factory.
+	 *
+	 * @param retryOptions -
+	 */
+	function NewRetryPolicyFactory(retryOptions) {
+	    return {
+	        create: (nextPolicy, options) => {
+	            return new StorageRetryPolicy$1(nextPolicy, options, retryOptions);
+	        },
+	    };
+	}
+	// Default values of StorageRetryOptions
+	const DEFAULT_RETRY_OPTIONS = {
+	    maxRetryDelayInMs: 120 * 1000,
+	    maxTries: 4,
+	    retryDelayInMs: 4 * 1000,
+	    retryPolicyType: StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL,
+	    secondaryHost: "",
+	    tryTimeoutInMs: undefined, // Use server side default timeout strategy
+	};
+	const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
+	/**
+	 * Retry policy with exponential retry and linear retry implemented.
+	 */
+	let StorageRetryPolicy$1 = class StorageRetryPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
+	    /**
+	     * RetryOptions.
+	     */
+	    retryOptions;
+	    /**
+	     * Creates an instance of RetryPolicy.
+	     *
+	     * @param nextPolicy -
+	     * @param options -
+	     * @param retryOptions -
+	     */
+	    constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {
+	        super(nextPolicy, options);
+	        // Initialize retry options
+	        this.retryOptions = {
+	            retryPolicyType: retryOptions.retryPolicyType
+	                ? retryOptions.retryPolicyType
+	                : DEFAULT_RETRY_OPTIONS.retryPolicyType,
+	            maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1
+	                ? Math.floor(retryOptions.maxTries)
+	                : DEFAULT_RETRY_OPTIONS.maxTries,
+	            tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0
+	                ? retryOptions.tryTimeoutInMs
+	                : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,
+	            retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0
+	                ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs
+	                    ? retryOptions.maxRetryDelayInMs
+	                    : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)
+	                : DEFAULT_RETRY_OPTIONS.retryDelayInMs,
+	            maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0
+	                ? retryOptions.maxRetryDelayInMs
+	                : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,
+	            secondaryHost: retryOptions.secondaryHost
+	                ? retryOptions.secondaryHost
+	                : DEFAULT_RETRY_OPTIONS.secondaryHost,
+	        };
+	    }
+	    /**
+	     * Sends request.
+	     *
+	     * @param request -
+	     */
+	    async sendRequest(request) {
+	        return this.attemptSendRequest(request, false, 1);
+	    }
+	    /**
+	     * Decide and perform next retry. Won't mutate request parameter.
+	     *
+	     * @param request -
+	     * @param secondaryHas404 -  If attempt was against the secondary & it returned a StatusNotFound (404), then
+	     *                                   the resource was not found. This may be due to replication delay. So, in this
+	     *                                   case, we'll never try the secondary again for this operation.
+	     * @param attempt -           How many retries has been attempted to performed, starting from 1, which includes
+	     *                                   the attempt will be performed by this method call.
+	     */
+	    async attemptSendRequest(request, secondaryHas404, attempt) {
+	        const newRequest = request.clone();
+	        const isPrimaryRetry = secondaryHas404 ||
+	            !this.retryOptions.secondaryHost ||
+	            !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||
+	            attempt % 2 === 1;
+	        if (!isPrimaryRetry) {
+	            newRequest.url = (0, utils_common_js_1.setURLHost)(newRequest.url, this.retryOptions.secondaryHost);
+	        }
+	        // Set the server-side timeout query parameter "timeout=[seconds]"
+	        if (this.retryOptions.tryTimeoutInMs) {
+	            newRequest.url = (0, utils_common_js_1.setURLParameter)(newRequest.url, constants_js_1.URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());
+	        }
+	        let response;
+	        try {
+	            log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
+	            response = await this._nextPolicy.sendRequest(newRequest);
+	            if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {
+	                return response;
+	            }
+	            secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
+	        }
+	        catch (err) {
+	            log_js_1.logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);
+	            if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {
+	                throw err;
+	            }
+	        }
+	        await this.delay(isPrimaryRetry, attempt, request.abortSignal);
+	        return this.attemptSendRequest(request, secondaryHas404, ++attempt);
+	    }
+	    /**
+	     * Decide whether to retry according to last HTTP response and retry counters.
+	     *
+	     * @param isPrimaryRetry -
+	     * @param attempt -
+	     * @param response -
+	     * @param err -
+	     */
+	    shouldRetry(isPrimaryRetry, attempt, response, err) {
+	        if (attempt >= this.retryOptions.maxTries) {
+	            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions
+	                .maxTries}, no further try.`);
+	            return false;
+	        }
+	        // Handle network failures, you may need to customize the list when you implement
+	        // your own http client
+	        const retriableErrors = [
+	            "ETIMEDOUT",
+	            "ESOCKETTIMEDOUT",
+	            "ECONNREFUSED",
+	            "ECONNRESET",
+	            "ENOENT",
+	            "ENOTFOUND",
+	            "TIMEOUT",
+	            "EPIPE",
+	            "REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js
+	        ];
+	        if (err) {
+	            for (const retriableError of retriableErrors) {
+	                if (err.name.toUpperCase().includes(retriableError) ||
+	                    err.message.toUpperCase().includes(retriableError) ||
+	                    (err.code && err.code.toString().toUpperCase() === retriableError)) {
+	                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
+	                    return true;
+	                }
+	            }
+	        }
+	        // If attempt was against the secondary & it returned a StatusNotFound (404), then
+	        // the resource was not found. This may be due to replication delay. So, in this
+	        // case, we'll never try the secondary again for this operation.
+	        if (response || err) {
+	            const statusCode = response ? response.status : err ? err.statusCode : 0;
+	            if (!isPrimaryRetry && statusCode === 404) {
+	                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
+	                return true;
+	            }
+	            // Server internal error or server timeout
+	            if (statusCode === 503 || statusCode === 500) {
+	                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
+	                return true;
+	            }
+	        }
+	        if (response) {
+	            // Retry select Copy Source Error Codes.
+	            if (response?.status >= 400) {
+	                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
+	                if (copySourceError !== undefined) {
+	                    switch (copySourceError) {
+	                        case "InternalError":
+	                        case "OperationTimedOut":
+	                        case "ServerBusy":
+	                            return true;
+	                    }
+	                }
+	            }
+	        }
+	        if (err?.code === "PARSE_ERROR" && err?.message.startsWith(`Error "Error: Unclosed root tag`)) {
+	            log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
+	            return true;
+	        }
+	        return false;
+	    }
+	    /**
+	     * Delay a calculated time between retries.
+	     *
+	     * @param isPrimaryRetry -
+	     * @param attempt -
+	     * @param abortSignal -
+	     */
+	    async delay(isPrimaryRetry, attempt, abortSignal) {
+	        let delayTimeInMs = 0;
+	        if (isPrimaryRetry) {
+	            switch (this.retryOptions.retryPolicyType) {
+	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.EXPONENTIAL:
+	                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);
+	                    break;
+	                case StorageRetryPolicyType_js_1.StorageRetryPolicyType.FIXED:
+	                    delayTimeInMs = this.retryOptions.retryDelayInMs;
+	                    break;
+	            }
+	        }
+	        else {
+	            delayTimeInMs = Math.random() * 1000;
+	        }
+	        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
+	        return (0, utils_common_js_1.delay)(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);
+	    }
+	};
+	StorageRetryPolicy.StorageRetryPolicy = StorageRetryPolicy$1;
+	
+	return StorageRetryPolicy;
+}
+
+var hasRequiredStorageRetryPolicyFactory;
+
+function requireStorageRetryPolicyFactory () {
+	if (hasRequiredStorageRetryPolicyFactory) return StorageRetryPolicyFactory;
+	hasRequiredStorageRetryPolicyFactory = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.StorageRetryPolicyFactory = exports$1.StorageRetryPolicy = exports$1.StorageRetryPolicyType = void 0;
+		const StorageRetryPolicy_js_1 = requireStorageRetryPolicy();
+		Object.defineProperty(exports$1, "StorageRetryPolicy", { enumerable: true, get: function () { return StorageRetryPolicy_js_1.StorageRetryPolicy; } });
+		const StorageRetryPolicyType_js_1 = requireStorageRetryPolicyType();
+		Object.defineProperty(exports$1, "StorageRetryPolicyType", { enumerable: true, get: function () { return StorageRetryPolicyType_js_1.StorageRetryPolicyType; } });
+		/**
+		 * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.
+		 */
+		class StorageRetryPolicyFactory {
+		    retryOptions;
+		    /**
+		     * Creates an instance of StorageRetryPolicyFactory.
+		     * @param retryOptions -
+		     */
+		    constructor(retryOptions) {
+		        this.retryOptions = retryOptions;
+		    }
+		    /**
+		     * Creates a StorageRetryPolicy object.
+		     *
+		     * @param nextPolicy -
+		     * @param options -
+		     */
+		    create(nextPolicy, options) {
+		        return new StorageRetryPolicy_js_1.StorageRetryPolicy(nextPolicy, options, this.retryOptions);
+		    }
+		}
+		exports$1.StorageRetryPolicyFactory = StorageRetryPolicyFactory;
+		
+	} (StorageRetryPolicyFactory));
+	return StorageRetryPolicyFactory;
+}
+
+var StorageBrowserPolicyV2$1 = {};
+
+var hasRequiredStorageBrowserPolicyV2$1;
+
+function requireStorageBrowserPolicyV2$1 () {
+	if (hasRequiredStorageBrowserPolicyV2$1) return StorageBrowserPolicyV2$1;
+	hasRequiredStorageBrowserPolicyV2$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageBrowserPolicyName = void 0;
+		exports$1.storageBrowserPolicy = storageBrowserPolicy;
+		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+		const constants_js_1 = requireConstants$7();
+		const utils_common_js_1 = requireUtils_common$1();
+		/**
+		 * The programmatic identifier of the StorageBrowserPolicy.
+		 */
+		exports$1.storageBrowserPolicyName = "storageBrowserPolicy";
+		/**
+		 * storageBrowserPolicy is a policy used to prevent browsers from caching requests
+		 * and to remove cookies and explicit content-length headers.
+		 */
+		function storageBrowserPolicy() {
+		    return {
+		        name: exports$1.storageBrowserPolicyName,
+		        async sendRequest(request, next) {
+		            if (core_util_1.isNodeLike) {
+		                return next(request);
+		            }
+		            if (request.method === "GET" || request.method === "HEAD") {
+		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
+		            }
+		            request.headers.delete(constants_js_1.HeaderConstants.COOKIE);
+		            // According to XHR standards, content-length should be fully controlled by browsers
+		            request.headers.delete(constants_js_1.HeaderConstants.CONTENT_LENGTH);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (StorageBrowserPolicyV2$1));
+	return StorageBrowserPolicyV2$1;
+}
+
+var StorageCorrectContentLengthPolicy$1 = {};
+
+var hasRequiredStorageCorrectContentLengthPolicy$1;
+
+function requireStorageCorrectContentLengthPolicy$1 () {
+	if (hasRequiredStorageCorrectContentLengthPolicy$1) return StorageCorrectContentLengthPolicy$1;
+	hasRequiredStorageCorrectContentLengthPolicy$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageCorrectContentLengthPolicyName = void 0;
+		exports$1.storageCorrectContentLengthPolicy = storageCorrectContentLengthPolicy;
+		const constants_js_1 = requireConstants$7();
+		/**
+		 * The programmatic identifier of the storageCorrectContentLengthPolicy.
+		 */
+		exports$1.storageCorrectContentLengthPolicyName = "StorageCorrectContentLengthPolicy";
+		/**
+		 * storageCorrectContentLengthPolicy to correctly set Content-Length header with request body length.
+		 */
+		function storageCorrectContentLengthPolicy() {
+		    function correctContentLength(request) {
+		        if (request.body &&
+		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
+		            request.body.length > 0) {
+		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
+		        }
+		    }
+		    return {
+		        name: exports$1.storageCorrectContentLengthPolicyName,
+		        async sendRequest(request, next) {
+		            correctContentLength(request);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (StorageCorrectContentLengthPolicy$1));
+	return StorageCorrectContentLengthPolicy$1;
+}
+
+var StorageRetryPolicyV2$1 = {};
+
+var hasRequiredStorageRetryPolicyV2$1;
+
+function requireStorageRetryPolicyV2$1 () {
+	if (hasRequiredStorageRetryPolicyV2$1) return StorageRetryPolicyV2$1;
+	hasRequiredStorageRetryPolicyV2$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageRetryPolicyName = void 0;
+		exports$1.storageRetryPolicy = storageRetryPolicy;
+		const abort_controller_1 = /*@__PURE__*/ requireCommonjs$3();
+		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+		const StorageRetryPolicyFactory_js_1 = requireStorageRetryPolicyFactory();
+		const constants_js_1 = requireConstants$7();
+		const utils_common_js_1 = requireUtils_common$1();
+		const log_js_1 = requireLog();
+		/**
+		 * Name of the {@link storageRetryPolicy}
+		 */
+		exports$1.storageRetryPolicyName = "storageRetryPolicy";
+		// Default values of StorageRetryOptions
+		const DEFAULT_RETRY_OPTIONS = {
+		    maxRetryDelayInMs: 120 * 1000,
+		    maxTries: 4,
+		    retryDelayInMs: 4 * 1000,
+		    retryPolicyType: StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL,
+		    secondaryHost: "",
+		    tryTimeoutInMs: undefined, // Use server side default timeout strategy
+		};
+		const retriableErrors = [
+		    "ETIMEDOUT",
+		    "ESOCKETTIMEDOUT",
+		    "ECONNREFUSED",
+		    "ECONNRESET",
+		    "ENOENT",
+		    "ENOTFOUND",
+		    "TIMEOUT",
+		    "EPIPE",
+		    "REQUEST_SEND_ERROR",
+		];
+		const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
+		/**
+		 * Retry policy with exponential retry and linear retry implemented.
+		 */
+		function storageRetryPolicy(options = {}) {
+		    const retryPolicyType = options.retryPolicyType ?? DEFAULT_RETRY_OPTIONS.retryPolicyType;
+		    const maxTries = options.maxTries ?? DEFAULT_RETRY_OPTIONS.maxTries;
+		    const retryDelayInMs = options.retryDelayInMs ?? DEFAULT_RETRY_OPTIONS.retryDelayInMs;
+		    const maxRetryDelayInMs = options.maxRetryDelayInMs ?? DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs;
+		    const secondaryHost = options.secondaryHost ?? DEFAULT_RETRY_OPTIONS.secondaryHost;
+		    const tryTimeoutInMs = options.tryTimeoutInMs ?? DEFAULT_RETRY_OPTIONS.tryTimeoutInMs;
+		    function shouldRetry({ isPrimaryRetry, attempt, response, error, }) {
+		        if (attempt >= maxTries) {
+		            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${maxTries}, no further try.`);
+		            return false;
+		        }
+		        if (error) {
+		            for (const retriableError of retriableErrors) {
+		                if (error.name.toUpperCase().includes(retriableError) ||
+		                    error.message.toUpperCase().includes(retriableError) ||
+		                    (error.code && error.code.toString().toUpperCase() === retriableError)) {
+		                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
+		                    return true;
+		                }
+		            }
+		            if (error?.code === "PARSE_ERROR" &&
+		                error?.message.startsWith(`Error "Error: Unclosed root tag`)) {
+		                log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
+		                return true;
+		            }
+		        }
+		        // If attempt was against the secondary & it returned a StatusNotFound (404), then
+		        // the resource was not found. This may be due to replication delay. So, in this
+		        // case, we'll never try the secondary again for this operation.
+		        if (response || error) {
+		            const statusCode = response?.status ?? error?.statusCode ?? 0;
+		            if (!isPrimaryRetry && statusCode === 404) {
+		                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
+		                return true;
+		            }
+		            // Server internal error or server timeout
+		            if (statusCode === 503 || statusCode === 500) {
+		                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
+		                return true;
+		            }
+		        }
+		        if (response) {
+		            // Retry select Copy Source Error Codes.
+		            if (response?.status >= 400) {
+		                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
+		                if (copySourceError !== undefined) {
+		                    switch (copySourceError) {
+		                        case "InternalError":
+		                        case "OperationTimedOut":
+		                        case "ServerBusy":
+		                            return true;
+		                    }
+		                }
+		            }
+		        }
+		        return false;
+		    }
+		    function calculateDelay(isPrimaryRetry, attempt) {
+		        let delayTimeInMs = 0;
+		        if (isPrimaryRetry) {
+		            switch (retryPolicyType) {
+		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL:
+		                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * retryDelayInMs, maxRetryDelayInMs);
+		                    break;
+		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.FIXED:
+		                    delayTimeInMs = retryDelayInMs;
+		                    break;
+		            }
+		        }
+		        else {
+		            delayTimeInMs = Math.random() * 1000;
+		        }
+		        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
+		        return delayTimeInMs;
+		    }
+		    return {
+		        name: exports$1.storageRetryPolicyName,
+		        async sendRequest(request, next) {
+		            // Set the server-side timeout query parameter "timeout=[seconds]"
+		            if (tryTimeoutInMs) {
+		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.TIMEOUT, String(Math.floor(tryTimeoutInMs / 1000)));
+		            }
+		            const primaryUrl = request.url;
+		            const secondaryUrl = secondaryHost ? (0, utils_common_js_1.setURLHost)(request.url, secondaryHost) : undefined;
+		            let secondaryHas404 = false;
+		            let attempt = 1;
+		            let retryAgain = true;
+		            let response;
+		            let error;
+		            while (retryAgain) {
+		                const isPrimaryRetry = secondaryHas404 ||
+		                    !secondaryUrl ||
+		                    !["GET", "HEAD", "OPTIONS"].includes(request.method) ||
+		                    attempt % 2 === 1;
+		                request.url = isPrimaryRetry ? primaryUrl : secondaryUrl;
+		                response = undefined;
+		                error = undefined;
+		                try {
+		                    log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
+		                    response = await next(request);
+		                    secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
+		                }
+		                catch (e) {
+		                    if ((0, core_rest_pipeline_1.isRestError)(e)) {
+		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${e.message}, code: ${e.code}`);
+		                        error = e;
+		                    }
+		                    else {
+		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${(0, core_util_1.getErrorMessage)(e)}`);
+		                        throw e;
+		                    }
+		                }
+		                retryAgain = shouldRetry({ isPrimaryRetry, attempt, response, error });
+		                if (retryAgain) {
+		                    await (0, utils_common_js_1.delay)(calculateDelay(isPrimaryRetry, attempt), request.abortSignal, RETRY_ABORT_ERROR);
+		                }
+		                attempt++;
+		            }
+		            if (response) {
+		                return response;
+		            }
+		            throw error ?? new core_rest_pipeline_1.RestError("RetryPolicy failed without known error.");
+		        },
+		    };
+		}
+		
+	} (StorageRetryPolicyV2$1));
+	return StorageRetryPolicyV2$1;
+}
+
+var StorageSharedKeyCredentialPolicyV2$1 = {};
+
+var hasRequiredStorageSharedKeyCredentialPolicyV2$1;
+
+function requireStorageSharedKeyCredentialPolicyV2$1 () {
+	if (hasRequiredStorageSharedKeyCredentialPolicyV2$1) return StorageSharedKeyCredentialPolicyV2$1;
+	hasRequiredStorageSharedKeyCredentialPolicyV2$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageSharedKeyCredentialPolicyName = void 0;
+		exports$1.storageSharedKeyCredentialPolicy = storageSharedKeyCredentialPolicy;
+		const node_crypto_1 = require$$0$d;
+		const constants_js_1 = requireConstants$7();
+		const utils_common_js_1 = requireUtils_common$1();
+		const SharedKeyComparator_js_1 = requireSharedKeyComparator();
+		/**
+		 * The programmatic identifier of the storageSharedKeyCredentialPolicy.
+		 */
+		exports$1.storageSharedKeyCredentialPolicyName = "storageSharedKeyCredentialPolicy";
+		/**
+		 * storageSharedKeyCredentialPolicy handles signing requests using storage account keys.
+		 */
+		function storageSharedKeyCredentialPolicy(options) {
+		    function signRequest(request) {
+		        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
+		        if (request.body &&
+		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
+		            request.body.length > 0) {
+		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
+		        }
+		        const stringToSign = [
+		            request.method.toUpperCase(),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
+		        ].join("\n") +
+		            "\n" +
+		            getCanonicalizedHeadersString(request) +
+		            getCanonicalizedResourceString(request);
+		        const signature = (0, node_crypto_1.createHmac)("sha256", options.accountKey)
+		            .update(stringToSign, "utf8")
+		            .digest("base64");
+		        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${options.accountName}:${signature}`);
+		        // console.log(`[URL]:${request.url}`);
+		        // console.log(`[HEADERS]:${request.headers.toString()}`);
+		        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
+		        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
+		    }
+		    /**
+		     * Retrieve header value according to shared key sign rules.
+		     * @see https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
+		     */
+		    function getHeaderValueToSign(request, headerName) {
+		        const value = request.headers.get(headerName);
+		        if (!value) {
+		            return "";
+		        }
+		        // When using version 2015-02-21 or later, if Content-Length is zero, then
+		        // set the Content-Length part of the StringToSign to an empty string.
+		        // https://learn.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key
+		        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
+		            return "";
+		        }
+		        return value;
+		    }
+		    /**
+		     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
+		     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
+		     * 2. Convert each HTTP header name to lowercase.
+		     * 3. Sort the headers lexicographically by header name, in ascending order.
+		     *    Each header may appear only once in the string.
+		     * 4. Replace any linear whitespace in the header value with a single space.
+		     * 5. Trim any whitespace around the colon in the header.
+		     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
+		     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
+		     *
+		     */
+		    function getCanonicalizedHeadersString(request) {
+		        let headersArray = [];
+		        for (const [name, value] of request.headers) {
+		            if (name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE)) {
+		                headersArray.push({ name, value });
+		            }
+		        }
+		        headersArray.sort((a, b) => {
+		            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
+		        });
+		        // Remove duplicate headers
+		        headersArray = headersArray.filter((value, index, array) => {
+		            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
+		                return false;
+		            }
+		            return true;
+		        });
+		        let canonicalizedHeadersStringToSign = "";
+		        headersArray.forEach((header) => {
+		            canonicalizedHeadersStringToSign += `${header.name
+		                .toLowerCase()
+		                .trimRight()}:${header.value.trimLeft()}\n`;
+		        });
+		        return canonicalizedHeadersStringToSign;
+		    }
+		    function getCanonicalizedResourceString(request) {
+		        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
+		        let canonicalizedResourceString = "";
+		        canonicalizedResourceString += `/${options.accountName}${path}`;
+		        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
+		        const lowercaseQueries = {};
+		        if (queries) {
+		            const queryKeys = [];
+		            for (const key in queries) {
+		                if (Object.prototype.hasOwnProperty.call(queries, key)) {
+		                    const lowercaseKey = key.toLowerCase();
+		                    lowercaseQueries[lowercaseKey] = queries[key];
+		                    queryKeys.push(lowercaseKey);
+		                }
+		            }
+		            queryKeys.sort();
+		            for (const key of queryKeys) {
+		                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
+		            }
+		        }
+		        return canonicalizedResourceString;
+		    }
+		    return {
+		        name: exports$1.storageSharedKeyCredentialPolicyName,
+		        async sendRequest(request, next) {
+		            signRequest(request);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (StorageSharedKeyCredentialPolicyV2$1));
+	return StorageSharedKeyCredentialPolicyV2$1;
+}
+
+var StorageRequestFailureDetailsParserPolicy = {};
+
+var hasRequiredStorageRequestFailureDetailsParserPolicy;
+
+function requireStorageRequestFailureDetailsParserPolicy () {
+	if (hasRequiredStorageRequestFailureDetailsParserPolicy) return StorageRequestFailureDetailsParserPolicy;
+	hasRequiredStorageRequestFailureDetailsParserPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageRequestFailureDetailsParserPolicyName = void 0;
+		exports$1.storageRequestFailureDetailsParserPolicy = storageRequestFailureDetailsParserPolicy;
+		/**
+		 * The programmatic identifier of the StorageRequestFailureDetailsParserPolicy.
+		 */
+		exports$1.storageRequestFailureDetailsParserPolicyName = "storageRequestFailureDetailsParserPolicy";
+		/**
+		 * StorageRequestFailureDetailsParserPolicy
+		 */
+		function storageRequestFailureDetailsParserPolicy() {
+		    return {
+		        name: exports$1.storageRequestFailureDetailsParserPolicyName,
+		        async sendRequest(request, next) {
+		            try {
+		                const response = await next(request);
+		                return response;
+		            }
+		            catch (err) {
+		                if (typeof err === "object" &&
+		                    err !== null &&
+		                    err.response &&
+		                    err.response.parsedBody) {
+		                    if (err.response.parsedBody.code === "InvalidHeaderValue" &&
+		                        err.response.parsedBody.HeaderName === "x-ms-version") {
+		                        err.message =
+		                            "The provided service version is not enabled on this storage account. Please see https://learn.microsoft.com/rest/api/storageservices/versioning-for-the-azure-storage-services for additional information.\n";
+		                    }
+		                }
+		                throw err;
+		            }
+		        },
+		    };
+		}
+		
+	} (StorageRequestFailureDetailsParserPolicy));
+	return StorageRequestFailureDetailsParserPolicy;
+}
+
+var hasRequiredCommonjs$2;
+
+function requireCommonjs$2 () {
+	if (hasRequiredCommonjs$2) return commonjs$2;
+	hasRequiredCommonjs$2 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.BaseRequestPolicy = exports$1.getCachedDefaultHttpClient = void 0;
+		const tslib_1 = require$$0$2;
+		tslib_1.__exportStar(requireBufferScheduler(), exports$1);
+		var cache_js_1 = requireCache$3();
+		Object.defineProperty(exports$1, "getCachedDefaultHttpClient", { enumerable: true, get: function () { return cache_js_1.getCachedDefaultHttpClient; } });
+		tslib_1.__exportStar(requireStorageBrowserPolicyFactory$1(), exports$1);
+		tslib_1.__exportStar(requireAnonymousCredential(), exports$1);
+		tslib_1.__exportStar(requireCredential(), exports$1);
+		tslib_1.__exportStar(requireStorageSharedKeyCredential(), exports$1);
+		tslib_1.__exportStar(requireStorageRetryPolicyFactory(), exports$1);
+		var RequestPolicy_js_1 = requireRequestPolicy();
+		Object.defineProperty(exports$1, "BaseRequestPolicy", { enumerable: true, get: function () { return RequestPolicy_js_1.BaseRequestPolicy; } });
+		tslib_1.__exportStar(requireAnonymousCredentialPolicy(), exports$1);
+		tslib_1.__exportStar(requireCredentialPolicy(), exports$1);
+		tslib_1.__exportStar(requireStorageBrowserPolicy$1(), exports$1);
+		tslib_1.__exportStar(requireStorageBrowserPolicyV2$1(), exports$1);
+		tslib_1.__exportStar(requireStorageCorrectContentLengthPolicy$1(), exports$1);
+		tslib_1.__exportStar(requireStorageRetryPolicyType(), exports$1);
+		tslib_1.__exportStar(requireStorageRetryPolicy(), exports$1);
+		tslib_1.__exportStar(requireStorageRetryPolicyV2$1(), exports$1);
+		tslib_1.__exportStar(requireStorageSharedKeyCredentialPolicy(), exports$1);
+		tslib_1.__exportStar(requireStorageSharedKeyCredentialPolicyV2$1(), exports$1);
+		tslib_1.__exportStar(requireStorageRetryPolicyFactory(), exports$1);
+		tslib_1.__exportStar(requireStorageRequestFailureDetailsParserPolicy(), exports$1);
+		
+	} (commonjs$2));
+	return commonjs$2;
+}
+
+var StorageBrowserPolicyV2 = {};
+
+var hasRequiredStorageBrowserPolicyV2;
+
+function requireStorageBrowserPolicyV2 () {
+	if (hasRequiredStorageBrowserPolicyV2) return StorageBrowserPolicyV2;
+	hasRequiredStorageBrowserPolicyV2 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageBrowserPolicyName = void 0;
+		exports$1.storageBrowserPolicy = storageBrowserPolicy;
+		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+		const constants_js_1 = requireConstants$8();
+		const utils_common_js_1 = requireUtils_common$2();
+		/**
+		 * The programmatic identifier of the StorageBrowserPolicy.
+		 */
+		exports$1.storageBrowserPolicyName = "storageBrowserPolicy";
+		/**
+		 * storageBrowserPolicy is a policy used to prevent browsers from caching requests
+		 * and to remove cookies and explicit content-length headers.
+		 */
+		function storageBrowserPolicy() {
+		    return {
+		        name: exports$1.storageBrowserPolicyName,
+		        async sendRequest(request, next) {
+		            if (core_util_1.isNodeLike) {
+		                return next(request);
+		            }
+		            if (request.method === "GET" || request.method === "HEAD") {
+		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
+		            }
+		            request.headers.delete(constants_js_1.HeaderConstants.COOKIE);
+		            // According to XHR standards, content-length should be fully controlled by browsers
+		            request.headers.delete(constants_js_1.HeaderConstants.CONTENT_LENGTH);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (StorageBrowserPolicyV2));
+	return StorageBrowserPolicyV2;
+}
+
+var StorageRetryPolicyV2 = {};
+
+var hasRequiredStorageRetryPolicyV2;
+
+function requireStorageRetryPolicyV2 () {
+	if (hasRequiredStorageRetryPolicyV2) return StorageRetryPolicyV2;
+	hasRequiredStorageRetryPolicyV2 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageRetryPolicyName = void 0;
+		exports$1.storageRetryPolicy = storageRetryPolicy;
+		const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
+		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+		const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+		const StorageRetryPolicyFactory_js_1 = requireStorageRetryPolicyFactory$1();
+		const constants_js_1 = requireConstants$8();
+		const utils_common_js_1 = requireUtils_common$2();
+		const log_js_1 = requireLog$1();
+		/**
+		 * Name of the {@link storageRetryPolicy}
+		 */
+		exports$1.storageRetryPolicyName = "storageRetryPolicy";
+		// Default values of StorageRetryOptions
+		const DEFAULT_RETRY_OPTIONS = {
+		    maxRetryDelayInMs: 120 * 1000,
+		    maxTries: 4,
+		    retryDelayInMs: 4 * 1000,
+		    retryPolicyType: StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL,
+		    secondaryHost: "",
+		    tryTimeoutInMs: undefined, // Use server side default timeout strategy
+		};
+		const retriableErrors = [
+		    "ETIMEDOUT",
+		    "ESOCKETTIMEDOUT",
+		    "ECONNREFUSED",
+		    "ECONNRESET",
+		    "ENOENT",
+		    "ENOTFOUND",
+		    "TIMEOUT",
+		    "EPIPE",
+		    "REQUEST_SEND_ERROR",
+		];
+		const RETRY_ABORT_ERROR = new abort_controller_1.AbortError("The operation was aborted.");
+		/**
+		 * Retry policy with exponential retry and linear retry implemented.
+		 */
+		function storageRetryPolicy(options = {}) {
+		    const retryPolicyType = options.retryPolicyType ?? DEFAULT_RETRY_OPTIONS.retryPolicyType;
+		    const maxTries = options.maxTries ?? DEFAULT_RETRY_OPTIONS.maxTries;
+		    const retryDelayInMs = options.retryDelayInMs ?? DEFAULT_RETRY_OPTIONS.retryDelayInMs;
+		    const maxRetryDelayInMs = options.maxRetryDelayInMs ?? DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs;
+		    const secondaryHost = options.secondaryHost ?? DEFAULT_RETRY_OPTIONS.secondaryHost;
+		    const tryTimeoutInMs = options.tryTimeoutInMs ?? DEFAULT_RETRY_OPTIONS.tryTimeoutInMs;
+		    function shouldRetry({ isPrimaryRetry, attempt, response, error, }) {
+		        if (attempt >= maxTries) {
+		            log_js_1.logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${maxTries}, no further try.`);
+		            return false;
+		        }
+		        if (error) {
+		            for (const retriableError of retriableErrors) {
+		                if (error.name.toUpperCase().includes(retriableError) ||
+		                    error.message.toUpperCase().includes(retriableError) ||
+		                    (error.code && error.code.toString().toUpperCase() === retriableError)) {
+		                    log_js_1.logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
+		                    return true;
+		                }
+		            }
+		            if (error?.code === "PARSE_ERROR" &&
+		                error?.message.startsWith(`Error "Error: Unclosed root tag`)) {
+		                log_js_1.logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
+		                return true;
+		            }
+		        }
+		        // If attempt was against the secondary & it returned a StatusNotFound (404), then
+		        // the resource was not found. This may be due to replication delay. So, in this
+		        // case, we'll never try the secondary again for this operation.
+		        if (response || error) {
+		            const statusCode = response?.status ?? error?.statusCode ?? 0;
+		            if (!isPrimaryRetry && statusCode === 404) {
+		                log_js_1.logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
+		                return true;
+		            }
+		            // Server internal error or server timeout
+		            if (statusCode === 503 || statusCode === 500) {
+		                log_js_1.logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
+		                return true;
+		            }
+		        }
+		        if (response) {
+		            // Retry select Copy Source Error Codes.
+		            if (response?.status >= 400) {
+		                const copySourceError = response.headers.get(constants_js_1.HeaderConstants.X_MS_CopySourceErrorCode);
+		                if (copySourceError !== undefined) {
+		                    switch (copySourceError) {
+		                        case "InternalError":
+		                        case "OperationTimedOut":
+		                        case "ServerBusy":
+		                            return true;
+		                    }
+		                }
+		            }
+		        }
+		        return false;
+		    }
+		    function calculateDelay(isPrimaryRetry, attempt) {
+		        let delayTimeInMs = 0;
+		        if (isPrimaryRetry) {
+		            switch (retryPolicyType) {
+		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.EXPONENTIAL:
+		                    delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * retryDelayInMs, maxRetryDelayInMs);
+		                    break;
+		                case StorageRetryPolicyFactory_js_1.StorageRetryPolicyType.FIXED:
+		                    delayTimeInMs = retryDelayInMs;
+		                    break;
+		            }
+		        }
+		        else {
+		            delayTimeInMs = Math.random() * 1000;
+		        }
+		        log_js_1.logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
+		        return delayTimeInMs;
+		    }
+		    return {
+		        name: exports$1.storageRetryPolicyName,
+		        async sendRequest(request, next) {
+		            // Set the server-side timeout query parameter "timeout=[seconds]"
+		            if (tryTimeoutInMs) {
+		                request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.TIMEOUT, String(Math.floor(tryTimeoutInMs / 1000)));
+		            }
+		            const primaryUrl = request.url;
+		            const secondaryUrl = secondaryHost ? (0, utils_common_js_1.setURLHost)(request.url, secondaryHost) : undefined;
+		            let secondaryHas404 = false;
+		            let attempt = 1;
+		            let retryAgain = true;
+		            let response;
+		            let error;
+		            while (retryAgain) {
+		                const isPrimaryRetry = secondaryHas404 ||
+		                    !secondaryUrl ||
+		                    !["GET", "HEAD", "OPTIONS"].includes(request.method) ||
+		                    attempt % 2 === 1;
+		                request.url = isPrimaryRetry ? primaryUrl : secondaryUrl;
+		                response = undefined;
+		                error = undefined;
+		                try {
+		                    log_js_1.logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
+		                    response = await next(request);
+		                    secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
+		                }
+		                catch (e) {
+		                    if ((0, core_rest_pipeline_1.isRestError)(e)) {
+		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${e.message}, code: ${e.code}`);
+		                        error = e;
+		                    }
+		                    else {
+		                        log_js_1.logger.error(`RetryPolicy: Caught error, message: ${(0, core_util_1.getErrorMessage)(e)}`);
+		                        throw e;
+		                    }
+		                }
+		                retryAgain = shouldRetry({ isPrimaryRetry, attempt, response, error });
+		                if (retryAgain) {
+		                    await (0, utils_common_js_1.delay)(calculateDelay(isPrimaryRetry, attempt), request.abortSignal, RETRY_ABORT_ERROR);
+		                }
+		                attempt++;
+		            }
+		            if (response) {
+		                return response;
+		            }
+		            throw error ?? new core_rest_pipeline_1.RestError("RetryPolicy failed without known error.");
+		        },
+		    };
+		}
+		
+	} (StorageRetryPolicyV2));
+	return StorageRetryPolicyV2;
+}
+
+var StorageSharedKeyCredentialPolicyV2 = {};
+
+var hasRequiredStorageSharedKeyCredentialPolicyV2;
+
+function requireStorageSharedKeyCredentialPolicyV2 () {
+	if (hasRequiredStorageSharedKeyCredentialPolicyV2) return StorageSharedKeyCredentialPolicyV2;
+	hasRequiredStorageSharedKeyCredentialPolicyV2 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageSharedKeyCredentialPolicyName = void 0;
+		exports$1.storageSharedKeyCredentialPolicy = storageSharedKeyCredentialPolicy;
+		const node_crypto_1 = require$$0$d;
+		const constants_js_1 = requireConstants$8();
+		const utils_common_js_1 = requireUtils_common$2();
+		const SharedKeyComparator_js_1 = requireSharedKeyComparator$1();
+		/**
+		 * The programmatic identifier of the storageSharedKeyCredentialPolicy.
+		 */
+		exports$1.storageSharedKeyCredentialPolicyName = "storageSharedKeyCredentialPolicy";
+		/**
+		 * storageSharedKeyCredentialPolicy handles signing requests using storage account keys.
+		 */
+		function storageSharedKeyCredentialPolicy(options) {
+		    function signRequest(request) {
+		        request.headers.set(constants_js_1.HeaderConstants.X_MS_DATE, new Date().toUTCString());
+		        if (request.body &&
+		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
+		            request.body.length > 0) {
+		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
+		        }
+		        const stringToSign = [
+		            request.method.toUpperCase(),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LANGUAGE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_ENCODING),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_LENGTH),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_MD5),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.CONTENT_TYPE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.DATE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MODIFIED_SINCE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_MATCH),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_NONE_MATCH),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.IF_UNMODIFIED_SINCE),
+		            getHeaderValueToSign(request, constants_js_1.HeaderConstants.RANGE),
+		        ].join("\n") +
+		            "\n" +
+		            getCanonicalizedHeadersString(request) +
+		            getCanonicalizedResourceString(request);
+		        const signature = (0, node_crypto_1.createHmac)("sha256", options.accountKey)
+		            .update(stringToSign, "utf8")
+		            .digest("base64");
+		        request.headers.set(constants_js_1.HeaderConstants.AUTHORIZATION, `SharedKey ${options.accountName}:${signature}`);
+		        // console.log(`[URL]:${request.url}`);
+		        // console.log(`[HEADERS]:${request.headers.toString()}`);
+		        // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
+		        // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
+		    }
+		    /**
+		     * Retrieve header value according to shared key sign rules.
+		     * @see https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
+		     */
+		    function getHeaderValueToSign(request, headerName) {
+		        const value = request.headers.get(headerName);
+		        if (!value) {
+		            return "";
+		        }
+		        // When using version 2015-02-21 or later, if Content-Length is zero, then
+		        // set the Content-Length part of the StringToSign to an empty string.
+		        // https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
+		        if (headerName === constants_js_1.HeaderConstants.CONTENT_LENGTH && value === "0") {
+		            return "";
+		        }
+		        return value;
+		    }
+		    /**
+		     * To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
+		     * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
+		     * 2. Convert each HTTP header name to lowercase.
+		     * 3. Sort the headers lexicographically by header name, in ascending order.
+		     *    Each header may appear only once in the string.
+		     * 4. Replace any linear whitespace in the header value with a single space.
+		     * 5. Trim any whitespace around the colon in the header.
+		     * 6. Finally, append a new-line character to each canonicalized header in the resulting list.
+		     *    Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
+		     *
+		     */
+		    function getCanonicalizedHeadersString(request) {
+		        let headersArray = [];
+		        for (const [name, value] of request.headers) {
+		            if (name.toLowerCase().startsWith(constants_js_1.HeaderConstants.PREFIX_FOR_STORAGE)) {
+		                headersArray.push({ name, value });
+		            }
+		        }
+		        headersArray.sort((a, b) => {
+		            return (0, SharedKeyComparator_js_1.compareHeader)(a.name.toLowerCase(), b.name.toLowerCase());
+		        });
+		        // Remove duplicate headers
+		        headersArray = headersArray.filter((value, index, array) => {
+		            if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
+		                return false;
+		            }
+		            return true;
+		        });
+		        let canonicalizedHeadersStringToSign = "";
+		        headersArray.forEach((header) => {
+		            canonicalizedHeadersStringToSign += `${header.name
+		                .toLowerCase()
+		                .trimRight()}:${header.value.trimLeft()}\n`;
+		        });
+		        return canonicalizedHeadersStringToSign;
+		    }
+		    function getCanonicalizedResourceString(request) {
+		        const path = (0, utils_common_js_1.getURLPath)(request.url) || "/";
+		        let canonicalizedResourceString = "";
+		        canonicalizedResourceString += `/${options.accountName}${path}`;
+		        const queries = (0, utils_common_js_1.getURLQueries)(request.url);
+		        const lowercaseQueries = {};
+		        if (queries) {
+		            const queryKeys = [];
+		            for (const key in queries) {
+		                if (Object.prototype.hasOwnProperty.call(queries, key)) {
+		                    const lowercaseKey = key.toLowerCase();
+		                    lowercaseQueries[lowercaseKey] = queries[key];
+		                    queryKeys.push(lowercaseKey);
+		                }
+		            }
+		            queryKeys.sort();
+		            for (const key of queryKeys) {
+		                canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
+		            }
+		        }
+		        return canonicalizedResourceString;
+		    }
+		    return {
+		        name: exports$1.storageSharedKeyCredentialPolicyName,
+		        async sendRequest(request, next) {
+		            signRequest(request);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (StorageSharedKeyCredentialPolicyV2));
+	return StorageSharedKeyCredentialPolicyV2;
+}
+
+var StorageBrowserPolicyFactory = {};
+
+var StorageBrowserPolicy = {};
+
+var hasRequiredStorageBrowserPolicy;
+
+function requireStorageBrowserPolicy () {
+	if (hasRequiredStorageBrowserPolicy) return StorageBrowserPolicy;
+	hasRequiredStorageBrowserPolicy = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageBrowserPolicy, "__esModule", { value: true });
+	StorageBrowserPolicy.StorageBrowserPolicy = void 0;
+	const RequestPolicy_js_1 = requireRequestPolicy$1();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const constants_js_1 = requireConstants$8();
+	const utils_common_js_1 = requireUtils_common$2();
+	/**
+	 * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:
+	 *
+	 * 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.
+	 * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL
+	 * thus avoid the browser cache.
+	 *
+	 * 2. Remove cookie header for security
+	 *
+	 * 3. Remove content-length header to avoid browsers warning
+	 */
+	let StorageBrowserPolicy$1 = class StorageBrowserPolicy extends RequestPolicy_js_1.BaseRequestPolicy {
+	    /**
+	     * Creates an instance of StorageBrowserPolicy.
+	     * @param nextPolicy -
+	     * @param options -
+	     */
+	    // The base class has a protected constructor. Adding a public one to enable constructing of this class.
+	    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
+	    constructor(nextPolicy, options) {
+	        super(nextPolicy, options);
+	    }
+	    /**
+	     * Sends out request.
+	     *
+	     * @param request -
+	     */
+	    async sendRequest(request) {
+	        if (core_util_1.isNodeLike) {
+	            return this._nextPolicy.sendRequest(request);
+	        }
+	        if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {
+	            request.url = (0, utils_common_js_1.setURLParameter)(request.url, constants_js_1.URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
+	        }
+	        request.headers.remove(constants_js_1.HeaderConstants.COOKIE);
+	        // According to XHR standards, content-length should be fully controlled by browsers
+	        request.headers.remove(constants_js_1.HeaderConstants.CONTENT_LENGTH);
+	        return this._nextPolicy.sendRequest(request);
+	    }
+	};
+	StorageBrowserPolicy.StorageBrowserPolicy = StorageBrowserPolicy$1;
+	
+	return StorageBrowserPolicy;
+}
+
+var hasRequiredStorageBrowserPolicyFactory;
+
+function requireStorageBrowserPolicyFactory () {
+	if (hasRequiredStorageBrowserPolicyFactory) return StorageBrowserPolicyFactory;
+	hasRequiredStorageBrowserPolicyFactory = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.StorageBrowserPolicyFactory = exports$1.StorageBrowserPolicy = void 0;
+		const StorageBrowserPolicy_js_1 = requireStorageBrowserPolicy();
+		Object.defineProperty(exports$1, "StorageBrowserPolicy", { enumerable: true, get: function () { return StorageBrowserPolicy_js_1.StorageBrowserPolicy; } });
+		/**
+		 * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.
+		 */
+		class StorageBrowserPolicyFactory {
+		    /**
+		     * Creates a StorageBrowserPolicyFactory object.
+		     *
+		     * @param nextPolicy -
+		     * @param options -
+		     */
+		    create(nextPolicy, options) {
+		        return new StorageBrowserPolicy_js_1.StorageBrowserPolicy(nextPolicy, options);
+		    }
+		}
+		exports$1.StorageBrowserPolicyFactory = StorageBrowserPolicyFactory;
+		
+	} (StorageBrowserPolicyFactory));
+	return StorageBrowserPolicyFactory;
+}
+
+var StorageCorrectContentLengthPolicy = {};
+
+var hasRequiredStorageCorrectContentLengthPolicy;
+
+function requireStorageCorrectContentLengthPolicy () {
+	if (hasRequiredStorageCorrectContentLengthPolicy) return StorageCorrectContentLengthPolicy;
+	hasRequiredStorageCorrectContentLengthPolicy = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.storageCorrectContentLengthPolicyName = void 0;
+		exports$1.storageCorrectContentLengthPolicy = storageCorrectContentLengthPolicy;
+		const constants_js_1 = requireConstants$8();
+		/**
+		 * The programmatic identifier of the storageCorrectContentLengthPolicy.
+		 */
+		exports$1.storageCorrectContentLengthPolicyName = "StorageCorrectContentLengthPolicy";
+		/**
+		 * storageCorrectContentLengthPolicy to correctly set Content-Length header with request body length.
+		 */
+		function storageCorrectContentLengthPolicy() {
+		    function correctContentLength(request) {
+		        if (request.body &&
+		            (typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
+		            request.body.length > 0) {
+		            request.headers.set(constants_js_1.HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
+		        }
+		    }
+		    return {
+		        name: exports$1.storageCorrectContentLengthPolicyName,
+		        async sendRequest(request, next) {
+		            correctContentLength(request);
+		            return next(request);
+		        },
+		    };
+		}
+		
+	} (StorageCorrectContentLengthPolicy));
+	return StorageCorrectContentLengthPolicy;
+}
+
+var hasRequiredPipeline;
+
+function requirePipeline () {
+	if (hasRequiredPipeline) return Pipeline;
+	hasRequiredPipeline = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.Pipeline = exports$1.StorageOAuthScopes = void 0;
+		exports$1.isPipelineLike = isPipelineLike;
+		exports$1.newPipeline = newPipeline;
+		exports$1.getCoreClientOptions = getCoreClientOptions;
+		exports$1.getCredentialFromPipeline = getCredentialFromPipeline;
+		const core_http_compat_1 = /*@__PURE__*/ requireCommonjs$6();
+		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+		const core_client_1 = /*@__PURE__*/ requireCommonjs$7();
+		const core_xml_1 = /*@__PURE__*/ requireCommonjs$5();
+		const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
+		const log_js_1 = requireLog$1();
+		const StorageRetryPolicyFactory_js_1 = requireStorageRetryPolicyFactory$1();
+		const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
+		const AnonymousCredential_js_1 = requireAnonymousCredential$1();
+		const constants_js_1 = requireConstants$8();
+		Object.defineProperty(exports$1, "StorageOAuthScopes", { enumerable: true, get: function () { return constants_js_1.StorageOAuthScopes; } });
+		const storage_common_1 = /*@__PURE__*/ requireCommonjs$2();
+		const StorageBrowserPolicyV2_js_1 = requireStorageBrowserPolicyV2();
+		const StorageRetryPolicyV2_js_1 = requireStorageRetryPolicyV2();
+		const StorageSharedKeyCredentialPolicyV2_js_1 = requireStorageSharedKeyCredentialPolicyV2();
+		const StorageBrowserPolicyFactory_js_1 = requireStorageBrowserPolicyFactory();
+		const StorageCorrectContentLengthPolicy_js_1 = requireStorageCorrectContentLengthPolicy();
+		/**
+		 * A helper to decide if a given argument satisfies the Pipeline contract
+		 * @param pipeline - An argument that may be a Pipeline
+		 * @returns true when the argument satisfies the Pipeline contract
+		 */
+		function isPipelineLike(pipeline) {
+		    if (!pipeline || typeof pipeline !== "object") {
+		        return false;
+		    }
+		    const castPipeline = pipeline;
+		    return (Array.isArray(castPipeline.factories) &&
+		        typeof castPipeline.options === "object" &&
+		        typeof castPipeline.toServiceClientOptions === "function");
+		}
+		/**
+		 * A Pipeline class containing HTTP request policies.
+		 * You can create a default Pipeline by calling {@link newPipeline}.
+		 * Or you can create a Pipeline with your own policies by the constructor of Pipeline.
+		 *
+		 * Refer to {@link newPipeline} and provided policies before implementing your
+		 * customized Pipeline.
+		 */
+		class Pipeline {
+		    /**
+		     * A list of chained request policy factories.
+		     */
+		    factories;
+		    /**
+		     * Configures pipeline logger and HTTP client.
+		     */
+		    options;
+		    /**
+		     * Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface.
+		     *
+		     * @param factories -
+		     * @param options -
+		     */
+		    constructor(factories, options = {}) {
+		        this.factories = factories;
+		        this.options = options;
+		    }
+		    /**
+		     * Transfer Pipeline object to ServiceClientOptions object which is required by
+		     * ServiceClient constructor.
+		     *
+		     * @returns The ServiceClientOptions object from this Pipeline.
+		     */
+		    toServiceClientOptions() {
+		        return {
+		            httpClient: this.options.httpClient,
+		            requestPolicyFactories: this.factories,
+		        };
+		    }
+		}
+		exports$1.Pipeline = Pipeline;
+		/**
+		 * Creates a new Pipeline object with Credential provided.
+		 *
+		 * @param credential -  Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
+		 * @param pipelineOptions - Optional. Options.
+		 * @returns A new Pipeline object.
+		 */
+		function newPipeline(credential, pipelineOptions = {}) {
+		    if (!credential) {
+		        credential = new AnonymousCredential_js_1.AnonymousCredential();
+		    }
+		    const pipeline = new Pipeline([], pipelineOptions);
+		    pipeline._credential = credential;
+		    return pipeline;
+		}
+		function processDownlevelPipeline(pipeline) {
+		    const knownFactoryFunctions = [
+		        isAnonymousCredential,
+		        isStorageSharedKeyCredential,
+		        isCoreHttpBearerTokenFactory,
+		        isStorageBrowserPolicyFactory,
+		        isStorageRetryPolicyFactory,
+		        isStorageTelemetryPolicyFactory,
+		        isCoreHttpPolicyFactory,
+		    ];
+		    if (pipeline.factories.length) {
+		        const novelFactories = pipeline.factories.filter((factory) => {
+		            return !knownFactoryFunctions.some((knownFactory) => knownFactory(factory));
+		        });
+		        if (novelFactories.length) {
+		            const hasInjector = novelFactories.some((factory) => isInjectorPolicyFactory(factory));
+		            // if there are any left over, wrap in a requestPolicyFactoryPolicy
+		            return {
+		                wrappedPolicies: (0, core_http_compat_1.createRequestPolicyFactoryPolicy)(novelFactories),
+		                afterRetry: hasInjector,
+		            };
+		        }
+		    }
+		    return undefined;
+		}
+		function getCoreClientOptions(pipeline) {
+		    const { httpClient: v1Client, ...restOptions } = pipeline.options;
+		    let httpClient = pipeline._coreHttpClient;
+		    if (!httpClient) {
+		        httpClient = v1Client ? (0, core_http_compat_1.convertHttpClient)(v1Client) : (0, storage_common_1.getCachedDefaultHttpClient)();
+		        pipeline._coreHttpClient = httpClient;
+		    }
+		    let corePipeline = pipeline._corePipeline;
+		    if (!corePipeline) {
+		        const packageDetails = `azsdk-js-azure-storage-blob/${constants_js_1.SDK_VERSION}`;
+		        const userAgentPrefix = restOptions.userAgentOptions && restOptions.userAgentOptions.userAgentPrefix
+		            ? `${restOptions.userAgentOptions.userAgentPrefix} ${packageDetails}`
+		            : `${packageDetails}`;
+		        corePipeline = (0, core_client_1.createClientPipeline)({
+		            ...restOptions,
+		            loggingOptions: {
+		                additionalAllowedHeaderNames: constants_js_1.StorageBlobLoggingAllowedHeaderNames,
+		                additionalAllowedQueryParameters: constants_js_1.StorageBlobLoggingAllowedQueryParameters,
+		                logger: log_js_1.logger.info,
+		            },
+		            userAgentOptions: {
+		                userAgentPrefix,
+		            },
+		            serializationOptions: {
+		                stringifyXML: core_xml_1.stringifyXML,
+		                serializerOptions: {
+		                    xml: {
+		                        // Use customized XML char key of "#" so we can deserialize metadata
+		                        // with "_" key
+		                        xmlCharKey: "#",
+		                    },
+		                },
+		            },
+		            deserializationOptions: {
+		                parseXML: core_xml_1.parseXML,
+		                serializerOptions: {
+		                    xml: {
+		                        // Use customized XML char key of "#" so we can deserialize metadata
+		                        // with "_" key
+		                        xmlCharKey: "#",
+		                    },
+		                },
+		            },
+		        });
+		        corePipeline.removePolicy({ phase: "Retry" });
+		        corePipeline.removePolicy({ name: core_rest_pipeline_1.decompressResponsePolicyName });
+		        corePipeline.addPolicy((0, StorageCorrectContentLengthPolicy_js_1.storageCorrectContentLengthPolicy)());
+		        corePipeline.addPolicy((0, StorageRetryPolicyV2_js_1.storageRetryPolicy)(restOptions.retryOptions), { phase: "Retry" });
+		        corePipeline.addPolicy((0, storage_common_1.storageRequestFailureDetailsParserPolicy)());
+		        corePipeline.addPolicy((0, StorageBrowserPolicyV2_js_1.storageBrowserPolicy)());
+		        const downlevelResults = processDownlevelPipeline(pipeline);
+		        if (downlevelResults) {
+		            corePipeline.addPolicy(downlevelResults.wrappedPolicies, downlevelResults.afterRetry ? { afterPhase: "Retry" } : undefined);
+		        }
+		        const credential = getCredentialFromPipeline(pipeline);
+		        if ((0, core_auth_1.isTokenCredential)(credential)) {
+		            corePipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({
+		                credential,
+		                scopes: restOptions.audience ?? constants_js_1.StorageOAuthScopes,
+		                challengeCallbacks: { authorizeRequestOnChallenge: core_client_1.authorizeRequestOnTenantChallenge },
+		            }), { phase: "Sign" });
+		        }
+		        else if (credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) {
+		            corePipeline.addPolicy((0, StorageSharedKeyCredentialPolicyV2_js_1.storageSharedKeyCredentialPolicy)({
+		                accountName: credential.accountName,
+		                accountKey: credential.accountKey,
+		            }), { phase: "Sign" });
+		        }
+		        pipeline._corePipeline = corePipeline;
+		    }
+		    return {
+		        ...restOptions,
+		        allowInsecureConnection: true,
+		        httpClient,
+		        pipeline: corePipeline,
+		    };
+		}
+		function getCredentialFromPipeline(pipeline) {
+		    // see if we squirreled one away on the type itself
+		    if (pipeline._credential) {
+		        return pipeline._credential;
+		    }
+		    // if it came from another package, loop over the factories and look for one like before
+		    let credential = new AnonymousCredential_js_1.AnonymousCredential();
+		    for (const factory of pipeline.factories) {
+		        if ((0, core_auth_1.isTokenCredential)(factory.credential)) {
+		            // Only works if the factory has been attached a "credential" property.
+		            // We do that in newPipeline() when using TokenCredential.
+		            credential = factory.credential;
+		        }
+		        else if (isStorageSharedKeyCredential(factory)) {
+		            return factory;
+		        }
+		    }
+		    return credential;
+		}
+		function isStorageSharedKeyCredential(factory) {
+		    if (factory instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) {
+		        return true;
+		    }
+		    return factory.constructor.name === "StorageSharedKeyCredential";
+		}
+		function isAnonymousCredential(factory) {
+		    if (factory instanceof AnonymousCredential_js_1.AnonymousCredential) {
+		        return true;
+		    }
+		    return factory.constructor.name === "AnonymousCredential";
+		}
+		function isCoreHttpBearerTokenFactory(factory) {
+		    return (0, core_auth_1.isTokenCredential)(factory.credential);
+		}
+		function isStorageBrowserPolicyFactory(factory) {
+		    if (factory instanceof StorageBrowserPolicyFactory_js_1.StorageBrowserPolicyFactory) {
+		        return true;
+		    }
+		    return factory.constructor.name === "StorageBrowserPolicyFactory";
+		}
+		function isStorageRetryPolicyFactory(factory) {
+		    if (factory instanceof StorageRetryPolicyFactory_js_1.StorageRetryPolicyFactory) {
+		        return true;
+		    }
+		    return factory.constructor.name === "StorageRetryPolicyFactory";
+		}
+		function isStorageTelemetryPolicyFactory(factory) {
+		    return factory.constructor.name === "TelemetryPolicyFactory";
+		}
+		function isInjectorPolicyFactory(factory) {
+		    return factory.constructor.name === "InjectorPolicyFactory";
+		}
+		function isCoreHttpPolicyFactory(factory) {
+		    const knownPolicies = [
+		        "GenerateClientRequestIdPolicy",
+		        "TracingPolicy",
+		        "LogPolicy",
+		        "ProxyPolicy",
+		        "DisableResponseDecompressionPolicy",
+		        "KeepAlivePolicy",
+		        "DeserializationPolicy",
+		    ];
+		    const mockHttpClient = {
+		        sendRequest: async (request) => {
+		            return {
+		                request,
+		                headers: request.headers.clone(),
+		                status: 500,
+		            };
+		        },
+		    };
+		    const mockRequestPolicyOptions = {
+		        log(_logLevel, _message) {
+		            /* do nothing */
+		        },
+		        shouldLog(_logLevel) {
+		            return false;
+		        },
+		    };
+		    const policyInstance = factory.create(mockHttpClient, mockRequestPolicyOptions);
+		    const policyName = policyInstance.constructor.name;
+		    // bundlers sometimes add a custom suffix to the class name to make it unique
+		    return knownPolicies.some((knownPolicyName) => {
+		        return policyName.startsWith(knownPolicyName);
+		    });
+		}
+		
+	} (Pipeline));
+	return Pipeline;
+}
+
+var ContainerClient = {};
+
+var StorageClient = {};
+
+var StorageContextClient = {};
+
+var src$1 = {};
+
+var models$1 = {};
+
+var hasRequiredModels$1;
+
+function requireModels$1 () {
+	if (hasRequiredModels$1) return models$1;
+	hasRequiredModels$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(models$1, "__esModule", { value: true });
+	models$1.KnownStorageErrorCode = models$1.KnownBlobExpiryOptions = models$1.KnownFileShareTokenIntent = models$1.KnownEncryptionAlgorithmType = void 0;
+	/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */
+	var KnownEncryptionAlgorithmType;
+	(function (KnownEncryptionAlgorithmType) {
+	    /** AES256 */
+	    KnownEncryptionAlgorithmType["AES256"] = "AES256";
+	})(KnownEncryptionAlgorithmType || (models$1.KnownEncryptionAlgorithmType = KnownEncryptionAlgorithmType = {}));
+	/** Known values of {@link FileShareTokenIntent} that the service accepts. */
+	var KnownFileShareTokenIntent;
+	(function (KnownFileShareTokenIntent) {
+	    /** Backup */
+	    KnownFileShareTokenIntent["Backup"] = "backup";
+	})(KnownFileShareTokenIntent || (models$1.KnownFileShareTokenIntent = KnownFileShareTokenIntent = {}));
+	/** Known values of {@link BlobExpiryOptions} that the service accepts. */
+	var KnownBlobExpiryOptions;
+	(function (KnownBlobExpiryOptions) {
+	    /** NeverExpire */
+	    KnownBlobExpiryOptions["NeverExpire"] = "NeverExpire";
+	    /** RelativeToCreation */
+	    KnownBlobExpiryOptions["RelativeToCreation"] = "RelativeToCreation";
+	    /** RelativeToNow */
+	    KnownBlobExpiryOptions["RelativeToNow"] = "RelativeToNow";
+	    /** Absolute */
+	    KnownBlobExpiryOptions["Absolute"] = "Absolute";
+	})(KnownBlobExpiryOptions || (models$1.KnownBlobExpiryOptions = KnownBlobExpiryOptions = {}));
+	/** Known values of {@link StorageErrorCode} that the service accepts. */
+	var KnownStorageErrorCode;
+	(function (KnownStorageErrorCode) {
+	    /** AccountAlreadyExists */
+	    KnownStorageErrorCode["AccountAlreadyExists"] = "AccountAlreadyExists";
+	    /** AccountBeingCreated */
+	    KnownStorageErrorCode["AccountBeingCreated"] = "AccountBeingCreated";
+	    /** AccountIsDisabled */
+	    KnownStorageErrorCode["AccountIsDisabled"] = "AccountIsDisabled";
+	    /** AuthenticationFailed */
+	    KnownStorageErrorCode["AuthenticationFailed"] = "AuthenticationFailed";
+	    /** AuthorizationFailure */
+	    KnownStorageErrorCode["AuthorizationFailure"] = "AuthorizationFailure";
+	    /** ConditionHeadersNotSupported */
+	    KnownStorageErrorCode["ConditionHeadersNotSupported"] = "ConditionHeadersNotSupported";
+	    /** ConditionNotMet */
+	    KnownStorageErrorCode["ConditionNotMet"] = "ConditionNotMet";
+	    /** EmptyMetadataKey */
+	    KnownStorageErrorCode["EmptyMetadataKey"] = "EmptyMetadataKey";
+	    /** InsufficientAccountPermissions */
+	    KnownStorageErrorCode["InsufficientAccountPermissions"] = "InsufficientAccountPermissions";
+	    /** InternalError */
+	    KnownStorageErrorCode["InternalError"] = "InternalError";
+	    /** InvalidAuthenticationInfo */
+	    KnownStorageErrorCode["InvalidAuthenticationInfo"] = "InvalidAuthenticationInfo";
+	    /** InvalidHeaderValue */
+	    KnownStorageErrorCode["InvalidHeaderValue"] = "InvalidHeaderValue";
+	    /** InvalidHttpVerb */
+	    KnownStorageErrorCode["InvalidHttpVerb"] = "InvalidHttpVerb";
+	    /** InvalidInput */
+	    KnownStorageErrorCode["InvalidInput"] = "InvalidInput";
+	    /** InvalidMd5 */
+	    KnownStorageErrorCode["InvalidMd5"] = "InvalidMd5";
+	    /** InvalidMetadata */
+	    KnownStorageErrorCode["InvalidMetadata"] = "InvalidMetadata";
+	    /** InvalidQueryParameterValue */
+	    KnownStorageErrorCode["InvalidQueryParameterValue"] = "InvalidQueryParameterValue";
+	    /** InvalidRange */
+	    KnownStorageErrorCode["InvalidRange"] = "InvalidRange";
+	    /** InvalidResourceName */
+	    KnownStorageErrorCode["InvalidResourceName"] = "InvalidResourceName";
+	    /** InvalidUri */
+	    KnownStorageErrorCode["InvalidUri"] = "InvalidUri";
+	    /** InvalidXmlDocument */
+	    KnownStorageErrorCode["InvalidXmlDocument"] = "InvalidXmlDocument";
+	    /** InvalidXmlNodeValue */
+	    KnownStorageErrorCode["InvalidXmlNodeValue"] = "InvalidXmlNodeValue";
+	    /** Md5Mismatch */
+	    KnownStorageErrorCode["Md5Mismatch"] = "Md5Mismatch";
+	    /** MetadataTooLarge */
+	    KnownStorageErrorCode["MetadataTooLarge"] = "MetadataTooLarge";
+	    /** MissingContentLengthHeader */
+	    KnownStorageErrorCode["MissingContentLengthHeader"] = "MissingContentLengthHeader";
+	    /** MissingRequiredQueryParameter */
+	    KnownStorageErrorCode["MissingRequiredQueryParameter"] = "MissingRequiredQueryParameter";
+	    /** MissingRequiredHeader */
+	    KnownStorageErrorCode["MissingRequiredHeader"] = "MissingRequiredHeader";
+	    /** MissingRequiredXmlNode */
+	    KnownStorageErrorCode["MissingRequiredXmlNode"] = "MissingRequiredXmlNode";
+	    /** MultipleConditionHeadersNotSupported */
+	    KnownStorageErrorCode["MultipleConditionHeadersNotSupported"] = "MultipleConditionHeadersNotSupported";
+	    /** OperationTimedOut */
+	    KnownStorageErrorCode["OperationTimedOut"] = "OperationTimedOut";
+	    /** OutOfRangeInput */
+	    KnownStorageErrorCode["OutOfRangeInput"] = "OutOfRangeInput";
+	    /** OutOfRangeQueryParameterValue */
+	    KnownStorageErrorCode["OutOfRangeQueryParameterValue"] = "OutOfRangeQueryParameterValue";
+	    /** RequestBodyTooLarge */
+	    KnownStorageErrorCode["RequestBodyTooLarge"] = "RequestBodyTooLarge";
+	    /** ResourceTypeMismatch */
+	    KnownStorageErrorCode["ResourceTypeMismatch"] = "ResourceTypeMismatch";
+	    /** RequestUrlFailedToParse */
+	    KnownStorageErrorCode["RequestUrlFailedToParse"] = "RequestUrlFailedToParse";
+	    /** ResourceAlreadyExists */
+	    KnownStorageErrorCode["ResourceAlreadyExists"] = "ResourceAlreadyExists";
+	    /** ResourceNotFound */
+	    KnownStorageErrorCode["ResourceNotFound"] = "ResourceNotFound";
+	    /** ServerBusy */
+	    KnownStorageErrorCode["ServerBusy"] = "ServerBusy";
+	    /** UnsupportedHeader */
+	    KnownStorageErrorCode["UnsupportedHeader"] = "UnsupportedHeader";
+	    /** UnsupportedXmlNode */
+	    KnownStorageErrorCode["UnsupportedXmlNode"] = "UnsupportedXmlNode";
+	    /** UnsupportedQueryParameter */
+	    KnownStorageErrorCode["UnsupportedQueryParameter"] = "UnsupportedQueryParameter";
+	    /** UnsupportedHttpVerb */
+	    KnownStorageErrorCode["UnsupportedHttpVerb"] = "UnsupportedHttpVerb";
+	    /** AppendPositionConditionNotMet */
+	    KnownStorageErrorCode["AppendPositionConditionNotMet"] = "AppendPositionConditionNotMet";
+	    /** BlobAlreadyExists */
+	    KnownStorageErrorCode["BlobAlreadyExists"] = "BlobAlreadyExists";
+	    /** BlobImmutableDueToPolicy */
+	    KnownStorageErrorCode["BlobImmutableDueToPolicy"] = "BlobImmutableDueToPolicy";
+	    /** BlobNotFound */
+	    KnownStorageErrorCode["BlobNotFound"] = "BlobNotFound";
+	    /** BlobOverwritten */
+	    KnownStorageErrorCode["BlobOverwritten"] = "BlobOverwritten";
+	    /** BlobTierInadequateForContentLength */
+	    KnownStorageErrorCode["BlobTierInadequateForContentLength"] = "BlobTierInadequateForContentLength";
+	    /** BlobUsesCustomerSpecifiedEncryption */
+	    KnownStorageErrorCode["BlobUsesCustomerSpecifiedEncryption"] = "BlobUsesCustomerSpecifiedEncryption";
+	    /** BlockCountExceedsLimit */
+	    KnownStorageErrorCode["BlockCountExceedsLimit"] = "BlockCountExceedsLimit";
+	    /** BlockListTooLong */
+	    KnownStorageErrorCode["BlockListTooLong"] = "BlockListTooLong";
+	    /** CannotChangeToLowerTier */
+	    KnownStorageErrorCode["CannotChangeToLowerTier"] = "CannotChangeToLowerTier";
+	    /** CannotVerifyCopySource */
+	    KnownStorageErrorCode["CannotVerifyCopySource"] = "CannotVerifyCopySource";
+	    /** ContainerAlreadyExists */
+	    KnownStorageErrorCode["ContainerAlreadyExists"] = "ContainerAlreadyExists";
+	    /** ContainerBeingDeleted */
+	    KnownStorageErrorCode["ContainerBeingDeleted"] = "ContainerBeingDeleted";
+	    /** ContainerDisabled */
+	    KnownStorageErrorCode["ContainerDisabled"] = "ContainerDisabled";
+	    /** ContainerNotFound */
+	    KnownStorageErrorCode["ContainerNotFound"] = "ContainerNotFound";
+	    /** ContentLengthLargerThanTierLimit */
+	    KnownStorageErrorCode["ContentLengthLargerThanTierLimit"] = "ContentLengthLargerThanTierLimit";
+	    /** CopyAcrossAccountsNotSupported */
+	    KnownStorageErrorCode["CopyAcrossAccountsNotSupported"] = "CopyAcrossAccountsNotSupported";
+	    /** CopyIdMismatch */
+	    KnownStorageErrorCode["CopyIdMismatch"] = "CopyIdMismatch";
+	    /** FeatureVersionMismatch */
+	    KnownStorageErrorCode["FeatureVersionMismatch"] = "FeatureVersionMismatch";
+	    /** IncrementalCopyBlobMismatch */
+	    KnownStorageErrorCode["IncrementalCopyBlobMismatch"] = "IncrementalCopyBlobMismatch";
+	    /** IncrementalCopyOfEarlierVersionSnapshotNotAllowed */
+	    KnownStorageErrorCode["IncrementalCopyOfEarlierVersionSnapshotNotAllowed"] = "IncrementalCopyOfEarlierVersionSnapshotNotAllowed";
+	    /** IncrementalCopySourceMustBeSnapshot */
+	    KnownStorageErrorCode["IncrementalCopySourceMustBeSnapshot"] = "IncrementalCopySourceMustBeSnapshot";
+	    /** InfiniteLeaseDurationRequired */
+	    KnownStorageErrorCode["InfiniteLeaseDurationRequired"] = "InfiniteLeaseDurationRequired";
+	    /** InvalidBlobOrBlock */
+	    KnownStorageErrorCode["InvalidBlobOrBlock"] = "InvalidBlobOrBlock";
+	    /** InvalidBlobTier */
+	    KnownStorageErrorCode["InvalidBlobTier"] = "InvalidBlobTier";
+	    /** InvalidBlobType */
+	    KnownStorageErrorCode["InvalidBlobType"] = "InvalidBlobType";
+	    /** InvalidBlockId */
+	    KnownStorageErrorCode["InvalidBlockId"] = "InvalidBlockId";
+	    /** InvalidBlockList */
+	    KnownStorageErrorCode["InvalidBlockList"] = "InvalidBlockList";
+	    /** InvalidOperation */
+	    KnownStorageErrorCode["InvalidOperation"] = "InvalidOperation";
+	    /** InvalidPageRange */
+	    KnownStorageErrorCode["InvalidPageRange"] = "InvalidPageRange";
+	    /** InvalidSourceBlobType */
+	    KnownStorageErrorCode["InvalidSourceBlobType"] = "InvalidSourceBlobType";
+	    /** InvalidSourceBlobUrl */
+	    KnownStorageErrorCode["InvalidSourceBlobUrl"] = "InvalidSourceBlobUrl";
+	    /** InvalidVersionForPageBlobOperation */
+	    KnownStorageErrorCode["InvalidVersionForPageBlobOperation"] = "InvalidVersionForPageBlobOperation";
+	    /** LeaseAlreadyPresent */
+	    KnownStorageErrorCode["LeaseAlreadyPresent"] = "LeaseAlreadyPresent";
+	    /** LeaseAlreadyBroken */
+	    KnownStorageErrorCode["LeaseAlreadyBroken"] = "LeaseAlreadyBroken";
+	    /** LeaseIdMismatchWithBlobOperation */
+	    KnownStorageErrorCode["LeaseIdMismatchWithBlobOperation"] = "LeaseIdMismatchWithBlobOperation";
+	    /** LeaseIdMismatchWithContainerOperation */
+	    KnownStorageErrorCode["LeaseIdMismatchWithContainerOperation"] = "LeaseIdMismatchWithContainerOperation";
+	    /** LeaseIdMismatchWithLeaseOperation */
+	    KnownStorageErrorCode["LeaseIdMismatchWithLeaseOperation"] = "LeaseIdMismatchWithLeaseOperation";
+	    /** LeaseIdMissing */
+	    KnownStorageErrorCode["LeaseIdMissing"] = "LeaseIdMissing";
+	    /** LeaseIsBreakingAndCannotBeAcquired */
+	    KnownStorageErrorCode["LeaseIsBreakingAndCannotBeAcquired"] = "LeaseIsBreakingAndCannotBeAcquired";
+	    /** LeaseIsBreakingAndCannotBeChanged */
+	    KnownStorageErrorCode["LeaseIsBreakingAndCannotBeChanged"] = "LeaseIsBreakingAndCannotBeChanged";
+	    /** LeaseIsBrokenAndCannotBeRenewed */
+	    KnownStorageErrorCode["LeaseIsBrokenAndCannotBeRenewed"] = "LeaseIsBrokenAndCannotBeRenewed";
+	    /** LeaseLost */
+	    KnownStorageErrorCode["LeaseLost"] = "LeaseLost";
+	    /** LeaseNotPresentWithBlobOperation */
+	    KnownStorageErrorCode["LeaseNotPresentWithBlobOperation"] = "LeaseNotPresentWithBlobOperation";
+	    /** LeaseNotPresentWithContainerOperation */
+	    KnownStorageErrorCode["LeaseNotPresentWithContainerOperation"] = "LeaseNotPresentWithContainerOperation";
+	    /** LeaseNotPresentWithLeaseOperation */
+	    KnownStorageErrorCode["LeaseNotPresentWithLeaseOperation"] = "LeaseNotPresentWithLeaseOperation";
+	    /** MaxBlobSizeConditionNotMet */
+	    KnownStorageErrorCode["MaxBlobSizeConditionNotMet"] = "MaxBlobSizeConditionNotMet";
+	    /** NoAuthenticationInformation */
+	    KnownStorageErrorCode["NoAuthenticationInformation"] = "NoAuthenticationInformation";
+	    /** NoPendingCopyOperation */
+	    KnownStorageErrorCode["NoPendingCopyOperation"] = "NoPendingCopyOperation";
+	    /** OperationNotAllowedOnIncrementalCopyBlob */
+	    KnownStorageErrorCode["OperationNotAllowedOnIncrementalCopyBlob"] = "OperationNotAllowedOnIncrementalCopyBlob";
+	    /** PendingCopyOperation */
+	    KnownStorageErrorCode["PendingCopyOperation"] = "PendingCopyOperation";
+	    /** PreviousSnapshotCannotBeNewer */
+	    KnownStorageErrorCode["PreviousSnapshotCannotBeNewer"] = "PreviousSnapshotCannotBeNewer";
+	    /** PreviousSnapshotNotFound */
+	    KnownStorageErrorCode["PreviousSnapshotNotFound"] = "PreviousSnapshotNotFound";
+	    /** PreviousSnapshotOperationNotSupported */
+	    KnownStorageErrorCode["PreviousSnapshotOperationNotSupported"] = "PreviousSnapshotOperationNotSupported";
+	    /** SequenceNumberConditionNotMet */
+	    KnownStorageErrorCode["SequenceNumberConditionNotMet"] = "SequenceNumberConditionNotMet";
+	    /** SequenceNumberIncrementTooLarge */
+	    KnownStorageErrorCode["SequenceNumberIncrementTooLarge"] = "SequenceNumberIncrementTooLarge";
+	    /** SnapshotCountExceeded */
+	    KnownStorageErrorCode["SnapshotCountExceeded"] = "SnapshotCountExceeded";
+	    /** SnapshotOperationRateExceeded */
+	    KnownStorageErrorCode["SnapshotOperationRateExceeded"] = "SnapshotOperationRateExceeded";
+	    /** SnapshotsPresent */
+	    KnownStorageErrorCode["SnapshotsPresent"] = "SnapshotsPresent";
+	    /** SourceConditionNotMet */
+	    KnownStorageErrorCode["SourceConditionNotMet"] = "SourceConditionNotMet";
+	    /** SystemInUse */
+	    KnownStorageErrorCode["SystemInUse"] = "SystemInUse";
+	    /** TargetConditionNotMet */
+	    KnownStorageErrorCode["TargetConditionNotMet"] = "TargetConditionNotMet";
+	    /** UnauthorizedBlobOverwrite */
+	    KnownStorageErrorCode["UnauthorizedBlobOverwrite"] = "UnauthorizedBlobOverwrite";
+	    /** BlobBeingRehydrated */
+	    KnownStorageErrorCode["BlobBeingRehydrated"] = "BlobBeingRehydrated";
+	    /** BlobArchived */
+	    KnownStorageErrorCode["BlobArchived"] = "BlobArchived";
+	    /** BlobNotArchived */
+	    KnownStorageErrorCode["BlobNotArchived"] = "BlobNotArchived";
+	    /** AuthorizationSourceIPMismatch */
+	    KnownStorageErrorCode["AuthorizationSourceIPMismatch"] = "AuthorizationSourceIPMismatch";
+	    /** AuthorizationProtocolMismatch */
+	    KnownStorageErrorCode["AuthorizationProtocolMismatch"] = "AuthorizationProtocolMismatch";
+	    /** AuthorizationPermissionMismatch */
+	    KnownStorageErrorCode["AuthorizationPermissionMismatch"] = "AuthorizationPermissionMismatch";
+	    /** AuthorizationServiceMismatch */
+	    KnownStorageErrorCode["AuthorizationServiceMismatch"] = "AuthorizationServiceMismatch";
+	    /** AuthorizationResourceTypeMismatch */
+	    KnownStorageErrorCode["AuthorizationResourceTypeMismatch"] = "AuthorizationResourceTypeMismatch";
+	    /** BlobAccessTierNotSupportedForAccountType */
+	    KnownStorageErrorCode["BlobAccessTierNotSupportedForAccountType"] = "BlobAccessTierNotSupportedForAccountType";
+	})(KnownStorageErrorCode || (models$1.KnownStorageErrorCode = KnownStorageErrorCode = {}));
+	
+	return models$1;
+}
+
+var storageClient = {};
+
+var operations = {};
+
+var service$1 = {};
+
+var mappers = {};
+
+var hasRequiredMappers;
+
+function requireMappers () {
+	if (hasRequiredMappers) return mappers;
+	hasRequiredMappers = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(mappers, "__esModule", { value: true });
+	mappers.ServiceGetUserDelegationKeyHeaders = mappers.ServiceListContainersSegmentExceptionHeaders = mappers.ServiceListContainersSegmentHeaders = mappers.ServiceGetStatisticsExceptionHeaders = mappers.ServiceGetStatisticsHeaders = mappers.ServiceGetPropertiesExceptionHeaders = mappers.ServiceGetPropertiesHeaders = mappers.ServiceSetPropertiesExceptionHeaders = mappers.ServiceSetPropertiesHeaders = mappers.ArrowField = mappers.ArrowConfiguration = mappers.JsonTextConfiguration = mappers.DelimitedTextConfiguration = mappers.QueryFormat = mappers.QuerySerialization = mappers.QueryRequest = mappers.ClearRange = mappers.PageRange = mappers.PageList = mappers.Block = mappers.BlockList = mappers.BlockLookupList = mappers.BlobPrefix = mappers.BlobHierarchyListSegment = mappers.ListBlobsHierarchySegmentResponse = mappers.BlobPropertiesInternal = mappers.BlobName = mappers.BlobItemInternal = mappers.BlobFlatListSegment = mappers.ListBlobsFlatSegmentResponse = mappers.AccessPolicy = mappers.SignedIdentifier = mappers.BlobTag = mappers.BlobTags = mappers.FilterBlobItem = mappers.FilterBlobSegment = mappers.UserDelegationKey = mappers.KeyInfo = mappers.ContainerProperties = mappers.ContainerItem = mappers.ListContainersSegmentResponse = mappers.GeoReplication = mappers.BlobServiceStatistics = mappers.StorageError = mappers.StaticWebsite = mappers.CorsRule = mappers.Metrics = mappers.RetentionPolicy = mappers.Logging = mappers.BlobServiceProperties = void 0;
+	mappers.BlobUndeleteHeaders = mappers.BlobDeleteExceptionHeaders = mappers.BlobDeleteHeaders = mappers.BlobGetPropertiesExceptionHeaders = mappers.BlobGetPropertiesHeaders = mappers.BlobDownloadExceptionHeaders = mappers.BlobDownloadHeaders = mappers.ContainerGetAccountInfoExceptionHeaders = mappers.ContainerGetAccountInfoHeaders = mappers.ContainerListBlobHierarchySegmentExceptionHeaders = mappers.ContainerListBlobHierarchySegmentHeaders = mappers.ContainerListBlobFlatSegmentExceptionHeaders = mappers.ContainerListBlobFlatSegmentHeaders = mappers.ContainerChangeLeaseExceptionHeaders = mappers.ContainerChangeLeaseHeaders = mappers.ContainerBreakLeaseExceptionHeaders = mappers.ContainerBreakLeaseHeaders = mappers.ContainerRenewLeaseExceptionHeaders = mappers.ContainerRenewLeaseHeaders = mappers.ContainerReleaseLeaseExceptionHeaders = mappers.ContainerReleaseLeaseHeaders = mappers.ContainerAcquireLeaseExceptionHeaders = mappers.ContainerAcquireLeaseHeaders = mappers.ContainerFilterBlobsExceptionHeaders = mappers.ContainerFilterBlobsHeaders = mappers.ContainerSubmitBatchExceptionHeaders = mappers.ContainerSubmitBatchHeaders = mappers.ContainerRenameExceptionHeaders = mappers.ContainerRenameHeaders = mappers.ContainerRestoreExceptionHeaders = mappers.ContainerRestoreHeaders = mappers.ContainerSetAccessPolicyExceptionHeaders = mappers.ContainerSetAccessPolicyHeaders = mappers.ContainerGetAccessPolicyExceptionHeaders = mappers.ContainerGetAccessPolicyHeaders = mappers.ContainerSetMetadataExceptionHeaders = mappers.ContainerSetMetadataHeaders = mappers.ContainerDeleteExceptionHeaders = mappers.ContainerDeleteHeaders = mappers.ContainerGetPropertiesExceptionHeaders = mappers.ContainerGetPropertiesHeaders = mappers.ContainerCreateExceptionHeaders = mappers.ContainerCreateHeaders = mappers.ServiceFilterBlobsExceptionHeaders = mappers.ServiceFilterBlobsHeaders = mappers.ServiceSubmitBatchExceptionHeaders = mappers.ServiceSubmitBatchHeaders = mappers.ServiceGetAccountInfoExceptionHeaders = mappers.ServiceGetAccountInfoHeaders = mappers.ServiceGetUserDelegationKeyExceptionHeaders = void 0;
+	mappers.PageBlobGetPageRangesHeaders = mappers.PageBlobUploadPagesFromURLExceptionHeaders = mappers.PageBlobUploadPagesFromURLHeaders = mappers.PageBlobClearPagesExceptionHeaders = mappers.PageBlobClearPagesHeaders = mappers.PageBlobUploadPagesExceptionHeaders = mappers.PageBlobUploadPagesHeaders = mappers.PageBlobCreateExceptionHeaders = mappers.PageBlobCreateHeaders = mappers.BlobSetTagsExceptionHeaders = mappers.BlobSetTagsHeaders = mappers.BlobGetTagsExceptionHeaders = mappers.BlobGetTagsHeaders = mappers.BlobQueryExceptionHeaders = mappers.BlobQueryHeaders = mappers.BlobGetAccountInfoExceptionHeaders = mappers.BlobGetAccountInfoHeaders = mappers.BlobSetTierExceptionHeaders = mappers.BlobSetTierHeaders = mappers.BlobAbortCopyFromURLExceptionHeaders = mappers.BlobAbortCopyFromURLHeaders = mappers.BlobCopyFromURLExceptionHeaders = mappers.BlobCopyFromURLHeaders = mappers.BlobStartCopyFromURLExceptionHeaders = mappers.BlobStartCopyFromURLHeaders = mappers.BlobCreateSnapshotExceptionHeaders = mappers.BlobCreateSnapshotHeaders = mappers.BlobBreakLeaseExceptionHeaders = mappers.BlobBreakLeaseHeaders = mappers.BlobChangeLeaseExceptionHeaders = mappers.BlobChangeLeaseHeaders = mappers.BlobRenewLeaseExceptionHeaders = mappers.BlobRenewLeaseHeaders = mappers.BlobReleaseLeaseExceptionHeaders = mappers.BlobReleaseLeaseHeaders = mappers.BlobAcquireLeaseExceptionHeaders = mappers.BlobAcquireLeaseHeaders = mappers.BlobSetMetadataExceptionHeaders = mappers.BlobSetMetadataHeaders = mappers.BlobSetLegalHoldExceptionHeaders = mappers.BlobSetLegalHoldHeaders = mappers.BlobDeleteImmutabilityPolicyExceptionHeaders = mappers.BlobDeleteImmutabilityPolicyHeaders = mappers.BlobSetImmutabilityPolicyExceptionHeaders = mappers.BlobSetImmutabilityPolicyHeaders = mappers.BlobSetHttpHeadersExceptionHeaders = mappers.BlobSetHttpHeadersHeaders = mappers.BlobSetExpiryExceptionHeaders = mappers.BlobSetExpiryHeaders = mappers.BlobUndeleteExceptionHeaders = void 0;
+	mappers.BlockBlobGetBlockListExceptionHeaders = mappers.BlockBlobGetBlockListHeaders = mappers.BlockBlobCommitBlockListExceptionHeaders = mappers.BlockBlobCommitBlockListHeaders = mappers.BlockBlobStageBlockFromURLExceptionHeaders = mappers.BlockBlobStageBlockFromURLHeaders = mappers.BlockBlobStageBlockExceptionHeaders = mappers.BlockBlobStageBlockHeaders = mappers.BlockBlobPutBlobFromUrlExceptionHeaders = mappers.BlockBlobPutBlobFromUrlHeaders = mappers.BlockBlobUploadExceptionHeaders = mappers.BlockBlobUploadHeaders = mappers.AppendBlobSealExceptionHeaders = mappers.AppendBlobSealHeaders = mappers.AppendBlobAppendBlockFromUrlExceptionHeaders = mappers.AppendBlobAppendBlockFromUrlHeaders = mappers.AppendBlobAppendBlockExceptionHeaders = mappers.AppendBlobAppendBlockHeaders = mappers.AppendBlobCreateExceptionHeaders = mappers.AppendBlobCreateHeaders = mappers.PageBlobCopyIncrementalExceptionHeaders = mappers.PageBlobCopyIncrementalHeaders = mappers.PageBlobUpdateSequenceNumberExceptionHeaders = mappers.PageBlobUpdateSequenceNumberHeaders = mappers.PageBlobResizeExceptionHeaders = mappers.PageBlobResizeHeaders = mappers.PageBlobGetPageRangesDiffExceptionHeaders = mappers.PageBlobGetPageRangesDiffHeaders = mappers.PageBlobGetPageRangesExceptionHeaders = void 0;
+	mappers.BlobServiceProperties = {
+	    serializedName: "BlobServiceProperties",
+	    xmlName: "StorageServiceProperties",
+	    type: {
+	        name: "Composite",
+	        className: "BlobServiceProperties",
+	        modelProperties: {
+	            blobAnalyticsLogging: {
+	                serializedName: "Logging",
+	                xmlName: "Logging",
+	                type: {
+	                    name: "Composite",
+	                    className: "Logging",
+	                },
+	            },
+	            hourMetrics: {
+	                serializedName: "HourMetrics",
+	                xmlName: "HourMetrics",
+	                type: {
+	                    name: "Composite",
+	                    className: "Metrics",
+	                },
+	            },
+	            minuteMetrics: {
+	                serializedName: "MinuteMetrics",
+	                xmlName: "MinuteMetrics",
+	                type: {
+	                    name: "Composite",
+	                    className: "Metrics",
+	                },
+	            },
+	            cors: {
+	                serializedName: "Cors",
+	                xmlName: "Cors",
+	                xmlIsWrapped: true,
+	                xmlElementName: "CorsRule",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "CorsRule",
+	                        },
+	                    },
+	                },
+	            },
+	            defaultServiceVersion: {
+	                serializedName: "DefaultServiceVersion",
+	                xmlName: "DefaultServiceVersion",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            deleteRetentionPolicy: {
+	                serializedName: "DeleteRetentionPolicy",
+	                xmlName: "DeleteRetentionPolicy",
+	                type: {
+	                    name: "Composite",
+	                    className: "RetentionPolicy",
+	                },
+	            },
+	            staticWebsite: {
+	                serializedName: "StaticWebsite",
+	                xmlName: "StaticWebsite",
+	                type: {
+	                    name: "Composite",
+	                    className: "StaticWebsite",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.Logging = {
+	    serializedName: "Logging",
+	    type: {
+	        name: "Composite",
+	        className: "Logging",
+	        modelProperties: {
+	            version: {
+	                serializedName: "Version",
+	                required: true,
+	                xmlName: "Version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            deleteProperty: {
+	                serializedName: "Delete",
+	                required: true,
+	                xmlName: "Delete",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            read: {
+	                serializedName: "Read",
+	                required: true,
+	                xmlName: "Read",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            write: {
+	                serializedName: "Write",
+	                required: true,
+	                xmlName: "Write",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            retentionPolicy: {
+	                serializedName: "RetentionPolicy",
+	                xmlName: "RetentionPolicy",
+	                type: {
+	                    name: "Composite",
+	                    className: "RetentionPolicy",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.RetentionPolicy = {
+	    serializedName: "RetentionPolicy",
+	    type: {
+	        name: "Composite",
+	        className: "RetentionPolicy",
+	        modelProperties: {
+	            enabled: {
+	                serializedName: "Enabled",
+	                required: true,
+	                xmlName: "Enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            days: {
+	                constraints: {
+	                    InclusiveMinimum: 1,
+	                },
+	                serializedName: "Days",
+	                xmlName: "Days",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.Metrics = {
+	    serializedName: "Metrics",
+	    type: {
+	        name: "Composite",
+	        className: "Metrics",
+	        modelProperties: {
+	            version: {
+	                serializedName: "Version",
+	                xmlName: "Version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            enabled: {
+	                serializedName: "Enabled",
+	                required: true,
+	                xmlName: "Enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            includeAPIs: {
+	                serializedName: "IncludeAPIs",
+	                xmlName: "IncludeAPIs",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            retentionPolicy: {
+	                serializedName: "RetentionPolicy",
+	                xmlName: "RetentionPolicy",
+	                type: {
+	                    name: "Composite",
+	                    className: "RetentionPolicy",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.CorsRule = {
+	    serializedName: "CorsRule",
+	    type: {
+	        name: "Composite",
+	        className: "CorsRule",
+	        modelProperties: {
+	            allowedOrigins: {
+	                serializedName: "AllowedOrigins",
+	                required: true,
+	                xmlName: "AllowedOrigins",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            allowedMethods: {
+	                serializedName: "AllowedMethods",
+	                required: true,
+	                xmlName: "AllowedMethods",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            allowedHeaders: {
+	                serializedName: "AllowedHeaders",
+	                required: true,
+	                xmlName: "AllowedHeaders",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            exposedHeaders: {
+	                serializedName: "ExposedHeaders",
+	                required: true,
+	                xmlName: "ExposedHeaders",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            maxAgeInSeconds: {
+	                constraints: {
+	                    InclusiveMinimum: 0,
+	                },
+	                serializedName: "MaxAgeInSeconds",
+	                required: true,
+	                xmlName: "MaxAgeInSeconds",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.StaticWebsite = {
+	    serializedName: "StaticWebsite",
+	    type: {
+	        name: "Composite",
+	        className: "StaticWebsite",
+	        modelProperties: {
+	            enabled: {
+	                serializedName: "Enabled",
+	                required: true,
+	                xmlName: "Enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            indexDocument: {
+	                serializedName: "IndexDocument",
+	                xmlName: "IndexDocument",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorDocument404Path: {
+	                serializedName: "ErrorDocument404Path",
+	                xmlName: "ErrorDocument404Path",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            defaultIndexDocumentPath: {
+	                serializedName: "DefaultIndexDocumentPath",
+	                xmlName: "DefaultIndexDocumentPath",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.StorageError = {
+	    serializedName: "StorageError",
+	    type: {
+	        name: "Composite",
+	        className: "StorageError",
+	        modelProperties: {
+	            message: {
+	                serializedName: "Message",
+	                xmlName: "Message",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "CopySourceStatusCode",
+	                xmlName: "CopySourceStatusCode",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "CopySourceErrorCode",
+	                xmlName: "CopySourceErrorCode",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorMessage: {
+	                serializedName: "CopySourceErrorMessage",
+	                xmlName: "CopySourceErrorMessage",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            code: {
+	                serializedName: "Code",
+	                xmlName: "Code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            authenticationErrorDetail: {
+	                serializedName: "AuthenticationErrorDetail",
+	                xmlName: "AuthenticationErrorDetail",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobServiceStatistics = {
+	    serializedName: "BlobServiceStatistics",
+	    xmlName: "StorageServiceStats",
+	    type: {
+	        name: "Composite",
+	        className: "BlobServiceStatistics",
+	        modelProperties: {
+	            geoReplication: {
+	                serializedName: "GeoReplication",
+	                xmlName: "GeoReplication",
+	                type: {
+	                    name: "Composite",
+	                    className: "GeoReplication",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.GeoReplication = {
+	    serializedName: "GeoReplication",
+	    type: {
+	        name: "Composite",
+	        className: "GeoReplication",
+	        modelProperties: {
+	            status: {
+	                serializedName: "Status",
+	                required: true,
+	                xmlName: "Status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["live", "bootstrap", "unavailable"],
+	                },
+	            },
+	            lastSyncOn: {
+	                serializedName: "LastSyncTime",
+	                required: true,
+	                xmlName: "LastSyncTime",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ListContainersSegmentResponse = {
+	    serializedName: "ListContainersSegmentResponse",
+	    xmlName: "EnumerationResults",
+	    type: {
+	        name: "Composite",
+	        className: "ListContainersSegmentResponse",
+	        modelProperties: {
+	            serviceEndpoint: {
+	                serializedName: "ServiceEndpoint",
+	                required: true,
+	                xmlName: "ServiceEndpoint",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            prefix: {
+	                serializedName: "Prefix",
+	                xmlName: "Prefix",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            marker: {
+	                serializedName: "Marker",
+	                xmlName: "Marker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            maxPageSize: {
+	                serializedName: "MaxResults",
+	                xmlName: "MaxResults",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            containerItems: {
+	                serializedName: "ContainerItems",
+	                required: true,
+	                xmlName: "Containers",
+	                xmlIsWrapped: true,
+	                xmlElementName: "Container",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "ContainerItem",
+	                        },
+	                    },
+	                },
+	            },
+	            continuationToken: {
+	                serializedName: "NextMarker",
+	                xmlName: "NextMarker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerItem = {
+	    serializedName: "ContainerItem",
+	    xmlName: "Container",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerItem",
+	        modelProperties: {
+	            name: {
+	                serializedName: "Name",
+	                required: true,
+	                xmlName: "Name",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            deleted: {
+	                serializedName: "Deleted",
+	                xmlName: "Deleted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            version: {
+	                serializedName: "Version",
+	                xmlName: "Version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            properties: {
+	                serializedName: "Properties",
+	                xmlName: "Properties",
+	                type: {
+	                    name: "Composite",
+	                    className: "ContainerProperties",
+	                },
+	            },
+	            metadata: {
+	                serializedName: "Metadata",
+	                xmlName: "Metadata",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerProperties = {
+	    serializedName: "ContainerProperties",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerProperties",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "Last-Modified",
+	                required: true,
+	                xmlName: "Last-Modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            etag: {
+	                serializedName: "Etag",
+	                required: true,
+	                xmlName: "Etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            leaseStatus: {
+	                serializedName: "LeaseStatus",
+	                xmlName: "LeaseStatus",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["locked", "unlocked"],
+	                },
+	            },
+	            leaseState: {
+	                serializedName: "LeaseState",
+	                xmlName: "LeaseState",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "available",
+	                        "leased",
+	                        "expired",
+	                        "breaking",
+	                        "broken",
+	                    ],
+	                },
+	            },
+	            leaseDuration: {
+	                serializedName: "LeaseDuration",
+	                xmlName: "LeaseDuration",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["infinite", "fixed"],
+	                },
+	            },
+	            publicAccess: {
+	                serializedName: "PublicAccess",
+	                xmlName: "PublicAccess",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["container", "blob"],
+	                },
+	            },
+	            hasImmutabilityPolicy: {
+	                serializedName: "HasImmutabilityPolicy",
+	                xmlName: "HasImmutabilityPolicy",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            hasLegalHold: {
+	                serializedName: "HasLegalHold",
+	                xmlName: "HasLegalHold",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            defaultEncryptionScope: {
+	                serializedName: "DefaultEncryptionScope",
+	                xmlName: "DefaultEncryptionScope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            preventEncryptionScopeOverride: {
+	                serializedName: "DenyEncryptionScopeOverride",
+	                xmlName: "DenyEncryptionScopeOverride",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            deletedOn: {
+	                serializedName: "DeletedTime",
+	                xmlName: "DeletedTime",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            remainingRetentionDays: {
+	                serializedName: "RemainingRetentionDays",
+	                xmlName: "RemainingRetentionDays",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            isImmutableStorageWithVersioningEnabled: {
+	                serializedName: "ImmutableStorageWithVersioningEnabled",
+	                xmlName: "ImmutableStorageWithVersioningEnabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.KeyInfo = {
+	    serializedName: "KeyInfo",
+	    type: {
+	        name: "Composite",
+	        className: "KeyInfo",
+	        modelProperties: {
+	            startsOn: {
+	                serializedName: "Start",
+	                required: true,
+	                xmlName: "Start",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            expiresOn: {
+	                serializedName: "Expiry",
+	                required: true,
+	                xmlName: "Expiry",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.UserDelegationKey = {
+	    serializedName: "UserDelegationKey",
+	    type: {
+	        name: "Composite",
+	        className: "UserDelegationKey",
+	        modelProperties: {
+	            signedObjectId: {
+	                serializedName: "SignedOid",
+	                required: true,
+	                xmlName: "SignedOid",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            signedTenantId: {
+	                serializedName: "SignedTid",
+	                required: true,
+	                xmlName: "SignedTid",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            signedStartsOn: {
+	                serializedName: "SignedStart",
+	                required: true,
+	                xmlName: "SignedStart",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            signedExpiresOn: {
+	                serializedName: "SignedExpiry",
+	                required: true,
+	                xmlName: "SignedExpiry",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            signedService: {
+	                serializedName: "SignedService",
+	                required: true,
+	                xmlName: "SignedService",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            signedVersion: {
+	                serializedName: "SignedVersion",
+	                required: true,
+	                xmlName: "SignedVersion",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            value: {
+	                serializedName: "Value",
+	                required: true,
+	                xmlName: "Value",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.FilterBlobSegment = {
+	    serializedName: "FilterBlobSegment",
+	    xmlName: "EnumerationResults",
+	    type: {
+	        name: "Composite",
+	        className: "FilterBlobSegment",
+	        modelProperties: {
+	            serviceEndpoint: {
+	                serializedName: "ServiceEndpoint",
+	                required: true,
+	                xmlName: "ServiceEndpoint",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            where: {
+	                serializedName: "Where",
+	                required: true,
+	                xmlName: "Where",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobs: {
+	                serializedName: "Blobs",
+	                required: true,
+	                xmlName: "Blobs",
+	                xmlIsWrapped: true,
+	                xmlElementName: "Blob",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "FilterBlobItem",
+	                        },
+	                    },
+	                },
+	            },
+	            continuationToken: {
+	                serializedName: "NextMarker",
+	                xmlName: "NextMarker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.FilterBlobItem = {
+	    serializedName: "FilterBlobItem",
+	    xmlName: "Blob",
+	    type: {
+	        name: "Composite",
+	        className: "FilterBlobItem",
+	        modelProperties: {
+	            name: {
+	                serializedName: "Name",
+	                required: true,
+	                xmlName: "Name",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            containerName: {
+	                serializedName: "ContainerName",
+	                required: true,
+	                xmlName: "ContainerName",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            tags: {
+	                serializedName: "Tags",
+	                xmlName: "Tags",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobTags",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobTags = {
+	    serializedName: "BlobTags",
+	    xmlName: "Tags",
+	    type: {
+	        name: "Composite",
+	        className: "BlobTags",
+	        modelProperties: {
+	            blobTagSet: {
+	                serializedName: "BlobTagSet",
+	                required: true,
+	                xmlName: "TagSet",
+	                xmlIsWrapped: true,
+	                xmlElementName: "Tag",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "BlobTag",
+	                        },
+	                    },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobTag = {
+	    serializedName: "BlobTag",
+	    xmlName: "Tag",
+	    type: {
+	        name: "Composite",
+	        className: "BlobTag",
+	        modelProperties: {
+	            key: {
+	                serializedName: "Key",
+	                required: true,
+	                xmlName: "Key",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            value: {
+	                serializedName: "Value",
+	                required: true,
+	                xmlName: "Value",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.SignedIdentifier = {
+	    serializedName: "SignedIdentifier",
+	    xmlName: "SignedIdentifier",
+	    type: {
+	        name: "Composite",
+	        className: "SignedIdentifier",
+	        modelProperties: {
+	            id: {
+	                serializedName: "Id",
+	                required: true,
+	                xmlName: "Id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            accessPolicy: {
+	                serializedName: "AccessPolicy",
+	                xmlName: "AccessPolicy",
+	                type: {
+	                    name: "Composite",
+	                    className: "AccessPolicy",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AccessPolicy = {
+	    serializedName: "AccessPolicy",
+	    type: {
+	        name: "Composite",
+	        className: "AccessPolicy",
+	        modelProperties: {
+	            startsOn: {
+	                serializedName: "Start",
+	                xmlName: "Start",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            expiresOn: {
+	                serializedName: "Expiry",
+	                xmlName: "Expiry",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            permissions: {
+	                serializedName: "Permission",
+	                xmlName: "Permission",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ListBlobsFlatSegmentResponse = {
+	    serializedName: "ListBlobsFlatSegmentResponse",
+	    xmlName: "EnumerationResults",
+	    type: {
+	        name: "Composite",
+	        className: "ListBlobsFlatSegmentResponse",
+	        modelProperties: {
+	            serviceEndpoint: {
+	                serializedName: "ServiceEndpoint",
+	                required: true,
+	                xmlName: "ServiceEndpoint",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            containerName: {
+	                serializedName: "ContainerName",
+	                required: true,
+	                xmlName: "ContainerName",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            prefix: {
+	                serializedName: "Prefix",
+	                xmlName: "Prefix",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            marker: {
+	                serializedName: "Marker",
+	                xmlName: "Marker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            maxPageSize: {
+	                serializedName: "MaxResults",
+	                xmlName: "MaxResults",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            segment: {
+	                serializedName: "Segment",
+	                xmlName: "Blobs",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobFlatListSegment",
+	                },
+	            },
+	            continuationToken: {
+	                serializedName: "NextMarker",
+	                xmlName: "NextMarker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobFlatListSegment = {
+	    serializedName: "BlobFlatListSegment",
+	    xmlName: "Blobs",
+	    type: {
+	        name: "Composite",
+	        className: "BlobFlatListSegment",
+	        modelProperties: {
+	            blobItems: {
+	                serializedName: "BlobItems",
+	                required: true,
+	                xmlName: "BlobItems",
+	                xmlElementName: "Blob",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "BlobItemInternal",
+	                        },
+	                    },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobItemInternal = {
+	    serializedName: "BlobItemInternal",
+	    xmlName: "Blob",
+	    type: {
+	        name: "Composite",
+	        className: "BlobItemInternal",
+	        modelProperties: {
+	            name: {
+	                serializedName: "Name",
+	                xmlName: "Name",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobName",
+	                },
+	            },
+	            deleted: {
+	                serializedName: "Deleted",
+	                required: true,
+	                xmlName: "Deleted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            snapshot: {
+	                serializedName: "Snapshot",
+	                required: true,
+	                xmlName: "Snapshot",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "VersionId",
+	                xmlName: "VersionId",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            isCurrentVersion: {
+	                serializedName: "IsCurrentVersion",
+	                xmlName: "IsCurrentVersion",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            properties: {
+	                serializedName: "Properties",
+	                xmlName: "Properties",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobPropertiesInternal",
+	                },
+	            },
+	            metadata: {
+	                serializedName: "Metadata",
+	                xmlName: "Metadata",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            blobTags: {
+	                serializedName: "BlobTags",
+	                xmlName: "Tags",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobTags",
+	                },
+	            },
+	            objectReplicationMetadata: {
+	                serializedName: "ObjectReplicationMetadata",
+	                xmlName: "OrMetadata",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            hasVersionsOnly: {
+	                serializedName: "HasVersionsOnly",
+	                xmlName: "HasVersionsOnly",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobName = {
+	    serializedName: "BlobName",
+	    type: {
+	        name: "Composite",
+	        className: "BlobName",
+	        modelProperties: {
+	            encoded: {
+	                serializedName: "Encoded",
+	                xmlName: "Encoded",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            content: {
+	                serializedName: "content",
+	                xmlName: "content",
+	                xmlIsMsText: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobPropertiesInternal = {
+	    serializedName: "BlobPropertiesInternal",
+	    xmlName: "Properties",
+	    type: {
+	        name: "Composite",
+	        className: "BlobPropertiesInternal",
+	        modelProperties: {
+	            createdOn: {
+	                serializedName: "Creation-Time",
+	                xmlName: "Creation-Time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "Last-Modified",
+	                required: true,
+	                xmlName: "Last-Modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            etag: {
+	                serializedName: "Etag",
+	                required: true,
+	                xmlName: "Etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentLength: {
+	                serializedName: "Content-Length",
+	                xmlName: "Content-Length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            contentType: {
+	                serializedName: "Content-Type",
+	                xmlName: "Content-Type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentEncoding: {
+	                serializedName: "Content-Encoding",
+	                xmlName: "Content-Encoding",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentLanguage: {
+	                serializedName: "Content-Language",
+	                xmlName: "Content-Language",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "Content-MD5",
+	                xmlName: "Content-MD5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            contentDisposition: {
+	                serializedName: "Content-Disposition",
+	                xmlName: "Content-Disposition",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            cacheControl: {
+	                serializedName: "Cache-Control",
+	                xmlName: "Cache-Control",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            blobType: {
+	                serializedName: "BlobType",
+	                xmlName: "BlobType",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
+	                },
+	            },
+	            leaseStatus: {
+	                serializedName: "LeaseStatus",
+	                xmlName: "LeaseStatus",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["locked", "unlocked"],
+	                },
+	            },
+	            leaseState: {
+	                serializedName: "LeaseState",
+	                xmlName: "LeaseState",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "available",
+	                        "leased",
+	                        "expired",
+	                        "breaking",
+	                        "broken",
+	                    ],
+	                },
+	            },
+	            leaseDuration: {
+	                serializedName: "LeaseDuration",
+	                xmlName: "LeaseDuration",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["infinite", "fixed"],
+	                },
+	            },
+	            copyId: {
+	                serializedName: "CopyId",
+	                xmlName: "CopyId",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                serializedName: "CopyStatus",
+	                xmlName: "CopyStatus",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["pending", "success", "aborted", "failed"],
+	                },
+	            },
+	            copySource: {
+	                serializedName: "CopySource",
+	                xmlName: "CopySource",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyProgress: {
+	                serializedName: "CopyProgress",
+	                xmlName: "CopyProgress",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyCompletedOn: {
+	                serializedName: "CopyCompletionTime",
+	                xmlName: "CopyCompletionTime",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyStatusDescription: {
+	                serializedName: "CopyStatusDescription",
+	                xmlName: "CopyStatusDescription",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            serverEncrypted: {
+	                serializedName: "ServerEncrypted",
+	                xmlName: "ServerEncrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            incrementalCopy: {
+	                serializedName: "IncrementalCopy",
+	                xmlName: "IncrementalCopy",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            destinationSnapshot: {
+	                serializedName: "DestinationSnapshot",
+	                xmlName: "DestinationSnapshot",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            deletedOn: {
+	                serializedName: "DeletedTime",
+	                xmlName: "DeletedTime",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            remainingRetentionDays: {
+	                serializedName: "RemainingRetentionDays",
+	                xmlName: "RemainingRetentionDays",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            accessTier: {
+	                serializedName: "AccessTier",
+	                xmlName: "AccessTier",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "P4",
+	                        "P6",
+	                        "P10",
+	                        "P15",
+	                        "P20",
+	                        "P30",
+	                        "P40",
+	                        "P50",
+	                        "P60",
+	                        "P70",
+	                        "P80",
+	                        "Hot",
+	                        "Cool",
+	                        "Archive",
+	                        "Cold",
+	                    ],
+	                },
+	            },
+	            accessTierInferred: {
+	                serializedName: "AccessTierInferred",
+	                xmlName: "AccessTierInferred",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            archiveStatus: {
+	                serializedName: "ArchiveStatus",
+	                xmlName: "ArchiveStatus",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "rehydrate-pending-to-hot",
+	                        "rehydrate-pending-to-cool",
+	                        "rehydrate-pending-to-cold",
+	                    ],
+	                },
+	            },
+	            customerProvidedKeySha256: {
+	                serializedName: "CustomerProvidedKeySha256",
+	                xmlName: "CustomerProvidedKeySha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "EncryptionScope",
+	                xmlName: "EncryptionScope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            accessTierChangedOn: {
+	                serializedName: "AccessTierChangeTime",
+	                xmlName: "AccessTierChangeTime",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            tagCount: {
+	                serializedName: "TagCount",
+	                xmlName: "TagCount",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            expiresOn: {
+	                serializedName: "Expiry-Time",
+	                xmlName: "Expiry-Time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isSealed: {
+	                serializedName: "Sealed",
+	                xmlName: "Sealed",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            rehydratePriority: {
+	                serializedName: "RehydratePriority",
+	                xmlName: "RehydratePriority",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["High", "Standard"],
+	                },
+	            },
+	            lastAccessedOn: {
+	                serializedName: "LastAccessTime",
+	                xmlName: "LastAccessTime",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyExpiresOn: {
+	                serializedName: "ImmutabilityPolicyUntilDate",
+	                xmlName: "ImmutabilityPolicyUntilDate",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyMode: {
+	                serializedName: "ImmutabilityPolicyMode",
+	                xmlName: "ImmutabilityPolicyMode",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
+	                },
+	            },
+	            legalHold: {
+	                serializedName: "LegalHold",
+	                xmlName: "LegalHold",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ListBlobsHierarchySegmentResponse = {
+	    serializedName: "ListBlobsHierarchySegmentResponse",
+	    xmlName: "EnumerationResults",
+	    type: {
+	        name: "Composite",
+	        className: "ListBlobsHierarchySegmentResponse",
+	        modelProperties: {
+	            serviceEndpoint: {
+	                serializedName: "ServiceEndpoint",
+	                required: true,
+	                xmlName: "ServiceEndpoint",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            containerName: {
+	                serializedName: "ContainerName",
+	                required: true,
+	                xmlName: "ContainerName",
+	                xmlIsAttribute: true,
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            prefix: {
+	                serializedName: "Prefix",
+	                xmlName: "Prefix",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            marker: {
+	                serializedName: "Marker",
+	                xmlName: "Marker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            maxPageSize: {
+	                serializedName: "MaxResults",
+	                xmlName: "MaxResults",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            delimiter: {
+	                serializedName: "Delimiter",
+	                xmlName: "Delimiter",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            segment: {
+	                serializedName: "Segment",
+	                xmlName: "Blobs",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobHierarchyListSegment",
+	                },
+	            },
+	            continuationToken: {
+	                serializedName: "NextMarker",
+	                xmlName: "NextMarker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobHierarchyListSegment = {
+	    serializedName: "BlobHierarchyListSegment",
+	    xmlName: "Blobs",
+	    type: {
+	        name: "Composite",
+	        className: "BlobHierarchyListSegment",
+	        modelProperties: {
+	            blobPrefixes: {
+	                serializedName: "BlobPrefixes",
+	                xmlName: "BlobPrefixes",
+	                xmlElementName: "BlobPrefix",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "BlobPrefix",
+	                        },
+	                    },
+	                },
+	            },
+	            blobItems: {
+	                serializedName: "BlobItems",
+	                required: true,
+	                xmlName: "BlobItems",
+	                xmlElementName: "Blob",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "BlobItemInternal",
+	                        },
+	                    },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobPrefix = {
+	    serializedName: "BlobPrefix",
+	    type: {
+	        name: "Composite",
+	        className: "BlobPrefix",
+	        modelProperties: {
+	            name: {
+	                serializedName: "Name",
+	                xmlName: "Name",
+	                type: {
+	                    name: "Composite",
+	                    className: "BlobName",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockLookupList = {
+	    serializedName: "BlockLookupList",
+	    xmlName: "BlockList",
+	    type: {
+	        name: "Composite",
+	        className: "BlockLookupList",
+	        modelProperties: {
+	            committed: {
+	                serializedName: "Committed",
+	                xmlName: "Committed",
+	                xmlElementName: "Committed",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "String",
+	                        },
+	                    },
+	                },
+	            },
+	            uncommitted: {
+	                serializedName: "Uncommitted",
+	                xmlName: "Uncommitted",
+	                xmlElementName: "Uncommitted",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "String",
+	                        },
+	                    },
+	                },
+	            },
+	            latest: {
+	                serializedName: "Latest",
+	                xmlName: "Latest",
+	                xmlElementName: "Latest",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "String",
+	                        },
+	                    },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockList = {
+	    serializedName: "BlockList",
+	    type: {
+	        name: "Composite",
+	        className: "BlockList",
+	        modelProperties: {
+	            committedBlocks: {
+	                serializedName: "CommittedBlocks",
+	                xmlName: "CommittedBlocks",
+	                xmlIsWrapped: true,
+	                xmlElementName: "Block",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "Block",
+	                        },
+	                    },
+	                },
+	            },
+	            uncommittedBlocks: {
+	                serializedName: "UncommittedBlocks",
+	                xmlName: "UncommittedBlocks",
+	                xmlIsWrapped: true,
+	                xmlElementName: "Block",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "Block",
+	                        },
+	                    },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.Block = {
+	    serializedName: "Block",
+	    type: {
+	        name: "Composite",
+	        className: "Block",
+	        modelProperties: {
+	            name: {
+	                serializedName: "Name",
+	                required: true,
+	                xmlName: "Name",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            size: {
+	                serializedName: "Size",
+	                required: true,
+	                xmlName: "Size",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageList = {
+	    serializedName: "PageList",
+	    type: {
+	        name: "Composite",
+	        className: "PageList",
+	        modelProperties: {
+	            pageRange: {
+	                serializedName: "PageRange",
+	                xmlName: "PageRange",
+	                xmlElementName: "PageRange",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "PageRange",
+	                        },
+	                    },
+	                },
+	            },
+	            clearRange: {
+	                serializedName: "ClearRange",
+	                xmlName: "ClearRange",
+	                xmlElementName: "ClearRange",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "ClearRange",
+	                        },
+	                    },
+	                },
+	            },
+	            continuationToken: {
+	                serializedName: "NextMarker",
+	                xmlName: "NextMarker",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageRange = {
+	    serializedName: "PageRange",
+	    xmlName: "PageRange",
+	    type: {
+	        name: "Composite",
+	        className: "PageRange",
+	        modelProperties: {
+	            start: {
+	                serializedName: "Start",
+	                required: true,
+	                xmlName: "Start",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            end: {
+	                serializedName: "End",
+	                required: true,
+	                xmlName: "End",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ClearRange = {
+	    serializedName: "ClearRange",
+	    xmlName: "ClearRange",
+	    type: {
+	        name: "Composite",
+	        className: "ClearRange",
+	        modelProperties: {
+	            start: {
+	                serializedName: "Start",
+	                required: true,
+	                xmlName: "Start",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            end: {
+	                serializedName: "End",
+	                required: true,
+	                xmlName: "End",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.QueryRequest = {
+	    serializedName: "QueryRequest",
+	    xmlName: "QueryRequest",
+	    type: {
+	        name: "Composite",
+	        className: "QueryRequest",
+	        modelProperties: {
+	            queryType: {
+	                serializedName: "QueryType",
+	                required: true,
+	                xmlName: "QueryType",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            expression: {
+	                serializedName: "Expression",
+	                required: true,
+	                xmlName: "Expression",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            inputSerialization: {
+	                serializedName: "InputSerialization",
+	                xmlName: "InputSerialization",
+	                type: {
+	                    name: "Composite",
+	                    className: "QuerySerialization",
+	                },
+	            },
+	            outputSerialization: {
+	                serializedName: "OutputSerialization",
+	                xmlName: "OutputSerialization",
+	                type: {
+	                    name: "Composite",
+	                    className: "QuerySerialization",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.QuerySerialization = {
+	    serializedName: "QuerySerialization",
+	    type: {
+	        name: "Composite",
+	        className: "QuerySerialization",
+	        modelProperties: {
+	            format: {
+	                serializedName: "Format",
+	                xmlName: "Format",
+	                type: {
+	                    name: "Composite",
+	                    className: "QueryFormat",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.QueryFormat = {
+	    serializedName: "QueryFormat",
+	    type: {
+	        name: "Composite",
+	        className: "QueryFormat",
+	        modelProperties: {
+	            type: {
+	                serializedName: "Type",
+	                required: true,
+	                xmlName: "Type",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["delimited", "json", "arrow", "parquet"],
+	                },
+	            },
+	            delimitedTextConfiguration: {
+	                serializedName: "DelimitedTextConfiguration",
+	                xmlName: "DelimitedTextConfiguration",
+	                type: {
+	                    name: "Composite",
+	                    className: "DelimitedTextConfiguration",
+	                },
+	            },
+	            jsonTextConfiguration: {
+	                serializedName: "JsonTextConfiguration",
+	                xmlName: "JsonTextConfiguration",
+	                type: {
+	                    name: "Composite",
+	                    className: "JsonTextConfiguration",
+	                },
+	            },
+	            arrowConfiguration: {
+	                serializedName: "ArrowConfiguration",
+	                xmlName: "ArrowConfiguration",
+	                type: {
+	                    name: "Composite",
+	                    className: "ArrowConfiguration",
+	                },
+	            },
+	            parquetTextConfiguration: {
+	                serializedName: "ParquetTextConfiguration",
+	                xmlName: "ParquetTextConfiguration",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "any" } },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.DelimitedTextConfiguration = {
+	    serializedName: "DelimitedTextConfiguration",
+	    xmlName: "DelimitedTextConfiguration",
+	    type: {
+	        name: "Composite",
+	        className: "DelimitedTextConfiguration",
+	        modelProperties: {
+	            columnSeparator: {
+	                serializedName: "ColumnSeparator",
+	                xmlName: "ColumnSeparator",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            fieldQuote: {
+	                serializedName: "FieldQuote",
+	                xmlName: "FieldQuote",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            recordSeparator: {
+	                serializedName: "RecordSeparator",
+	                xmlName: "RecordSeparator",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            escapeChar: {
+	                serializedName: "EscapeChar",
+	                xmlName: "EscapeChar",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            headersPresent: {
+	                serializedName: "HeadersPresent",
+	                xmlName: "HasHeaders",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.JsonTextConfiguration = {
+	    serializedName: "JsonTextConfiguration",
+	    xmlName: "JsonTextConfiguration",
+	    type: {
+	        name: "Composite",
+	        className: "JsonTextConfiguration",
+	        modelProperties: {
+	            recordSeparator: {
+	                serializedName: "RecordSeparator",
+	                xmlName: "RecordSeparator",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ArrowConfiguration = {
+	    serializedName: "ArrowConfiguration",
+	    xmlName: "ArrowConfiguration",
+	    type: {
+	        name: "Composite",
+	        className: "ArrowConfiguration",
+	        modelProperties: {
+	            schema: {
+	                serializedName: "Schema",
+	                required: true,
+	                xmlName: "Schema",
+	                xmlIsWrapped: true,
+	                xmlElementName: "Field",
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: {
+	                            name: "Composite",
+	                            className: "ArrowField",
+	                        },
+	                    },
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ArrowField = {
+	    serializedName: "ArrowField",
+	    xmlName: "Field",
+	    type: {
+	        name: "Composite",
+	        className: "ArrowField",
+	        modelProperties: {
+	            type: {
+	                serializedName: "Type",
+	                required: true,
+	                xmlName: "Type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            name: {
+	                serializedName: "Name",
+	                xmlName: "Name",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            precision: {
+	                serializedName: "Precision",
+	                xmlName: "Precision",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            scale: {
+	                serializedName: "Scale",
+	                xmlName: "Scale",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceSetPropertiesHeaders = {
+	    serializedName: "Service_setPropertiesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceSetPropertiesHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceSetPropertiesExceptionHeaders = {
+	    serializedName: "Service_setPropertiesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceSetPropertiesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetPropertiesHeaders = {
+	    serializedName: "Service_getPropertiesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetPropertiesHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetPropertiesExceptionHeaders = {
+	    serializedName: "Service_getPropertiesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetPropertiesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetStatisticsHeaders = {
+	    serializedName: "Service_getStatisticsHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetStatisticsHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetStatisticsExceptionHeaders = {
+	    serializedName: "Service_getStatisticsExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetStatisticsExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceListContainersSegmentHeaders = {
+	    serializedName: "Service_listContainersSegmentHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceListContainersSegmentHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceListContainersSegmentExceptionHeaders = {
+	    serializedName: "Service_listContainersSegmentExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceListContainersSegmentExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetUserDelegationKeyHeaders = {
+	    serializedName: "Service_getUserDelegationKeyHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetUserDelegationKeyHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetUserDelegationKeyExceptionHeaders = {
+	    serializedName: "Service_getUserDelegationKeyExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetUserDelegationKeyExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetAccountInfoHeaders = {
+	    serializedName: "Service_getAccountInfoHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetAccountInfoHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            skuName: {
+	                serializedName: "x-ms-sku-name",
+	                xmlName: "x-ms-sku-name",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "Standard_LRS",
+	                        "Standard_GRS",
+	                        "Standard_RAGRS",
+	                        "Standard_ZRS",
+	                        "Premium_LRS",
+	                    ],
+	                },
+	            },
+	            accountKind: {
+	                serializedName: "x-ms-account-kind",
+	                xmlName: "x-ms-account-kind",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "Storage",
+	                        "BlobStorage",
+	                        "StorageV2",
+	                        "FileStorage",
+	                        "BlockBlobStorage",
+	                    ],
+	                },
+	            },
+	            isHierarchicalNamespaceEnabled: {
+	                serializedName: "x-ms-is-hns-enabled",
+	                xmlName: "x-ms-is-hns-enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceGetAccountInfoExceptionHeaders = {
+	    serializedName: "Service_getAccountInfoExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceGetAccountInfoExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceSubmitBatchHeaders = {
+	    serializedName: "Service_submitBatchHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceSubmitBatchHeaders",
+	        modelProperties: {
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceSubmitBatchExceptionHeaders = {
+	    serializedName: "Service_submitBatchExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceSubmitBatchExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceFilterBlobsHeaders = {
+	    serializedName: "Service_filterBlobsHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceFilterBlobsHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ServiceFilterBlobsExceptionHeaders = {
+	    serializedName: "Service_filterBlobsExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ServiceFilterBlobsExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerCreateHeaders = {
+	    serializedName: "Container_createHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerCreateHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerCreateExceptionHeaders = {
+	    serializedName: "Container_createExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerCreateExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerGetPropertiesHeaders = {
+	    serializedName: "Container_getPropertiesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerGetPropertiesHeaders",
+	        modelProperties: {
+	            metadata: {
+	                serializedName: "x-ms-meta",
+	                headerCollectionPrefix: "x-ms-meta-",
+	                xmlName: "x-ms-meta",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseDuration: {
+	                serializedName: "x-ms-lease-duration",
+	                xmlName: "x-ms-lease-duration",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["infinite", "fixed"],
+	                },
+	            },
+	            leaseState: {
+	                serializedName: "x-ms-lease-state",
+	                xmlName: "x-ms-lease-state",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "available",
+	                        "leased",
+	                        "expired",
+	                        "breaking",
+	                        "broken",
+	                    ],
+	                },
+	            },
+	            leaseStatus: {
+	                serializedName: "x-ms-lease-status",
+	                xmlName: "x-ms-lease-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["locked", "unlocked"],
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobPublicAccess: {
+	                serializedName: "x-ms-blob-public-access",
+	                xmlName: "x-ms-blob-public-access",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["container", "blob"],
+	                },
+	            },
+	            hasImmutabilityPolicy: {
+	                serializedName: "x-ms-has-immutability-policy",
+	                xmlName: "x-ms-has-immutability-policy",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            hasLegalHold: {
+	                serializedName: "x-ms-has-legal-hold",
+	                xmlName: "x-ms-has-legal-hold",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            defaultEncryptionScope: {
+	                serializedName: "x-ms-default-encryption-scope",
+	                xmlName: "x-ms-default-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            denyEncryptionScopeOverride: {
+	                serializedName: "x-ms-deny-encryption-scope-override",
+	                xmlName: "x-ms-deny-encryption-scope-override",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            isImmutableStorageWithVersioningEnabled: {
+	                serializedName: "x-ms-immutable-storage-with-versioning-enabled",
+	                xmlName: "x-ms-immutable-storage-with-versioning-enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerGetPropertiesExceptionHeaders = {
+	    serializedName: "Container_getPropertiesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerGetPropertiesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerDeleteHeaders = {
+	    serializedName: "Container_deleteHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerDeleteHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerDeleteExceptionHeaders = {
+	    serializedName: "Container_deleteExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerDeleteExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerSetMetadataHeaders = {
+	    serializedName: "Container_setMetadataHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerSetMetadataHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerSetMetadataExceptionHeaders = {
+	    serializedName: "Container_setMetadataExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerSetMetadataExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerGetAccessPolicyHeaders = {
+	    serializedName: "Container_getAccessPolicyHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerGetAccessPolicyHeaders",
+	        modelProperties: {
+	            blobPublicAccess: {
+	                serializedName: "x-ms-blob-public-access",
+	                xmlName: "x-ms-blob-public-access",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["container", "blob"],
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerGetAccessPolicyExceptionHeaders = {
+	    serializedName: "Container_getAccessPolicyExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerGetAccessPolicyExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerSetAccessPolicyHeaders = {
+	    serializedName: "Container_setAccessPolicyHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerSetAccessPolicyHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerSetAccessPolicyExceptionHeaders = {
+	    serializedName: "Container_setAccessPolicyExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerSetAccessPolicyExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerRestoreHeaders = {
+	    serializedName: "Container_restoreHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerRestoreHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerRestoreExceptionHeaders = {
+	    serializedName: "Container_restoreExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerRestoreExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerRenameHeaders = {
+	    serializedName: "Container_renameHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerRenameHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerRenameExceptionHeaders = {
+	    serializedName: "Container_renameExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerRenameExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerSubmitBatchHeaders = {
+	    serializedName: "Container_submitBatchHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerSubmitBatchHeaders",
+	        modelProperties: {
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerSubmitBatchExceptionHeaders = {
+	    serializedName: "Container_submitBatchExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerSubmitBatchExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerFilterBlobsHeaders = {
+	    serializedName: "Container_filterBlobsHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerFilterBlobsHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerFilterBlobsExceptionHeaders = {
+	    serializedName: "Container_filterBlobsExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerFilterBlobsExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerAcquireLeaseHeaders = {
+	    serializedName: "Container_acquireLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerAcquireLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseId: {
+	                serializedName: "x-ms-lease-id",
+	                xmlName: "x-ms-lease-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerAcquireLeaseExceptionHeaders = {
+	    serializedName: "Container_acquireLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerAcquireLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerReleaseLeaseHeaders = {
+	    serializedName: "Container_releaseLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerReleaseLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerReleaseLeaseExceptionHeaders = {
+	    serializedName: "Container_releaseLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerReleaseLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerRenewLeaseHeaders = {
+	    serializedName: "Container_renewLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerRenewLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseId: {
+	                serializedName: "x-ms-lease-id",
+	                xmlName: "x-ms-lease-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerRenewLeaseExceptionHeaders = {
+	    serializedName: "Container_renewLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerRenewLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerBreakLeaseHeaders = {
+	    serializedName: "Container_breakLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerBreakLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseTime: {
+	                serializedName: "x-ms-lease-time",
+	                xmlName: "x-ms-lease-time",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerBreakLeaseExceptionHeaders = {
+	    serializedName: "Container_breakLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerBreakLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerChangeLeaseHeaders = {
+	    serializedName: "Container_changeLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerChangeLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseId: {
+	                serializedName: "x-ms-lease-id",
+	                xmlName: "x-ms-lease-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerChangeLeaseExceptionHeaders = {
+	    serializedName: "Container_changeLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerChangeLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerListBlobFlatSegmentHeaders = {
+	    serializedName: "Container_listBlobFlatSegmentHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerListBlobFlatSegmentHeaders",
+	        modelProperties: {
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerListBlobFlatSegmentExceptionHeaders = {
+	    serializedName: "Container_listBlobFlatSegmentExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerListBlobFlatSegmentExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerListBlobHierarchySegmentHeaders = {
+	    serializedName: "Container_listBlobHierarchySegmentHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerListBlobHierarchySegmentHeaders",
+	        modelProperties: {
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerListBlobHierarchySegmentExceptionHeaders = {
+	    serializedName: "Container_listBlobHierarchySegmentExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerListBlobHierarchySegmentExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerGetAccountInfoHeaders = {
+	    serializedName: "Container_getAccountInfoHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerGetAccountInfoHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            skuName: {
+	                serializedName: "x-ms-sku-name",
+	                xmlName: "x-ms-sku-name",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "Standard_LRS",
+	                        "Standard_GRS",
+	                        "Standard_RAGRS",
+	                        "Standard_ZRS",
+	                        "Premium_LRS",
+	                    ],
+	                },
+	            },
+	            accountKind: {
+	                serializedName: "x-ms-account-kind",
+	                xmlName: "x-ms-account-kind",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "Storage",
+	                        "BlobStorage",
+	                        "StorageV2",
+	                        "FileStorage",
+	                        "BlockBlobStorage",
+	                    ],
+	                },
+	            },
+	            isHierarchicalNamespaceEnabled: {
+	                serializedName: "x-ms-is-hns-enabled",
+	                xmlName: "x-ms-is-hns-enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.ContainerGetAccountInfoExceptionHeaders = {
+	    serializedName: "Container_getAccountInfoExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "ContainerGetAccountInfoExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobDownloadHeaders = {
+	    serializedName: "Blob_downloadHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobDownloadHeaders",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            createdOn: {
+	                serializedName: "x-ms-creation-time",
+	                xmlName: "x-ms-creation-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            metadata: {
+	                serializedName: "x-ms-meta",
+	                headerCollectionPrefix: "x-ms-meta-",
+	                xmlName: "x-ms-meta",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            objectReplicationPolicyId: {
+	                serializedName: "x-ms-or-policy-id",
+	                xmlName: "x-ms-or-policy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            objectReplicationRules: {
+	                serializedName: "x-ms-or",
+	                headerCollectionPrefix: "x-ms-or-",
+	                xmlName: "x-ms-or",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            contentLength: {
+	                serializedName: "content-length",
+	                xmlName: "content-length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentRange: {
+	                serializedName: "content-range",
+	                xmlName: "content-range",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            contentEncoding: {
+	                serializedName: "content-encoding",
+	                xmlName: "content-encoding",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            cacheControl: {
+	                serializedName: "cache-control",
+	                xmlName: "cache-control",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentDisposition: {
+	                serializedName: "content-disposition",
+	                xmlName: "content-disposition",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentLanguage: {
+	                serializedName: "content-language",
+	                xmlName: "content-language",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            blobType: {
+	                serializedName: "x-ms-blob-type",
+	                xmlName: "x-ms-blob-type",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
+	                },
+	            },
+	            copyCompletedOn: {
+	                serializedName: "x-ms-copy-completion-time",
+	                xmlName: "x-ms-copy-completion-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyStatusDescription: {
+	                serializedName: "x-ms-copy-status-description",
+	                xmlName: "x-ms-copy-status-description",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyId: {
+	                serializedName: "x-ms-copy-id",
+	                xmlName: "x-ms-copy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyProgress: {
+	                serializedName: "x-ms-copy-progress",
+	                xmlName: "x-ms-copy-progress",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySource: {
+	                serializedName: "x-ms-copy-source",
+	                xmlName: "x-ms-copy-source",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                serializedName: "x-ms-copy-status",
+	                xmlName: "x-ms-copy-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["pending", "success", "aborted", "failed"],
+	                },
+	            },
+	            leaseDuration: {
+	                serializedName: "x-ms-lease-duration",
+	                xmlName: "x-ms-lease-duration",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["infinite", "fixed"],
+	                },
+	            },
+	            leaseState: {
+	                serializedName: "x-ms-lease-state",
+	                xmlName: "x-ms-lease-state",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "available",
+	                        "leased",
+	                        "expired",
+	                        "breaking",
+	                        "broken",
+	                    ],
+	                },
+	            },
+	            leaseStatus: {
+	                serializedName: "x-ms-lease-status",
+	                xmlName: "x-ms-lease-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["locked", "unlocked"],
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            isCurrentVersion: {
+	                serializedName: "x-ms-is-current-version",
+	                xmlName: "x-ms-is-current-version",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            acceptRanges: {
+	                serializedName: "accept-ranges",
+	                xmlName: "accept-ranges",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobCommittedBlockCount: {
+	                serializedName: "x-ms-blob-committed-block-count",
+	                xmlName: "x-ms-blob-committed-block-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-server-encrypted",
+	                xmlName: "x-ms-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobContentMD5: {
+	                serializedName: "x-ms-blob-content-md5",
+	                xmlName: "x-ms-blob-content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            tagCount: {
+	                serializedName: "x-ms-tag-count",
+	                xmlName: "x-ms-tag-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            isSealed: {
+	                serializedName: "x-ms-blob-sealed",
+	                xmlName: "x-ms-blob-sealed",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            lastAccessed: {
+	                serializedName: "x-ms-last-access-time",
+	                xmlName: "x-ms-last-access-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyExpiresOn: {
+	                serializedName: "x-ms-immutability-policy-until-date",
+	                xmlName: "x-ms-immutability-policy-until-date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyMode: {
+	                serializedName: "x-ms-immutability-policy-mode",
+	                xmlName: "x-ms-immutability-policy-mode",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
+	                },
+	            },
+	            legalHold: {
+	                serializedName: "x-ms-legal-hold",
+	                xmlName: "x-ms-legal-hold",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobDownloadExceptionHeaders = {
+	    serializedName: "Blob_downloadExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobDownloadExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobGetPropertiesHeaders = {
+	    serializedName: "Blob_getPropertiesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobGetPropertiesHeaders",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            createdOn: {
+	                serializedName: "x-ms-creation-time",
+	                xmlName: "x-ms-creation-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            metadata: {
+	                serializedName: "x-ms-meta",
+	                headerCollectionPrefix: "x-ms-meta-",
+	                xmlName: "x-ms-meta",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            objectReplicationPolicyId: {
+	                serializedName: "x-ms-or-policy-id",
+	                xmlName: "x-ms-or-policy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            objectReplicationRules: {
+	                serializedName: "x-ms-or",
+	                headerCollectionPrefix: "x-ms-or-",
+	                xmlName: "x-ms-or",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            blobType: {
+	                serializedName: "x-ms-blob-type",
+	                xmlName: "x-ms-blob-type",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
+	                },
+	            },
+	            copyCompletedOn: {
+	                serializedName: "x-ms-copy-completion-time",
+	                xmlName: "x-ms-copy-completion-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyStatusDescription: {
+	                serializedName: "x-ms-copy-status-description",
+	                xmlName: "x-ms-copy-status-description",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyId: {
+	                serializedName: "x-ms-copy-id",
+	                xmlName: "x-ms-copy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyProgress: {
+	                serializedName: "x-ms-copy-progress",
+	                xmlName: "x-ms-copy-progress",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySource: {
+	                serializedName: "x-ms-copy-source",
+	                xmlName: "x-ms-copy-source",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                serializedName: "x-ms-copy-status",
+	                xmlName: "x-ms-copy-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["pending", "success", "aborted", "failed"],
+	                },
+	            },
+	            isIncrementalCopy: {
+	                serializedName: "x-ms-incremental-copy",
+	                xmlName: "x-ms-incremental-copy",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            destinationSnapshot: {
+	                serializedName: "x-ms-copy-destination-snapshot",
+	                xmlName: "x-ms-copy-destination-snapshot",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            leaseDuration: {
+	                serializedName: "x-ms-lease-duration",
+	                xmlName: "x-ms-lease-duration",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["infinite", "fixed"],
+	                },
+	            },
+	            leaseState: {
+	                serializedName: "x-ms-lease-state",
+	                xmlName: "x-ms-lease-state",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "available",
+	                        "leased",
+	                        "expired",
+	                        "breaking",
+	                        "broken",
+	                    ],
+	                },
+	            },
+	            leaseStatus: {
+	                serializedName: "x-ms-lease-status",
+	                xmlName: "x-ms-lease-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["locked", "unlocked"],
+	                },
+	            },
+	            contentLength: {
+	                serializedName: "content-length",
+	                xmlName: "content-length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            contentEncoding: {
+	                serializedName: "content-encoding",
+	                xmlName: "content-encoding",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentDisposition: {
+	                serializedName: "content-disposition",
+	                xmlName: "content-disposition",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentLanguage: {
+	                serializedName: "content-language",
+	                xmlName: "content-language",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            cacheControl: {
+	                serializedName: "cache-control",
+	                xmlName: "cache-control",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            acceptRanges: {
+	                serializedName: "accept-ranges",
+	                xmlName: "accept-ranges",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobCommittedBlockCount: {
+	                serializedName: "x-ms-blob-committed-block-count",
+	                xmlName: "x-ms-blob-committed-block-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-server-encrypted",
+	                xmlName: "x-ms-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            accessTier: {
+	                serializedName: "x-ms-access-tier",
+	                xmlName: "x-ms-access-tier",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            accessTierInferred: {
+	                serializedName: "x-ms-access-tier-inferred",
+	                xmlName: "x-ms-access-tier-inferred",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            archiveStatus: {
+	                serializedName: "x-ms-archive-status",
+	                xmlName: "x-ms-archive-status",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            accessTierChangedOn: {
+	                serializedName: "x-ms-access-tier-change-time",
+	                xmlName: "x-ms-access-tier-change-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            isCurrentVersion: {
+	                serializedName: "x-ms-is-current-version",
+	                xmlName: "x-ms-is-current-version",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            tagCount: {
+	                serializedName: "x-ms-tag-count",
+	                xmlName: "x-ms-tag-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            expiresOn: {
+	                serializedName: "x-ms-expiry-time",
+	                xmlName: "x-ms-expiry-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isSealed: {
+	                serializedName: "x-ms-blob-sealed",
+	                xmlName: "x-ms-blob-sealed",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            rehydratePriority: {
+	                serializedName: "x-ms-rehydrate-priority",
+	                xmlName: "x-ms-rehydrate-priority",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["High", "Standard"],
+	                },
+	            },
+	            lastAccessed: {
+	                serializedName: "x-ms-last-access-time",
+	                xmlName: "x-ms-last-access-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyExpiresOn: {
+	                serializedName: "x-ms-immutability-policy-until-date",
+	                xmlName: "x-ms-immutability-policy-until-date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyMode: {
+	                serializedName: "x-ms-immutability-policy-mode",
+	                xmlName: "x-ms-immutability-policy-mode",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
+	                },
+	            },
+	            legalHold: {
+	                serializedName: "x-ms-legal-hold",
+	                xmlName: "x-ms-legal-hold",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobGetPropertiesExceptionHeaders = {
+	    serializedName: "Blob_getPropertiesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobGetPropertiesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobDeleteHeaders = {
+	    serializedName: "Blob_deleteHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobDeleteHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobDeleteExceptionHeaders = {
+	    serializedName: "Blob_deleteExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobDeleteExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobUndeleteHeaders = {
+	    serializedName: "Blob_undeleteHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobUndeleteHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobUndeleteExceptionHeaders = {
+	    serializedName: "Blob_undeleteExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobUndeleteExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetExpiryHeaders = {
+	    serializedName: "Blob_setExpiryHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetExpiryHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetExpiryExceptionHeaders = {
+	    serializedName: "Blob_setExpiryExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetExpiryExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetHttpHeadersHeaders = {
+	    serializedName: "Blob_setHttpHeadersHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetHttpHeadersHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetHttpHeadersExceptionHeaders = {
+	    serializedName: "Blob_setHttpHeadersExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetHttpHeadersExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetImmutabilityPolicyHeaders = {
+	    serializedName: "Blob_setImmutabilityPolicyHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetImmutabilityPolicyHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyExpiry: {
+	                serializedName: "x-ms-immutability-policy-until-date",
+	                xmlName: "x-ms-immutability-policy-until-date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            immutabilityPolicyMode: {
+	                serializedName: "x-ms-immutability-policy-mode",
+	                xmlName: "x-ms-immutability-policy-mode",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["Mutable", "Unlocked", "Locked"],
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetImmutabilityPolicyExceptionHeaders = {
+	    serializedName: "Blob_setImmutabilityPolicyExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetImmutabilityPolicyExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobDeleteImmutabilityPolicyHeaders = {
+	    serializedName: "Blob_deleteImmutabilityPolicyHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobDeleteImmutabilityPolicyHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobDeleteImmutabilityPolicyExceptionHeaders = {
+	    serializedName: "Blob_deleteImmutabilityPolicyExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobDeleteImmutabilityPolicyExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetLegalHoldHeaders = {
+	    serializedName: "Blob_setLegalHoldHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetLegalHoldHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            legalHold: {
+	                serializedName: "x-ms-legal-hold",
+	                xmlName: "x-ms-legal-hold",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetLegalHoldExceptionHeaders = {
+	    serializedName: "Blob_setLegalHoldExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetLegalHoldExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetMetadataHeaders = {
+	    serializedName: "Blob_setMetadataHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetMetadataHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetMetadataExceptionHeaders = {
+	    serializedName: "Blob_setMetadataExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetMetadataExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobAcquireLeaseHeaders = {
+	    serializedName: "Blob_acquireLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobAcquireLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseId: {
+	                serializedName: "x-ms-lease-id",
+	                xmlName: "x-ms-lease-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobAcquireLeaseExceptionHeaders = {
+	    serializedName: "Blob_acquireLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobAcquireLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobReleaseLeaseHeaders = {
+	    serializedName: "Blob_releaseLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobReleaseLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobReleaseLeaseExceptionHeaders = {
+	    serializedName: "Blob_releaseLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobReleaseLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobRenewLeaseHeaders = {
+	    serializedName: "Blob_renewLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobRenewLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseId: {
+	                serializedName: "x-ms-lease-id",
+	                xmlName: "x-ms-lease-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobRenewLeaseExceptionHeaders = {
+	    serializedName: "Blob_renewLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobRenewLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobChangeLeaseHeaders = {
+	    serializedName: "Blob_changeLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobChangeLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            leaseId: {
+	                serializedName: "x-ms-lease-id",
+	                xmlName: "x-ms-lease-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobChangeLeaseExceptionHeaders = {
+	    serializedName: "Blob_changeLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobChangeLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobBreakLeaseHeaders = {
+	    serializedName: "Blob_breakLeaseHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobBreakLeaseHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            leaseTime: {
+	                serializedName: "x-ms-lease-time",
+	                xmlName: "x-ms-lease-time",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobBreakLeaseExceptionHeaders = {
+	    serializedName: "Blob_breakLeaseExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobBreakLeaseExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobCreateSnapshotHeaders = {
+	    serializedName: "Blob_createSnapshotHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobCreateSnapshotHeaders",
+	        modelProperties: {
+	            snapshot: {
+	                serializedName: "x-ms-snapshot",
+	                xmlName: "x-ms-snapshot",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobCreateSnapshotExceptionHeaders = {
+	    serializedName: "Blob_createSnapshotExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobCreateSnapshotExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobStartCopyFromURLHeaders = {
+	    serializedName: "Blob_startCopyFromURLHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobStartCopyFromURLHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyId: {
+	                serializedName: "x-ms-copy-id",
+	                xmlName: "x-ms-copy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                serializedName: "x-ms-copy-status",
+	                xmlName: "x-ms-copy-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["pending", "success", "aborted", "failed"],
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobStartCopyFromURLExceptionHeaders = {
+	    serializedName: "Blob_startCopyFromURLExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobStartCopyFromURLExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "x-ms-copy-source-error-code",
+	                xmlName: "x-ms-copy-source-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "x-ms-copy-source-status-code",
+	                xmlName: "x-ms-copy-source-status-code",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobCopyFromURLHeaders = {
+	    serializedName: "Blob_copyFromURLHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobCopyFromURLHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyId: {
+	                serializedName: "x-ms-copy-id",
+	                xmlName: "x-ms-copy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                defaultValue: "success",
+	                isConstant: true,
+	                serializedName: "x-ms-copy-status",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobCopyFromURLExceptionHeaders = {
+	    serializedName: "Blob_copyFromURLExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobCopyFromURLExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "x-ms-copy-source-error-code",
+	                xmlName: "x-ms-copy-source-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "x-ms-copy-source-status-code",
+	                xmlName: "x-ms-copy-source-status-code",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobAbortCopyFromURLHeaders = {
+	    serializedName: "Blob_abortCopyFromURLHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobAbortCopyFromURLHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobAbortCopyFromURLExceptionHeaders = {
+	    serializedName: "Blob_abortCopyFromURLExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobAbortCopyFromURLExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetTierHeaders = {
+	    serializedName: "Blob_setTierHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetTierHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetTierExceptionHeaders = {
+	    serializedName: "Blob_setTierExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetTierExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobGetAccountInfoHeaders = {
+	    serializedName: "Blob_getAccountInfoHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobGetAccountInfoHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            skuName: {
+	                serializedName: "x-ms-sku-name",
+	                xmlName: "x-ms-sku-name",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "Standard_LRS",
+	                        "Standard_GRS",
+	                        "Standard_RAGRS",
+	                        "Standard_ZRS",
+	                        "Premium_LRS",
+	                    ],
+	                },
+	            },
+	            accountKind: {
+	                serializedName: "x-ms-account-kind",
+	                xmlName: "x-ms-account-kind",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "Storage",
+	                        "BlobStorage",
+	                        "StorageV2",
+	                        "FileStorage",
+	                        "BlockBlobStorage",
+	                    ],
+	                },
+	            },
+	            isHierarchicalNamespaceEnabled: {
+	                serializedName: "x-ms-is-hns-enabled",
+	                xmlName: "x-ms-is-hns-enabled",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobGetAccountInfoExceptionHeaders = {
+	    serializedName: "Blob_getAccountInfoExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobGetAccountInfoExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobQueryHeaders = {
+	    serializedName: "Blob_queryHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobQueryHeaders",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            metadata: {
+	                serializedName: "x-ms-meta",
+	                headerCollectionPrefix: "x-ms-meta-",
+	                xmlName: "x-ms-meta",
+	                type: {
+	                    name: "Dictionary",
+	                    value: { type: { name: "String" } },
+	                },
+	            },
+	            contentLength: {
+	                serializedName: "content-length",
+	                xmlName: "content-length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentRange: {
+	                serializedName: "content-range",
+	                xmlName: "content-range",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            contentEncoding: {
+	                serializedName: "content-encoding",
+	                xmlName: "content-encoding",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            cacheControl: {
+	                serializedName: "cache-control",
+	                xmlName: "cache-control",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentDisposition: {
+	                serializedName: "content-disposition",
+	                xmlName: "content-disposition",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentLanguage: {
+	                serializedName: "content-language",
+	                xmlName: "content-language",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            blobType: {
+	                serializedName: "x-ms-blob-type",
+	                xmlName: "x-ms-blob-type",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
+	                },
+	            },
+	            copyCompletionTime: {
+	                serializedName: "x-ms-copy-completion-time",
+	                xmlName: "x-ms-copy-completion-time",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyStatusDescription: {
+	                serializedName: "x-ms-copy-status-description",
+	                xmlName: "x-ms-copy-status-description",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyId: {
+	                serializedName: "x-ms-copy-id",
+	                xmlName: "x-ms-copy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyProgress: {
+	                serializedName: "x-ms-copy-progress",
+	                xmlName: "x-ms-copy-progress",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySource: {
+	                serializedName: "x-ms-copy-source",
+	                xmlName: "x-ms-copy-source",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                serializedName: "x-ms-copy-status",
+	                xmlName: "x-ms-copy-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["pending", "success", "aborted", "failed"],
+	                },
+	            },
+	            leaseDuration: {
+	                serializedName: "x-ms-lease-duration",
+	                xmlName: "x-ms-lease-duration",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["infinite", "fixed"],
+	                },
+	            },
+	            leaseState: {
+	                serializedName: "x-ms-lease-state",
+	                xmlName: "x-ms-lease-state",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "available",
+	                        "leased",
+	                        "expired",
+	                        "breaking",
+	                        "broken",
+	                    ],
+	                },
+	            },
+	            leaseStatus: {
+	                serializedName: "x-ms-lease-status",
+	                xmlName: "x-ms-lease-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["locked", "unlocked"],
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            acceptRanges: {
+	                serializedName: "accept-ranges",
+	                xmlName: "accept-ranges",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobCommittedBlockCount: {
+	                serializedName: "x-ms-blob-committed-block-count",
+	                xmlName: "x-ms-blob-committed-block-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-server-encrypted",
+	                xmlName: "x-ms-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobContentMD5: {
+	                serializedName: "x-ms-blob-content-md5",
+	                xmlName: "x-ms-blob-content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobQueryExceptionHeaders = {
+	    serializedName: "Blob_queryExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobQueryExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobGetTagsHeaders = {
+	    serializedName: "Blob_getTagsHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobGetTagsHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobGetTagsExceptionHeaders = {
+	    serializedName: "Blob_getTagsExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobGetTagsExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetTagsHeaders = {
+	    serializedName: "Blob_setTagsHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetTagsHeaders",
+	        modelProperties: {
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlobSetTagsExceptionHeaders = {
+	    serializedName: "Blob_setTagsExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlobSetTagsExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobCreateHeaders = {
+	    serializedName: "PageBlob_createHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobCreateHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobCreateExceptionHeaders = {
+	    serializedName: "PageBlob_createExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobCreateExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobUploadPagesHeaders = {
+	    serializedName: "PageBlob_uploadPagesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobUploadPagesHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobUploadPagesExceptionHeaders = {
+	    serializedName: "PageBlob_uploadPagesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobUploadPagesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobClearPagesHeaders = {
+	    serializedName: "PageBlob_clearPagesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobClearPagesHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobClearPagesExceptionHeaders = {
+	    serializedName: "PageBlob_clearPagesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobClearPagesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobUploadPagesFromURLHeaders = {
+	    serializedName: "PageBlob_uploadPagesFromURLHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobUploadPagesFromURLHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobUploadPagesFromURLExceptionHeaders = {
+	    serializedName: "PageBlob_uploadPagesFromURLExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobUploadPagesFromURLExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "x-ms-copy-source-error-code",
+	                xmlName: "x-ms-copy-source-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "x-ms-copy-source-status-code",
+	                xmlName: "x-ms-copy-source-status-code",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobGetPageRangesHeaders = {
+	    serializedName: "PageBlob_getPageRangesHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobGetPageRangesHeaders",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobContentLength: {
+	                serializedName: "x-ms-blob-content-length",
+	                xmlName: "x-ms-blob-content-length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobGetPageRangesExceptionHeaders = {
+	    serializedName: "PageBlob_getPageRangesExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobGetPageRangesExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobGetPageRangesDiffHeaders = {
+	    serializedName: "PageBlob_getPageRangesDiffHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobGetPageRangesDiffHeaders",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobContentLength: {
+	                serializedName: "x-ms-blob-content-length",
+	                xmlName: "x-ms-blob-content-length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobGetPageRangesDiffExceptionHeaders = {
+	    serializedName: "PageBlob_getPageRangesDiffExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobGetPageRangesDiffExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobResizeHeaders = {
+	    serializedName: "PageBlob_resizeHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobResizeHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobResizeExceptionHeaders = {
+	    serializedName: "PageBlob_resizeExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobResizeExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobUpdateSequenceNumberHeaders = {
+	    serializedName: "PageBlob_updateSequenceNumberHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobUpdateSequenceNumberHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobSequenceNumber: {
+	                serializedName: "x-ms-blob-sequence-number",
+	                xmlName: "x-ms-blob-sequence-number",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobUpdateSequenceNumberExceptionHeaders = {
+	    serializedName: "PageBlob_updateSequenceNumberExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobUpdateSequenceNumberExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobCopyIncrementalHeaders = {
+	    serializedName: "PageBlob_copyIncrementalHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobCopyIncrementalHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            copyId: {
+	                serializedName: "x-ms-copy-id",
+	                xmlName: "x-ms-copy-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copyStatus: {
+	                serializedName: "x-ms-copy-status",
+	                xmlName: "x-ms-copy-status",
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["pending", "success", "aborted", "failed"],
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.PageBlobCopyIncrementalExceptionHeaders = {
+	    serializedName: "PageBlob_copyIncrementalExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "PageBlobCopyIncrementalExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobCreateHeaders = {
+	    serializedName: "AppendBlob_createHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobCreateHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobCreateExceptionHeaders = {
+	    serializedName: "AppendBlob_createExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobCreateExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobAppendBlockHeaders = {
+	    serializedName: "AppendBlob_appendBlockHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobAppendBlockHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobAppendOffset: {
+	                serializedName: "x-ms-blob-append-offset",
+	                xmlName: "x-ms-blob-append-offset",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobCommittedBlockCount: {
+	                serializedName: "x-ms-blob-committed-block-count",
+	                xmlName: "x-ms-blob-committed-block-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobAppendBlockExceptionHeaders = {
+	    serializedName: "AppendBlob_appendBlockExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobAppendBlockExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobAppendBlockFromUrlHeaders = {
+	    serializedName: "AppendBlob_appendBlockFromUrlHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobAppendBlockFromUrlHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            blobAppendOffset: {
+	                serializedName: "x-ms-blob-append-offset",
+	                xmlName: "x-ms-blob-append-offset",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobCommittedBlockCount: {
+	                serializedName: "x-ms-blob-committed-block-count",
+	                xmlName: "x-ms-blob-committed-block-count",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobAppendBlockFromUrlExceptionHeaders = {
+	    serializedName: "AppendBlob_appendBlockFromUrlExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobAppendBlockFromUrlExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "x-ms-copy-source-error-code",
+	                xmlName: "x-ms-copy-source-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "x-ms-copy-source-status-code",
+	                xmlName: "x-ms-copy-source-status-code",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobSealHeaders = {
+	    serializedName: "AppendBlob_sealHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobSealHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isSealed: {
+	                serializedName: "x-ms-blob-sealed",
+	                xmlName: "x-ms-blob-sealed",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.AppendBlobSealExceptionHeaders = {
+	    serializedName: "AppendBlob_sealExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "AppendBlobSealExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobUploadHeaders = {
+	    serializedName: "BlockBlob_uploadHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobUploadHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobUploadExceptionHeaders = {
+	    serializedName: "BlockBlob_uploadExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobUploadExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobPutBlobFromUrlHeaders = {
+	    serializedName: "BlockBlob_putBlobFromUrlHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobPutBlobFromUrlHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobPutBlobFromUrlExceptionHeaders = {
+	    serializedName: "BlockBlob_putBlobFromUrlExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobPutBlobFromUrlExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "x-ms-copy-source-error-code",
+	                xmlName: "x-ms-copy-source-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "x-ms-copy-source-status-code",
+	                xmlName: "x-ms-copy-source-status-code",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobStageBlockHeaders = {
+	    serializedName: "BlockBlob_stageBlockHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobStageBlockHeaders",
+	        modelProperties: {
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobStageBlockExceptionHeaders = {
+	    serializedName: "BlockBlob_stageBlockExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobStageBlockExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobStageBlockFromURLHeaders = {
+	    serializedName: "BlockBlob_stageBlockFromURLHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobStageBlockFromURLHeaders",
+	        modelProperties: {
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobStageBlockFromURLExceptionHeaders = {
+	    serializedName: "BlockBlob_stageBlockFromURLExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobStageBlockFromURLExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceErrorCode: {
+	                serializedName: "x-ms-copy-source-error-code",
+	                xmlName: "x-ms-copy-source-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            copySourceStatusCode: {
+	                serializedName: "x-ms-copy-source-status-code",
+	                xmlName: "x-ms-copy-source-status-code",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobCommitBlockListHeaders = {
+	    serializedName: "BlockBlob_commitBlockListHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobCommitBlockListHeaders",
+	        modelProperties: {
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            contentMD5: {
+	                serializedName: "content-md5",
+	                xmlName: "content-md5",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            xMsContentCrc64: {
+	                serializedName: "x-ms-content-crc64",
+	                xmlName: "x-ms-content-crc64",
+	                type: {
+	                    name: "ByteArray",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            versionId: {
+	                serializedName: "x-ms-version-id",
+	                xmlName: "x-ms-version-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            isServerEncrypted: {
+	                serializedName: "x-ms-request-server-encrypted",
+	                xmlName: "x-ms-request-server-encrypted",
+	                type: {
+	                    name: "Boolean",
+	                },
+	            },
+	            encryptionKeySha256: {
+	                serializedName: "x-ms-encryption-key-sha256",
+	                xmlName: "x-ms-encryption-key-sha256",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            encryptionScope: {
+	                serializedName: "x-ms-encryption-scope",
+	                xmlName: "x-ms-encryption-scope",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobCommitBlockListExceptionHeaders = {
+	    serializedName: "BlockBlob_commitBlockListExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobCommitBlockListExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobGetBlockListHeaders = {
+	    serializedName: "BlockBlob_getBlockListHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobGetBlockListHeaders",
+	        modelProperties: {
+	            lastModified: {
+	                serializedName: "last-modified",
+	                xmlName: "last-modified",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            etag: {
+	                serializedName: "etag",
+	                xmlName: "etag",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            contentType: {
+	                serializedName: "content-type",
+	                xmlName: "content-type",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            blobContentLength: {
+	                serializedName: "x-ms-blob-content-length",
+	                xmlName: "x-ms-blob-content-length",
+	                type: {
+	                    name: "Number",
+	                },
+	            },
+	            clientRequestId: {
+	                serializedName: "x-ms-client-request-id",
+	                xmlName: "x-ms-client-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            requestId: {
+	                serializedName: "x-ms-request-id",
+	                xmlName: "x-ms-request-id",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            version: {
+	                serializedName: "x-ms-version",
+	                xmlName: "x-ms-version",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	            date: {
+	                serializedName: "date",
+	                xmlName: "date",
+	                type: {
+	                    name: "DateTimeRfc1123",
+	                },
+	            },
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	mappers.BlockBlobGetBlockListExceptionHeaders = {
+	    serializedName: "BlockBlob_getBlockListExceptionHeaders",
+	    type: {
+	        name: "Composite",
+	        className: "BlockBlobGetBlockListExceptionHeaders",
+	        modelProperties: {
+	            errorCode: {
+	                serializedName: "x-ms-error-code",
+	                xmlName: "x-ms-error-code",
+	                type: {
+	                    name: "String",
+	                },
+	            },
+	        },
+	    },
+	};
+	
+	return mappers;
+}
+
+var parameters = {};
+
+var hasRequiredParameters;
+
+function requireParameters () {
+	if (hasRequiredParameters) return parameters;
+	hasRequiredParameters = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(parameters, "__esModule", { value: true });
+	parameters.action3 = parameters.action2 = parameters.leaseId1 = parameters.action1 = parameters.proposedLeaseId = parameters.duration = parameters.action = parameters.comp10 = parameters.sourceLeaseId = parameters.sourceContainerName = parameters.comp9 = parameters.deletedContainerVersion = parameters.deletedContainerName = parameters.comp8 = parameters.containerAcl = parameters.comp7 = parameters.comp6 = parameters.ifUnmodifiedSince = parameters.ifModifiedSince = parameters.leaseId = parameters.preventEncryptionScopeOverride = parameters.defaultEncryptionScope = parameters.access = parameters.metadata = parameters.restype2 = parameters.where = parameters.comp5 = parameters.multipartContentType = parameters.contentLength = parameters.comp4 = parameters.body = parameters.restype1 = parameters.comp3 = parameters.keyInfo = parameters.include = parameters.maxPageSize = parameters.marker = parameters.prefix = parameters.comp2 = parameters.comp1 = parameters.accept1 = parameters.requestId = parameters.version = parameters.timeoutInSeconds = parameters.comp = parameters.restype = parameters.url = parameters.accept = parameters.blobServiceProperties = parameters.contentType = void 0;
+	parameters.fileRequestIntent = parameters.copySourceTags = parameters.copySourceAuthorization = parameters.sourceContentMD5 = parameters.xMsRequiresSync = parameters.legalHold1 = parameters.sealBlob = parameters.blobTagsString = parameters.copySource = parameters.sourceIfTags = parameters.sourceIfNoneMatch = parameters.sourceIfMatch = parameters.sourceIfUnmodifiedSince = parameters.sourceIfModifiedSince = parameters.rehydratePriority = parameters.tier = parameters.comp14 = parameters.encryptionScope = parameters.legalHold = parameters.comp13 = parameters.immutabilityPolicyMode = parameters.immutabilityPolicyExpiry = parameters.comp12 = parameters.blobContentDisposition = parameters.blobContentLanguage = parameters.blobContentEncoding = parameters.blobContentMD5 = parameters.blobContentType = parameters.blobCacheControl = parameters.expiresOn = parameters.expiryOptions = parameters.comp11 = parameters.blobDeleteType = parameters.deleteSnapshots = parameters.ifTags = parameters.ifNoneMatch = parameters.ifMatch = parameters.encryptionAlgorithm = parameters.encryptionKeySha256 = parameters.encryptionKey = parameters.rangeGetContentCRC64 = parameters.rangeGetContentMD5 = parameters.range = parameters.versionId = parameters.snapshot = parameters.delimiter = parameters.include1 = parameters.proposedLeaseId1 = parameters.action4 = parameters.breakPeriod = void 0;
+	parameters.listType = parameters.comp25 = parameters.blocks = parameters.blockId = parameters.comp24 = parameters.copySourceBlobProperties = parameters.blobType2 = parameters.comp23 = parameters.sourceRange1 = parameters.appendPosition = parameters.maxSize = parameters.comp22 = parameters.blobType1 = parameters.comp21 = parameters.sequenceNumberAction = parameters.prevSnapshotUrl = parameters.prevsnapshot = parameters.comp20 = parameters.range1 = parameters.sourceContentCrc64 = parameters.sourceRange = parameters.sourceUrl = parameters.pageWrite1 = parameters.ifSequenceNumberEqualTo = parameters.ifSequenceNumberLessThan = parameters.ifSequenceNumberLessThanOrEqualTo = parameters.pageWrite = parameters.comp19 = parameters.accept2 = parameters.body1 = parameters.contentType1 = parameters.blobSequenceNumber = parameters.blobContentLength = parameters.blobType = parameters.transactionalContentCrc64 = parameters.transactionalContentMD5 = parameters.tags = parameters.comp18 = parameters.comp17 = parameters.queryRequest = parameters.tier1 = parameters.comp16 = parameters.copyId = parameters.copyActionAbortConstant = parameters.comp15 = void 0;
+	const mappers_js_1 = requireMappers();
+	parameters.contentType = {
+	    parameterPath: ["options", "contentType"],
+	    mapper: {
+	        defaultValue: "application/xml",
+	        isConstant: true,
+	        serializedName: "Content-Type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobServiceProperties = {
+	    parameterPath: "blobServiceProperties",
+	    mapper: mappers_js_1.BlobServiceProperties,
+	};
+	parameters.accept = {
+	    parameterPath: "accept",
+	    mapper: {
+	        defaultValue: "application/xml",
+	        isConstant: true,
+	        serializedName: "Accept",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.url = {
+	    parameterPath: "url",
+	    mapper: {
+	        serializedName: "url",
+	        required: true,
+	        xmlName: "url",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	    skipEncoding: true,
+	};
+	parameters.restype = {
+	    parameterPath: "restype",
+	    mapper: {
+	        defaultValue: "service",
+	        isConstant: true,
+	        serializedName: "restype",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "properties",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.timeoutInSeconds = {
+	    parameterPath: ["options", "timeoutInSeconds"],
+	    mapper: {
+	        constraints: {
+	            InclusiveMinimum: 0,
+	        },
+	        serializedName: "timeout",
+	        xmlName: "timeout",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.version = {
+	    parameterPath: "version",
+	    mapper: {
+	        defaultValue: "2025-11-05",
+	        isConstant: true,
+	        serializedName: "x-ms-version",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.requestId = {
+	    parameterPath: ["options", "requestId"],
+	    mapper: {
+	        serializedName: "x-ms-client-request-id",
+	        xmlName: "x-ms-client-request-id",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.accept1 = {
+	    parameterPath: "accept",
+	    mapper: {
+	        defaultValue: "application/xml",
+	        isConstant: true,
+	        serializedName: "Accept",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp1 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "stats",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp2 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "list",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.prefix = {
+	    parameterPath: ["options", "prefix"],
+	    mapper: {
+	        serializedName: "prefix",
+	        xmlName: "prefix",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.marker = {
+	    parameterPath: ["options", "marker"],
+	    mapper: {
+	        serializedName: "marker",
+	        xmlName: "marker",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.maxPageSize = {
+	    parameterPath: ["options", "maxPageSize"],
+	    mapper: {
+	        constraints: {
+	            InclusiveMinimum: 1,
+	        },
+	        serializedName: "maxresults",
+	        xmlName: "maxresults",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.include = {
+	    parameterPath: ["options", "include"],
+	    mapper: {
+	        serializedName: "include",
+	        xmlName: "include",
+	        xmlElementName: "ListContainersIncludeType",
+	        type: {
+	            name: "Sequence",
+	            element: {
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: ["metadata", "deleted", "system"],
+	                },
+	            },
+	        },
+	    },
+	    collectionFormat: "CSV",
+	};
+	parameters.keyInfo = {
+	    parameterPath: "keyInfo",
+	    mapper: mappers_js_1.KeyInfo,
+	};
+	parameters.comp3 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "userdelegationkey",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.restype1 = {
+	    parameterPath: "restype",
+	    mapper: {
+	        defaultValue: "account",
+	        isConstant: true,
+	        serializedName: "restype",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.body = {
+	    parameterPath: "body",
+	    mapper: {
+	        serializedName: "body",
+	        required: true,
+	        xmlName: "body",
+	        type: {
+	            name: "Stream",
+	        },
+	    },
+	};
+	parameters.comp4 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "batch",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.contentLength = {
+	    parameterPath: "contentLength",
+	    mapper: {
+	        serializedName: "Content-Length",
+	        required: true,
+	        xmlName: "Content-Length",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.multipartContentType = {
+	    parameterPath: "multipartContentType",
+	    mapper: {
+	        serializedName: "Content-Type",
+	        required: true,
+	        xmlName: "Content-Type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp5 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "blobs",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.where = {
+	    parameterPath: ["options", "where"],
+	    mapper: {
+	        serializedName: "where",
+	        xmlName: "where",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.restype2 = {
+	    parameterPath: "restype",
+	    mapper: {
+	        defaultValue: "container",
+	        isConstant: true,
+	        serializedName: "restype",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.metadata = {
+	    parameterPath: ["options", "metadata"],
+	    mapper: {
+	        serializedName: "x-ms-meta",
+	        xmlName: "x-ms-meta",
+	        headerCollectionPrefix: "x-ms-meta-",
+	        type: {
+	            name: "Dictionary",
+	            value: { type: { name: "String" } },
+	        },
+	    },
+	};
+	parameters.access = {
+	    parameterPath: ["options", "access"],
+	    mapper: {
+	        serializedName: "x-ms-blob-public-access",
+	        xmlName: "x-ms-blob-public-access",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["container", "blob"],
+	        },
+	    },
+	};
+	parameters.defaultEncryptionScope = {
+	    parameterPath: [
+	        "options",
+	        "containerEncryptionScope",
+	        "defaultEncryptionScope",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-default-encryption-scope",
+	        xmlName: "x-ms-default-encryption-scope",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.preventEncryptionScopeOverride = {
+	    parameterPath: [
+	        "options",
+	        "containerEncryptionScope",
+	        "preventEncryptionScopeOverride",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-deny-encryption-scope-override",
+	        xmlName: "x-ms-deny-encryption-scope-override",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.leaseId = {
+	    parameterPath: ["options", "leaseAccessConditions", "leaseId"],
+	    mapper: {
+	        serializedName: "x-ms-lease-id",
+	        xmlName: "x-ms-lease-id",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.ifModifiedSince = {
+	    parameterPath: ["options", "modifiedAccessConditions", "ifModifiedSince"],
+	    mapper: {
+	        serializedName: "If-Modified-Since",
+	        xmlName: "If-Modified-Since",
+	        type: {
+	            name: "DateTimeRfc1123",
+	        },
+	    },
+	};
+	parameters.ifUnmodifiedSince = {
+	    parameterPath: ["options", "modifiedAccessConditions", "ifUnmodifiedSince"],
+	    mapper: {
+	        serializedName: "If-Unmodified-Since",
+	        xmlName: "If-Unmodified-Since",
+	        type: {
+	            name: "DateTimeRfc1123",
+	        },
+	    },
+	};
+	parameters.comp6 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "metadata",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp7 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "acl",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.containerAcl = {
+	    parameterPath: ["options", "containerAcl"],
+	    mapper: {
+	        serializedName: "containerAcl",
+	        xmlName: "SignedIdentifiers",
+	        xmlIsWrapped: true,
+	        xmlElementName: "SignedIdentifier",
+	        type: {
+	            name: "Sequence",
+	            element: {
+	                type: {
+	                    name: "Composite",
+	                    className: "SignedIdentifier",
+	                },
+	            },
+	        },
+	    },
+	};
+	parameters.comp8 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "undelete",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.deletedContainerName = {
+	    parameterPath: ["options", "deletedContainerName"],
+	    mapper: {
+	        serializedName: "x-ms-deleted-container-name",
+	        xmlName: "x-ms-deleted-container-name",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.deletedContainerVersion = {
+	    parameterPath: ["options", "deletedContainerVersion"],
+	    mapper: {
+	        serializedName: "x-ms-deleted-container-version",
+	        xmlName: "x-ms-deleted-container-version",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp9 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "rename",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceContainerName = {
+	    parameterPath: "sourceContainerName",
+	    mapper: {
+	        serializedName: "x-ms-source-container-name",
+	        required: true,
+	        xmlName: "x-ms-source-container-name",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceLeaseId = {
+	    parameterPath: ["options", "sourceLeaseId"],
+	    mapper: {
+	        serializedName: "x-ms-source-lease-id",
+	        xmlName: "x-ms-source-lease-id",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp10 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "lease",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.action = {
+	    parameterPath: "action",
+	    mapper: {
+	        defaultValue: "acquire",
+	        isConstant: true,
+	        serializedName: "x-ms-lease-action",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.duration = {
+	    parameterPath: ["options", "duration"],
+	    mapper: {
+	        serializedName: "x-ms-lease-duration",
+	        xmlName: "x-ms-lease-duration",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.proposedLeaseId = {
+	    parameterPath: ["options", "proposedLeaseId"],
+	    mapper: {
+	        serializedName: "x-ms-proposed-lease-id",
+	        xmlName: "x-ms-proposed-lease-id",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.action1 = {
+	    parameterPath: "action",
+	    mapper: {
+	        defaultValue: "release",
+	        isConstant: true,
+	        serializedName: "x-ms-lease-action",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.leaseId1 = {
+	    parameterPath: "leaseId",
+	    mapper: {
+	        serializedName: "x-ms-lease-id",
+	        required: true,
+	        xmlName: "x-ms-lease-id",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.action2 = {
+	    parameterPath: "action",
+	    mapper: {
+	        defaultValue: "renew",
+	        isConstant: true,
+	        serializedName: "x-ms-lease-action",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.action3 = {
+	    parameterPath: "action",
+	    mapper: {
+	        defaultValue: "break",
+	        isConstant: true,
+	        serializedName: "x-ms-lease-action",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.breakPeriod = {
+	    parameterPath: ["options", "breakPeriod"],
+	    mapper: {
+	        serializedName: "x-ms-lease-break-period",
+	        xmlName: "x-ms-lease-break-period",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.action4 = {
+	    parameterPath: "action",
+	    mapper: {
+	        defaultValue: "change",
+	        isConstant: true,
+	        serializedName: "x-ms-lease-action",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.proposedLeaseId1 = {
+	    parameterPath: "proposedLeaseId",
+	    mapper: {
+	        serializedName: "x-ms-proposed-lease-id",
+	        required: true,
+	        xmlName: "x-ms-proposed-lease-id",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.include1 = {
+	    parameterPath: ["options", "include"],
+	    mapper: {
+	        serializedName: "include",
+	        xmlName: "include",
+	        xmlElementName: "ListBlobsIncludeItem",
+	        type: {
+	            name: "Sequence",
+	            element: {
+	                type: {
+	                    name: "Enum",
+	                    allowedValues: [
+	                        "copy",
+	                        "deleted",
+	                        "metadata",
+	                        "snapshots",
+	                        "uncommittedblobs",
+	                        "versions",
+	                        "tags",
+	                        "immutabilitypolicy",
+	                        "legalhold",
+	                        "deletedwithversions",
+	                    ],
+	                },
+	            },
+	        },
+	    },
+	    collectionFormat: "CSV",
+	};
+	parameters.delimiter = {
+	    parameterPath: "delimiter",
+	    mapper: {
+	        serializedName: "delimiter",
+	        required: true,
+	        xmlName: "delimiter",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.snapshot = {
+	    parameterPath: ["options", "snapshot"],
+	    mapper: {
+	        serializedName: "snapshot",
+	        xmlName: "snapshot",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.versionId = {
+	    parameterPath: ["options", "versionId"],
+	    mapper: {
+	        serializedName: "versionid",
+	        xmlName: "versionid",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.range = {
+	    parameterPath: ["options", "range"],
+	    mapper: {
+	        serializedName: "x-ms-range",
+	        xmlName: "x-ms-range",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.rangeGetContentMD5 = {
+	    parameterPath: ["options", "rangeGetContentMD5"],
+	    mapper: {
+	        serializedName: "x-ms-range-get-content-md5",
+	        xmlName: "x-ms-range-get-content-md5",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.rangeGetContentCRC64 = {
+	    parameterPath: ["options", "rangeGetContentCRC64"],
+	    mapper: {
+	        serializedName: "x-ms-range-get-content-crc64",
+	        xmlName: "x-ms-range-get-content-crc64",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.encryptionKey = {
+	    parameterPath: ["options", "cpkInfo", "encryptionKey"],
+	    mapper: {
+	        serializedName: "x-ms-encryption-key",
+	        xmlName: "x-ms-encryption-key",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.encryptionKeySha256 = {
+	    parameterPath: ["options", "cpkInfo", "encryptionKeySha256"],
+	    mapper: {
+	        serializedName: "x-ms-encryption-key-sha256",
+	        xmlName: "x-ms-encryption-key-sha256",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.encryptionAlgorithm = {
+	    parameterPath: ["options", "cpkInfo", "encryptionAlgorithm"],
+	    mapper: {
+	        serializedName: "x-ms-encryption-algorithm",
+	        xmlName: "x-ms-encryption-algorithm",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.ifMatch = {
+	    parameterPath: ["options", "modifiedAccessConditions", "ifMatch"],
+	    mapper: {
+	        serializedName: "If-Match",
+	        xmlName: "If-Match",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.ifNoneMatch = {
+	    parameterPath: ["options", "modifiedAccessConditions", "ifNoneMatch"],
+	    mapper: {
+	        serializedName: "If-None-Match",
+	        xmlName: "If-None-Match",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.ifTags = {
+	    parameterPath: ["options", "modifiedAccessConditions", "ifTags"],
+	    mapper: {
+	        serializedName: "x-ms-if-tags",
+	        xmlName: "x-ms-if-tags",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.deleteSnapshots = {
+	    parameterPath: ["options", "deleteSnapshots"],
+	    mapper: {
+	        serializedName: "x-ms-delete-snapshots",
+	        xmlName: "x-ms-delete-snapshots",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["include", "only"],
+	        },
+	    },
+	};
+	parameters.blobDeleteType = {
+	    parameterPath: ["options", "blobDeleteType"],
+	    mapper: {
+	        serializedName: "deletetype",
+	        xmlName: "deletetype",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp11 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "expiry",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.expiryOptions = {
+	    parameterPath: "expiryOptions",
+	    mapper: {
+	        serializedName: "x-ms-expiry-option",
+	        required: true,
+	        xmlName: "x-ms-expiry-option",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.expiresOn = {
+	    parameterPath: ["options", "expiresOn"],
+	    mapper: {
+	        serializedName: "x-ms-expiry-time",
+	        xmlName: "x-ms-expiry-time",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobCacheControl = {
+	    parameterPath: ["options", "blobHttpHeaders", "blobCacheControl"],
+	    mapper: {
+	        serializedName: "x-ms-blob-cache-control",
+	        xmlName: "x-ms-blob-cache-control",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobContentType = {
+	    parameterPath: ["options", "blobHttpHeaders", "blobContentType"],
+	    mapper: {
+	        serializedName: "x-ms-blob-content-type",
+	        xmlName: "x-ms-blob-content-type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobContentMD5 = {
+	    parameterPath: ["options", "blobHttpHeaders", "blobContentMD5"],
+	    mapper: {
+	        serializedName: "x-ms-blob-content-md5",
+	        xmlName: "x-ms-blob-content-md5",
+	        type: {
+	            name: "ByteArray",
+	        },
+	    },
+	};
+	parameters.blobContentEncoding = {
+	    parameterPath: ["options", "blobHttpHeaders", "blobContentEncoding"],
+	    mapper: {
+	        serializedName: "x-ms-blob-content-encoding",
+	        xmlName: "x-ms-blob-content-encoding",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobContentLanguage = {
+	    parameterPath: ["options", "blobHttpHeaders", "blobContentLanguage"],
+	    mapper: {
+	        serializedName: "x-ms-blob-content-language",
+	        xmlName: "x-ms-blob-content-language",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobContentDisposition = {
+	    parameterPath: ["options", "blobHttpHeaders", "blobContentDisposition"],
+	    mapper: {
+	        serializedName: "x-ms-blob-content-disposition",
+	        xmlName: "x-ms-blob-content-disposition",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp12 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "immutabilityPolicies",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.immutabilityPolicyExpiry = {
+	    parameterPath: ["options", "immutabilityPolicyExpiry"],
+	    mapper: {
+	        serializedName: "x-ms-immutability-policy-until-date",
+	        xmlName: "x-ms-immutability-policy-until-date",
+	        type: {
+	            name: "DateTimeRfc1123",
+	        },
+	    },
+	};
+	parameters.immutabilityPolicyMode = {
+	    parameterPath: ["options", "immutabilityPolicyMode"],
+	    mapper: {
+	        serializedName: "x-ms-immutability-policy-mode",
+	        xmlName: "x-ms-immutability-policy-mode",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["Mutable", "Unlocked", "Locked"],
+	        },
+	    },
+	};
+	parameters.comp13 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "legalhold",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.legalHold = {
+	    parameterPath: "legalHold",
+	    mapper: {
+	        serializedName: "x-ms-legal-hold",
+	        required: true,
+	        xmlName: "x-ms-legal-hold",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.encryptionScope = {
+	    parameterPath: ["options", "encryptionScope"],
+	    mapper: {
+	        serializedName: "x-ms-encryption-scope",
+	        xmlName: "x-ms-encryption-scope",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp14 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "snapshot",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.tier = {
+	    parameterPath: ["options", "tier"],
+	    mapper: {
+	        serializedName: "x-ms-access-tier",
+	        xmlName: "x-ms-access-tier",
+	        type: {
+	            name: "Enum",
+	            allowedValues: [
+	                "P4",
+	                "P6",
+	                "P10",
+	                "P15",
+	                "P20",
+	                "P30",
+	                "P40",
+	                "P50",
+	                "P60",
+	                "P70",
+	                "P80",
+	                "Hot",
+	                "Cool",
+	                "Archive",
+	                "Cold",
+	            ],
+	        },
+	    },
+	};
+	parameters.rehydratePriority = {
+	    parameterPath: ["options", "rehydratePriority"],
+	    mapper: {
+	        serializedName: "x-ms-rehydrate-priority",
+	        xmlName: "x-ms-rehydrate-priority",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["High", "Standard"],
+	        },
+	    },
+	};
+	parameters.sourceIfModifiedSince = {
+	    parameterPath: [
+	        "options",
+	        "sourceModifiedAccessConditions",
+	        "sourceIfModifiedSince",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-source-if-modified-since",
+	        xmlName: "x-ms-source-if-modified-since",
+	        type: {
+	            name: "DateTimeRfc1123",
+	        },
+	    },
+	};
+	parameters.sourceIfUnmodifiedSince = {
+	    parameterPath: [
+	        "options",
+	        "sourceModifiedAccessConditions",
+	        "sourceIfUnmodifiedSince",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-source-if-unmodified-since",
+	        xmlName: "x-ms-source-if-unmodified-since",
+	        type: {
+	            name: "DateTimeRfc1123",
+	        },
+	    },
+	};
+	parameters.sourceIfMatch = {
+	    parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfMatch"],
+	    mapper: {
+	        serializedName: "x-ms-source-if-match",
+	        xmlName: "x-ms-source-if-match",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceIfNoneMatch = {
+	    parameterPath: [
+	        "options",
+	        "sourceModifiedAccessConditions",
+	        "sourceIfNoneMatch",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-source-if-none-match",
+	        xmlName: "x-ms-source-if-none-match",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceIfTags = {
+	    parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfTags"],
+	    mapper: {
+	        serializedName: "x-ms-source-if-tags",
+	        xmlName: "x-ms-source-if-tags",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.copySource = {
+	    parameterPath: "copySource",
+	    mapper: {
+	        serializedName: "x-ms-copy-source",
+	        required: true,
+	        xmlName: "x-ms-copy-source",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobTagsString = {
+	    parameterPath: ["options", "blobTagsString"],
+	    mapper: {
+	        serializedName: "x-ms-tags",
+	        xmlName: "x-ms-tags",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sealBlob = {
+	    parameterPath: ["options", "sealBlob"],
+	    mapper: {
+	        serializedName: "x-ms-seal-blob",
+	        xmlName: "x-ms-seal-blob",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.legalHold1 = {
+	    parameterPath: ["options", "legalHold"],
+	    mapper: {
+	        serializedName: "x-ms-legal-hold",
+	        xmlName: "x-ms-legal-hold",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.xMsRequiresSync = {
+	    parameterPath: "xMsRequiresSync",
+	    mapper: {
+	        defaultValue: "true",
+	        isConstant: true,
+	        serializedName: "x-ms-requires-sync",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceContentMD5 = {
+	    parameterPath: ["options", "sourceContentMD5"],
+	    mapper: {
+	        serializedName: "x-ms-source-content-md5",
+	        xmlName: "x-ms-source-content-md5",
+	        type: {
+	            name: "ByteArray",
+	        },
+	    },
+	};
+	parameters.copySourceAuthorization = {
+	    parameterPath: ["options", "copySourceAuthorization"],
+	    mapper: {
+	        serializedName: "x-ms-copy-source-authorization",
+	        xmlName: "x-ms-copy-source-authorization",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.copySourceTags = {
+	    parameterPath: ["options", "copySourceTags"],
+	    mapper: {
+	        serializedName: "x-ms-copy-source-tag-option",
+	        xmlName: "x-ms-copy-source-tag-option",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["REPLACE", "COPY"],
+	        },
+	    },
+	};
+	parameters.fileRequestIntent = {
+	    parameterPath: ["options", "fileRequestIntent"],
+	    mapper: {
+	        serializedName: "x-ms-file-request-intent",
+	        xmlName: "x-ms-file-request-intent",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp15 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "copy",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.copyActionAbortConstant = {
+	    parameterPath: "copyActionAbortConstant",
+	    mapper: {
+	        defaultValue: "abort",
+	        isConstant: true,
+	        serializedName: "x-ms-copy-action",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.copyId = {
+	    parameterPath: "copyId",
+	    mapper: {
+	        serializedName: "copyid",
+	        required: true,
+	        xmlName: "copyid",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp16 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "tier",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.tier1 = {
+	    parameterPath: "tier",
+	    mapper: {
+	        serializedName: "x-ms-access-tier",
+	        required: true,
+	        xmlName: "x-ms-access-tier",
+	        type: {
+	            name: "Enum",
+	            allowedValues: [
+	                "P4",
+	                "P6",
+	                "P10",
+	                "P15",
+	                "P20",
+	                "P30",
+	                "P40",
+	                "P50",
+	                "P60",
+	                "P70",
+	                "P80",
+	                "Hot",
+	                "Cool",
+	                "Archive",
+	                "Cold",
+	            ],
+	        },
+	    },
+	};
+	parameters.queryRequest = {
+	    parameterPath: ["options", "queryRequest"],
+	    mapper: mappers_js_1.QueryRequest,
+	};
+	parameters.comp17 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "query",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp18 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "tags",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.tags = {
+	    parameterPath: ["options", "tags"],
+	    mapper: mappers_js_1.BlobTags,
+	};
+	parameters.transactionalContentMD5 = {
+	    parameterPath: ["options", "transactionalContentMD5"],
+	    mapper: {
+	        serializedName: "Content-MD5",
+	        xmlName: "Content-MD5",
+	        type: {
+	            name: "ByteArray",
+	        },
+	    },
+	};
+	parameters.transactionalContentCrc64 = {
+	    parameterPath: ["options", "transactionalContentCrc64"],
+	    mapper: {
+	        serializedName: "x-ms-content-crc64",
+	        xmlName: "x-ms-content-crc64",
+	        type: {
+	            name: "ByteArray",
+	        },
+	    },
+	};
+	parameters.blobType = {
+	    parameterPath: "blobType",
+	    mapper: {
+	        defaultValue: "PageBlob",
+	        isConstant: true,
+	        serializedName: "x-ms-blob-type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobContentLength = {
+	    parameterPath: "blobContentLength",
+	    mapper: {
+	        serializedName: "x-ms-blob-content-length",
+	        required: true,
+	        xmlName: "x-ms-blob-content-length",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.blobSequenceNumber = {
+	    parameterPath: ["options", "blobSequenceNumber"],
+	    mapper: {
+	        defaultValue: 0,
+	        serializedName: "x-ms-blob-sequence-number",
+	        xmlName: "x-ms-blob-sequence-number",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.contentType1 = {
+	    parameterPath: ["options", "contentType"],
+	    mapper: {
+	        defaultValue: "application/octet-stream",
+	        isConstant: true,
+	        serializedName: "Content-Type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.body1 = {
+	    parameterPath: "body",
+	    mapper: {
+	        serializedName: "body",
+	        required: true,
+	        xmlName: "body",
+	        type: {
+	            name: "Stream",
+	        },
+	    },
+	};
+	parameters.accept2 = {
+	    parameterPath: "accept",
+	    mapper: {
+	        defaultValue: "application/xml",
+	        isConstant: true,
+	        serializedName: "Accept",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp19 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "page",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.pageWrite = {
+	    parameterPath: "pageWrite",
+	    mapper: {
+	        defaultValue: "update",
+	        isConstant: true,
+	        serializedName: "x-ms-page-write",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.ifSequenceNumberLessThanOrEqualTo = {
+	    parameterPath: [
+	        "options",
+	        "sequenceNumberAccessConditions",
+	        "ifSequenceNumberLessThanOrEqualTo",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-if-sequence-number-le",
+	        xmlName: "x-ms-if-sequence-number-le",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.ifSequenceNumberLessThan = {
+	    parameterPath: [
+	        "options",
+	        "sequenceNumberAccessConditions",
+	        "ifSequenceNumberLessThan",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-if-sequence-number-lt",
+	        xmlName: "x-ms-if-sequence-number-lt",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.ifSequenceNumberEqualTo = {
+	    parameterPath: [
+	        "options",
+	        "sequenceNumberAccessConditions",
+	        "ifSequenceNumberEqualTo",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-if-sequence-number-eq",
+	        xmlName: "x-ms-if-sequence-number-eq",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.pageWrite1 = {
+	    parameterPath: "pageWrite",
+	    mapper: {
+	        defaultValue: "clear",
+	        isConstant: true,
+	        serializedName: "x-ms-page-write",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceUrl = {
+	    parameterPath: "sourceUrl",
+	    mapper: {
+	        serializedName: "x-ms-copy-source",
+	        required: true,
+	        xmlName: "x-ms-copy-source",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceRange = {
+	    parameterPath: "sourceRange",
+	    mapper: {
+	        serializedName: "x-ms-source-range",
+	        required: true,
+	        xmlName: "x-ms-source-range",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sourceContentCrc64 = {
+	    parameterPath: ["options", "sourceContentCrc64"],
+	    mapper: {
+	        serializedName: "x-ms-source-content-crc64",
+	        xmlName: "x-ms-source-content-crc64",
+	        type: {
+	            name: "ByteArray",
+	        },
+	    },
+	};
+	parameters.range1 = {
+	    parameterPath: "range",
+	    mapper: {
+	        serializedName: "x-ms-range",
+	        required: true,
+	        xmlName: "x-ms-range",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp20 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "pagelist",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.prevsnapshot = {
+	    parameterPath: ["options", "prevsnapshot"],
+	    mapper: {
+	        serializedName: "prevsnapshot",
+	        xmlName: "prevsnapshot",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.prevSnapshotUrl = {
+	    parameterPath: ["options", "prevSnapshotUrl"],
+	    mapper: {
+	        serializedName: "x-ms-previous-snapshot-url",
+	        xmlName: "x-ms-previous-snapshot-url",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.sequenceNumberAction = {
+	    parameterPath: "sequenceNumberAction",
+	    mapper: {
+	        serializedName: "x-ms-sequence-number-action",
+	        required: true,
+	        xmlName: "x-ms-sequence-number-action",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["max", "update", "increment"],
+	        },
+	    },
+	};
+	parameters.comp21 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "incrementalcopy",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobType1 = {
+	    parameterPath: "blobType",
+	    mapper: {
+	        defaultValue: "AppendBlob",
+	        isConstant: true,
+	        serializedName: "x-ms-blob-type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp22 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "appendblock",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.maxSize = {
+	    parameterPath: ["options", "appendPositionAccessConditions", "maxSize"],
+	    mapper: {
+	        serializedName: "x-ms-blob-condition-maxsize",
+	        xmlName: "x-ms-blob-condition-maxsize",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.appendPosition = {
+	    parameterPath: [
+	        "options",
+	        "appendPositionAccessConditions",
+	        "appendPosition",
+	    ],
+	    mapper: {
+	        serializedName: "x-ms-blob-condition-appendpos",
+	        xmlName: "x-ms-blob-condition-appendpos",
+	        type: {
+	            name: "Number",
+	        },
+	    },
+	};
+	parameters.sourceRange1 = {
+	    parameterPath: ["options", "sourceRange"],
+	    mapper: {
+	        serializedName: "x-ms-source-range",
+	        xmlName: "x-ms-source-range",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.comp23 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "seal",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blobType2 = {
+	    parameterPath: "blobType",
+	    mapper: {
+	        defaultValue: "BlockBlob",
+	        isConstant: true,
+	        serializedName: "x-ms-blob-type",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.copySourceBlobProperties = {
+	    parameterPath: ["options", "copySourceBlobProperties"],
+	    mapper: {
+	        serializedName: "x-ms-copy-source-blob-properties",
+	        xmlName: "x-ms-copy-source-blob-properties",
+	        type: {
+	            name: "Boolean",
+	        },
+	    },
+	};
+	parameters.comp24 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "block",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blockId = {
+	    parameterPath: "blockId",
+	    mapper: {
+	        serializedName: "blockid",
+	        required: true,
+	        xmlName: "blockid",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.blocks = {
+	    parameterPath: "blocks",
+	    mapper: mappers_js_1.BlockLookupList,
+	};
+	parameters.comp25 = {
+	    parameterPath: "comp",
+	    mapper: {
+	        defaultValue: "blocklist",
+	        isConstant: true,
+	        serializedName: "comp",
+	        type: {
+	            name: "String",
+	        },
+	    },
+	};
+	parameters.listType = {
+	    parameterPath: "listType",
+	    mapper: {
+	        defaultValue: "committed",
+	        serializedName: "blocklisttype",
+	        required: true,
+	        xmlName: "blocklisttype",
+	        type: {
+	            name: "Enum",
+	            allowedValues: ["committed", "uncommitted", "all"],
+	        },
+	    },
+	};
+	
+	return parameters;
+}
+
+var hasRequiredService$1;
+
+function requireService$1 () {
+	if (hasRequiredService$1) return service$1;
+	hasRequiredService$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(service$1, "__esModule", { value: true });
+	service$1.ServiceImpl = void 0;
+	const tslib_1 = require$$0$2;
+	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
+	const Mappers = tslib_1.__importStar(requireMappers());
+	const Parameters = tslib_1.__importStar(requireParameters());
+	/** Class containing Service operations. */
+	class ServiceImpl {
+	    client;
+	    /**
+	     * Initialize a new instance of the class Service class.
+	     * @param client Reference to the service client
+	     */
+	    constructor(client) {
+	        this.client = client;
+	    }
+	    /**
+	     * Sets properties for a storage account's Blob service endpoint, including properties for Storage
+	     * Analytics and CORS (Cross-Origin Resource Sharing) rules
+	     * @param blobServiceProperties The StorageService properties.
+	     * @param options The options parameters.
+	     */
+	    setProperties(blobServiceProperties, options) {
+	        return this.client.sendOperationRequest({ blobServiceProperties, options }, setPropertiesOperationSpec);
+	    }
+	    /**
+	     * gets the properties of a storage account's Blob service, including properties for Storage Analytics
+	     * and CORS (Cross-Origin Resource Sharing) rules.
+	     * @param options The options parameters.
+	     */
+	    getProperties(options) {
+	        return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
+	    }
+	    /**
+	     * Retrieves statistics related to replication for the Blob service. It is only available on the
+	     * secondary location endpoint when read-access geo-redundant replication is enabled for the storage
+	     * account.
+	     * @param options The options parameters.
+	     */
+	    getStatistics(options) {
+	        return this.client.sendOperationRequest({ options }, getStatisticsOperationSpec);
+	    }
+	    /**
+	     * The List Containers Segment operation returns a list of the containers under the specified account
+	     * @param options The options parameters.
+	     */
+	    listContainersSegment(options) {
+	        return this.client.sendOperationRequest({ options }, listContainersSegmentOperationSpec);
+	    }
+	    /**
+	     * Retrieves a user delegation key for the Blob service. This is only a valid operation when using
+	     * bearer token authentication.
+	     * @param keyInfo Key information
+	     * @param options The options parameters.
+	     */
+	    getUserDelegationKey(keyInfo, options) {
+	        return this.client.sendOperationRequest({ keyInfo, options }, getUserDelegationKeyOperationSpec);
+	    }
+	    /**
+	     * Returns the sku name and account kind
+	     * @param options The options parameters.
+	     */
+	    getAccountInfo(options) {
+	        return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
+	    }
+	    /**
+	     * The Batch operation allows multiple API calls to be embedded into a single HTTP request.
+	     * @param contentLength The length of the request.
+	     * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
+	     *                             boundary. Example header value: multipart/mixed; boundary=batch_
+	     * @param body Initial data
+	     * @param options The options parameters.
+	     */
+	    submitBatch(contentLength, multipartContentType, body, options) {
+	        return this.client.sendOperationRequest({ contentLength, multipartContentType, body, options }, submitBatchOperationSpec);
+	    }
+	    /**
+	     * The Filter Blobs operation enables callers to list blobs across all containers whose tags match a
+	     * given search expression.  Filter blobs searches across all containers within a storage account but
+	     * can be scoped within the expression to a single container.
+	     * @param options The options parameters.
+	     */
+	    filterBlobs(options) {
+	        return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec);
+	    }
+	}
+	service$1.ServiceImpl = ServiceImpl;
+	// Operation Specifications
+	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
+	const setPropertiesOperationSpec = {
+	    path: "/",
+	    httpMethod: "PUT",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.ServiceSetPropertiesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceSetPropertiesExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.blobServiceProperties,
+	    queryParameters: [
+	        Parameters.restype,
+	        Parameters.comp,
+	        Parameters.timeoutInSeconds,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.contentType,
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const getPropertiesOperationSpec = {
+	    path: "/",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.BlobServiceProperties,
+	            headersMapper: Mappers.ServiceGetPropertiesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceGetPropertiesExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.restype,
+	        Parameters.comp,
+	        Parameters.timeoutInSeconds,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getStatisticsOperationSpec = {
+	    path: "/",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.BlobServiceStatistics,
+	            headersMapper: Mappers.ServiceGetStatisticsHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceGetStatisticsExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.restype,
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp1,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const listContainersSegmentOperationSpec = {
+	    path: "/",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.ListContainersSegmentResponse,
+	            headersMapper: Mappers.ServiceListContainersSegmentHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceListContainersSegmentExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp2,
+	        Parameters.prefix,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.include,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getUserDelegationKeyOperationSpec = {
+	    path: "/",
+	    httpMethod: "POST",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.UserDelegationKey,
+	            headersMapper: Mappers.ServiceGetUserDelegationKeyHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceGetUserDelegationKeyExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.keyInfo,
+	    queryParameters: [
+	        Parameters.restype,
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp3,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.contentType,
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const getAccountInfoOperationSpec = {
+	    path: "/",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ServiceGetAccountInfoHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceGetAccountInfoExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.comp,
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype1,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const submitBatchOperationSpec = {
+	    path: "/",
+	    httpMethod: "POST",
+	    responses: {
+	        202: {
+	            bodyMapper: {
+	                type: { name: "Stream" },
+	                serializedName: "parsedResponse",
+	            },
+	            headersMapper: Mappers.ServiceSubmitBatchHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceSubmitBatchExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.body,
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp4],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.contentLength,
+	        Parameters.multipartContentType,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const filterBlobsOperationSpec = {
+	    path: "/",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.FilterBlobSegment,
+	            headersMapper: Mappers.ServiceFilterBlobsHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ServiceFilterBlobsExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.comp5,
+	        Parameters.where,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	
+	return service$1;
+}
+
+var container$1 = {};
+
+var hasRequiredContainer$1;
+
+function requireContainer$1 () {
+	if (hasRequiredContainer$1) return container$1;
+	hasRequiredContainer$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(container$1, "__esModule", { value: true });
+	container$1.ContainerImpl = void 0;
+	const tslib_1 = require$$0$2;
+	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
+	const Mappers = tslib_1.__importStar(requireMappers());
+	const Parameters = tslib_1.__importStar(requireParameters());
+	/** Class containing Container operations. */
+	class ContainerImpl {
+	    client;
+	    /**
+	     * Initialize a new instance of the class Container class.
+	     * @param client Reference to the service client
+	     */
+	    constructor(client) {
+	        this.client = client;
+	    }
+	    /**
+	     * creates a new container under the specified account. If the container with the same name already
+	     * exists, the operation fails
+	     * @param options The options parameters.
+	     */
+	    create(options) {
+	        return this.client.sendOperationRequest({ options }, createOperationSpec);
+	    }
+	    /**
+	     * returns all user-defined metadata and system properties for the specified container. The data
+	     * returned does not include the container's list of blobs
+	     * @param options The options parameters.
+	     */
+	    getProperties(options) {
+	        return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
+	    }
+	    /**
+	     * operation marks the specified container for deletion. The container and any blobs contained within
+	     * it are later deleted during garbage collection
+	     * @param options The options parameters.
+	     */
+	    delete(options) {
+	        return this.client.sendOperationRequest({ options }, deleteOperationSpec);
+	    }
+	    /**
+	     * operation sets one or more user-defined name-value pairs for the specified container.
+	     * @param options The options parameters.
+	     */
+	    setMetadata(options) {
+	        return this.client.sendOperationRequest({ options }, setMetadataOperationSpec);
+	    }
+	    /**
+	     * gets the permissions for the specified container. The permissions indicate whether container data
+	     * may be accessed publicly.
+	     * @param options The options parameters.
+	     */
+	    getAccessPolicy(options) {
+	        return this.client.sendOperationRequest({ options }, getAccessPolicyOperationSpec);
+	    }
+	    /**
+	     * sets the permissions for the specified container. The permissions indicate whether blobs in a
+	     * container may be accessed publicly.
+	     * @param options The options parameters.
+	     */
+	    setAccessPolicy(options) {
+	        return this.client.sendOperationRequest({ options }, setAccessPolicyOperationSpec);
+	    }
+	    /**
+	     * Restores a previously-deleted container.
+	     * @param options The options parameters.
+	     */
+	    restore(options) {
+	        return this.client.sendOperationRequest({ options }, restoreOperationSpec);
+	    }
+	    /**
+	     * Renames an existing container.
+	     * @param sourceContainerName Required.  Specifies the name of the container to rename.
+	     * @param options The options parameters.
+	     */
+	    rename(sourceContainerName, options) {
+	        return this.client.sendOperationRequest({ sourceContainerName, options }, renameOperationSpec);
+	    }
+	    /**
+	     * The Batch operation allows multiple API calls to be embedded into a single HTTP request.
+	     * @param contentLength The length of the request.
+	     * @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
+	     *                             boundary. Example header value: multipart/mixed; boundary=batch_
+	     * @param body Initial data
+	     * @param options The options parameters.
+	     */
+	    submitBatch(contentLength, multipartContentType, body, options) {
+	        return this.client.sendOperationRequest({ contentLength, multipartContentType, body, options }, submitBatchOperationSpec);
+	    }
+	    /**
+	     * The Filter Blobs operation enables callers to list blobs in a container whose tags match a given
+	     * search expression.  Filter blobs searches within the given container.
+	     * @param options The options parameters.
+	     */
+	    filterBlobs(options) {
+	        return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec);
+	    }
+	    /**
+	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
+	     * be 15 to 60 seconds, or can be infinite
+	     * @param options The options parameters.
+	     */
+	    acquireLease(options) {
+	        return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
+	     * be 15 to 60 seconds, or can be infinite
+	     * @param leaseId Specifies the current lease ID on the resource.
+	     * @param options The options parameters.
+	     */
+	    releaseLease(leaseId, options) {
+	        return this.client.sendOperationRequest({ leaseId, options }, releaseLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
+	     * be 15 to 60 seconds, or can be infinite
+	     * @param leaseId Specifies the current lease ID on the resource.
+	     * @param options The options parameters.
+	     */
+	    renewLease(leaseId, options) {
+	        return this.client.sendOperationRequest({ leaseId, options }, renewLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
+	     * be 15 to 60 seconds, or can be infinite
+	     * @param options The options parameters.
+	     */
+	    breakLease(options) {
+	        return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] establishes and manages a lock on a container for delete operations. The lock duration can
+	     * be 15 to 60 seconds, or can be infinite
+	     * @param leaseId Specifies the current lease ID on the resource.
+	     * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
+	     *                        (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
+	     *                        (String) for a list of valid GUID string formats.
+	     * @param options The options parameters.
+	     */
+	    changeLease(leaseId, proposedLeaseId, options) {
+	        return this.client.sendOperationRequest({ leaseId, proposedLeaseId, options }, changeLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] The List Blobs operation returns a list of the blobs under the specified container
+	     * @param options The options parameters.
+	     */
+	    listBlobFlatSegment(options) {
+	        return this.client.sendOperationRequest({ options }, listBlobFlatSegmentOperationSpec);
+	    }
+	    /**
+	     * [Update] The List Blobs operation returns a list of the blobs under the specified container
+	     * @param delimiter When the request includes this parameter, the operation returns a BlobPrefix
+	     *                  element in the response body that acts as a placeholder for all blobs whose names begin with the
+	     *                  same substring up to the appearance of the delimiter character. The delimiter may be a single
+	     *                  character or a string.
+	     * @param options The options parameters.
+	     */
+	    listBlobHierarchySegment(delimiter, options) {
+	        return this.client.sendOperationRequest({ delimiter, options }, listBlobHierarchySegmentOperationSpec);
+	    }
+	    /**
+	     * Returns the sku name and account kind
+	     * @param options The options parameters.
+	     */
+	    getAccountInfo(options) {
+	        return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
+	    }
+	}
+	container$1.ContainerImpl = ContainerImpl;
+	// Operation Specifications
+	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
+	const createOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.ContainerCreateHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerCreateExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.metadata,
+	        Parameters.access,
+	        Parameters.defaultEncryptionScope,
+	        Parameters.preventEncryptionScopeOverride,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getPropertiesOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerGetPropertiesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerGetPropertiesExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const deleteOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "DELETE",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.ContainerDeleteHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerDeleteExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setMetadataOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerSetMetadataHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerSetMetadataExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp6,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getAccessPolicyOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: {
+	                type: {
+	                    name: "Sequence",
+	                    element: {
+	                        type: { name: "Composite", className: "SignedIdentifier" },
+	                    },
+	                },
+	                serializedName: "SignedIdentifiers",
+	                xmlName: "SignedIdentifiers",
+	                xmlIsWrapped: true,
+	                xmlElementName: "SignedIdentifier",
+	            },
+	            headersMapper: Mappers.ContainerGetAccessPolicyHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerGetAccessPolicyExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp7,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setAccessPolicyOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerSetAccessPolicyHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerSetAccessPolicyExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.containerAcl,
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp7,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.contentType,
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.access,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const restoreOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.ContainerRestoreHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerRestoreExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp8,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.deletedContainerName,
+	        Parameters.deletedContainerVersion,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const renameOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerRenameHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerRenameExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp9,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.sourceContainerName,
+	        Parameters.sourceLeaseId,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const submitBatchOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "POST",
+	    responses: {
+	        202: {
+	            bodyMapper: {
+	                type: { name: "Stream" },
+	                serializedName: "parsedResponse",
+	            },
+	            headersMapper: Mappers.ContainerSubmitBatchHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerSubmitBatchExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.body,
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp4,
+	        Parameters.restype2,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.contentLength,
+	        Parameters.multipartContentType,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const filterBlobsOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.FilterBlobSegment,
+	            headersMapper: Mappers.ContainerFilterBlobsHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerFilterBlobsExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.comp5,
+	        Parameters.where,
+	        Parameters.restype2,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const acquireLeaseOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.ContainerAcquireLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerAcquireLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp10,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.action,
+	        Parameters.duration,
+	        Parameters.proposedLeaseId,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const releaseLeaseOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerReleaseLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerReleaseLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp10,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.action1,
+	        Parameters.leaseId1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const renewLeaseOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerRenewLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerRenewLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp10,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.leaseId1,
+	        Parameters.action2,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const breakLeaseOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.ContainerBreakLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerBreakLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp10,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.action3,
+	        Parameters.breakPeriod,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const changeLeaseOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerChangeLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerChangeLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype2,
+	        Parameters.comp10,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.leaseId1,
+	        Parameters.action4,
+	        Parameters.proposedLeaseId1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const listBlobFlatSegmentOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.ListBlobsFlatSegmentResponse,
+	            headersMapper: Mappers.ContainerListBlobFlatSegmentHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerListBlobFlatSegmentExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp2,
+	        Parameters.prefix,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.restype2,
+	        Parameters.include1,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const listBlobHierarchySegmentOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.ListBlobsHierarchySegmentResponse,
+	            headersMapper: Mappers.ContainerListBlobHierarchySegmentHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerListBlobHierarchySegmentExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp2,
+	        Parameters.prefix,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.restype2,
+	        Parameters.include1,
+	        Parameters.delimiter,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getAccountInfoOperationSpec = {
+	    path: "/{containerName}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.ContainerGetAccountInfoHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.ContainerGetAccountInfoExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.comp,
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype1,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	
+	return container$1;
+}
+
+var blob$1 = {};
+
+var hasRequiredBlob$1;
+
+function requireBlob$1 () {
+	if (hasRequiredBlob$1) return blob$1;
+	hasRequiredBlob$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(blob$1, "__esModule", { value: true });
+	blob$1.BlobImpl = void 0;
+	const tslib_1 = require$$0$2;
+	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
+	const Mappers = tslib_1.__importStar(requireMappers());
+	const Parameters = tslib_1.__importStar(requireParameters());
+	/** Class containing Blob operations. */
+	class BlobImpl {
+	    client;
+	    /**
+	     * Initialize a new instance of the class Blob class.
+	     * @param client Reference to the service client
+	     */
+	    constructor(client) {
+	        this.client = client;
+	    }
+	    /**
+	     * The Download operation reads or downloads a blob from the system, including its metadata and
+	     * properties. You can also call Download to read a snapshot.
+	     * @param options The options parameters.
+	     */
+	    download(options) {
+	        return this.client.sendOperationRequest({ options }, downloadOperationSpec);
+	    }
+	    /**
+	     * The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system
+	     * properties for the blob. It does not return the content of the blob.
+	     * @param options The options parameters.
+	     */
+	    getProperties(options) {
+	        return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
+	    }
+	    /**
+	     * If the storage account's soft delete feature is disabled then, when a blob is deleted, it is
+	     * permanently removed from the storage account. If the storage account's soft delete feature is
+	     * enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible
+	     * immediately. However, the blob service retains the blob or snapshot for the number of days specified
+	     * by the DeleteRetentionPolicy section of [Storage service properties]
+	     * (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is
+	     * permanently removed from the storage account. Note that you continue to be charged for the
+	     * soft-deleted blob's storage until it is permanently removed. Use the List Blobs API and specify the
+	     * "include=deleted" query parameter to discover which blobs and snapshots have been soft deleted. You
+	     * can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a
+	     * soft-deleted blob or snapshot causes the service to return an HTTP status code of 404
+	     * (ResourceNotFound).
+	     * @param options The options parameters.
+	     */
+	    delete(options) {
+	        return this.client.sendOperationRequest({ options }, deleteOperationSpec);
+	    }
+	    /**
+	     * Undelete a blob that was previously soft deleted
+	     * @param options The options parameters.
+	     */
+	    undelete(options) {
+	        return this.client.sendOperationRequest({ options }, undeleteOperationSpec);
+	    }
+	    /**
+	     * Sets the time a blob will expire and be deleted.
+	     * @param expiryOptions Required. Indicates mode of the expiry time
+	     * @param options The options parameters.
+	     */
+	    setExpiry(expiryOptions, options) {
+	        return this.client.sendOperationRequest({ expiryOptions, options }, setExpiryOperationSpec);
+	    }
+	    /**
+	     * The Set HTTP Headers operation sets system properties on the blob
+	     * @param options The options parameters.
+	     */
+	    setHttpHeaders(options) {
+	        return this.client.sendOperationRequest({ options }, setHttpHeadersOperationSpec);
+	    }
+	    /**
+	     * The Set Immutability Policy operation sets the immutability policy on the blob
+	     * @param options The options parameters.
+	     */
+	    setImmutabilityPolicy(options) {
+	        return this.client.sendOperationRequest({ options }, setImmutabilityPolicyOperationSpec);
+	    }
+	    /**
+	     * The Delete Immutability Policy operation deletes the immutability policy on the blob
+	     * @param options The options parameters.
+	     */
+	    deleteImmutabilityPolicy(options) {
+	        return this.client.sendOperationRequest({ options }, deleteImmutabilityPolicyOperationSpec);
+	    }
+	    /**
+	     * The Set Legal Hold operation sets a legal hold on the blob.
+	     * @param legalHold Specified if a legal hold should be set on the blob.
+	     * @param options The options parameters.
+	     */
+	    setLegalHold(legalHold, options) {
+	        return this.client.sendOperationRequest({ legalHold, options }, setLegalHoldOperationSpec);
+	    }
+	    /**
+	     * The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more
+	     * name-value pairs
+	     * @param options The options parameters.
+	     */
+	    setMetadata(options) {
+	        return this.client.sendOperationRequest({ options }, setMetadataOperationSpec);
+	    }
+	    /**
+	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
+	     * operations
+	     * @param options The options parameters.
+	     */
+	    acquireLease(options) {
+	        return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
+	     * operations
+	     * @param leaseId Specifies the current lease ID on the resource.
+	     * @param options The options parameters.
+	     */
+	    releaseLease(leaseId, options) {
+	        return this.client.sendOperationRequest({ leaseId, options }, releaseLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
+	     * operations
+	     * @param leaseId Specifies the current lease ID on the resource.
+	     * @param options The options parameters.
+	     */
+	    renewLease(leaseId, options) {
+	        return this.client.sendOperationRequest({ leaseId, options }, renewLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
+	     * operations
+	     * @param leaseId Specifies the current lease ID on the resource.
+	     * @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
+	     *                        (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
+	     *                        (String) for a list of valid GUID string formats.
+	     * @param options The options parameters.
+	     */
+	    changeLease(leaseId, proposedLeaseId, options) {
+	        return this.client.sendOperationRequest({ leaseId, proposedLeaseId, options }, changeLeaseOperationSpec);
+	    }
+	    /**
+	     * [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
+	     * operations
+	     * @param options The options parameters.
+	     */
+	    breakLease(options) {
+	        return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec);
+	    }
+	    /**
+	     * The Create Snapshot operation creates a read-only snapshot of a blob
+	     * @param options The options parameters.
+	     */
+	    createSnapshot(options) {
+	        return this.client.sendOperationRequest({ options }, createSnapshotOperationSpec);
+	    }
+	    /**
+	     * The Start Copy From URL operation copies a blob or an internet resource to a new blob.
+	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
+	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
+	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
+	     *                   access signature.
+	     * @param options The options parameters.
+	     */
+	    startCopyFromURL(copySource, options) {
+	        return this.client.sendOperationRequest({ copySource, options }, startCopyFromURLOperationSpec);
+	    }
+	    /**
+	     * The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return
+	     * a response until the copy is complete.
+	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
+	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
+	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
+	     *                   access signature.
+	     * @param options The options parameters.
+	     */
+	    copyFromURL(copySource, options) {
+	        return this.client.sendOperationRequest({ copySource, options }, copyFromURLOperationSpec);
+	    }
+	    /**
+	     * The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination
+	     * blob with zero length and full metadata.
+	     * @param copyId The copy identifier provided in the x-ms-copy-id header of the original Copy Blob
+	     *               operation.
+	     * @param options The options parameters.
+	     */
+	    abortCopyFromURL(copyId, options) {
+	        return this.client.sendOperationRequest({ copyId, options }, abortCopyFromURLOperationSpec);
+	    }
+	    /**
+	     * The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium
+	     * storage account and on a block blob in a blob storage account (locally redundant storage only). A
+	     * premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block
+	     * blob's tier determines Hot/Cool/Archive storage type. This operation does not update the blob's
+	     * ETag.
+	     * @param tier Indicates the tier to be set on the blob.
+	     * @param options The options parameters.
+	     */
+	    setTier(tier, options) {
+	        return this.client.sendOperationRequest({ tier, options }, setTierOperationSpec);
+	    }
+	    /**
+	     * Returns the sku name and account kind
+	     * @param options The options parameters.
+	     */
+	    getAccountInfo(options) {
+	        return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
+	    }
+	    /**
+	     * The Query operation enables users to select/project on blob data by providing simple query
+	     * expressions.
+	     * @param options The options parameters.
+	     */
+	    query(options) {
+	        return this.client.sendOperationRequest({ options }, queryOperationSpec);
+	    }
+	    /**
+	     * The Get Tags operation enables users to get the tags associated with a blob.
+	     * @param options The options parameters.
+	     */
+	    getTags(options) {
+	        return this.client.sendOperationRequest({ options }, getTagsOperationSpec);
+	    }
+	    /**
+	     * The Set Tags operation enables users to set tags on a blob.
+	     * @param options The options parameters.
+	     */
+	    setTags(options) {
+	        return this.client.sendOperationRequest({ options }, setTagsOperationSpec);
+	    }
+	}
+	blob$1.BlobImpl = BlobImpl;
+	// Operation Specifications
+	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
+	const downloadOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: {
+	                type: { name: "Stream" },
+	                serializedName: "parsedResponse",
+	            },
+	            headersMapper: Mappers.BlobDownloadHeaders,
+	        },
+	        206: {
+	            bodyMapper: {
+	                type: { name: "Stream" },
+	                serializedName: "parsedResponse",
+	            },
+	            headersMapper: Mappers.BlobDownloadHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobDownloadExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.range,
+	        Parameters.rangeGetContentMD5,
+	        Parameters.rangeGetContentCRC64,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getPropertiesOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "HEAD",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobGetPropertiesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobGetPropertiesExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const deleteOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "DELETE",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.BlobDeleteHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobDeleteExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	        Parameters.blobDeleteType,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.deleteSnapshots,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const undeleteOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobUndeleteHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobUndeleteExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp8],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setExpiryOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobSetExpiryHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetExpiryExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp11],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.expiryOptions,
+	        Parameters.expiresOn,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setHttpHeadersOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobSetHttpHeadersHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetHttpHeadersExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobCacheControl,
+	        Parameters.blobContentType,
+	        Parameters.blobContentMD5,
+	        Parameters.blobContentEncoding,
+	        Parameters.blobContentLanguage,
+	        Parameters.blobContentDisposition,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setImmutabilityPolicyOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobSetImmutabilityPolicyHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetImmutabilityPolicyExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	        Parameters.comp12,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const deleteImmutabilityPolicyOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "DELETE",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobDeleteImmutabilityPolicyHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobDeleteImmutabilityPolicyExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	        Parameters.comp12,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setLegalHoldOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobSetLegalHoldHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetLegalHoldExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	        Parameters.comp13,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.legalHold,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setMetadataOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobSetMetadataHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetMetadataExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp6],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const acquireLeaseOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlobAcquireLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobAcquireLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.action,
+	        Parameters.duration,
+	        Parameters.proposedLeaseId,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const releaseLeaseOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobReleaseLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobReleaseLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.action1,
+	        Parameters.leaseId1,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const renewLeaseOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobRenewLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobRenewLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.leaseId1,
+	        Parameters.action2,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const changeLeaseOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobChangeLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobChangeLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.leaseId1,
+	        Parameters.action4,
+	        Parameters.proposedLeaseId1,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const breakLeaseOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.BlobBreakLeaseHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobBreakLeaseExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp10],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.action3,
+	        Parameters.breakPeriod,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const createSnapshotOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlobCreateSnapshotHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobCreateSnapshotExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp14],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const startCopyFromURLOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.BlobStartCopyFromURLHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobStartCopyFromURLExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	        Parameters.tier,
+	        Parameters.rehydratePriority,
+	        Parameters.sourceIfModifiedSince,
+	        Parameters.sourceIfUnmodifiedSince,
+	        Parameters.sourceIfMatch,
+	        Parameters.sourceIfNoneMatch,
+	        Parameters.sourceIfTags,
+	        Parameters.copySource,
+	        Parameters.blobTagsString,
+	        Parameters.sealBlob,
+	        Parameters.legalHold1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const copyFromURLOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.BlobCopyFromURLHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobCopyFromURLExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	        Parameters.encryptionScope,
+	        Parameters.tier,
+	        Parameters.sourceIfModifiedSince,
+	        Parameters.sourceIfUnmodifiedSince,
+	        Parameters.sourceIfMatch,
+	        Parameters.sourceIfNoneMatch,
+	        Parameters.copySource,
+	        Parameters.blobTagsString,
+	        Parameters.legalHold1,
+	        Parameters.xMsRequiresSync,
+	        Parameters.sourceContentMD5,
+	        Parameters.copySourceAuthorization,
+	        Parameters.copySourceTags,
+	        Parameters.fileRequestIntent,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const abortCopyFromURLOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        204: {
+	            headersMapper: Mappers.BlobAbortCopyFromURLHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobAbortCopyFromURLExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp15,
+	        Parameters.copyId,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.copyActionAbortConstant,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setTierOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobSetTierHeaders,
+	        },
+	        202: {
+	            headersMapper: Mappers.BlobSetTierHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetTierExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	        Parameters.comp16,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifTags,
+	        Parameters.rehydratePriority,
+	        Parameters.tier1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getAccountInfoOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.BlobGetAccountInfoHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobGetAccountInfoExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.comp,
+	        Parameters.timeoutInSeconds,
+	        Parameters.restype1,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const queryOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "POST",
+	    responses: {
+	        200: {
+	            bodyMapper: {
+	                type: { name: "Stream" },
+	                serializedName: "parsedResponse",
+	            },
+	            headersMapper: Mappers.BlobQueryHeaders,
+	        },
+	        206: {
+	            bodyMapper: {
+	                type: { name: "Stream" },
+	                serializedName: "parsedResponse",
+	            },
+	            headersMapper: Mappers.BlobQueryHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobQueryExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.queryRequest,
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.comp17,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.contentType,
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const getTagsOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.BlobTags,
+	            headersMapper: Mappers.BlobGetTagsHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobGetTagsExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.versionId,
+	        Parameters.comp18,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const setTagsOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        204: {
+	            headersMapper: Mappers.BlobSetTagsHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlobSetTagsExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.tags,
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.versionId,
+	        Parameters.comp18,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.contentType,
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.leaseId,
+	        Parameters.ifTags,
+	        Parameters.transactionalContentMD5,
+	        Parameters.transactionalContentCrc64,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	
+	return blob$1;
+}
+
+var pageBlob$1 = {};
+
+var hasRequiredPageBlob$1;
+
+function requirePageBlob$1 () {
+	if (hasRequiredPageBlob$1) return pageBlob$1;
+	hasRequiredPageBlob$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(pageBlob$1, "__esModule", { value: true });
+	pageBlob$1.PageBlobImpl = void 0;
+	const tslib_1 = require$$0$2;
+	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
+	const Mappers = tslib_1.__importStar(requireMappers());
+	const Parameters = tslib_1.__importStar(requireParameters());
+	/** Class containing PageBlob operations. */
+	class PageBlobImpl {
+	    client;
+	    /**
+	     * Initialize a new instance of the class PageBlob class.
+	     * @param client Reference to the service client
+	     */
+	    constructor(client) {
+	        this.client = client;
+	    }
+	    /**
+	     * The Create operation creates a new page blob.
+	     * @param contentLength The length of the request.
+	     * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
+	     *                          page blob size must be aligned to a 512-byte boundary.
+	     * @param options The options parameters.
+	     */
+	    create(contentLength, blobContentLength, options) {
+	        return this.client.sendOperationRequest({ contentLength, blobContentLength, options }, createOperationSpec);
+	    }
+	    /**
+	     * The Upload Pages operation writes a range of pages to a page blob
+	     * @param contentLength The length of the request.
+	     * @param body Initial data
+	     * @param options The options parameters.
+	     */
+	    uploadPages(contentLength, body, options) {
+	        return this.client.sendOperationRequest({ contentLength, body, options }, uploadPagesOperationSpec);
+	    }
+	    /**
+	     * The Clear Pages operation clears a set of pages from a page blob
+	     * @param contentLength The length of the request.
+	     * @param options The options parameters.
+	     */
+	    clearPages(contentLength, options) {
+	        return this.client.sendOperationRequest({ contentLength, options }, clearPagesOperationSpec);
+	    }
+	    /**
+	     * The Upload Pages operation writes a range of pages to a page blob where the contents are read from a
+	     * URL
+	     * @param sourceUrl Specify a URL to the copy source.
+	     * @param sourceRange Bytes of source data in the specified range. The length of this range should
+	     *                    match the ContentLength header and x-ms-range/Range destination range header.
+	     * @param contentLength The length of the request.
+	     * @param range The range of bytes to which the source range would be written. The range should be 512
+	     *              aligned and range-end is required.
+	     * @param options The options parameters.
+	     */
+	    uploadPagesFromURL(sourceUrl, sourceRange, contentLength, range, options) {
+	        return this.client.sendOperationRequest({ sourceUrl, sourceRange, contentLength, range, options }, uploadPagesFromURLOperationSpec);
+	    }
+	    /**
+	     * The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a
+	     * page blob
+	     * @param options The options parameters.
+	     */
+	    getPageRanges(options) {
+	        return this.client.sendOperationRequest({ options }, getPageRangesOperationSpec);
+	    }
+	    /**
+	     * The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were
+	     * changed between target blob and previous snapshot.
+	     * @param options The options parameters.
+	     */
+	    getPageRangesDiff(options) {
+	        return this.client.sendOperationRequest({ options }, getPageRangesDiffOperationSpec);
+	    }
+	    /**
+	     * Resize the Blob
+	     * @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
+	     *                          page blob size must be aligned to a 512-byte boundary.
+	     * @param options The options parameters.
+	     */
+	    resize(blobContentLength, options) {
+	        return this.client.sendOperationRequest({ blobContentLength, options }, resizeOperationSpec);
+	    }
+	    /**
+	     * Update the sequence number of the blob
+	     * @param sequenceNumberAction Required if the x-ms-blob-sequence-number header is set for the request.
+	     *                             This property applies to page blobs only. This property indicates how the service should modify the
+	     *                             blob's sequence number
+	     * @param options The options parameters.
+	     */
+	    updateSequenceNumber(sequenceNumberAction, options) {
+	        return this.client.sendOperationRequest({ sequenceNumberAction, options }, updateSequenceNumberOperationSpec);
+	    }
+	    /**
+	     * The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.
+	     * The snapshot is copied such that only the differential changes between the previously copied
+	     * snapshot are transferred to the destination. The copied snapshots are complete copies of the
+	     * original snapshot and can be read or copied from as usual. This API is supported since REST version
+	     * 2016-05-31.
+	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
+	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
+	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
+	     *                   access signature.
+	     * @param options The options parameters.
+	     */
+	    copyIncremental(copySource, options) {
+	        return this.client.sendOperationRequest({ copySource, options }, copyIncrementalOperationSpec);
+	    }
+	}
+	pageBlob$1.PageBlobImpl = PageBlobImpl;
+	// Operation Specifications
+	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
+	const createOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.PageBlobCreateHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobCreateExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobCacheControl,
+	        Parameters.blobContentType,
+	        Parameters.blobContentMD5,
+	        Parameters.blobContentEncoding,
+	        Parameters.blobContentLanguage,
+	        Parameters.blobContentDisposition,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	        Parameters.encryptionScope,
+	        Parameters.tier,
+	        Parameters.blobTagsString,
+	        Parameters.legalHold1,
+	        Parameters.blobType,
+	        Parameters.blobContentLength,
+	        Parameters.blobSequenceNumber,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const uploadPagesOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.PageBlobUploadPagesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobUploadPagesExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.body1,
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.range,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	        Parameters.transactionalContentMD5,
+	        Parameters.transactionalContentCrc64,
+	        Parameters.contentType1,
+	        Parameters.accept2,
+	        Parameters.pageWrite,
+	        Parameters.ifSequenceNumberLessThanOrEqualTo,
+	        Parameters.ifSequenceNumberLessThan,
+	        Parameters.ifSequenceNumberEqualTo,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "binary",
+	    serializer: xmlSerializer,
+	};
+	const clearPagesOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.PageBlobClearPagesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobClearPagesExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.range,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	        Parameters.ifSequenceNumberLessThanOrEqualTo,
+	        Parameters.ifSequenceNumberLessThan,
+	        Parameters.ifSequenceNumberEqualTo,
+	        Parameters.pageWrite1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const uploadPagesFromURLOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.PageBlobUploadPagesFromURLHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobUploadPagesFromURLExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	        Parameters.sourceIfModifiedSince,
+	        Parameters.sourceIfUnmodifiedSince,
+	        Parameters.sourceIfMatch,
+	        Parameters.sourceIfNoneMatch,
+	        Parameters.sourceContentMD5,
+	        Parameters.copySourceAuthorization,
+	        Parameters.fileRequestIntent,
+	        Parameters.pageWrite,
+	        Parameters.ifSequenceNumberLessThanOrEqualTo,
+	        Parameters.ifSequenceNumberLessThan,
+	        Parameters.ifSequenceNumberEqualTo,
+	        Parameters.sourceUrl,
+	        Parameters.sourceRange,
+	        Parameters.sourceContentCrc64,
+	        Parameters.range1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getPageRangesOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.PageList,
+	            headersMapper: Mappers.PageBlobGetPageRangesHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobGetPageRangesExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.snapshot,
+	        Parameters.comp20,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.range,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const getPageRangesDiffOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.PageList,
+	            headersMapper: Mappers.PageBlobGetPageRangesDiffHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobGetPageRangesDiffExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.marker,
+	        Parameters.maxPageSize,
+	        Parameters.snapshot,
+	        Parameters.comp20,
+	        Parameters.prevsnapshot,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.range,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.prevSnapshotUrl,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const resizeOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.PageBlobResizeHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobResizeExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	        Parameters.blobContentLength,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const updateSequenceNumberOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.PageBlobUpdateSequenceNumberHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobUpdateSequenceNumberExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobSequenceNumber,
+	        Parameters.sequenceNumberAction,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const copyIncrementalOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        202: {
+	            headersMapper: Mappers.PageBlobCopyIncrementalHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.PageBlobCopyIncrementalExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp21],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.copySource,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	
+	return pageBlob$1;
+}
+
+var appendBlob$1 = {};
+
+var hasRequiredAppendBlob$1;
+
+function requireAppendBlob$1 () {
+	if (hasRequiredAppendBlob$1) return appendBlob$1;
+	hasRequiredAppendBlob$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(appendBlob$1, "__esModule", { value: true });
+	appendBlob$1.AppendBlobImpl = void 0;
+	const tslib_1 = require$$0$2;
+	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
+	const Mappers = tslib_1.__importStar(requireMappers());
+	const Parameters = tslib_1.__importStar(requireParameters());
+	/** Class containing AppendBlob operations. */
+	class AppendBlobImpl {
+	    client;
+	    /**
+	     * Initialize a new instance of the class AppendBlob class.
+	     * @param client Reference to the service client
+	     */
+	    constructor(client) {
+	        this.client = client;
+	    }
+	    /**
+	     * The Create Append Blob operation creates a new append blob.
+	     * @param contentLength The length of the request.
+	     * @param options The options parameters.
+	     */
+	    create(contentLength, options) {
+	        return this.client.sendOperationRequest({ contentLength, options }, createOperationSpec);
+	    }
+	    /**
+	     * The Append Block operation commits a new block of data to the end of an existing append blob. The
+	     * Append Block operation is permitted only if the blob was created with x-ms-blob-type set to
+	     * AppendBlob. Append Block is supported only on version 2015-02-21 version or later.
+	     * @param contentLength The length of the request.
+	     * @param body Initial data
+	     * @param options The options parameters.
+	     */
+	    appendBlock(contentLength, body, options) {
+	        return this.client.sendOperationRequest({ contentLength, body, options }, appendBlockOperationSpec);
+	    }
+	    /**
+	     * The Append Block operation commits a new block of data to the end of an existing append blob where
+	     * the contents are read from a source url. The Append Block operation is permitted only if the blob
+	     * was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version
+	     * 2015-02-21 version or later.
+	     * @param sourceUrl Specify a URL to the copy source.
+	     * @param contentLength The length of the request.
+	     * @param options The options parameters.
+	     */
+	    appendBlockFromUrl(sourceUrl, contentLength, options) {
+	        return this.client.sendOperationRequest({ sourceUrl, contentLength, options }, appendBlockFromUrlOperationSpec);
+	    }
+	    /**
+	     * The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version
+	     * 2019-12-12 version or later.
+	     * @param options The options parameters.
+	     */
+	    seal(options) {
+	        return this.client.sendOperationRequest({ options }, sealOperationSpec);
+	    }
+	}
+	appendBlob$1.AppendBlobImpl = AppendBlobImpl;
+	// Operation Specifications
+	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
+	const createOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.AppendBlobCreateHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.AppendBlobCreateExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobCacheControl,
+	        Parameters.blobContentType,
+	        Parameters.blobContentMD5,
+	        Parameters.blobContentEncoding,
+	        Parameters.blobContentLanguage,
+	        Parameters.blobContentDisposition,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	        Parameters.encryptionScope,
+	        Parameters.blobTagsString,
+	        Parameters.legalHold1,
+	        Parameters.blobType1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const appendBlockOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.AppendBlobAppendBlockHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.AppendBlobAppendBlockExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.body1,
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp22],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	        Parameters.transactionalContentMD5,
+	        Parameters.transactionalContentCrc64,
+	        Parameters.contentType1,
+	        Parameters.accept2,
+	        Parameters.maxSize,
+	        Parameters.appendPosition,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "binary",
+	    serializer: xmlSerializer,
+	};
+	const appendBlockFromUrlOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.AppendBlobAppendBlockFromUrlHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.AppendBlobAppendBlockFromUrlExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp22],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.encryptionScope,
+	        Parameters.sourceIfModifiedSince,
+	        Parameters.sourceIfUnmodifiedSince,
+	        Parameters.sourceIfMatch,
+	        Parameters.sourceIfNoneMatch,
+	        Parameters.sourceContentMD5,
+	        Parameters.copySourceAuthorization,
+	        Parameters.fileRequestIntent,
+	        Parameters.transactionalContentMD5,
+	        Parameters.sourceUrl,
+	        Parameters.sourceContentCrc64,
+	        Parameters.maxSize,
+	        Parameters.appendPosition,
+	        Parameters.sourceRange1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const sealOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        200: {
+	            headersMapper: Mappers.AppendBlobSealHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.AppendBlobSealExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp23],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.appendPosition,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	
+	return appendBlob$1;
+}
+
+var blockBlob$1 = {};
+
+var hasRequiredBlockBlob$1;
+
+function requireBlockBlob$1 () {
+	if (hasRequiredBlockBlob$1) return blockBlob$1;
+	hasRequiredBlockBlob$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(blockBlob$1, "__esModule", { value: true });
+	blockBlob$1.BlockBlobImpl = void 0;
+	const tslib_1 = require$$0$2;
+	const coreClient = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$7());
+	const Mappers = tslib_1.__importStar(requireMappers());
+	const Parameters = tslib_1.__importStar(requireParameters());
+	/** Class containing BlockBlob operations. */
+	class BlockBlobImpl {
+	    client;
+	    /**
+	     * Initialize a new instance of the class BlockBlob class.
+	     * @param client Reference to the service client
+	     */
+	    constructor(client) {
+	        this.client = client;
+	    }
+	    /**
+	     * The Upload Block Blob operation updates the content of an existing block blob. Updating an existing
+	     * block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put
+	     * Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a
+	     * partial update of the content of a block blob, use the Put Block List operation.
+	     * @param contentLength The length of the request.
+	     * @param body Initial data
+	     * @param options The options parameters.
+	     */
+	    upload(contentLength, body, options) {
+	        return this.client.sendOperationRequest({ contentLength, body, options }, uploadOperationSpec);
+	    }
+	    /**
+	     * The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read
+	     * from a given URL.  This API is supported beginning with the 2020-04-08 version. Partial updates are
+	     * not supported with Put Blob from URL; the content of an existing blob is overwritten with the
+	     * content of the new blob.  To perform partial updates to a block blob’s contents using a source URL,
+	     * use the Put Block from URL API in conjunction with Put Block List.
+	     * @param contentLength The length of the request.
+	     * @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
+	     *                   2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
+	     *                   appear in a request URI. The source blob must either be public or must be authenticated via a shared
+	     *                   access signature.
+	     * @param options The options parameters.
+	     */
+	    putBlobFromUrl(contentLength, copySource, options) {
+	        return this.client.sendOperationRequest({ contentLength, copySource, options }, putBlobFromUrlOperationSpec);
+	    }
+	    /**
+	     * The Stage Block operation creates a new block to be committed as part of a blob
+	     * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
+	     *                must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
+	     *                for the blockid parameter must be the same size for each block.
+	     * @param contentLength The length of the request.
+	     * @param body Initial data
+	     * @param options The options parameters.
+	     */
+	    stageBlock(blockId, contentLength, body, options) {
+	        return this.client.sendOperationRequest({ blockId, contentLength, body, options }, stageBlockOperationSpec);
+	    }
+	    /**
+	     * The Stage Block operation creates a new block to be committed as part of a blob where the contents
+	     * are read from a URL.
+	     * @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
+	     *                must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
+	     *                for the blockid parameter must be the same size for each block.
+	     * @param contentLength The length of the request.
+	     * @param sourceUrl Specify a URL to the copy source.
+	     * @param options The options parameters.
+	     */
+	    stageBlockFromURL(blockId, contentLength, sourceUrl, options) {
+	        return this.client.sendOperationRequest({ blockId, contentLength, sourceUrl, options }, stageBlockFromURLOperationSpec);
+	    }
+	    /**
+	     * The Commit Block List operation writes a blob by specifying the list of block IDs that make up the
+	     * blob. In order to be written as part of a blob, a block must have been successfully written to the
+	     * server in a prior Put Block operation. You can call Put Block List to update a blob by uploading
+	     * only those blocks that have changed, then committing the new and existing blocks together. You can
+	     * do this by specifying whether to commit a block from the committed block list or from the
+	     * uncommitted block list, or to commit the most recently uploaded version of the block, whichever list
+	     * it may belong to.
+	     * @param blocks Blob Blocks.
+	     * @param options The options parameters.
+	     */
+	    commitBlockList(blocks, options) {
+	        return this.client.sendOperationRequest({ blocks, options }, commitBlockListOperationSpec);
+	    }
+	    /**
+	     * The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block
+	     * blob
+	     * @param listType Specifies whether to return the list of committed blocks, the list of uncommitted
+	     *                 blocks, or both lists together.
+	     * @param options The options parameters.
+	     */
+	    getBlockList(listType, options) {
+	        return this.client.sendOperationRequest({ listType, options }, getBlockListOperationSpec);
+	    }
+	}
+	blockBlob$1.BlockBlobImpl = BlockBlobImpl;
+	// Operation Specifications
+	const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true);
+	const uploadOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlockBlobUploadHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlockBlobUploadExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.body1,
+	    queryParameters: [Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.contentLength,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobCacheControl,
+	        Parameters.blobContentType,
+	        Parameters.blobContentMD5,
+	        Parameters.blobContentEncoding,
+	        Parameters.blobContentLanguage,
+	        Parameters.blobContentDisposition,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	        Parameters.encryptionScope,
+	        Parameters.tier,
+	        Parameters.blobTagsString,
+	        Parameters.legalHold1,
+	        Parameters.transactionalContentMD5,
+	        Parameters.transactionalContentCrc64,
+	        Parameters.contentType1,
+	        Parameters.accept2,
+	        Parameters.blobType2,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "binary",
+	    serializer: xmlSerializer,
+	};
+	const putBlobFromUrlOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlockBlobPutBlobFromUrlHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlockBlobPutBlobFromUrlExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [Parameters.timeoutInSeconds],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobCacheControl,
+	        Parameters.blobContentType,
+	        Parameters.blobContentMD5,
+	        Parameters.blobContentEncoding,
+	        Parameters.blobContentLanguage,
+	        Parameters.blobContentDisposition,
+	        Parameters.encryptionScope,
+	        Parameters.tier,
+	        Parameters.sourceIfModifiedSince,
+	        Parameters.sourceIfUnmodifiedSince,
+	        Parameters.sourceIfMatch,
+	        Parameters.sourceIfNoneMatch,
+	        Parameters.sourceIfTags,
+	        Parameters.copySource,
+	        Parameters.blobTagsString,
+	        Parameters.sourceContentMD5,
+	        Parameters.copySourceAuthorization,
+	        Parameters.copySourceTags,
+	        Parameters.fileRequestIntent,
+	        Parameters.transactionalContentMD5,
+	        Parameters.blobType2,
+	        Parameters.copySourceBlobProperties,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const stageBlockOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlockBlobStageBlockHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlockBlobStageBlockExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.body1,
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp24,
+	        Parameters.blockId,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.encryptionScope,
+	        Parameters.transactionalContentMD5,
+	        Parameters.transactionalContentCrc64,
+	        Parameters.contentType1,
+	        Parameters.accept2,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "binary",
+	    serializer: xmlSerializer,
+	};
+	const stageBlockFromURLOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlockBlobStageBlockFromURLHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlockBlobStageBlockFromURLExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.comp24,
+	        Parameters.blockId,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.contentLength,
+	        Parameters.leaseId,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.encryptionScope,
+	        Parameters.sourceIfModifiedSince,
+	        Parameters.sourceIfUnmodifiedSince,
+	        Parameters.sourceIfMatch,
+	        Parameters.sourceIfNoneMatch,
+	        Parameters.sourceContentMD5,
+	        Parameters.copySourceAuthorization,
+	        Parameters.fileRequestIntent,
+	        Parameters.sourceUrl,
+	        Parameters.sourceContentCrc64,
+	        Parameters.sourceRange1,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	const commitBlockListOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "PUT",
+	    responses: {
+	        201: {
+	            headersMapper: Mappers.BlockBlobCommitBlockListHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlockBlobCommitBlockListExceptionHeaders,
+	        },
+	    },
+	    requestBody: Parameters.blocks,
+	    queryParameters: [Parameters.timeoutInSeconds, Parameters.comp25],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.contentType,
+	        Parameters.accept,
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.metadata,
+	        Parameters.leaseId,
+	        Parameters.ifModifiedSince,
+	        Parameters.ifUnmodifiedSince,
+	        Parameters.encryptionKey,
+	        Parameters.encryptionKeySha256,
+	        Parameters.encryptionAlgorithm,
+	        Parameters.ifMatch,
+	        Parameters.ifNoneMatch,
+	        Parameters.ifTags,
+	        Parameters.blobCacheControl,
+	        Parameters.blobContentType,
+	        Parameters.blobContentMD5,
+	        Parameters.blobContentEncoding,
+	        Parameters.blobContentLanguage,
+	        Parameters.blobContentDisposition,
+	        Parameters.immutabilityPolicyExpiry,
+	        Parameters.immutabilityPolicyMode,
+	        Parameters.encryptionScope,
+	        Parameters.tier,
+	        Parameters.blobTagsString,
+	        Parameters.legalHold1,
+	        Parameters.transactionalContentMD5,
+	        Parameters.transactionalContentCrc64,
+	    ],
+	    isXML: true,
+	    contentType: "application/xml; charset=utf-8",
+	    mediaType: "xml",
+	    serializer: xmlSerializer,
+	};
+	const getBlockListOperationSpec = {
+	    path: "/{containerName}/{blob}",
+	    httpMethod: "GET",
+	    responses: {
+	        200: {
+	            bodyMapper: Mappers.BlockList,
+	            headersMapper: Mappers.BlockBlobGetBlockListHeaders,
+	        },
+	        default: {
+	            bodyMapper: Mappers.StorageError,
+	            headersMapper: Mappers.BlockBlobGetBlockListExceptionHeaders,
+	        },
+	    },
+	    queryParameters: [
+	        Parameters.timeoutInSeconds,
+	        Parameters.snapshot,
+	        Parameters.comp25,
+	        Parameters.listType,
+	    ],
+	    urlParameters: [Parameters.url],
+	    headerParameters: [
+	        Parameters.version,
+	        Parameters.requestId,
+	        Parameters.accept1,
+	        Parameters.leaseId,
+	        Parameters.ifTags,
+	    ],
+	    isXML: true,
+	    serializer: xmlSerializer,
+	};
+	
+	return blockBlob$1;
+}
+
+var hasRequiredOperations;
+
+function requireOperations () {
+	if (hasRequiredOperations) return operations;
+	hasRequiredOperations = 1;
+	(function (exports$1) {
+		/*
+		 * Copyright (c) Microsoft Corporation.
+		 * Licensed under the MIT License.
+		 *
+		 * Code generated by Microsoft (R) AutoRest Code Generator.
+		 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+		 */
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		const tslib_1 = require$$0$2;
+		tslib_1.__exportStar(requireService$1(), exports$1);
+		tslib_1.__exportStar(requireContainer$1(), exports$1);
+		tslib_1.__exportStar(requireBlob$1(), exports$1);
+		tslib_1.__exportStar(requirePageBlob$1(), exports$1);
+		tslib_1.__exportStar(requireAppendBlob$1(), exports$1);
+		tslib_1.__exportStar(requireBlockBlob$1(), exports$1);
+		
+	} (operations));
+	return operations;
+}
+
+var hasRequiredStorageClient$1;
+
+function requireStorageClient$1 () {
+	if (hasRequiredStorageClient$1) return storageClient;
+	hasRequiredStorageClient$1 = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(storageClient, "__esModule", { value: true });
+	storageClient.StorageClient = void 0;
+	const tslib_1 = require$$0$2;
+	const coreHttpCompat = tslib_1.__importStar(/*@__PURE__*/ requireCommonjs$6());
+	const index_js_1 = requireOperations();
+	class StorageClient extends coreHttpCompat.ExtendedServiceClient {
+	    url;
+	    version;
+	    /**
+	     * Initializes a new instance of the StorageClient class.
+	     * @param url The URL of the service account, container, or blob that is the target of the desired
+	     *            operation.
+	     * @param options The parameter options
+	     */
+	    constructor(url, options) {
+	        if (url === undefined) {
+	            throw new Error("'url' cannot be null");
+	        }
+	        // Initializing default values for options
+	        if (!options) {
+	            options = {};
+	        }
+	        const defaults = {
+	            requestContentType: "application/json; charset=utf-8",
+	        };
+	        const packageDetails = `azsdk-js-azure-storage-blob/12.29.1`;
+	        const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix
+	            ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}`
+	            : `${packageDetails}`;
+	        const optionsWithDefaults = {
+	            ...defaults,
+	            ...options,
+	            userAgentOptions: {
+	                userAgentPrefix,
+	            },
+	            endpoint: options.endpoint ?? options.baseUri ?? "{url}",
+	        };
+	        super(optionsWithDefaults);
+	        // Parameter assignments
+	        this.url = url;
+	        // Assigning values to Constant parameters
+	        this.version = options.version || "2025-11-05";
+	        this.service = new index_js_1.ServiceImpl(this);
+	        this.container = new index_js_1.ContainerImpl(this);
+	        this.blob = new index_js_1.BlobImpl(this);
+	        this.pageBlob = new index_js_1.PageBlobImpl(this);
+	        this.appendBlob = new index_js_1.AppendBlobImpl(this);
+	        this.blockBlob = new index_js_1.BlockBlobImpl(this);
+	    }
+	    service;
+	    container;
+	    blob;
+	    pageBlob;
+	    appendBlob;
+	    blockBlob;
+	}
+	storageClient.StorageClient = StorageClient;
+	
+	return storageClient;
+}
+
+var operationsInterfaces = {};
+
+var service = {};
+
+var hasRequiredService;
+
+function requireService () {
+	if (hasRequiredService) return service;
+	hasRequiredService = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(service, "__esModule", { value: true });
+	
+	return service;
+}
+
+var container = {};
+
+var hasRequiredContainer;
+
+function requireContainer () {
+	if (hasRequiredContainer) return container;
+	hasRequiredContainer = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(container, "__esModule", { value: true });
+	
+	return container;
+}
+
+var blob = {};
+
+var hasRequiredBlob;
+
+function requireBlob () {
+	if (hasRequiredBlob) return blob;
+	hasRequiredBlob = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(blob, "__esModule", { value: true });
+	
+	return blob;
+}
+
+var pageBlob = {};
+
+var hasRequiredPageBlob;
+
+function requirePageBlob () {
+	if (hasRequiredPageBlob) return pageBlob;
+	hasRequiredPageBlob = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(pageBlob, "__esModule", { value: true });
+	
+	return pageBlob;
+}
+
+var appendBlob = {};
+
+var hasRequiredAppendBlob;
+
+function requireAppendBlob () {
+	if (hasRequiredAppendBlob) return appendBlob;
+	hasRequiredAppendBlob = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(appendBlob, "__esModule", { value: true });
+	
+	return appendBlob;
+}
+
+var blockBlob = {};
+
+var hasRequiredBlockBlob;
+
+function requireBlockBlob () {
+	if (hasRequiredBlockBlob) return blockBlob;
+	hasRequiredBlockBlob = 1;
+	/*
+	 * Copyright (c) Microsoft Corporation.
+	 * Licensed under the MIT License.
+	 *
+	 * Code generated by Microsoft (R) AutoRest Code Generator.
+	 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+	 */
+	Object.defineProperty(blockBlob, "__esModule", { value: true });
+	
+	return blockBlob;
+}
+
+var hasRequiredOperationsInterfaces;
+
+function requireOperationsInterfaces () {
+	if (hasRequiredOperationsInterfaces) return operationsInterfaces;
+	hasRequiredOperationsInterfaces = 1;
+	(function (exports$1) {
+		/*
+		 * Copyright (c) Microsoft Corporation.
+		 * Licensed under the MIT License.
+		 *
+		 * Code generated by Microsoft (R) AutoRest Code Generator.
+		 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+		 */
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		const tslib_1 = require$$0$2;
+		tslib_1.__exportStar(requireService(), exports$1);
+		tslib_1.__exportStar(requireContainer(), exports$1);
+		tslib_1.__exportStar(requireBlob(), exports$1);
+		tslib_1.__exportStar(requirePageBlob(), exports$1);
+		tslib_1.__exportStar(requireAppendBlob(), exports$1);
+		tslib_1.__exportStar(requireBlockBlob(), exports$1);
+		
+	} (operationsInterfaces));
+	return operationsInterfaces;
+}
+
+var hasRequiredSrc;
+
+function requireSrc () {
+	if (hasRequiredSrc) return src$1;
+	hasRequiredSrc = 1;
+	(function (exports$1) {
+		/*
+		 * Copyright (c) Microsoft Corporation.
+		 * Licensed under the MIT License.
+		 *
+		 * Code generated by Microsoft (R) AutoRest Code Generator.
+		 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
+		 */
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.StorageClient = void 0;
+		const tslib_1 = require$$0$2;
+		tslib_1.__exportStar(requireModels$1(), exports$1);
+		var storageClient_js_1 = requireStorageClient$1();
+		Object.defineProperty(exports$1, "StorageClient", { enumerable: true, get: function () { return storageClient_js_1.StorageClient; } });
+		tslib_1.__exportStar(requireOperationsInterfaces(), exports$1);
+		
+	} (src$1));
+	return src$1;
+}
+
+var hasRequiredStorageContextClient;
+
+function requireStorageContextClient () {
+	if (hasRequiredStorageContextClient) return StorageContextClient;
+	hasRequiredStorageContextClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageContextClient, "__esModule", { value: true });
+	StorageContextClient.StorageContextClient = void 0;
+	const index_js_1 = requireSrc();
+	/**
+	 * @internal
+	 */
+	let StorageContextClient$1 = class StorageContextClient extends index_js_1.StorageClient {
+	    async sendOperationRequest(operationArguments, operationSpec) {
+	        const operationSpecToSend = { ...operationSpec };
+	        if (operationSpecToSend.path === "/{containerName}" ||
+	            operationSpecToSend.path === "/{containerName}/{blob}") {
+	            operationSpecToSend.path = "";
+	        }
+	        return super.sendOperationRequest(operationArguments, operationSpecToSend);
+	    }
+	};
+	StorageContextClient.StorageContextClient = StorageContextClient$1;
+	
+	return StorageContextClient;
+}
+
+var hasRequiredStorageClient;
+
+function requireStorageClient () {
+	if (hasRequiredStorageClient) return StorageClient;
+	hasRequiredStorageClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(StorageClient, "__esModule", { value: true });
+	StorageClient.StorageClient = void 0;
+	const StorageContextClient_js_1 = requireStorageContextClient();
+	const Pipeline_js_1 = requirePipeline();
+	const utils_common_js_1 = requireUtils_common$2();
+	/**
+	 * A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}
+	 * and etc.
+	 */
+	let StorageClient$1 = class StorageClient {
+	    /**
+	     * Encoded URL string value.
+	     */
+	    url;
+	    accountName;
+	    /**
+	     * Request policy pipeline.
+	     *
+	     * @internal
+	     */
+	    pipeline;
+	    /**
+	     * Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
+	     */
+	    credential;
+	    /**
+	     * StorageClient is a reference to protocol layer operations entry, which is
+	     * generated by AutoRest generator.
+	     */
+	    storageClientContext;
+	    /**
+	     */
+	    isHttps;
+	    /**
+	     * Creates an instance of StorageClient.
+	     * @param url - url to resource
+	     * @param pipeline - request policy pipeline.
+	     */
+	    constructor(url, pipeline) {
+	        // URL should be encoded and only once, protocol layer shouldn't encode URL again
+	        this.url = (0, utils_common_js_1.escapeURLPath)(url);
+	        this.accountName = (0, utils_common_js_1.getAccountNameFromUrl)(url);
+	        this.pipeline = pipeline;
+	        this.storageClientContext = new StorageContextClient_js_1.StorageContextClient(this.url, (0, Pipeline_js_1.getCoreClientOptions)(pipeline));
+	        this.isHttps = (0, utils_common_js_1.iEqual)((0, utils_common_js_1.getURLScheme)(this.url) || "", "https");
+	        this.credential = (0, Pipeline_js_1.getCredentialFromPipeline)(pipeline);
+	        // Override protocol layer's default content-type
+	        const storageClientContext = this.storageClientContext;
+	        storageClientContext.requestContentType = undefined;
+	    }
+	};
+	StorageClient.StorageClient = StorageClient$1;
+	
+	return StorageClient;
+}
+
+var tracing = {};
+
+var hasRequiredTracing;
+
+function requireTracing () {
+	if (hasRequiredTracing) return tracing;
+	hasRequiredTracing = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(tracing, "__esModule", { value: true });
+	tracing.tracingClient = void 0;
+	const core_tracing_1 = /*@__PURE__*/ requireCommonjs$a();
+	const constants_js_1 = requireConstants$8();
+	/**
+	 * Creates a span using the global tracer.
+	 * @internal
+	 */
+	tracing.tracingClient = (0, core_tracing_1.createTracingClient)({
+	    packageName: "@azure/storage-blob",
+	    packageVersion: constants_js_1.SDK_VERSION,
+	    namespace: "Microsoft.Storage",
+	});
+	
+	return tracing;
+}
+
+var BlobSASSignatureValues = {};
+
+var BlobSASPermissions = {};
+
+var hasRequiredBlobSASPermissions;
+
+function requireBlobSASPermissions () {
+	if (hasRequiredBlobSASPermissions) return BlobSASPermissions;
+	hasRequiredBlobSASPermissions = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobSASPermissions, "__esModule", { value: true });
+	BlobSASPermissions.BlobSASPermissions = void 0;
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a blob. Setting
+	 * a value to true means that any SAS which uses these permissions will grant permissions for that operation. Once all
+	 * the values are set, this should be serialized with toString and set as the permissions field on a
+	 * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but
+	 * the order of the permissions is particular and this class guarantees correctness.
+	 */
+	let BlobSASPermissions$1 = class BlobSASPermissions {
+	    /**
+	     * Creates a {@link BlobSASPermissions} from the specified permissions string. This method will throw an
+	     * Error if it encounters a character that does not correspond to a valid permission.
+	     *
+	     * @param permissions -
+	     */
+	    static parse(permissions) {
+	        const blobSASPermissions = new BlobSASPermissions();
+	        for (const char of permissions) {
+	            switch (char) {
+	                case "r":
+	                    blobSASPermissions.read = true;
+	                    break;
+	                case "a":
+	                    blobSASPermissions.add = true;
+	                    break;
+	                case "c":
+	                    blobSASPermissions.create = true;
+	                    break;
+	                case "w":
+	                    blobSASPermissions.write = true;
+	                    break;
+	                case "d":
+	                    blobSASPermissions.delete = true;
+	                    break;
+	                case "x":
+	                    blobSASPermissions.deleteVersion = true;
+	                    break;
+	                case "t":
+	                    blobSASPermissions.tag = true;
+	                    break;
+	                case "m":
+	                    blobSASPermissions.move = true;
+	                    break;
+	                case "e":
+	                    blobSASPermissions.execute = true;
+	                    break;
+	                case "i":
+	                    blobSASPermissions.setImmutabilityPolicy = true;
+	                    break;
+	                case "y":
+	                    blobSASPermissions.permanentDelete = true;
+	                    break;
+	                default:
+	                    throw new RangeError(`Invalid permission: ${char}`);
+	            }
+	        }
+	        return blobSASPermissions;
+	    }
+	    /**
+	     * Creates a {@link BlobSASPermissions} from a raw object which contains same keys as it
+	     * and boolean values for them.
+	     *
+	     * @param permissionLike -
+	     */
+	    static from(permissionLike) {
+	        const blobSASPermissions = new BlobSASPermissions();
+	        if (permissionLike.read) {
+	            blobSASPermissions.read = true;
+	        }
+	        if (permissionLike.add) {
+	            blobSASPermissions.add = true;
+	        }
+	        if (permissionLike.create) {
+	            blobSASPermissions.create = true;
+	        }
+	        if (permissionLike.write) {
+	            blobSASPermissions.write = true;
+	        }
+	        if (permissionLike.delete) {
+	            blobSASPermissions.delete = true;
+	        }
+	        if (permissionLike.deleteVersion) {
+	            blobSASPermissions.deleteVersion = true;
+	        }
+	        if (permissionLike.tag) {
+	            blobSASPermissions.tag = true;
+	        }
+	        if (permissionLike.move) {
+	            blobSASPermissions.move = true;
+	        }
+	        if (permissionLike.execute) {
+	            blobSASPermissions.execute = true;
+	        }
+	        if (permissionLike.setImmutabilityPolicy) {
+	            blobSASPermissions.setImmutabilityPolicy = true;
+	        }
+	        if (permissionLike.permanentDelete) {
+	            blobSASPermissions.permanentDelete = true;
+	        }
+	        return blobSASPermissions;
+	    }
+	    /**
+	     * Specifies Read access granted.
+	     */
+	    read = false;
+	    /**
+	     * Specifies Add access granted.
+	     */
+	    add = false;
+	    /**
+	     * Specifies Create access granted.
+	     */
+	    create = false;
+	    /**
+	     * Specifies Write access granted.
+	     */
+	    write = false;
+	    /**
+	     * Specifies Delete access granted.
+	     */
+	    delete = false;
+	    /**
+	     * Specifies Delete version access granted.
+	     */
+	    deleteVersion = false;
+	    /**
+	     * Specfies Tag access granted.
+	     */
+	    tag = false;
+	    /**
+	     * Specifies Move access granted.
+	     */
+	    move = false;
+	    /**
+	     * Specifies Execute access granted.
+	     */
+	    execute = false;
+	    /**
+	     * Specifies SetImmutabilityPolicy access granted.
+	     */
+	    setImmutabilityPolicy = false;
+	    /**
+	     * Specifies that Permanent Delete is permitted.
+	     */
+	    permanentDelete = false;
+	    /**
+	     * Converts the given permissions to a string. Using this method will guarantee the permissions are in an
+	     * order accepted by the service.
+	     *
+	     * @returns A string which represents the BlobSASPermissions
+	     */
+	    toString() {
+	        const permissions = [];
+	        if (this.read) {
+	            permissions.push("r");
+	        }
+	        if (this.add) {
+	            permissions.push("a");
+	        }
+	        if (this.create) {
+	            permissions.push("c");
+	        }
+	        if (this.write) {
+	            permissions.push("w");
+	        }
+	        if (this.delete) {
+	            permissions.push("d");
+	        }
+	        if (this.deleteVersion) {
+	            permissions.push("x");
+	        }
+	        if (this.tag) {
+	            permissions.push("t");
+	        }
+	        if (this.move) {
+	            permissions.push("m");
+	        }
+	        if (this.execute) {
+	            permissions.push("e");
+	        }
+	        if (this.setImmutabilityPolicy) {
+	            permissions.push("i");
+	        }
+	        if (this.permanentDelete) {
+	            permissions.push("y");
+	        }
+	        return permissions.join("");
+	    }
+	};
+	BlobSASPermissions.BlobSASPermissions = BlobSASPermissions$1;
+	
+	return BlobSASPermissions;
+}
+
+var ContainerSASPermissions = {};
+
+var hasRequiredContainerSASPermissions;
+
+function requireContainerSASPermissions () {
+	if (hasRequiredContainerSASPermissions) return ContainerSASPermissions;
+	hasRequiredContainerSASPermissions = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(ContainerSASPermissions, "__esModule", { value: true });
+	ContainerSASPermissions.ContainerSASPermissions = void 0;
+	/**
+	 * This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a container.
+	 * Setting a value to true means that any SAS which uses these permissions will grant permissions for that operation.
+	 * Once all the values are set, this should be serialized with toString and set as the permissions field on a
+	 * {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but
+	 * the order of the permissions is particular and this class guarantees correctness.
+	 */
+	let ContainerSASPermissions$1 = class ContainerSASPermissions {
+	    /**
+	     * Creates an {@link ContainerSASPermissions} from the specified permissions string. This method will throw an
+	     * Error if it encounters a character that does not correspond to a valid permission.
+	     *
+	     * @param permissions -
+	     */
+	    static parse(permissions) {
+	        const containerSASPermissions = new ContainerSASPermissions();
+	        for (const char of permissions) {
+	            switch (char) {
+	                case "r":
+	                    containerSASPermissions.read = true;
+	                    break;
+	                case "a":
+	                    containerSASPermissions.add = true;
+	                    break;
+	                case "c":
+	                    containerSASPermissions.create = true;
+	                    break;
+	                case "w":
+	                    containerSASPermissions.write = true;
+	                    break;
+	                case "d":
+	                    containerSASPermissions.delete = true;
+	                    break;
+	                case "l":
+	                    containerSASPermissions.list = true;
+	                    break;
+	                case "t":
+	                    containerSASPermissions.tag = true;
+	                    break;
+	                case "x":
+	                    containerSASPermissions.deleteVersion = true;
+	                    break;
+	                case "m":
+	                    containerSASPermissions.move = true;
+	                    break;
+	                case "e":
+	                    containerSASPermissions.execute = true;
+	                    break;
+	                case "i":
+	                    containerSASPermissions.setImmutabilityPolicy = true;
+	                    break;
+	                case "y":
+	                    containerSASPermissions.permanentDelete = true;
+	                    break;
+	                case "f":
+	                    containerSASPermissions.filterByTags = true;
+	                    break;
+	                default:
+	                    throw new RangeError(`Invalid permission ${char}`);
+	            }
+	        }
+	        return containerSASPermissions;
+	    }
+	    /**
+	     * Creates a {@link ContainerSASPermissions} from a raw object which contains same keys as it
+	     * and boolean values for them.
+	     *
+	     * @param permissionLike -
+	     */
+	    static from(permissionLike) {
+	        const containerSASPermissions = new ContainerSASPermissions();
+	        if (permissionLike.read) {
+	            containerSASPermissions.read = true;
+	        }
+	        if (permissionLike.add) {
+	            containerSASPermissions.add = true;
+	        }
+	        if (permissionLike.create) {
+	            containerSASPermissions.create = true;
+	        }
+	        if (permissionLike.write) {
+	            containerSASPermissions.write = true;
+	        }
+	        if (permissionLike.delete) {
+	            containerSASPermissions.delete = true;
+	        }
+	        if (permissionLike.list) {
+	            containerSASPermissions.list = true;
+	        }
+	        if (permissionLike.deleteVersion) {
+	            containerSASPermissions.deleteVersion = true;
+	        }
+	        if (permissionLike.tag) {
+	            containerSASPermissions.tag = true;
+	        }
+	        if (permissionLike.move) {
+	            containerSASPermissions.move = true;
+	        }
+	        if (permissionLike.execute) {
+	            containerSASPermissions.execute = true;
+	        }
+	        if (permissionLike.setImmutabilityPolicy) {
+	            containerSASPermissions.setImmutabilityPolicy = true;
+	        }
+	        if (permissionLike.permanentDelete) {
+	            containerSASPermissions.permanentDelete = true;
+	        }
+	        if (permissionLike.filterByTags) {
+	            containerSASPermissions.filterByTags = true;
+	        }
+	        return containerSASPermissions;
+	    }
+	    /**
+	     * Specifies Read access granted.
+	     */
+	    read = false;
+	    /**
+	     * Specifies Add access granted.
+	     */
+	    add = false;
+	    /**
+	     * Specifies Create access granted.
+	     */
+	    create = false;
+	    /**
+	     * Specifies Write access granted.
+	     */
+	    write = false;
+	    /**
+	     * Specifies Delete access granted.
+	     */
+	    delete = false;
+	    /**
+	     * Specifies Delete version access granted.
+	     */
+	    deleteVersion = false;
+	    /**
+	     * Specifies List access granted.
+	     */
+	    list = false;
+	    /**
+	     * Specfies Tag access granted.
+	     */
+	    tag = false;
+	    /**
+	     * Specifies Move access granted.
+	     */
+	    move = false;
+	    /**
+	     * Specifies Execute access granted.
+	     */
+	    execute = false;
+	    /**
+	     * Specifies SetImmutabilityPolicy access granted.
+	     */
+	    setImmutabilityPolicy = false;
+	    /**
+	     * Specifies that Permanent Delete is permitted.
+	     */
+	    permanentDelete = false;
+	    /**
+	     * Specifies that Filter Blobs by Tags is permitted.
+	     */
+	    filterByTags = false;
+	    /**
+	     * Converts the given permissions to a string. Using this method will guarantee the permissions are in an
+	     * order accepted by the service.
+	     *
+	     * The order of the characters should be as specified here to ensure correctness.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     */
+	    toString() {
+	        const permissions = [];
+	        if (this.read) {
+	            permissions.push("r");
+	        }
+	        if (this.add) {
+	            permissions.push("a");
+	        }
+	        if (this.create) {
+	            permissions.push("c");
+	        }
+	        if (this.write) {
+	            permissions.push("w");
+	        }
+	        if (this.delete) {
+	            permissions.push("d");
+	        }
+	        if (this.deleteVersion) {
+	            permissions.push("x");
+	        }
+	        if (this.list) {
+	            permissions.push("l");
+	        }
+	        if (this.tag) {
+	            permissions.push("t");
+	        }
+	        if (this.move) {
+	            permissions.push("m");
+	        }
+	        if (this.execute) {
+	            permissions.push("e");
+	        }
+	        if (this.setImmutabilityPolicy) {
+	            permissions.push("i");
+	        }
+	        if (this.permanentDelete) {
+	            permissions.push("y");
+	        }
+	        if (this.filterByTags) {
+	            permissions.push("f");
+	        }
+	        return permissions.join("");
+	    }
+	};
+	ContainerSASPermissions.ContainerSASPermissions = ContainerSASPermissions$1;
+	
+	return ContainerSASPermissions;
+}
+
+var UserDelegationKeyCredential = {};
+
+var hasRequiredUserDelegationKeyCredential;
+
+function requireUserDelegationKeyCredential () {
+	if (hasRequiredUserDelegationKeyCredential) return UserDelegationKeyCredential;
+	hasRequiredUserDelegationKeyCredential = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(UserDelegationKeyCredential, "__esModule", { value: true });
+	UserDelegationKeyCredential.UserDelegationKeyCredential = void 0;
+	const node_crypto_1 = require$$0$d;
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * UserDelegationKeyCredential is only used for generation of user delegation SAS.
+	 * @see https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas
+	 */
+	let UserDelegationKeyCredential$1 = class UserDelegationKeyCredential {
+	    /**
+	     * Azure Storage account name; readonly.
+	     */
+	    accountName;
+	    /**
+	     * Azure Storage user delegation key; readonly.
+	     */
+	    userDelegationKey;
+	    /**
+	     * Key value in Buffer type.
+	     */
+	    key;
+	    /**
+	     * Creates an instance of UserDelegationKeyCredential.
+	     * @param accountName -
+	     * @param userDelegationKey -
+	     */
+	    constructor(accountName, userDelegationKey) {
+	        this.accountName = accountName;
+	        this.userDelegationKey = userDelegationKey;
+	        this.key = Buffer.from(userDelegationKey.value, "base64");
+	    }
+	    /**
+	     * Generates a hash signature for an HTTP request or for a SAS.
+	     *
+	     * @param stringToSign -
+	     */
+	    computeHMACSHA256(stringToSign) {
+	        // console.log(`stringToSign: ${JSON.stringify(stringToSign)}`);
+	        return (0, node_crypto_1.createHmac)("sha256", this.key).update(stringToSign, "utf8").digest("base64");
+	    }
+	};
+	UserDelegationKeyCredential.UserDelegationKeyCredential = UserDelegationKeyCredential$1;
+	
+	return UserDelegationKeyCredential;
+}
+
+var SasIPRange = {};
+
+var hasRequiredSasIPRange;
+
+function requireSasIPRange () {
+	if (hasRequiredSasIPRange) return SasIPRange;
+	hasRequiredSasIPRange = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(SasIPRange, "__esModule", { value: true });
+	SasIPRange.ipRangeToString = ipRangeToString;
+	/**
+	 * Generate SasIPRange format string. For example:
+	 *
+	 * "8.8.8.8" or "1.1.1.1-255.255.255.255"
+	 *
+	 * @param ipRange -
+	 */
+	function ipRangeToString(ipRange) {
+	    return ipRange.end ? `${ipRange.start}-${ipRange.end}` : ipRange.start;
+	}
+	
+	return SasIPRange;
+}
+
+var SASQueryParameters = {};
+
+var hasRequiredSASQueryParameters;
+
+function requireSASQueryParameters () {
+	if (hasRequiredSASQueryParameters) return SASQueryParameters;
+	hasRequiredSASQueryParameters = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(SASQueryParameters, "__esModule", { value: true });
+	SASQueryParameters.SASQueryParameters = SASQueryParameters.SASProtocol = void 0;
+	const SasIPRange_js_1 = requireSasIPRange();
+	const utils_common_js_1 = requireUtils_common$2();
+	/**
+	 * Protocols for generated SAS.
+	 */
+	var SASProtocol;
+	(function (SASProtocol) {
+	    /**
+	     * Protocol that allows HTTPS only
+	     */
+	    SASProtocol["Https"] = "https";
+	    /**
+	     * Protocol that allows both HTTPS and HTTP
+	     */
+	    SASProtocol["HttpsAndHttp"] = "https,http";
+	})(SASProtocol || (SASQueryParameters.SASProtocol = SASProtocol = {}));
+	/**
+	 * Represents the components that make up an Azure Storage SAS' query parameters. This type is not constructed directly
+	 * by the user; it is only generated by the {@link AccountSASSignatureValues} and {@link BlobSASSignatureValues}
+	 * types. Once generated, it can be encoded into a {@link String} and appended to a URL directly (though caution should
+	 * be taken here in case there are existing query parameters, which might affect the appropriate means of appending
+	 * these query parameters).
+	 *
+	 * NOTE: Instances of this class are immutable.
+	 */
+	let SASQueryParameters$1 = class SASQueryParameters {
+	    /**
+	     * The storage API version.
+	     */
+	    version;
+	    /**
+	     * Optional. The allowed HTTP protocol(s).
+	     */
+	    protocol;
+	    /**
+	     * Optional. The start time for this SAS token.
+	     */
+	    startsOn;
+	    /**
+	     * Optional only when identifier is provided. The expiry time for this SAS token.
+	     */
+	    expiresOn;
+	    /**
+	     * Optional only when identifier is provided.
+	     * Please refer to {@link AccountSASPermissions}, {@link BlobSASPermissions}, or {@link ContainerSASPermissions} for
+	     * more details.
+	     */
+	    permissions;
+	    /**
+	     * Optional. The storage services being accessed (only for Account SAS). Please refer to {@link AccountSASServices}
+	     * for more details.
+	     */
+	    services;
+	    /**
+	     * Optional. The storage resource types being accessed (only for Account SAS). Please refer to
+	     * {@link AccountSASResourceTypes} for more details.
+	     */
+	    resourceTypes;
+	    /**
+	     * Optional. The signed identifier (only for {@link BlobSASSignatureValues}).
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/establishing-a-stored-access-policy
+	     */
+	    identifier;
+	    /**
+	     * Optional. Encryption scope to use when sending requests authorized with this SAS URI.
+	     */
+	    encryptionScope;
+	    /**
+	     * Optional. Specifies which resources are accessible via the SAS (only for {@link BlobSASSignatureValues}).
+	     * @see https://learn.microsoft.com/rest/api/storageservices/create-service-sas#specifying-the-signed-resource-blob-service-only
+	     */
+	    resource;
+	    /**
+	     * The signature for the SAS token.
+	     */
+	    signature;
+	    /**
+	     * Value for cache-control header in Blob/File Service SAS.
+	     */
+	    cacheControl;
+	    /**
+	     * Value for content-disposition header in Blob/File Service SAS.
+	     */
+	    contentDisposition;
+	    /**
+	     * Value for content-encoding header in Blob/File Service SAS.
+	     */
+	    contentEncoding;
+	    /**
+	     * Value for content-length header in Blob/File Service SAS.
+	     */
+	    contentLanguage;
+	    /**
+	     * Value for content-type header in Blob/File Service SAS.
+	     */
+	    contentType;
+	    /**
+	     * Inner value of getter ipRange.
+	     */
+	    ipRangeInner;
+	    /**
+	     * The Azure Active Directory object ID in GUID format.
+	     * Property of user delegation key.
+	     */
+	    signedOid;
+	    /**
+	     * The Azure Active Directory tenant ID in GUID format.
+	     * Property of user delegation key.
+	     */
+	    signedTenantId;
+	    /**
+	     * The date-time the key is active.
+	     * Property of user delegation key.
+	     */
+	    signedStartsOn;
+	    /**
+	     * The date-time the key expires.
+	     * Property of user delegation key.
+	     */
+	    signedExpiresOn;
+	    /**
+	     * Abbreviation of the Azure Storage service that accepts the user delegation key.
+	     * Property of user delegation key.
+	     */
+	    signedService;
+	    /**
+	     * The service version that created the user delegation key.
+	     * Property of user delegation key.
+	     */
+	    signedVersion;
+	    /**
+	     * Authorized AAD Object ID in GUID format. The AAD Object ID of a user authorized by the owner of the User Delegation Key
+	     * to perform the action granted by the SAS. The Azure Storage service will ensure that the owner of the user delegation key
+	     * has the required permissions before granting access but no additional permission check for the user specified in
+	     * this value will be performed. This is only used for User Delegation SAS.
+	     */
+	    preauthorizedAgentObjectId;
+	    /**
+	     * A GUID value that will be logged in the storage diagnostic logs and can be used to correlate SAS generation with storage resource access.
+	     * This is only used for User Delegation SAS.
+	     */
+	    correlationId;
+	    /**
+	     * Optional. IP range allowed for this SAS.
+	     *
+	     * @readonly
+	     */
+	    get ipRange() {
+	        if (this.ipRangeInner) {
+	            return {
+	                end: this.ipRangeInner.end,
+	                start: this.ipRangeInner.start,
+	            };
+	        }
+	        return undefined;
+	    }
+	    constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope) {
+	        this.version = version;
+	        this.signature = signature;
+	        if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") {
+	            // SASQueryParametersOptions
+	            this.permissions = permissionsOrOptions.permissions;
+	            this.services = permissionsOrOptions.services;
+	            this.resourceTypes = permissionsOrOptions.resourceTypes;
+	            this.protocol = permissionsOrOptions.protocol;
+	            this.startsOn = permissionsOrOptions.startsOn;
+	            this.expiresOn = permissionsOrOptions.expiresOn;
+	            this.ipRangeInner = permissionsOrOptions.ipRange;
+	            this.identifier = permissionsOrOptions.identifier;
+	            this.encryptionScope = permissionsOrOptions.encryptionScope;
+	            this.resource = permissionsOrOptions.resource;
+	            this.cacheControl = permissionsOrOptions.cacheControl;
+	            this.contentDisposition = permissionsOrOptions.contentDisposition;
+	            this.contentEncoding = permissionsOrOptions.contentEncoding;
+	            this.contentLanguage = permissionsOrOptions.contentLanguage;
+	            this.contentType = permissionsOrOptions.contentType;
+	            if (permissionsOrOptions.userDelegationKey) {
+	                this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId;
+	                this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId;
+	                this.signedStartsOn = permissionsOrOptions.userDelegationKey.signedStartsOn;
+	                this.signedExpiresOn = permissionsOrOptions.userDelegationKey.signedExpiresOn;
+	                this.signedService = permissionsOrOptions.userDelegationKey.signedService;
+	                this.signedVersion = permissionsOrOptions.userDelegationKey.signedVersion;
+	                this.preauthorizedAgentObjectId = permissionsOrOptions.preauthorizedAgentObjectId;
+	                this.correlationId = permissionsOrOptions.correlationId;
+	            }
+	        }
+	        else {
+	            this.services = services;
+	            this.resourceTypes = resourceTypes;
+	            this.expiresOn = expiresOn;
+	            this.permissions = permissionsOrOptions;
+	            this.protocol = protocol;
+	            this.startsOn = startsOn;
+	            this.ipRangeInner = ipRange;
+	            this.encryptionScope = encryptionScope;
+	            this.identifier = identifier;
+	            this.resource = resource;
+	            this.cacheControl = cacheControl;
+	            this.contentDisposition = contentDisposition;
+	            this.contentEncoding = contentEncoding;
+	            this.contentLanguage = contentLanguage;
+	            this.contentType = contentType;
+	            if (userDelegationKey) {
+	                this.signedOid = userDelegationKey.signedObjectId;
+	                this.signedTenantId = userDelegationKey.signedTenantId;
+	                this.signedStartsOn = userDelegationKey.signedStartsOn;
+	                this.signedExpiresOn = userDelegationKey.signedExpiresOn;
+	                this.signedService = userDelegationKey.signedService;
+	                this.signedVersion = userDelegationKey.signedVersion;
+	                this.preauthorizedAgentObjectId = preauthorizedAgentObjectId;
+	                this.correlationId = correlationId;
+	            }
+	        }
+	    }
+	    /**
+	     * Encodes all SAS query parameters into a string that can be appended to a URL.
+	     *
+	     */
+	    toString() {
+	        const params = [
+	            "sv",
+	            "ss",
+	            "srt",
+	            "spr",
+	            "st",
+	            "se",
+	            "sip",
+	            "si",
+	            "ses",
+	            "skoid", // Signed object ID
+	            "sktid", // Signed tenant ID
+	            "skt", // Signed key start time
+	            "ske", // Signed key expiry time
+	            "sks", // Signed key service
+	            "skv", // Signed key version
+	            "sr",
+	            "sp",
+	            "sig",
+	            "rscc",
+	            "rscd",
+	            "rsce",
+	            "rscl",
+	            "rsct",
+	            "saoid",
+	            "scid",
+	        ];
+	        const queries = [];
+	        for (const param of params) {
+	            switch (param) {
+	                case "sv":
+	                    this.tryAppendQueryParameter(queries, param, this.version);
+	                    break;
+	                case "ss":
+	                    this.tryAppendQueryParameter(queries, param, this.services);
+	                    break;
+	                case "srt":
+	                    this.tryAppendQueryParameter(queries, param, this.resourceTypes);
+	                    break;
+	                case "spr":
+	                    this.tryAppendQueryParameter(queries, param, this.protocol);
+	                    break;
+	                case "st":
+	                    this.tryAppendQueryParameter(queries, param, this.startsOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.startsOn, false) : undefined);
+	                    break;
+	                case "se":
+	                    this.tryAppendQueryParameter(queries, param, this.expiresOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.expiresOn, false) : undefined);
+	                    break;
+	                case "sip":
+	                    this.tryAppendQueryParameter(queries, param, this.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(this.ipRange) : undefined);
+	                    break;
+	                case "si":
+	                    this.tryAppendQueryParameter(queries, param, this.identifier);
+	                    break;
+	                case "ses":
+	                    this.tryAppendQueryParameter(queries, param, this.encryptionScope);
+	                    break;
+	                case "skoid": // Signed object ID
+	                    this.tryAppendQueryParameter(queries, param, this.signedOid);
+	                    break;
+	                case "sktid": // Signed tenant ID
+	                    this.tryAppendQueryParameter(queries, param, this.signedTenantId);
+	                    break;
+	                case "skt": // Signed key start time
+	                    this.tryAppendQueryParameter(queries, param, this.signedStartsOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.signedStartsOn, false) : undefined);
+	                    break;
+	                case "ske": // Signed key expiry time
+	                    this.tryAppendQueryParameter(queries, param, this.signedExpiresOn ? (0, utils_common_js_1.truncatedISO8061Date)(this.signedExpiresOn, false) : undefined);
+	                    break;
+	                case "sks": // Signed key service
+	                    this.tryAppendQueryParameter(queries, param, this.signedService);
+	                    break;
+	                case "skv": // Signed key version
+	                    this.tryAppendQueryParameter(queries, param, this.signedVersion);
+	                    break;
+	                case "sr":
+	                    this.tryAppendQueryParameter(queries, param, this.resource);
+	                    break;
+	                case "sp":
+	                    this.tryAppendQueryParameter(queries, param, this.permissions);
+	                    break;
+	                case "sig":
+	                    this.tryAppendQueryParameter(queries, param, this.signature);
+	                    break;
+	                case "rscc":
+	                    this.tryAppendQueryParameter(queries, param, this.cacheControl);
+	                    break;
+	                case "rscd":
+	                    this.tryAppendQueryParameter(queries, param, this.contentDisposition);
+	                    break;
+	                case "rsce":
+	                    this.tryAppendQueryParameter(queries, param, this.contentEncoding);
+	                    break;
+	                case "rscl":
+	                    this.tryAppendQueryParameter(queries, param, this.contentLanguage);
+	                    break;
+	                case "rsct":
+	                    this.tryAppendQueryParameter(queries, param, this.contentType);
+	                    break;
+	                case "saoid":
+	                    this.tryAppendQueryParameter(queries, param, this.preauthorizedAgentObjectId);
+	                    break;
+	                case "scid":
+	                    this.tryAppendQueryParameter(queries, param, this.correlationId);
+	                    break;
+	            }
+	        }
+	        return queries.join("&");
+	    }
+	    /**
+	     * A private helper method used to filter and append query key/value pairs into an array.
+	     *
+	     * @param queries -
+	     * @param key -
+	     * @param value -
+	     */
+	    tryAppendQueryParameter(queries, key, value) {
+	        if (!value) {
+	            return;
+	        }
+	        key = encodeURIComponent(key);
+	        value = encodeURIComponent(value);
+	        if (key.length > 0 && value.length > 0) {
+	            queries.push(`${key}=${value}`);
+	        }
+	    }
+	};
+	SASQueryParameters.SASQueryParameters = SASQueryParameters$1;
+	
+	return SASQueryParameters;
+}
+
+var hasRequiredBlobSASSignatureValues;
+
+function requireBlobSASSignatureValues () {
+	if (hasRequiredBlobSASSignatureValues) return BlobSASSignatureValues;
+	hasRequiredBlobSASSignatureValues = 1;
+	Object.defineProperty(BlobSASSignatureValues, "__esModule", { value: true });
+	BlobSASSignatureValues.generateBlobSASQueryParameters = generateBlobSASQueryParameters;
+	BlobSASSignatureValues.generateBlobSASQueryParametersInternal = generateBlobSASQueryParametersInternal;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	const BlobSASPermissions_js_1 = requireBlobSASPermissions();
+	const ContainerSASPermissions_js_1 = requireContainerSASPermissions();
+	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
+	const UserDelegationKeyCredential_js_1 = requireUserDelegationKeyCredential();
+	const SasIPRange_js_1 = requireSasIPRange();
+	const SASQueryParameters_js_1 = requireSASQueryParameters();
+	const constants_js_1 = requireConstants$8();
+	const utils_common_js_1 = requireUtils_common$2();
+	function generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {
+	    return generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName).sasQueryParameters;
+	}
+	function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {
+	    const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : constants_js_1.SERVICE_VERSION;
+	    const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential
+	        ? sharedKeyCredentialOrUserDelegationKey
+	        : undefined;
+	    let userDelegationKeyCredential;
+	    if (sharedKeyCredential === undefined && accountName !== undefined) {
+	        userDelegationKeyCredential = new UserDelegationKeyCredential_js_1.UserDelegationKeyCredential(accountName, sharedKeyCredentialOrUserDelegationKey);
+	    }
+	    if (sharedKeyCredential === undefined && userDelegationKeyCredential === undefined) {
+	        throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName.");
+	    }
+	    // Version 2020-12-06 adds support for encryptionscope in SAS.
+	    if (version >= "2020-12-06") {
+	        if (sharedKeyCredential !== undefined) {
+	            return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential);
+	        }
+	        else {
+	            if (version >= "2025-07-05") {
+	                return generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential);
+	            }
+	            else {
+	                return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential);
+	            }
+	        }
+	    }
+	    // Version 2019-12-12 adds support for the blob tags permission.
+	    // Version 2018-11-09 adds support for the signed resource and signed blob snapshot time fields.
+	    // https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas#constructing-the-signature-string
+	    if (version >= "2018-11-09") {
+	        if (sharedKeyCredential !== undefined) {
+	            return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential);
+	        }
+	        else {
+	            // Version 2020-02-10 delegation SAS signature construction includes preauthorizedAgentObjectId, agentObjectId, correlationId.
+	            if (version >= "2020-02-10") {
+	                return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential);
+	            }
+	            else {
+	                return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential);
+	            }
+	        }
+	    }
+	    if (version >= "2015-04-05") {
+	        if (sharedKeyCredential !== undefined) {
+	            return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential);
+	        }
+	        else {
+	            throw new RangeError("'version' must be >= '2018-11-09' when generating user delegation SAS using user delegation key.");
+	        }
+	    }
+	    throw new RangeError("'version' must be >= '2015-04-05'.");
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2015-04-05 AND BEFORE 2018-11-09.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn and identifier.
+	 *
+	 * WARNING: When identifier is not provided, permissions and expiresOn are required.
+	 * You MUST assign value to identifier or expiresOn & permissions manually if you initial with
+	 * this constructor.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param sharedKeyCredential -
+	 */
+	function generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    if (!blobSASSignatureValues.identifier &&
+	        !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
+	    }
+	    let resource = "c";
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        blobSASSignatureValues.identifier,
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
+	        blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
+	        blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
+	        blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
+	        blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
+	    ].join("\n");
+	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType),
+	        stringToSign: stringToSign,
+	    };
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn and identifier.
+	 *
+	 * WARNING: When identifier is not provided, permissions and expiresOn are required.
+	 * You MUST assign value to identifier or expiresOn & permissions manually if you initial with
+	 * this constructor.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param sharedKeyCredential -
+	 */
+	function generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    if (!blobSASSignatureValues.identifier &&
+	        !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
+	    }
+	    let resource = "c";
+	    let timestamp = blobSASSignatureValues.snapshotTime;
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	        if (blobSASSignatureValues.snapshotTime) {
+	            resource = "bs";
+	        }
+	        else if (blobSASSignatureValues.versionId) {
+	            resource = "bv";
+	            timestamp = blobSASSignatureValues.versionId;
+	        }
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        blobSASSignatureValues.identifier,
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        resource,
+	        timestamp,
+	        blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
+	        blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
+	        blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
+	        blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
+	        blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
+	    ].join("\n");
+	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType),
+	        stringToSign: stringToSign,
+	    };
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn and identifier.
+	 *
+	 * WARNING: When identifier is not provided, permissions and expiresOn are required.
+	 * You MUST assign value to identifier or expiresOn & permissions manually if you initial with
+	 * this constructor.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param sharedKeyCredential -
+	 */
+	function generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    if (!blobSASSignatureValues.identifier &&
+	        !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
+	    }
+	    let resource = "c";
+	    let timestamp = blobSASSignatureValues.snapshotTime;
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	        if (blobSASSignatureValues.snapshotTime) {
+	            resource = "bs";
+	        }
+	        else if (blobSASSignatureValues.versionId) {
+	            resource = "bv";
+	            timestamp = blobSASSignatureValues.versionId;
+	        }
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        blobSASSignatureValues.identifier,
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        resource,
+	        timestamp,
+	        blobSASSignatureValues.encryptionScope,
+	        blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
+	        blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
+	        blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
+	        blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
+	        blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
+	    ].join("\n");
+	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope),
+	        stringToSign: stringToSign,
+	    };
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2018-11-09.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn.
+	 *
+	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param userDelegationKeyCredential -
+	 */
+	function generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    // Stored access policies are not supported for a user delegation SAS.
+	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
+	    }
+	    let resource = "c";
+	    let timestamp = blobSASSignatureValues.snapshotTime;
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	        if (blobSASSignatureValues.snapshotTime) {
+	            resource = "bs";
+	        }
+	        else if (blobSASSignatureValues.versionId) {
+	            resource = "bv";
+	            timestamp = blobSASSignatureValues.versionId;
+	        }
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
+	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
+	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedService,
+	        userDelegationKeyCredential.userDelegationKey.signedVersion,
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        resource,
+	        timestamp,
+	        blobSASSignatureValues.cacheControl,
+	        blobSASSignatureValues.contentDisposition,
+	        blobSASSignatureValues.contentEncoding,
+	        blobSASSignatureValues.contentLanguage,
+	        blobSASSignatureValues.contentType,
+	    ].join("\n");
+	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey),
+	        stringToSign: stringToSign,
+	    };
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2020-02-10.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn.
+	 *
+	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param userDelegationKeyCredential -
+	 */
+	function generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    // Stored access policies are not supported for a user delegation SAS.
+	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
+	    }
+	    let resource = "c";
+	    let timestamp = blobSASSignatureValues.snapshotTime;
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	        if (blobSASSignatureValues.snapshotTime) {
+	            resource = "bs";
+	        }
+	        else if (blobSASSignatureValues.versionId) {
+	            resource = "bv";
+	            timestamp = blobSASSignatureValues.versionId;
+	        }
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
+	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
+	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedService,
+	        userDelegationKeyCredential.userDelegationKey.signedVersion,
+	        blobSASSignatureValues.preauthorizedAgentObjectId,
+	        undefined, // agentObjectId
+	        blobSASSignatureValues.correlationId,
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        resource,
+	        timestamp,
+	        blobSASSignatureValues.cacheControl,
+	        blobSASSignatureValues.contentDisposition,
+	        blobSASSignatureValues.contentEncoding,
+	        blobSASSignatureValues.contentLanguage,
+	        blobSASSignatureValues.contentType,
+	    ].join("\n");
+	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId),
+	        stringToSign: stringToSign,
+	    };
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn.
+	 *
+	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param userDelegationKeyCredential -
+	 */
+	function generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    // Stored access policies are not supported for a user delegation SAS.
+	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
+	    }
+	    let resource = "c";
+	    let timestamp = blobSASSignatureValues.snapshotTime;
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	        if (blobSASSignatureValues.snapshotTime) {
+	            resource = "bs";
+	        }
+	        else if (blobSASSignatureValues.versionId) {
+	            resource = "bv";
+	            timestamp = blobSASSignatureValues.versionId;
+	        }
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
+	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
+	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedService,
+	        userDelegationKeyCredential.userDelegationKey.signedVersion,
+	        blobSASSignatureValues.preauthorizedAgentObjectId,
+	        undefined, // agentObjectId
+	        blobSASSignatureValues.correlationId,
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        resource,
+	        timestamp,
+	        blobSASSignatureValues.encryptionScope,
+	        blobSASSignatureValues.cacheControl,
+	        blobSASSignatureValues.contentDisposition,
+	        blobSASSignatureValues.contentEncoding,
+	        blobSASSignatureValues.contentLanguage,
+	        blobSASSignatureValues.contentType,
+	    ].join("\n");
+	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope),
+	        stringToSign: stringToSign,
+	    };
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 * IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
+	 *
+	 * Creates an instance of SASQueryParameters.
+	 *
+	 * Only accepts required settings needed to create a SAS. For optional settings please
+	 * set corresponding properties directly, such as permissions, startsOn.
+	 *
+	 * WARNING: identifier will be ignored, permissions and expiresOn are required.
+	 *
+	 * @param blobSASSignatureValues -
+	 * @param userDelegationKeyCredential -
+	 */
+	function generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential) {
+	    blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
+	    // Stored access policies are not supported for a user delegation SAS.
+	    if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
+	        throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
+	    }
+	    let resource = "c";
+	    let timestamp = blobSASSignatureValues.snapshotTime;
+	    if (blobSASSignatureValues.blobName) {
+	        resource = "b";
+	        if (blobSASSignatureValues.snapshotTime) {
+	            resource = "bs";
+	        }
+	        else if (blobSASSignatureValues.versionId) {
+	            resource = "bv";
+	            timestamp = blobSASSignatureValues.versionId;
+	        }
+	    }
+	    // Calling parse and toString guarantees the proper ordering and throws on invalid characters.
+	    let verifiedPermissions;
+	    if (blobSASSignatureValues.permissions) {
+	        if (blobSASSignatureValues.blobName) {
+	            verifiedPermissions = BlobSASPermissions_js_1.BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	        else {
+	            verifiedPermissions = ContainerSASPermissions_js_1.ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
+	        }
+	    }
+	    // Signature is generated on the un-url-encoded values.
+	    const stringToSign = [
+	        verifiedPermissions ? verifiedPermissions : "",
+	        blobSASSignatureValues.startsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.startsOn, false)
+	            : "",
+	        blobSASSignatureValues.expiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(blobSASSignatureValues.expiresOn, false)
+	            : "",
+	        getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
+	        userDelegationKeyCredential.userDelegationKey.signedObjectId,
+	        userDelegationKeyCredential.userDelegationKey.signedTenantId,
+	        userDelegationKeyCredential.userDelegationKey.signedStartsOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedExpiresOn
+	            ? (0, utils_common_js_1.truncatedISO8061Date)(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
+	            : "",
+	        userDelegationKeyCredential.userDelegationKey.signedService,
+	        userDelegationKeyCredential.userDelegationKey.signedVersion,
+	        blobSASSignatureValues.preauthorizedAgentObjectId,
+	        undefined, // agentObjectId
+	        blobSASSignatureValues.correlationId,
+	        undefined, // SignedKeyDelegatedUserTenantId, will be added in a future release.
+	        undefined, // SignedDelegatedUserObjectId, will be added in future release.
+	        blobSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(blobSASSignatureValues.ipRange) : "",
+	        blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
+	        blobSASSignatureValues.version,
+	        resource,
+	        timestamp,
+	        blobSASSignatureValues.encryptionScope,
+	        blobSASSignatureValues.cacheControl,
+	        blobSASSignatureValues.contentDisposition,
+	        blobSASSignatureValues.contentEncoding,
+	        blobSASSignatureValues.contentLanguage,
+	        blobSASSignatureValues.contentType,
+	    ].join("\n");
+	    const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope),
+	        stringToSign: stringToSign,
+	    };
+	}
+	function getCanonicalName(accountName, containerName, blobName) {
+	    // Container: "/blob/account/containerName"
+	    // Blob:      "/blob/account/containerName/blobName"
+	    const elements = [`/blob/${accountName}/${containerName}`];
+	    if (blobName) {
+	        elements.push(`/${blobName}`);
+	    }
+	    return elements.join("");
+	}
+	function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) {
+	    const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : constants_js_1.SERVICE_VERSION;
+	    if (blobSASSignatureValues.snapshotTime && version < "2018-11-09") {
+	        throw RangeError("'version' must be >= '2018-11-09' when providing 'snapshotTime'.");
+	    }
+	    if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.snapshotTime) {
+	        throw RangeError("Must provide 'blobName' when providing 'snapshotTime'.");
+	    }
+	    if (blobSASSignatureValues.versionId && version < "2019-10-10") {
+	        throw RangeError("'version' must be >= '2019-10-10' when providing 'versionId'.");
+	    }
+	    if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.versionId) {
+	        throw RangeError("Must provide 'blobName' when providing 'versionId'.");
+	    }
+	    if (blobSASSignatureValues.permissions &&
+	        blobSASSignatureValues.permissions.setImmutabilityPolicy &&
+	        version < "2020-08-04") {
+	        throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission.");
+	    }
+	    if (blobSASSignatureValues.permissions &&
+	        blobSASSignatureValues.permissions.deleteVersion &&
+	        version < "2019-10-10") {
+	        throw RangeError("'version' must be >= '2019-10-10' when providing 'x' permission.");
+	    }
+	    if (blobSASSignatureValues.permissions &&
+	        blobSASSignatureValues.permissions.permanentDelete &&
+	        version < "2019-10-10") {
+	        throw RangeError("'version' must be >= '2019-10-10' when providing 'y' permission.");
+	    }
+	    if (blobSASSignatureValues.permissions &&
+	        blobSASSignatureValues.permissions.tag &&
+	        version < "2019-12-12") {
+	        throw RangeError("'version' must be >= '2019-12-12' when providing 't' permission.");
+	    }
+	    if (version < "2020-02-10" &&
+	        blobSASSignatureValues.permissions &&
+	        (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) {
+	        throw RangeError("'version' must be >= '2020-02-10' when providing the 'm' or 'e' permission.");
+	    }
+	    if (version < "2021-04-10" &&
+	        blobSASSignatureValues.permissions &&
+	        blobSASSignatureValues.permissions.filterByTags) {
+	        throw RangeError("'version' must be >= '2021-04-10' when providing the 'f' permission.");
+	    }
+	    if (version < "2020-02-10" &&
+	        (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) {
+	        throw RangeError("'version' must be >= '2020-02-10' when providing 'preauthorizedAgentObjectId' or 'correlationId'.");
+	    }
+	    if (blobSASSignatureValues.encryptionScope && version < "2020-12-06") {
+	        throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS.");
+	    }
+	    blobSASSignatureValues.version = version;
+	    return blobSASSignatureValues;
+	}
+	
+	return BlobSASSignatureValues;
+}
+
+var BlobLeaseClient = {};
+
+var hasRequiredBlobLeaseClient;
+
+function requireBlobLeaseClient () {
+	if (hasRequiredBlobLeaseClient) return BlobLeaseClient;
+	hasRequiredBlobLeaseClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobLeaseClient, "__esModule", { value: true });
+	BlobLeaseClient.BlobLeaseClient = void 0;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const constants_js_1 = requireConstants$8();
+	const tracing_js_1 = requireTracing();
+	const utils_common_js_1 = requireUtils_common$2();
+	/**
+	 * A client that manages leases for a {@link ContainerClient} or a {@link BlobClient}.
+	 */
+	let BlobLeaseClient$1 = class BlobLeaseClient {
+	    _leaseId;
+	    _url;
+	    _containerOrBlobOperation;
+	    _isContainer;
+	    /**
+	     * Gets the lease Id.
+	     *
+	     * @readonly
+	     */
+	    get leaseId() {
+	        return this._leaseId;
+	    }
+	    /**
+	     * Gets the url.
+	     *
+	     * @readonly
+	     */
+	    get url() {
+	        return this._url;
+	    }
+	    /**
+	     * Creates an instance of BlobLeaseClient.
+	     * @param client - The client to make the lease operation requests.
+	     * @param leaseId - Initial proposed lease id.
+	     */
+	    constructor(client, leaseId) {
+	        const clientContext = client.storageClientContext;
+	        this._url = client.url;
+	        if (client.name === undefined) {
+	            this._isContainer = true;
+	            this._containerOrBlobOperation = clientContext.container;
+	        }
+	        else {
+	            this._isContainer = false;
+	            this._containerOrBlobOperation = clientContext.blob;
+	        }
+	        if (!leaseId) {
+	            leaseId = (0, core_util_1.randomUUID)();
+	        }
+	        this._leaseId = leaseId;
+	    }
+	    /**
+	     * Establishes and manages a lock on a container for delete operations, or on a blob
+	     * for write and delete operations.
+	     * The lock duration can be 15 to 60 seconds, or can be infinite.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
+	     * and
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
+	     *
+	     * @param duration - Must be between 15 to 60 seconds, or infinite (-1)
+	     * @param options - option to configure lease management operations.
+	     * @returns Response data for acquire lease operation.
+	     */
+	    async acquireLease(duration, options = {}) {
+	        if (this._isContainer &&
+	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
+	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
+	                options.conditions?.tagConditions)) {
+	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-acquireLease", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.acquireLease({
+	                abortSignal: options.abortSignal,
+	                duration,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                proposedLeaseId: this._leaseId,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * To change the ID of the lease.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
+	     * and
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
+	     *
+	     * @param proposedLeaseId - the proposed new lease Id.
+	     * @param options - option to configure lease management operations.
+	     * @returns Response data for change lease operation.
+	     */
+	    async changeLease(proposedLeaseId, options = {}) {
+	        if (this._isContainer &&
+	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
+	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
+	                options.conditions?.tagConditions)) {
+	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-changeLease", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId, {
+	                abortSignal: options.abortSignal,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            this._leaseId = proposedLeaseId;
+	            return response;
+	        });
+	    }
+	    /**
+	     * To free the lease if it is no longer needed so that another client may
+	     * immediately acquire a lease against the container or the blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
+	     * and
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
+	     *
+	     * @param options - option to configure lease management operations.
+	     * @returns Response data for release lease operation.
+	     */
+	    async releaseLease(options = {}) {
+	        if (this._isContainer &&
+	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
+	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
+	                options.conditions?.tagConditions)) {
+	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-releaseLease", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.releaseLease(this._leaseId, {
+	                abortSignal: options.abortSignal,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * To renew the lease.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
+	     * and
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
+	     *
+	     * @param options - Optional option to configure lease management operations.
+	     * @returns Response data for renew lease operation.
+	     */
+	    async renewLease(options = {}) {
+	        if (this._isContainer &&
+	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
+	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
+	                options.conditions?.tagConditions)) {
+	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-renewLease", options, async (updatedOptions) => {
+	            return this._containerOrBlobOperation.renewLease(this._leaseId, {
+	                abortSignal: options.abortSignal,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            });
+	        });
+	    }
+	    /**
+	     * To end the lease but ensure that another client cannot acquire a new lease
+	     * until the current lease period has expired.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-container
+	     * and
+	     * @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
+	     *
+	     * @param breakPeriod - Break period
+	     * @param options - Optional options to configure lease management operations.
+	     * @returns Response data for break lease operation.
+	     */
+	    async breakLease(breakPeriod, options = {}) {
+	        if (this._isContainer &&
+	            ((options.conditions?.ifMatch && options.conditions?.ifMatch !== constants_js_1.ETagNone) ||
+	                (options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== constants_js_1.ETagNone) ||
+	                options.conditions?.tagConditions)) {
+	            throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobLeaseClient-breakLease", options, async (updatedOptions) => {
+	            const operationOptions = {
+	                abortSignal: options.abortSignal,
+	                breakPeriod,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            };
+	            return (0, utils_common_js_1.assertResponse)(await this._containerOrBlobOperation.breakLease(operationOptions));
+	        });
+	    }
+	};
+	BlobLeaseClient.BlobLeaseClient = BlobLeaseClient$1;
+	
+	return BlobLeaseClient;
+}
+
+var Clients = {};
+
+var BlobDownloadResponse = {};
+
+var RetriableReadableStream = {};
+
+var hasRequiredRetriableReadableStream;
+
+function requireRetriableReadableStream () {
+	if (hasRequiredRetriableReadableStream) return RetriableReadableStream;
+	hasRequiredRetriableReadableStream = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(RetriableReadableStream, "__esModule", { value: true });
+	RetriableReadableStream.RetriableReadableStream = void 0;
+	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
+	const node_stream_1 = require$$0$8;
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * A Node.js ReadableStream will internally retry when internal ReadableStream unexpected ends.
+	 */
+	let RetriableReadableStream$1 = class RetriableReadableStream extends node_stream_1.Readable {
+	    start;
+	    offset;
+	    end;
+	    getter;
+	    source;
+	    retries = 0;
+	    maxRetryRequests;
+	    onProgress;
+	    options;
+	    /**
+	     * Creates an instance of RetriableReadableStream.
+	     *
+	     * @param source - The current ReadableStream returned from getter
+	     * @param getter - A method calling downloading request returning
+	     *                                      a new ReadableStream from specified offset
+	     * @param offset - Offset position in original data source to read
+	     * @param count - How much data in original data source to read
+	     * @param options -
+	     */
+	    constructor(source, getter, offset, count, options = {}) {
+	        super({ highWaterMark: options.highWaterMark });
+	        this.getter = getter;
+	        this.source = source;
+	        this.start = offset;
+	        this.offset = offset;
+	        this.end = offset + count - 1;
+	        this.maxRetryRequests =
+	            options.maxRetryRequests && options.maxRetryRequests >= 0 ? options.maxRetryRequests : 0;
+	        this.onProgress = options.onProgress;
+	        this.options = options;
+	        this.setSourceEventHandlers();
+	    }
+	    _read() {
+	        this.source.resume();
+	    }
+	    setSourceEventHandlers() {
+	        this.source.on("data", this.sourceDataHandler);
+	        this.source.on("end", this.sourceErrorOrEndHandler);
+	        this.source.on("error", this.sourceErrorOrEndHandler);
+	        // needed for Node14
+	        this.source.on("aborted", this.sourceAbortedHandler);
+	    }
+	    removeSourceEventHandlers() {
+	        this.source.removeListener("data", this.sourceDataHandler);
+	        this.source.removeListener("end", this.sourceErrorOrEndHandler);
+	        this.source.removeListener("error", this.sourceErrorOrEndHandler);
+	        this.source.removeListener("aborted", this.sourceAbortedHandler);
+	    }
+	    sourceDataHandler = (data) => {
+	        if (this.options.doInjectErrorOnce) {
+	            this.options.doInjectErrorOnce = undefined;
+	            this.source.pause();
+	            this.sourceErrorOrEndHandler();
+	            this.source.destroy();
+	            return;
+	        }
+	        // console.log(
+	        //   `Offset: ${this.offset}, Received ${data.length} from internal stream`
+	        // );
+	        this.offset += data.length;
+	        if (this.onProgress) {
+	            this.onProgress({ loadedBytes: this.offset - this.start });
+	        }
+	        if (!this.push(data)) {
+	            this.source.pause();
+	        }
+	    };
+	    sourceAbortedHandler = () => {
+	        const abortError = new abort_controller_1.AbortError("The operation was aborted.");
+	        this.destroy(abortError);
+	    };
+	    sourceErrorOrEndHandler = (err) => {
+	        if (err && err.name === "AbortError") {
+	            this.destroy(err);
+	            return;
+	        }
+	        // console.log(
+	        //   `Source stream emits end or error, offset: ${
+	        //     this.offset
+	        //   }, dest end : ${this.end}`
+	        // );
+	        this.removeSourceEventHandlers();
+	        if (this.offset - 1 === this.end) {
+	            this.push(null);
+	        }
+	        else if (this.offset <= this.end) {
+	            // console.log(
+	            //   `retries: ${this.retries}, max retries: ${this.maxRetries}`
+	            // );
+	            if (this.retries < this.maxRetryRequests) {
+	                this.retries += 1;
+	                this.getter(this.offset)
+	                    .then((newSource) => {
+	                    this.source = newSource;
+	                    this.setSourceEventHandlers();
+	                    return;
+	                })
+	                    .catch((error) => {
+	                    this.destroy(error);
+	                });
+	            }
+	            else {
+	                this.destroy(new Error(`Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${this.offset - 1}, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${this.maxRetryRequests}`));
+	            }
+	        }
+	        else {
+	            this.destroy(new Error(`Data corruption failure: Received more data than original request, data needed offset is ${this.end}, received offset: ${this.offset - 1}`));
+	        }
+	    };
+	    _destroy(error, callback) {
+	        // remove listener from source and release source
+	        this.removeSourceEventHandlers();
+	        this.source.destroy();
+	        callback(error === null ? undefined : error);
+	    }
+	};
+	RetriableReadableStream.RetriableReadableStream = RetriableReadableStream$1;
+	
+	return RetriableReadableStream;
+}
+
+var hasRequiredBlobDownloadResponse;
+
+function requireBlobDownloadResponse () {
+	if (hasRequiredBlobDownloadResponse) return BlobDownloadResponse;
+	hasRequiredBlobDownloadResponse = 1;
+	Object.defineProperty(BlobDownloadResponse, "__esModule", { value: true });
+	BlobDownloadResponse.BlobDownloadResponse = void 0;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const RetriableReadableStream_js_1 = requireRetriableReadableStream();
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * BlobDownloadResponse implements BlobDownloadResponseParsed interface, and in Node.js runtime it will
+	 * automatically retry when internal read stream unexpected ends. (This kind of unexpected ends cannot
+	 * trigger retries defined in pipeline retry policy.)
+	 *
+	 * The {@link readableStreamBody} stream will retry underlayer, you can just use it as a normal Node.js
+	 * Readable stream.
+	 */
+	let BlobDownloadResponse$1 = class BlobDownloadResponse {
+	    /**
+	     * Indicates that the service supports
+	     * requests for partial file content.
+	     *
+	     * @readonly
+	     */
+	    get acceptRanges() {
+	        return this.originalResponse.acceptRanges;
+	    }
+	    /**
+	     * Returns if it was previously specified
+	     * for the file.
+	     *
+	     * @readonly
+	     */
+	    get cacheControl() {
+	        return this.originalResponse.cacheControl;
+	    }
+	    /**
+	     * Returns the value that was specified
+	     * for the 'x-ms-content-disposition' header and specifies how to process the
+	     * response.
+	     *
+	     * @readonly
+	     */
+	    get contentDisposition() {
+	        return this.originalResponse.contentDisposition;
+	    }
+	    /**
+	     * Returns the value that was specified
+	     * for the Content-Encoding request header.
+	     *
+	     * @readonly
+	     */
+	    get contentEncoding() {
+	        return this.originalResponse.contentEncoding;
+	    }
+	    /**
+	     * Returns the value that was specified
+	     * for the Content-Language request header.
+	     *
+	     * @readonly
+	     */
+	    get contentLanguage() {
+	        return this.originalResponse.contentLanguage;
+	    }
+	    /**
+	     * The current sequence number for a
+	     * page blob. This header is not returned for block blobs or append blobs.
+	     *
+	     * @readonly
+	     */
+	    get blobSequenceNumber() {
+	        return this.originalResponse.blobSequenceNumber;
+	    }
+	    /**
+	     * The blob's type. Possible values include:
+	     * 'BlockBlob', 'PageBlob', 'AppendBlob'.
+	     *
+	     * @readonly
+	     */
+	    get blobType() {
+	        return this.originalResponse.blobType;
+	    }
+	    /**
+	     * The number of bytes present in the
+	     * response body.
+	     *
+	     * @readonly
+	     */
+	    get contentLength() {
+	        return this.originalResponse.contentLength;
+	    }
+	    /**
+	     * If the file has an MD5 hash and the
+	     * request is to read the full file, this response header is returned so that
+	     * the client can check for message content integrity. If the request is to
+	     * read a specified range and the 'x-ms-range-get-content-md5' is set to
+	     * true, then the request returns an MD5 hash for the range, as long as the
+	     * range size is less than or equal to 4 MB. If neither of these sets of
+	     * conditions is true, then no value is returned for the 'Content-MD5'
+	     * header.
+	     *
+	     * @readonly
+	     */
+	    get contentMD5() {
+	        return this.originalResponse.contentMD5;
+	    }
+	    /**
+	     * Indicates the range of bytes returned if
+	     * the client requested a subset of the file by setting the Range request
+	     * header.
+	     *
+	     * @readonly
+	     */
+	    get contentRange() {
+	        return this.originalResponse.contentRange;
+	    }
+	    /**
+	     * The content type specified for the file.
+	     * The default content type is 'application/octet-stream'
+	     *
+	     * @readonly
+	     */
+	    get contentType() {
+	        return this.originalResponse.contentType;
+	    }
+	    /**
+	     * Conclusion time of the last attempted
+	     * Copy File operation where this file was the destination file. This value
+	     * can specify the time of a completed, aborted, or failed copy attempt.
+	     *
+	     * @readonly
+	     */
+	    get copyCompletedOn() {
+	        return this.originalResponse.copyCompletedOn;
+	    }
+	    /**
+	     * String identifier for the last attempted Copy
+	     * File operation where this file was the destination file.
+	     *
+	     * @readonly
+	     */
+	    get copyId() {
+	        return this.originalResponse.copyId;
+	    }
+	    /**
+	     * Contains the number of bytes copied and
+	     * the total bytes in the source in the last attempted Copy File operation
+	     * where this file was the destination file. Can show between 0 and
+	     * Content-Length bytes copied.
+	     *
+	     * @readonly
+	     */
+	    get copyProgress() {
+	        return this.originalResponse.copyProgress;
+	    }
+	    /**
+	     * URL up to 2KB in length that specifies the
+	     * source file used in the last attempted Copy File operation where this file
+	     * was the destination file.
+	     *
+	     * @readonly
+	     */
+	    get copySource() {
+	        return this.originalResponse.copySource;
+	    }
+	    /**
+	     * State of the copy operation
+	     * identified by 'x-ms-copy-id'. Possible values include: 'pending',
+	     * 'success', 'aborted', 'failed'
+	     *
+	     * @readonly
+	     */
+	    get copyStatus() {
+	        return this.originalResponse.copyStatus;
+	    }
+	    /**
+	     * Only appears when
+	     * x-ms-copy-status is failed or pending. Describes cause of fatal or
+	     * non-fatal copy operation failure.
+	     *
+	     * @readonly
+	     */
+	    get copyStatusDescription() {
+	        return this.originalResponse.copyStatusDescription;
+	    }
+	    /**
+	     * When a blob is leased,
+	     * specifies whether the lease is of infinite or fixed duration. Possible
+	     * values include: 'infinite', 'fixed'.
+	     *
+	     * @readonly
+	     */
+	    get leaseDuration() {
+	        return this.originalResponse.leaseDuration;
+	    }
+	    /**
+	     * Lease state of the blob. Possible
+	     * values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
+	     *
+	     * @readonly
+	     */
+	    get leaseState() {
+	        return this.originalResponse.leaseState;
+	    }
+	    /**
+	     * The current lease status of the
+	     * blob. Possible values include: 'locked', 'unlocked'.
+	     *
+	     * @readonly
+	     */
+	    get leaseStatus() {
+	        return this.originalResponse.leaseStatus;
+	    }
+	    /**
+	     * A UTC date/time value generated by the service that
+	     * indicates the time at which the response was initiated.
+	     *
+	     * @readonly
+	     */
+	    get date() {
+	        return this.originalResponse.date;
+	    }
+	    /**
+	     * The number of committed blocks
+	     * present in the blob. This header is returned only for append blobs.
+	     *
+	     * @readonly
+	     */
+	    get blobCommittedBlockCount() {
+	        return this.originalResponse.blobCommittedBlockCount;
+	    }
+	    /**
+	     * The ETag contains a value that you can use to
+	     * perform operations conditionally, in quotes.
+	     *
+	     * @readonly
+	     */
+	    get etag() {
+	        return this.originalResponse.etag;
+	    }
+	    /**
+	     * The number of tags associated with the blob
+	     *
+	     * @readonly
+	     */
+	    get tagCount() {
+	        return this.originalResponse.tagCount;
+	    }
+	    /**
+	     * The error code.
+	     *
+	     * @readonly
+	     */
+	    get errorCode() {
+	        return this.originalResponse.errorCode;
+	    }
+	    /**
+	     * The value of this header is set to
+	     * true if the file data and application metadata are completely encrypted
+	     * using the specified algorithm. Otherwise, the value is set to false (when
+	     * the file is unencrypted, or if only parts of the file/application metadata
+	     * are encrypted).
+	     *
+	     * @readonly
+	     */
+	    get isServerEncrypted() {
+	        return this.originalResponse.isServerEncrypted;
+	    }
+	    /**
+	     * If the blob has a MD5 hash, and if
+	     * request contains range header (Range or x-ms-range), this response header
+	     * is returned with the value of the whole blob's MD5 value. This value may
+	     * or may not be equal to the value returned in Content-MD5 header, with the
+	     * latter calculated from the requested range.
+	     *
+	     * @readonly
+	     */
+	    get blobContentMD5() {
+	        return this.originalResponse.blobContentMD5;
+	    }
+	    /**
+	     * Returns the date and time the file was last
+	     * modified. Any operation that modifies the file or its properties updates
+	     * the last modified time.
+	     *
+	     * @readonly
+	     */
+	    get lastModified() {
+	        return this.originalResponse.lastModified;
+	    }
+	    /**
+	     * Returns the UTC date and time generated by the service that indicates the time at which the blob was
+	     * last read or written to.
+	     *
+	     * @readonly
+	     */
+	    get lastAccessed() {
+	        return this.originalResponse.lastAccessed;
+	    }
+	    /**
+	     * Returns the date and time the blob was created.
+	     *
+	     * @readonly
+	     */
+	    get createdOn() {
+	        return this.originalResponse.createdOn;
+	    }
+	    /**
+	     * A name-value pair
+	     * to associate with a file storage object.
+	     *
+	     * @readonly
+	     */
+	    get metadata() {
+	        return this.originalResponse.metadata;
+	    }
+	    /**
+	     * This header uniquely identifies the request
+	     * that was made and can be used for troubleshooting the request.
+	     *
+	     * @readonly
+	     */
+	    get requestId() {
+	        return this.originalResponse.requestId;
+	    }
+	    /**
+	     * If a client request id header is sent in the request, this header will be present in the
+	     * response with the same value.
+	     *
+	     * @readonly
+	     */
+	    get clientRequestId() {
+	        return this.originalResponse.clientRequestId;
+	    }
+	    /**
+	     * Indicates the version of the Blob service used
+	     * to execute the request.
+	     *
+	     * @readonly
+	     */
+	    get version() {
+	        return this.originalResponse.version;
+	    }
+	    /**
+	     * Indicates the versionId of the downloaded blob version.
+	     *
+	     * @readonly
+	     */
+	    get versionId() {
+	        return this.originalResponse.versionId;
+	    }
+	    /**
+	     * Indicates whether version of this blob is a current version.
+	     *
+	     * @readonly
+	     */
+	    get isCurrentVersion() {
+	        return this.originalResponse.isCurrentVersion;
+	    }
+	    /**
+	     * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
+	     * when the blob was encrypted with a customer-provided key.
+	     *
+	     * @readonly
+	     */
+	    get encryptionKeySha256() {
+	        return this.originalResponse.encryptionKeySha256;
+	    }
+	    /**
+	     * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
+	     * true, then the request returns a crc64 for the range, as long as the range size is less than
+	     * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
+	     * specified in the same request, it will fail with 400(Bad Request)
+	     */
+	    get contentCrc64() {
+	        return this.originalResponse.contentCrc64;
+	    }
+	    /**
+	     * Object Replication Policy Id of the destination blob.
+	     *
+	     * @readonly
+	     */
+	    get objectReplicationDestinationPolicyId() {
+	        return this.originalResponse.objectReplicationDestinationPolicyId;
+	    }
+	    /**
+	     * Parsed Object Replication Policy Id, Rule Id(s) and status of the source blob.
+	     *
+	     * @readonly
+	     */
+	    get objectReplicationSourceProperties() {
+	        return this.originalResponse.objectReplicationSourceProperties;
+	    }
+	    /**
+	     * If this blob has been sealed.
+	     *
+	     * @readonly
+	     */
+	    get isSealed() {
+	        return this.originalResponse.isSealed;
+	    }
+	    /**
+	     * UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire.
+	     *
+	     * @readonly
+	     */
+	    get immutabilityPolicyExpiresOn() {
+	        return this.originalResponse.immutabilityPolicyExpiresOn;
+	    }
+	    /**
+	     * Indicates immutability policy mode.
+	     *
+	     * @readonly
+	     */
+	    get immutabilityPolicyMode() {
+	        return this.originalResponse.immutabilityPolicyMode;
+	    }
+	    /**
+	     * Indicates if a legal hold is present on the blob.
+	     *
+	     * @readonly
+	     */
+	    get legalHold() {
+	        return this.originalResponse.legalHold;
+	    }
+	    /**
+	     * The response body as a browser Blob.
+	     * Always undefined in node.js.
+	     *
+	     * @readonly
+	     */
+	    get contentAsBlob() {
+	        return this.originalResponse.blobBody;
+	    }
+	    /**
+	     * The response body as a node.js Readable stream.
+	     * Always undefined in the browser.
+	     *
+	     * It will automatically retry when internal read stream unexpected ends.
+	     *
+	     * @readonly
+	     */
+	    get readableStreamBody() {
+	        return core_util_1.isNodeLike ? this.blobDownloadStream : undefined;
+	    }
+	    /**
+	     * The HTTP response.
+	     */
+	    get _response() {
+	        return this.originalResponse._response;
+	    }
+	    originalResponse;
+	    blobDownloadStream;
+	    /**
+	     * Creates an instance of BlobDownloadResponse.
+	     *
+	     * @param originalResponse -
+	     * @param getter -
+	     * @param offset -
+	     * @param count -
+	     * @param options -
+	     */
+	    constructor(originalResponse, getter, offset, count, options = {}) {
+	        this.originalResponse = originalResponse;
+	        this.blobDownloadStream = new RetriableReadableStream_js_1.RetriableReadableStream(this.originalResponse.readableStreamBody, getter, offset, count, options);
+	    }
+	};
+	BlobDownloadResponse.BlobDownloadResponse = BlobDownloadResponse$1;
+	
+	return BlobDownloadResponse;
+}
+
+var BlobQueryResponse = {};
+
+var BlobQuickQueryStream = {};
+
+var internalAvro = {};
+
+var AvroReader = {};
+
+var AvroConstants = {};
+
+var hasRequiredAvroConstants;
+
+function requireAvroConstants () {
+	if (hasRequiredAvroConstants) return AvroConstants;
+	hasRequiredAvroConstants = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AvroConstants, "__esModule", { value: true });
+	AvroConstants.AVRO_SCHEMA_KEY = AvroConstants.AVRO_CODEC_KEY = AvroConstants.AVRO_INIT_BYTES = AvroConstants.AVRO_SYNC_MARKER_SIZE = void 0;
+	AvroConstants.AVRO_SYNC_MARKER_SIZE = 16;
+	AvroConstants.AVRO_INIT_BYTES = new Uint8Array([79, 98, 106, 1]);
+	AvroConstants.AVRO_CODEC_KEY = "avro.codec";
+	AvroConstants.AVRO_SCHEMA_KEY = "avro.schema";
+	
+	return AvroConstants;
+}
+
+var AvroParser = {};
+
+var hasRequiredAvroParser;
+
+function requireAvroParser () {
+	if (hasRequiredAvroParser) return AvroParser;
+	hasRequiredAvroParser = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AvroParser, "__esModule", { value: true });
+	AvroParser.AvroType = AvroParser.AvroParser = void 0;
+	let AvroParser$1 = class AvroParser {
+	    /**
+	     * Reads a fixed number of bytes from the stream.
+	     *
+	     * @param stream -
+	     * @param length -
+	     * @param options -
+	     */
+	    static async readFixedBytes(stream, length, options = {}) {
+	        const bytes = await stream.read(length, { abortSignal: options.abortSignal });
+	        if (bytes.length !== length) {
+	            throw new Error("Hit stream end.");
+	        }
+	        return bytes;
+	    }
+	    /**
+	     * Reads a single byte from the stream.
+	     *
+	     * @param stream -
+	     * @param options -
+	     */
+	    static async readByte(stream, options = {}) {
+	        const buf = await AvroParser.readFixedBytes(stream, 1, options);
+	        return buf[0];
+	    }
+	    // int and long are stored in variable-length zig-zag coding.
+	    // variable-length: https://lucene.apache.org/core/3_5_0/fileformats.html#VInt
+	    // zig-zag: https://developers.google.com/protocol-buffers/docs/encoding?csw=1#types
+	    static async readZigZagLong(stream, options = {}) {
+	        let zigZagEncoded = 0;
+	        let significanceInBit = 0;
+	        let byte, haveMoreByte, significanceInFloat;
+	        do {
+	            byte = await AvroParser.readByte(stream, options);
+	            haveMoreByte = byte & 0x80;
+	            zigZagEncoded |= (byte & 0x7f) << significanceInBit;
+	            significanceInBit += 7;
+	        } while (haveMoreByte && significanceInBit < 28); // bitwise operation only works for 32-bit integers
+	        if (haveMoreByte) {
+	            // Switch to float arithmetic
+	            // eslint-disable-next-line no-self-assign
+	            zigZagEncoded = zigZagEncoded;
+	            significanceInFloat = 268435456; // 2 ** 28.
+	            do {
+	                byte = await AvroParser.readByte(stream, options);
+	                zigZagEncoded += (byte & 0x7f) * significanceInFloat;
+	                significanceInFloat *= 128; // 2 ** 7
+	            } while (byte & 0x80);
+	            const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2;
+	            if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) {
+	                throw new Error("Integer overflow.");
+	            }
+	            return res;
+	        }
+	        return (zigZagEncoded >> 1) ^ -(zigZagEncoded & 1);
+	    }
+	    static async readLong(stream, options = {}) {
+	        return AvroParser.readZigZagLong(stream, options);
+	    }
+	    static async readInt(stream, options = {}) {
+	        return AvroParser.readZigZagLong(stream, options);
+	    }
+	    static async readNull() {
+	        return null;
+	    }
+	    static async readBoolean(stream, options = {}) {
+	        const b = await AvroParser.readByte(stream, options);
+	        if (b === 1) {
+	            return true;
+	        }
+	        else if (b === 0) {
+	            return false;
+	        }
+	        else {
+	            throw new Error("Byte was not a boolean.");
+	        }
+	    }
+	    static async readFloat(stream, options = {}) {
+	        const u8arr = await AvroParser.readFixedBytes(stream, 4, options);
+	        const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);
+	        return view.getFloat32(0, true); // littleEndian = true
+	    }
+	    static async readDouble(stream, options = {}) {
+	        const u8arr = await AvroParser.readFixedBytes(stream, 8, options);
+	        const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);
+	        return view.getFloat64(0, true); // littleEndian = true
+	    }
+	    static async readBytes(stream, options = {}) {
+	        const size = await AvroParser.readLong(stream, options);
+	        if (size < 0) {
+	            throw new Error("Bytes size was negative.");
+	        }
+	        return stream.read(size, { abortSignal: options.abortSignal });
+	    }
+	    static async readString(stream, options = {}) {
+	        const u8arr = await AvroParser.readBytes(stream, options);
+	        const utf8decoder = new TextDecoder();
+	        return utf8decoder.decode(u8arr);
+	    }
+	    static async readMapPair(stream, readItemMethod, options = {}) {
+	        const key = await AvroParser.readString(stream, options);
+	        // FUTURE: this won't work with readFixed (currently not supported) which needs a length as the parameter.
+	        const value = await readItemMethod(stream, options);
+	        return { key, value };
+	    }
+	    static async readMap(stream, readItemMethod, options = {}) {
+	        const readPairMethod = (s, opts = {}) => {
+	            return AvroParser.readMapPair(s, readItemMethod, opts);
+	        };
+	        const pairs = await AvroParser.readArray(stream, readPairMethod, options);
+	        const dict = {};
+	        for (const pair of pairs) {
+	            dict[pair.key] = pair.value;
+	        }
+	        return dict;
+	    }
+	    static async readArray(stream, readItemMethod, options = {}) {
+	        const items = [];
+	        for (let count = await AvroParser.readLong(stream, options); count !== 0; count = await AvroParser.readLong(stream, options)) {
+	            if (count < 0) {
+	                // Ignore block sizes
+	                await AvroParser.readLong(stream, options);
+	                count = -count;
+	            }
+	            while (count--) {
+	                const item = await readItemMethod(stream, options);
+	                items.push(item);
+	            }
+	        }
+	        return items;
+	    }
+	};
+	AvroParser.AvroParser = AvroParser$1;
+	var AvroComplex;
+	(function (AvroComplex) {
+	    AvroComplex["RECORD"] = "record";
+	    AvroComplex["ENUM"] = "enum";
+	    AvroComplex["ARRAY"] = "array";
+	    AvroComplex["MAP"] = "map";
+	    AvroComplex["UNION"] = "union";
+	    AvroComplex["FIXED"] = "fixed";
+	})(AvroComplex || (AvroComplex = {}));
+	var AvroPrimitive;
+	(function (AvroPrimitive) {
+	    AvroPrimitive["NULL"] = "null";
+	    AvroPrimitive["BOOLEAN"] = "boolean";
+	    AvroPrimitive["INT"] = "int";
+	    AvroPrimitive["LONG"] = "long";
+	    AvroPrimitive["FLOAT"] = "float";
+	    AvroPrimitive["DOUBLE"] = "double";
+	    AvroPrimitive["BYTES"] = "bytes";
+	    AvroPrimitive["STRING"] = "string";
+	})(AvroPrimitive || (AvroPrimitive = {}));
+	class AvroType {
+	    /**
+	     * Determines the AvroType from the Avro Schema.
+	     */
+	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
+	    static fromSchema(schema) {
+	        if (typeof schema === "string") {
+	            return AvroType.fromStringSchema(schema);
+	        }
+	        else if (Array.isArray(schema)) {
+	            return AvroType.fromArraySchema(schema);
+	        }
+	        else {
+	            return AvroType.fromObjectSchema(schema);
+	        }
+	    }
+	    static fromStringSchema(schema) {
+	        switch (schema) {
+	            case AvroPrimitive.NULL:
+	            case AvroPrimitive.BOOLEAN:
+	            case AvroPrimitive.INT:
+	            case AvroPrimitive.LONG:
+	            case AvroPrimitive.FLOAT:
+	            case AvroPrimitive.DOUBLE:
+	            case AvroPrimitive.BYTES:
+	            case AvroPrimitive.STRING:
+	                return new AvroPrimitiveType(schema);
+	            default:
+	                throw new Error(`Unexpected Avro type ${schema}`);
+	        }
+	    }
+	    static fromArraySchema(schema) {
+	        return new AvroUnionType(schema.map(AvroType.fromSchema));
+	    }
+	    static fromObjectSchema(schema) {
+	        const type = schema.type;
+	        // Primitives can be defined as strings or objects
+	        try {
+	            return AvroType.fromStringSchema(type);
+	        }
+	        catch {
+	            // no-op
+	        }
+	        switch (type) {
+	            case AvroComplex.RECORD:
+	                if (schema.aliases) {
+	                    throw new Error(`aliases currently is not supported, schema: ${schema}`);
+	                }
+	                if (!schema.name) {
+	                    throw new Error(`Required attribute 'name' doesn't exist on schema: ${schema}`);
+	                }
+	                // eslint-disable-next-line no-case-declarations
+	                const fields = {};
+	                if (!schema.fields) {
+	                    throw new Error(`Required attribute 'fields' doesn't exist on schema: ${schema}`);
+	                }
+	                for (const field of schema.fields) {
+	                    fields[field.name] = AvroType.fromSchema(field.type);
+	                }
+	                return new AvroRecordType(fields, schema.name);
+	            case AvroComplex.ENUM:
+	                if (schema.aliases) {
+	                    throw new Error(`aliases currently is not supported, schema: ${schema}`);
+	                }
+	                if (!schema.symbols) {
+	                    throw new Error(`Required attribute 'symbols' doesn't exist on schema: ${schema}`);
+	                }
+	                return new AvroEnumType(schema.symbols);
+	            case AvroComplex.MAP:
+	                if (!schema.values) {
+	                    throw new Error(`Required attribute 'values' doesn't exist on schema: ${schema}`);
+	                }
+	                return new AvroMapType(AvroType.fromSchema(schema.values));
+	            case AvroComplex.ARRAY: // Unused today
+	            case AvroComplex.FIXED: // Unused today
+	            default:
+	                throw new Error(`Unexpected Avro type ${type} in ${schema}`);
+	        }
+	    }
+	}
+	AvroParser.AvroType = AvroType;
+	class AvroPrimitiveType extends AvroType {
+	    _primitive;
+	    constructor(primitive) {
+	        super();
+	        this._primitive = primitive;
+	    }
+	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
+	    read(stream, options = {}) {
+	        switch (this._primitive) {
+	            case AvroPrimitive.NULL:
+	                return AvroParser$1.readNull();
+	            case AvroPrimitive.BOOLEAN:
+	                return AvroParser$1.readBoolean(stream, options);
+	            case AvroPrimitive.INT:
+	                return AvroParser$1.readInt(stream, options);
+	            case AvroPrimitive.LONG:
+	                return AvroParser$1.readLong(stream, options);
+	            case AvroPrimitive.FLOAT:
+	                return AvroParser$1.readFloat(stream, options);
+	            case AvroPrimitive.DOUBLE:
+	                return AvroParser$1.readDouble(stream, options);
+	            case AvroPrimitive.BYTES:
+	                return AvroParser$1.readBytes(stream, options);
+	            case AvroPrimitive.STRING:
+	                return AvroParser$1.readString(stream, options);
+	            default:
+	                throw new Error("Unknown Avro Primitive");
+	        }
+	    }
+	}
+	class AvroEnumType extends AvroType {
+	    _symbols;
+	    constructor(symbols) {
+	        super();
+	        this._symbols = symbols;
+	    }
+	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
+	    async read(stream, options = {}) {
+	        const value = await AvroParser$1.readInt(stream, options);
+	        return this._symbols[value];
+	    }
+	}
+	class AvroUnionType extends AvroType {
+	    _types;
+	    constructor(types) {
+	        super();
+	        this._types = types;
+	    }
+	    async read(stream, options = {}) {
+	        const typeIndex = await AvroParser$1.readInt(stream, options);
+	        return this._types[typeIndex].read(stream, options);
+	    }
+	}
+	class AvroMapType extends AvroType {
+	    _itemType;
+	    constructor(itemType) {
+	        super();
+	        this._itemType = itemType;
+	    }
+	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
+	    read(stream, options = {}) {
+	        const readItemMethod = (s, opts) => {
+	            return this._itemType.read(s, opts);
+	        };
+	        return AvroParser$1.readMap(stream, readItemMethod, options);
+	    }
+	}
+	class AvroRecordType extends AvroType {
+	    _name;
+	    _fields;
+	    constructor(fields, name) {
+	        super();
+	        this._fields = fields;
+	        this._name = name;
+	    }
+	    // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
+	    async read(stream, options = {}) {
+	        // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
+	        const record = {};
+	        record["$schema"] = this._name;
+	        for (const key in this._fields) {
+	            if (Object.prototype.hasOwnProperty.call(this._fields, key)) {
+	                record[key] = await this._fields[key].read(stream, options);
+	            }
+	        }
+	        return record;
+	    }
+	}
+	
+	return AvroParser;
+}
+
+var utils_common = {};
+
+var hasRequiredUtils_common;
+
+function requireUtils_common () {
+	if (hasRequiredUtils_common) return utils_common;
+	hasRequiredUtils_common = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(utils_common, "__esModule", { value: true });
+	utils_common.arraysEqual = arraysEqual;
+	function arraysEqual(a, b) {
+	    if (a === b)
+	        return true;
+	    if (a == null || b == null)
+	        return false;
+	    if (a.length !== b.length)
+	        return false;
+	    for (let i = 0; i < a.length; ++i) {
+	        if (a[i] !== b[i])
+	            return false;
+	    }
+	    return true;
+	}
+	
+	return utils_common;
+}
+
+var hasRequiredAvroReader;
+
+function requireAvroReader () {
+	if (hasRequiredAvroReader) return AvroReader;
+	hasRequiredAvroReader = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AvroReader, "__esModule", { value: true });
+	AvroReader.AvroReader = void 0;
+	// TODO: Do a review of non-interfaces
+	/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */
+	const AvroConstants_js_1 = requireAvroConstants();
+	const AvroParser_js_1 = requireAvroParser();
+	const utils_common_js_1 = requireUtils_common();
+	let AvroReader$1 = class AvroReader {
+	    _dataStream;
+	    _headerStream;
+	    _syncMarker;
+	    _metadata;
+	    _itemType;
+	    _itemsRemainingInBlock;
+	    // Remembers where we started if partial data stream was provided.
+	    _initialBlockOffset;
+	    /// The byte offset within the Avro file (both header and data)
+	    /// of the start of the current block.
+	    _blockOffset;
+	    get blockOffset() {
+	        return this._blockOffset;
+	    }
+	    _objectIndex;
+	    get objectIndex() {
+	        return this._objectIndex;
+	    }
+	    _initialized;
+	    constructor(dataStream, headerStream, currentBlockOffset, indexWithinCurrentBlock) {
+	        this._dataStream = dataStream;
+	        this._headerStream = headerStream || dataStream;
+	        this._initialized = false;
+	        this._blockOffset = currentBlockOffset || 0;
+	        this._objectIndex = indexWithinCurrentBlock || 0;
+	        this._initialBlockOffset = currentBlockOffset || 0;
+	    }
+	    async initialize(options = {}) {
+	        const header = await AvroParser_js_1.AvroParser.readFixedBytes(this._headerStream, AvroConstants_js_1.AVRO_INIT_BYTES.length, {
+	            abortSignal: options.abortSignal,
+	        });
+	        if (!(0, utils_common_js_1.arraysEqual)(header, AvroConstants_js_1.AVRO_INIT_BYTES)) {
+	            throw new Error("Stream is not an Avro file.");
+	        }
+	        // File metadata is written as if defined by the following map schema:
+	        // { "type": "map", "values": "bytes"}
+	        this._metadata = await AvroParser_js_1.AvroParser.readMap(this._headerStream, AvroParser_js_1.AvroParser.readString, {
+	            abortSignal: options.abortSignal,
+	        });
+	        // Validate codec
+	        const codec = this._metadata[AvroConstants_js_1.AVRO_CODEC_KEY];
+	        if (!(codec === undefined || codec === null || codec === "null")) {
+	            throw new Error("Codecs are not supported");
+	        }
+	        // The 16-byte, randomly-generated sync marker for this file.
+	        this._syncMarker = await AvroParser_js_1.AvroParser.readFixedBytes(this._headerStream, AvroConstants_js_1.AVRO_SYNC_MARKER_SIZE, {
+	            abortSignal: options.abortSignal,
+	        });
+	        // Parse the schema
+	        const schema = JSON.parse(this._metadata[AvroConstants_js_1.AVRO_SCHEMA_KEY]);
+	        this._itemType = AvroParser_js_1.AvroType.fromSchema(schema);
+	        if (this._blockOffset === 0) {
+	            this._blockOffset = this._initialBlockOffset + this._dataStream.position;
+	        }
+	        this._itemsRemainingInBlock = await AvroParser_js_1.AvroParser.readLong(this._dataStream, {
+	            abortSignal: options.abortSignal,
+	        });
+	        // skip block length
+	        await AvroParser_js_1.AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });
+	        this._initialized = true;
+	        if (this._objectIndex && this._objectIndex > 0) {
+	            for (let i = 0; i < this._objectIndex; i++) {
+	                await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal });
+	                this._itemsRemainingInBlock--;
+	            }
+	        }
+	    }
+	    hasNext() {
+	        return !this._initialized || this._itemsRemainingInBlock > 0;
+	    }
+	    async *parseObjects(options = {}) {
+	        if (!this._initialized) {
+	            await this.initialize(options);
+	        }
+	        while (this.hasNext()) {
+	            const result = await this._itemType.read(this._dataStream, {
+	                abortSignal: options.abortSignal,
+	            });
+	            this._itemsRemainingInBlock--;
+	            this._objectIndex++;
+	            if (this._itemsRemainingInBlock === 0) {
+	                const marker = await AvroParser_js_1.AvroParser.readFixedBytes(this._dataStream, AvroConstants_js_1.AVRO_SYNC_MARKER_SIZE, {
+	                    abortSignal: options.abortSignal,
+	                });
+	                this._blockOffset = this._initialBlockOffset + this._dataStream.position;
+	                this._objectIndex = 0;
+	                if (!(0, utils_common_js_1.arraysEqual)(this._syncMarker, marker)) {
+	                    throw new Error("Stream is not a valid Avro file.");
+	                }
+	                try {
+	                    this._itemsRemainingInBlock = await AvroParser_js_1.AvroParser.readLong(this._dataStream, {
+	                        abortSignal: options.abortSignal,
+	                    });
+	                }
+	                catch {
+	                    // We hit the end of the stream.
+	                    this._itemsRemainingInBlock = 0;
+	                }
+	                if (this._itemsRemainingInBlock > 0) {
+	                    // Ignore block size
+	                    await AvroParser_js_1.AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });
+	                }
+	            }
+	            yield result;
+	        }
+	    }
+	};
+	AvroReader.AvroReader = AvroReader$1;
+	
+	return AvroReader;
+}
+
+var AvroReadable = {};
+
+var hasRequiredAvroReadable;
+
+function requireAvroReadable () {
+	if (hasRequiredAvroReadable) return AvroReadable;
+	hasRequiredAvroReadable = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AvroReadable, "__esModule", { value: true });
+	AvroReadable.AvroReadable = void 0;
+	let AvroReadable$1 = class AvroReadable {
+	};
+	AvroReadable.AvroReadable = AvroReadable$1;
+	
+	return AvroReadable;
+}
+
+var AvroReadableFromStream = {};
+
+var hasRequiredAvroReadableFromStream;
+
+function requireAvroReadableFromStream () {
+	if (hasRequiredAvroReadableFromStream) return AvroReadableFromStream;
+	hasRequiredAvroReadableFromStream = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AvroReadableFromStream, "__esModule", { value: true });
+	AvroReadableFromStream.AvroReadableFromStream = void 0;
+	const AvroReadable_js_1 = requireAvroReadable();
+	const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4();
+	const buffer_1 = require$$2$5;
+	const ABORT_ERROR = new abort_controller_1.AbortError("Reading from the avro stream was aborted.");
+	let AvroReadableFromStream$1 = class AvroReadableFromStream extends AvroReadable_js_1.AvroReadable {
+	    _position;
+	    _readable;
+	    toUint8Array(data) {
+	        if (typeof data === "string") {
+	            return buffer_1.Buffer.from(data);
+	        }
+	        return data;
+	    }
+	    constructor(readable) {
+	        super();
+	        this._readable = readable;
+	        this._position = 0;
+	    }
+	    get position() {
+	        return this._position;
+	    }
+	    async read(size, options = {}) {
+	        if (options.abortSignal?.aborted) {
+	            throw ABORT_ERROR;
+	        }
+	        if (size < 0) {
+	            throw new Error(`size parameter should be positive: ${size}`);
+	        }
+	        if (size === 0) {
+	            return new Uint8Array();
+	        }
+	        if (!this._readable.readable) {
+	            throw new Error("Stream no longer readable.");
+	        }
+	        // See if there is already enough data.
+	        const chunk = this._readable.read(size);
+	        if (chunk) {
+	            this._position += chunk.length;
+	            // chunk.length maybe less than desired size if the stream ends.
+	            return this.toUint8Array(chunk);
+	        }
+	        else {
+	            // register callback to wait for enough data to read
+	            return new Promise((resolve, reject) => {
+	                /* eslint-disable @typescript-eslint/no-use-before-define */
+	                const cleanUp = () => {
+	                    this._readable.removeListener("readable", readableCallback);
+	                    this._readable.removeListener("error", rejectCallback);
+	                    this._readable.removeListener("end", rejectCallback);
+	                    this._readable.removeListener("close", rejectCallback);
+	                    if (options.abortSignal) {
+	                        options.abortSignal.removeEventListener("abort", abortHandler);
+	                    }
+	                };
+	                const readableCallback = () => {
+	                    const callbackChunk = this._readable.read(size);
+	                    if (callbackChunk) {
+	                        this._position += callbackChunk.length;
+	                        cleanUp();
+	                        // callbackChunk.length maybe less than desired size if the stream ends.
+	                        resolve(this.toUint8Array(callbackChunk));
+	                    }
+	                };
+	                const rejectCallback = () => {
+	                    cleanUp();
+	                    reject();
+	                };
+	                const abortHandler = () => {
+	                    cleanUp();
+	                    reject(ABORT_ERROR);
+	                };
+	                this._readable.on("readable", readableCallback);
+	                this._readable.once("error", rejectCallback);
+	                this._readable.once("end", rejectCallback);
+	                this._readable.once("close", rejectCallback);
+	                if (options.abortSignal) {
+	                    options.abortSignal.addEventListener("abort", abortHandler);
+	                }
+	                /* eslint-enable @typescript-eslint/no-use-before-define */
+	            });
+	        }
+	    }
+	};
+	AvroReadableFromStream.AvroReadableFromStream = AvroReadableFromStream$1;
+	
+	return AvroReadableFromStream;
+}
+
+var hasRequiredInternalAvro;
+
+function requireInternalAvro () {
+	if (hasRequiredInternalAvro) return internalAvro;
+	hasRequiredInternalAvro = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.AvroReadableFromStream = exports$1.AvroReadable = exports$1.AvroReader = void 0;
+		var AvroReader_js_1 = requireAvroReader();
+		Object.defineProperty(exports$1, "AvroReader", { enumerable: true, get: function () { return AvroReader_js_1.AvroReader; } });
+		var AvroReadable_js_1 = requireAvroReadable();
+		Object.defineProperty(exports$1, "AvroReadable", { enumerable: true, get: function () { return AvroReadable_js_1.AvroReadable; } });
+		var AvroReadableFromStream_js_1 = requireAvroReadableFromStream();
+		Object.defineProperty(exports$1, "AvroReadableFromStream", { enumerable: true, get: function () { return AvroReadableFromStream_js_1.AvroReadableFromStream; } });
+		
+	} (internalAvro));
+	return internalAvro;
+}
+
+var hasRequiredBlobQuickQueryStream;
+
+function requireBlobQuickQueryStream () {
+	if (hasRequiredBlobQuickQueryStream) return BlobQuickQueryStream;
+	hasRequiredBlobQuickQueryStream = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobQuickQueryStream, "__esModule", { value: true });
+	BlobQuickQueryStream.BlobQuickQueryStream = void 0;
+	const node_stream_1 = require$$0$8;
+	const index_js_1 = requireInternalAvro();
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * A Node.js BlobQuickQueryStream will internally parse avro data stream for blob query.
+	 */
+	let BlobQuickQueryStream$1 = class BlobQuickQueryStream extends node_stream_1.Readable {
+	    source;
+	    avroReader;
+	    avroIter;
+	    avroPaused = true;
+	    onProgress;
+	    onError;
+	    /**
+	     * Creates an instance of BlobQuickQueryStream.
+	     *
+	     * @param source - The current ReadableStream returned from getter
+	     * @param options -
+	     */
+	    constructor(source, options = {}) {
+	        super();
+	        this.source = source;
+	        this.onProgress = options.onProgress;
+	        this.onError = options.onError;
+	        this.avroReader = new index_js_1.AvroReader(new index_js_1.AvroReadableFromStream(this.source));
+	        this.avroIter = this.avroReader.parseObjects({ abortSignal: options.abortSignal });
+	    }
+	    _read() {
+	        if (this.avroPaused) {
+	            this.readInternal().catch((err) => {
+	                this.emit("error", err);
+	            });
+	        }
+	    }
+	    async readInternal() {
+	        this.avroPaused = false;
+	        let avroNext;
+	        do {
+	            avroNext = await this.avroIter.next();
+	            if (avroNext.done) {
+	                break;
+	            }
+	            const obj = avroNext.value;
+	            const schema = obj.$schema;
+	            if (typeof schema !== "string") {
+	                throw Error("Missing schema in avro record.");
+	            }
+	            switch (schema) {
+	                case "com.microsoft.azure.storage.queryBlobContents.resultData":
+	                    {
+	                        const data = obj.data;
+	                        if (data instanceof Uint8Array === false) {
+	                            throw Error("Invalid data in avro result record.");
+	                        }
+	                        if (!this.push(Buffer.from(data))) {
+	                            this.avroPaused = true;
+	                        }
+	                    }
+	                    break;
+	                case "com.microsoft.azure.storage.queryBlobContents.progress":
+	                    {
+	                        const bytesScanned = obj.bytesScanned;
+	                        if (typeof bytesScanned !== "number") {
+	                            throw Error("Invalid bytesScanned in avro progress record.");
+	                        }
+	                        if (this.onProgress) {
+	                            this.onProgress({ loadedBytes: bytesScanned });
+	                        }
+	                    }
+	                    break;
+	                case "com.microsoft.azure.storage.queryBlobContents.end":
+	                    if (this.onProgress) {
+	                        const totalBytes = obj.totalBytes;
+	                        if (typeof totalBytes !== "number") {
+	                            throw Error("Invalid totalBytes in avro end record.");
+	                        }
+	                        this.onProgress({ loadedBytes: totalBytes });
+	                    }
+	                    this.push(null);
+	                    break;
+	                case "com.microsoft.azure.storage.queryBlobContents.error":
+	                    if (this.onError) {
+	                        const fatal = obj.fatal;
+	                        if (typeof fatal !== "boolean") {
+	                            throw Error("Invalid fatal in avro error record.");
+	                        }
+	                        const name = obj.name;
+	                        if (typeof name !== "string") {
+	                            throw Error("Invalid name in avro error record.");
+	                        }
+	                        const description = obj.description;
+	                        if (typeof description !== "string") {
+	                            throw Error("Invalid description in avro error record.");
+	                        }
+	                        const position = obj.position;
+	                        if (typeof position !== "number") {
+	                            throw Error("Invalid position in avro error record.");
+	                        }
+	                        this.onError({
+	                            position,
+	                            name,
+	                            isFatal: fatal,
+	                            description,
+	                        });
+	                    }
+	                    break;
+	                default:
+	                    throw Error(`Unknown schema ${schema} in avro progress record.`);
+	            }
+	        } while (!avroNext.done && !this.avroPaused);
+	    }
+	};
+	BlobQuickQueryStream.BlobQuickQueryStream = BlobQuickQueryStream$1;
+	
+	return BlobQuickQueryStream;
+}
+
+var hasRequiredBlobQueryResponse;
+
+function requireBlobQueryResponse () {
+	if (hasRequiredBlobQueryResponse) return BlobQueryResponse;
+	hasRequiredBlobQueryResponse = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobQueryResponse, "__esModule", { value: true });
+	BlobQueryResponse.BlobQueryResponse = void 0;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const BlobQuickQueryStream_js_1 = requireBlobQuickQueryStream();
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * BlobQueryResponse implements BlobDownloadResponseModel interface, and in Node.js runtime it will
+	 * parse avro data returned by blob query.
+	 */
+	let BlobQueryResponse$1 = class BlobQueryResponse {
+	    /**
+	     * Indicates that the service supports
+	     * requests for partial file content.
+	     *
+	     * @readonly
+	     */
+	    get acceptRanges() {
+	        return this.originalResponse.acceptRanges;
+	    }
+	    /**
+	     * Returns if it was previously specified
+	     * for the file.
+	     *
+	     * @readonly
+	     */
+	    get cacheControl() {
+	        return this.originalResponse.cacheControl;
+	    }
+	    /**
+	     * Returns the value that was specified
+	     * for the 'x-ms-content-disposition' header and specifies how to process the
+	     * response.
+	     *
+	     * @readonly
+	     */
+	    get contentDisposition() {
+	        return this.originalResponse.contentDisposition;
+	    }
+	    /**
+	     * Returns the value that was specified
+	     * for the Content-Encoding request header.
+	     *
+	     * @readonly
+	     */
+	    get contentEncoding() {
+	        return this.originalResponse.contentEncoding;
+	    }
+	    /**
+	     * Returns the value that was specified
+	     * for the Content-Language request header.
+	     *
+	     * @readonly
+	     */
+	    get contentLanguage() {
+	        return this.originalResponse.contentLanguage;
+	    }
+	    /**
+	     * The current sequence number for a
+	     * page blob. This header is not returned for block blobs or append blobs.
+	     *
+	     * @readonly
+	     */
+	    get blobSequenceNumber() {
+	        return this.originalResponse.blobSequenceNumber;
+	    }
+	    /**
+	     * The blob's type. Possible values include:
+	     * 'BlockBlob', 'PageBlob', 'AppendBlob'.
+	     *
+	     * @readonly
+	     */
+	    get blobType() {
+	        return this.originalResponse.blobType;
+	    }
+	    /**
+	     * The number of bytes present in the
+	     * response body.
+	     *
+	     * @readonly
+	     */
+	    get contentLength() {
+	        return this.originalResponse.contentLength;
+	    }
+	    /**
+	     * If the file has an MD5 hash and the
+	     * request is to read the full file, this response header is returned so that
+	     * the client can check for message content integrity. If the request is to
+	     * read a specified range and the 'x-ms-range-get-content-md5' is set to
+	     * true, then the request returns an MD5 hash for the range, as long as the
+	     * range size is less than or equal to 4 MB. If neither of these sets of
+	     * conditions is true, then no value is returned for the 'Content-MD5'
+	     * header.
+	     *
+	     * @readonly
+	     */
+	    get contentMD5() {
+	        return this.originalResponse.contentMD5;
+	    }
+	    /**
+	     * Indicates the range of bytes returned if
+	     * the client requested a subset of the file by setting the Range request
+	     * header.
+	     *
+	     * @readonly
+	     */
+	    get contentRange() {
+	        return this.originalResponse.contentRange;
+	    }
+	    /**
+	     * The content type specified for the file.
+	     * The default content type is 'application/octet-stream'
+	     *
+	     * @readonly
+	     */
+	    get contentType() {
+	        return this.originalResponse.contentType;
+	    }
+	    /**
+	     * Conclusion time of the last attempted
+	     * Copy File operation where this file was the destination file. This value
+	     * can specify the time of a completed, aborted, or failed copy attempt.
+	     *
+	     * @readonly
+	     */
+	    get copyCompletedOn() {
+	        return undefined;
+	    }
+	    /**
+	     * String identifier for the last attempted Copy
+	     * File operation where this file was the destination file.
+	     *
+	     * @readonly
+	     */
+	    get copyId() {
+	        return this.originalResponse.copyId;
+	    }
+	    /**
+	     * Contains the number of bytes copied and
+	     * the total bytes in the source in the last attempted Copy File operation
+	     * where this file was the destination file. Can show between 0 and
+	     * Content-Length bytes copied.
+	     *
+	     * @readonly
+	     */
+	    get copyProgress() {
+	        return this.originalResponse.copyProgress;
+	    }
+	    /**
+	     * URL up to 2KB in length that specifies the
+	     * source file used in the last attempted Copy File operation where this file
+	     * was the destination file.
+	     *
+	     * @readonly
+	     */
+	    get copySource() {
+	        return this.originalResponse.copySource;
+	    }
+	    /**
+	     * State of the copy operation
+	     * identified by 'x-ms-copy-id'. Possible values include: 'pending',
+	     * 'success', 'aborted', 'failed'
+	     *
+	     * @readonly
+	     */
+	    get copyStatus() {
+	        return this.originalResponse.copyStatus;
+	    }
+	    /**
+	     * Only appears when
+	     * x-ms-copy-status is failed or pending. Describes cause of fatal or
+	     * non-fatal copy operation failure.
+	     *
+	     * @readonly
+	     */
+	    get copyStatusDescription() {
+	        return this.originalResponse.copyStatusDescription;
+	    }
+	    /**
+	     * When a blob is leased,
+	     * specifies whether the lease is of infinite or fixed duration. Possible
+	     * values include: 'infinite', 'fixed'.
+	     *
+	     * @readonly
+	     */
+	    get leaseDuration() {
+	        return this.originalResponse.leaseDuration;
+	    }
+	    /**
+	     * Lease state of the blob. Possible
+	     * values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
+	     *
+	     * @readonly
+	     */
+	    get leaseState() {
+	        return this.originalResponse.leaseState;
+	    }
+	    /**
+	     * The current lease status of the
+	     * blob. Possible values include: 'locked', 'unlocked'.
+	     *
+	     * @readonly
+	     */
+	    get leaseStatus() {
+	        return this.originalResponse.leaseStatus;
+	    }
+	    /**
+	     * A UTC date/time value generated by the service that
+	     * indicates the time at which the response was initiated.
+	     *
+	     * @readonly
+	     */
+	    get date() {
+	        return this.originalResponse.date;
+	    }
+	    /**
+	     * The number of committed blocks
+	     * present in the blob. This header is returned only for append blobs.
+	     *
+	     * @readonly
+	     */
+	    get blobCommittedBlockCount() {
+	        return this.originalResponse.blobCommittedBlockCount;
+	    }
+	    /**
+	     * The ETag contains a value that you can use to
+	     * perform operations conditionally, in quotes.
+	     *
+	     * @readonly
+	     */
+	    get etag() {
+	        return this.originalResponse.etag;
+	    }
+	    /**
+	     * The error code.
+	     *
+	     * @readonly
+	     */
+	    get errorCode() {
+	        return this.originalResponse.errorCode;
+	    }
+	    /**
+	     * The value of this header is set to
+	     * true if the file data and application metadata are completely encrypted
+	     * using the specified algorithm. Otherwise, the value is set to false (when
+	     * the file is unencrypted, or if only parts of the file/application metadata
+	     * are encrypted).
+	     *
+	     * @readonly
+	     */
+	    get isServerEncrypted() {
+	        return this.originalResponse.isServerEncrypted;
+	    }
+	    /**
+	     * If the blob has a MD5 hash, and if
+	     * request contains range header (Range or x-ms-range), this response header
+	     * is returned with the value of the whole blob's MD5 value. This value may
+	     * or may not be equal to the value returned in Content-MD5 header, with the
+	     * latter calculated from the requested range.
+	     *
+	     * @readonly
+	     */
+	    get blobContentMD5() {
+	        return this.originalResponse.blobContentMD5;
+	    }
+	    /**
+	     * Returns the date and time the file was last
+	     * modified. Any operation that modifies the file or its properties updates
+	     * the last modified time.
+	     *
+	     * @readonly
+	     */
+	    get lastModified() {
+	        return this.originalResponse.lastModified;
+	    }
+	    /**
+	     * A name-value pair
+	     * to associate with a file storage object.
+	     *
+	     * @readonly
+	     */
+	    get metadata() {
+	        return this.originalResponse.metadata;
+	    }
+	    /**
+	     * This header uniquely identifies the request
+	     * that was made and can be used for troubleshooting the request.
+	     *
+	     * @readonly
+	     */
+	    get requestId() {
+	        return this.originalResponse.requestId;
+	    }
+	    /**
+	     * If a client request id header is sent in the request, this header will be present in the
+	     * response with the same value.
+	     *
+	     * @readonly
+	     */
+	    get clientRequestId() {
+	        return this.originalResponse.clientRequestId;
+	    }
+	    /**
+	     * Indicates the version of the File service used
+	     * to execute the request.
+	     *
+	     * @readonly
+	     */
+	    get version() {
+	        return this.originalResponse.version;
+	    }
+	    /**
+	     * The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
+	     * when the blob was encrypted with a customer-provided key.
+	     *
+	     * @readonly
+	     */
+	    get encryptionKeySha256() {
+	        return this.originalResponse.encryptionKeySha256;
+	    }
+	    /**
+	     * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
+	     * true, then the request returns a crc64 for the range, as long as the range size is less than
+	     * or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
+	     * specified in the same request, it will fail with 400(Bad Request)
+	     */
+	    get contentCrc64() {
+	        return this.originalResponse.contentCrc64;
+	    }
+	    /**
+	     * The response body as a browser Blob.
+	     * Always undefined in node.js.
+	     *
+	     * @readonly
+	     */
+	    get blobBody() {
+	        return undefined;
+	    }
+	    /**
+	     * The response body as a node.js Readable stream.
+	     * Always undefined in the browser.
+	     *
+	     * It will parse avor data returned by blob query.
+	     *
+	     * @readonly
+	     */
+	    get readableStreamBody() {
+	        return core_util_1.isNodeLike ? this.blobDownloadStream : undefined;
+	    }
+	    /**
+	     * The HTTP response.
+	     */
+	    get _response() {
+	        return this.originalResponse._response;
+	    }
+	    originalResponse;
+	    blobDownloadStream;
+	    /**
+	     * Creates an instance of BlobQueryResponse.
+	     *
+	     * @param originalResponse -
+	     * @param options -
+	     */
+	    constructor(originalResponse, options = {}) {
+	        this.originalResponse = originalResponse;
+	        this.blobDownloadStream = new BlobQuickQueryStream_js_1.BlobQuickQueryStream(this.originalResponse.readableStreamBody, options);
+	    }
+	};
+	BlobQueryResponse.BlobQueryResponse = BlobQueryResponse$1;
+	
+	return BlobQueryResponse;
+}
+
+var models = {};
+
+var hasRequiredModels;
+
+function requireModels () {
+	if (hasRequiredModels) return models;
+	hasRequiredModels = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(models, "__esModule", { value: true });
+	models.StorageBlobAudience = models.PremiumPageBlobTier = models.BlockBlobTier = void 0;
+	models.toAccessTier = toAccessTier;
+	models.ensureCpkIfSpecified = ensureCpkIfSpecified;
+	models.getBlobServiceAccountAudience = getBlobServiceAccountAudience;
+	const constants_js_1 = requireConstants$8();
+	/**
+	 * Represents the access tier on a blob.
+	 * For detailed information about block blob level tiering see {@link https://learn.microsoft.com/azure/storage/blobs/storage-blob-storage-tiers|Hot, cool and archive storage tiers.}
+	 */
+	var BlockBlobTier;
+	(function (BlockBlobTier) {
+	    /**
+	     * Optimized for storing data that is accessed frequently.
+	     */
+	    BlockBlobTier["Hot"] = "Hot";
+	    /**
+	     * Optimized for storing data that is infrequently accessed and stored for at least 30 days.
+	     */
+	    BlockBlobTier["Cool"] = "Cool";
+	    /**
+	     * Optimized for storing data that is rarely accessed.
+	     */
+	    BlockBlobTier["Cold"] = "Cold";
+	    /**
+	     * Optimized for storing data that is rarely accessed and stored for at least 180 days
+	     * with flexible latency requirements (on the order of hours).
+	     */
+	    BlockBlobTier["Archive"] = "Archive";
+	})(BlockBlobTier || (models.BlockBlobTier = BlockBlobTier = {}));
+	/**
+	 * Specifies the page blob tier to set the blob to. This is only applicable to page blobs on premium storage accounts.
+	 * Please see {@link https://learn.microsoft.com/azure/storage/storage-premium-storage#scalability-and-performance-targets|here}
+	 * for detailed information on the corresponding IOPS and throughput per PageBlobTier.
+	 */
+	var PremiumPageBlobTier;
+	(function (PremiumPageBlobTier) {
+	    /**
+	     * P4 Tier.
+	     */
+	    PremiumPageBlobTier["P4"] = "P4";
+	    /**
+	     * P6 Tier.
+	     */
+	    PremiumPageBlobTier["P6"] = "P6";
+	    /**
+	     * P10 Tier.
+	     */
+	    PremiumPageBlobTier["P10"] = "P10";
+	    /**
+	     * P15 Tier.
+	     */
+	    PremiumPageBlobTier["P15"] = "P15";
+	    /**
+	     * P20 Tier.
+	     */
+	    PremiumPageBlobTier["P20"] = "P20";
+	    /**
+	     * P30 Tier.
+	     */
+	    PremiumPageBlobTier["P30"] = "P30";
+	    /**
+	     * P40 Tier.
+	     */
+	    PremiumPageBlobTier["P40"] = "P40";
+	    /**
+	     * P50 Tier.
+	     */
+	    PremiumPageBlobTier["P50"] = "P50";
+	    /**
+	     * P60 Tier.
+	     */
+	    PremiumPageBlobTier["P60"] = "P60";
+	    /**
+	     * P70 Tier.
+	     */
+	    PremiumPageBlobTier["P70"] = "P70";
+	    /**
+	     * P80 Tier.
+	     */
+	    PremiumPageBlobTier["P80"] = "P80";
+	})(PremiumPageBlobTier || (models.PremiumPageBlobTier = PremiumPageBlobTier = {}));
+	function toAccessTier(tier) {
+	    if (tier === undefined) {
+	        return undefined;
+	    }
+	    return tier; // No more check if string is a valid AccessTier, and left this to underlay logic to decide(service).
+	}
+	function ensureCpkIfSpecified(cpk, isHttps) {
+	    if (cpk && !isHttps) {
+	        throw new RangeError("Customer-provided encryption key must be used over HTTPS.");
+	    }
+	    if (cpk && !cpk.encryptionAlgorithm) {
+	        cpk.encryptionAlgorithm = constants_js_1.EncryptionAlgorithmAES25;
+	    }
+	}
+	/**
+	 * Defines the known cloud audiences for Storage.
+	 */
+	var StorageBlobAudience;
+	(function (StorageBlobAudience) {
+	    /**
+	     * The OAuth scope to use to retrieve an AAD token for Azure Storage.
+	     */
+	    StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default";
+	    /**
+	     * The OAuth scope to use to retrieve an AAD token for Azure Disk.
+	     */
+	    StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default";
+	})(StorageBlobAudience || (models.StorageBlobAudience = StorageBlobAudience = {}));
+	/**
+	 *
+	 * To get OAuth audience for a storage account for blob service.
+	 */
+	function getBlobServiceAccountAudience(storageAccountName) {
+	    return `https://${storageAccountName}.blob.core.windows.net/.default`;
+	}
+	
+	return models;
+}
+
+var PageBlobRangeResponse = {};
+
+var hasRequiredPageBlobRangeResponse;
+
+function requirePageBlobRangeResponse () {
+	if (hasRequiredPageBlobRangeResponse) return PageBlobRangeResponse;
+	hasRequiredPageBlobRangeResponse = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(PageBlobRangeResponse, "__esModule", { value: true });
+	PageBlobRangeResponse.rangeResponseFromModel = rangeResponseFromModel;
+	/**
+	 * Function that converts PageRange and ClearRange to a common Range object.
+	 * PageRange and ClearRange have start and end while Range offset and count
+	 * this function normalizes to Range.
+	 * @param response - Model PageBlob Range response
+	 */
+	function rangeResponseFromModel(response) {
+	    const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({
+	        offset: x.start,
+	        count: x.end - x.start,
+	    }));
+	    const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({
+	        offset: x.start,
+	        count: x.end - x.start,
+	    }));
+	    return {
+	        ...response,
+	        pageRange,
+	        clearRange,
+	        _response: {
+	            ...response._response,
+	            parsedBody: {
+	                pageRange,
+	                clearRange,
+	            },
+	        },
+	    };
+	}
+	
+	return PageBlobRangeResponse;
+}
+
+var BlobStartCopyFromUrlPoller = {};
+
+var commonjs = {};
+
+var poller$2 = {};
+
+var operation$2 = {};
+
+var operation$1 = {};
+
+var logger = {};
+
+var hasRequiredLogger;
+
+function requireLogger () {
+	if (hasRequiredLogger) return logger;
+	hasRequiredLogger = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(logger, "__esModule", { value: true });
+	logger.logger = void 0;
+	const logger_1 = /*@__PURE__*/ requireCommonjs$d();
+	/**
+	 * The `@azure/logger` configuration for this package.
+	 * @internal
+	 */
+	logger.logger = (0, logger_1.createClientLogger)("core-lro");
+	
+	return logger;
+}
+
+var constants$6 = {};
+
+var hasRequiredConstants$6;
+
+function requireConstants$6 () {
+	if (hasRequiredConstants$6) return constants$6;
+	hasRequiredConstants$6 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(constants$6, "__esModule", { value: true });
+	constants$6.terminalStates = constants$6.POLL_INTERVAL_IN_MS = void 0;
+	/**
+	 * The default time interval to wait before sending the next polling request.
+	 */
+	constants$6.POLL_INTERVAL_IN_MS = 2000;
+	/**
+	 * The closed set of terminal states.
+	 */
+	constants$6.terminalStates = ["succeeded", "canceled", "failed"];
+	
+	return constants$6;
+}
+
+var hasRequiredOperation$2;
+
+function requireOperation$2 () {
+	if (hasRequiredOperation$2) return operation$1;
+	hasRequiredOperation$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(operation$1, "__esModule", { value: true });
+	operation$1.pollOperation = operation$1.initOperation = operation$1.deserializeState = void 0;
+	const logger_js_1 = requireLogger();
+	const constants_js_1 = requireConstants$6();
+	/**
+	 * Deserializes the state
+	 */
+	function deserializeState(serializedState) {
+	    try {
+	        return JSON.parse(serializedState).state;
+	    }
+	    catch (e) {
+	        throw new Error(`Unable to deserialize input state: ${serializedState}`);
+	    }
+	}
+	operation$1.deserializeState = deserializeState;
+	function setStateError(inputs) {
+	    const { state, stateProxy, isOperationError } = inputs;
+	    return (error) => {
+	        if (isOperationError(error)) {
+	            stateProxy.setError(state, error);
+	            stateProxy.setFailed(state);
+	        }
+	        throw error;
+	    };
+	}
+	function appendReadableErrorMessage(currentMessage, innerMessage) {
+	    let message = currentMessage;
+	    if (message.slice(-1) !== ".") {
+	        message = message + ".";
+	    }
+	    return message + " " + innerMessage;
+	}
+	function simplifyError(err) {
+	    let message = err.message;
+	    let code = err.code;
+	    let curErr = err;
+	    while (curErr.innererror) {
+	        curErr = curErr.innererror;
+	        code = curErr.code;
+	        message = appendReadableErrorMessage(message, curErr.message);
+	    }
+	    return {
+	        code,
+	        message,
+	    };
+	}
+	function processOperationStatus(result) {
+	    const { state, stateProxy, status, isDone, processResult, getError, response, setErrorAsResult } = result;
+	    switch (status) {
+	        case "succeeded": {
+	            stateProxy.setSucceeded(state);
+	            break;
+	        }
+	        case "failed": {
+	            const err = getError === null || getError === void 0 ? void 0 : getError(response);
+	            let postfix = "";
+	            if (err) {
+	                const { code, message } = simplifyError(err);
+	                postfix = `. ${code}. ${message}`;
+	            }
+	            const errStr = `The long-running operation has failed${postfix}`;
+	            stateProxy.setError(state, new Error(errStr));
+	            stateProxy.setFailed(state);
+	            logger_js_1.logger.warning(errStr);
+	            break;
+	        }
+	        case "canceled": {
+	            stateProxy.setCanceled(state);
+	            break;
+	        }
+	    }
+	    if ((isDone === null || isDone === void 0 ? void 0 : isDone(response, state)) ||
+	        (isDone === undefined &&
+	            ["succeeded", "canceled"].concat(setErrorAsResult ? [] : ["failed"]).includes(status))) {
+	        stateProxy.setResult(state, buildResult({
+	            response,
+	            state,
+	            processResult,
+	        }));
+	    }
+	}
+	function buildResult(inputs) {
+	    const { processResult, response, state } = inputs;
+	    return processResult ? processResult(response, state) : response;
+	}
+	/**
+	 * Initiates the long-running operation.
+	 */
+	async function initOperation(inputs) {
+	    const { init, stateProxy, processResult, getOperationStatus, withOperationLocation, setErrorAsResult, } = inputs;
+	    const { operationLocation, resourceLocation, metadata, response } = await init();
+	    if (operationLocation)
+	        withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);
+	    const config = {
+	        metadata,
+	        operationLocation,
+	        resourceLocation,
+	    };
+	    logger_js_1.logger.verbose(`LRO: Operation description:`, config);
+	    const state = stateProxy.initState(config);
+	    const status = getOperationStatus({ response, state, operationLocation });
+	    processOperationStatus({ state, status, stateProxy, response, setErrorAsResult, processResult });
+	    return state;
+	}
+	operation$1.initOperation = initOperation;
+	async function pollOperationHelper(inputs) {
+	    const { poll, state, stateProxy, operationLocation, getOperationStatus, getResourceLocation, isOperationError, options, } = inputs;
+	    const response = await poll(operationLocation, options).catch(setStateError({
+	        state,
+	        stateProxy,
+	        isOperationError,
+	    }));
+	    const status = getOperationStatus(response, state);
+	    logger_js_1.logger.verbose(`LRO: Status:\n\tPolling from: ${state.config.operationLocation}\n\tOperation status: ${status}\n\tPolling status: ${constants_js_1.terminalStates.includes(status) ? "Stopped" : "Running"}`);
+	    if (status === "succeeded") {
+	        const resourceLocation = getResourceLocation(response, state);
+	        if (resourceLocation !== undefined) {
+	            return {
+	                response: await poll(resourceLocation).catch(setStateError({ state, stateProxy, isOperationError })),
+	                status,
+	            };
+	        }
+	    }
+	    return { response, status };
+	}
+	/** Polls the long-running operation. */
+	async function pollOperation(inputs) {
+	    const { poll, state, stateProxy, options, getOperationStatus, getResourceLocation, getOperationLocation, isOperationError, withOperationLocation, getPollingInterval, processResult, getError, updateState, setDelay, isDone, setErrorAsResult, } = inputs;
+	    const { operationLocation } = state.config;
+	    if (operationLocation !== undefined) {
+	        const { response, status } = await pollOperationHelper({
+	            poll,
+	            getOperationStatus,
+	            state,
+	            stateProxy,
+	            operationLocation,
+	            getResourceLocation,
+	            isOperationError,
+	            options,
+	        });
+	        processOperationStatus({
+	            status,
+	            response,
+	            state,
+	            stateProxy,
+	            isDone,
+	            processResult,
+	            getError,
+	            setErrorAsResult,
+	        });
+	        if (!constants_js_1.terminalStates.includes(status)) {
+	            const intervalInMs = getPollingInterval === null || getPollingInterval === void 0 ? void 0 : getPollingInterval(response);
+	            if (intervalInMs)
+	                setDelay(intervalInMs);
+	            const location = getOperationLocation === null || getOperationLocation === void 0 ? void 0 : getOperationLocation(response, state);
+	            if (location !== undefined) {
+	                const isUpdated = operationLocation !== location;
+	                state.config.operationLocation = location;
+	                withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(location, isUpdated);
+	            }
+	            else
+	                withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);
+	        }
+	        updateState === null || updateState === void 0 ? void 0 : updateState(state, response);
+	    }
+	}
+	operation$1.pollOperation = pollOperation;
+	
+	return operation$1;
+}
+
+var hasRequiredOperation$1;
+
+function requireOperation$1 () {
+	if (hasRequiredOperation$1) return operation$2;
+	hasRequiredOperation$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(operation$2, "__esModule", { value: true });
+	operation$2.pollHttpOperation = operation$2.isOperationError = operation$2.getResourceLocation = operation$2.getOperationStatus = operation$2.getOperationLocation = operation$2.initHttpOperation = operation$2.getStatusFromInitialResponse = operation$2.getErrorFromResponse = operation$2.parseRetryAfter = operation$2.inferLroMode = void 0;
+	const operation_js_1 = requireOperation$2();
+	const logger_js_1 = requireLogger();
+	function getOperationLocationPollingUrl(inputs) {
+	    const { azureAsyncOperation, operationLocation } = inputs;
+	    return operationLocation !== null && operationLocation !== void 0 ? operationLocation : azureAsyncOperation;
+	}
+	function getLocationHeader(rawResponse) {
+	    return rawResponse.headers["location"];
+	}
+	function getOperationLocationHeader(rawResponse) {
+	    return rawResponse.headers["operation-location"];
+	}
+	function getAzureAsyncOperationHeader(rawResponse) {
+	    return rawResponse.headers["azure-asyncoperation"];
+	}
+	function findResourceLocation(inputs) {
+	    var _a;
+	    const { location, requestMethod, requestPath, resourceLocationConfig } = inputs;
+	    switch (requestMethod) {
+	        case "PUT": {
+	            return requestPath;
+	        }
+	        case "DELETE": {
+	            return undefined;
+	        }
+	        case "PATCH": {
+	            return (_a = getDefault()) !== null && _a !== void 0 ? _a : requestPath;
+	        }
+	        default: {
+	            return getDefault();
+	        }
+	    }
+	    function getDefault() {
+	        switch (resourceLocationConfig) {
+	            case "azure-async-operation": {
+	                return undefined;
+	            }
+	            case "original-uri": {
+	                return requestPath;
+	            }
+	            case "location":
+	            default: {
+	                return location;
+	            }
+	        }
+	    }
+	}
+	function inferLroMode(inputs) {
+	    const { rawResponse, requestMethod, requestPath, resourceLocationConfig } = inputs;
+	    const operationLocation = getOperationLocationHeader(rawResponse);
+	    const azureAsyncOperation = getAzureAsyncOperationHeader(rawResponse);
+	    const pollingUrl = getOperationLocationPollingUrl({ operationLocation, azureAsyncOperation });
+	    const location = getLocationHeader(rawResponse);
+	    const normalizedRequestMethod = requestMethod === null || requestMethod === void 0 ? void 0 : requestMethod.toLocaleUpperCase();
+	    if (pollingUrl !== undefined) {
+	        return {
+	            mode: "OperationLocation",
+	            operationLocation: pollingUrl,
+	            resourceLocation: findResourceLocation({
+	                requestMethod: normalizedRequestMethod,
+	                location,
+	                requestPath,
+	                resourceLocationConfig,
+	            }),
+	        };
+	    }
+	    else if (location !== undefined) {
+	        return {
+	            mode: "ResourceLocation",
+	            operationLocation: location,
+	        };
+	    }
+	    else if (normalizedRequestMethod === "PUT" && requestPath) {
+	        return {
+	            mode: "Body",
+	            operationLocation: requestPath,
+	        };
+	    }
+	    else {
+	        return undefined;
+	    }
+	}
+	operation$2.inferLroMode = inferLroMode;
+	function transformStatus(inputs) {
+	    const { status, statusCode } = inputs;
+	    if (typeof status !== "string" && status !== undefined) {
+	        throw new Error(`Polling was unsuccessful. Expected status to have a string value or no value but it has instead: ${status}. This doesn't necessarily indicate the operation has failed. Check your Azure subscription or resource status for more information.`);
+	    }
+	    switch (status === null || status === void 0 ? void 0 : status.toLocaleLowerCase()) {
+	        case undefined:
+	            return toOperationStatus(statusCode);
+	        case "succeeded":
+	            return "succeeded";
+	        case "failed":
+	            return "failed";
+	        case "running":
+	        case "accepted":
+	        case "started":
+	        case "canceling":
+	        case "cancelling":
+	            return "running";
+	        case "canceled":
+	        case "cancelled":
+	            return "canceled";
+	        default: {
+	            logger_js_1.logger.verbose(`LRO: unrecognized operation status: ${status}`);
+	            return status;
+	        }
+	    }
+	}
+	function getStatus(rawResponse) {
+	    var _a;
+	    const { status } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
+	    return transformStatus({ status, statusCode: rawResponse.statusCode });
+	}
+	function getProvisioningState(rawResponse) {
+	    var _a, _b;
+	    const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
+	    const status = (_b = properties === null || properties === void 0 ? void 0 : properties.provisioningState) !== null && _b !== void 0 ? _b : provisioningState;
+	    return transformStatus({ status, statusCode: rawResponse.statusCode });
+	}
+	function toOperationStatus(statusCode) {
+	    if (statusCode === 202) {
+	        return "running";
+	    }
+	    else if (statusCode < 300) {
+	        return "succeeded";
+	    }
+	    else {
+	        return "failed";
+	    }
+	}
+	function parseRetryAfter({ rawResponse }) {
+	    const retryAfter = rawResponse.headers["retry-after"];
+	    if (retryAfter !== undefined) {
+	        // Retry-After header value is either in HTTP date format, or in seconds
+	        const retryAfterInSeconds = parseInt(retryAfter);
+	        return isNaN(retryAfterInSeconds)
+	            ? calculatePollingIntervalFromDate(new Date(retryAfter))
+	            : retryAfterInSeconds * 1000;
+	    }
+	    return undefined;
+	}
+	operation$2.parseRetryAfter = parseRetryAfter;
+	function getErrorFromResponse(response) {
+	    const error = accessBodyProperty(response, "error");
+	    if (!error) {
+	        logger_js_1.logger.warning(`The long-running operation failed but there is no error property in the response's body`);
+	        return;
+	    }
+	    if (!error.code || !error.message) {
+	        logger_js_1.logger.warning(`The long-running operation failed but the error property in the response's body doesn't contain code or message`);
+	        return;
+	    }
+	    return error;
+	}
+	operation$2.getErrorFromResponse = getErrorFromResponse;
+	function calculatePollingIntervalFromDate(retryAfterDate) {
+	    const timeNow = Math.floor(new Date().getTime());
+	    const retryAfterTime = retryAfterDate.getTime();
+	    if (timeNow < retryAfterTime) {
+	        return retryAfterTime - timeNow;
+	    }
+	    return undefined;
+	}
+	function getStatusFromInitialResponse(inputs) {
+	    const { response, state, operationLocation } = inputs;
+	    function helper() {
+	        var _a;
+	        const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
+	        switch (mode) {
+	            case undefined:
+	                return toOperationStatus(response.rawResponse.statusCode);
+	            case "Body":
+	                return getOperationStatus(response, state);
+	            default:
+	                return "running";
+	        }
+	    }
+	    const status = helper();
+	    return status === "running" && operationLocation === undefined ? "succeeded" : status;
+	}
+	operation$2.getStatusFromInitialResponse = getStatusFromInitialResponse;
+	/**
+	 * Initiates the long-running operation.
+	 */
+	async function initHttpOperation(inputs) {
+	    const { stateProxy, resourceLocationConfig, processResult, lro, setErrorAsResult } = inputs;
+	    return (0, operation_js_1.initOperation)({
+	        init: async () => {
+	            const response = await lro.sendInitialRequest();
+	            const config = inferLroMode({
+	                rawResponse: response.rawResponse,
+	                requestPath: lro.requestPath,
+	                requestMethod: lro.requestMethod,
+	                resourceLocationConfig,
+	            });
+	            return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));
+	        },
+	        stateProxy,
+	        processResult: processResult
+	            ? ({ flatResponse }, state) => processResult(flatResponse, state)
+	            : ({ flatResponse }) => flatResponse,
+	        getOperationStatus: getStatusFromInitialResponse,
+	        setErrorAsResult,
+	    });
+	}
+	operation$2.initHttpOperation = initHttpOperation;
+	function getOperationLocation({ rawResponse }, state) {
+	    var _a;
+	    const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
+	    switch (mode) {
+	        case "OperationLocation": {
+	            return getOperationLocationPollingUrl({
+	                operationLocation: getOperationLocationHeader(rawResponse),
+	                azureAsyncOperation: getAzureAsyncOperationHeader(rawResponse),
+	            });
+	        }
+	        case "ResourceLocation": {
+	            return getLocationHeader(rawResponse);
+	        }
+	        case "Body":
+	        default: {
+	            return undefined;
+	        }
+	    }
+	}
+	operation$2.getOperationLocation = getOperationLocation;
+	function getOperationStatus({ rawResponse }, state) {
+	    var _a;
+	    const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
+	    switch (mode) {
+	        case "OperationLocation": {
+	            return getStatus(rawResponse);
+	        }
+	        case "ResourceLocation": {
+	            return toOperationStatus(rawResponse.statusCode);
+	        }
+	        case "Body": {
+	            return getProvisioningState(rawResponse);
+	        }
+	        default:
+	            throw new Error(`Internal error: Unexpected operation mode: ${mode}`);
+	    }
+	}
+	operation$2.getOperationStatus = getOperationStatus;
+	function accessBodyProperty({ flatResponse, rawResponse }, prop) {
+	    var _a, _b;
+	    return (_a = flatResponse === null || flatResponse === void 0 ? void 0 : flatResponse[prop]) !== null && _a !== void 0 ? _a : (_b = rawResponse.body) === null || _b === void 0 ? void 0 : _b[prop];
+	}
+	function getResourceLocation(res, state) {
+	    const loc = accessBodyProperty(res, "resourceLocation");
+	    if (loc && typeof loc === "string") {
+	        state.config.resourceLocation = loc;
+	    }
+	    return state.config.resourceLocation;
+	}
+	operation$2.getResourceLocation = getResourceLocation;
+	function isOperationError(e) {
+	    return e.name === "RestError";
+	}
+	operation$2.isOperationError = isOperationError;
+	/** Polls the long-running operation. */
+	async function pollHttpOperation(inputs) {
+	    const { lro, stateProxy, options, processResult, updateState, setDelay, state, setErrorAsResult, } = inputs;
+	    return (0, operation_js_1.pollOperation)({
+	        state,
+	        stateProxy,
+	        setDelay,
+	        processResult: processResult
+	            ? ({ flatResponse }, inputState) => processResult(flatResponse, inputState)
+	            : ({ flatResponse }) => flatResponse,
+	        getError: getErrorFromResponse,
+	        updateState,
+	        getPollingInterval: parseRetryAfter,
+	        getOperationLocation,
+	        getOperationStatus,
+	        isOperationError,
+	        getResourceLocation,
+	        options,
+	        /**
+	         * The expansion here is intentional because `lro` could be an object that
+	         * references an inner this, so we need to preserve a reference to it.
+	         */
+	        poll: async (location, inputOptions) => lro.sendPollRequest(location, inputOptions),
+	        setErrorAsResult,
+	    });
+	}
+	operation$2.pollHttpOperation = pollHttpOperation;
+	
+	return operation$2;
+}
+
+var poller$1 = {};
+
+var hasRequiredPoller$2;
+
+function requirePoller$2 () {
+	if (hasRequiredPoller$2) return poller$1;
+	hasRequiredPoller$2 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(poller$1, "__esModule", { value: true });
+	poller$1.buildCreatePoller = void 0;
+	const operation_js_1 = requireOperation$2();
+	const constants_js_1 = requireConstants$6();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const createStateProxy = () => ({
+	    /**
+	     * The state at this point is created to be of type OperationState.
+	     * It will be updated later to be of type TState when the
+	     * customer-provided callback, `updateState`, is called during polling.
+	     */
+	    initState: (config) => ({ status: "running", config }),
+	    setCanceled: (state) => (state.status = "canceled"),
+	    setError: (state, error) => (state.error = error),
+	    setResult: (state, result) => (state.result = result),
+	    setRunning: (state) => (state.status = "running"),
+	    setSucceeded: (state) => (state.status = "succeeded"),
+	    setFailed: (state) => (state.status = "failed"),
+	    getError: (state) => state.error,
+	    getResult: (state) => state.result,
+	    isCanceled: (state) => state.status === "canceled",
+	    isFailed: (state) => state.status === "failed",
+	    isRunning: (state) => state.status === "running",
+	    isSucceeded: (state) => state.status === "succeeded",
+	});
+	/**
+	 * Returns a poller factory.
+	 */
+	function buildCreatePoller(inputs) {
+	    const { getOperationLocation, getStatusFromInitialResponse, getStatusFromPollResponse, isOperationError, getResourceLocation, getPollingInterval, getError, resolveOnUnsuccessful, } = inputs;
+	    return async ({ init, poll }, options) => {
+	        const { processResult, updateState, withOperationLocation: withOperationLocationCallback, intervalInMs = constants_js_1.POLL_INTERVAL_IN_MS, restoreFrom, } = options || {};
+	        const stateProxy = createStateProxy();
+	        const withOperationLocation = withOperationLocationCallback
+	            ? (() => {
+	                let called = false;
+	                return (operationLocation, isUpdated) => {
+	                    if (isUpdated)
+	                        withOperationLocationCallback(operationLocation);
+	                    else if (!called)
+	                        withOperationLocationCallback(operationLocation);
+	                    called = true;
+	                };
+	            })()
+	            : undefined;
+	        const state = restoreFrom
+	            ? (0, operation_js_1.deserializeState)(restoreFrom)
+	            : await (0, operation_js_1.initOperation)({
+	                init,
+	                stateProxy,
+	                processResult,
+	                getOperationStatus: getStatusFromInitialResponse,
+	                withOperationLocation,
+	                setErrorAsResult: !resolveOnUnsuccessful,
+	            });
+	        let resultPromise;
+	        const abortController = new AbortController();
+	        const handlers = new Map();
+	        const handleProgressEvents = async () => handlers.forEach((h) => h(state));
+	        const cancelErrMsg = "Operation was canceled";
+	        let currentPollIntervalInMs = intervalInMs;
+	        const poller = {
+	            getOperationState: () => state,
+	            getResult: () => state.result,
+	            isDone: () => ["succeeded", "failed", "canceled"].includes(state.status),
+	            isStopped: () => resultPromise === undefined,
+	            stopPolling: () => {
+	                abortController.abort();
+	            },
+	            toString: () => JSON.stringify({
+	                state,
+	            }),
+	            onProgress: (callback) => {
+	                const s = Symbol();
+	                handlers.set(s, callback);
+	                return () => handlers.delete(s);
+	            },
+	            pollUntilDone: (pollOptions) => (resultPromise !== null && resultPromise !== void 0 ? resultPromise : (resultPromise = (async () => {
+	                const { abortSignal: inputAbortSignal } = pollOptions || {};
+	                // In the future we can use AbortSignal.any() instead
+	                function abortListener() {
+	                    abortController.abort();
+	                }
+	                const abortSignal = abortController.signal;
+	                if (inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.aborted) {
+	                    abortController.abort();
+	                }
+	                else if (!abortSignal.aborted) {
+	                    inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.addEventListener("abort", abortListener, { once: true });
+	                }
+	                try {
+	                    if (!poller.isDone()) {
+	                        await poller.poll({ abortSignal });
+	                        while (!poller.isDone()) {
+	                            await (0, core_util_1.delay)(currentPollIntervalInMs, { abortSignal });
+	                            await poller.poll({ abortSignal });
+	                        }
+	                    }
+	                }
+	                finally {
+	                    inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.removeEventListener("abort", abortListener);
+	                }
+	                if (resolveOnUnsuccessful) {
+	                    return poller.getResult();
+	                }
+	                else {
+	                    switch (state.status) {
+	                        case "succeeded":
+	                            return poller.getResult();
+	                        case "canceled":
+	                            throw new Error(cancelErrMsg);
+	                        case "failed":
+	                            throw state.error;
+	                        case "notStarted":
+	                        case "running":
+	                            throw new Error(`Polling completed without succeeding or failing`);
+	                    }
+	                }
+	            })().finally(() => {
+	                resultPromise = undefined;
+	            }))),
+	            async poll(pollOptions) {
+	                if (resolveOnUnsuccessful) {
+	                    if (poller.isDone())
+	                        return;
+	                }
+	                else {
+	                    switch (state.status) {
+	                        case "succeeded":
+	                            return;
+	                        case "canceled":
+	                            throw new Error(cancelErrMsg);
+	                        case "failed":
+	                            throw state.error;
+	                    }
+	                }
+	                await (0, operation_js_1.pollOperation)({
+	                    poll,
+	                    state,
+	                    stateProxy,
+	                    getOperationLocation,
+	                    isOperationError,
+	                    withOperationLocation,
+	                    getPollingInterval,
+	                    getOperationStatus: getStatusFromPollResponse,
+	                    getResourceLocation,
+	                    processResult,
+	                    getError,
+	                    updateState,
+	                    options: pollOptions,
+	                    setDelay: (pollIntervalInMs) => {
+	                        currentPollIntervalInMs = pollIntervalInMs;
+	                    },
+	                    setErrorAsResult: !resolveOnUnsuccessful,
+	                });
+	                await handleProgressEvents();
+	                if (!resolveOnUnsuccessful) {
+	                    switch (state.status) {
+	                        case "canceled":
+	                            throw new Error(cancelErrMsg);
+	                        case "failed":
+	                            throw state.error;
+	                    }
+	                }
+	            },
+	        };
+	        return poller;
+	    };
+	}
+	poller$1.buildCreatePoller = buildCreatePoller;
+	
+	return poller$1;
+}
+
+var hasRequiredPoller$1;
+
+function requirePoller$1 () {
+	if (hasRequiredPoller$1) return poller$2;
+	hasRequiredPoller$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(poller$2, "__esModule", { value: true });
+	poller$2.createHttpPoller = void 0;
+	const operation_js_1 = requireOperation$1();
+	const poller_js_1 = requirePoller$2();
+	/**
+	 * Creates a poller that can be used to poll a long-running operation.
+	 * @param lro - Description of the long-running operation
+	 * @param options - options to configure the poller
+	 * @returns an initialized poller
+	 */
+	async function createHttpPoller(lro, options) {
+	    const { resourceLocationConfig, intervalInMs, processResult, restoreFrom, updateState, withOperationLocation, resolveOnUnsuccessful = false, } = options || {};
+	    return (0, poller_js_1.buildCreatePoller)({
+	        getStatusFromInitialResponse: operation_js_1.getStatusFromInitialResponse,
+	        getStatusFromPollResponse: operation_js_1.getOperationStatus,
+	        isOperationError: operation_js_1.isOperationError,
+	        getOperationLocation: operation_js_1.getOperationLocation,
+	        getResourceLocation: operation_js_1.getResourceLocation,
+	        getPollingInterval: operation_js_1.parseRetryAfter,
+	        getError: operation_js_1.getErrorFromResponse,
+	        resolveOnUnsuccessful,
+	    })({
+	        init: async () => {
+	            const response = await lro.sendInitialRequest();
+	            const config = (0, operation_js_1.inferLroMode)({
+	                rawResponse: response.rawResponse,
+	                requestPath: lro.requestPath,
+	                requestMethod: lro.requestMethod,
+	                resourceLocationConfig,
+	            });
+	            return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));
+	        },
+	        poll: lro.sendPollRequest,
+	    }, {
+	        intervalInMs,
+	        withOperationLocation,
+	        restoreFrom,
+	        updateState,
+	        processResult: processResult
+	            ? ({ flatResponse }, state) => processResult(flatResponse, state)
+	            : ({ flatResponse }) => flatResponse,
+	    });
+	}
+	poller$2.createHttpPoller = createHttpPoller;
+	
+	return poller$2;
+}
+
+var lroEngine$1 = {};
+
+var lroEngine = {};
+
+var operation = {};
+
+var hasRequiredOperation;
+
+function requireOperation () {
+	if (hasRequiredOperation) return operation;
+	hasRequiredOperation = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(operation, "__esModule", { value: true });
+	operation.GenericPollOperation = void 0;
+	const operation_js_1 = requireOperation$1();
+	const logger_js_1 = requireLogger();
+	const createStateProxy = () => ({
+	    initState: (config) => ({ config, isStarted: true }),
+	    setCanceled: (state) => (state.isCancelled = true),
+	    setError: (state, error) => (state.error = error),
+	    setResult: (state, result) => (state.result = result),
+	    setRunning: (state) => (state.isStarted = true),
+	    setSucceeded: (state) => (state.isCompleted = true),
+	    setFailed: () => {
+	        /** empty body */
+	    },
+	    getError: (state) => state.error,
+	    getResult: (state) => state.result,
+	    isCanceled: (state) => !!state.isCancelled,
+	    isFailed: (state) => !!state.error,
+	    isRunning: (state) => !!state.isStarted,
+	    isSucceeded: (state) => Boolean(state.isCompleted && !state.isCancelled && !state.error),
+	});
+	class GenericPollOperation {
+	    constructor(state, lro, setErrorAsResult, lroResourceLocationConfig, processResult, updateState, isDone) {
+	        this.state = state;
+	        this.lro = lro;
+	        this.setErrorAsResult = setErrorAsResult;
+	        this.lroResourceLocationConfig = lroResourceLocationConfig;
+	        this.processResult = processResult;
+	        this.updateState = updateState;
+	        this.isDone = isDone;
+	    }
+	    setPollerConfig(pollerConfig) {
+	        this.pollerConfig = pollerConfig;
+	    }
+	    async update(options) {
+	        var _a;
+	        const stateProxy = createStateProxy();
+	        if (!this.state.isStarted) {
+	            this.state = Object.assign(Object.assign({}, this.state), (await (0, operation_js_1.initHttpOperation)({
+	                lro: this.lro,
+	                stateProxy,
+	                resourceLocationConfig: this.lroResourceLocationConfig,
+	                processResult: this.processResult,
+	                setErrorAsResult: this.setErrorAsResult,
+	            })));
+	        }
+	        const updateState = this.updateState;
+	        const isDone = this.isDone;
+	        if (!this.state.isCompleted && this.state.error === undefined) {
+	            await (0, operation_js_1.pollHttpOperation)({
+	                lro: this.lro,
+	                state: this.state,
+	                stateProxy,
+	                processResult: this.processResult,
+	                updateState: updateState
+	                    ? (state, { rawResponse }) => updateState(state, rawResponse)
+	                    : undefined,
+	                isDone: isDone
+	                    ? ({ flatResponse }, state) => isDone(flatResponse, state)
+	                    : undefined,
+	                options,
+	                setDelay: (intervalInMs) => {
+	                    this.pollerConfig.intervalInMs = intervalInMs;
+	                },
+	                setErrorAsResult: this.setErrorAsResult,
+	            });
+	        }
+	        (_a = options === null || options === void 0 ? void 0 : options.fireProgress) === null || _a === void 0 ? void 0 : _a.call(options, this.state);
+	        return this;
+	    }
+	    async cancel() {
+	        logger_js_1.logger.error("`cancelOperation` is deprecated because it wasn't implemented");
+	        return this;
+	    }
+	    /**
+	     * Serializes the Poller operation.
+	     */
+	    toString() {
+	        return JSON.stringify({
+	            state: this.state,
+	        });
+	    }
+	}
+	operation.GenericPollOperation = GenericPollOperation;
+	
+	return operation;
+}
+
+var poller = {};
+
+var hasRequiredPoller;
+
+function requirePoller () {
+	if (hasRequiredPoller) return poller;
+	hasRequiredPoller = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(poller, "__esModule", { value: true });
+	poller.Poller = poller.PollerCancelledError = poller.PollerStoppedError = void 0;
+	/**
+	 * When a poller is manually stopped through the `stopPolling` method,
+	 * the poller will be rejected with an instance of the PollerStoppedError.
+	 */
+	class PollerStoppedError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = "PollerStoppedError";
+	        Object.setPrototypeOf(this, PollerStoppedError.prototype);
+	    }
+	}
+	poller.PollerStoppedError = PollerStoppedError;
+	/**
+	 * When the operation is cancelled, the poller will be rejected with an instance
+	 * of the PollerCancelledError.
+	 */
+	class PollerCancelledError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = "PollerCancelledError";
+	        Object.setPrototypeOf(this, PollerCancelledError.prototype);
+	    }
+	}
+	poller.PollerCancelledError = PollerCancelledError;
+	/**
+	 * A class that represents the definition of a program that polls through consecutive requests
+	 * until it reaches a state of completion.
+	 *
+	 * A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.
+	 * It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.
+	 * Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.
+	 *
+	 * ```ts
+	 * const poller = new MyPoller();
+	 *
+	 * // Polling just once:
+	 * await poller.poll();
+	 *
+	 * // We can try to cancel the request here, by calling:
+	 * //
+	 * //     await poller.cancelOperation();
+	 * //
+	 *
+	 * // Getting the final result:
+	 * const result = await poller.pollUntilDone();
+	 * ```
+	 *
+	 * The Poller is defined by two types, a type representing the state of the poller, which
+	 * must include a basic set of properties from `PollOperationState`,
+	 * and a return type defined by `TResult`, which can be anything.
+	 *
+	 * The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having
+	 * to export the Poller's class directly, and instead only export the already instantiated poller with the PollerLike type.
+	 *
+	 * ```ts
+	 * class Client {
+	 *   public async makePoller: PollerLike {
+	 *     const poller = new MyPoller({});
+	 *     // It might be preferred to return the poller after the first request is made,
+	 *     // so that some information can be obtained right away.
+	 *     await poller.poll();
+	 *     return poller;
+	 *   }
+	 * }
+	 *
+	 * const poller: PollerLike = myClient.makePoller();
+	 * ```
+	 *
+	 * A poller can be created through its constructor, then it can be polled until it's completed.
+	 * At any point in time, the state of the poller can be obtained without delay through the getOperationState method.
+	 * At any point in time, the intermediate forms of the result type can be requested without delay.
+	 * Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.
+	 *
+	 * ```ts
+	 * const poller = myClient.makePoller();
+	 * const state: MyOperationState = poller.getOperationState();
+	 *
+	 * // The intermediate result can be obtained at any time.
+	 * const result: MyResult | undefined = poller.getResult();
+	 *
+	 * // The final result can only be obtained after the poller finishes.
+	 * const result: MyResult = await poller.pollUntilDone();
+	 * ```
+	 *
+	 */
+	// eslint-disable-next-line no-use-before-define
+	class Poller {
+	    /**
+	     * A poller needs to be initialized by passing in at least the basic properties of the `PollOperation`.
+	     *
+	     * When writing an implementation of a Poller, this implementation needs to deal with the initialization
+	     * of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller's
+	     * operation has already been defined, at least its basic properties. The code below shows how to approach
+	     * the definition of the constructor of a new custom poller.
+	     *
+	     * ```ts
+	     * export class MyPoller extends Poller {
+	     *   constructor({
+	     *     // Anything you might need outside of the basics
+	     *   }) {
+	     *     let state: MyOperationState = {
+	     *       privateProperty: private,
+	     *       publicProperty: public,
+	     *     };
+	     *
+	     *     const operation = {
+	     *       state,
+	     *       update,
+	     *       cancel,
+	     *       toString
+	     *     }
+	     *
+	     *     // Sending the operation to the parent's constructor.
+	     *     super(operation);
+	     *
+	     *     // You can assign more local properties here.
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * Inside of this constructor, a new promise is created. This will be used to
+	     * tell the user when the poller finishes (see `pollUntilDone()`). The promise's
+	     * resolve and reject methods are also used internally to control when to resolve
+	     * or reject anyone waiting for the poller to finish.
+	     *
+	     * The constructor of a custom implementation of a poller is where any serialized version of
+	     * a previous poller's operation should be deserialized into the operation sent to the
+	     * base constructor. For example:
+	     *
+	     * ```ts
+	     * export class MyPoller extends Poller {
+	     *   constructor(
+	     *     baseOperation: string | undefined
+	     *   ) {
+	     *     let state: MyOperationState = {};
+	     *     if (baseOperation) {
+	     *       state = {
+	     *         ...JSON.parse(baseOperation).state,
+	     *         ...state
+	     *       };
+	     *     }
+	     *     const operation = {
+	     *       state,
+	     *       // ...
+	     *     }
+	     *     super(operation);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param operation - Must contain the basic properties of `PollOperation`.
+	     */
+	    constructor(operation) {
+	        /** controls whether to throw an error if the operation failed or was canceled. */
+	        this.resolveOnUnsuccessful = false;
+	        this.stopped = true;
+	        this.pollProgressCallbacks = [];
+	        this.operation = operation;
+	        this.promise = new Promise((resolve, reject) => {
+	            this.resolve = resolve;
+	            this.reject = reject;
+	        });
+	        // This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.
+	        // The above warning would get thrown if `poller.poll` is called, it returns an error,
+	        // and pullUntilDone did not have a .catch or await try/catch on it's return value.
+	        this.promise.catch(() => {
+	            /* intentionally blank */
+	        });
+	    }
+	    /**
+	     * Starts a loop that will break only if the poller is done
+	     * or if the poller is stopped.
+	     */
+	    async startPolling(pollOptions = {}) {
+	        if (this.stopped) {
+	            this.stopped = false;
+	        }
+	        while (!this.isStopped() && !this.isDone()) {
+	            await this.poll(pollOptions);
+	            await this.delay();
+	        }
+	    }
+	    /**
+	     * pollOnce does one polling, by calling to the update method of the underlying
+	     * poll operation to make any relevant change effective.
+	     *
+	     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
+	     *
+	     * @param options - Optional properties passed to the operation's update method.
+	     */
+	    async pollOnce(options = {}) {
+	        if (!this.isDone()) {
+	            this.operation = await this.operation.update({
+	                abortSignal: options.abortSignal,
+	                fireProgress: this.fireProgress.bind(this),
+	            });
+	        }
+	        this.processUpdatedState();
+	    }
+	    /**
+	     * fireProgress calls the functions passed in via onProgress the method of the poller.
+	     *
+	     * It loops over all of the callbacks received from onProgress, and executes them, sending them
+	     * the current operation state.
+	     *
+	     * @param state - The current operation state.
+	     */
+	    fireProgress(state) {
+	        for (const callback of this.pollProgressCallbacks) {
+	            callback(state);
+	        }
+	    }
+	    /**
+	     * Invokes the underlying operation's cancel method.
+	     */
+	    async cancelOnce(options = {}) {
+	        this.operation = await this.operation.cancel(options);
+	    }
+	    /**
+	     * Returns a promise that will resolve once a single polling request finishes.
+	     * It does this by calling the update method of the Poller's operation.
+	     *
+	     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
+	     *
+	     * @param options - Optional properties passed to the operation's update method.
+	     */
+	    poll(options = {}) {
+	        if (!this.pollOncePromise) {
+	            this.pollOncePromise = this.pollOnce(options);
+	            const clearPollOncePromise = () => {
+	                this.pollOncePromise = undefined;
+	            };
+	            this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);
+	        }
+	        return this.pollOncePromise;
+	    }
+	    processUpdatedState() {
+	        if (this.operation.state.error) {
+	            this.stopped = true;
+	            if (!this.resolveOnUnsuccessful) {
+	                this.reject(this.operation.state.error);
+	                throw this.operation.state.error;
+	            }
+	        }
+	        if (this.operation.state.isCancelled) {
+	            this.stopped = true;
+	            if (!this.resolveOnUnsuccessful) {
+	                const error = new PollerCancelledError("Operation was canceled");
+	                this.reject(error);
+	                throw error;
+	            }
+	        }
+	        if (this.isDone() && this.resolve) {
+	            // If the poller has finished polling, this means we now have a result.
+	            // However, it can be the case that TResult is instantiated to void, so
+	            // we are not expecting a result anyway. To assert that we might not
+	            // have a result eventually after finishing polling, we cast the result
+	            // to TResult.
+	            this.resolve(this.getResult());
+	        }
+	    }
+	    /**
+	     * Returns a promise that will resolve once the underlying operation is completed.
+	     */
+	    async pollUntilDone(pollOptions = {}) {
+	        if (this.stopped) {
+	            this.startPolling(pollOptions).catch(this.reject);
+	        }
+	        // This is needed because the state could have been updated by
+	        // `cancelOperation`, e.g. the operation is canceled or an error occurred.
+	        this.processUpdatedState();
+	        return this.promise;
+	    }
+	    /**
+	     * Invokes the provided callback after each polling is completed,
+	     * sending the current state of the poller's operation.
+	     *
+	     * It returns a method that can be used to stop receiving updates on the given callback function.
+	     */
+	    onProgress(callback) {
+	        this.pollProgressCallbacks.push(callback);
+	        return () => {
+	            this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);
+	        };
+	    }
+	    /**
+	     * Returns true if the poller has finished polling.
+	     */
+	    isDone() {
+	        const state = this.operation.state;
+	        return Boolean(state.isCompleted || state.isCancelled || state.error);
+	    }
+	    /**
+	     * Stops the poller from continuing to poll.
+	     */
+	    stopPolling() {
+	        if (!this.stopped) {
+	            this.stopped = true;
+	            if (this.reject) {
+	                this.reject(new PollerStoppedError("This poller is already stopped"));
+	            }
+	        }
+	    }
+	    /**
+	     * Returns true if the poller is stopped.
+	     */
+	    isStopped() {
+	        return this.stopped;
+	    }
+	    /**
+	     * Attempts to cancel the underlying operation.
+	     *
+	     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
+	     *
+	     * If it's called again before it finishes, it will throw an error.
+	     *
+	     * @param options - Optional properties passed to the operation's update method.
+	     */
+	    cancelOperation(options = {}) {
+	        if (!this.cancelPromise) {
+	            this.cancelPromise = this.cancelOnce(options);
+	        }
+	        else if (options.abortSignal) {
+	            throw new Error("A cancel request is currently pending");
+	        }
+	        return this.cancelPromise;
+	    }
+	    /**
+	     * Returns the state of the operation.
+	     *
+	     * Even though TState will be the same type inside any of the methods of any extension of the Poller class,
+	     * implementations of the pollers can customize what's shared with the public by writing their own
+	     * version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller
+	     * and a public type representing a safe to share subset of the properties of the internal state.
+	     * Their definition of getOperationState can then return their public type.
+	     *
+	     * Example:
+	     *
+	     * ```ts
+	     * // Let's say we have our poller's operation state defined as:
+	     * interface MyOperationState extends PollOperationState {
+	     *   privateProperty?: string;
+	     *   publicProperty?: string;
+	     * }
+	     *
+	     * // To allow us to have a true separation of public and private state, we have to define another interface:
+	     * interface PublicState extends PollOperationState {
+	     *   publicProperty?: string;
+	     * }
+	     *
+	     * // Then, we define our Poller as follows:
+	     * export class MyPoller extends Poller {
+	     *   // ... More content is needed here ...
+	     *
+	     *   public getOperationState(): PublicState {
+	     *     const state: PublicState = this.operation.state;
+	     *     return {
+	     *       // Properties from PollOperationState
+	     *       isStarted: state.isStarted,
+	     *       isCompleted: state.isCompleted,
+	     *       isCancelled: state.isCancelled,
+	     *       error: state.error,
+	     *       result: state.result,
+	     *
+	     *       // The only other property needed by PublicState.
+	     *       publicProperty: state.publicProperty
+	     *     }
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * You can see this in the tests of this repository, go to the file:
+	     * `../test/utils/testPoller.ts`
+	     * and look for the getOperationState implementation.
+	     */
+	    getOperationState() {
+	        return this.operation.state;
+	    }
+	    /**
+	     * Returns the result value of the operation,
+	     * regardless of the state of the poller.
+	     * It can return undefined or an incomplete form of the final TResult value
+	     * depending on the implementation.
+	     */
+	    getResult() {
+	        const state = this.operation.state;
+	        return state.result;
+	    }
+	    /**
+	     * Returns a serialized version of the poller's operation
+	     * by invoking the operation's toString method.
+	     */
+	    toString() {
+	        return this.operation.toString();
+	    }
+	}
+	poller.Poller = Poller;
+	
+	return poller;
+}
+
+var hasRequiredLroEngine$1;
+
+function requireLroEngine$1 () {
+	if (hasRequiredLroEngine$1) return lroEngine;
+	hasRequiredLroEngine$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(lroEngine, "__esModule", { value: true });
+	lroEngine.LroEngine = void 0;
+	const operation_js_1 = requireOperation();
+	const constants_js_1 = requireConstants$6();
+	const poller_js_1 = requirePoller();
+	const operation_js_2 = requireOperation$2();
+	/**
+	 * The LRO Engine, a class that performs polling.
+	 */
+	class LroEngine extends poller_js_1.Poller {
+	    constructor(lro, options) {
+	        const { intervalInMs = constants_js_1.POLL_INTERVAL_IN_MS, resumeFrom, resolveOnUnsuccessful = false, isDone, lroResourceLocationConfig, processResult, updateState, } = options || {};
+	        const state = resumeFrom
+	            ? (0, operation_js_2.deserializeState)(resumeFrom)
+	            : {};
+	        const operation = new operation_js_1.GenericPollOperation(state, lro, !resolveOnUnsuccessful, lroResourceLocationConfig, processResult, updateState, isDone);
+	        super(operation);
+	        this.resolveOnUnsuccessful = resolveOnUnsuccessful;
+	        this.config = { intervalInMs: intervalInMs };
+	        operation.setPollerConfig(this.config);
+	    }
+	    /**
+	     * The method used by the poller to wait before attempting to update its operation.
+	     */
+	    delay() {
+	        return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs));
+	    }
+	}
+	lroEngine.LroEngine = LroEngine;
+	
+	return lroEngine;
+}
+
+var hasRequiredLroEngine;
+
+function requireLroEngine () {
+	if (hasRequiredLroEngine) return lroEngine$1;
+	hasRequiredLroEngine = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT license.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.LroEngine = void 0;
+		var lroEngine_js_1 = requireLroEngine$1();
+		Object.defineProperty(exports$1, "LroEngine", { enumerable: true, get: function () { return lroEngine_js_1.LroEngine; } });
+		
+	} (lroEngine$1));
+	return lroEngine$1;
+}
+
+var pollOperation = {};
+
+var hasRequiredPollOperation;
+
+function requirePollOperation () {
+	if (hasRequiredPollOperation) return pollOperation;
+	hasRequiredPollOperation = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT license.
+	Object.defineProperty(pollOperation, "__esModule", { value: true });
+	
+	return pollOperation;
+}
+
+var hasRequiredCommonjs$1;
+
+function requireCommonjs$1 () {
+	if (hasRequiredCommonjs$1) return commonjs;
+	hasRequiredCommonjs$1 = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT license.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.createHttpPoller = void 0;
+		const tslib_1 = require$$0$2;
+		var poller_js_1 = requirePoller$1();
+		Object.defineProperty(exports$1, "createHttpPoller", { enumerable: true, get: function () { return poller_js_1.createHttpPoller; } });
+		/**
+		 * This can be uncommented to expose the protocol-agnostic poller
+		 */
+		// export {
+		//   BuildCreatePollerOptions,
+		//   Operation,
+		//   CreatePollerOptions,
+		//   OperationConfig,
+		//   RestorableOperationState,
+		// } from "./poller/models";
+		// export { buildCreatePoller } from "./poller/poller";
+		/** legacy */
+		tslib_1.__exportStar(requireLroEngine(), exports$1);
+		tslib_1.__exportStar(requirePoller(), exports$1);
+		tslib_1.__exportStar(requirePollOperation(), exports$1);
+		
+	} (commonjs));
+	return commonjs;
+}
+
+var hasRequiredBlobStartCopyFromUrlPoller;
+
+function requireBlobStartCopyFromUrlPoller () {
+	if (hasRequiredBlobStartCopyFromUrlPoller) return BlobStartCopyFromUrlPoller;
+	hasRequiredBlobStartCopyFromUrlPoller = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobStartCopyFromUrlPoller, "__esModule", { value: true });
+	BlobStartCopyFromUrlPoller.BlobBeginCopyFromUrlPoller = void 0;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const core_lro_1 = /*@__PURE__*/ requireCommonjs$1();
+	/**
+	 * This is the poller returned by {@link BlobClient.beginCopyFromURL}.
+	 * This can not be instantiated directly outside of this package.
+	 *
+	 * @hidden
+	 */
+	class BlobBeginCopyFromUrlPoller extends core_lro_1.Poller {
+	    intervalInMs;
+	    constructor(options) {
+	        const { blobClient, copySource, intervalInMs = 15000, onProgress, resumeFrom, startCopyFromURLOptions, } = options;
+	        let state;
+	        if (resumeFrom) {
+	            state = JSON.parse(resumeFrom).state;
+	        }
+	        const operation = makeBlobBeginCopyFromURLPollOperation({
+	            ...state,
+	            blobClient,
+	            copySource,
+	            startCopyFromURLOptions,
+	        });
+	        super(operation);
+	        if (typeof onProgress === "function") {
+	            this.onProgress(onProgress);
+	        }
+	        this.intervalInMs = intervalInMs;
+	    }
+	    delay() {
+	        return (0, core_util_1.delay)(this.intervalInMs);
+	    }
+	}
+	BlobStartCopyFromUrlPoller.BlobBeginCopyFromUrlPoller = BlobBeginCopyFromUrlPoller;
+	/**
+	 * Note: Intentionally using function expression over arrow function expression
+	 * so that the function can be invoked with a different context.
+	 * This affects what `this` refers to.
+	 * @hidden
+	 */
+	const cancel = async function cancel(options = {}) {
+	    const state = this.state;
+	    const { copyId } = state;
+	    if (state.isCompleted) {
+	        return makeBlobBeginCopyFromURLPollOperation(state);
+	    }
+	    if (!copyId) {
+	        state.isCancelled = true;
+	        return makeBlobBeginCopyFromURLPollOperation(state);
+	    }
+	    // if abortCopyFromURL throws, it will bubble up to user's poller.cancelOperation call
+	    await state.blobClient.abortCopyFromURL(copyId, {
+	        abortSignal: options.abortSignal,
+	    });
+	    state.isCancelled = true;
+	    return makeBlobBeginCopyFromURLPollOperation(state);
+	};
+	/**
+	 * Note: Intentionally using function expression over arrow function expression
+	 * so that the function can be invoked with a different context.
+	 * This affects what `this` refers to.
+	 * @hidden
+	 */
+	const update = async function update(options = {}) {
+	    const state = this.state;
+	    const { blobClient, copySource, startCopyFromURLOptions } = state;
+	    if (!state.isStarted) {
+	        state.isStarted = true;
+	        const result = await blobClient.startCopyFromURL(copySource, startCopyFromURLOptions);
+	        // copyId is needed to abort
+	        state.copyId = result.copyId;
+	        if (result.copyStatus === "success") {
+	            state.result = result;
+	            state.isCompleted = true;
+	        }
+	    }
+	    else if (!state.isCompleted) {
+	        try {
+	            const result = await state.blobClient.getProperties({ abortSignal: options.abortSignal });
+	            const { copyStatus, copyProgress } = result;
+	            const prevCopyProgress = state.copyProgress;
+	            if (copyProgress) {
+	                state.copyProgress = copyProgress;
+	            }
+	            if (copyStatus === "pending" &&
+	                copyProgress !== prevCopyProgress &&
+	                typeof options.fireProgress === "function") {
+	                // trigger in setTimeout, or swallow error?
+	                options.fireProgress(state);
+	            }
+	            else if (copyStatus === "success") {
+	                state.result = result;
+	                state.isCompleted = true;
+	            }
+	            else if (copyStatus === "failed") {
+	                state.error = new Error(`Blob copy failed with reason: "${result.copyStatusDescription || "unknown"}"`);
+	                state.isCompleted = true;
+	            }
+	        }
+	        catch (err) {
+	            state.error = err;
+	            state.isCompleted = true;
+	        }
+	    }
+	    return makeBlobBeginCopyFromURLPollOperation(state);
+	};
+	/**
+	 * Note: Intentionally using function expression over arrow function expression
+	 * so that the function can be invoked with a different context.
+	 * This affects what `this` refers to.
+	 * @hidden
+	 */
+	const toString = function toString() {
+	    return JSON.stringify({ state: this.state }, (key, value) => {
+	        // remove blobClient from serialized state since a client can't be hydrated from this info.
+	        if (key === "blobClient") {
+	            return undefined;
+	        }
+	        return value;
+	    });
+	};
+	/**
+	 * Creates a poll operation given the provided state.
+	 * @hidden
+	 */
+	function makeBlobBeginCopyFromURLPollOperation(state) {
+	    return {
+	        state: { ...state },
+	        cancel,
+	        toString,
+	        update,
+	    };
+	}
+	
+	return BlobStartCopyFromUrlPoller;
+}
+
+var Range = {};
+
+var hasRequiredRange$1;
+
+function requireRange$1 () {
+	if (hasRequiredRange$1) return Range;
+	hasRequiredRange$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(Range, "__esModule", { value: true });
+	Range.rangeToString = rangeToString;
+	/**
+	 * Generate a range string. For example:
+	 *
+	 * "bytes=255-" or "bytes=0-511"
+	 *
+	 * @param iRange -
+	 */
+	function rangeToString(iRange) {
+	    if (iRange.offset < 0) {
+	        throw new RangeError(`Range.offset cannot be smaller than 0.`);
+	    }
+	    if (iRange.count && iRange.count <= 0) {
+	        throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`);
+	    }
+	    return iRange.count
+	        ? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`
+	        : `bytes=${iRange.offset}-`;
+	}
+	
+	return Range;
+}
+
+var Batch = {};
+
+var hasRequiredBatch;
+
+function requireBatch () {
+	if (hasRequiredBatch) return Batch;
+	hasRequiredBatch = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(Batch, "__esModule", { value: true });
+	Batch.Batch = void 0;
+	// In browser, during webpack or browserify bundling, this module will be replaced by 'events'
+	// https://github.com/Gozala/events
+	const events_1 = require$$0$5;
+	/**
+	 * States for Batch.
+	 */
+	var BatchStates;
+	(function (BatchStates) {
+	    BatchStates[BatchStates["Good"] = 0] = "Good";
+	    BatchStates[BatchStates["Error"] = 1] = "Error";
+	})(BatchStates || (BatchStates = {}));
+	/**
+	 * Batch provides basic parallel execution with concurrency limits.
+	 * Will stop execute left operations when one of the executed operation throws an error.
+	 * But Batch cannot cancel ongoing operations, you need to cancel them by yourself.
+	 */
+	let Batch$1 = class Batch {
+	    /**
+	     * Concurrency. Must be lager than 0.
+	     */
+	    concurrency;
+	    /**
+	     * Number of active operations under execution.
+	     */
+	    actives = 0;
+	    /**
+	     * Number of completed operations under execution.
+	     */
+	    completed = 0;
+	    /**
+	     * Offset of next operation to be executed.
+	     */
+	    offset = 0;
+	    /**
+	     * Operation array to be executed.
+	     */
+	    operations = [];
+	    /**
+	     * States of Batch. When an error happens, state will turn into error.
+	     * Batch will stop execute left operations.
+	     */
+	    state = BatchStates.Good;
+	    /**
+	     * A private emitter used to pass events inside this class.
+	     */
+	    emitter;
+	    /**
+	     * Creates an instance of Batch.
+	     * @param concurrency -
+	     */
+	    constructor(concurrency = 5) {
+	        if (concurrency < 1) {
+	            throw new RangeError("concurrency must be larger than 0");
+	        }
+	        this.concurrency = concurrency;
+	        this.emitter = new events_1.EventEmitter();
+	    }
+	    /**
+	     * Add a operation into queue.
+	     *
+	     * @param operation -
+	     */
+	    addOperation(operation) {
+	        this.operations.push(async () => {
+	            try {
+	                this.actives++;
+	                await operation();
+	                this.actives--;
+	                this.completed++;
+	                this.parallelExecute();
+	            }
+	            catch (error) {
+	                this.emitter.emit("error", error);
+	            }
+	        });
+	    }
+	    /**
+	     * Start execute operations in the queue.
+	     *
+	     */
+	    async do() {
+	        if (this.operations.length === 0) {
+	            return Promise.resolve();
+	        }
+	        this.parallelExecute();
+	        return new Promise((resolve, reject) => {
+	            this.emitter.on("finish", resolve);
+	            this.emitter.on("error", (error) => {
+	                this.state = BatchStates.Error;
+	                reject(error);
+	            });
+	        });
+	    }
+	    /**
+	     * Get next operation to be executed. Return null when reaching ends.
+	     *
+	     */
+	    nextOperation() {
+	        if (this.offset < this.operations.length) {
+	            return this.operations[this.offset++];
+	        }
+	        return null;
+	    }
+	    /**
+	     * Start execute operations. One one the most important difference between
+	     * this method with do() is that do() wraps as an sync method.
+	     *
+	     */
+	    parallelExecute() {
+	        if (this.state === BatchStates.Error) {
+	            return;
+	        }
+	        if (this.completed >= this.operations.length) {
+	            this.emitter.emit("finish");
+	            return;
+	        }
+	        while (this.actives < this.concurrency) {
+	            const operation = this.nextOperation();
+	            if (operation) {
+	                operation();
+	            }
+	            else {
+	                return;
+	            }
+	        }
+	    }
+	};
+	Batch.Batch = Batch$1;
+	
+	return Batch;
+}
+
+var utils$1 = {};
+
+var hasRequiredUtils$1;
+
+function requireUtils$1 () {
+	if (hasRequiredUtils$1) return utils$1;
+	hasRequiredUtils$1 = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(utils$1, "__esModule", { value: true });
+	utils$1.fsCreateReadStream = utils$1.fsStat = void 0;
+	utils$1.streamToBuffer = streamToBuffer;
+	utils$1.streamToBuffer2 = streamToBuffer2;
+	utils$1.streamToBuffer3 = streamToBuffer3;
+	utils$1.readStreamToLocalFile = readStreamToLocalFile;
+	const tslib_1 = require$$0$2;
+	const node_fs_1 = tslib_1.__importDefault(require$$1$a);
+	const node_util_1 = tslib_1.__importDefault(require$$0$a);
+	const constants_js_1 = requireConstants$8();
+	/**
+	 * Reads a readable stream into buffer. Fill the buffer from offset to end.
+	 *
+	 * @param stream - A Node.js Readable stream
+	 * @param buffer - Buffer to be filled, length must greater than or equal to offset
+	 * @param offset - From which position in the buffer to be filled, inclusive
+	 * @param end - To which position in the buffer to be filled, exclusive
+	 * @param encoding - Encoding of the Readable stream
+	 */
+	async function streamToBuffer(stream, buffer, offset, end, encoding) {
+	    let pos = 0; // Position in stream
+	    const count = end - offset; // Total amount of data needed in stream
+	    return new Promise((resolve, reject) => {
+	        const timeout = setTimeout(() => reject(new Error(`The operation cannot be completed in timeout.`)), constants_js_1.REQUEST_TIMEOUT);
+	        stream.on("readable", () => {
+	            if (pos >= count) {
+	                clearTimeout(timeout);
+	                resolve();
+	                return;
+	            }
+	            let chunk = stream.read();
+	            if (!chunk) {
+	                return;
+	            }
+	            if (typeof chunk === "string") {
+	                chunk = Buffer.from(chunk, encoding);
+	            }
+	            // How much data needed in this chunk
+	            const chunkLength = pos + chunk.length > count ? count - pos : chunk.length;
+	            buffer.fill(chunk.slice(0, chunkLength), offset + pos, offset + pos + chunkLength);
+	            pos += chunkLength;
+	        });
+	        stream.on("end", () => {
+	            clearTimeout(timeout);
+	            if (pos < count) {
+	                reject(new Error(`Stream drains before getting enough data needed. Data read: ${pos}, data need: ${count}`));
+	            }
+	            resolve();
+	        });
+	        stream.on("error", (msg) => {
+	            clearTimeout(timeout);
+	            reject(msg);
+	        });
+	    });
+	}
+	/**
+	 * Reads a readable stream into buffer entirely.
+	 *
+	 * @param stream - A Node.js Readable stream
+	 * @param buffer - Buffer to be filled, length must greater than or equal to offset
+	 * @param encoding - Encoding of the Readable stream
+	 * @returns with the count of bytes read.
+	 * @throws `RangeError` If buffer size is not big enough.
+	 */
+	async function streamToBuffer2(stream, buffer, encoding) {
+	    let pos = 0; // Position in stream
+	    const bufferSize = buffer.length;
+	    return new Promise((resolve, reject) => {
+	        stream.on("readable", () => {
+	            let chunk = stream.read();
+	            if (!chunk) {
+	                return;
+	            }
+	            if (typeof chunk === "string") {
+	                chunk = Buffer.from(chunk, encoding);
+	            }
+	            if (pos + chunk.length > bufferSize) {
+	                reject(new Error(`Stream exceeds buffer size. Buffer size: ${bufferSize}`));
+	                return;
+	            }
+	            buffer.fill(chunk, pos, pos + chunk.length);
+	            pos += chunk.length;
+	        });
+	        stream.on("end", () => {
+	            resolve(pos);
+	        });
+	        stream.on("error", reject);
+	    });
+	}
+	/**
+	 * Reads a readable stream into a buffer.
+	 *
+	 * @param stream - A Node.js Readable stream
+	 * @param encoding - Encoding of the Readable stream
+	 * @returns with the count of bytes read.
+	 */
+	async function streamToBuffer3(readableStream, encoding) {
+	    return new Promise((resolve, reject) => {
+	        const chunks = [];
+	        readableStream.on("data", (data) => {
+	            chunks.push(typeof data === "string" ? Buffer.from(data, encoding) : data);
+	        });
+	        readableStream.on("end", () => {
+	            resolve(Buffer.concat(chunks));
+	        });
+	        readableStream.on("error", reject);
+	    });
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * Writes the content of a readstream to a local file. Returns a Promise which is completed after the file handle is closed.
+	 *
+	 * @param rs - The read stream.
+	 * @param file - Destination file path.
+	 */
+	async function readStreamToLocalFile(rs, file) {
+	    return new Promise((resolve, reject) => {
+	        const ws = node_fs_1.default.createWriteStream(file);
+	        rs.on("error", (err) => {
+	            reject(err);
+	        });
+	        ws.on("error", (err) => {
+	            reject(err);
+	        });
+	        ws.on("close", resolve);
+	        rs.pipe(ws);
+	    });
+	}
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * Promisified version of fs.stat().
+	 */
+	utils$1.fsStat = node_util_1.default.promisify(node_fs_1.default.stat);
+	utils$1.fsCreateReadStream = node_fs_1.default.createReadStream;
+	
+	return utils$1;
+}
+
+var hasRequiredClients;
+
+function requireClients () {
+	if (hasRequiredClients) return Clients;
+	hasRequiredClients = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(Clients, "__esModule", { value: true });
+	Clients.PageBlobClient = Clients.BlockBlobClient = Clients.AppendBlobClient = Clients.BlobClient = void 0;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const core_util_2 = /*@__PURE__*/ requireCommonjs$b();
+	const BlobDownloadResponse_js_1 = requireBlobDownloadResponse();
+	const BlobQueryResponse_js_1 = requireBlobQueryResponse();
+	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
+	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
+	const models_js_1 = requireModels();
+	const PageBlobRangeResponse_js_1 = requirePageBlobRangeResponse();
+	const Pipeline_js_1 = requirePipeline();
+	const BlobStartCopyFromUrlPoller_js_1 = requireBlobStartCopyFromUrlPoller();
+	const Range_js_1 = requireRange$1();
+	const StorageClient_js_1 = requireStorageClient();
+	const Batch_js_1 = requireBatch();
+	const storage_common_1 = /*@__PURE__*/ requireCommonjs$2();
+	const constants_js_1 = requireConstants$8();
+	const tracing_js_1 = requireTracing();
+	const utils_common_js_1 = requireUtils_common$2();
+	const utils_js_1 = requireUtils$1();
+	const BlobSASSignatureValues_js_1 = requireBlobSASSignatureValues();
+	const BlobLeaseClient_js_1 = requireBlobLeaseClient();
+	/**
+	 * A BlobClient represents a URL to an Azure Storage blob; the blob may be a block blob,
+	 * append blob, or page blob.
+	 */
+	class BlobClient extends StorageClient_js_1.StorageClient {
+	    /**
+	     * blobContext provided by protocol layer.
+	     */
+	    blobContext;
+	    _name;
+	    _containerName;
+	    _versionId;
+	    _snapshot;
+	    /**
+	     * The name of the blob.
+	     */
+	    get name() {
+	        return this._name;
+	    }
+	    /**
+	     * The name of the storage container the blob is associated with.
+	     */
+	    get containerName() {
+	        return this._containerName;
+	    }
+	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        options = options || {};
+	        let pipeline;
+	        let url;
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, pipeline: Pipeline)
+	            url = urlOrConnectionString;
+	            pipeline = credentialOrPipelineOrContainerName;
+	        }
+	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            url = urlOrConnectionString;
+	            options = blobNameOrOptions;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
+	        }
+	        else if (!credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName !== "string") {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            // The second parameter is undefined. Use anonymous credential.
+	            url = urlOrConnectionString;
+	            if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {
+	                options = blobNameOrOptions;
+	            }
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        else if (credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName === "string" &&
+	            blobNameOrOptions &&
+	            typeof blobNameOrOptions === "string") {
+	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
+	            const containerName = credentialOrPipelineOrContainerName;
+	            const blobName = blobNameOrOptions;
+	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
+	            if (extractedCreds.kind === "AccountConnString") {
+	                if (core_util_1.isNodeLike) {
+	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
+	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
+	                    if (!options.proxyOptions) {
+	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
+	                    }
+	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
+	                }
+	                else {
+	                    throw new Error("Account connection string is only supported in Node.js environment");
+	                }
+	            }
+	            else if (extractedCreds.kind === "SASConnString") {
+	                url =
+	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
+	                        "?" +
+	                        extractedCreds.accountSas;
+	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	            }
+	            else {
+	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
+	            }
+	        }
+	        else {
+	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
+	        }
+	        super(url, pipeline);
+	        ({ blobName: this._name, containerName: this._containerName } =
+	            this.getBlobAndContainerNamesFromUrl());
+	        this.blobContext = this.storageClientContext.blob;
+	        this._snapshot = (0, utils_common_js_1.getURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT);
+	        this._versionId = (0, utils_common_js_1.getURLParameter)(this.url, constants_js_1.URLConstants.Parameters.VERSIONID);
+	    }
+	    /**
+	     * Creates a new BlobClient object identical to the source but with the specified snapshot timestamp.
+	     * Provide "" will remove the snapshot and return a Client to the base blob.
+	     *
+	     * @param snapshot - The snapshot timestamp.
+	     * @returns A new BlobClient object identical to the source but with the specified snapshot timestamp
+	     */
+	    withSnapshot(snapshot) {
+	        return new BlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
+	    }
+	    /**
+	     * Creates a new BlobClient object pointing to a version of this blob.
+	     * Provide "" will remove the versionId and return a Client to the base blob.
+	     *
+	     * @param versionId - The versionId.
+	     * @returns A new BlobClient object pointing to the version of this blob.
+	     */
+	    withVersion(versionId) {
+	        return new BlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.VERSIONID, versionId.length === 0 ? undefined : versionId), this.pipeline);
+	    }
+	    /**
+	     * Creates a AppendBlobClient object.
+	     *
+	     */
+	    getAppendBlobClient() {
+	        return new AppendBlobClient(this.url, this.pipeline);
+	    }
+	    /**
+	     * Creates a BlockBlobClient object.
+	     *
+	     */
+	    getBlockBlobClient() {
+	        return new BlockBlobClient(this.url, this.pipeline);
+	    }
+	    /**
+	     * Creates a PageBlobClient object.
+	     *
+	     */
+	    getPageBlobClient() {
+	        return new PageBlobClient(this.url, this.pipeline);
+	    }
+	    /**
+	     * Reads or downloads a blob from the system, including its metadata and properties.
+	     * You can also call Get Blob to read a snapshot.
+	     *
+	     * * In Node.js, data returns in a Readable stream readableStreamBody
+	     * * In browsers, data returns in a promise blobBody
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob
+	     *
+	     * @param offset - From which position of the blob to download, greater than or equal to 0
+	     * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined
+	     * @param options - Optional options to Blob Download operation.
+	     *
+	     *
+	     * Example usage (Node.js):
+	     *
+	     * ```ts snippet:ReadmeSampleDownloadBlob_Node
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blobClient = containerClient.getBlobClient(blobName);
+	     *
+	     * // Get blob content from position 0 to the end
+	     * // In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody
+	     * const downloadBlockBlobResponse = await blobClient.download();
+	     * if (downloadBlockBlobResponse.readableStreamBody) {
+	     *   const downloaded = await streamToString(downloadBlockBlobResponse.readableStreamBody);
+	     *   console.log(`Downloaded blob content: ${downloaded}`);
+	     * }
+	     *
+	     * async function streamToString(stream: NodeJS.ReadableStream): Promise {
+	     *   const result = await new Promise>((resolve, reject) => {
+	     *     const chunks: Buffer[] = [];
+	     *     stream.on("data", (data) => {
+	     *       chunks.push(Buffer.isBuffer(data) ? data : Buffer.from(data));
+	     *     });
+	     *     stream.on("end", () => {
+	     *       resolve(Buffer.concat(chunks));
+	     *     });
+	     *     stream.on("error", reject);
+	     *   });
+	     *   return result.toString();
+	     * }
+	     * ```
+	     *
+	     * Example usage (browser):
+	     *
+	     * ```ts snippet:ReadmeSampleDownloadBlob_Browser
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blobClient = containerClient.getBlobClient(blobName);
+	     *
+	     * // Get blob content from position 0 to the end
+	     * // In browsers, get downloaded data by accessing downloadBlockBlobResponse.blobBody
+	     * const downloadBlockBlobResponse = await blobClient.download();
+	     * const blobBody = await downloadBlockBlobResponse.blobBody;
+	     * if (blobBody) {
+	     *   const downloaded = await blobBody.text();
+	     *   console.log(`Downloaded blob content: ${downloaded}`);
+	     * }
+	     * ```
+	     */
+	    async download(offset = 0, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-download", options, async (updatedOptions) => {
+	            const res = (0, utils_common_js_1.assertResponse)(await this.blobContext.download({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                requestOptions: {
+	                    onDownloadProgress: core_util_1.isNodeLike ? undefined : options.onProgress, // for Node.js, progress is reported by RetriableReadableStream
+	                },
+	                range: offset === 0 && !count ? undefined : (0, Range_js_1.rangeToString)({ offset, count }),
+	                rangeGetContentMD5: options.rangeGetContentMD5,
+	                rangeGetContentCRC64: options.rangeGetContentCrc64,
+	                snapshot: options.snapshot,
+	                cpkInfo: options.customerProvidedKey,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const wrappedRes = {
+	                ...res,
+	                _response: res._response, // _response is made non-enumerable
+	                objectReplicationDestinationPolicyId: res.objectReplicationPolicyId,
+	                objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(res.objectReplicationRules),
+	            };
+	            // Return browser response immediately
+	            if (!core_util_1.isNodeLike) {
+	                return wrappedRes;
+	            }
+	            // We support retrying when download stream unexpected ends in Node.js runtime
+	            // Following code shouldn't be bundled into browser build, however some
+	            // bundlers may try to bundle following code and "FileReadResponse.ts".
+	            // In this case, "FileDownloadResponse.browser.ts" will be used as a shim of "FileDownloadResponse.ts"
+	            // The config is in package.json "browser" field
+	            if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) {
+	                // TODO: Default value or make it a required parameter?
+	                options.maxRetryRequests = constants_js_1.DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS;
+	            }
+	            if (res.contentLength === undefined) {
+	                throw new RangeError(`File download response doesn't contain valid content length header`);
+	            }
+	            if (!res.etag) {
+	                throw new RangeError(`File download response doesn't contain valid etag header`);
+	            }
+	            return new BlobDownloadResponse_js_1.BlobDownloadResponse(wrappedRes, async (start) => {
+	                const updatedDownloadOptions = {
+	                    leaseAccessConditions: options.conditions,
+	                    modifiedAccessConditions: {
+	                        ifMatch: options.conditions.ifMatch || res.etag,
+	                        ifModifiedSince: options.conditions.ifModifiedSince,
+	                        ifNoneMatch: options.conditions.ifNoneMatch,
+	                        ifUnmodifiedSince: options.conditions.ifUnmodifiedSince,
+	                        ifTags: options.conditions?.tagConditions,
+	                    },
+	                    range: (0, Range_js_1.rangeToString)({
+	                        count: offset + res.contentLength - start,
+	                        offset: start,
+	                    }),
+	                    rangeGetContentMD5: options.rangeGetContentMD5,
+	                    rangeGetContentCRC64: options.rangeGetContentCrc64,
+	                    snapshot: options.snapshot,
+	                    cpkInfo: options.customerProvidedKey,
+	                };
+	                // Debug purpose only
+	                // console.log(
+	                //   `Read from internal stream, range: ${
+	                //     updatedOptions.range
+	                //   }, options: ${JSON.stringify(updatedOptions)}`
+	                // );
+	                return (await this.blobContext.download({
+	                    abortSignal: options.abortSignal,
+	                    ...updatedDownloadOptions,
+	                })).readableStreamBody;
+	            }, offset, res.contentLength, {
+	                maxRetryRequests: options.maxRetryRequests,
+	                onProgress: options.onProgress,
+	            });
+	        });
+	    }
+	    /**
+	     * Returns true if the Azure blob resource represented by this client exists; false otherwise.
+	     *
+	     * NOTE: use this function with care since an existing blob might be deleted by other clients or
+	     * applications. Vice versa new blobs might be added by other clients or applications after this
+	     * function completes.
+	     *
+	     * @param options - options to Exists operation.
+	     */
+	    async exists(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-exists", options, async (updatedOptions) => {
+	            try {
+	                (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	                await this.getProperties({
+	                    abortSignal: options.abortSignal,
+	                    customerProvidedKey: options.customerProvidedKey,
+	                    conditions: options.conditions,
+	                    tracingOptions: updatedOptions.tracingOptions,
+	                });
+	                return true;
+	            }
+	            catch (e) {
+	                if (e.statusCode === 404) {
+	                    // Expected exception when checking blob existence
+	                    return false;
+	                }
+	                else if (e.statusCode === 409 &&
+	                    (e.details.errorCode === constants_js_1.BlobUsesCustomerSpecifiedEncryptionMsg ||
+	                        e.details.errorCode === constants_js_1.BlobDoesNotUseCustomerSpecifiedEncryption)) {
+	                    // Expected exception when checking blob existence
+	                    return true;
+	                }
+	                throw e;
+	            }
+	        });
+	    }
+	    /**
+	     * Returns all user-defined metadata, standard HTTP properties, and system properties
+	     * for the blob. It does not return the content of the blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-properties
+	     *
+	     * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if
+	     * they originally contained uppercase characters. This differs from the metadata keys returned by
+	     * the methods of {@link ContainerClient} that list blobs using the `includeMetadata` option, which
+	     * will retain their original casing.
+	     *
+	     * @param options - Optional options to Get Properties operation.
+	     */
+	    async getProperties(options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-getProperties", options, async (updatedOptions) => {
+	            const res = (0, utils_common_js_1.assertResponse)(await this.blobContext.getProperties({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            return {
+	                ...res,
+	                _response: res._response, // _response is made non-enumerable
+	                objectReplicationDestinationPolicyId: res.objectReplicationPolicyId,
+	                objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(res.objectReplicationRules),
+	            };
+	        });
+	    }
+	    /**
+	     * Marks the specified blob or snapshot for deletion. The blob is later deleted
+	     * during garbage collection. Note that in order to delete a blob, you must delete
+	     * all of its snapshots. You can delete both at the same time with the Delete
+	     * Blob operation.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
+	     *
+	     * @param options - Optional options to Blob Delete operation.
+	     */
+	    async delete(options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-delete", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.delete({
+	                abortSignal: options.abortSignal,
+	                deleteSnapshots: options.deleteSnapshots,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Marks the specified blob or snapshot for deletion if it exists. The blob is later deleted
+	     * during garbage collection. Note that in order to delete a blob, you must delete
+	     * all of its snapshots. You can delete both at the same time with the Delete
+	     * Blob operation.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
+	     *
+	     * @param options - Optional options to Blob Delete operation.
+	     */
+	    async deleteIfExists(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-deleteIfExists", options, async (updatedOptions) => {
+	            try {
+	                const res = (0, utils_common_js_1.assertResponse)(await this.delete(updatedOptions));
+	                return {
+	                    succeeded: true,
+	                    ...res,
+	                    _response: res._response, // _response is made non-enumerable
+	                };
+	            }
+	            catch (e) {
+	                if (e.details?.errorCode === "BlobNotFound") {
+	                    return {
+	                        succeeded: false,
+	                        ...e.response?.parsedHeaders,
+	                        _response: e.response,
+	                    };
+	                }
+	                throw e;
+	            }
+	        });
+	    }
+	    /**
+	     * Restores the contents and metadata of soft deleted blob and any associated
+	     * soft deleted snapshots. Undelete Blob is supported only on version 2017-07-29
+	     * or later.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/undelete-blob
+	     *
+	     * @param options - Optional options to Blob Undelete operation.
+	     */
+	    async undelete(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-undelete", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.undelete({
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Sets system properties on the blob.
+	     *
+	     * If no value provided, or no value provided for the specified blob HTTP headers,
+	     * these blob HTTP headers without a value will be cleared.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
+	     *
+	     * @param blobHTTPHeaders - If no value provided, or no value provided for
+	     *                                                   the specified blob HTTP headers, these blob HTTP
+	     *                                                   headers without a value will be cleared.
+	     *                                                   A common header to set is `blobContentType`
+	     *                                                   enabling the browser to provide functionality
+	     *                                                   based on file type.
+	     * @param options - Optional options to Blob Set HTTP Headers operation.
+	     */
+	    async setHTTPHeaders(blobHTTPHeaders, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-setHTTPHeaders", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setHttpHeaders({
+	                abortSignal: options.abortSignal,
+	                blobHttpHeaders: blobHTTPHeaders,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                // cpkInfo: options.customerProvidedKey, // CPK is not included in Swagger, should change this back when this issue is fixed in Swagger.
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Sets user-defined metadata for the specified blob as one or more name-value pairs.
+	     *
+	     * If no option provided, or no metadata defined in the parameter, the blob
+	     * metadata will be removed.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-metadata
+	     *
+	     * @param metadata - Replace existing metadata with this value.
+	     *                               If no value provided the existing metadata will be removed.
+	     * @param options - Optional options to Set Metadata operation.
+	     */
+	    async setMetadata(metadata, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-setMetadata", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setMetadata({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Sets tags on the underlying blob.
+	     * A blob can have up to 10 tags. Tag keys must be between 1 and 128 characters.  Tag values must be between 0 and 256 characters.
+	     * Valid tag key and value characters include lower and upper case letters, digits (0-9),
+	     * space (' '), plus ('+'), minus ('-'), period ('.'), foward slash ('/'), colon (':'), equals ('='), and underscore ('_').
+	     *
+	     * @param tags -
+	     * @param options -
+	     */
+	    async setTags(tags, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-setTags", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setTags({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	                tags: (0, utils_common_js_1.toBlobTags)(tags),
+	            }));
+	        });
+	    }
+	    /**
+	     * Gets the tags associated with the underlying blob.
+	     *
+	     * @param options -
+	     */
+	    async getTags(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-getTags", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.blobContext.getTags({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const wrappedResponse = {
+	                ...response,
+	                _response: response._response, // _response is made non-enumerable
+	                tags: (0, utils_common_js_1.toTags)({ blobTagSet: response.blobTagSet }) || {},
+	            };
+	            return wrappedResponse;
+	        });
+	    }
+	    /**
+	     * Get a {@link BlobLeaseClient} that manages leases on the blob.
+	     *
+	     * @param proposeLeaseId - Initial proposed lease Id.
+	     * @returns A new BlobLeaseClient object for managing leases on the blob.
+	     */
+	    getBlobLeaseClient(proposeLeaseId) {
+	        return new BlobLeaseClient_js_1.BlobLeaseClient(this, proposeLeaseId);
+	    }
+	    /**
+	     * Creates a read-only snapshot of a blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/snapshot-blob
+	     *
+	     * @param options - Optional options to the Blob Create Snapshot operation.
+	     */
+	    async createSnapshot(options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-createSnapshot", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.createSnapshot({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                metadata: options.metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Asynchronously copies a blob to a destination within the storage account.
+	     * This method returns a long running operation poller that allows you to wait
+	     * indefinitely until the copy is completed.
+	     * You can also cancel a copy before it is completed by calling `cancelOperation` on the poller.
+	     * Note that the onProgress callback will not be invoked if the operation completes in the first
+	     * request, and attempting to cancel a completed copy will result in an error being thrown.
+	     *
+	     * In version 2012-02-12 and later, the source for a Copy Blob operation can be
+	     * a committed blob in any Azure storage account.
+	     * Beginning with version 2015-02-21, the source for a Copy Blob operation can be
+	     * an Azure file in any Azure storage account.
+	     * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob
+	     * operation to copy from another storage account.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/copy-blob
+	     *
+	     * ```ts snippet:ClientsBeginCopyFromURL
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blobClient = containerClient.getBlobClient(blobName);
+	     *
+	     * // Example using automatic polling
+	     * const automaticCopyPoller = await blobClient.beginCopyFromURL("url");
+	     * const automaticResult = await automaticCopyPoller.pollUntilDone();
+	     *
+	     * // Example using manual polling
+	     * const manualCopyPoller = await blobClient.beginCopyFromURL("url");
+	     * while (!manualCopyPoller.isDone()) {
+	     *   await manualCopyPoller.poll();
+	     * }
+	     * const manualResult = manualCopyPoller.getResult();
+	     *
+	     * // Example using progress updates
+	     * const progressUpdatesCopyPoller = await blobClient.beginCopyFromURL("url", {
+	     *   onProgress(state) {
+	     *     console.log(`Progress: ${state.copyProgress}`);
+	     *   },
+	     * });
+	     * const progressUpdatesResult = await progressUpdatesCopyPoller.pollUntilDone();
+	     *
+	     * // Example using a changing polling interval (default 15 seconds)
+	     * const pollingIntervalCopyPoller = await blobClient.beginCopyFromURL("url", {
+	     *   intervalInMs: 1000, // poll blob every 1 second for copy progress
+	     * });
+	     * const pollingIntervalResult = await pollingIntervalCopyPoller.pollUntilDone();
+	     *
+	     * // Example using copy cancellation:
+	     * const cancelCopyPoller = await blobClient.beginCopyFromURL("url");
+	     * // cancel operation after starting it.
+	     * try {
+	     *   await cancelCopyPoller.cancelOperation();
+	     *   // calls to get the result now throw PollerCancelledError
+	     *   cancelCopyPoller.getResult();
+	     * } catch (err: any) {
+	     *   if (err.name === "PollerCancelledError") {
+	     *     console.log("The copy was cancelled.");
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param copySource - url to the source Azure Blob/File.
+	     * @param options - Optional options to the Blob Start Copy From URL operation.
+	     */
+	    async beginCopyFromURL(copySource, options = {}) {
+	        const client = {
+	            abortCopyFromURL: (...args) => this.abortCopyFromURL(...args),
+	            getProperties: (...args) => this.getProperties(...args),
+	            startCopyFromURL: (...args) => this.startCopyFromURL(...args),
+	        };
+	        const poller = new BlobStartCopyFromUrlPoller_js_1.BlobBeginCopyFromUrlPoller({
+	            blobClient: client,
+	            copySource,
+	            intervalInMs: options.intervalInMs,
+	            onProgress: options.onProgress,
+	            resumeFrom: options.resumeFrom,
+	            startCopyFromURLOptions: options,
+	        });
+	        // Trigger the startCopyFromURL call by calling poll.
+	        // Any errors from this method should be surfaced to the user.
+	        await poller.poll();
+	        return poller;
+	    }
+	    /**
+	     * Aborts a pending asynchronous Copy Blob operation, and leaves a destination blob with zero
+	     * length and full metadata. Version 2012-02-12 and newer.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/abort-copy-blob
+	     *
+	     * @param copyId - Id of the Copy From URL operation.
+	     * @param options - Optional options to the Blob Abort Copy From URL operation.
+	     */
+	    async abortCopyFromURL(copyId, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-abortCopyFromURL", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.abortCopyFromURL(copyId, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The synchronous Copy From URL operation copies a blob or an internet resource to a new blob. It will not
+	     * return a response until the copy is complete.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/copy-blob-from-url
+	     *
+	     * @param copySource - The source URL to copy from, Shared Access Signature(SAS) maybe needed for authentication
+	     * @param options -
+	     */
+	    async syncCopyFromURL(copySource, options = {}) {
+	        options.conditions = options.conditions || {};
+	        options.sourceConditions = options.sourceConditions || {};
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-syncCopyFromURL", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.copyFromURL(copySource, {
+	                abortSignal: options.abortSignal,
+	                metadata: options.metadata,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                sourceModifiedAccessConditions: {
+	                    sourceIfMatch: options.sourceConditions?.ifMatch,
+	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
+	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
+	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
+	                },
+	                sourceContentMD5: options.sourceContentMD5,
+	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
+	                tier: (0, models_js_1.toAccessTier)(options.tier),
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
+	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
+	                legalHold: options.legalHold,
+	                encryptionScope: options.encryptionScope,
+	                copySourceTags: options.copySourceTags,
+	                fileRequestIntent: options.sourceShareTokenIntent,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Sets the tier on a blob. The operation is allowed on a page blob in a premium
+	     * storage account and on a block blob in a blob storage account (locally redundant
+	     * storage only). A premium page blob's tier determines the allowed size, IOPS,
+	     * and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive
+	     * storage type. This operation does not update the blob's ETag.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-tier
+	     *
+	     * @param tier - The tier to be set on the blob. Valid values are Hot, Cool, or Archive.
+	     * @param options - Optional options to the Blob Set Tier operation.
+	     */
+	    async setAccessTier(tier, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-setAccessTier", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setTier((0, models_js_1.toAccessTier)(tier), {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                rehydratePriority: options.rehydratePriority,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    async downloadToBuffer(param1, param2, param3, param4 = {}) {
+	        let buffer;
+	        let offset = 0;
+	        let count = 0;
+	        let options = param4;
+	        if (param1 instanceof Buffer) {
+	            buffer = param1;
+	            offset = param2 || 0;
+	            count = typeof param3 === "number" ? param3 : 0;
+	        }
+	        else {
+	            offset = typeof param1 === "number" ? param1 : 0;
+	            count = typeof param2 === "number" ? param2 : 0;
+	            options = param3 || {};
+	        }
+	        let blockSize = options.blockSize ?? 0;
+	        if (blockSize < 0) {
+	            throw new RangeError("blockSize option must be >= 0");
+	        }
+	        if (blockSize === 0) {
+	            blockSize = constants_js_1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;
+	        }
+	        if (offset < 0) {
+	            throw new RangeError("offset option must be >= 0");
+	        }
+	        if (count && count <= 0) {
+	            throw new RangeError("count option must be greater than 0");
+	        }
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-downloadToBuffer", options, async (updatedOptions) => {
+	            // Customer doesn't specify length, get it
+	            if (!count) {
+	                const response = await this.getProperties({
+	                    ...options,
+	                    tracingOptions: updatedOptions.tracingOptions,
+	                });
+	                count = response.contentLength - offset;
+	                if (count < 0) {
+	                    throw new RangeError(`offset ${offset} shouldn't be larger than blob size ${response.contentLength}`);
+	                }
+	            }
+	            // Allocate the buffer of size = count if the buffer is not provided
+	            if (!buffer) {
+	                try {
+	                    buffer = Buffer.alloc(count);
+	                }
+	                catch (error) {
+	                    throw new Error(`Unable to allocate the buffer of size: ${count}(in bytes). Please try passing your own buffer to the "downloadToBuffer" method or try using other methods like "download" or "downloadToFile".\t ${error.message}`);
+	                }
+	            }
+	            if (buffer.length < count) {
+	                throw new RangeError(`The buffer's size should be equal to or larger than the request count of bytes: ${count}`);
+	            }
+	            let transferProgress = 0;
+	            const batch = new Batch_js_1.Batch(options.concurrency);
+	            for (let off = offset; off < offset + count; off = off + blockSize) {
+	                batch.addOperation(async () => {
+	                    // Exclusive chunk end position
+	                    let chunkEnd = offset + count;
+	                    if (off + blockSize < chunkEnd) {
+	                        chunkEnd = off + blockSize;
+	                    }
+	                    const response = await this.download(off, chunkEnd - off, {
+	                        abortSignal: options.abortSignal,
+	                        conditions: options.conditions,
+	                        maxRetryRequests: options.maxRetryRequestsPerBlock,
+	                        customerProvidedKey: options.customerProvidedKey,
+	                        tracingOptions: updatedOptions.tracingOptions,
+	                    });
+	                    const stream = response.readableStreamBody;
+	                    await (0, utils_js_1.streamToBuffer)(stream, buffer, off - offset, chunkEnd - offset);
+	                    // Update progress after block is downloaded, in case of block trying
+	                    // Could provide finer grained progress updating inside HTTP requests,
+	                    // only if convenience layer download try is enabled
+	                    transferProgress += chunkEnd - off;
+	                    if (options.onProgress) {
+	                        options.onProgress({ loadedBytes: transferProgress });
+	                    }
+	                });
+	            }
+	            await batch.do();
+	            return buffer;
+	        });
+	    }
+	    /**
+	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	     *
+	     * Downloads an Azure Blob to a local file.
+	     * Fails if the the given file path already exits.
+	     * Offset and count are optional, pass 0 and undefined respectively to download the entire blob.
+	     *
+	     * @param filePath -
+	     * @param offset - From which position of the block blob to download.
+	     * @param count - How much data to be downloaded. Will download to the end when passing undefined.
+	     * @param options - Options to Blob download options.
+	     * @returns The response data for blob download operation,
+	     *                                                 but with readableStreamBody set to undefined since its
+	     *                                                 content is already read and written into a local file
+	     *                                                 at the specified path.
+	     */
+	    async downloadToFile(filePath, offset = 0, count, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-downloadToFile", options, async (updatedOptions) => {
+	            const response = await this.download(offset, count, {
+	                ...options,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            });
+	            if (response.readableStreamBody) {
+	                await (0, utils_js_1.readStreamToLocalFile)(response.readableStreamBody, filePath);
+	            }
+	            // The stream is no longer accessible so setting it to undefined.
+	            response.blobDownloadStream = undefined;
+	            return response;
+	        });
+	    }
+	    getBlobAndContainerNamesFromUrl() {
+	        let containerName;
+	        let blobName;
+	        try {
+	            //  URL may look like the following
+	            // "https://myaccount.blob.core.windows.net/mycontainer/blob?sasString";
+	            // "https://myaccount.blob.core.windows.net/mycontainer/blob";
+	            // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt?sasString";
+	            // "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt";
+	            // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername/blob`
+	            // http://localhost:10001/devstoreaccount1/containername/blob
+	            const parsedUrl = new URL(this.url);
+	            if (parsedUrl.host.split(".")[1] === "blob") {
+	                // "https://myaccount.blob.core.windows.net/containername/blob".
+	                // .getPath() -> /containername/blob
+	                const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?");
+	                containerName = pathComponents[1];
+	                blobName = pathComponents[3];
+	            }
+	            else if ((0, utils_common_js_1.isIpEndpointStyle)(parsedUrl)) {
+	                // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername/blob
+	                // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername/blob
+	                // .getPath() -> /devstoreaccount1/containername/blob
+	                const pathComponents = parsedUrl.pathname.match("/([^/]*)/([^/]*)(/(.*))?");
+	                containerName = pathComponents[2];
+	                blobName = pathComponents[4];
+	            }
+	            else {
+	                // "https://customdomain.com/containername/blob".
+	                // .getPath() -> /containername/blob
+	                const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?");
+	                containerName = pathComponents[1];
+	                blobName = pathComponents[3];
+	            }
+	            // decode the encoded blobName, containerName - to get all the special characters that might be present in them
+	            containerName = decodeURIComponent(containerName);
+	            blobName = decodeURIComponent(blobName);
+	            // Azure Storage Server will replace "\" with "/" in the blob names
+	            //   doing the same in the SDK side so that the user doesn't have to replace "\" instances in the blobName
+	            blobName = blobName.replace(/\\/g, "/");
+	            if (!containerName) {
+	                throw new Error("Provided containerName is invalid.");
+	            }
+	            return { blobName, containerName };
+	        }
+	        catch (error) {
+	            throw new Error("Unable to extract blobName and containerName with provided information.");
+	        }
+	    }
+	    /**
+	     * Asynchronously copies a blob to a destination within the storage account.
+	     * In version 2012-02-12 and later, the source for a Copy Blob operation can be
+	     * a committed blob in any Azure storage account.
+	     * Beginning with version 2015-02-21, the source for a Copy Blob operation can be
+	     * an Azure file in any Azure storage account.
+	     * Only storage accounts created on or after June 7th, 2012 allow the Copy Blob
+	     * operation to copy from another storage account.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/copy-blob
+	     *
+	     * @param copySource - url to the source Azure Blob/File.
+	     * @param options - Optional options to the Blob Start Copy From URL operation.
+	     */
+	    async startCopyFromURL(copySource, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-startCopyFromURL", options, async (updatedOptions) => {
+	            options.conditions = options.conditions || {};
+	            options.sourceConditions = options.sourceConditions || {};
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.startCopyFromURL(copySource, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                metadata: options.metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                sourceModifiedAccessConditions: {
+	                    sourceIfMatch: options.sourceConditions.ifMatch,
+	                    sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,
+	                    sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,
+	                    sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,
+	                    sourceIfTags: options.sourceConditions.tagConditions,
+	                },
+	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
+	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
+	                legalHold: options.legalHold,
+	                rehydratePriority: options.rehydratePriority,
+	                tier: (0, models_js_1.toAccessTier)(options.tier),
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                sealBlob: options.sealBlob,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Only available for BlobClient constructed with a shared key credential.
+	     *
+	     * Generates a Blob Service Shared Access Signature (SAS) URI based on the client properties
+	     * and parameters passed in. The SAS is signed by the shared key credential of the client.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateSasUrl(options) {
+	        return new Promise((resolve) => {
+	            if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
+	                throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
+	            }
+	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
+	                containerName: this._containerName,
+	                blobName: this._name,
+	                snapshotTime: this._snapshot,
+	                versionId: this._versionId,
+	                ...options,
+	            }, this.credential).toString();
+	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
+	        });
+	    }
+	    /**
+	     * Only available for BlobClient constructed with a shared key credential.
+	     *
+	     * Generates string to sign for a Blob Service Shared Access Signature (SAS) URI based on
+	     * the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    generateSasStringToSign(options) {
+	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
+	            throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
+	        }
+	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
+	            containerName: this._containerName,
+	            blobName: this._name,
+	            snapshotTime: this._snapshot,
+	            versionId: this._versionId,
+	            ...options,
+	        }, this.credential).stringToSign;
+	    }
+	    /**
+	     *
+	     * Generates a Blob Service Shared Access Signature (SAS) URI based on
+	     * the client properties and parameters passed in. The SAS is signed by the input user delegation key.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateUserDelegationSasUrl(options, userDelegationKey) {
+	        return new Promise((resolve) => {
+	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
+	                containerName: this._containerName,
+	                blobName: this._name,
+	                snapshotTime: this._snapshot,
+	                versionId: this._versionId,
+	                ...options,
+	            }, userDelegationKey, this.accountName).toString();
+	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
+	        });
+	    }
+	    /**
+	     * Only available for BlobClient constructed with a shared key credential.
+	     *
+	     * Generates string to sign for a Blob Service Shared Access Signature (SAS) URI based on
+	     * the client properties and parameters passed in. The SAS is signed by the input user delegation key.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateUserDelegationSasStringToSign(options, userDelegationKey) {
+	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
+	            containerName: this._containerName,
+	            blobName: this._name,
+	            snapshotTime: this._snapshot,
+	            versionId: this._versionId,
+	            ...options,
+	        }, userDelegationKey, this.accountName).stringToSign;
+	    }
+	    /**
+	     * Delete the immutablility policy on the blob.
+	     *
+	     * @param options - Optional options to delete immutability policy on the blob.
+	     */
+	    async deleteImmutabilityPolicy(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-deleteImmutabilityPolicy", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.deleteImmutabilityPolicy({
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Set immutability policy on the blob.
+	     *
+	     * @param options - Optional options to set immutability policy on the blob.
+	     */
+	    async setImmutabilityPolicy(immutabilityPolicy, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-setImmutabilityPolicy", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setImmutabilityPolicy({
+	                immutabilityPolicyExpiry: immutabilityPolicy.expiriesOn,
+	                immutabilityPolicyMode: immutabilityPolicy.policyMode,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Set legal hold on the blob.
+	     *
+	     * @param options - Optional options to set legal hold on the blob.
+	     */
+	    async setLegalHold(legalHoldEnabled, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-setLegalHold", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.setLegalHold(legalHoldEnabled, {
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The Get Account Information operation returns the sku name and account kind
+	     * for the specified account.
+	     * The Get Account Information operation is available on service versions beginning
+	     * with version 2018-03-28.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
+	     *
+	     * @param options - Options to the Service Get Account Info operation.
+	     * @returns Response data for the Service Get Account Info operation.
+	     */
+	    async getAccountInfo(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobClient-getAccountInfo", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blobContext.getAccountInfo({
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	}
+	Clients.BlobClient = BlobClient;
+	/**
+	 * AppendBlobClient defines a set of operations applicable to append blobs.
+	 */
+	class AppendBlobClient extends BlobClient {
+	    /**
+	     * appendBlobsContext provided by protocol layer.
+	     */
+	    appendBlobContext;
+	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
+	        //   super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
+	        let pipeline;
+	        let url;
+	        options = options || {};
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, pipeline: Pipeline)
+	            url = urlOrConnectionString;
+	            pipeline = credentialOrPipelineOrContainerName;
+	        }
+	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)      url = urlOrConnectionString;
+	            url = urlOrConnectionString;
+	            options = blobNameOrOptions;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
+	        }
+	        else if (!credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName !== "string") {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            url = urlOrConnectionString;
+	            // The second parameter is undefined. Use anonymous credential.
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        else if (credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName === "string" &&
+	            blobNameOrOptions &&
+	            typeof blobNameOrOptions === "string") {
+	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
+	            const containerName = credentialOrPipelineOrContainerName;
+	            const blobName = blobNameOrOptions;
+	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
+	            if (extractedCreds.kind === "AccountConnString") {
+	                if (core_util_1.isNodeLike) {
+	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
+	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
+	                    if (!options.proxyOptions) {
+	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
+	                    }
+	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
+	                }
+	                else {
+	                    throw new Error("Account connection string is only supported in Node.js environment");
+	                }
+	            }
+	            else if (extractedCreds.kind === "SASConnString") {
+	                url =
+	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
+	                        "?" +
+	                        extractedCreds.accountSas;
+	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	            }
+	            else {
+	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
+	            }
+	        }
+	        else {
+	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
+	        }
+	        super(url, pipeline);
+	        this.appendBlobContext = this.storageClientContext.appendBlob;
+	    }
+	    /**
+	     * Creates a new AppendBlobClient object identical to the source but with the
+	     * specified snapshot timestamp.
+	     * Provide "" will remove the snapshot and return a Client to the base blob.
+	     *
+	     * @param snapshot - The snapshot timestamp.
+	     * @returns A new AppendBlobClient object identical to the source but with the specified snapshot timestamp.
+	     */
+	    withSnapshot(snapshot) {
+	        return new AppendBlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
+	    }
+	    /**
+	     * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
+	     *
+	     * @param options - Options to the Append Block Create operation.
+	     *
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:ClientsCreateAppendBlob
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     *
+	     * const appendBlobClient = containerClient.getAppendBlobClient(blobName);
+	     * await appendBlobClient.create();
+	     * ```
+	     */
+	    async create(options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-create", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.create(0, {
+	                abortSignal: options.abortSignal,
+	                blobHttpHeaders: options.blobHTTPHeaders,
+	                leaseAccessConditions: options.conditions,
+	                metadata: options.metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
+	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
+	                legalHold: options.legalHold,
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Creates a 0-length append blob. Call AppendBlock to append data to an append blob.
+	     * If the blob with the same name already exists, the content of the existing blob will remain unchanged.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
+	     *
+	     * @param options -
+	     */
+	    async createIfNotExists(options = {}) {
+	        const conditions = { ifNoneMatch: constants_js_1.ETagAny };
+	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-createIfNotExists", options, async (updatedOptions) => {
+	            try {
+	                const res = (0, utils_common_js_1.assertResponse)(await this.create({
+	                    ...updatedOptions,
+	                    conditions,
+	                }));
+	                return {
+	                    succeeded: true,
+	                    ...res,
+	                    _response: res._response, // _response is made non-enumerable
+	                };
+	            }
+	            catch (e) {
+	                if (e.details?.errorCode === "BlobAlreadyExists") {
+	                    return {
+	                        succeeded: false,
+	                        ...e.response?.parsedHeaders,
+	                        _response: e.response,
+	                    };
+	                }
+	                throw e;
+	            }
+	        });
+	    }
+	    /**
+	     * Seals the append blob, making it read only.
+	     *
+	     * @param options -
+	     */
+	    async seal(options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-seal", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.seal({
+	                abortSignal: options.abortSignal,
+	                appendPositionAccessConditions: options.conditions,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Commits a new block of data to the end of the existing append blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/append-block
+	     *
+	     * @param body - Data to be appended.
+	     * @param contentLength - Length of the body in bytes.
+	     * @param options - Options to the Append Block operation.
+	     *
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:ClientsAppendBlock
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     *
+	     * const content = "Hello World!";
+	     *
+	     * // Create a new append blob and append data to the blob.
+	     * const newAppendBlobClient = containerClient.getAppendBlobClient(blobName);
+	     * await newAppendBlobClient.create();
+	     * await newAppendBlobClient.appendBlock(content, content.length);
+	     *
+	     * // Append data to an existing append blob.
+	     * const existingAppendBlobClient = containerClient.getAppendBlobClient(blobName);
+	     * await existingAppendBlobClient.appendBlock(content, content.length);
+	     * ```
+	     */
+	    async appendBlock(body, contentLength, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-appendBlock", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.appendBlock(contentLength, body, {
+	                abortSignal: options.abortSignal,
+	                appendPositionAccessConditions: options.conditions,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                requestOptions: {
+	                    onUploadProgress: options.onProgress,
+	                },
+	                transactionalContentMD5: options.transactionalContentMD5,
+	                transactionalContentCrc64: options.transactionalContentCrc64,
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The Append Block operation commits a new block of data to the end of an existing append blob
+	     * where the contents are read from a source url.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/append-block-from-url
+	     *
+	     * @param sourceURL -
+	     *                 The url to the blob that will be the source of the copy. A source blob in the same storage account can
+	     *                 be authenticated via Shared Key. However, if the source is a blob in another account, the source blob
+	     *                 must either be public or must be authenticated via a shared access signature. If the source blob is
+	     *                 public, no authentication is required to perform the operation.
+	     * @param sourceOffset - Offset in source to be appended
+	     * @param count - Number of bytes to be appended as a block
+	     * @param options -
+	     */
+	    async appendBlockFromURL(sourceURL, sourceOffset, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        options.sourceConditions = options.sourceConditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("AppendBlobClient-appendBlockFromURL", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.appendBlobContext.appendBlockFromUrl(sourceURL, 0, {
+	                abortSignal: options.abortSignal,
+	                sourceRange: (0, Range_js_1.rangeToString)({ offset: sourceOffset, count }),
+	                sourceContentMD5: options.sourceContentMD5,
+	                sourceContentCrc64: options.sourceContentCrc64,
+	                leaseAccessConditions: options.conditions,
+	                appendPositionAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                sourceModifiedAccessConditions: {
+	                    sourceIfMatch: options.sourceConditions?.ifMatch,
+	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
+	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
+	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
+	                },
+	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                fileRequestIntent: options.sourceShareTokenIntent,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	}
+	Clients.AppendBlobClient = AppendBlobClient;
+	/**
+	 * BlockBlobClient defines a set of operations applicable to block blobs.
+	 */
+	class BlockBlobClient extends BlobClient {
+	    /**
+	     * blobContext provided by protocol layer.
+	     *
+	     * Note. Ideally BlobClient should set BlobClient.blobContext to protected. However, API
+	     * extractor has issue blocking that. Here we redecelare _blobContext in BlockBlobClient.
+	     */
+	    _blobContext;
+	    /**
+	     * blockBlobContext provided by protocol layer.
+	     */
+	    blockBlobContext;
+	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
+	        //   super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
+	        let pipeline;
+	        let url;
+	        options = options || {};
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, pipeline: Pipeline)
+	            url = urlOrConnectionString;
+	            pipeline = credentialOrPipelineOrContainerName;
+	        }
+	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            url = urlOrConnectionString;
+	            options = blobNameOrOptions;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
+	        }
+	        else if (!credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName !== "string") {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            // The second parameter is undefined. Use anonymous credential.
+	            url = urlOrConnectionString;
+	            if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {
+	                options = blobNameOrOptions;
+	            }
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        else if (credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName === "string" &&
+	            blobNameOrOptions &&
+	            typeof blobNameOrOptions === "string") {
+	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
+	            const containerName = credentialOrPipelineOrContainerName;
+	            const blobName = blobNameOrOptions;
+	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
+	            if (extractedCreds.kind === "AccountConnString") {
+	                if (core_util_1.isNodeLike) {
+	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
+	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
+	                    if (!options.proxyOptions) {
+	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
+	                    }
+	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
+	                }
+	                else {
+	                    throw new Error("Account connection string is only supported in Node.js environment");
+	                }
+	            }
+	            else if (extractedCreds.kind === "SASConnString") {
+	                url =
+	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
+	                        "?" +
+	                        extractedCreds.accountSas;
+	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	            }
+	            else {
+	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
+	            }
+	        }
+	        else {
+	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
+	        }
+	        super(url, pipeline);
+	        this.blockBlobContext = this.storageClientContext.blockBlob;
+	        this._blobContext = this.storageClientContext.blob;
+	    }
+	    /**
+	     * Creates a new BlockBlobClient object identical to the source but with the
+	     * specified snapshot timestamp.
+	     * Provide "" will remove the snapshot and return a URL to the base blob.
+	     *
+	     * @param snapshot - The snapshot timestamp.
+	     * @returns A new BlockBlobClient object identical to the source but with the specified snapshot timestamp.
+	     */
+	    withSnapshot(snapshot) {
+	        return new BlockBlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
+	    }
+	    /**
+	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	     *
+	     * Quick query for a JSON or CSV formatted blob.
+	     *
+	     * Example usage (Node.js):
+	     *
+	     * ```ts snippet:ClientsQuery
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blockBlobClient = containerClient.getBlockBlobClient(blobName);
+	     *
+	     * // Query and convert a blob to a string
+	     * const queryBlockBlobResponse = await blockBlobClient.query("select from BlobStorage");
+	     * if (queryBlockBlobResponse.readableStreamBody) {
+	     *   const downloadedBuffer = await streamToBuffer(queryBlockBlobResponse.readableStreamBody);
+	     *   const downloaded = downloadedBuffer.toString();
+	     *   console.log(`Query blob content: ${downloaded}`);
+	     * }
+	     *
+	     * async function streamToBuffer(readableStream: NodeJS.ReadableStream): Promise {
+	     *   return new Promise((resolve, reject) => {
+	     *     const chunks: Buffer[] = [];
+	     *     readableStream.on("data", (data) => {
+	     *       chunks.push(data instanceof Buffer ? data : Buffer.from(data));
+	     *     });
+	     *     readableStream.on("end", () => {
+	     *       resolve(Buffer.concat(chunks));
+	     *     });
+	     *     readableStream.on("error", reject);
+	     *   });
+	     * }
+	     * ```
+	     *
+	     * @param query -
+	     * @param options -
+	     */
+	    async query(query, options = {}) {
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        if (!core_util_1.isNodeLike) {
+	            throw new Error("This operation currently is only supported in Node.js.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-query", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this._blobContext.query({
+	                abortSignal: options.abortSignal,
+	                queryRequest: {
+	                    queryType: "SQL",
+	                    expression: query,
+	                    inputSerialization: (0, utils_common_js_1.toQuerySerialization)(options.inputTextConfiguration),
+	                    outputSerialization: (0, utils_common_js_1.toQuerySerialization)(options.outputTextConfiguration),
+	                },
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            return new BlobQueryResponse_js_1.BlobQueryResponse(response, {
+	                abortSignal: options.abortSignal,
+	                onProgress: options.onProgress,
+	                onError: options.onError,
+	            });
+	        });
+	    }
+	    /**
+	     * Creates a new block blob, or updates the content of an existing block blob.
+	     * Updating an existing block blob overwrites any existing metadata on the blob.
+	     * Partial updates are not supported; the content of the existing blob is
+	     * overwritten with the new content. To perform a partial update of a block blob's,
+	     * use {@link stageBlock} and {@link commitBlockList}.
+	     *
+	     * This is a non-parallel uploading method, please use {@link uploadFile},
+	     * {@link uploadStream} or {@link uploadBrowserData} for better performance
+	     * with concurrency uploading.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
+	     *
+	     * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function
+	     *                               which returns a new Readable stream whose offset is from data source beginning.
+	     * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a
+	     *                               string including non non-Base64/Hex-encoded characters.
+	     * @param options - Options to the Block Blob Upload operation.
+	     * @returns Response data for the Block Blob Upload operation.
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:ClientsUpload
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blockBlobClient = containerClient.getBlockBlobClient(blobName);
+	     *
+	     * const content = "Hello world!";
+	     * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);
+	     * ```
+	     */
+	    async upload(body, contentLength, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-upload", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.upload(contentLength, body, {
+	                abortSignal: options.abortSignal,
+	                blobHttpHeaders: options.blobHTTPHeaders,
+	                leaseAccessConditions: options.conditions,
+	                metadata: options.metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                requestOptions: {
+	                    onUploadProgress: options.onProgress,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
+	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
+	                legalHold: options.legalHold,
+	                tier: (0, models_js_1.toAccessTier)(options.tier),
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Creates a new Block Blob where the contents of the blob are read from a given URL.
+	     * This API is supported beginning with the 2020-04-08 version. Partial updates
+	     * are not supported with Put Blob from URL; the content of an existing blob is overwritten with
+	     * the content of the new blob.  To perform partial updates to a block blob’s contents using a
+	     * source URL, use {@link stageBlockFromURL} and {@link commitBlockList}.
+	     *
+	     * @param sourceURL - Specifies the URL of the blob. The value
+	     *                           may be a URL of up to 2 KB in length that specifies a blob.
+	     *                           The value should be URL-encoded as it would appear
+	     *                           in a request URI. The source blob must either be public
+	     *                           or must be authenticated via a shared access signature.
+	     *                           If the source blob is public, no authentication is required
+	     *                           to perform the operation. Here are some examples of source object URLs:
+	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob
+	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=
+	     * @param options - Optional parameters.
+	     */
+	    async syncUploadFromURL(sourceURL, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-syncUploadFromURL", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.putBlobFromUrl(0, sourceURL, {
+	                ...options,
+	                blobHttpHeaders: options.blobHTTPHeaders,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                sourceModifiedAccessConditions: {
+	                    sourceIfMatch: options.sourceConditions?.ifMatch,
+	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
+	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
+	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
+	                    sourceIfTags: options.sourceConditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
+	                tier: (0, models_js_1.toAccessTier)(options.tier),
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                copySourceTags: options.copySourceTags,
+	                fileRequestIntent: options.sourceShareTokenIntent,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Uploads the specified block to the block blob's "staging area" to be later
+	     * committed by a call to commitBlockList.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-block
+	     *
+	     * @param blockId - A 64-byte value that is base64-encoded
+	     * @param body - Data to upload to the staging area.
+	     * @param contentLength - Number of bytes to upload.
+	     * @param options - Options to the Block Blob Stage Block operation.
+	     * @returns Response data for the Block Blob Stage Block operation.
+	     */
+	    async stageBlock(blockId, body, contentLength, options = {}) {
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-stageBlock", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.stageBlock(blockId, contentLength, body, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                requestOptions: {
+	                    onUploadProgress: options.onProgress,
+	                },
+	                transactionalContentMD5: options.transactionalContentMD5,
+	                transactionalContentCrc64: options.transactionalContentCrc64,
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The Stage Block From URL operation creates a new block to be committed as part
+	     * of a blob where the contents are read from a URL.
+	     * This API is available starting in version 2018-03-28.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-block-from-url
+	     *
+	     * @param blockId - A 64-byte value that is base64-encoded
+	     * @param sourceURL - Specifies the URL of the blob. The value
+	     *                           may be a URL of up to 2 KB in length that specifies a blob.
+	     *                           The value should be URL-encoded as it would appear
+	     *                           in a request URI. The source blob must either be public
+	     *                           or must be authenticated via a shared access signature.
+	     *                           If the source blob is public, no authentication is required
+	     *                           to perform the operation. Here are some examples of source object URLs:
+	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob
+	     *                           - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=
+	     * @param offset - From which position of the blob to download, greater than or equal to 0
+	     * @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined
+	     * @param options - Options to the Block Blob Stage Block From URL operation.
+	     * @returns Response data for the Block Blob Stage Block From URL operation.
+	     */
+	    async stageBlockFromURL(blockId, sourceURL, offset = 0, count, options = {}) {
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-stageBlockFromURL", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.stageBlockFromURL(blockId, 0, sourceURL, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                sourceContentMD5: options.sourceContentMD5,
+	                sourceContentCrc64: options.sourceContentCrc64,
+	                sourceRange: offset === 0 && !count ? undefined : (0, Range_js_1.rangeToString)({ offset, count }),
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
+	                fileRequestIntent: options.sourceShareTokenIntent,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Writes a blob by specifying the list of block IDs that make up the blob.
+	     * In order to be written as part of a blob, a block must have been successfully written
+	     * to the server in a prior {@link stageBlock} operation. You can call {@link commitBlockList} to
+	     * update a blob by uploading only those blocks that have changed, then committing the new and existing
+	     * blocks together. Any blocks not specified in the block list and permanently deleted.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-block-list
+	     *
+	     * @param blocks -  Array of 64-byte value that is base64-encoded
+	     * @param options - Options to the Block Blob Commit Block List operation.
+	     * @returns Response data for the Block Blob Commit Block List operation.
+	     */
+	    async commitBlockList(blocks, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-commitBlockList", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.commitBlockList({ latest: blocks }, {
+	                abortSignal: options.abortSignal,
+	                blobHttpHeaders: options.blobHTTPHeaders,
+	                leaseAccessConditions: options.conditions,
+	                metadata: options.metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
+	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
+	                legalHold: options.legalHold,
+	                tier: (0, models_js_1.toAccessTier)(options.tier),
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Returns the list of blocks that have been uploaded as part of a block blob
+	     * using the specified block list filter.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-block-list
+	     *
+	     * @param listType - Specifies whether to return the list of committed blocks,
+	     *                                        the list of uncommitted blocks, or both lists together.
+	     * @param options - Options to the Block Blob Get Block List operation.
+	     * @returns Response data for the Block Blob Get Block List operation.
+	     */
+	    async getBlockList(listType, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-getBlockList", options, async (updatedOptions) => {
+	            const res = (0, utils_common_js_1.assertResponse)(await this.blockBlobContext.getBlockList(listType, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            if (!res.committedBlocks) {
+	                res.committedBlocks = [];
+	            }
+	            if (!res.uncommittedBlocks) {
+	                res.uncommittedBlocks = [];
+	            }
+	            return res;
+	        });
+	    }
+	    // High level functions
+	    /**
+	     * Uploads a Buffer(Node.js)/Blob(browsers)/ArrayBuffer/ArrayBufferView object to a BlockBlob.
+	     *
+	     * When data length is no more than the specifiled {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is
+	     * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.
+	     * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}
+	     * to commit the block list.
+	     *
+	     * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is
+	     * `blobContentType`, enabling the browser to provide
+	     * functionality based on file type.
+	     *
+	     * @param data - Buffer(Node.js), Blob, ArrayBuffer or ArrayBufferView
+	     * @param options -
+	     */
+	    async uploadData(data, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadData", options, async (updatedOptions) => {
+	            if (core_util_1.isNodeLike) {
+	                let buffer;
+	                if (data instanceof Buffer) {
+	                    buffer = data;
+	                }
+	                else if (data instanceof ArrayBuffer) {
+	                    buffer = Buffer.from(data);
+	                }
+	                else {
+	                    data = data;
+	                    buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
+	                }
+	                return this.uploadSeekableInternal((offset, size) => buffer.slice(offset, offset + size), buffer.byteLength, updatedOptions);
+	            }
+	            else {
+	                const browserBlob = new Blob([data]);
+	                return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);
+	            }
+	        });
+	    }
+	    /**
+	     * ONLY AVAILABLE IN BROWSERS.
+	     *
+	     * Uploads a browser Blob/File/ArrayBuffer/ArrayBufferView object to block blob.
+	     *
+	     * When buffer length lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.
+	     * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call
+	     * {@link commitBlockList} to commit the block list.
+	     *
+	     * A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is
+	     * `blobContentType`, enabling the browser to provide
+	     * functionality based on file type.
+	     *
+	     * @deprecated Use {@link uploadData} instead.
+	     *
+	     * @param browserData - Blob, File, ArrayBuffer or ArrayBufferView
+	     * @param options - Options to upload browser data.
+	     * @returns Response data for the Blob Upload operation.
+	     */
+	    async uploadBrowserData(browserData, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadBrowserData", options, async (updatedOptions) => {
+	            const browserBlob = new Blob([browserData]);
+	            return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);
+	        });
+	    }
+	    /**
+	     *
+	     * Uploads data to block blob. Requires a bodyFactory as the data source,
+	     * which need to return a {@link HttpRequestBody} object with the offset and size provided.
+	     *
+	     * When data length is no more than the specified {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is
+	     * {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.
+	     * Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}
+	     * to commit the block list.
+	     *
+	     * @param bodyFactory -
+	     * @param size - size of the data to upload.
+	     * @param options - Options to Upload to Block Blob operation.
+	     * @returns Response data for the Blob Upload operation.
+	     */
+	    async uploadSeekableInternal(bodyFactory, size, options = {}) {
+	        let blockSize = options.blockSize ?? 0;
+	        if (blockSize < 0 || blockSize > constants_js_1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES) {
+	            throw new RangeError(`blockSize option must be >= 0 and <= ${constants_js_1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES}`);
+	        }
+	        const maxSingleShotSize = options.maxSingleShotSize ?? constants_js_1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES;
+	        if (maxSingleShotSize < 0 || maxSingleShotSize > constants_js_1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES) {
+	            throw new RangeError(`maxSingleShotSize option must be >= 0 and <= ${constants_js_1.BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}`);
+	        }
+	        if (blockSize === 0) {
+	            if (size > constants_js_1.BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES * constants_js_1.BLOCK_BLOB_MAX_BLOCKS) {
+	                throw new RangeError(`${size} is too larger to upload to a block blob.`);
+	            }
+	            if (size > maxSingleShotSize) {
+	                blockSize = Math.ceil(size / constants_js_1.BLOCK_BLOB_MAX_BLOCKS);
+	                if (blockSize < constants_js_1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES) {
+	                    blockSize = constants_js_1.DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;
+	                }
+	            }
+	        }
+	        if (!options.blobHTTPHeaders) {
+	            options.blobHTTPHeaders = {};
+	        }
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadSeekableInternal", options, async (updatedOptions) => {
+	            if (size <= maxSingleShotSize) {
+	                return (0, utils_common_js_1.assertResponse)(await this.upload(bodyFactory(0, size), size, updatedOptions));
+	            }
+	            const numBlocks = Math.floor((size - 1) / blockSize) + 1;
+	            if (numBlocks > constants_js_1.BLOCK_BLOB_MAX_BLOCKS) {
+	                throw new RangeError(`The buffer's size is too big or the BlockSize is too small;` +
+	                    `the number of blocks must be <= ${constants_js_1.BLOCK_BLOB_MAX_BLOCKS}`);
+	            }
+	            const blockList = [];
+	            const blockIDPrefix = (0, core_util_2.randomUUID)();
+	            let transferProgress = 0;
+	            const batch = new Batch_js_1.Batch(options.concurrency);
+	            for (let i = 0; i < numBlocks; i++) {
+	                batch.addOperation(async () => {
+	                    const blockID = (0, utils_common_js_1.generateBlockID)(blockIDPrefix, i);
+	                    const start = blockSize * i;
+	                    const end = i === numBlocks - 1 ? size : start + blockSize;
+	                    const contentLength = end - start;
+	                    blockList.push(blockID);
+	                    await this.stageBlock(blockID, bodyFactory(start, contentLength), contentLength, {
+	                        abortSignal: options.abortSignal,
+	                        conditions: options.conditions,
+	                        encryptionScope: options.encryptionScope,
+	                        tracingOptions: updatedOptions.tracingOptions,
+	                    });
+	                    // Update progress after block is successfully uploaded to server, in case of block trying
+	                    // TODO: Hook with convenience layer progress event in finer level
+	                    transferProgress += contentLength;
+	                    if (options.onProgress) {
+	                        options.onProgress({
+	                            loadedBytes: transferProgress,
+	                        });
+	                    }
+	                });
+	            }
+	            await batch.do();
+	            return this.commitBlockList(blockList, updatedOptions);
+	        });
+	    }
+	    /**
+	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	     *
+	     * Uploads a local file in blocks to a block blob.
+	     *
+	     * When file size lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.
+	     * Otherwise, this method will call stageBlock to upload blocks, and finally call commitBlockList
+	     * to commit the block list.
+	     *
+	     * @param filePath - Full path of local file
+	     * @param options - Options to Upload to Block Blob operation.
+	     * @returns Response data for the Blob Upload operation.
+	     */
+	    async uploadFile(filePath, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadFile", options, async (updatedOptions) => {
+	            const size = (await (0, utils_js_1.fsStat)(filePath)).size;
+	            return this.uploadSeekableInternal((offset, count) => {
+	                return () => (0, utils_js_1.fsCreateReadStream)(filePath, {
+	                    autoClose: true,
+	                    end: count ? offset + count - 1 : Infinity,
+	                    start: offset,
+	                });
+	            }, size, {
+	                ...options,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            });
+	        });
+	    }
+	    /**
+	     * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	     *
+	     * Uploads a Node.js Readable stream into block blob.
+	     *
+	     * PERFORMANCE IMPROVEMENT TIPS:
+	     * * Input stream highWaterMark is better to set a same value with bufferSize
+	     *    parameter, which will avoid Buffer.concat() operations.
+	     *
+	     * @param stream - Node.js Readable stream
+	     * @param bufferSize - Size of every buffer allocated, also the block size in the uploaded block blob. Default value is 8MB
+	     * @param maxConcurrency -  Max concurrency indicates the max number of buffers that can be allocated,
+	     *                                 positive correlation with max uploading concurrency. Default value is 5
+	     * @param options - Options to Upload Stream to Block Blob operation.
+	     * @returns Response data for the Blob Upload operation.
+	     */
+	    async uploadStream(stream, bufferSize = constants_js_1.DEFAULT_BLOCK_BUFFER_SIZE_BYTES, maxConcurrency = 5, options = {}) {
+	        if (!options.blobHTTPHeaders) {
+	            options.blobHTTPHeaders = {};
+	        }
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlockBlobClient-uploadStream", options, async (updatedOptions) => {
+	            let blockNum = 0;
+	            const blockIDPrefix = (0, core_util_2.randomUUID)();
+	            let transferProgress = 0;
+	            const blockList = [];
+	            const scheduler = new storage_common_1.BufferScheduler(stream, bufferSize, maxConcurrency, async (body, length) => {
+	                const blockID = (0, utils_common_js_1.generateBlockID)(blockIDPrefix, blockNum);
+	                blockList.push(blockID);
+	                blockNum++;
+	                await this.stageBlock(blockID, body, length, {
+	                    customerProvidedKey: options.customerProvidedKey,
+	                    conditions: options.conditions,
+	                    encryptionScope: options.encryptionScope,
+	                    tracingOptions: updatedOptions.tracingOptions,
+	                });
+	                // Update progress after block is successfully uploaded to server, in case of block trying
+	                transferProgress += length;
+	                if (options.onProgress) {
+	                    options.onProgress({ loadedBytes: transferProgress });
+	                }
+	            }, 
+	            // concurrency should set a smaller value than maxConcurrency, which is helpful to
+	            // reduce the possibility when a outgoing handler waits for stream data, in
+	            // this situation, outgoing handlers are blocked.
+	            // Outgoing queue shouldn't be empty.
+	            Math.ceil((maxConcurrency / 4) * 3));
+	            await scheduler.do();
+	            return (0, utils_common_js_1.assertResponse)(await this.commitBlockList(blockList, {
+	                ...options,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	}
+	Clients.BlockBlobClient = BlockBlobClient;
+	/**
+	 * PageBlobClient defines a set of operations applicable to page blobs.
+	 */
+	class PageBlobClient extends BlobClient {
+	    /**
+	     * pageBlobsContext provided by protocol layer.
+	     */
+	    pageBlobContext;
+	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        // In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
+	        //   super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
+	        let pipeline;
+	        let url;
+	        options = options || {};
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, pipeline: Pipeline)
+	            url = urlOrConnectionString;
+	            pipeline = credentialOrPipelineOrContainerName;
+	        }
+	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            url = urlOrConnectionString;
+	            options = blobNameOrOptions;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
+	        }
+	        else if (!credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName !== "string") {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            // The second parameter is undefined. Use anonymous credential.
+	            url = urlOrConnectionString;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        else if (credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName === "string" &&
+	            blobNameOrOptions &&
+	            typeof blobNameOrOptions === "string") {
+	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
+	            const containerName = credentialOrPipelineOrContainerName;
+	            const blobName = blobNameOrOptions;
+	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
+	            if (extractedCreds.kind === "AccountConnString") {
+	                if (core_util_1.isNodeLike) {
+	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
+	                    url = (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
+	                    if (!options.proxyOptions) {
+	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
+	                    }
+	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
+	                }
+	                else {
+	                    throw new Error("Account connection string is only supported in Node.js environment");
+	                }
+	            }
+	            else if (extractedCreds.kind === "SASConnString") {
+	                url =
+	                    (0, utils_common_js_1.appendToURLPath)((0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
+	                        "?" +
+	                        extractedCreds.accountSas;
+	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	            }
+	            else {
+	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
+	            }
+	        }
+	        else {
+	            throw new Error("Expecting non-empty strings for containerName and blobName parameters");
+	        }
+	        super(url, pipeline);
+	        this.pageBlobContext = this.storageClientContext.pageBlob;
+	    }
+	    /**
+	     * Creates a new PageBlobClient object identical to the source but with the
+	     * specified snapshot timestamp.
+	     * Provide "" will remove the snapshot and return a Client to the base blob.
+	     *
+	     * @param snapshot - The snapshot timestamp.
+	     * @returns A new PageBlobClient object identical to the source but with the specified snapshot timestamp.
+	     */
+	    withSnapshot(snapshot) {
+	        return new PageBlobClient((0, utils_common_js_1.setURLParameter)(this.url, constants_js_1.URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline);
+	    }
+	    /**
+	     * Creates a page blob of the specified length. Call uploadPages to upload data
+	     * data to a page blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
+	     *
+	     * @param size - size of the page blob.
+	     * @param options - Options to the Page Blob Create operation.
+	     * @returns Response data for the Page Blob Create operation.
+	     */
+	    async create(size, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-create", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.create(0, size, {
+	                abortSignal: options.abortSignal,
+	                blobHttpHeaders: options.blobHTTPHeaders,
+	                blobSequenceNumber: options.blobSequenceNumber,
+	                leaseAccessConditions: options.conditions,
+	                metadata: options.metadata,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
+	                immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
+	                legalHold: options.legalHold,
+	                tier: (0, models_js_1.toAccessTier)(options.tier),
+	                blobTagsString: (0, utils_common_js_1.toBlobTagsString)(options.tags),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Creates a page blob of the specified length. Call uploadPages to upload data
+	     * data to a page blob. If the blob with the same name already exists, the content
+	     * of the existing blob will remain unchanged.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
+	     *
+	     * @param size - size of the page blob.
+	     * @param options -
+	     */
+	    async createIfNotExists(size, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-createIfNotExists", options, async (updatedOptions) => {
+	            try {
+	                const conditions = { ifNoneMatch: constants_js_1.ETagAny };
+	                const res = (0, utils_common_js_1.assertResponse)(await this.create(size, {
+	                    ...options,
+	                    conditions,
+	                    tracingOptions: updatedOptions.tracingOptions,
+	                }));
+	                return {
+	                    succeeded: true,
+	                    ...res,
+	                    _response: res._response, // _response is made non-enumerable
+	                };
+	            }
+	            catch (e) {
+	                if (e.details?.errorCode === "BlobAlreadyExists") {
+	                    return {
+	                        succeeded: false,
+	                        ...e.response?.parsedHeaders,
+	                        _response: e.response,
+	                    };
+	                }
+	                throw e;
+	            }
+	        });
+	    }
+	    /**
+	     * Writes 1 or more pages to the page blob. The start and end offsets must be a multiple of 512.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-page
+	     *
+	     * @param body - Data to upload
+	     * @param offset - Offset of destination page blob
+	     * @param count - Content length of the body, also number of bytes to be uploaded
+	     * @param options - Options to the Page Blob Upload Pages operation.
+	     * @returns Response data for the Page Blob Upload Pages operation.
+	     */
+	    async uploadPages(body, offset, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-uploadPages", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.uploadPages(count, body, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                requestOptions: {
+	                    onUploadProgress: options.onProgress,
+	                },
+	                range: (0, Range_js_1.rangeToString)({ offset, count }),
+	                sequenceNumberAccessConditions: options.conditions,
+	                transactionalContentMD5: options.transactionalContentMD5,
+	                transactionalContentCrc64: options.transactionalContentCrc64,
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The Upload Pages operation writes a range of pages to a page blob where the
+	     * contents are read from a URL.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-page-from-url
+	     *
+	     * @param sourceURL - Specify a URL to the copy source, Shared Access Signature(SAS) maybe needed for authentication
+	     * @param sourceOffset - The source offset to copy from. Pass 0 to copy from the beginning of source page blob
+	     * @param destOffset - Offset of destination page blob
+	     * @param count - Number of bytes to be uploaded from source page blob
+	     * @param options -
+	     */
+	    async uploadPagesFromURL(sourceURL, sourceOffset, destOffset, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        options.sourceConditions = options.sourceConditions || {};
+	        (0, models_js_1.ensureCpkIfSpecified)(options.customerProvidedKey, this.isHttps);
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-uploadPagesFromURL", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.uploadPagesFromURL(sourceURL, (0, Range_js_1.rangeToString)({ offset: sourceOffset, count }), 0, (0, Range_js_1.rangeToString)({ offset: destOffset, count }), {
+	                abortSignal: options.abortSignal,
+	                sourceContentMD5: options.sourceContentMD5,
+	                sourceContentCrc64: options.sourceContentCrc64,
+	                leaseAccessConditions: options.conditions,
+	                sequenceNumberAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                sourceModifiedAccessConditions: {
+	                    sourceIfMatch: options.sourceConditions?.ifMatch,
+	                    sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
+	                    sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
+	                    sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
+	                },
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                copySourceAuthorization: (0, utils_common_js_1.httpAuthorizationToString)(options.sourceAuthorization),
+	                fileRequestIntent: options.sourceShareTokenIntent,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Frees the specified pages from the page blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-page
+	     *
+	     * @param offset - Starting byte position of the pages to clear.
+	     * @param count - Number of bytes to clear.
+	     * @param options - Options to the Page Blob Clear Pages operation.
+	     * @returns Response data for the Page Blob Clear Pages operation.
+	     */
+	    async clearPages(offset = 0, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-clearPages", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.clearPages(0, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                range: (0, Range_js_1.rangeToString)({ offset, count }),
+	                sequenceNumberAccessConditions: options.conditions,
+	                cpkInfo: options.customerProvidedKey,
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Returns the list of valid page ranges for a page blob or snapshot of a page blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param options - Options to the Page Blob Get Ranges operation.
+	     * @returns Response data for the Page Blob Get Ranges operation.
+	     */
+	    async getPageRanges(offset = 0, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRanges", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRanges({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                range: (0, Range_js_1.rangeToString)({ offset, count }),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            return (0, PageBlobRangeResponse_js_1.rangeResponseFromModel)(response);
+	        });
+	    }
+	    /**
+	     * getPageRangesSegment returns a single segment of page ranges starting from the
+	     * specified Marker. Use an empty Marker to start enumeration from the beginning.
+	     * After getting a segment, process it, and then call getPageRangesSegment again
+	     * (passing the the previously-returned Marker) to get the next segment.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
+	     * @param options - Options to PageBlob Get Page Ranges Segment operation.
+	     */
+	    async listPageRangesSegment(offset = 0, count, marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRangesSegment", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRanges({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                range: (0, Range_js_1.rangeToString)({ offset, count }),
+	                marker: marker,
+	                maxPageSize: options.maxPageSize,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesResponseModel}
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param marker - A string value that identifies the portion of
+	     *                          the get of page ranges to be returned with the next getting operation. The
+	     *                          operation returns the ContinuationToken value within the response body if the
+	     *                          getting operation did not return all page ranges remaining within the current page.
+	     *                          The ContinuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of get
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to List Page Ranges operation.
+	     */
+	    async *listPageRangeItemSegments(offset = 0, count, marker, options = {}) {
+	        let getPageRangeItemSegmentsResponse;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                getPageRangeItemSegmentsResponse = await this.listPageRangesSegment(offset, count, marker, options);
+	                marker = getPageRangeItemSegmentsResponse.continuationToken;
+	                yield await getPageRangeItemSegmentsResponse;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param options - Options to List Page Ranges operation.
+	     */
+	    async *listPageRangeItems(offset = 0, count, options = {}) {
+	        let marker;
+	        for await (const getPageRangesSegment of this.listPageRangeItemSegments(offset, count, marker, options)) {
+	            yield* (0, utils_common_js_1.ExtractPageRangeInfoItems)(getPageRangesSegment);
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to list of page ranges for a page blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     *  .byPage() returns an async iterable iterator to list of page ranges for a page blob.
+	     *
+	     * ```ts snippet:ClientsListPageBlobs
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const pageBlobClient = containerClient.getPageBlobClient(blobName);
+	     *
+	     * // Example using `for await` syntax
+	     * let i = 1;
+	     * for await (const pageRange of pageBlobClient.listPageRanges()) {
+	     *   console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     * }
+	     *
+	     * // Example using `iter.next()` syntax
+	     * i = 1;
+	     * const iter = pageBlobClient.listPageRanges();
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   console.log(`Page range ${i++}: ${value.start} - ${value.end}`);
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Example using `byPage()` syntax
+	     * i = 1;
+	     * for await (const page of pageBlobClient.listPageRanges().byPage({ maxPageSize: 20 })) {
+	     *   for (const pageRange of page.pageRange || []) {
+	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     *   }
+	     * }
+	     *
+	     * // Example using paging with a marker
+	     * i = 1;
+	     * let iterator = pageBlobClient.listPageRanges().byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     * // Prints 2 page ranges
+	     * if (response.pageRange) {
+	     *   for (const pageRange of response.pageRange) {
+	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     *   }
+	     * }
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = pageBlobClient.listPageRanges().byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     * // Prints 10 page ranges
+	     * if (response.pageRange) {
+	     *   for (const pageRange of response.pageRange) {
+	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param options - Options to the Page Blob Get Ranges operation.
+	     * @returns An asyncIterableIterator that supports paging.
+	     */
+	    listPageRanges(offset = 0, count, options = {}) {
+	        options.conditions = options.conditions || {};
+	        // AsyncIterableIterator to iterate over blobs
+	        const iter = this.listPageRangeItems(offset, count, options);
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.listPageRangeItemSegments(offset, count, settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...options,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * Gets the collection of page ranges that differ between a specified snapshot and this page blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     * @param offset - Starting byte position of the page blob
+	     * @param count - Number of bytes to get ranges diff.
+	     * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.
+	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
+	     * @returns Response data for the Page Blob Get Page Range Diff operation.
+	     */
+	    async getPageRangesDiff(offset, count, prevSnapshot, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRangesDiff", options, async (updatedOptions) => {
+	            const result = (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRangesDiff({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                prevsnapshot: prevSnapshot,
+	                range: (0, Range_js_1.rangeToString)({ offset, count }),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            return (0, PageBlobRangeResponse_js_1.rangeResponseFromModel)(result);
+	        });
+	    }
+	    /**
+	     * getPageRangesDiffSegment returns a single segment of page ranges starting from the
+	     * specified Marker for difference between previous snapshot and the target page blob.
+	     * Use an empty Marker to start enumeration from the beginning.
+	     * After getting a segment, process it, and then call getPageRangesDiffSegment again
+	     * (passing the the previously-returned Marker) to get the next segment.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
+	     * @param marker - A string value that identifies the portion of the get to be returned with the next get operation.
+	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
+	     */
+	    async listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-getPageRangesDiffSegment", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRangesDiff({
+	                abortSignal: options?.abortSignal,
+	                leaseAccessConditions: options?.conditions,
+	                modifiedAccessConditions: {
+	                    ...options?.conditions,
+	                    ifTags: options?.conditions?.tagConditions,
+	                },
+	                prevsnapshot: prevSnapshotOrUrl,
+	                range: (0, Range_js_1.rangeToString)({
+	                    offset: offset,
+	                    count: count,
+	                }),
+	                marker: marker,
+	                maxPageSize: options?.maxPageSize,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesDiffResponseModel}
+	     *
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
+	     * @param marker - A string value that identifies the portion of
+	     *                          the get of page ranges to be returned with the next getting operation. The
+	     *                          operation returns the ContinuationToken value within the response body if the
+	     *                          getting operation did not return all page ranges remaining within the current page.
+	     *                          The ContinuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of get
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
+	     */
+	    async *listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options) {
+	        let getPageRangeItemSegmentsResponse;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                getPageRangeItemSegmentsResponse = await this.listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options);
+	                marker = getPageRangeItemSegmentsResponse.continuationToken;
+	                yield await getPageRangeItemSegmentsResponse;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator of {@link PageRangeInfo} objects
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
+	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
+	     */
+	    async *listPageRangeDiffItems(offset, count, prevSnapshotOrUrl, options) {
+	        let marker;
+	        for await (const getPageRangesSegment of this.listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options)) {
+	            yield* (0, utils_common_js_1.ExtractPageRangeInfoItems)(getPageRangesSegment);
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     *  .byPage() returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.
+	     *
+	     * ```ts snippet:ClientsListPageBlobsDiff
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const pageBlobClient = containerClient.getPageBlobClient(blobName);
+	     *
+	     * const offset = 0;
+	     * const count = 1024;
+	     * const previousSnapshot = "";
+	     * // Example using `for await` syntax
+	     * let i = 1;
+	     * for await (const pageRange of pageBlobClient.listPageRangesDiff(offset, count, previousSnapshot)) {
+	     *   console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     * }
+	     *
+	     * // Example using `iter.next()` syntax
+	     * i = 1;
+	     * const iter = pageBlobClient.listPageRangesDiff(offset, count, previousSnapshot);
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   console.log(`Page range ${i++}: ${value.start} - ${value.end}`);
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Example using `byPage()` syntax
+	     * i = 1;
+	     * for await (const page of pageBlobClient
+	     *   .listPageRangesDiff(offset, count, previousSnapshot)
+	     *   .byPage({ maxPageSize: 20 })) {
+	     *   for (const pageRange of page.pageRange || []) {
+	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     *   }
+	     * }
+	     *
+	     * // Example using paging with a marker
+	     * i = 1;
+	     * let iterator = pageBlobClient
+	     *   .listPageRangesDiff(offset, count, previousSnapshot)
+	     *   .byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     * // Prints 2 page ranges
+	     * if (response.pageRange) {
+	     *   for (const pageRange of response.pageRange) {
+	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     *   }
+	     * }
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = pageBlobClient
+	     *   .listPageRangesDiff(offset, count, previousSnapshot)
+	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     * // Prints 10 page ranges
+	     * if (response.pageRange) {
+	     *   for (const pageRange of response.pageRange) {
+	     *     console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param offset - Starting byte position of the page ranges.
+	     * @param count - Number of bytes to get.
+	     * @param prevSnapshot - Timestamp of snapshot to retrieve the difference.
+	     * @param options - Options to the Page Blob Get Ranges operation.
+	     * @returns An asyncIterableIterator that supports paging.
+	     */
+	    listPageRangesDiff(offset, count, prevSnapshot, options = {}) {
+	        options.conditions = options.conditions || {};
+	        // AsyncIterableIterator to iterate over blobs
+	        const iter = this.listPageRangeDiffItems(offset, count, prevSnapshot, {
+	            ...options,
+	        });
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.listPageRangeDiffItemSegments(offset, count, prevSnapshot, settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...options,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * Gets the collection of page ranges that differ between a specified snapshot and this page blob for managed disks.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
+	     *
+	     * @param offset - Starting byte position of the page blob
+	     * @param count - Number of bytes to get ranges diff.
+	     * @param prevSnapshotUrl - URL of snapshot to retrieve the difference.
+	     * @param options - Options to the Page Blob Get Page Ranges Diff operation.
+	     * @returns Response data for the Page Blob Get Page Range Diff operation.
+	     */
+	    async getPageRangesDiffForManagedDisks(offset, count, prevSnapshotUrl, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-GetPageRangesDiffForManagedDisks", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.getPageRangesDiff({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                prevSnapshotUrl,
+	                range: (0, Range_js_1.rangeToString)({ offset, count }),
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            return (0, PageBlobRangeResponse_js_1.rangeResponseFromModel)(response);
+	        });
+	    }
+	    /**
+	     * Resizes the page blob to the specified size (which must be a multiple of 512).
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
+	     *
+	     * @param size - Target size
+	     * @param options - Options to the Page Blob Resize operation.
+	     * @returns Response data for the Page Blob Resize operation.
+	     */
+	    async resize(size, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-resize", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.resize(size, {
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                encryptionScope: options.encryptionScope,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Sets a page blob's sequence number.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
+	     *
+	     * @param sequenceNumberAction - Indicates how the service should modify the blob's sequence number.
+	     * @param sequenceNumber - Required if sequenceNumberAction is max or update
+	     * @param options - Options to the Page Blob Update Sequence Number operation.
+	     * @returns Response data for the Page Blob Update Sequence Number operation.
+	     */
+	    async updateSequenceNumber(sequenceNumberAction, sequenceNumber, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-updateSequenceNumber", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.updateSequenceNumber(sequenceNumberAction, {
+	                abortSignal: options.abortSignal,
+	                blobSequenceNumber: sequenceNumber,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Begins an operation to start an incremental copy from one page blob's snapshot to this page blob.
+	     * The snapshot is copied such that only the differential changes between the previously
+	     * copied snapshot are transferred to the destination.
+	     * The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/incremental-copy-blob
+	     * @see https://learn.microsoft.com/azure/virtual-machines/windows/incremental-snapshots
+	     *
+	     * @param copySource - Specifies the name of the source page blob snapshot. For example,
+	     *                            https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=
+	     * @param options - Options to the Page Blob Copy Incremental operation.
+	     * @returns Response data for the Page Blob Copy Incremental operation.
+	     */
+	    async startCopyIncremental(copySource, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("PageBlobClient-startCopyIncremental", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.pageBlobContext.copyIncremental(copySource, {
+	                abortSignal: options.abortSignal,
+	                modifiedAccessConditions: {
+	                    ...options.conditions,
+	                    ifTags: options.conditions?.tagConditions,
+	                },
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	}
+	Clients.PageBlobClient = PageBlobClient;
+	
+	return Clients;
+}
+
+var BlobBatchClient = {};
+
+var BatchResponseParser = {};
+
+var BatchUtils = {};
+
+var hasRequiredBatchUtils;
+
+function requireBatchUtils () {
+	if (hasRequiredBatchUtils) return BatchUtils;
+	hasRequiredBatchUtils = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BatchUtils, "__esModule", { value: true });
+	BatchUtils.getBodyAsText = getBodyAsText;
+	BatchUtils.utf8ByteLength = utf8ByteLength;
+	const utils_js_1 = requireUtils$1();
+	const constants_js_1 = requireConstants$8();
+	async function getBodyAsText(batchResponse) {
+	    let buffer = Buffer.alloc(constants_js_1.BATCH_MAX_PAYLOAD_IN_BYTES);
+	    const responseLength = await (0, utils_js_1.streamToBuffer2)(batchResponse.readableStreamBody, buffer);
+	    // Slice the buffer to trim the empty ending.
+	    buffer = buffer.slice(0, responseLength);
+	    return buffer.toString();
+	}
+	function utf8ByteLength(str) {
+	    return Buffer.byteLength(str);
+	}
+	
+	return BatchUtils;
+}
+
+var hasRequiredBatchResponseParser;
+
+function requireBatchResponseParser () {
+	if (hasRequiredBatchResponseParser) return BatchResponseParser;
+	hasRequiredBatchResponseParser = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BatchResponseParser, "__esModule", { value: true });
+	BatchResponseParser.BatchResponseParser = void 0;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_http_compat_1 = /*@__PURE__*/ requireCommonjs$6();
+	const constants_js_1 = requireConstants$8();
+	const BatchUtils_js_1 = requireBatchUtils();
+	const log_js_1 = requireLog$1();
+	const HTTP_HEADER_DELIMITER = ": ";
+	const SPACE_DELIMITER = " ";
+	const NOT_FOUND = -1;
+	/**
+	 * Util class for parsing batch response.
+	 */
+	let BatchResponseParser$1 = class BatchResponseParser {
+	    batchResponse;
+	    responseBatchBoundary;
+	    perResponsePrefix;
+	    batchResponseEnding;
+	    subRequests;
+	    constructor(batchResponse, subRequests) {
+	        if (!batchResponse || !batchResponse.contentType) {
+	            // In special case(reported), server may return invalid content-type which could not be parsed.
+	            throw new RangeError("batchResponse is malformed or doesn't contain valid content-type.");
+	        }
+	        if (!subRequests || subRequests.size === 0) {
+	            // This should be prevent during coding.
+	            throw new RangeError("Invalid state: subRequests is not provided or size is 0.");
+	        }
+	        this.batchResponse = batchResponse;
+	        this.subRequests = subRequests;
+	        this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1];
+	        this.perResponsePrefix = `--${this.responseBatchBoundary}${constants_js_1.HTTP_LINE_ENDING}`;
+	        this.batchResponseEnding = `--${this.responseBatchBoundary}--`;
+	    }
+	    // For example of response, please refer to https://learn.microsoft.com/rest/api/storageservices/blob-batch#response
+	    async parseBatchResponse() {
+	        // When logic reach here, suppose batch request has already succeeded with 202, so we can further parse
+	        // sub request's response.
+	        if (this.batchResponse._response.status !== constants_js_1.HTTPURLConnection.HTTP_ACCEPTED) {
+	            throw new Error(`Invalid state: batch request failed with status: '${this.batchResponse._response.status}'.`);
+	        }
+	        const responseBodyAsText = await (0, BatchUtils_js_1.getBodyAsText)(this.batchResponse);
+	        const subResponses = responseBodyAsText
+	            .split(this.batchResponseEnding)[0] // string after ending is useless
+	            .split(this.perResponsePrefix)
+	            .slice(1); // string before first response boundary is useless
+	        const subResponseCount = subResponses.length;
+	        // Defensive coding in case of potential error parsing.
+	        // Note: subResponseCount == 1 is special case where sub request is invalid.
+	        // We try to prevent such cases through early validation, e.g. validate sub request count >= 1.
+	        // While in unexpected sub request invalid case, we allow sub response to be parsed and return to user.
+	        if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) {
+	            throw new Error("Invalid state: sub responses' count is not equal to sub requests' count.");
+	        }
+	        const deserializedSubResponses = new Array(subResponseCount);
+	        let subResponsesSucceededCount = 0;
+	        let subResponsesFailedCount = 0;
+	        // Parse sub subResponses.
+	        for (let index = 0; index < subResponseCount; index++) {
+	            const subResponse = subResponses[index];
+	            const deserializedSubResponse = {};
+	            deserializedSubResponse.headers = (0, core_http_compat_1.toHttpHeadersLike)((0, core_rest_pipeline_1.createHttpHeaders)());
+	            const responseLines = subResponse.split(`${constants_js_1.HTTP_LINE_ENDING}`);
+	            let subRespHeaderStartFound = false;
+	            let subRespHeaderEndFound = false;
+	            let subRespFailed = false;
+	            let contentId = NOT_FOUND;
+	            for (const responseLine of responseLines) {
+	                if (!subRespHeaderStartFound) {
+	                    // Convention line to indicate content ID
+	                    if (responseLine.startsWith(constants_js_1.HeaderConstants.CONTENT_ID)) {
+	                        contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]);
+	                    }
+	                    // Http version line with status code indicates the start of sub request's response.
+	                    // Example: HTTP/1.1 202 Accepted
+	                    if (responseLine.startsWith(constants_js_1.HTTP_VERSION_1_1)) {
+	                        subRespHeaderStartFound = true;
+	                        const tokens = responseLine.split(SPACE_DELIMITER);
+	                        deserializedSubResponse.status = parseInt(tokens[1]);
+	                        deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER);
+	                    }
+	                    continue; // Skip convention headers not specifically for sub request i.e. Content-Type: application/http and Content-ID: *
+	                }
+	                if (responseLine.trim() === "") {
+	                    // Sub response's header start line already found, and the first empty line indicates header end line found.
+	                    if (!subRespHeaderEndFound) {
+	                        subRespHeaderEndFound = true;
+	                    }
+	                    continue; // Skip empty line
+	                }
+	                // Note: when code reach here, it indicates subRespHeaderStartFound == true
+	                if (!subRespHeaderEndFound) {
+	                    if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) {
+	                        // Defensive coding to prevent from missing valuable lines.
+	                        throw new Error(`Invalid state: find non-empty line '${responseLine}' without HTTP header delimiter '${HTTP_HEADER_DELIMITER}'.`);
+	                    }
+	                    // Parse headers of sub response.
+	                    const tokens = responseLine.split(HTTP_HEADER_DELIMITER);
+	                    deserializedSubResponse.headers.set(tokens[0], tokens[1]);
+	                    if (tokens[0] === constants_js_1.HeaderConstants.X_MS_ERROR_CODE) {
+	                        deserializedSubResponse.errorCode = tokens[1];
+	                        subRespFailed = true;
+	                    }
+	                }
+	                else {
+	                    // Assemble body of sub response.
+	                    if (!deserializedSubResponse.bodyAsText) {
+	                        deserializedSubResponse.bodyAsText = "";
+	                    }
+	                    deserializedSubResponse.bodyAsText += responseLine;
+	                }
+	            } // Inner for end
+	            // The response will contain the Content-ID header for each corresponding subrequest response to use for tracking.
+	            // The Content-IDs are set to a valid index in the subrequests we sent. In the status code 202 path, we could expect it
+	            // to be 1-1 mapping from the [0, subRequests.size) to the Content-IDs returned. If not, we simply don't return that
+	            // unexpected subResponse in the parsed reponse and we can always look it up in the raw response for debugging purpose.
+	            if (contentId !== NOT_FOUND &&
+	                Number.isInteger(contentId) &&
+	                contentId >= 0 &&
+	                contentId < this.subRequests.size &&
+	                deserializedSubResponses[contentId] === undefined) {
+	                deserializedSubResponse._request = this.subRequests.get(contentId);
+	                deserializedSubResponses[contentId] = deserializedSubResponse;
+	            }
+	            else {
+	                log_js_1.logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`);
+	            }
+	            if (subRespFailed) {
+	                subResponsesFailedCount++;
+	            }
+	            else {
+	                subResponsesSucceededCount++;
+	            }
+	        }
+	        return {
+	            subResponses: deserializedSubResponses,
+	            subResponsesSucceededCount: subResponsesSucceededCount,
+	            subResponsesFailedCount: subResponsesFailedCount,
+	        };
+	    }
+	};
+	BatchResponseParser.BatchResponseParser = BatchResponseParser$1;
+	
+	return BatchResponseParser;
+}
+
+var BlobBatch = {};
+
+var Mutex = {};
+
+var hasRequiredMutex;
+
+function requireMutex () {
+	if (hasRequiredMutex) return Mutex;
+	hasRequiredMutex = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(Mutex, "__esModule", { value: true });
+	Mutex.Mutex = void 0;
+	var MutexLockStatus;
+	(function (MutexLockStatus) {
+	    MutexLockStatus[MutexLockStatus["LOCKED"] = 0] = "LOCKED";
+	    MutexLockStatus[MutexLockStatus["UNLOCKED"] = 1] = "UNLOCKED";
+	})(MutexLockStatus || (MutexLockStatus = {}));
+	/**
+	 * An async mutex lock.
+	 */
+	let Mutex$1 = class Mutex {
+	    /**
+	     * Lock for a specific key. If the lock has been acquired by another customer, then
+	     * will wait until getting the lock.
+	     *
+	     * @param key - lock key
+	     */
+	    static async lock(key) {
+	        return new Promise((resolve) => {
+	            if (this.keys[key] === undefined || this.keys[key] === MutexLockStatus.UNLOCKED) {
+	                this.keys[key] = MutexLockStatus.LOCKED;
+	                resolve();
+	            }
+	            else {
+	                this.onUnlockEvent(key, () => {
+	                    this.keys[key] = MutexLockStatus.LOCKED;
+	                    resolve();
+	                });
+	            }
+	        });
+	    }
+	    /**
+	     * Unlock a key.
+	     *
+	     * @param key -
+	     */
+	    static async unlock(key) {
+	        return new Promise((resolve) => {
+	            if (this.keys[key] === MutexLockStatus.LOCKED) {
+	                this.emitUnlockEvent(key);
+	            }
+	            delete this.keys[key];
+	            resolve();
+	        });
+	    }
+	    static keys = {};
+	    static listeners = {};
+	    static onUnlockEvent(key, handler) {
+	        if (this.listeners[key] === undefined) {
+	            this.listeners[key] = [handler];
+	        }
+	        else {
+	            this.listeners[key].push(handler);
+	        }
+	    }
+	    static emitUnlockEvent(key) {
+	        if (this.listeners[key] !== undefined && this.listeners[key].length > 0) {
+	            const handler = this.listeners[key].shift();
+	            setImmediate(() => {
+	                handler.call(this);
+	            });
+	        }
+	    }
+	};
+	Mutex.Mutex = Mutex$1;
+	
+	return Mutex;
+}
+
+var hasRequiredBlobBatch;
+
+function requireBlobBatch () {
+	if (hasRequiredBlobBatch) return BlobBatch;
+	hasRequiredBlobBatch = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobBatch, "__esModule", { value: true });
+	BlobBatch.BlobBatch = void 0;
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_util_2 = /*@__PURE__*/ requireCommonjs$b();
+	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
+	const Clients_js_1 = requireClients();
+	const Mutex_js_1 = requireMutex();
+	const Pipeline_js_1 = requirePipeline();
+	const utils_common_js_1 = requireUtils_common$2();
+	const core_xml_1 = /*@__PURE__*/ requireCommonjs$5();
+	const constants_js_1 = requireConstants$8();
+	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
+	const tracing_js_1 = requireTracing();
+	const core_client_1 = /*@__PURE__*/ requireCommonjs$7();
+	const StorageSharedKeyCredentialPolicyV2_js_1 = requireStorageSharedKeyCredentialPolicyV2();
+	/**
+	 * A BlobBatch represents an aggregated set of operations on blobs.
+	 * Currently, only `delete` and `setAccessTier` are supported.
+	 */
+	let BlobBatch$1 = class BlobBatch {
+	    batchRequest;
+	    batch = "batch";
+	    batchType;
+	    constructor() {
+	        this.batchRequest = new InnerBatchRequest();
+	    }
+	    /**
+	     * Get the value of Content-Type for a batch request.
+	     * The value must be multipart/mixed with a batch boundary.
+	     * Example: multipart/mixed; boundary=batch_a81786c8-e301-4e42-a729-a32ca24ae252
+	     */
+	    getMultiPartContentType() {
+	        return this.batchRequest.getMultipartContentType();
+	    }
+	    /**
+	     * Get assembled HTTP request body for sub requests.
+	     */
+	    getHttpRequestBody() {
+	        return this.batchRequest.getHttpRequestBody();
+	    }
+	    /**
+	     * Get sub requests that are added into the batch request.
+	     */
+	    getSubRequests() {
+	        return this.batchRequest.getSubRequests();
+	    }
+	    async addSubRequestInternal(subRequest, assembleSubRequestFunc) {
+	        await Mutex_js_1.Mutex.lock(this.batch);
+	        try {
+	            this.batchRequest.preAddSubRequest(subRequest);
+	            await assembleSubRequestFunc();
+	            this.batchRequest.postAddSubRequest(subRequest);
+	        }
+	        finally {
+	            await Mutex_js_1.Mutex.unlock(this.batch);
+	        }
+	    }
+	    setBatchType(batchType) {
+	        if (!this.batchType) {
+	            this.batchType = batchType;
+	        }
+	        if (this.batchType !== batchType) {
+	            throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`);
+	        }
+	    }
+	    async deleteBlob(urlOrBlobClient, credentialOrOptions, options) {
+	        let url;
+	        let credential;
+	        if (typeof urlOrBlobClient === "string" &&
+	            ((core_util_2.isNodeLike && credentialOrOptions instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	                credentialOrOptions instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	                (0, core_auth_1.isTokenCredential)(credentialOrOptions))) {
+	            // First overload
+	            url = urlOrBlobClient;
+	            credential = credentialOrOptions;
+	        }
+	        else if (urlOrBlobClient instanceof Clients_js_1.BlobClient) {
+	            // Second overload
+	            url = urlOrBlobClient.url;
+	            credential = urlOrBlobClient.credential;
+	            options = credentialOrOptions;
+	        }
+	        else {
+	            throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
+	        }
+	        if (!options) {
+	            options = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BatchDeleteRequest-addSubRequest", options, async (updatedOptions) => {
+	            this.setBatchType("delete");
+	            await this.addSubRequestInternal({
+	                url: url,
+	                credential: credential,
+	            }, async () => {
+	                await new Clients_js_1.BlobClient(url, this.batchRequest.createPipeline(credential)).delete(updatedOptions);
+	            });
+	        });
+	    }
+	    async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) {
+	        let url;
+	        let credential;
+	        let tier;
+	        if (typeof urlOrBlobClient === "string" &&
+	            ((core_util_2.isNodeLike && credentialOrTier instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	                credentialOrTier instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	                (0, core_auth_1.isTokenCredential)(credentialOrTier))) {
+	            // First overload
+	            url = urlOrBlobClient;
+	            credential = credentialOrTier;
+	            tier = tierOrOptions;
+	        }
+	        else if (urlOrBlobClient instanceof Clients_js_1.BlobClient) {
+	            // Second overload
+	            url = urlOrBlobClient.url;
+	            credential = urlOrBlobClient.credential;
+	            tier = credentialOrTier;
+	            options = tierOrOptions;
+	        }
+	        else {
+	            throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
+	        }
+	        if (!options) {
+	            options = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BatchSetTierRequest-addSubRequest", options, async (updatedOptions) => {
+	            this.setBatchType("setAccessTier");
+	            await this.addSubRequestInternal({
+	                url: url,
+	                credential: credential,
+	            }, async () => {
+	                await new Clients_js_1.BlobClient(url, this.batchRequest.createPipeline(credential)).setAccessTier(tier, updatedOptions);
+	            });
+	        });
+	    }
+	};
+	BlobBatch.BlobBatch = BlobBatch$1;
+	/**
+	 * Inner batch request class which is responsible for assembling and serializing sub requests.
+	 * See https://learn.microsoft.com/rest/api/storageservices/blob-batch#request-body for how requests are assembled.
+	 */
+	class InnerBatchRequest {
+	    operationCount;
+	    body;
+	    subRequests;
+	    boundary;
+	    subRequestPrefix;
+	    multipartContentType;
+	    batchRequestEnding;
+	    constructor() {
+	        this.operationCount = 0;
+	        this.body = "";
+	        const tempGuid = (0, core_util_1.randomUUID)();
+	        // batch_{batchid}
+	        this.boundary = `batch_${tempGuid}`;
+	        // --batch_{batchid}
+	        // Content-Type: application/http
+	        // Content-Transfer-Encoding: binary
+	        this.subRequestPrefix = `--${this.boundary}${constants_js_1.HTTP_LINE_ENDING}${constants_js_1.HeaderConstants.CONTENT_TYPE}: application/http${constants_js_1.HTTP_LINE_ENDING}${constants_js_1.HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`;
+	        // multipart/mixed; boundary=batch_{batchid}
+	        this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`;
+	        // --batch_{batchid}--
+	        this.batchRequestEnding = `--${this.boundary}--`;
+	        this.subRequests = new Map();
+	    }
+	    /**
+	     * Create pipeline to assemble sub requests. The idea here is to use existing
+	     * credential and serialization/deserialization components, with additional policies to
+	     * filter unnecessary headers, assemble sub requests into request's body
+	     * and intercept request from going to wire.
+	     * @param credential -  Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
+	     */
+	    createPipeline(credential) {
+	        const corePipeline = (0, core_rest_pipeline_1.createEmptyPipeline)();
+	        corePipeline.addPolicy((0, core_client_1.serializationPolicy)({
+	            stringifyXML: core_xml_1.stringifyXML,
+	            serializerOptions: {
+	                xml: {
+	                    xmlCharKey: "#",
+	                },
+	            },
+	        }), { phase: "Serialize" });
+	        // Use batch header filter policy to exclude unnecessary headers
+	        corePipeline.addPolicy(batchHeaderFilterPolicy());
+	        // Use batch assemble policy to assemble request and intercept request from going to wire
+	        corePipeline.addPolicy(batchRequestAssemblePolicy(this), { afterPhase: "Sign" });
+	        if ((0, core_auth_1.isTokenCredential)(credential)) {
+	            corePipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({
+	                credential,
+	                scopes: constants_js_1.StorageOAuthScopes,
+	                challengeCallbacks: { authorizeRequestOnChallenge: core_client_1.authorizeRequestOnTenantChallenge },
+	            }), { phase: "Sign" });
+	        }
+	        else if (credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) {
+	            corePipeline.addPolicy((0, StorageSharedKeyCredentialPolicyV2_js_1.storageSharedKeyCredentialPolicy)({
+	                accountName: credential.accountName,
+	                accountKey: credential.accountKey,
+	            }), { phase: "Sign" });
+	        }
+	        const pipeline = new Pipeline_js_1.Pipeline([]);
+	        // attach the v2 pipeline to this one
+	        pipeline._credential = credential;
+	        pipeline._corePipeline = corePipeline;
+	        return pipeline;
+	    }
+	    appendSubRequestToBody(request) {
+	        // Start to assemble sub request
+	        this.body += [
+	            this.subRequestPrefix, // sub request constant prefix
+	            `${constants_js_1.HeaderConstants.CONTENT_ID}: ${this.operationCount}`, // sub request's content ID
+	            "", // empty line after sub request's content ID
+	            `${request.method.toString()} ${(0, utils_common_js_1.getURLPathAndQuery)(request.url)} ${constants_js_1.HTTP_VERSION_1_1}${constants_js_1.HTTP_LINE_ENDING}`, // sub request start line with method
+	        ].join(constants_js_1.HTTP_LINE_ENDING);
+	        for (const [name, value] of request.headers) {
+	            this.body += `${name}: ${value}${constants_js_1.HTTP_LINE_ENDING}`;
+	        }
+	        this.body += constants_js_1.HTTP_LINE_ENDING; // sub request's headers need be ending with an empty line
+	        // No body to assemble for current batch request support
+	        // End to assemble sub request
+	    }
+	    preAddSubRequest(subRequest) {
+	        if (this.operationCount >= constants_js_1.BATCH_MAX_REQUEST) {
+	            throw new RangeError(`Cannot exceed ${constants_js_1.BATCH_MAX_REQUEST} sub requests in a single batch`);
+	        }
+	        // Fast fail if url for sub request is invalid
+	        const path = (0, utils_common_js_1.getURLPath)(subRequest.url);
+	        if (!path || path === "") {
+	            throw new RangeError(`Invalid url for sub request: '${subRequest.url}'`);
+	        }
+	    }
+	    postAddSubRequest(subRequest) {
+	        this.subRequests.set(this.operationCount, subRequest);
+	        this.operationCount++;
+	    }
+	    // Return the http request body with assembling the ending line to the sub request body.
+	    getHttpRequestBody() {
+	        return `${this.body}${this.batchRequestEnding}${constants_js_1.HTTP_LINE_ENDING}`;
+	    }
+	    getMultipartContentType() {
+	        return this.multipartContentType;
+	    }
+	    getSubRequests() {
+	        return this.subRequests;
+	    }
+	}
+	function batchRequestAssemblePolicy(batchRequest) {
+	    return {
+	        name: "batchRequestAssemblePolicy",
+	        async sendRequest(request) {
+	            batchRequest.appendSubRequestToBody(request);
+	            return {
+	                request,
+	                status: 200,
+	                headers: (0, core_rest_pipeline_1.createHttpHeaders)(),
+	            };
+	        },
+	    };
+	}
+	function batchHeaderFilterPolicy() {
+	    return {
+	        name: "batchHeaderFilterPolicy",
+	        async sendRequest(request, next) {
+	            let xMsHeaderName = "";
+	            for (const [name] of request.headers) {
+	                if ((0, utils_common_js_1.iEqual)(name, constants_js_1.HeaderConstants.X_MS_VERSION)) {
+	                    xMsHeaderName = name;
+	                }
+	            }
+	            if (xMsHeaderName !== "") {
+	                request.headers.delete(xMsHeaderName); // The subrequests should not have the x-ms-version header.
+	            }
+	            return next(request);
+	        },
+	    };
+	}
+	
+	return BlobBatch;
+}
+
+var hasRequiredBlobBatchClient;
+
+function requireBlobBatchClient () {
+	if (hasRequiredBlobBatchClient) return BlobBatchClient;
+	hasRequiredBlobBatchClient = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BlobBatchClient, "__esModule", { value: true });
+	BlobBatchClient.BlobBatchClient = void 0;
+	const BatchResponseParser_js_1 = requireBatchResponseParser();
+	const BatchUtils_js_1 = requireBatchUtils();
+	const BlobBatch_js_1 = requireBlobBatch();
+	const tracing_js_1 = requireTracing();
+	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
+	const StorageContextClient_js_1 = requireStorageContextClient();
+	const Pipeline_js_1 = requirePipeline();
+	const utils_common_js_1 = requireUtils_common$2();
+	/**
+	 * A BlobBatchClient allows you to make batched requests to the Azure Storage Blob service.
+	 *
+	 * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
+	 */
+	let BlobBatchClient$1 = class BlobBatchClient {
+	    serviceOrContainerContext;
+	    constructor(url, credentialOrPipeline, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        let pipeline;
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipeline)) {
+	            pipeline = credentialOrPipeline;
+	        }
+	        else if (!credentialOrPipeline) {
+	            // no credential provided
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        else {
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipeline, options);
+	        }
+	        const storageClientContext = new StorageContextClient_js_1.StorageContextClient(url, (0, Pipeline_js_1.getCoreClientOptions)(pipeline));
+	        const path = (0, utils_common_js_1.getURLPath)(url);
+	        if (path && path !== "/") {
+	            // Container scoped.
+	            this.serviceOrContainerContext = storageClientContext.container;
+	        }
+	        else {
+	            this.serviceOrContainerContext = storageClientContext.service;
+	        }
+	    }
+	    /**
+	     * Creates a {@link BlobBatch}.
+	     * A BlobBatch represents an aggregated set of operations on blobs.
+	     */
+	    createBatch() {
+	        return new BlobBatch_js_1.BlobBatch();
+	    }
+	    async deleteBlobs(urlsOrBlobClients, credentialOrOptions, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        const batch = new BlobBatch_js_1.BlobBatch();
+	        for (const urlOrBlobClient of urlsOrBlobClients) {
+	            if (typeof urlOrBlobClient === "string") {
+	                await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options);
+	            }
+	            else {
+	                await batch.deleteBlob(urlOrBlobClient, credentialOrOptions);
+	            }
+	        }
+	        return this.submitBatch(batch);
+	    }
+	    async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        const batch = new BlobBatch_js_1.BlobBatch();
+	        for (const urlOrBlobClient of urlsOrBlobClients) {
+	            if (typeof urlOrBlobClient === "string") {
+	                await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options);
+	            }
+	            else {
+	                await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions);
+	            }
+	        }
+	        return this.submitBatch(batch);
+	    }
+	    /**
+	     * Submit batch request which consists of multiple subrequests.
+	     *
+	     * Get `blobBatchClient` and other details before running the snippets.
+	     * `blobServiceClient.getBlobBatchClient()` gives the `blobBatchClient`
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:BlobBatchClientSubmitBatch
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     * import { BlobServiceClient, BlobBatch } from "@azure/storage-blob";
+	     *
+	     * const account = "";
+	     * const credential = new DefaultAzureCredential();
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   credential,
+	     * );
+	     *
+	     * const containerName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blobBatchClient = containerClient.getBlobBatchClient();
+	     *
+	     * const batchRequest = new BlobBatch();
+	     * await batchRequest.deleteBlob("", credential);
+	     * await batchRequest.deleteBlob("", credential, {
+	     *   deleteSnapshots: "include",
+	     * });
+	     * const batchResp = await blobBatchClient.submitBatch(batchRequest);
+	     * console.log(batchResp.subResponsesSucceededCount);
+	     * ```
+	     *
+	     * Example using a lease:
+	     *
+	     * ```ts snippet:BlobBatchClientSubmitBatchWithLease
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     * import { BlobServiceClient, BlobBatch } from "@azure/storage-blob";
+	     *
+	     * const account = "";
+	     * const credential = new DefaultAzureCredential();
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   credential,
+	     * );
+	     *
+	     * const containerName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blobBatchClient = containerClient.getBlobBatchClient();
+	     * const blobClient = containerClient.getBlobClient("");
+	     *
+	     * const batchRequest = new BlobBatch();
+	     * await batchRequest.setBlobAccessTier(blobClient, "Cool");
+	     * await batchRequest.setBlobAccessTier(blobClient, "Cool", {
+	     *   conditions: { leaseId: "" },
+	     * });
+	     * const batchResp = await blobBatchClient.submitBatch(batchRequest);
+	     * console.log(batchResp.subResponsesSucceededCount);
+	     * ```
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
+	     *
+	     * @param batchRequest - A set of Delete or SetTier operations.
+	     * @param options -
+	     */
+	    async submitBatch(batchRequest, options = {}) {
+	        if (!batchRequest || batchRequest.getSubRequests().size === 0) {
+	            throw new RangeError("Batch request should contain one or more sub requests.");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("BlobBatchClient-submitBatch", options, async (updatedOptions) => {
+	            const batchRequestBody = batchRequest.getHttpRequestBody();
+	            // ServiceSubmitBatchResponseModel and ContainerSubmitBatchResponse are compatible for now.
+	            const rawBatchResponse = (0, utils_common_js_1.assertResponse)(await this.serviceOrContainerContext.submitBatch((0, BatchUtils_js_1.utf8ByteLength)(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, {
+	                ...updatedOptions,
+	            }));
+	            // Parse the sub responses result, if logic reaches here(i.e. the batch request succeeded with status code 202).
+	            const batchResponseParser = new BatchResponseParser_js_1.BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests());
+	            const responseSummary = await batchResponseParser.parseBatchResponse();
+	            const res = {
+	                _response: rawBatchResponse._response,
+	                contentType: rawBatchResponse.contentType,
+	                errorCode: rawBatchResponse.errorCode,
+	                requestId: rawBatchResponse.requestId,
+	                clientRequestId: rawBatchResponse.clientRequestId,
+	                version: rawBatchResponse.version,
+	                subResponses: responseSummary.subResponses,
+	                subResponsesSucceededCount: responseSummary.subResponsesSucceededCount,
+	                subResponsesFailedCount: responseSummary.subResponsesFailedCount,
+	            };
+	            return res;
+	        });
+	    }
+	};
+	BlobBatchClient.BlobBatchClient = BlobBatchClient$1;
+	
+	return BlobBatchClient;
+}
+
+var hasRequiredContainerClient;
+
+function requireContainerClient () {
+	if (hasRequiredContainerClient) return ContainerClient;
+	hasRequiredContainerClient = 1;
+	Object.defineProperty(ContainerClient, "__esModule", { value: true });
+	ContainerClient.ContainerClient = void 0;
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
+	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
+	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
+	const Pipeline_js_1 = requirePipeline();
+	const StorageClient_js_1 = requireStorageClient();
+	const tracing_js_1 = requireTracing();
+	const utils_common_js_1 = requireUtils_common$2();
+	const BlobSASSignatureValues_js_1 = requireBlobSASSignatureValues();
+	const BlobLeaseClient_js_1 = requireBlobLeaseClient();
+	const Clients_js_1 = requireClients();
+	const BlobBatchClient_js_1 = requireBlobBatchClient();
+	/**
+	 * A ContainerClient represents a URL to the Azure Storage container allowing you to manipulate its blobs.
+	 */
+	let ContainerClient$1 = class ContainerClient extends StorageClient_js_1.StorageClient {
+	    /**
+	     * containerContext provided by protocol layer.
+	     */
+	    containerContext;
+	    _containerName;
+	    /**
+	     * The name of the container.
+	     */
+	    get containerName() {
+	        return this._containerName;
+	    }
+	    constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        let pipeline;
+	        let url;
+	        options = options || {};
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, pipeline: Pipeline)
+	            url = urlOrConnectionString;
+	            pipeline = credentialOrPipelineOrContainerName;
+	        }
+	        else if ((core_util_1.isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	            credentialOrPipelineOrContainerName instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	            (0, core_auth_1.isTokenCredential)(credentialOrPipelineOrContainerName)) {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            url = urlOrConnectionString;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipelineOrContainerName, options);
+	        }
+	        else if (!credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName !== "string") {
+	            // (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
+	            // The second parameter is undefined. Use anonymous credential.
+	            url = urlOrConnectionString;
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        else if (credentialOrPipelineOrContainerName &&
+	            typeof credentialOrPipelineOrContainerName === "string") {
+	            // (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
+	            const containerName = credentialOrPipelineOrContainerName;
+	            const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(urlOrConnectionString);
+	            if (extractedCreds.kind === "AccountConnString") {
+	                if (core_util_1.isNodeLike) {
+	                    const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
+	                    url = (0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName));
+	                    if (!options.proxyOptions) {
+	                        options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
+	                    }
+	                    pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
+	                }
+	                else {
+	                    throw new Error("Account connection string is only supported in Node.js environment");
+	                }
+	            }
+	            else if (extractedCreds.kind === "SASConnString") {
+	                url =
+	                    (0, utils_common_js_1.appendToURLPath)(extractedCreds.url, encodeURIComponent(containerName)) +
+	                        "?" +
+	                        extractedCreds.accountSas;
+	                pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	            }
+	            else {
+	                throw new Error("Connection string must be either an Account connection string or a SAS connection string");
+	            }
+	        }
+	        else {
+	            throw new Error("Expecting non-empty strings for containerName parameter");
+	        }
+	        super(url, pipeline);
+	        this._containerName = this.getContainerNameFromUrl();
+	        this.containerContext = this.storageClientContext.container;
+	    }
+	    /**
+	     * Creates a new container under the specified account. If the container with
+	     * the same name already exists, the operation fails.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/create-container
+	     * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
+	     *
+	     * @param options - Options to Container Create operation.
+	     *
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:ContainerClientCreate
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const createContainerResponse = await containerClient.create();
+	     * console.log("Container was created successfully", createContainerResponse.requestId);
+	     * ```
+	     */
+	    async create(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-create", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.create(updatedOptions));
+	        });
+	    }
+	    /**
+	     * Creates a new container under the specified account. If the container with
+	     * the same name already exists, it is not changed.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/create-container
+	     * Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
+	     *
+	     * @param options -
+	     */
+	    async createIfNotExists(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-createIfNotExists", options, async (updatedOptions) => {
+	            try {
+	                const res = await this.create(updatedOptions);
+	                return {
+	                    succeeded: true,
+	                    ...res,
+	                    _response: res._response, // _response is made non-enumerable
+	                };
+	            }
+	            catch (e) {
+	                if (e.details?.errorCode === "ContainerAlreadyExists") {
+	                    return {
+	                        succeeded: false,
+	                        ...e.response?.parsedHeaders,
+	                        _response: e.response,
+	                    };
+	                }
+	                else {
+	                    throw e;
+	                }
+	            }
+	        });
+	    }
+	    /**
+	     * Returns true if the Azure container resource represented by this client exists; false otherwise.
+	     *
+	     * NOTE: use this function with care since an existing container might be deleted by other clients or
+	     * applications. Vice versa new containers with the same name might be added by other clients or
+	     * applications after this function completes.
+	     *
+	     * @param options -
+	     */
+	    async exists(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-exists", options, async (updatedOptions) => {
+	            try {
+	                await this.getProperties({
+	                    abortSignal: options.abortSignal,
+	                    tracingOptions: updatedOptions.tracingOptions,
+	                });
+	                return true;
+	            }
+	            catch (e) {
+	                if (e.statusCode === 404) {
+	                    return false;
+	                }
+	                throw e;
+	            }
+	        });
+	    }
+	    /**
+	     * Creates a {@link BlobClient}
+	     *
+	     * @param blobName - A blob name
+	     * @returns A new BlobClient object for the given blob name.
+	     */
+	    getBlobClient(blobName) {
+	        return new Clients_js_1.BlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
+	    }
+	    /**
+	     * Creates an {@link AppendBlobClient}
+	     *
+	     * @param blobName - An append blob name
+	     */
+	    getAppendBlobClient(blobName) {
+	        return new Clients_js_1.AppendBlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
+	    }
+	    /**
+	     * Creates a {@link BlockBlobClient}
+	     *
+	     * @param blobName - A block blob name
+	     *
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:ClientsUpload
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const blobName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     * const blockBlobClient = containerClient.getBlockBlobClient(blobName);
+	     *
+	     * const content = "Hello world!";
+	     * const uploadBlobResponse = await blockBlobClient.upload(content, content.length);
+	     * ```
+	     */
+	    getBlockBlobClient(blobName) {
+	        return new Clients_js_1.BlockBlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
+	    }
+	    /**
+	     * Creates a {@link PageBlobClient}
+	     *
+	     * @param blobName - A page blob name
+	     */
+	    getPageBlobClient(blobName) {
+	        return new Clients_js_1.PageBlobClient((0, utils_common_js_1.appendToURLPath)(this.url, (0, utils_common_js_1.EscapePath)(blobName)), this.pipeline);
+	    }
+	    /**
+	     * Returns all user-defined metadata and system properties for the specified
+	     * container. The data returned does not include the container's list of blobs.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-container-properties
+	     *
+	     * WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if
+	     * they originally contained uppercase characters. This differs from the metadata keys returned by
+	     * the `listContainers` method of {@link BlobServiceClient} using the `includeMetadata` option, which
+	     * will retain their original casing.
+	     *
+	     * @param options - Options to Container Get Properties operation.
+	     */
+	    async getProperties(options = {}) {
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-getProperties", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.getProperties({
+	                abortSignal: options.abortSignal,
+	                ...options.conditions,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Marks the specified container for deletion. The container and any blobs
+	     * contained within it are later deleted during garbage collection.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-container
+	     *
+	     * @param options - Options to Container Delete operation.
+	     */
+	    async delete(options = {}) {
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-delete", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.delete({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: options.conditions,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Marks the specified container for deletion if it exists. The container and any blobs
+	     * contained within it are later deleted during garbage collection.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-container
+	     *
+	     * @param options - Options to Container Delete operation.
+	     */
+	    async deleteIfExists(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-deleteIfExists", options, async (updatedOptions) => {
+	            try {
+	                const res = await this.delete(updatedOptions);
+	                return {
+	                    succeeded: true,
+	                    ...res,
+	                    _response: res._response,
+	                };
+	            }
+	            catch (e) {
+	                if (e.details?.errorCode === "ContainerNotFound") {
+	                    return {
+	                        succeeded: false,
+	                        ...e.response?.parsedHeaders,
+	                        _response: e.response,
+	                    };
+	                }
+	                throw e;
+	            }
+	        });
+	    }
+	    /**
+	     * Sets one or more user-defined name-value pairs for the specified container.
+	     *
+	     * If no option provided, or no metadata defined in the parameter, the container
+	     * metadata will be removed.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-container-metadata
+	     *
+	     * @param metadata - Replace existing metadata with this value.
+	     *                            If no value provided the existing metadata will be removed.
+	     * @param options - Options to Container Set Metadata operation.
+	     */
+	    async setMetadata(metadata, options = {}) {
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        if (options.conditions.ifUnmodifiedSince) {
+	            throw new RangeError("the IfUnmodifiedSince must have their default values because they are ignored by the blob service");
+	        }
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-setMetadata", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.setMetadata({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                metadata,
+	                modifiedAccessConditions: options.conditions,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Gets the permissions for the specified container. The permissions indicate
+	     * whether container data may be accessed publicly.
+	     *
+	     * WARNING: JavaScript Date will potentially lose precision when parsing startsOn and expiresOn strings.
+	     * For example, new Date("2018-12-31T03:44:23.8827891Z").toISOString() will get "2018-12-31T03:44:23.882Z".
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-container-acl
+	     *
+	     * @param options - Options to Container Get Access Policy operation.
+	     */
+	    async getAccessPolicy(options = {}) {
+	        if (!options.conditions) {
+	            options.conditions = {};
+	        }
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-getAccessPolicy", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.getAccessPolicy({
+	                abortSignal: options.abortSignal,
+	                leaseAccessConditions: options.conditions,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const res = {
+	                _response: response._response,
+	                blobPublicAccess: response.blobPublicAccess,
+	                date: response.date,
+	                etag: response.etag,
+	                errorCode: response.errorCode,
+	                lastModified: response.lastModified,
+	                requestId: response.requestId,
+	                clientRequestId: response.clientRequestId,
+	                signedIdentifiers: [],
+	                version: response.version,
+	            };
+	            for (const identifier of response) {
+	                let accessPolicy = undefined;
+	                if (identifier.accessPolicy) {
+	                    accessPolicy = {
+	                        permissions: identifier.accessPolicy.permissions,
+	                    };
+	                    if (identifier.accessPolicy.expiresOn) {
+	                        accessPolicy.expiresOn = new Date(identifier.accessPolicy.expiresOn);
+	                    }
+	                    if (identifier.accessPolicy.startsOn) {
+	                        accessPolicy.startsOn = new Date(identifier.accessPolicy.startsOn);
+	                    }
+	                }
+	                res.signedIdentifiers.push({
+	                    accessPolicy,
+	                    id: identifier.id,
+	                });
+	            }
+	            return res;
+	        });
+	    }
+	    /**
+	     * Sets the permissions for the specified container. The permissions indicate
+	     * whether blobs in a container may be accessed publicly.
+	     *
+	     * When you set permissions for a container, the existing permissions are replaced.
+	     * If no access or containerAcl provided, the existing container ACL will be
+	     * removed.
+	     *
+	     * When you establish a stored access policy on a container, it may take up to 30 seconds to take effect.
+	     * During this interval, a shared access signature that is associated with the stored access policy will
+	     * fail with status code 403 (Forbidden), until the access policy becomes active.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-container-acl
+	     *
+	     * @param access - The level of public access to data in the container.
+	     * @param containerAcl - Array of elements each having a unique Id and details of the access policy.
+	     * @param options - Options to Container Set Access Policy operation.
+	     */
+	    async setAccessPolicy(access, containerAcl, options = {}) {
+	        options.conditions = options.conditions || {};
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-setAccessPolicy", options, async (updatedOptions) => {
+	            const acl = [];
+	            for (const identifier of containerAcl || []) {
+	                acl.push({
+	                    accessPolicy: {
+	                        expiresOn: identifier.accessPolicy.expiresOn
+	                            ? (0, utils_common_js_1.truncatedISO8061Date)(identifier.accessPolicy.expiresOn)
+	                            : "",
+	                        permissions: identifier.accessPolicy.permissions,
+	                        startsOn: identifier.accessPolicy.startsOn
+	                            ? (0, utils_common_js_1.truncatedISO8061Date)(identifier.accessPolicy.startsOn)
+	                            : "",
+	                    },
+	                    id: identifier.id,
+	                });
+	            }
+	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.setAccessPolicy({
+	                abortSignal: options.abortSignal,
+	                access,
+	                containerAcl: acl,
+	                leaseAccessConditions: options.conditions,
+	                modifiedAccessConditions: options.conditions,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Get a {@link BlobLeaseClient} that manages leases on the container.
+	     *
+	     * @param proposeLeaseId - Initial proposed lease Id.
+	     * @returns A new BlobLeaseClient object for managing leases on the container.
+	     */
+	    getBlobLeaseClient(proposeLeaseId) {
+	        return new BlobLeaseClient_js_1.BlobLeaseClient(this, proposeLeaseId);
+	    }
+	    /**
+	     * Creates a new block blob, or updates the content of an existing block blob.
+	     *
+	     * Updating an existing block blob overwrites any existing metadata on the blob.
+	     * Partial updates are not supported; the content of the existing blob is
+	     * overwritten with the new content. To perform a partial update of a block blob's,
+	     * use {@link BlockBlobClient.stageBlock} and {@link BlockBlobClient.commitBlockList}.
+	     *
+	     * This is a non-parallel uploading method, please use {@link BlockBlobClient.uploadFile},
+	     * {@link BlockBlobClient.uploadStream} or {@link BlockBlobClient.uploadBrowserData} for better
+	     * performance with concurrency uploading.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/put-blob
+	     *
+	     * @param blobName - Name of the block blob to create or update.
+	     * @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function
+	     *                               which returns a new Readable stream whose offset is from data source beginning.
+	     * @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a
+	     *                               string including non non-Base64/Hex-encoded characters.
+	     * @param options - Options to configure the Block Blob Upload operation.
+	     * @returns Block Blob upload response data and the corresponding BlockBlobClient instance.
+	     */
+	    async uploadBlockBlob(blobName, body, contentLength, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-uploadBlockBlob", options, async (updatedOptions) => {
+	            const blockBlobClient = this.getBlockBlobClient(blobName);
+	            const response = await blockBlobClient.upload(body, contentLength, updatedOptions);
+	            return {
+	                blockBlobClient,
+	                response,
+	            };
+	        });
+	    }
+	    /**
+	     * Marks the specified blob or snapshot for deletion. The blob is later deleted
+	     * during garbage collection. Note that in order to delete a blob, you must delete
+	     * all of its snapshots. You can delete both at the same time with the Delete
+	     * Blob operation.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
+	     *
+	     * @param blobName -
+	     * @param options - Options to Blob Delete operation.
+	     * @returns Block blob deletion response data.
+	     */
+	    async deleteBlob(blobName, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-deleteBlob", options, async (updatedOptions) => {
+	            let blobClient = this.getBlobClient(blobName);
+	            if (options.versionId) {
+	                blobClient = blobClient.withVersion(options.versionId);
+	            }
+	            return blobClient.delete(updatedOptions);
+	        });
+	    }
+	    /**
+	     * listBlobFlatSegment returns a single segment of blobs starting from the
+	     * specified Marker. Use an empty Marker to start enumeration from the beginning.
+	     * After getting a segment, process it, and then call listBlobsFlatSegment again
+	     * (passing the the previously-returned Marker) to get the next segment.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/list-blobs
+	     *
+	     * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
+	     * @param options - Options to Container List Blob Flat Segment operation.
+	     */
+	    async listBlobFlatSegment(marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-listBlobFlatSegment", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.listBlobFlatSegment({
+	                marker,
+	                ...options,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const wrappedResponse = {
+	                ...response,
+	                _response: {
+	                    ...response._response,
+	                    parsedBody: (0, utils_common_js_1.ConvertInternalResponseOfListBlobFlat)(response._response.parsedBody),
+	                }, // _response is made non-enumerable
+	                segment: {
+	                    ...response.segment,
+	                    blobItems: response.segment.blobItems.map((blobItemInternal) => {
+	                        const blobItem = {
+	                            ...blobItemInternal,
+	                            name: (0, utils_common_js_1.BlobNameToString)(blobItemInternal.name),
+	                            tags: (0, utils_common_js_1.toTags)(blobItemInternal.blobTags),
+	                            objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(blobItemInternal.objectReplicationMetadata),
+	                        };
+	                        return blobItem;
+	                    }),
+	                },
+	            };
+	            return wrappedResponse;
+	        });
+	    }
+	    /**
+	     * listBlobHierarchySegment returns a single segment of blobs starting from
+	     * the specified Marker. Use an empty Marker to start enumeration from the
+	     * beginning. After getting a segment, process it, and then call listBlobsHierarchicalSegment
+	     * again (passing the the previously-returned Marker) to get the next segment.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/list-blobs
+	     *
+	     * @param delimiter - The character or string used to define the virtual hierarchy
+	     * @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
+	     * @param options - Options to Container List Blob Hierarchy Segment operation.
+	     */
+	    async listBlobHierarchySegment(delimiter, marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-listBlobHierarchySegment", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.listBlobHierarchySegment(delimiter, {
+	                marker,
+	                ...options,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const wrappedResponse = {
+	                ...response,
+	                _response: {
+	                    ...response._response,
+	                    parsedBody: (0, utils_common_js_1.ConvertInternalResponseOfListBlobHierarchy)(response._response.parsedBody),
+	                }, // _response is made non-enumerable
+	                segment: {
+	                    ...response.segment,
+	                    blobItems: response.segment.blobItems.map((blobItemInternal) => {
+	                        const blobItem = {
+	                            ...blobItemInternal,
+	                            name: (0, utils_common_js_1.BlobNameToString)(blobItemInternal.name),
+	                            tags: (0, utils_common_js_1.toTags)(blobItemInternal.blobTags),
+	                            objectReplicationSourceProperties: (0, utils_common_js_1.parseObjectReplicationRecord)(blobItemInternal.objectReplicationMetadata),
+	                        };
+	                        return blobItem;
+	                    }),
+	                    blobPrefixes: response.segment.blobPrefixes?.map((blobPrefixInternal) => {
+	                        const blobPrefix = {
+	                            ...blobPrefixInternal,
+	                            name: (0, utils_common_js_1.BlobNameToString)(blobPrefixInternal.name),
+	                        };
+	                        return blobPrefix;
+	                    }),
+	                },
+	            };
+	            return wrappedResponse;
+	        });
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for ContainerListBlobFlatSegmentResponse
+	     *
+	     * @param marker - A string value that identifies the portion of
+	     *                          the list of blobs to be returned with the next listing operation. The
+	     *                          operation returns the ContinuationToken value within the response body if the
+	     *                          listing operation did not return all blobs remaining to be listed
+	     *                          with the current page. The ContinuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of list
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to list blobs operation.
+	     */
+	    async *listSegments(marker, options = {}) {
+	        let listBlobsFlatSegmentResponse;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                listBlobsFlatSegmentResponse = await this.listBlobFlatSegment(marker, options);
+	                marker = listBlobsFlatSegmentResponse.continuationToken;
+	                yield await listBlobsFlatSegmentResponse;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator of {@link BlobItem} objects
+	     *
+	     * @param options - Options to list blobs operation.
+	     */
+	    async *listItems(options = {}) {
+	        let marker;
+	        for await (const listBlobsFlatSegmentResponse of this.listSegments(marker, options)) {
+	            yield* listBlobsFlatSegmentResponse.segment.blobItems;
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to list all the blobs
+	     * under the specified account.
+	     *
+	     * .byPage() returns an async iterable iterator to list the blobs in pages.
+	     *
+	     * ```ts snippet:ReadmeSampleListBlobs_Multiple
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     *
+	     * // Example using `for await` syntax
+	     * let i = 1;
+	     * const blobs = containerClient.listBlobsFlat();
+	     * for await (const blob of blobs) {
+	     *   console.log(`Blob ${i++}: ${blob.name}`);
+	     * }
+	     *
+	     * // Example using `iter.next()` syntax
+	     * i = 1;
+	     * const iter = containerClient.listBlobsFlat();
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   console.log(`Blob ${i++}: ${value.name}`);
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Example using `byPage()` syntax
+	     * i = 1;
+	     * for await (const page of containerClient.listBlobsFlat().byPage({ maxPageSize: 20 })) {
+	     *   for (const blob of page.segment.blobItems) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Example using paging with a marker
+	     * i = 1;
+	     * let iterator = containerClient.listBlobsFlat().byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     * // Prints 2 blob names
+	     * if (response.segment.blobItems) {
+	     *   for (const blob of response.segment.blobItems) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = containerClient.listBlobsFlat().byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     * // Prints 10 blob names
+	     * if (response.segment.blobItems) {
+	     *   for (const blob of response.segment.blobItems) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param options - Options to list blobs.
+	     * @returns An asyncIterableIterator that supports paging.
+	     */
+	    listBlobsFlat(options = {}) {
+	        const include = [];
+	        if (options.includeCopy) {
+	            include.push("copy");
+	        }
+	        if (options.includeDeleted) {
+	            include.push("deleted");
+	        }
+	        if (options.includeMetadata) {
+	            include.push("metadata");
+	        }
+	        if (options.includeSnapshots) {
+	            include.push("snapshots");
+	        }
+	        if (options.includeVersions) {
+	            include.push("versions");
+	        }
+	        if (options.includeUncommitedBlobs) {
+	            include.push("uncommittedblobs");
+	        }
+	        if (options.includeTags) {
+	            include.push("tags");
+	        }
+	        if (options.includeDeletedWithVersions) {
+	            include.push("deletedwithversions");
+	        }
+	        if (options.includeImmutabilityPolicy) {
+	            include.push("immutabilitypolicy");
+	        }
+	        if (options.includeLegalHold) {
+	            include.push("legalhold");
+	        }
+	        if (options.prefix === "") {
+	            options.prefix = undefined;
+	        }
+	        const updatedOptions = {
+	            ...options,
+	            ...(include.length > 0 ? { include: include } : {}),
+	        };
+	        // AsyncIterableIterator to iterate over blobs
+	        const iter = this.listItems(updatedOptions);
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.listSegments(settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...updatedOptions,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for ContainerListBlobHierarchySegmentResponse
+	     *
+	     * @param delimiter - The character or string used to define the virtual hierarchy
+	     * @param marker - A string value that identifies the portion of
+	     *                          the list of blobs to be returned with the next listing operation. The
+	     *                          operation returns the ContinuationToken value within the response body if the
+	     *                          listing operation did not return all blobs remaining to be listed
+	     *                          with the current page. The ContinuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of list
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to list blobs operation.
+	     */
+	    async *listHierarchySegments(delimiter, marker, options = {}) {
+	        let listBlobsHierarchySegmentResponse;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                listBlobsHierarchySegmentResponse = await this.listBlobHierarchySegment(delimiter, marker, options);
+	                marker = listBlobsHierarchySegmentResponse.continuationToken;
+	                yield await listBlobsHierarchySegmentResponse;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for {@link BlobPrefix} and {@link BlobItem} objects.
+	     *
+	     * @param delimiter - The character or string used to define the virtual hierarchy
+	     * @param options - Options to list blobs operation.
+	     */
+	    async *listItemsByHierarchy(delimiter, options = {}) {
+	        let marker;
+	        for await (const listBlobsHierarchySegmentResponse of this.listHierarchySegments(delimiter, marker, options)) {
+	            const segment = listBlobsHierarchySegmentResponse.segment;
+	            if (segment.blobPrefixes) {
+	                for (const prefix of segment.blobPrefixes) {
+	                    yield {
+	                        kind: "prefix",
+	                        ...prefix,
+	                    };
+	                }
+	            }
+	            for (const blob of segment.blobItems) {
+	                yield { kind: "blob", ...blob };
+	            }
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to list all the blobs by hierarchy.
+	     * under the specified account.
+	     *
+	     * .byPage() returns an async iterable iterator to list the blobs by hierarchy in pages.
+	     *
+	     * ```ts snippet:ReadmeSampleListBlobsByHierarchy
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     *
+	     * // Example using `for await` syntax
+	     * let i = 1;
+	     * const blobs = containerClient.listBlobsByHierarchy("/");
+	     * for await (const blob of blobs) {
+	     *   if (blob.kind === "prefix") {
+	     *     console.log(`\tBlobPrefix: ${blob.name}`);
+	     *   } else {
+	     *     console.log(`\tBlobItem: name - ${blob.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Example using `iter.next()` syntax
+	     * i = 1;
+	     * const iter = containerClient.listBlobsByHierarchy("/");
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   if (value.kind === "prefix") {
+	     *     console.log(`\tBlobPrefix: ${value.name}`);
+	     *   } else {
+	     *     console.log(`\tBlobItem: name - ${value.name}`);
+	     *   }
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Example using `byPage()` syntax
+	     * i = 1;
+	     * for await (const page of containerClient.listBlobsByHierarchy("/").byPage({ maxPageSize: 20 })) {
+	     *   const segment = page.segment;
+	     *   if (segment.blobPrefixes) {
+	     *     for (const prefix of segment.blobPrefixes) {
+	     *       console.log(`\tBlobPrefix: ${prefix.name}`);
+	     *     }
+	     *   }
+	     *   for (const blob of page.segment.blobItems) {
+	     *     console.log(`\tBlobItem: name - ${blob.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Example using paging with a marker
+	     * i = 1;
+	     * let iterator = containerClient.listBlobsByHierarchy("/").byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     * // Prints 2 blob names
+	     * if (response.blobPrefixes) {
+	     *   for (const prefix of response.blobPrefixes) {
+	     *     console.log(`\tBlobPrefix: ${prefix.name}`);
+	     *   }
+	     * }
+	     * if (response.segment.blobItems) {
+	     *   for (const blob of response.segment.blobItems) {
+	     *     console.log(`\tBlobItem: name - ${blob.name}`);
+	     *   }
+	     * }
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = containerClient
+	     *   .listBlobsByHierarchy("/")
+	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     * // Prints 10 blob names
+	     * if (response.blobPrefixes) {
+	     *   for (const prefix of response.blobPrefixes) {
+	     *     console.log(`\tBlobPrefix: ${prefix.name}`);
+	     *   }
+	     * }
+	     * if (response.segment.blobItems) {
+	     *   for (const blob of response.segment.blobItems) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param delimiter - The character or string used to define the virtual hierarchy
+	     * @param options - Options to list blobs operation.
+	     */
+	    listBlobsByHierarchy(delimiter, options = {}) {
+	        if (delimiter === "") {
+	            throw new RangeError("delimiter should contain one or more characters");
+	        }
+	        const include = [];
+	        if (options.includeCopy) {
+	            include.push("copy");
+	        }
+	        if (options.includeDeleted) {
+	            include.push("deleted");
+	        }
+	        if (options.includeMetadata) {
+	            include.push("metadata");
+	        }
+	        if (options.includeSnapshots) {
+	            include.push("snapshots");
+	        }
+	        if (options.includeVersions) {
+	            include.push("versions");
+	        }
+	        if (options.includeUncommitedBlobs) {
+	            include.push("uncommittedblobs");
+	        }
+	        if (options.includeTags) {
+	            include.push("tags");
+	        }
+	        if (options.includeDeletedWithVersions) {
+	            include.push("deletedwithversions");
+	        }
+	        if (options.includeImmutabilityPolicy) {
+	            include.push("immutabilitypolicy");
+	        }
+	        if (options.includeLegalHold) {
+	            include.push("legalhold");
+	        }
+	        if (options.prefix === "") {
+	            options.prefix = undefined;
+	        }
+	        const updatedOptions = {
+	            ...options,
+	            ...(include.length > 0 ? { include: include } : {}),
+	        };
+	        // AsyncIterableIterator to iterate over blob prefixes and blobs
+	        const iter = this.listItemsByHierarchy(delimiter, updatedOptions);
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            async next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.listHierarchySegments(delimiter, settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...updatedOptions,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * The Filter Blobs operation enables callers to list blobs in the container whose tags
+	     * match a given search expression.
+	     *
+	     * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                        The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                        The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                        however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param marker - A string value that identifies the portion of
+	     *                          the list of blobs to be returned with the next listing operation. The
+	     *                          operation returns the continuationToken value within the response body if the
+	     *                          listing operation did not return all blobs remaining to be listed
+	     *                          with the current page. The continuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of list
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to find blobs by tags.
+	     */
+	    async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-findBlobsByTagsSegment", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_1.assertResponse)(await this.containerContext.filterBlobs({
+	                abortSignal: options.abortSignal,
+	                where: tagFilterSqlExpression,
+	                marker,
+	                maxPageSize: options.maxPageSize,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const wrappedResponse = {
+	                ...response,
+	                _response: response._response, // _response is made non-enumerable
+	                blobs: response.blobs.map((blob) => {
+	                    let tagValue = "";
+	                    if (blob.tags?.blobTagSet.length === 1) {
+	                        tagValue = blob.tags.blobTagSet[0].value;
+	                    }
+	                    return { ...blob, tags: (0, utils_common_js_1.toTags)(blob.tags), tagValue };
+	                }),
+	            };
+	            return wrappedResponse;
+	        });
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for ContainerFindBlobsByTagsSegmentResponse.
+	     *
+	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param marker - A string value that identifies the portion of
+	     *                          the list of blobs to be returned with the next listing operation. The
+	     *                          operation returns the continuationToken value within the response body if the
+	     *                          listing operation did not return all blobs remaining to be listed
+	     *                          with the current page. The continuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of list
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to find blobs by tags.
+	     */
+	    async *findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
+	        let response;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                response = await this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options);
+	                response.blobs = response.blobs || [];
+	                marker = response.continuationToken;
+	                yield response;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for blobs.
+	     *
+	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param options - Options to findBlobsByTagsItems.
+	     */
+	    async *findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
+	        let marker;
+	        for await (const segment of this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)) {
+	            yield* segment.blobs;
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to find all blobs with specified tag
+	     * under the specified container.
+	     *
+	     * .byPage() returns an async iterable iterator to list the blobs in pages.
+	     *
+	     * Example using `for await` syntax:
+	     *
+	     * ```ts snippet:ReadmeSampleFindBlobsByTags
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerName = "";
+	     * const containerClient = blobServiceClient.getContainerClient(containerName);
+	     *
+	     * // Example using `for await` syntax
+	     * let i = 1;
+	     * for await (const blob of containerClient.findBlobsByTags("tagkey='tagvalue'")) {
+	     *   console.log(`Blob ${i++}: ${blob.name}`);
+	     * }
+	     *
+	     * // Example using `iter.next()` syntax
+	     * i = 1;
+	     * const iter = containerClient.findBlobsByTags("tagkey='tagvalue'");
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   console.log(`Blob ${i++}: ${value.name}`);
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Example using `byPage()` syntax
+	     * i = 1;
+	     * for await (const page of containerClient
+	     *   .findBlobsByTags("tagkey='tagvalue'")
+	     *   .byPage({ maxPageSize: 20 })) {
+	     *   for (const blob of page.blobs) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Example using paging with a marker
+	     * i = 1;
+	     * let iterator = containerClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     * // Prints 2 blob names
+	     * if (response.blobs) {
+	     *   for (const blob of response.blobs) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = containerClient
+	     *   .findBlobsByTags("tagkey='tagvalue'")
+	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     * // Prints 10 blob names
+	     * if (response.blobs) {
+	     *   for (const blob of response.blobs) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param options - Options to find blobs by tags.
+	     */
+	    findBlobsByTags(tagFilterSqlExpression, options = {}) {
+	        // AsyncIterableIterator to iterate over blobs
+	        const listSegmentOptions = {
+	            ...options,
+	        };
+	        const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...listSegmentOptions,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * The Get Account Information operation returns the sku name and account kind
+	     * for the specified account.
+	     * The Get Account Information operation is available on service versions beginning
+	     * with version 2018-03-28.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
+	     *
+	     * @param options - Options to the Service Get Account Info operation.
+	     * @returns Response data for the Service Get Account Info operation.
+	     */
+	    async getAccountInfo(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("ContainerClient-getAccountInfo", options, async (updatedOptions) => {
+	            return (0, utils_common_js_1.assertResponse)(await this.containerContext.getAccountInfo({
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    getContainerNameFromUrl() {
+	        let containerName;
+	        try {
+	            //  URL may look like the following
+	            // "https://myaccount.blob.core.windows.net/mycontainer?sasString";
+	            // "https://myaccount.blob.core.windows.net/mycontainer";
+	            // IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername`
+	            // http://localhost:10001/devstoreaccount1/containername
+	            const parsedUrl = new URL(this.url);
+	            if (parsedUrl.hostname.split(".")[1] === "blob") {
+	                // "https://myaccount.blob.core.windows.net/containername".
+	                // "https://customdomain.com/containername".
+	                // .getPath() -> /containername
+	                containerName = parsedUrl.pathname.split("/")[1];
+	            }
+	            else if ((0, utils_common_js_1.isIpEndpointStyle)(parsedUrl)) {
+	                // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername
+	                // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername
+	                // .getPath() -> /devstoreaccount1/containername
+	                containerName = parsedUrl.pathname.split("/")[2];
+	            }
+	            else {
+	                // "https://customdomain.com/containername".
+	                // .getPath() -> /containername
+	                containerName = parsedUrl.pathname.split("/")[1];
+	            }
+	            // decode the encoded containerName - to get all the special characters that might be present in it
+	            containerName = decodeURIComponent(containerName);
+	            if (!containerName) {
+	                throw new Error("Provided containerName is invalid.");
+	            }
+	            return containerName;
+	        }
+	        catch (error) {
+	            throw new Error("Unable to extract containerName with provided information.");
+	        }
+	    }
+	    /**
+	     * Only available for ContainerClient constructed with a shared key credential.
+	     *
+	     * Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties
+	     * and parameters passed in. The SAS is signed by the shared key credential of the client.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateSasUrl(options) {
+	        return new Promise((resolve) => {
+	            if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
+	                throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
+	            }
+	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
+	                containerName: this._containerName,
+	                ...options,
+	            }, this.credential).toString();
+	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
+	        });
+	    }
+	    /**
+	     * Only available for ContainerClient constructed with a shared key credential.
+	     *
+	     * Generates string to sign for a Blob Container Service Shared Access Signature (SAS) URI
+	     * based on the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    generateSasStringToSign(options) {
+	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
+	            throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
+	        }
+	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
+	            containerName: this._containerName,
+	            ...options,
+	        }, this.credential).stringToSign;
+	    }
+	    /**
+	     * Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties
+	     * and parameters passed in. The SAS is signed by the input user delegation key.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateUserDelegationSasUrl(options, userDelegationKey) {
+	        return new Promise((resolve) => {
+	            const sas = (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParameters)({
+	                containerName: this._containerName,
+	                ...options,
+	            }, userDelegationKey, this.accountName).toString();
+	            resolve((0, utils_common_js_1.appendToURLQuery)(this.url, sas));
+	        });
+	    }
+	    /**
+	     * Generates string to sign for a Blob Container Service Shared Access Signature (SAS) URI
+	     * based on the client properties and parameters passed in. The SAS is signed by the input user delegation key.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
+	     *
+	     * @param options - Optional parameters.
+	     * @param userDelegationKey -  Return value of `blobServiceClient.getUserDelegationKey()`
+	     * @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateUserDelegationSasStringToSign(options, userDelegationKey) {
+	        return (0, BlobSASSignatureValues_js_1.generateBlobSASQueryParametersInternal)({
+	            containerName: this._containerName,
+	            ...options,
+	        }, userDelegationKey, this.accountName).stringToSign;
+	    }
+	    /**
+	     * Creates a BlobBatchClient object to conduct batch operations.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
+	     *
+	     * @returns A new BlobBatchClient object for this container.
+	     */
+	    getBlobBatchClient() {
+	        return new BlobBatchClient_js_1.BlobBatchClient(this.url, this.pipeline);
+	    }
+	};
+	ContainerClient.ContainerClient = ContainerClient$1;
+	
+	return ContainerClient;
+}
+
+var AccountSASPermissions = {};
+
+var hasRequiredAccountSASPermissions;
+
+function requireAccountSASPermissions () {
+	if (hasRequiredAccountSASPermissions) return AccountSASPermissions;
+	hasRequiredAccountSASPermissions = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AccountSASPermissions, "__esModule", { value: true });
+	AccountSASPermissions.AccountSASPermissions = void 0;
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * This is a helper class to construct a string representing the permissions granted by an AccountSAS. Setting a value
+	 * to true means that any SAS which uses these permissions will grant permissions for that operation. Once all the
+	 * values are set, this should be serialized with toString and set as the permissions field on an
+	 * {@link AccountSASSignatureValues} object. It is possible to construct the permissions string without this class, but
+	 * the order of the permissions is particular and this class guarantees correctness.
+	 */
+	let AccountSASPermissions$1 = class AccountSASPermissions {
+	    /**
+	     * Parse initializes the AccountSASPermissions fields from a string.
+	     *
+	     * @param permissions -
+	     */
+	    static parse(permissions) {
+	        const accountSASPermissions = new AccountSASPermissions();
+	        for (const c of permissions) {
+	            switch (c) {
+	                case "r":
+	                    accountSASPermissions.read = true;
+	                    break;
+	                case "w":
+	                    accountSASPermissions.write = true;
+	                    break;
+	                case "d":
+	                    accountSASPermissions.delete = true;
+	                    break;
+	                case "x":
+	                    accountSASPermissions.deleteVersion = true;
+	                    break;
+	                case "l":
+	                    accountSASPermissions.list = true;
+	                    break;
+	                case "a":
+	                    accountSASPermissions.add = true;
+	                    break;
+	                case "c":
+	                    accountSASPermissions.create = true;
+	                    break;
+	                case "u":
+	                    accountSASPermissions.update = true;
+	                    break;
+	                case "p":
+	                    accountSASPermissions.process = true;
+	                    break;
+	                case "t":
+	                    accountSASPermissions.tag = true;
+	                    break;
+	                case "f":
+	                    accountSASPermissions.filter = true;
+	                    break;
+	                case "i":
+	                    accountSASPermissions.setImmutabilityPolicy = true;
+	                    break;
+	                case "y":
+	                    accountSASPermissions.permanentDelete = true;
+	                    break;
+	                default:
+	                    throw new RangeError(`Invalid permission character: ${c}`);
+	            }
+	        }
+	        return accountSASPermissions;
+	    }
+	    /**
+	     * Creates a {@link AccountSASPermissions} from a raw object which contains same keys as it
+	     * and boolean values for them.
+	     *
+	     * @param permissionLike -
+	     */
+	    static from(permissionLike) {
+	        const accountSASPermissions = new AccountSASPermissions();
+	        if (permissionLike.read) {
+	            accountSASPermissions.read = true;
+	        }
+	        if (permissionLike.write) {
+	            accountSASPermissions.write = true;
+	        }
+	        if (permissionLike.delete) {
+	            accountSASPermissions.delete = true;
+	        }
+	        if (permissionLike.deleteVersion) {
+	            accountSASPermissions.deleteVersion = true;
+	        }
+	        if (permissionLike.filter) {
+	            accountSASPermissions.filter = true;
+	        }
+	        if (permissionLike.tag) {
+	            accountSASPermissions.tag = true;
+	        }
+	        if (permissionLike.list) {
+	            accountSASPermissions.list = true;
+	        }
+	        if (permissionLike.add) {
+	            accountSASPermissions.add = true;
+	        }
+	        if (permissionLike.create) {
+	            accountSASPermissions.create = true;
+	        }
+	        if (permissionLike.update) {
+	            accountSASPermissions.update = true;
+	        }
+	        if (permissionLike.process) {
+	            accountSASPermissions.process = true;
+	        }
+	        if (permissionLike.setImmutabilityPolicy) {
+	            accountSASPermissions.setImmutabilityPolicy = true;
+	        }
+	        if (permissionLike.permanentDelete) {
+	            accountSASPermissions.permanentDelete = true;
+	        }
+	        return accountSASPermissions;
+	    }
+	    /**
+	     * Permission to read resources and list queues and tables granted.
+	     */
+	    read = false;
+	    /**
+	     * Permission to write resources granted.
+	     */
+	    write = false;
+	    /**
+	     * Permission to delete blobs and files granted.
+	     */
+	    delete = false;
+	    /**
+	     * Permission to delete versions granted.
+	     */
+	    deleteVersion = false;
+	    /**
+	     * Permission to list blob containers, blobs, shares, directories, and files granted.
+	     */
+	    list = false;
+	    /**
+	     * Permission to add messages, table entities, and append to blobs granted.
+	     */
+	    add = false;
+	    /**
+	     * Permission to create blobs and files granted.
+	     */
+	    create = false;
+	    /**
+	     * Permissions to update messages and table entities granted.
+	     */
+	    update = false;
+	    /**
+	     * Permission to get and delete messages granted.
+	     */
+	    process = false;
+	    /**
+	     * Specfies Tag access granted.
+	     */
+	    tag = false;
+	    /**
+	     * Permission to filter blobs.
+	     */
+	    filter = false;
+	    /**
+	     * Permission to set immutability policy.
+	     */
+	    setImmutabilityPolicy = false;
+	    /**
+	     * Specifies that Permanent Delete is permitted.
+	     */
+	    permanentDelete = false;
+	    /**
+	     * Produces the SAS permissions string for an Azure Storage account.
+	     * Call this method to set AccountSASSignatureValues Permissions field.
+	     *
+	     * Using this method will guarantee the resource types are in
+	     * an order accepted by the service.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
+	     *
+	     */
+	    toString() {
+	        // The order of the characters should be as specified here to ensure correctness:
+	        // https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
+	        // Use a string array instead of string concatenating += operator for performance
+	        const permissions = [];
+	        if (this.read) {
+	            permissions.push("r");
+	        }
+	        if (this.write) {
+	            permissions.push("w");
+	        }
+	        if (this.delete) {
+	            permissions.push("d");
+	        }
+	        if (this.deleteVersion) {
+	            permissions.push("x");
+	        }
+	        if (this.filter) {
+	            permissions.push("f");
+	        }
+	        if (this.tag) {
+	            permissions.push("t");
+	        }
+	        if (this.list) {
+	            permissions.push("l");
+	        }
+	        if (this.add) {
+	            permissions.push("a");
+	        }
+	        if (this.create) {
+	            permissions.push("c");
+	        }
+	        if (this.update) {
+	            permissions.push("u");
+	        }
+	        if (this.process) {
+	            permissions.push("p");
+	        }
+	        if (this.setImmutabilityPolicy) {
+	            permissions.push("i");
+	        }
+	        if (this.permanentDelete) {
+	            permissions.push("y");
+	        }
+	        return permissions.join("");
+	    }
+	};
+	AccountSASPermissions.AccountSASPermissions = AccountSASPermissions$1;
+	
+	return AccountSASPermissions;
+}
+
+var AccountSASSignatureValues = {};
+
+var AccountSASResourceTypes = {};
+
+var hasRequiredAccountSASResourceTypes;
+
+function requireAccountSASResourceTypes () {
+	if (hasRequiredAccountSASResourceTypes) return AccountSASResourceTypes;
+	hasRequiredAccountSASResourceTypes = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AccountSASResourceTypes, "__esModule", { value: true });
+	AccountSASResourceTypes.AccountSASResourceTypes = void 0;
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * This is a helper class to construct a string representing the resources accessible by an AccountSAS. Setting a value
+	 * to true means that any SAS which uses these permissions will grant access to that resource type. Once all the
+	 * values are set, this should be serialized with toString and set as the resources field on an
+	 * {@link AccountSASSignatureValues} object. It is possible to construct the resources string without this class, but
+	 * the order of the resources is particular and this class guarantees correctness.
+	 */
+	let AccountSASResourceTypes$1 = class AccountSASResourceTypes {
+	    /**
+	     * Creates an {@link AccountSASResourceTypes} from the specified resource types string. This method will throw an
+	     * Error if it encounters a character that does not correspond to a valid resource type.
+	     *
+	     * @param resourceTypes -
+	     */
+	    static parse(resourceTypes) {
+	        const accountSASResourceTypes = new AccountSASResourceTypes();
+	        for (const c of resourceTypes) {
+	            switch (c) {
+	                case "s":
+	                    accountSASResourceTypes.service = true;
+	                    break;
+	                case "c":
+	                    accountSASResourceTypes.container = true;
+	                    break;
+	                case "o":
+	                    accountSASResourceTypes.object = true;
+	                    break;
+	                default:
+	                    throw new RangeError(`Invalid resource type: ${c}`);
+	            }
+	        }
+	        return accountSASResourceTypes;
+	    }
+	    /**
+	     * Permission to access service level APIs granted.
+	     */
+	    service = false;
+	    /**
+	     * Permission to access container level APIs (Blob Containers, Tables, Queues, File Shares) granted.
+	     */
+	    container = false;
+	    /**
+	     * Permission to access object level APIs (Blobs, Table Entities, Queue Messages, Files) granted.
+	     */
+	    object = false;
+	    /**
+	     * Converts the given resource types to a string.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
+	     *
+	     */
+	    toString() {
+	        const resourceTypes = [];
+	        if (this.service) {
+	            resourceTypes.push("s");
+	        }
+	        if (this.container) {
+	            resourceTypes.push("c");
+	        }
+	        if (this.object) {
+	            resourceTypes.push("o");
+	        }
+	        return resourceTypes.join("");
+	    }
+	};
+	AccountSASResourceTypes.AccountSASResourceTypes = AccountSASResourceTypes$1;
+	
+	return AccountSASResourceTypes;
+}
+
+var AccountSASServices = {};
+
+var hasRequiredAccountSASServices;
+
+function requireAccountSASServices () {
+	if (hasRequiredAccountSASServices) return AccountSASServices;
+	hasRequiredAccountSASServices = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AccountSASServices, "__esModule", { value: true });
+	AccountSASServices.AccountSASServices = void 0;
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * This is a helper class to construct a string representing the services accessible by an AccountSAS. Setting a value
+	 * to true means that any SAS which uses these permissions will grant access to that service. Once all the
+	 * values are set, this should be serialized with toString and set as the services field on an
+	 * {@link AccountSASSignatureValues} object. It is possible to construct the services string without this class, but
+	 * the order of the services is particular and this class guarantees correctness.
+	 */
+	let AccountSASServices$1 = class AccountSASServices {
+	    /**
+	     * Creates an {@link AccountSASServices} from the specified services string. This method will throw an
+	     * Error if it encounters a character that does not correspond to a valid service.
+	     *
+	     * @param services -
+	     */
+	    static parse(services) {
+	        const accountSASServices = new AccountSASServices();
+	        for (const c of services) {
+	            switch (c) {
+	                case "b":
+	                    accountSASServices.blob = true;
+	                    break;
+	                case "f":
+	                    accountSASServices.file = true;
+	                    break;
+	                case "q":
+	                    accountSASServices.queue = true;
+	                    break;
+	                case "t":
+	                    accountSASServices.table = true;
+	                    break;
+	                default:
+	                    throw new RangeError(`Invalid service character: ${c}`);
+	            }
+	        }
+	        return accountSASServices;
+	    }
+	    /**
+	     * Permission to access blob resources granted.
+	     */
+	    blob = false;
+	    /**
+	     * Permission to access file resources granted.
+	     */
+	    file = false;
+	    /**
+	     * Permission to access queue resources granted.
+	     */
+	    queue = false;
+	    /**
+	     * Permission to access table resources granted.
+	     */
+	    table = false;
+	    /**
+	     * Converts the given services to a string.
+	     *
+	     */
+	    toString() {
+	        const services = [];
+	        if (this.blob) {
+	            services.push("b");
+	        }
+	        if (this.table) {
+	            services.push("t");
+	        }
+	        if (this.queue) {
+	            services.push("q");
+	        }
+	        if (this.file) {
+	            services.push("f");
+	        }
+	        return services.join("");
+	    }
+	};
+	AccountSASServices.AccountSASServices = AccountSASServices$1;
+	
+	return AccountSASServices;
+}
+
+var hasRequiredAccountSASSignatureValues;
+
+function requireAccountSASSignatureValues () {
+	if (hasRequiredAccountSASSignatureValues) return AccountSASSignatureValues;
+	hasRequiredAccountSASSignatureValues = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(AccountSASSignatureValues, "__esModule", { value: true });
+	AccountSASSignatureValues.generateAccountSASQueryParameters = generateAccountSASQueryParameters;
+	AccountSASSignatureValues.generateAccountSASQueryParametersInternal = generateAccountSASQueryParametersInternal;
+	const AccountSASPermissions_js_1 = requireAccountSASPermissions();
+	const AccountSASResourceTypes_js_1 = requireAccountSASResourceTypes();
+	const AccountSASServices_js_1 = requireAccountSASServices();
+	const SasIPRange_js_1 = requireSasIPRange();
+	const SASQueryParameters_js_1 = requireSASQueryParameters();
+	const constants_js_1 = requireConstants$8();
+	const utils_common_js_1 = requireUtils_common$2();
+	/**
+	 * ONLY AVAILABLE IN NODE.JS RUNTIME.
+	 *
+	 * Generates a {@link SASQueryParameters} object which contains all SAS query parameters needed to make an actual
+	 * REST request.
+	 *
+	 * @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
+	 *
+	 * @param accountSASSignatureValues -
+	 * @param sharedKeyCredential -
+	 */
+	function generateAccountSASQueryParameters(accountSASSignatureValues, sharedKeyCredential) {
+	    return generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential)
+	        .sasQueryParameters;
+	}
+	function generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential) {
+	    const version = accountSASSignatureValues.version
+	        ? accountSASSignatureValues.version
+	        : constants_js_1.SERVICE_VERSION;
+	    if (accountSASSignatureValues.permissions &&
+	        accountSASSignatureValues.permissions.setImmutabilityPolicy &&
+	        version < "2020-08-04") {
+	        throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission.");
+	    }
+	    if (accountSASSignatureValues.permissions &&
+	        accountSASSignatureValues.permissions.deleteVersion &&
+	        version < "2019-10-10") {
+	        throw RangeError("'version' must be >= '2019-10-10' when provided 'x' permission.");
+	    }
+	    if (accountSASSignatureValues.permissions &&
+	        accountSASSignatureValues.permissions.permanentDelete &&
+	        version < "2019-10-10") {
+	        throw RangeError("'version' must be >= '2019-10-10' when provided 'y' permission.");
+	    }
+	    if (accountSASSignatureValues.permissions &&
+	        accountSASSignatureValues.permissions.tag &&
+	        version < "2019-12-12") {
+	        throw RangeError("'version' must be >= '2019-12-12' when provided 't' permission.");
+	    }
+	    if (accountSASSignatureValues.permissions &&
+	        accountSASSignatureValues.permissions.filter &&
+	        version < "2019-12-12") {
+	        throw RangeError("'version' must be >= '2019-12-12' when provided 'f' permission.");
+	    }
+	    if (accountSASSignatureValues.encryptionScope && version < "2020-12-06") {
+	        throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS.");
+	    }
+	    const parsedPermissions = AccountSASPermissions_js_1.AccountSASPermissions.parse(accountSASSignatureValues.permissions.toString());
+	    const parsedServices = AccountSASServices_js_1.AccountSASServices.parse(accountSASSignatureValues.services).toString();
+	    const parsedResourceTypes = AccountSASResourceTypes_js_1.AccountSASResourceTypes.parse(accountSASSignatureValues.resourceTypes).toString();
+	    let stringToSign;
+	    if (version >= "2020-12-06") {
+	        stringToSign = [
+	            sharedKeyCredential.accountName,
+	            parsedPermissions,
+	            parsedServices,
+	            parsedResourceTypes,
+	            accountSASSignatureValues.startsOn
+	                ? (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.startsOn, false)
+	                : "",
+	            (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.expiresOn, false),
+	            accountSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(accountSASSignatureValues.ipRange) : "",
+	            accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",
+	            version,
+	            accountSASSignatureValues.encryptionScope ? accountSASSignatureValues.encryptionScope : "",
+	            "", // Account SAS requires an additional newline character
+	        ].join("\n");
+	    }
+	    else {
+	        stringToSign = [
+	            sharedKeyCredential.accountName,
+	            parsedPermissions,
+	            parsedServices,
+	            parsedResourceTypes,
+	            accountSASSignatureValues.startsOn
+	                ? (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.startsOn, false)
+	                : "",
+	            (0, utils_common_js_1.truncatedISO8061Date)(accountSASSignatureValues.expiresOn, false),
+	            accountSASSignatureValues.ipRange ? (0, SasIPRange_js_1.ipRangeToString)(accountSASSignatureValues.ipRange) : "",
+	            accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",
+	            version,
+	            "", // Account SAS requires an additional newline character
+	        ].join("\n");
+	    }
+	    const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
+	    return {
+	        sasQueryParameters: new SASQueryParameters_js_1.SASQueryParameters(version, signature, parsedPermissions.toString(), parsedServices, parsedResourceTypes, accountSASSignatureValues.protocol, accountSASSignatureValues.startsOn, accountSASSignatureValues.expiresOn, accountSASSignatureValues.ipRange, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, accountSASSignatureValues.encryptionScope),
+	        stringToSign: stringToSign,
+	    };
+	}
+	
+	return AccountSASSignatureValues;
+}
+
+var hasRequiredBlobServiceClient;
+
+function requireBlobServiceClient () {
+	if (hasRequiredBlobServiceClient) return BlobServiceClient;
+	hasRequiredBlobServiceClient = 1;
+	Object.defineProperty(BlobServiceClient, "__esModule", { value: true });
+	BlobServiceClient.BlobServiceClient = void 0;
+	const core_auth_1 = /*@__PURE__*/ requireCommonjs$8();
+	const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+	const core_util_1 = /*@__PURE__*/ requireCommonjs$b();
+	const Pipeline_js_1 = requirePipeline();
+	const ContainerClient_js_1 = requireContainerClient();
+	const utils_common_js_1 = requireUtils_common$2();
+	const StorageSharedKeyCredential_js_1 = requireStorageSharedKeyCredential$1();
+	const AnonymousCredential_js_1 = requireAnonymousCredential$1();
+	const utils_common_js_2 = requireUtils_common$2();
+	const tracing_js_1 = requireTracing();
+	const BlobBatchClient_js_1 = requireBlobBatchClient();
+	const StorageClient_js_1 = requireStorageClient();
+	const AccountSASPermissions_js_1 = requireAccountSASPermissions();
+	const AccountSASSignatureValues_js_1 = requireAccountSASSignatureValues();
+	const AccountSASServices_js_1 = requireAccountSASServices();
+	/**
+	 * A BlobServiceClient represents a Client to the Azure Storage Blob service allowing you
+	 * to manipulate blob containers.
+	 */
+	let BlobServiceClient$1 = class BlobServiceClient extends StorageClient_js_1.StorageClient {
+	    /**
+	     * serviceContext provided by protocol layer.
+	     */
+	    serviceContext;
+	    /**
+	     *
+	     * Creates an instance of BlobServiceClient from connection string.
+	     *
+	     * @param connectionString - Account connection string or a SAS connection string of an Azure storage account.
+	     *                                  [ Note - Account connection string can only be used in NODE.JS runtime. ]
+	     *                                  Account connection string example -
+	     *                                  `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`
+	     *                                  SAS connection string example -
+	     *                                  `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`
+	     * @param options - Optional. Options to configure the HTTP pipeline.
+	     */
+	    static fromConnectionString(connectionString, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        options = options || {};
+	        const extractedCreds = (0, utils_common_js_1.extractConnectionStringParts)(connectionString);
+	        if (extractedCreds.kind === "AccountConnString") {
+	            if (core_util_1.isNodeLike) {
+	                const sharedKeyCredential = new StorageSharedKeyCredential_js_1.StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
+	                if (!options.proxyOptions) {
+	                    options.proxyOptions = (0, core_rest_pipeline_1.getDefaultProxySettings)(extractedCreds.proxyUri);
+	                }
+	                const pipeline = (0, Pipeline_js_1.newPipeline)(sharedKeyCredential, options);
+	                return new BlobServiceClient(extractedCreds.url, pipeline);
+	            }
+	            else {
+	                throw new Error("Account connection string is only supported in Node.js environment");
+	            }
+	        }
+	        else if (extractedCreds.kind === "SASConnString") {
+	            const pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	            return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline);
+	        }
+	        else {
+	            throw new Error("Connection string must be either an Account connection string or a SAS connection string");
+	        }
+	    }
+	    constructor(url, credentialOrPipeline, 
+	    // Legacy, no fix for eslint error without breaking. Disable it for this interface.
+	    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
+	    options) {
+	        let pipeline;
+	        if ((0, Pipeline_js_1.isPipelineLike)(credentialOrPipeline)) {
+	            pipeline = credentialOrPipeline;
+	        }
+	        else if ((core_util_1.isNodeLike && credentialOrPipeline instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential) ||
+	            credentialOrPipeline instanceof AnonymousCredential_js_1.AnonymousCredential ||
+	            (0, core_auth_1.isTokenCredential)(credentialOrPipeline)) {
+	            pipeline = (0, Pipeline_js_1.newPipeline)(credentialOrPipeline, options);
+	        }
+	        else {
+	            // The second parameter is undefined. Use anonymous credential
+	            pipeline = (0, Pipeline_js_1.newPipeline)(new AnonymousCredential_js_1.AnonymousCredential(), options);
+	        }
+	        super(url, pipeline);
+	        this.serviceContext = this.storageClientContext.service;
+	    }
+	    /**
+	     * Creates a {@link ContainerClient} object
+	     *
+	     * @param containerName - A container name
+	     * @returns A new ContainerClient object for the given container name.
+	     *
+	     * Example usage:
+	     *
+	     * ```ts snippet:BlobServiceClientGetContainerClient
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * const containerClient = blobServiceClient.getContainerClient("");
+	     * ```
+	     */
+	    getContainerClient(containerName) {
+	        return new ContainerClient_js_1.ContainerClient((0, utils_common_js_1.appendToURLPath)(this.url, encodeURIComponent(containerName)), this.pipeline);
+	    }
+	    /**
+	     * Create a Blob container. @see https://learn.microsoft.com/rest/api/storageservices/create-container
+	     *
+	     * @param containerName - Name of the container to create.
+	     * @param options - Options to configure Container Create operation.
+	     * @returns Container creation response and the corresponding container client.
+	     */
+	    async createContainer(containerName, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-createContainer", options, async (updatedOptions) => {
+	            const containerClient = this.getContainerClient(containerName);
+	            const containerCreateResponse = await containerClient.create(updatedOptions);
+	            return {
+	                containerClient,
+	                containerCreateResponse,
+	            };
+	        });
+	    }
+	    /**
+	     * Deletes a Blob container.
+	     *
+	     * @param containerName - Name of the container to delete.
+	     * @param options - Options to configure Container Delete operation.
+	     * @returns Container deletion response.
+	     */
+	    async deleteContainer(containerName, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-deleteContainer", options, async (updatedOptions) => {
+	            const containerClient = this.getContainerClient(containerName);
+	            return containerClient.delete(updatedOptions);
+	        });
+	    }
+	    /**
+	     * Restore a previously deleted Blob container.
+	     * This API is only functional if Container Soft Delete is enabled for the storage account associated with the container.
+	     *
+	     * @param deletedContainerName - Name of the previously deleted container.
+	     * @param deletedContainerVersion - Version of the previously deleted container, used to uniquely identify the deleted container.
+	     * @param options - Options to configure Container Restore operation.
+	     * @returns Container deletion response.
+	     */
+	    async undeleteContainer(deletedContainerName, deletedContainerVersion, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-undeleteContainer", options, async (updatedOptions) => {
+	            const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName);
+	            // Hack to access a protected member.
+	            const containerContext = containerClient["storageClientContext"].container;
+	            const containerUndeleteResponse = (0, utils_common_js_2.assertResponse)(await containerContext.restore({
+	                deletedContainerName,
+	                deletedContainerVersion,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            return { containerClient, containerUndeleteResponse };
+	        });
+	    }
+	    /**
+	     * Gets the properties of a storage account’s Blob service, including properties
+	     * for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-properties
+	     *
+	     * @param options - Options to the Service Get Properties operation.
+	     * @returns Response data for the Service Get Properties operation.
+	     */
+	    async getProperties(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getProperties", options, async (updatedOptions) => {
+	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.getProperties({
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Sets properties for a storage account’s Blob service endpoint, including properties
+	     * for Storage Analytics, CORS (Cross-Origin Resource Sharing) rules and soft delete settings.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/set-blob-service-properties
+	     *
+	     * @param properties -
+	     * @param options - Options to the Service Set Properties operation.
+	     * @returns Response data for the Service Set Properties operation.
+	     */
+	    async setProperties(properties, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-setProperties", options, async (updatedOptions) => {
+	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.setProperties(properties, {
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Retrieves statistics related to replication for the Blob service. It is only
+	     * available on the secondary location endpoint when read-access geo-redundant
+	     * replication is enabled for the storage account.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-stats
+	     *
+	     * @param options - Options to the Service Get Statistics operation.
+	     * @returns Response data for the Service Get Statistics operation.
+	     */
+	    async getStatistics(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getStatistics", options, async (updatedOptions) => {
+	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.getStatistics({
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The Get Account Information operation returns the sku name and account kind
+	     * for the specified account.
+	     * The Get Account Information operation is available on service versions beginning
+	     * with version 2018-03-28.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
+	     *
+	     * @param options - Options to the Service Get Account Info operation.
+	     * @returns Response data for the Service Get Account Info operation.
+	     */
+	    async getAccountInfo(options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getAccountInfo", options, async (updatedOptions) => {
+	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.getAccountInfo({
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * Returns a list of the containers under the specified account.
+	     * @see https://learn.microsoft.com/rest/api/storageservices/list-containers2
+	     *
+	     * @param marker - A string value that identifies the portion of
+	     *                        the list of containers to be returned with the next listing operation. The
+	     *                        operation returns the continuationToken value within the response body if the
+	     *                        listing operation did not return all containers remaining to be listed
+	     *                        with the current page. The continuationToken value can be used as the value for
+	     *                        the marker parameter in a subsequent call to request the next page of list
+	     *                        items. The marker value is opaque to the client.
+	     * @param options - Options to the Service List Container Segment operation.
+	     * @returns Response data for the Service List Container Segment operation.
+	     */
+	    async listContainersSegment(marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-listContainersSegment", options, async (updatedOptions) => {
+	            return (0, utils_common_js_2.assertResponse)(await this.serviceContext.listContainersSegment({
+	                abortSignal: options.abortSignal,
+	                marker,
+	                ...options,
+	                include: typeof options.include === "string" ? [options.include] : options.include,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	        });
+	    }
+	    /**
+	     * The Filter Blobs operation enables callers to list blobs across all containers whose tags
+	     * match a given search expression. Filter blobs searches across all containers within a
+	     * storage account but can be scoped within the expression to a single container.
+	     *
+	     * @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                        The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                        The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                        however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param marker - A string value that identifies the portion of
+	     *                          the list of blobs to be returned with the next listing operation. The
+	     *                          operation returns the continuationToken value within the response body if the
+	     *                          listing operation did not return all blobs remaining to be listed
+	     *                          with the current page. The continuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of list
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to find blobs by tags.
+	     */
+	    async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-findBlobsByTagsSegment", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_2.assertResponse)(await this.serviceContext.filterBlobs({
+	                abortSignal: options.abortSignal,
+	                where: tagFilterSqlExpression,
+	                marker,
+	                maxPageSize: options.maxPageSize,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const wrappedResponse = {
+	                ...response,
+	                _response: response._response, // _response is made non-enumerable
+	                blobs: response.blobs.map((blob) => {
+	                    let tagValue = "";
+	                    if (blob.tags?.blobTagSet.length === 1) {
+	                        tagValue = blob.tags.blobTagSet[0].value;
+	                    }
+	                    return { ...blob, tags: (0, utils_common_js_1.toTags)(blob.tags), tagValue };
+	                }),
+	            };
+	            return wrappedResponse;
+	        });
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for ServiceFindBlobsByTagsSegmentResponse.
+	     *
+	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param marker - A string value that identifies the portion of
+	     *                          the list of blobs to be returned with the next listing operation. The
+	     *                          operation returns the continuationToken value within the response body if the
+	     *                          listing operation did not return all blobs remaining to be listed
+	     *                          with the current page. The continuationToken value can be used as the value for
+	     *                          the marker parameter in a subsequent call to request the next page of list
+	     *                          items. The marker value is opaque to the client.
+	     * @param options - Options to find blobs by tags.
+	     */
+	    async *findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
+	        let response;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                response = await this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options);
+	                response.blobs = response.blobs || [];
+	                marker = response.continuationToken;
+	                yield response;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for blobs.
+	     *
+	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param options - Options to findBlobsByTagsItems.
+	     */
+	    async *findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
+	        let marker;
+	        for await (const segment of this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)) {
+	            yield* segment.blobs;
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to find all blobs with specified tag
+	     * under the specified account.
+	     *
+	     * .byPage() returns an async iterable iterator to list the blobs in pages.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-properties
+	     *
+	     * ```ts snippet:BlobServiceClientFindBlobsByTags
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * // Use for await to iterate the blobs
+	     * let i = 1;
+	     * for await (const blob of blobServiceClient.findBlobsByTags("tagkey='tagvalue'")) {
+	     *   console.log(`Blob ${i++}: ${blob.name}`);
+	     * }
+	     *
+	     * // Use iter.next() to iterate the blobs
+	     * i = 1;
+	     * const iter = blobServiceClient.findBlobsByTags("tagkey='tagvalue'");
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   console.log(`Blob ${i++}: ${value.name}`);
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Use byPage() to iterate the blobs
+	     * i = 1;
+	     * for await (const page of blobServiceClient
+	     *   .findBlobsByTags("tagkey='tagvalue'")
+	     *   .byPage({ maxPageSize: 20 })) {
+	     *   for (const blob of page.blobs) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Use paging with a marker
+	     * i = 1;
+	     * let iterator = blobServiceClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     * // Prints 2 blob names
+	     * if (response.blobs) {
+	     *   for (const blob of response.blobs) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = blobServiceClient
+	     *   .findBlobsByTags("tagkey='tagvalue'")
+	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     *
+	     * // Prints blob names
+	     * if (response.blobs) {
+	     *   for (const blob of response.blobs) {
+	     *     console.log(`Blob ${i++}: ${blob.name}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param tagFilterSqlExpression -  The where parameter enables the caller to query blobs whose tags match a given expression.
+	     *                                         The given expression must evaluate to true for a blob to be returned in the results.
+	     *                                         The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
+	     *                                         however, only a subset of the OData filter syntax is supported in the Blob service.
+	     * @param options - Options to find blobs by tags.
+	     */
+	    findBlobsByTags(tagFilterSqlExpression, options = {}) {
+	        // AsyncIterableIterator to iterate over blobs
+	        const listSegmentOptions = {
+	            ...options,
+	        };
+	        const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...listSegmentOptions,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for ServiceListContainersSegmentResponses
+	     *
+	     * @param marker - A string value that identifies the portion of
+	     *                        the list of containers to be returned with the next listing operation. The
+	     *                        operation returns the continuationToken value within the response body if the
+	     *                        listing operation did not return all containers remaining to be listed
+	     *                        with the current page. The continuationToken value can be used as the value for
+	     *                        the marker parameter in a subsequent call to request the next page of list
+	     *                        items. The marker value is opaque to the client.
+	     * @param options - Options to list containers operation.
+	     */
+	    async *listSegments(marker, options = {}) {
+	        let listContainersSegmentResponse;
+	        if (!!marker || marker === undefined) {
+	            do {
+	                listContainersSegmentResponse = await this.listContainersSegment(marker, options);
+	                listContainersSegmentResponse.containerItems =
+	                    listContainersSegmentResponse.containerItems || [];
+	                marker = listContainersSegmentResponse.continuationToken;
+	                yield await listContainersSegmentResponse;
+	            } while (marker);
+	        }
+	    }
+	    /**
+	     * Returns an AsyncIterableIterator for Container Items
+	     *
+	     * @param options - Options to list containers operation.
+	     */
+	    async *listItems(options = {}) {
+	        let marker;
+	        for await (const segment of this.listSegments(marker, options)) {
+	            yield* segment.containerItems;
+	        }
+	    }
+	    /**
+	     * Returns an async iterable iterator to list all the containers
+	     * under the specified account.
+	     *
+	     * .byPage() returns an async iterable iterator to list the containers in pages.
+	     *
+	     * ```ts snippet:BlobServiceClientListContainers
+	     * import { BlobServiceClient } from "@azure/storage-blob";
+	     * import { DefaultAzureCredential } from "@azure/identity";
+	     *
+	     * const account = "";
+	     * const blobServiceClient = new BlobServiceClient(
+	     *   `https://${account}.blob.core.windows.net`,
+	     *   new DefaultAzureCredential(),
+	     * );
+	     *
+	     * // Use for await to iterate the containers
+	     * let i = 1;
+	     * for await (const container of blobServiceClient.listContainers()) {
+	     *   console.log(`Container ${i++}: ${container.name}`);
+	     * }
+	     *
+	     * // Use iter.next() to iterate the containers
+	     * i = 1;
+	     * const iter = blobServiceClient.listContainers();
+	     * let { value, done } = await iter.next();
+	     * while (!done) {
+	     *   console.log(`Container ${i++}: ${value.name}`);
+	     *   ({ value, done } = await iter.next());
+	     * }
+	     *
+	     * // Use byPage() to iterate the containers
+	     * i = 1;
+	     * for await (const page of blobServiceClient.listContainers().byPage({ maxPageSize: 20 })) {
+	     *   for (const container of page.containerItems) {
+	     *     console.log(`Container ${i++}: ${container.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Use paging with a marker
+	     * i = 1;
+	     * let iterator = blobServiceClient.listContainers().byPage({ maxPageSize: 2 });
+	     * let response = (await iterator.next()).value;
+	     *
+	     * // Prints 2 container names
+	     * if (response.containerItems) {
+	     *   for (const container of response.containerItems) {
+	     *     console.log(`Container ${i++}: ${container.name}`);
+	     *   }
+	     * }
+	     *
+	     * // Gets next marker
+	     * let marker = response.continuationToken;
+	     * // Passing next marker as continuationToken
+	     * iterator = blobServiceClient
+	     *   .listContainers()
+	     *   .byPage({ continuationToken: marker, maxPageSize: 10 });
+	     * response = (await iterator.next()).value;
+	     *
+	     * // Prints 10 container names
+	     * if (response.containerItems) {
+	     *   for (const container of response.containerItems) {
+	     *     console.log(`Container ${i++}: ${container.name}`);
+	     *   }
+	     * }
+	     * ```
+	     *
+	     * @param options - Options to list containers.
+	     * @returns An asyncIterableIterator that supports paging.
+	     */
+	    listContainers(options = {}) {
+	        if (options.prefix === "") {
+	            options.prefix = undefined;
+	        }
+	        const include = [];
+	        if (options.includeDeleted) {
+	            include.push("deleted");
+	        }
+	        if (options.includeMetadata) {
+	            include.push("metadata");
+	        }
+	        if (options.includeSystem) {
+	            include.push("system");
+	        }
+	        // AsyncIterableIterator to iterate over containers
+	        const listSegmentOptions = {
+	            ...options,
+	            ...(include.length > 0 ? { include } : {}),
+	        };
+	        const iter = this.listItems(listSegmentOptions);
+	        return {
+	            /**
+	             * The next method, part of the iteration protocol
+	             */
+	            next() {
+	                return iter.next();
+	            },
+	            /**
+	             * The connection to the async iterator, part of the iteration protocol
+	             */
+	            [Symbol.asyncIterator]() {
+	                return this;
+	            },
+	            /**
+	             * Return an AsyncIterableIterator that works a page at a time
+	             */
+	            byPage: (settings = {}) => {
+	                return this.listSegments(settings.continuationToken, {
+	                    maxPageSize: settings.maxPageSize,
+	                    ...listSegmentOptions,
+	                });
+	            },
+	        };
+	    }
+	    /**
+	     * ONLY AVAILABLE WHEN USING BEARER TOKEN AUTHENTICATION (TokenCredential).
+	     *
+	     * Retrieves a user delegation key for the Blob service. This is only a valid operation when using
+	     * bearer token authentication.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/get-user-delegation-key
+	     *
+	     * @param startsOn -      The start time for the user delegation SAS. Must be within 7 days of the current time
+	     * @param expiresOn -     The end time for the user delegation SAS. Must be within 7 days of the current time
+	     */
+	    async getUserDelegationKey(startsOn, expiresOn, options = {}) {
+	        return tracing_js_1.tracingClient.withSpan("BlobServiceClient-getUserDelegationKey", options, async (updatedOptions) => {
+	            const response = (0, utils_common_js_2.assertResponse)(await this.serviceContext.getUserDelegationKey({
+	                startsOn: (0, utils_common_js_2.truncatedISO8061Date)(startsOn, false),
+	                expiresOn: (0, utils_common_js_2.truncatedISO8061Date)(expiresOn, false),
+	            }, {
+	                abortSignal: options.abortSignal,
+	                tracingOptions: updatedOptions.tracingOptions,
+	            }));
+	            const userDelegationKey = {
+	                signedObjectId: response.signedObjectId,
+	                signedTenantId: response.signedTenantId,
+	                signedStartsOn: new Date(response.signedStartsOn),
+	                signedExpiresOn: new Date(response.signedExpiresOn),
+	                signedService: response.signedService,
+	                signedVersion: response.signedVersion,
+	                value: response.value,
+	            };
+	            const res = {
+	                _response: response._response,
+	                requestId: response.requestId,
+	                clientRequestId: response.clientRequestId,
+	                version: response.version,
+	                date: response.date,
+	                errorCode: response.errorCode,
+	                ...userDelegationKey,
+	            };
+	            return res;
+	        });
+	    }
+	    /**
+	     * Creates a BlobBatchClient object to conduct batch operations.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
+	     *
+	     * @returns A new BlobBatchClient object for this service.
+	     */
+	    getBlobBatchClient() {
+	        return new BlobBatchClient_js_1.BlobBatchClient(this.url, this.pipeline);
+	    }
+	    /**
+	     * Only available for BlobServiceClient constructed with a shared key credential.
+	     *
+	     * Generates a Blob account Shared Access Signature (SAS) URI based on the client properties
+	     * and parameters passed in. The SAS is signed by the shared key credential of the client.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/create-account-sas
+	     *
+	     * @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
+	     * @param permissions - Specifies the list of permissions to be associated with the SAS.
+	     * @param resourceTypes - Specifies the resource types associated with the shared access signature.
+	     * @param options - Optional parameters.
+	     * @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateAccountSasUrl(expiresOn, permissions = AccountSASPermissions_js_1.AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
+	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
+	            throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
+	        }
+	        if (expiresOn === undefined) {
+	            const now = new Date();
+	            expiresOn = new Date(now.getTime() + 3600 * 1000);
+	        }
+	        const sas = (0, AccountSASSignatureValues_js_1.generateAccountSASQueryParameters)({
+	            permissions,
+	            expiresOn,
+	            resourceTypes,
+	            services: AccountSASServices_js_1.AccountSASServices.parse("b").toString(),
+	            ...options,
+	        }, this.credential).toString();
+	        return (0, utils_common_js_1.appendToURLQuery)(this.url, sas);
+	    }
+	    /**
+	     * Only available for BlobServiceClient constructed with a shared key credential.
+	     *
+	     * Generates string to sign for a Blob account Shared Access Signature (SAS) URI based on
+	     * the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
+	     *
+	     * @see https://learn.microsoft.com/rest/api/storageservices/create-account-sas
+	     *
+	     * @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
+	     * @param permissions - Specifies the list of permissions to be associated with the SAS.
+	     * @param resourceTypes - Specifies the resource types associated with the shared access signature.
+	     * @param options - Optional parameters.
+	     * @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
+	     */
+	    generateSasStringToSign(expiresOn, permissions = AccountSASPermissions_js_1.AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
+	        if (!(this.credential instanceof StorageSharedKeyCredential_js_1.StorageSharedKeyCredential)) {
+	            throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
+	        }
+	        if (expiresOn === undefined) {
+	            const now = new Date();
+	            expiresOn = new Date(now.getTime() + 3600 * 1000);
+	        }
+	        return (0, AccountSASSignatureValues_js_1.generateAccountSASQueryParametersInternal)({
+	            permissions,
+	            expiresOn,
+	            resourceTypes,
+	            services: AccountSASServices_js_1.AccountSASServices.parse("b").toString(),
+	            ...options,
+	        }, this.credential).stringToSign;
+	    }
+	};
+	BlobServiceClient.BlobServiceClient = BlobServiceClient$1;
+	
+	return BlobServiceClient;
+}
+
+var BatchResponse = {};
+
+var hasRequiredBatchResponse;
+
+function requireBatchResponse () {
+	if (hasRequiredBatchResponse) return BatchResponse;
+	hasRequiredBatchResponse = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(BatchResponse, "__esModule", { value: true });
+	
+	return BatchResponse;
+}
+
+var generatedModels = {};
+
+var hasRequiredGeneratedModels;
+
+function requireGeneratedModels () {
+	if (hasRequiredGeneratedModels) return generatedModels;
+	hasRequiredGeneratedModels = 1;
+	// Copyright (c) Microsoft Corporation.
+	// Licensed under the MIT License.
+	Object.defineProperty(generatedModels, "__esModule", { value: true });
+	generatedModels.KnownEncryptionAlgorithmType = void 0;
+	/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */
+	var KnownEncryptionAlgorithmType;
+	(function (KnownEncryptionAlgorithmType) {
+	    KnownEncryptionAlgorithmType["AES256"] = "AES256";
+	})(KnownEncryptionAlgorithmType || (generatedModels.KnownEncryptionAlgorithmType = KnownEncryptionAlgorithmType = {}));
+	
+	return generatedModels;
+}
+
+var hasRequiredCommonjs;
+
+function requireCommonjs () {
+	if (hasRequiredCommonjs) return commonjs$e;
+	hasRequiredCommonjs = 1;
+	(function (exports$1) {
+		// Copyright (c) Microsoft Corporation.
+		// Licensed under the MIT License.
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.logger = exports$1.RestError = exports$1.BaseRequestPolicy = exports$1.StorageOAuthScopes = exports$1.newPipeline = exports$1.isPipelineLike = exports$1.Pipeline = exports$1.getBlobServiceAccountAudience = exports$1.StorageBlobAudience = exports$1.PremiumPageBlobTier = exports$1.BlockBlobTier = exports$1.generateBlobSASQueryParameters = exports$1.generateAccountSASQueryParameters = void 0;
+		const tslib_1 = require$$0$2;
+		const core_rest_pipeline_1 = /*@__PURE__*/ requireCommonjs$9();
+		Object.defineProperty(exports$1, "RestError", { enumerable: true, get: function () { return core_rest_pipeline_1.RestError; } });
+		tslib_1.__exportStar(requireBlobServiceClient(), exports$1);
+		tslib_1.__exportStar(requireClients(), exports$1);
+		tslib_1.__exportStar(requireContainerClient(), exports$1);
+		tslib_1.__exportStar(requireBlobLeaseClient(), exports$1);
+		tslib_1.__exportStar(requireAccountSASPermissions(), exports$1);
+		tslib_1.__exportStar(requireAccountSASResourceTypes(), exports$1);
+		tslib_1.__exportStar(requireAccountSASServices(), exports$1);
+		var AccountSASSignatureValues_js_1 = requireAccountSASSignatureValues();
+		Object.defineProperty(exports$1, "generateAccountSASQueryParameters", { enumerable: true, get: function () { return AccountSASSignatureValues_js_1.generateAccountSASQueryParameters; } });
+		tslib_1.__exportStar(requireBlobBatch(), exports$1);
+		tslib_1.__exportStar(requireBlobBatchClient(), exports$1);
+		tslib_1.__exportStar(requireBatchResponse(), exports$1);
+		tslib_1.__exportStar(requireBlobSASPermissions(), exports$1);
+		var BlobSASSignatureValues_js_1 = requireBlobSASSignatureValues();
+		Object.defineProperty(exports$1, "generateBlobSASQueryParameters", { enumerable: true, get: function () { return BlobSASSignatureValues_js_1.generateBlobSASQueryParameters; } });
+		tslib_1.__exportStar(requireStorageBrowserPolicyFactory(), exports$1);
+		tslib_1.__exportStar(requireContainerSASPermissions(), exports$1);
+		tslib_1.__exportStar(requireAnonymousCredential$1(), exports$1);
+		tslib_1.__exportStar(requireCredential$1(), exports$1);
+		tslib_1.__exportStar(requireStorageSharedKeyCredential$1(), exports$1);
+		var models_js_1 = requireModels();
+		Object.defineProperty(exports$1, "BlockBlobTier", { enumerable: true, get: function () { return models_js_1.BlockBlobTier; } });
+		Object.defineProperty(exports$1, "PremiumPageBlobTier", { enumerable: true, get: function () { return models_js_1.PremiumPageBlobTier; } });
+		Object.defineProperty(exports$1, "StorageBlobAudience", { enumerable: true, get: function () { return models_js_1.StorageBlobAudience; } });
+		Object.defineProperty(exports$1, "getBlobServiceAccountAudience", { enumerable: true, get: function () { return models_js_1.getBlobServiceAccountAudience; } });
+		var Pipeline_js_1 = requirePipeline();
+		Object.defineProperty(exports$1, "Pipeline", { enumerable: true, get: function () { return Pipeline_js_1.Pipeline; } });
+		Object.defineProperty(exports$1, "isPipelineLike", { enumerable: true, get: function () { return Pipeline_js_1.isPipelineLike; } });
+		Object.defineProperty(exports$1, "newPipeline", { enumerable: true, get: function () { return Pipeline_js_1.newPipeline; } });
+		Object.defineProperty(exports$1, "StorageOAuthScopes", { enumerable: true, get: function () { return Pipeline_js_1.StorageOAuthScopes; } });
+		tslib_1.__exportStar(requireStorageRetryPolicyFactory$1(), exports$1);
+		var RequestPolicy_js_1 = requireRequestPolicy$1();
+		Object.defineProperty(exports$1, "BaseRequestPolicy", { enumerable: true, get: function () { return RequestPolicy_js_1.BaseRequestPolicy; } });
+		tslib_1.__exportStar(requireAnonymousCredentialPolicy$1(), exports$1);
+		tslib_1.__exportStar(requireCredentialPolicy$1(), exports$1);
+		tslib_1.__exportStar(requireStorageRetryPolicyFactory$1(), exports$1);
+		tslib_1.__exportStar(requireStorageSharedKeyCredentialPolicy$1(), exports$1);
+		tslib_1.__exportStar(requireSASQueryParameters(), exports$1);
+		tslib_1.__exportStar(requireGeneratedModels(), exports$1);
+		var log_js_1 = requireLog$1();
+		Object.defineProperty(exports$1, "logger", { enumerable: true, get: function () { return log_js_1.logger; } });
+		
+	} (commonjs$e));
+	return commonjs$e;
+}
+
+var errors$1 = {};
+
+var hasRequiredErrors$1;
+
+function requireErrors$1 () {
+	if (hasRequiredErrors$1) return errors$1;
+	hasRequiredErrors$1 = 1;
+	Object.defineProperty(errors$1, "__esModule", { value: true });
+	errors$1.RateLimitError = errors$1.UsageError = errors$1.NetworkError = errors$1.GHESNotSupportedError = errors$1.CacheNotFoundError = errors$1.InvalidResponseError = errors$1.FilesNotFoundError = void 0;
+	class FilesNotFoundError extends Error {
+	    constructor(files = []) {
+	        let message = 'No files were found to upload';
+	        if (files.length > 0) {
+	            message += `: ${files.join(', ')}`;
+	        }
+	        super(message);
+	        this.files = files;
+	        this.name = 'FilesNotFoundError';
+	    }
+	}
+	errors$1.FilesNotFoundError = FilesNotFoundError;
+	class InvalidResponseError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = 'InvalidResponseError';
+	    }
+	}
+	errors$1.InvalidResponseError = InvalidResponseError;
+	class CacheNotFoundError extends Error {
+	    constructor(message = 'Cache not found') {
+	        super(message);
+	        this.name = 'CacheNotFoundError';
+	    }
+	}
+	errors$1.CacheNotFoundError = CacheNotFoundError;
+	class GHESNotSupportedError extends Error {
+	    constructor(message = '@actions/cache v4.1.4+, actions/cache/save@v4+ and actions/cache/restore@v4+ are not currently supported on GHES.') {
+	        super(message);
+	        this.name = 'GHESNotSupportedError';
+	    }
+	}
+	errors$1.GHESNotSupportedError = GHESNotSupportedError;
+	class NetworkError extends Error {
+	    constructor(code) {
+	        const message = `Unable to make request: ${code}\nIf you are using self-hosted runners, please make sure your runner has access to all GitHub endpoints: https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#communication-between-self-hosted-runners-and-github`;
+	        super(message);
+	        this.code = code;
+	        this.name = 'NetworkError';
+	    }
+	}
+	errors$1.NetworkError = NetworkError;
+	NetworkError.isNetworkErrorCode = (code) => {
+	    if (!code)
+	        return false;
+	    return [
+	        'ECONNRESET',
+	        'ENOTFOUND',
+	        'ETIMEDOUT',
+	        'ECONNREFUSED',
+	        'EHOSTUNREACH'
+	    ].includes(code);
+	};
+	class UsageError extends Error {
+	    constructor() {
+	        const message = `Cache storage quota has been hit. Unable to upload any new cache entries. Usage is recalculated every 6-12 hours.\nMore info on storage limits: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#calculating-minute-and-storage-spending`;
+	        super(message);
+	        this.name = 'UsageError';
+	    }
+	}
+	errors$1.UsageError = UsageError;
+	UsageError.isUsageErrorMessage = (msg) => {
+	    if (!msg)
+	        return false;
+	    return msg.includes('insufficient usage');
+	};
+	class RateLimitError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = 'RateLimitError';
+	    }
+	}
+	errors$1.RateLimitError = RateLimitError;
+	
+	return errors$1;
+}
+
+var hasRequiredUploadUtils;
+
+function requireUploadUtils () {
+	if (hasRequiredUploadUtils) return uploadUtils;
+	hasRequiredUploadUtils = 1;
+	var __createBinding = (uploadUtils && uploadUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (uploadUtils && uploadUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (uploadUtils && uploadUtils.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (uploadUtils && uploadUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(uploadUtils, "__esModule", { value: true });
+	uploadUtils.UploadProgress = void 0;
+	uploadUtils.uploadCacheArchiveSDK = uploadCacheArchiveSDK;
+	const core = __importStar(requireCore());
+	const storage_blob_1 = /*@__PURE__*/ requireCommonjs();
+	const errors_1 = requireErrors$1();
+	/**
+	 * Class for tracking the upload state and displaying stats.
+	 */
+	class UploadProgress {
+	    constructor(contentLength) {
+	        this.contentLength = contentLength;
+	        this.sentBytes = 0;
+	        this.displayedComplete = false;
+	        this.startTime = Date.now();
+	    }
+	    /**
+	     * Sets the number of bytes sent
+	     *
+	     * @param sentBytes the number of bytes sent
+	     */
+	    setSentBytes(sentBytes) {
+	        this.sentBytes = sentBytes;
+	    }
+	    /**
+	     * Returns the total number of bytes transferred.
+	     */
+	    getTransferredBytes() {
+	        return this.sentBytes;
+	    }
+	    /**
+	     * Returns true if the upload is complete.
+	     */
+	    isDone() {
+	        return this.getTransferredBytes() === this.contentLength;
+	    }
+	    /**
+	     * Prints the current upload stats. Once the upload completes, this will print one
+	     * last line and then stop.
+	     */
+	    display() {
+	        if (this.displayedComplete) {
+	            return;
+	        }
+	        const transferredBytes = this.sentBytes;
+	        const percentage = (100 * (transferredBytes / this.contentLength)).toFixed(1);
+	        const elapsedTime = Date.now() - this.startTime;
+	        const uploadSpeed = (transferredBytes /
+	            (1024 * 1024) /
+	            (elapsedTime / 1000)).toFixed(1);
+	        core.info(`Sent ${transferredBytes} of ${this.contentLength} (${percentage}%), ${uploadSpeed} MBs/sec`);
+	        if (this.isDone()) {
+	            this.displayedComplete = true;
+	        }
+	    }
+	    /**
+	     * Returns a function used to handle TransferProgressEvents.
+	     */
+	    onProgress() {
+	        return (progress) => {
+	            this.setSentBytes(progress.loadedBytes);
+	        };
+	    }
+	    /**
+	     * Starts the timer that displays the stats.
+	     *
+	     * @param delayInMs the delay between each write
+	     */
+	    startDisplayTimer(delayInMs = 1000) {
+	        const displayCallback = () => {
+	            this.display();
+	            if (!this.isDone()) {
+	                this.timeoutHandle = setTimeout(displayCallback, delayInMs);
+	            }
+	        };
+	        this.timeoutHandle = setTimeout(displayCallback, delayInMs);
+	    }
+	    /**
+	     * Stops the timer that displays the stats. As this typically indicates the upload
+	     * is complete, this will display one last line, unless the last line has already
+	     * been written.
+	     */
+	    stopDisplayTimer() {
+	        if (this.timeoutHandle) {
+	            clearTimeout(this.timeoutHandle);
+	            this.timeoutHandle = undefined;
+	        }
+	        this.display();
+	    }
+	}
+	uploadUtils.UploadProgress = UploadProgress;
+	/**
+	 * Uploads a cache archive directly to Azure Blob Storage using the Azure SDK.
+	 * This function will display progress information to the console. Concurrency of the
+	 * upload is determined by the calling functions.
+	 *
+	 * @param signedUploadURL
+	 * @param archivePath
+	 * @param options
+	 * @returns
+	 */
+	function uploadCacheArchiveSDK(signedUploadURL, archivePath, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        var _a;
+	        const blobClient = new storage_blob_1.BlobClient(signedUploadURL);
+	        const blockBlobClient = blobClient.getBlockBlobClient();
+	        const uploadProgress = new UploadProgress((_a = options === null || options === void 0 ? void 0 : options.archiveSizeBytes) !== null && _a !== void 0 ? _a : 0);
+	        // Specify data transfer options
+	        const uploadOptions = {
+	            blockSize: options === null || options === void 0 ? void 0 : options.uploadChunkSize,
+	            concurrency: options === null || options === void 0 ? void 0 : options.uploadConcurrency, // maximum number of parallel transfer workers
+	            maxSingleShotSize: 128 * 1024 * 1024, // 128 MiB initial transfer size
+	            onProgress: uploadProgress.onProgress()
+	        };
+	        try {
+	            uploadProgress.startDisplayTimer();
+	            core.debug(`BlobClient: ${blobClient.name}:${blobClient.accountName}:${blobClient.containerName}`);
+	            const response = yield blockBlobClient.uploadFile(archivePath, uploadOptions);
+	            // TODO: better management of non-retryable errors
+	            if (response._response.status >= 400) {
+	                throw new errors_1.InvalidResponseError(`uploadCacheArchiveSDK: upload failed with status code ${response._response.status}`);
+	            }
+	            return response;
+	        }
+	        catch (error) {
+	            core.warning(`uploadCacheArchiveSDK: internal error uploading cache archive: ${error.message}`);
+	            throw error;
+	        }
+	        finally {
+	            uploadProgress.stopDisplayTimer();
+	        }
+	    });
+	}
+	
+	return uploadUtils;
+}
+
+var downloadUtils = {};
+
+var requestUtils = {};
+
+var hasRequiredRequestUtils;
+
+function requireRequestUtils () {
+	if (hasRequiredRequestUtils) return requestUtils;
+	hasRequiredRequestUtils = 1;
+	var __createBinding = (requestUtils && requestUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (requestUtils && requestUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (requestUtils && requestUtils.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (requestUtils && requestUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(requestUtils, "__esModule", { value: true });
+	requestUtils.isSuccessStatusCode = isSuccessStatusCode;
+	requestUtils.isServerErrorStatusCode = isServerErrorStatusCode;
+	requestUtils.isRetryableStatusCode = isRetryableStatusCode;
+	requestUtils.retry = retry;
+	requestUtils.retryTypedResponse = retryTypedResponse;
+	requestUtils.retryHttpClientResponse = retryHttpClientResponse;
+	const core = __importStar(requireCore());
+	const http_client_1 = requireLib();
+	const constants_1 = requireConstants$b();
+	function isSuccessStatusCode(statusCode) {
+	    if (!statusCode) {
+	        return false;
+	    }
+	    return statusCode >= 200 && statusCode < 300;
+	}
+	function isServerErrorStatusCode(statusCode) {
+	    if (!statusCode) {
+	        return true;
+	    }
+	    return statusCode >= 500;
+	}
+	function isRetryableStatusCode(statusCode) {
+	    if (!statusCode) {
+	        return false;
+	    }
+	    const retryableStatusCodes = [
+	        http_client_1.HttpCodes.BadGateway,
+	        http_client_1.HttpCodes.ServiceUnavailable,
+	        http_client_1.HttpCodes.GatewayTimeout
+	    ];
+	    return retryableStatusCodes.includes(statusCode);
+	}
+	function sleep(milliseconds) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        return new Promise(resolve => setTimeout(resolve, milliseconds));
+	    });
+	}
+	function retry(name_1, method_1, getStatusCode_1) {
+	    return __awaiter(this, arguments, void 0, function* (name, method, getStatusCode, maxAttempts = constants_1.DefaultRetryAttempts, delay = constants_1.DefaultRetryDelay, onError = undefined) {
+	        let errorMessage = '';
+	        let attempt = 1;
+	        while (attempt <= maxAttempts) {
+	            let response = undefined;
+	            let statusCode = undefined;
+	            let isRetryable = false;
+	            try {
+	                response = yield method();
+	            }
+	            catch (error) {
+	                if (onError) {
+	                    response = onError(error);
+	                }
+	                isRetryable = true;
+	                errorMessage = error.message;
+	            }
+	            if (response) {
+	                statusCode = getStatusCode(response);
+	                if (!isServerErrorStatusCode(statusCode)) {
+	                    return response;
+	                }
+	            }
+	            if (statusCode) {
+	                isRetryable = isRetryableStatusCode(statusCode);
+	                errorMessage = `Cache service responded with ${statusCode}`;
+	            }
+	            core.debug(`${name} - Attempt ${attempt} of ${maxAttempts} failed with error: ${errorMessage}`);
+	            if (!isRetryable) {
+	                core.debug(`${name} - Error is not retryable`);
+	                break;
+	            }
+	            yield sleep(delay);
+	            attempt++;
+	        }
+	        throw Error(`${name} failed: ${errorMessage}`);
+	    });
+	}
+	function retryTypedResponse(name_1, method_1) {
+	    return __awaiter(this, arguments, void 0, function* (name, method, maxAttempts = constants_1.DefaultRetryAttempts, delay = constants_1.DefaultRetryDelay) {
+	        return yield retry(name, method, (response) => response.statusCode, maxAttempts, delay, 
+	        // If the error object contains the statusCode property, extract it and return
+	        // an TypedResponse so it can be processed by the retry logic.
+	        (error) => {
+	            if (error instanceof http_client_1.HttpClientError) {
+	                return {
+	                    statusCode: error.statusCode,
+	                    result: null,
+	                    headers: {},
+	                    error
+	                };
+	            }
+	            else {
+	                return undefined;
+	            }
+	        });
+	    });
+	}
+	function retryHttpClientResponse(name_1, method_1) {
+	    return __awaiter(this, arguments, void 0, function* (name, method, maxAttempts = constants_1.DefaultRetryAttempts, delay = constants_1.DefaultRetryDelay) {
+	        return yield retry(name, method, (response) => response.message.statusCode, maxAttempts, delay);
+	    });
+	}
+	
+	return requestUtils;
+}
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT license.
+/// 
+const listenersMap = new WeakMap();
+const abortedMap = new WeakMap();
+/**
+ * An aborter instance implements AbortSignal interface, can abort HTTP requests.
+ *
+ * - Call AbortSignal.none to create a new AbortSignal instance that cannot be cancelled.
+ * Use `AbortSignal.none` when you are required to pass a cancellation token but the operation
+ * cannot or will not ever be cancelled.
+ *
+ * @example
+ * Abort without timeout
+ * ```ts
+ * await doAsyncWork(AbortSignal.none);
+ * ```
+ */
+let AbortSignal$1 = class AbortSignal {
+    constructor() {
+        /**
+         * onabort event listener.
+         */
+        this.onabort = null;
+        listenersMap.set(this, []);
+        abortedMap.set(this, false);
+    }
+    /**
+     * Status of whether aborted or not.
+     *
+     * @readonly
+     */
+    get aborted() {
+        if (!abortedMap.has(this)) {
+            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
+        }
+        return abortedMap.get(this);
+    }
+    /**
+     * Creates a new AbortSignal instance that will never be aborted.
+     *
+     * @readonly
+     */
+    static get none() {
+        return new AbortSignal();
+    }
+    /**
+     * Added new "abort" event listener, only support "abort" event.
+     *
+     * @param _type - Only support "abort" event
+     * @param listener - The listener to be added
+     */
+    addEventListener(
+    // tslint:disable-next-line:variable-name
+    _type, listener) {
+        if (!listenersMap.has(this)) {
+            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
+        }
+        const listeners = listenersMap.get(this);
+        listeners.push(listener);
+    }
+    /**
+     * Remove "abort" event listener, only support "abort" event.
+     *
+     * @param _type - Only support "abort" event
+     * @param listener - The listener to be removed
+     */
+    removeEventListener(
+    // tslint:disable-next-line:variable-name
+    _type, listener) {
+        if (!listenersMap.has(this)) {
+            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
+        }
+        const listeners = listenersMap.get(this);
+        const index = listeners.indexOf(listener);
+        if (index > -1) {
+            listeners.splice(index, 1);
+        }
+    }
+    /**
+     * Dispatches a synthetic event to the AbortSignal.
+     */
+    dispatchEvent(_event) {
+        throw new Error("This is a stub dispatchEvent implementation that should not be used.  It only exists for type-checking purposes.");
+    }
+};
+/**
+ * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.
+ * Will try to trigger abort event for all linked AbortSignal nodes.
+ *
+ * - If there is a timeout, the timer will be cancelled.
+ * - If aborted is true, nothing will happen.
+ *
+ * @internal
+ */
+// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
+function abortSignal$1(signal) {
+    if (signal.aborted) {
+        return;
+    }
+    if (signal.onabort) {
+        signal.onabort.call(signal);
+    }
+    const listeners = listenersMap.get(signal);
+    if (listeners) {
+        // Create a copy of listeners so mutations to the array
+        // (e.g. via removeListener calls) don't affect the listeners
+        // we invoke.
+        listeners.slice().forEach((listener) => {
+            listener.call(signal, { type: "abort" });
+        });
+    }
+    abortedMap.set(signal, true);
+}
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT license.
+/**
+ * This error is thrown when an asynchronous operation has been aborted.
+ * Check for this error by testing the `name` that the name property of the
+ * error matches `"AbortError"`.
+ *
+ * @example
+ * ```ts
+ * const controller = new AbortController();
+ * controller.abort();
+ * try {
+ *   doAsyncWork(controller.signal)
+ * } catch (e) {
+ *   if (e.name === 'AbortError') {
+ *     // handle abort error here.
+ *   }
+ * }
+ * ```
+ */
+class AbortError extends Error {
+    constructor(message) {
+        super(message);
+        this.name = "AbortError";
+    }
+}
+/**
+ * An AbortController provides an AbortSignal and the associated controls to signal
+ * that an asynchronous operation should be aborted.
+ *
+ * @example
+ * Abort an operation when another event fires
+ * ```ts
+ * const controller = new AbortController();
+ * const signal = controller.signal;
+ * doAsyncWork(signal);
+ * button.addEventListener('click', () => controller.abort());
+ * ```
+ *
+ * @example
+ * Share aborter cross multiple operations in 30s
+ * ```ts
+ * // Upload the same data to 2 different data centers at the same time,
+ * // abort another when any of them is finished
+ * const controller = AbortController.withTimeout(30 * 1000);
+ * doAsyncWork(controller.signal).then(controller.abort);
+ * doAsyncWork(controller.signal).then(controller.abort);
+ *```
+ *
+ * @example
+ * Cascaded aborting
+ * ```ts
+ * // All operations can't take more than 30 seconds
+ * const aborter = Aborter.timeout(30 * 1000);
+ *
+ * // Following 2 operations can't take more than 25 seconds
+ * await doAsyncWork(aborter.withTimeout(25 * 1000));
+ * await doAsyncWork(aborter.withTimeout(25 * 1000));
+ * ```
+ */
+let AbortController$1 = class AbortController {
+    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+    constructor(parentSignals) {
+        this._signal = new AbortSignal$1();
+        if (!parentSignals) {
+            return;
+        }
+        // coerce parentSignals into an array
+        if (!Array.isArray(parentSignals)) {
+            // eslint-disable-next-line prefer-rest-params
+            parentSignals = arguments;
+        }
+        for (const parentSignal of parentSignals) {
+            // if the parent signal has already had abort() called,
+            // then call abort on this signal as well.
+            if (parentSignal.aborted) {
+                this.abort();
+            }
+            else {
+                // when the parent signal aborts, this signal should as well.
+                parentSignal.addEventListener("abort", () => {
+                    this.abort();
+                });
+            }
+        }
+    }
+    /**
+     * The AbortSignal associated with this controller that will signal aborted
+     * when the abort method is called on this controller.
+     *
+     * @readonly
+     */
+    get signal() {
+        return this._signal;
+    }
+    /**
+     * Signal that any operations passed this controller's associated abort signal
+     * to cancel any remaining work and throw an `AbortError`.
+     */
+    abort() {
+        abortSignal$1(this._signal);
+    }
+    /**
+     * Creates a new AbortSignal instance that will abort after the provided ms.
+     * @param ms - Elapsed time in milliseconds to trigger an abort.
+     */
+    static timeout(ms) {
+        const signal = new AbortSignal$1();
+        const timer = setTimeout(abortSignal$1, ms, signal);
+        // Prevent the active Timer from keeping the Node.js event loop active.
+        if (typeof timer.unref === "function") {
+            timer.unref();
+        }
+        return signal;
+    }
+};
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT license.
+// Changes to Aborter
+// * Rename Aborter to AbortSignal
+// * Remove withValue and getValue - async context should be solved differently/wholistically, not tied to cancellation
+// * Remove withTimeout, it's moved to the controller
+// * AbortSignal constructor no longer takes a parent. Cancellation graphs are created from the controller.
+// Potential changes to align with DOM Spec
+// * dispatchEvent on Signal
+
+var src = /*#__PURE__*/Object.freeze({
+	__proto__: null,
+	AbortController: AbortController$1,
+	AbortError: AbortError,
+	AbortSignal: AbortSignal$1
+});
+
+var require$$10 = /*@__PURE__*/getAugmentedNamespace(src);
+
+var hasRequiredDownloadUtils;
+
+function requireDownloadUtils () {
+	if (hasRequiredDownloadUtils) return downloadUtils;
+	hasRequiredDownloadUtils = 1;
+	var __createBinding = (downloadUtils && downloadUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (downloadUtils && downloadUtils.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (downloadUtils && downloadUtils.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (downloadUtils && downloadUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(downloadUtils, "__esModule", { value: true });
+	downloadUtils.DownloadProgress = void 0;
+	downloadUtils.downloadCacheHttpClient = downloadCacheHttpClient;
+	downloadUtils.downloadCacheHttpClientConcurrent = downloadCacheHttpClientConcurrent;
+	downloadUtils.downloadCacheStorageSDK = downloadCacheStorageSDK;
+	const core = __importStar(requireCore());
+	const http_client_1 = requireLib();
+	const storage_blob_1 = /*@__PURE__*/ requireCommonjs();
+	const buffer = __importStar(require$$2$5);
+	const fs = __importStar(fs__default);
+	const stream = __importStar(require$$3$1);
+	const util = __importStar(require$$6);
+	const utils = __importStar(requireCacheUtils());
+	const constants_1 = requireConstants$b();
+	const requestUtils_1 = requireRequestUtils();
+	const abort_controller_1 = require$$10;
+	/**
+	 * Pipes the body of a HTTP response to a stream
+	 *
+	 * @param response the HTTP response
+	 * @param output the writable stream
+	 */
+	function pipeResponseToStream(response, output) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const pipeline = util.promisify(stream.pipeline);
+	        yield pipeline(response.message, output);
+	    });
+	}
+	/**
+	 * Class for tracking the download state and displaying stats.
+	 */
+	class DownloadProgress {
+	    constructor(contentLength) {
+	        this.contentLength = contentLength;
+	        this.segmentIndex = 0;
+	        this.segmentSize = 0;
+	        this.segmentOffset = 0;
+	        this.receivedBytes = 0;
+	        this.displayedComplete = false;
+	        this.startTime = Date.now();
+	    }
+	    /**
+	     * Progress to the next segment. Only call this method when the previous segment
+	     * is complete.
+	     *
+	     * @param segmentSize the length of the next segment
+	     */
+	    nextSegment(segmentSize) {
+	        this.segmentOffset = this.segmentOffset + this.segmentSize;
+	        this.segmentIndex = this.segmentIndex + 1;
+	        this.segmentSize = segmentSize;
+	        this.receivedBytes = 0;
+	        core.debug(`Downloading segment at offset ${this.segmentOffset} with length ${this.segmentSize}...`);
+	    }
+	    /**
+	     * Sets the number of bytes received for the current segment.
+	     *
+	     * @param receivedBytes the number of bytes received
+	     */
+	    setReceivedBytes(receivedBytes) {
+	        this.receivedBytes = receivedBytes;
+	    }
+	    /**
+	     * Returns the total number of bytes transferred.
+	     */
+	    getTransferredBytes() {
+	        return this.segmentOffset + this.receivedBytes;
+	    }
+	    /**
+	     * Returns true if the download is complete.
+	     */
+	    isDone() {
+	        return this.getTransferredBytes() === this.contentLength;
+	    }
+	    /**
+	     * Prints the current download stats. Once the download completes, this will print one
+	     * last line and then stop.
+	     */
+	    display() {
+	        if (this.displayedComplete) {
+	            return;
+	        }
+	        const transferredBytes = this.segmentOffset + this.receivedBytes;
+	        const percentage = (100 * (transferredBytes / this.contentLength)).toFixed(1);
+	        const elapsedTime = Date.now() - this.startTime;
+	        const downloadSpeed = (transferredBytes /
+	            (1024 * 1024) /
+	            (elapsedTime / 1000)).toFixed(1);
+	        core.info(`Received ${transferredBytes} of ${this.contentLength} (${percentage}%), ${downloadSpeed} MBs/sec`);
+	        if (this.isDone()) {
+	            this.displayedComplete = true;
+	        }
+	    }
+	    /**
+	     * Returns a function used to handle TransferProgressEvents.
+	     */
+	    onProgress() {
+	        return (progress) => {
+	            this.setReceivedBytes(progress.loadedBytes);
+	        };
+	    }
+	    /**
+	     * Starts the timer that displays the stats.
+	     *
+	     * @param delayInMs the delay between each write
+	     */
+	    startDisplayTimer(delayInMs = 1000) {
+	        const displayCallback = () => {
+	            this.display();
+	            if (!this.isDone()) {
+	                this.timeoutHandle = setTimeout(displayCallback, delayInMs);
+	            }
+	        };
+	        this.timeoutHandle = setTimeout(displayCallback, delayInMs);
+	    }
+	    /**
+	     * Stops the timer that displays the stats. As this typically indicates the download
+	     * is complete, this will display one last line, unless the last line has already
+	     * been written.
+	     */
+	    stopDisplayTimer() {
+	        if (this.timeoutHandle) {
+	            clearTimeout(this.timeoutHandle);
+	            this.timeoutHandle = undefined;
+	        }
+	        this.display();
+	    }
+	}
+	downloadUtils.DownloadProgress = DownloadProgress;
+	/**
+	 * Download the cache using the Actions toolkit http-client
+	 *
+	 * @param archiveLocation the URL for the cache
+	 * @param archivePath the local path where the cache is saved
+	 */
+	function downloadCacheHttpClient(archiveLocation, archivePath) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const writeStream = fs.createWriteStream(archivePath);
+	        const httpClient = new http_client_1.HttpClient('actions/cache');
+	        const downloadResponse = yield (0, requestUtils_1.retryHttpClientResponse)('downloadCache', () => __awaiter(this, void 0, void 0, function* () { return httpClient.get(archiveLocation); }));
+	        // Abort download if no traffic received over the socket.
+	        downloadResponse.message.socket.setTimeout(constants_1.SocketTimeout, () => {
+	            downloadResponse.message.destroy();
+	            core.debug(`Aborting download, socket timed out after ${constants_1.SocketTimeout} ms`);
+	        });
+	        yield pipeResponseToStream(downloadResponse, writeStream);
+	        // Validate download size.
+	        const contentLengthHeader = downloadResponse.message.headers['content-length'];
+	        if (contentLengthHeader) {
+	            const expectedLength = parseInt(contentLengthHeader);
+	            const actualLength = utils.getArchiveFileSizeInBytes(archivePath);
+	            if (actualLength !== expectedLength) {
+	                throw new Error(`Incomplete download. Expected file size: ${expectedLength}, actual file size: ${actualLength}`);
+	            }
+	        }
+	        else {
+	            core.debug('Unable to validate download, no Content-Length header');
+	        }
+	    });
+	}
+	/**
+	 * Download the cache using the Actions toolkit http-client concurrently
+	 *
+	 * @param archiveLocation the URL for the cache
+	 * @param archivePath the local path where the cache is saved
+	 */
+	function downloadCacheHttpClientConcurrent(archiveLocation, archivePath, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        var _a;
+	        const archiveDescriptor = yield fs.promises.open(archivePath, 'w');
+	        const httpClient = new http_client_1.HttpClient('actions/cache', undefined, {
+	            socketTimeout: options.timeoutInMs,
+	            keepAlive: true
+	        });
+	        try {
+	            const res = yield (0, requestUtils_1.retryHttpClientResponse)('downloadCacheMetadata', () => __awaiter(this, void 0, void 0, function* () { return yield httpClient.request('HEAD', archiveLocation, null, {}); }));
+	            const lengthHeader = res.message.headers['content-length'];
+	            if (lengthHeader === undefined || lengthHeader === null) {
+	                throw new Error('Content-Length not found on blob response');
+	            }
+	            const length = parseInt(lengthHeader);
+	            if (Number.isNaN(length)) {
+	                throw new Error(`Could not interpret Content-Length: ${length}`);
+	            }
+	            const downloads = [];
+	            const blockSize = 4 * 1024 * 1024;
+	            for (let offset = 0; offset < length; offset += blockSize) {
+	                const count = Math.min(blockSize, length - offset);
+	                downloads.push({
+	                    offset,
+	                    promiseGetter: () => __awaiter(this, void 0, void 0, function* () {
+	                        return yield downloadSegmentRetry(httpClient, archiveLocation, offset, count);
+	                    })
+	                });
+	            }
+	            // reverse to use .pop instead of .shift
+	            downloads.reverse();
+	            let actives = 0;
+	            let bytesDownloaded = 0;
+	            const progress = new DownloadProgress(length);
+	            progress.startDisplayTimer();
+	            const progressFn = progress.onProgress();
+	            const activeDownloads = [];
+	            let nextDownload;
+	            const waitAndWrite = () => __awaiter(this, void 0, void 0, function* () {
+	                const segment = yield Promise.race(Object.values(activeDownloads));
+	                yield archiveDescriptor.write(segment.buffer, 0, segment.count, segment.offset);
+	                actives--;
+	                delete activeDownloads[segment.offset];
+	                bytesDownloaded += segment.count;
+	                progressFn({ loadedBytes: bytesDownloaded });
+	            });
+	            while ((nextDownload = downloads.pop())) {
+	                activeDownloads[nextDownload.offset] = nextDownload.promiseGetter();
+	                actives++;
+	                if (actives >= ((_a = options.downloadConcurrency) !== null && _a !== void 0 ? _a : 10)) {
+	                    yield waitAndWrite();
+	                }
+	            }
+	            while (actives > 0) {
+	                yield waitAndWrite();
+	            }
+	        }
+	        finally {
+	            httpClient.dispose();
+	            yield archiveDescriptor.close();
+	        }
+	    });
+	}
+	function downloadSegmentRetry(httpClient, archiveLocation, offset, count) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const retries = 5;
+	        let failures = 0;
+	        while (true) {
+	            try {
+	                const timeout = 30000;
+	                const result = yield promiseWithTimeout(timeout, downloadSegment(httpClient, archiveLocation, offset, count));
+	                if (typeof result === 'string') {
+	                    throw new Error('downloadSegmentRetry failed due to timeout');
+	                }
+	                return result;
+	            }
+	            catch (err) {
+	                if (failures >= retries) {
+	                    throw err;
+	                }
+	                failures++;
+	            }
+	        }
+	    });
+	}
+	function downloadSegment(httpClient, archiveLocation, offset, count) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const partRes = yield (0, requestUtils_1.retryHttpClientResponse)('downloadCachePart', () => __awaiter(this, void 0, void 0, function* () {
+	            return yield httpClient.get(archiveLocation, {
+	                Range: `bytes=${offset}-${offset + count - 1}`
+	            });
+	        }));
+	        if (!partRes.readBodyBuffer) {
+	            throw new Error('Expected HttpClientResponse to implement readBodyBuffer');
+	        }
+	        return {
+	            offset,
+	            count,
+	            buffer: yield partRes.readBodyBuffer()
+	        };
+	    });
+	}
+	/**
+	 * Download the cache using the Azure Storage SDK.  Only call this method if the
+	 * URL points to an Azure Storage endpoint.
+	 *
+	 * @param archiveLocation the URL for the cache
+	 * @param archivePath the local path where the cache is saved
+	 * @param options the download options with the defaults set
+	 */
+	function downloadCacheStorageSDK(archiveLocation, archivePath, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        var _a;
+	        const client = new storage_blob_1.BlockBlobClient(archiveLocation, undefined, {
+	            retryOptions: {
+	                // Override the timeout used when downloading each 4 MB chunk
+	                // The default is 2 min / MB, which is way too slow
+	                tryTimeoutInMs: options.timeoutInMs
+	            }
+	        });
+	        const properties = yield client.getProperties();
+	        const contentLength = (_a = properties.contentLength) !== null && _a !== void 0 ? _a : -1;
+	        if (contentLength < 0) {
+	            // We should never hit this condition, but just in case fall back to downloading the
+	            // file as one large stream
+	            core.debug('Unable to determine content length, downloading file with http-client...');
+	            yield downloadCacheHttpClient(archiveLocation, archivePath);
+	        }
+	        else {
+	            // Use downloadToBuffer for faster downloads, since internally it splits the
+	            // file into 4 MB chunks which can then be parallelized and retried independently
+	            //
+	            // If the file exceeds the buffer maximum length (~1 GB on 32-bit systems and ~2 GB
+	            // on 64-bit systems), split the download into multiple segments
+	            // ~2 GB = 2147483647, beyond this, we start getting out of range error. So, capping it accordingly.
+	            // Updated segment size to 128MB = 134217728 bytes, to complete a segment faster and fail fast
+	            const maxSegmentSize = Math.min(134217728, buffer.constants.MAX_LENGTH);
+	            const downloadProgress = new DownloadProgress(contentLength);
+	            const fd = fs.openSync(archivePath, 'w');
+	            try {
+	                downloadProgress.startDisplayTimer();
+	                const controller = new abort_controller_1.AbortController();
+	                const abortSignal = controller.signal;
+	                while (!downloadProgress.isDone()) {
+	                    const segmentStart = downloadProgress.segmentOffset + downloadProgress.segmentSize;
+	                    const segmentSize = Math.min(maxSegmentSize, contentLength - segmentStart);
+	                    downloadProgress.nextSegment(segmentSize);
+	                    const result = yield promiseWithTimeout(options.segmentTimeoutInMs || 3600000, client.downloadToBuffer(segmentStart, segmentSize, {
+	                        abortSignal,
+	                        concurrency: options.downloadConcurrency,
+	                        onProgress: downloadProgress.onProgress()
+	                    }));
+	                    if (result === 'timeout') {
+	                        controller.abort();
+	                        throw new Error('Aborting cache download as the download time exceeded the timeout.');
+	                    }
+	                    else if (Buffer.isBuffer(result)) {
+	                        fs.writeFileSync(fd, result);
+	                    }
+	                }
+	            }
+	            finally {
+	                downloadProgress.stopDisplayTimer();
+	                fs.closeSync(fd);
+	            }
+	        }
+	    });
+	}
+	const promiseWithTimeout = (timeoutMs, promise) => __awaiter(void 0, void 0, void 0, function* () {
+	    let timeoutHandle;
+	    const timeoutPromise = new Promise(resolve => {
+	        timeoutHandle = setTimeout(() => resolve('timeout'), timeoutMs);
+	    });
+	    return Promise.race([promise, timeoutPromise]).then(result => {
+	        clearTimeout(timeoutHandle);
+	        return result;
+	    });
+	});
+	
+	return downloadUtils;
+}
+
+var options = {};
+
+var hasRequiredOptions;
+
+function requireOptions () {
+	if (hasRequiredOptions) return options;
+	hasRequiredOptions = 1;
+	var __createBinding = (options && options.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (options && options.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (options && options.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	Object.defineProperty(options, "__esModule", { value: true });
+	options.getUploadOptions = getUploadOptions;
+	options.getDownloadOptions = getDownloadOptions;
+	const core = __importStar(requireCore());
+	/**
+	 * Returns a copy of the upload options with defaults filled in.
+	 *
+	 * @param copy the original upload options
+	 */
+	function getUploadOptions(copy) {
+	    // Defaults if not overriden
+	    const result = {
+	        useAzureSdk: false,
+	        uploadConcurrency: 4,
+	        uploadChunkSize: 32 * 1024 * 1024
+	    };
+	    if (copy) {
+	        if (typeof copy.useAzureSdk === 'boolean') {
+	            result.useAzureSdk = copy.useAzureSdk;
+	        }
+	        if (typeof copy.uploadConcurrency === 'number') {
+	            result.uploadConcurrency = copy.uploadConcurrency;
+	        }
+	        if (typeof copy.uploadChunkSize === 'number') {
+	            result.uploadChunkSize = copy.uploadChunkSize;
+	        }
+	    }
+	    /**
+	     * Add env var overrides
+	     */
+	    // Cap the uploadConcurrency at 32
+	    result.uploadConcurrency = !isNaN(Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
+	        ? Math.min(32, Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
+	        : result.uploadConcurrency;
+	    // Cap the uploadChunkSize at 128MiB
+	    result.uploadChunkSize = !isNaN(Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']))
+	        ? Math.min(128 * 1024 * 1024, Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']) * 1024 * 1024)
+	        : result.uploadChunkSize;
+	    core.debug(`Use Azure SDK: ${result.useAzureSdk}`);
+	    core.debug(`Upload concurrency: ${result.uploadConcurrency}`);
+	    core.debug(`Upload chunk size: ${result.uploadChunkSize}`);
+	    return result;
+	}
+	/**
+	 * Returns a copy of the download options with defaults filled in.
+	 *
+	 * @param copy the original download options
+	 */
+	function getDownloadOptions(copy) {
+	    const result = {
+	        useAzureSdk: false,
+	        concurrentBlobDownloads: true,
+	        downloadConcurrency: 8,
+	        timeoutInMs: 30000,
+	        segmentTimeoutInMs: 600000,
+	        lookupOnly: false
+	    };
+	    if (copy) {
+	        if (typeof copy.useAzureSdk === 'boolean') {
+	            result.useAzureSdk = copy.useAzureSdk;
+	        }
+	        if (typeof copy.concurrentBlobDownloads === 'boolean') {
+	            result.concurrentBlobDownloads = copy.concurrentBlobDownloads;
+	        }
+	        if (typeof copy.downloadConcurrency === 'number') {
+	            result.downloadConcurrency = copy.downloadConcurrency;
+	        }
+	        if (typeof copy.timeoutInMs === 'number') {
+	            result.timeoutInMs = copy.timeoutInMs;
+	        }
+	        if (typeof copy.segmentTimeoutInMs === 'number') {
+	            result.segmentTimeoutInMs = copy.segmentTimeoutInMs;
+	        }
+	        if (typeof copy.lookupOnly === 'boolean') {
+	            result.lookupOnly = copy.lookupOnly;
+	        }
+	    }
+	    const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS'];
+	    if (segmentDownloadTimeoutMins &&
+	        !isNaN(Number(segmentDownloadTimeoutMins)) &&
+	        isFinite(Number(segmentDownloadTimeoutMins))) {
+	        result.segmentTimeoutInMs = Number(segmentDownloadTimeoutMins) * 60 * 1000;
+	    }
+	    core.debug(`Use Azure SDK: ${result.useAzureSdk}`);
+	    core.debug(`Download concurrency: ${result.downloadConcurrency}`);
+	    core.debug(`Request timeout (ms): ${result.timeoutInMs}`);
+	    core.debug(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`);
+	    core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`);
+	    core.debug(`Lookup only: ${result.lookupOnly}`);
+	    return result;
+	}
+	
+	return options;
+}
+
+var config = {};
+
+var hasRequiredConfig;
+
+function requireConfig () {
+	if (hasRequiredConfig) return config;
+	hasRequiredConfig = 1;
+	Object.defineProperty(config, "__esModule", { value: true });
+	config.isGhes = isGhes;
+	config.getCacheServiceVersion = getCacheServiceVersion;
+	config.getCacheServiceURL = getCacheServiceURL;
+	function isGhes() {
+	    const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
+	    const hostname = ghUrl.hostname.trimEnd().toUpperCase();
+	    const isGitHubHost = hostname === 'GITHUB.COM';
+	    const isGheHost = hostname.endsWith('.GHE.COM');
+	    const isLocalHost = hostname.endsWith('.LOCALHOST');
+	    return !isGitHubHost && !isGheHost && !isLocalHost;
+	}
+	function getCacheServiceVersion() {
+	    // Cache service v2 is not supported on GHES. We will default to
+	    // cache service v1 even if the feature flag was enabled by user.
+	    if (isGhes())
+	        return 'v1';
+	    return process.env['ACTIONS_CACHE_SERVICE_V2'] ? 'v2' : 'v1';
+	}
+	function getCacheServiceURL() {
+	    const version = getCacheServiceVersion();
+	    // Based on the version of the cache service, we will determine which
+	    // URL to use.
+	    switch (version) {
+	        case 'v1':
+	            return (process.env['ACTIONS_CACHE_URL'] ||
+	                process.env['ACTIONS_RESULTS_URL'] ||
+	                '');
+	        case 'v2':
+	            return process.env['ACTIONS_RESULTS_URL'] || '';
+	        default:
+	            throw new Error(`Unsupported cache service version: ${version}`);
+	    }
+	}
+	
+	return config;
+}
+
+var userAgent$1 = {};
+
+var version = "5.0.5";
+var require$$0$1 = {
+	version: version};
+
+var hasRequiredUserAgent;
+
+function requireUserAgent () {
+	if (hasRequiredUserAgent) return userAgent$1;
+	hasRequiredUserAgent = 1;
+	Object.defineProperty(userAgent$1, "__esModule", { value: true });
+	userAgent$1.getUserAgentString = getUserAgentString;
+	// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
+	const packageJson = require$$0$1;
+	/**
+	 * Ensure that this User Agent String is used in all HTTP calls so that we can monitor telemetry between different versions of this package
+	 */
+	function getUserAgentString() {
+	    return `@actions/cache-${packageJson.version}`;
+	}
+	
+	return userAgent$1;
+}
+
+var hasRequiredCacheHttpClient;
+
+function requireCacheHttpClient () {
+	if (hasRequiredCacheHttpClient) return cacheHttpClient;
+	hasRequiredCacheHttpClient = 1;
+	var __createBinding = (cacheHttpClient && cacheHttpClient.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (cacheHttpClient && cacheHttpClient.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (cacheHttpClient && cacheHttpClient.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (cacheHttpClient && cacheHttpClient.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(cacheHttpClient, "__esModule", { value: true });
+	cacheHttpClient.getCacheEntry = getCacheEntry;
+	cacheHttpClient.downloadCache = downloadCache;
+	cacheHttpClient.reserveCache = reserveCache;
+	cacheHttpClient.saveCache = saveCache;
+	const core = __importStar(requireCore());
+	const http_client_1 = requireLib();
+	const auth_1 = requireAuth();
+	const fs = __importStar(fs__default);
+	const url_1 = require$$5$4;
+	const utils = __importStar(requireCacheUtils());
+	const uploadUtils_1 = requireUploadUtils();
+	const downloadUtils_1 = requireDownloadUtils();
+	const options_1 = requireOptions();
+	const requestUtils_1 = requireRequestUtils();
+	const config_1 = requireConfig();
+	const user_agent_1 = requireUserAgent();
+	function getCacheApiUrl(resource) {
+	    const baseUrl = (0, config_1.getCacheServiceURL)();
+	    if (!baseUrl) {
+	        throw new Error('Cache Service Url not found, unable to restore cache.');
+	    }
+	    const url = `${baseUrl}_apis/artifactcache/${resource}`;
+	    core.debug(`Resource Url: ${url}`);
+	    return url;
+	}
+	function createAcceptHeader(type, apiVersion) {
+	    return `${type};api-version=${apiVersion}`;
+	}
+	function getRequestOptions() {
+	    const requestOptions = {
+	        headers: {
+	            Accept: createAcceptHeader('application/json', '6.0-preview.1')
+	        }
+	    };
+	    return requestOptions;
+	}
+	function createHttpClient() {
+	    const token = process.env['ACTIONS_RUNTIME_TOKEN'] || '';
+	    const bearerCredentialHandler = new auth_1.BearerCredentialHandler(token);
+	    return new http_client_1.HttpClient((0, user_agent_1.getUserAgentString)(), [bearerCredentialHandler], getRequestOptions());
+	}
+	function getCacheEntry(keys, paths, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const httpClient = createHttpClient();
+	        const version = utils.getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive);
+	        const resource = `cache?keys=${encodeURIComponent(keys.join(','))}&version=${version}`;
+	        const response = yield (0, requestUtils_1.retryTypedResponse)('getCacheEntry', () => __awaiter(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); }));
+	        // Cache not found
+	        if (response.statusCode === 204) {
+	            // List cache for primary key only if cache miss occurs
+	            if (core.isDebug()) {
+	                yield printCachesListForDiagnostics(keys[0], httpClient, version);
+	            }
+	            return null;
+	        }
+	        if (!(0, requestUtils_1.isSuccessStatusCode)(response.statusCode)) {
+	            throw new Error(`Cache service responded with ${response.statusCode}`);
+	        }
+	        const cacheResult = response.result;
+	        const cacheDownloadUrl = cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.archiveLocation;
+	        if (!cacheDownloadUrl) {
+	            // Cache achiveLocation not found. This should never happen, and hence bail out.
+	            throw new Error('Cache not found.');
+	        }
+	        core.setSecret(cacheDownloadUrl);
+	        core.debug(`Cache Result:`);
+	        core.debug(JSON.stringify(cacheResult));
+	        return cacheResult;
+	    });
+	}
+	function printCachesListForDiagnostics(key, httpClient, version) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const resource = `caches?key=${encodeURIComponent(key)}`;
+	        const response = yield (0, requestUtils_1.retryTypedResponse)('listCache', () => __awaiter(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); }));
+	        if (response.statusCode === 200) {
+	            const cacheListResult = response.result;
+	            const totalCount = cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.totalCount;
+	            if (totalCount && totalCount > 0) {
+	                core.debug(`No matching cache found for cache key '${key}', version '${version} and scope ${process.env['GITHUB_REF']}. There exist one or more cache(s) with similar key but they have different version or scope. See more info on cache matching here: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key \nOther caches with similar key:`);
+	                for (const cacheEntry of (cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.artifactCaches) || []) {
+	                    core.debug(`Cache Key: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheKey}, Cache Version: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheVersion}, Cache Scope: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.scope}, Cache Created: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.creationTime}`);
+	                }
+	            }
+	        }
+	    });
+	}
+	function downloadCache(archiveLocation, archivePath, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const archiveUrl = new url_1.URL(archiveLocation);
+	        const downloadOptions = (0, options_1.getDownloadOptions)(options);
+	        if (archiveUrl.hostname.endsWith('.blob.core.windows.net')) {
+	            if (downloadOptions.useAzureSdk) {
+	                // Use Azure storage SDK to download caches hosted on Azure to improve speed and reliability.
+	                yield (0, downloadUtils_1.downloadCacheStorageSDK)(archiveLocation, archivePath, downloadOptions);
+	            }
+	            else if (downloadOptions.concurrentBlobDownloads) {
+	                // Use concurrent implementation with HttpClient to work around blob SDK issue
+	                yield (0, downloadUtils_1.downloadCacheHttpClientConcurrent)(archiveLocation, archivePath, downloadOptions);
+	            }
+	            else {
+	                // Otherwise, download using the Actions http-client.
+	                yield (0, downloadUtils_1.downloadCacheHttpClient)(archiveLocation, archivePath);
+	            }
+	        }
+	        else {
+	            yield (0, downloadUtils_1.downloadCacheHttpClient)(archiveLocation, archivePath);
+	        }
+	    });
+	}
+	// Reserve Cache
+	function reserveCache(key, paths, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const httpClient = createHttpClient();
+	        const version = utils.getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive);
+	        const reserveCacheRequest = {
+	            key,
+	            version,
+	            cacheSize: options === null || options === void 0 ? void 0 : options.cacheSize
+	        };
+	        const response = yield (0, requestUtils_1.retryTypedResponse)('reserveCache', () => __awaiter(this, void 0, void 0, function* () {
+	            return httpClient.postJson(getCacheApiUrl('caches'), reserveCacheRequest);
+	        }));
+	        return response;
+	    });
+	}
+	function getContentRange(start, end) {
+	    // Format: `bytes start-end/filesize
+	    // start and end are inclusive
+	    // filesize can be *
+	    // For a 200 byte chunk starting at byte 0:
+	    // Content-Range: bytes 0-199/*
+	    return `bytes ${start}-${end}/*`;
+	}
+	function uploadChunk(httpClient, resourceUrl, openStream, start, end) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        core.debug(`Uploading chunk of size ${end - start + 1} bytes at offset ${start} with content range: ${getContentRange(start, end)}`);
+	        const additionalHeaders = {
+	            'Content-Type': 'application/octet-stream',
+	            'Content-Range': getContentRange(start, end)
+	        };
+	        const uploadChunkResponse = yield (0, requestUtils_1.retryHttpClientResponse)(`uploadChunk (start: ${start}, end: ${end})`, () => __awaiter(this, void 0, void 0, function* () {
+	            return httpClient.sendStream('PATCH', resourceUrl, openStream(), additionalHeaders);
+	        }));
+	        if (!(0, requestUtils_1.isSuccessStatusCode)(uploadChunkResponse.message.statusCode)) {
+	            throw new Error(`Cache service responded with ${uploadChunkResponse.message.statusCode} during upload chunk.`);
+	        }
+	    });
+	}
+	function uploadFile(httpClient, cacheId, archivePath, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        // Upload Chunks
+	        const fileSize = utils.getArchiveFileSizeInBytes(archivePath);
+	        const resourceUrl = getCacheApiUrl(`caches/${cacheId.toString()}`);
+	        const fd = fs.openSync(archivePath, 'r');
+	        const uploadOptions = (0, options_1.getUploadOptions)(options);
+	        const concurrency = utils.assertDefined('uploadConcurrency', uploadOptions.uploadConcurrency);
+	        const maxChunkSize = utils.assertDefined('uploadChunkSize', uploadOptions.uploadChunkSize);
+	        const parallelUploads = [...new Array(concurrency).keys()];
+	        core.debug('Awaiting all uploads');
+	        let offset = 0;
+	        try {
+	            yield Promise.all(parallelUploads.map(() => __awaiter(this, void 0, void 0, function* () {
+	                while (offset < fileSize) {
+	                    const chunkSize = Math.min(fileSize - offset, maxChunkSize);
+	                    const start = offset;
+	                    const end = offset + chunkSize - 1;
+	                    offset += maxChunkSize;
+	                    yield uploadChunk(httpClient, resourceUrl, () => fs
+	                        .createReadStream(archivePath, {
+	                        fd,
+	                        start,
+	                        end,
+	                        autoClose: false
+	                    })
+	                        .on('error', error => {
+	                        throw new Error(`Cache upload failed because file read failed with ${error.message}`);
+	                    }), start, end);
+	                }
+	            })));
+	        }
+	        finally {
+	            fs.closeSync(fd);
+	        }
+	        return;
+	    });
+	}
+	function commitCache(httpClient, cacheId, filesize) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const commitCacheRequest = { size: filesize };
+	        return yield (0, requestUtils_1.retryTypedResponse)('commitCache', () => __awaiter(this, void 0, void 0, function* () {
+	            return httpClient.postJson(getCacheApiUrl(`caches/${cacheId.toString()}`), commitCacheRequest);
+	        }));
+	    });
+	}
+	function saveCache(cacheId, archivePath, signedUploadURL, options) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const uploadOptions = (0, options_1.getUploadOptions)(options);
+	        if (uploadOptions.useAzureSdk) {
+	            // Use Azure storage SDK to upload caches directly to Azure
+	            if (!signedUploadURL) {
+	                throw new Error('Azure Storage SDK can only be used when a signed URL is provided.');
+	            }
+	            yield (0, uploadUtils_1.uploadCacheArchiveSDK)(signedUploadURL, archivePath, options);
+	        }
+	        else {
+	            const httpClient = createHttpClient();
+	            core.debug('Upload cache');
+	            yield uploadFile(httpClient, cacheId, archivePath, options);
+	            // Commit Cache
+	            core.debug('Commiting cache');
+	            const cacheSize = utils.getArchiveFileSizeInBytes(archivePath);
+	            core.info(`Cache Size: ~${Math.round(cacheSize / (1024 * 1024))} MB (${cacheSize} B)`);
+	            const commitCacheResponse = yield commitCache(httpClient, cacheId, cacheSize);
+	            if (!(0, requestUtils_1.isSuccessStatusCode)(commitCacheResponse.statusCode)) {
+	                throw new Error(`Cache service responded with ${commitCacheResponse.statusCode} during commit cache.`);
+	            }
+	            core.info('Cache saved successfully');
+	        }
+	    });
+	}
+	
+	return cacheHttpClient;
+}
+
+var cacheTwirpClient = {};
+
+var cache_twirpClient = {};
+
+var cache$1 = {};
+
+/**
+ * Get the type of a JSON value.
+ * Distinguishes between array, null and object.
+ */
+function typeofJsonValue(value) {
+    let t = typeof value;
+    if (t == "object") {
+        if (Array.isArray(value))
+            return "array";
+        if (value === null)
+            return "null";
+    }
+    return t;
+}
+/**
+ * Is this a JSON object (instead of an array or null)?
+ */
+function isJsonObject(value) {
+    return value !== null && typeof value == "object" && !Array.isArray(value);
+}
+
+// lookup table from base64 character to byte
+let encTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+// lookup table from base64 character *code* to byte because lookup by number is fast
+let decTable = [];
+for (let i = 0; i < encTable.length; i++)
+    decTable[encTable[i].charCodeAt(0)] = i;
+// support base64url variants
+decTable["-".charCodeAt(0)] = encTable.indexOf("+");
+decTable["_".charCodeAt(0)] = encTable.indexOf("/");
+/**
+ * Decodes a base64 string to a byte array.
+ *
+ * - ignores white-space, including line breaks and tabs
+ * - allows inner padding (can decode concatenated base64 strings)
+ * - does not require padding
+ * - understands base64url encoding:
+ *   "-" instead of "+",
+ *   "_" instead of "/",
+ *   no padding
+ */
+function base64decode(base64Str) {
+    // estimate byte size, not accounting for inner padding and whitespace
+    let es = base64Str.length * 3 / 4;
+    // if (es % 3 !== 0)
+    // throw new Error('invalid base64 string');
+    if (base64Str[base64Str.length - 2] == '=')
+        es -= 2;
+    else if (base64Str[base64Str.length - 1] == '=')
+        es -= 1;
+    let bytes = new Uint8Array(es), bytePos = 0, // position in byte array
+    groupPos = 0, // position in base64 group
+    b, // current byte
+    p = 0 // previous byte
+    ;
+    for (let i = 0; i < base64Str.length; i++) {
+        b = decTable[base64Str.charCodeAt(i)];
+        if (b === undefined) {
+            // noinspection FallThroughInSwitchStatementJS
+            switch (base64Str[i]) {
+                case '=':
+                    groupPos = 0; // reset state when padding found
+                case '\n':
+                case '\r':
+                case '\t':
+                case ' ':
+                    continue; // skip white-space, and padding
+                default:
+                    throw Error(`invalid base64 string.`);
+            }
+        }
+        switch (groupPos) {
+            case 0:
+                p = b;
+                groupPos = 1;
+                break;
+            case 1:
+                bytes[bytePos++] = p << 2 | (b & 48) >> 4;
+                p = b;
+                groupPos = 2;
+                break;
+            case 2:
+                bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;
+                p = b;
+                groupPos = 3;
+                break;
+            case 3:
+                bytes[bytePos++] = (p & 3) << 6 | b;
+                groupPos = 0;
+                break;
+        }
+    }
+    if (groupPos == 1)
+        throw Error(`invalid base64 string.`);
+    return bytes.subarray(0, bytePos);
+}
+/**
+ * Encodes a byte array to a base64 string.
+ * Adds padding at the end.
+ * Does not insert newlines.
+ */
+function base64encode(bytes) {
+    let base64 = '', groupPos = 0, // position in base64 group
+    b, // current byte
+    p = 0; // carry over from previous byte
+    for (let i = 0; i < bytes.length; i++) {
+        b = bytes[i];
+        switch (groupPos) {
+            case 0:
+                base64 += encTable[b >> 2];
+                p = (b & 3) << 4;
+                groupPos = 1;
+                break;
+            case 1:
+                base64 += encTable[p | b >> 4];
+                p = (b & 15) << 2;
+                groupPos = 2;
+                break;
+            case 2:
+                base64 += encTable[p | b >> 6];
+                base64 += encTable[b & 63];
+                groupPos = 0;
+                break;
+        }
+    }
+    // padding required?
+    if (groupPos) {
+        base64 += encTable[p];
+        base64 += '=';
+        if (groupPos == 1)
+            base64 += '=';
+    }
+    return base64;
+}
+
+// Copyright (c) 2016, Daniel Wirtz  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+//   notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+//   notice, this list of conditions and the following disclaimer in the
+//   documentation and/or other materials provided with the distribution.
+// * Neither the name of its author, nor the names of its contributors
+//   may be used to endorse or promote products derived from this software
+//   without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+const fromCharCodes = (chunk) => String.fromCharCode.apply(String, chunk);
+/**
+ * @deprecated This function will no longer be exported with the next major
+ * release, since protobuf-ts has switch to TextDecoder API. If you need this
+ * function, please migrate to @protobufjs/utf8. For context, see
+ * https://github.com/timostamm/protobuf-ts/issues/184
+ *
+ * Reads UTF8 bytes as a string.
+ *
+ * See [protobufjs / utf8](https://github.com/protobufjs/protobuf.js/blob/9893e35b854621cce64af4bf6be2cff4fb892796/lib/utf8/index.js#L40)
+ *
+ * Copyright (c) 2016, Daniel Wirtz
+ */
+function utf8read(bytes) {
+    if (bytes.length < 1)
+        return "";
+    let pos = 0, // position in bytes
+    parts = [], chunk = [], i = 0, // char offset
+    t; // temporary
+    let len = bytes.length;
+    while (pos < len) {
+        t = bytes[pos++];
+        if (t < 128)
+            chunk[i++] = t;
+        else if (t > 191 && t < 224)
+            chunk[i++] = (t & 31) << 6 | bytes[pos++] & 63;
+        else if (t > 239 && t < 365) {
+            t = ((t & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 0x10000;
+            chunk[i++] = 0xD800 + (t >> 10);
+            chunk[i++] = 0xDC00 + (t & 1023);
+        }
+        else
+            chunk[i++] = (t & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63;
+        if (i > 8191) {
+            parts.push(fromCharCodes(chunk));
+            i = 0;
+        }
+    }
+    if (parts.length) {
+        if (i)
+            parts.push(fromCharCodes(chunk.slice(0, i)));
+        return parts.join("");
+    }
+    return fromCharCodes(chunk.slice(0, i));
+}
+
+/**
+ * This handler implements the default behaviour for unknown fields.
+ * When reading data, unknown fields are stored on the message, in a
+ * symbol property.
+ * When writing data, the symbol property is queried and unknown fields
+ * are serialized into the output again.
+ */
+var UnknownFieldHandler;
+(function (UnknownFieldHandler) {
+    /**
+     * The symbol used to store unknown fields for a message.
+     * The property must conform to `UnknownFieldContainer`.
+     */
+    UnknownFieldHandler.symbol = Symbol.for("protobuf-ts/unknown");
+    /**
+     * Store an unknown field during binary read directly on the message.
+     * This method is compatible with `BinaryReadOptions.readUnknownField`.
+     */
+    UnknownFieldHandler.onRead = (typeName, message, fieldNo, wireType, data) => {
+        let container = is(message) ? message[UnknownFieldHandler.symbol] : message[UnknownFieldHandler.symbol] = [];
+        container.push({ no: fieldNo, wireType, data });
+    };
+    /**
+     * Write unknown fields stored for the message to the writer.
+     * This method is compatible with `BinaryWriteOptions.writeUnknownFields`.
+     */
+    UnknownFieldHandler.onWrite = (typeName, message, writer) => {
+        for (let { no, wireType, data } of UnknownFieldHandler.list(message))
+            writer.tag(no, wireType).raw(data);
+    };
+    /**
+     * List unknown fields stored for the message.
+     * Note that there may be multiples fields with the same number.
+     */
+    UnknownFieldHandler.list = (message, fieldNo) => {
+        if (is(message)) {
+            let all = message[UnknownFieldHandler.symbol];
+            return fieldNo ? all.filter(uf => uf.no == fieldNo) : all;
+        }
+        return [];
+    };
+    /**
+     * Returns the last unknown field by field number.
+     */
+    UnknownFieldHandler.last = (message, fieldNo) => UnknownFieldHandler.list(message, fieldNo).slice(-1)[0];
+    const is = (message) => message && Array.isArray(message[UnknownFieldHandler.symbol]);
+})(UnknownFieldHandler || (UnknownFieldHandler = {}));
+/**
+ * Merges binary write or read options. Later values override earlier values.
+ */
+function mergeBinaryOptions(a, b) {
+    return Object.assign(Object.assign({}, a), b);
+}
+/**
+ * Protobuf binary format wire types.
+ *
+ * A wire type provides just enough information to find the length of the
+ * following value.
+ *
+ * See https://developers.google.com/protocol-buffers/docs/encoding#structure
+ */
+var WireType;
+(function (WireType) {
+    /**
+     * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum
+     */
+    WireType[WireType["Varint"] = 0] = "Varint";
+    /**
+     * Used for fixed64, sfixed64, double.
+     * Always 8 bytes with little-endian byte order.
+     */
+    WireType[WireType["Bit64"] = 1] = "Bit64";
+    /**
+     * Used for string, bytes, embedded messages, packed repeated fields
+     *
+     * Only repeated numeric types (types which use the varint, 32-bit,
+     * or 64-bit wire types) can be packed. In proto3, such fields are
+     * packed by default.
+     */
+    WireType[WireType["LengthDelimited"] = 2] = "LengthDelimited";
+    /**
+     * Used for groups
+     * @deprecated
+     */
+    WireType[WireType["StartGroup"] = 3] = "StartGroup";
+    /**
+     * Used for groups
+     * @deprecated
+     */
+    WireType[WireType["EndGroup"] = 4] = "EndGroup";
+    /**
+     * Used for fixed32, sfixed32, float.
+     * Always 4 bytes with little-endian byte order.
+     */
+    WireType[WireType["Bit32"] = 5] = "Bit32";
+})(WireType || (WireType = {}));
+
+// Copyright 2008 Google Inc.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Code generated by the Protocol Buffer compiler is owned by the owner
+// of the input file used when generating it.  This code is not
+// standalone and requires a support library to be linked with it.  This
+// support library is itself covered by the above license.
+/**
+ * Read a 64 bit varint as two JS numbers.
+ *
+ * Returns tuple:
+ * [0]: low bits
+ * [0]: high bits
+ *
+ * Copyright 2008 Google Inc.  All rights reserved.
+ *
+ * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175
+ */
+function varint64read() {
+    let lowBits = 0;
+    let highBits = 0;
+    for (let shift = 0; shift < 28; shift += 7) {
+        let b = this.buf[this.pos++];
+        lowBits |= (b & 0x7F) << shift;
+        if ((b & 0x80) == 0) {
+            this.assertBounds();
+            return [lowBits, highBits];
+        }
+    }
+    let middleByte = this.buf[this.pos++];
+    // last four bits of the first 32 bit number
+    lowBits |= (middleByte & 0x0F) << 28;
+    // 3 upper bits are part of the next 32 bit number
+    highBits = (middleByte & 0x70) >> 4;
+    if ((middleByte & 0x80) == 0) {
+        this.assertBounds();
+        return [lowBits, highBits];
+    }
+    for (let shift = 3; shift <= 31; shift += 7) {
+        let b = this.buf[this.pos++];
+        highBits |= (b & 0x7F) << shift;
+        if ((b & 0x80) == 0) {
+            this.assertBounds();
+            return [lowBits, highBits];
+        }
+    }
+    throw new Error('invalid varint');
+}
+/**
+ * Write a 64 bit varint, given as two JS numbers, to the given bytes array.
+ *
+ * Copyright 2008 Google Inc.  All rights reserved.
+ *
+ * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344
+ */
+function varint64write(lo, hi, bytes) {
+    for (let i = 0; i < 28; i = i + 7) {
+        const shift = lo >>> i;
+        const hasNext = !((shift >>> 7) == 0 && hi == 0);
+        const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;
+        bytes.push(byte);
+        if (!hasNext) {
+            return;
+        }
+    }
+    const splitBits = ((lo >>> 28) & 0x0F) | ((hi & 0x07) << 4);
+    const hasMoreBits = !((hi >> 3) == 0);
+    bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xFF);
+    if (!hasMoreBits) {
+        return;
+    }
+    for (let i = 3; i < 31; i = i + 7) {
+        const shift = hi >>> i;
+        const hasNext = !((shift >>> 7) == 0);
+        const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;
+        bytes.push(byte);
+        if (!hasNext) {
+            return;
+        }
+    }
+    bytes.push((hi >>> 31) & 0x01);
+}
+// constants for binary math
+const TWO_PWR_32_DBL$1 = (1 << 16) * (1 << 16);
+/**
+ * Parse decimal string of 64 bit integer value as two JS numbers.
+ *
+ * Returns tuple:
+ * [0]: minus sign?
+ * [1]: low bits
+ * [2]: high bits
+ *
+ * Copyright 2008 Google Inc.
+ */
+function int64fromString(dec) {
+    // Check for minus sign.
+    let minus = dec[0] == '-';
+    if (minus)
+        dec = dec.slice(1);
+    // Work 6 decimal digits at a time, acting like we're converting base 1e6
+    // digits to binary. This is safe to do with floating point math because
+    // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.
+    const base = 1e6;
+    let lowBits = 0;
+    let highBits = 0;
+    function add1e6digit(begin, end) {
+        // Note: Number('') is 0.
+        const digit1e6 = Number(dec.slice(begin, end));
+        highBits *= base;
+        lowBits = lowBits * base + digit1e6;
+        // Carry bits from lowBits to highBits
+        if (lowBits >= TWO_PWR_32_DBL$1) {
+            highBits = highBits + ((lowBits / TWO_PWR_32_DBL$1) | 0);
+            lowBits = lowBits % TWO_PWR_32_DBL$1;
+        }
+    }
+    add1e6digit(-24, -18);
+    add1e6digit(-18, -12);
+    add1e6digit(-12, -6);
+    add1e6digit(-6);
+    return [minus, lowBits, highBits];
+}
+/**
+ * Format 64 bit integer value (as two JS numbers) to decimal string.
+ *
+ * Copyright 2008 Google Inc.
+ */
+function int64toString(bitsLow, bitsHigh) {
+    // Skip the expensive conversion if the number is small enough to use the
+    // built-in conversions.
+    if ((bitsHigh >>> 0) <= 0x1FFFFF) {
+        return '' + (TWO_PWR_32_DBL$1 * bitsHigh + (bitsLow >>> 0));
+    }
+    // What this code is doing is essentially converting the input number from
+    // base-2 to base-1e7, which allows us to represent the 64-bit range with
+    // only 3 (very large) digits. Those digits are then trivial to convert to
+    // a base-10 string.
+    // The magic numbers used here are -
+    // 2^24 = 16777216 = (1,6777216) in base-1e7.
+    // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.
+    // Split 32:32 representation into 16:24:24 representation so our
+    // intermediate digits don't overflow.
+    let low = bitsLow & 0xFFFFFF;
+    let mid = (((bitsLow >>> 24) | (bitsHigh << 8)) >>> 0) & 0xFFFFFF;
+    let high = (bitsHigh >> 16) & 0xFFFF;
+    // Assemble our three base-1e7 digits, ignoring carries. The maximum
+    // value in a digit at this step is representable as a 48-bit integer, which
+    // can be stored in a 64-bit floating point number.
+    let digitA = low + (mid * 6777216) + (high * 6710656);
+    let digitB = mid + (high * 8147497);
+    let digitC = (high * 2);
+    // Apply carries from A to B and from B to C.
+    let base = 10000000;
+    if (digitA >= base) {
+        digitB += Math.floor(digitA / base);
+        digitA %= base;
+    }
+    if (digitB >= base) {
+        digitC += Math.floor(digitB / base);
+        digitB %= base;
+    }
+    // Convert base-1e7 digits to base-10, with optional leading zeroes.
+    function decimalFrom1e7(digit1e7, needLeadingZeros) {
+        let partial = digit1e7 ? String(digit1e7) : '';
+        if (needLeadingZeros) {
+            return '0000000'.slice(partial.length) + partial;
+        }
+        return partial;
+    }
+    return decimalFrom1e7(digitC, /*needLeadingZeros=*/ 0) +
+        decimalFrom1e7(digitB, /*needLeadingZeros=*/ digitC) +
+        // If the final 1e7 digit didn't need leading zeros, we would have
+        // returned via the trivial code path at the top.
+        decimalFrom1e7(digitA, /*needLeadingZeros=*/ 1);
+}
+/**
+ * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`
+ *
+ * Copyright 2008 Google Inc.  All rights reserved.
+ *
+ * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144
+ */
+function varint32write(value, bytes) {
+    if (value >= 0) {
+        // write value as varint 32
+        while (value > 0x7f) {
+            bytes.push((value & 0x7f) | 0x80);
+            value = value >>> 7;
+        }
+        bytes.push(value);
+    }
+    else {
+        for (let i = 0; i < 9; i++) {
+            bytes.push(value & 127 | 128);
+            value = value >> 7;
+        }
+        bytes.push(1);
+    }
+}
+/**
+ * Read an unsigned 32 bit varint.
+ *
+ * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220
+ */
+function varint32read() {
+    let b = this.buf[this.pos++];
+    let result = b & 0x7F;
+    if ((b & 0x80) == 0) {
+        this.assertBounds();
+        return result;
+    }
+    b = this.buf[this.pos++];
+    result |= (b & 0x7F) << 7;
+    if ((b & 0x80) == 0) {
+        this.assertBounds();
+        return result;
+    }
+    b = this.buf[this.pos++];
+    result |= (b & 0x7F) << 14;
+    if ((b & 0x80) == 0) {
+        this.assertBounds();
+        return result;
+    }
+    b = this.buf[this.pos++];
+    result |= (b & 0x7F) << 21;
+    if ((b & 0x80) == 0) {
+        this.assertBounds();
+        return result;
+    }
+    // Extract only last 4 bits
+    b = this.buf[this.pos++];
+    result |= (b & 0x0F) << 28;
+    for (let readBytes = 5; ((b & 0x80) !== 0) && readBytes < 10; readBytes++)
+        b = this.buf[this.pos++];
+    if ((b & 0x80) != 0)
+        throw new Error('invalid varint');
+    this.assertBounds();
+    // Result can have 32 bits, convert it to unsigned
+    return result >>> 0;
+}
+
+let BI;
+function detectBi() {
+    const dv = new DataView(new ArrayBuffer(8));
+    const ok = globalThis.BigInt !== undefined
+        && typeof dv.getBigInt64 === "function"
+        && typeof dv.getBigUint64 === "function"
+        && typeof dv.setBigInt64 === "function"
+        && typeof dv.setBigUint64 === "function";
+    BI = ok ? {
+        MIN: BigInt("-9223372036854775808"),
+        MAX: BigInt("9223372036854775807"),
+        UMIN: BigInt("0"),
+        UMAX: BigInt("18446744073709551615"),
+        C: BigInt,
+        V: dv,
+    } : undefined;
+}
+detectBi();
+function assertBi(bi) {
+    if (!bi)
+        throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support");
+}
+// used to validate from(string) input (when bigint is unavailable)
+const RE_DECIMAL_STR = /^-?[0-9]+$/;
+// constants for binary math
+const TWO_PWR_32_DBL = 0x100000000;
+const HALF_2_PWR_32 = 0x080000000;
+// base class for PbLong and PbULong provides shared code
+class SharedPbLong {
+    /**
+     * Create a new instance with the given bits.
+     */
+    constructor(lo, hi) {
+        this.lo = lo | 0;
+        this.hi = hi | 0;
+    }
+    /**
+     * Is this instance equal to 0?
+     */
+    isZero() {
+        return this.lo == 0 && this.hi == 0;
+    }
+    /**
+     * Convert to a native number.
+     */
+    toNumber() {
+        let result = this.hi * TWO_PWR_32_DBL + (this.lo >>> 0);
+        if (!Number.isSafeInteger(result))
+            throw new Error("cannot convert to safe number");
+        return result;
+    }
+}
+/**
+ * 64-bit unsigned integer as two 32-bit values.
+ * Converts between `string`, `number` and `bigint` representations.
+ */
+class PbULong extends SharedPbLong {
+    /**
+     * Create instance from a `string`, `number` or `bigint`.
+     */
+    static from(value) {
+        if (BI)
+            // noinspection FallThroughInSwitchStatementJS
+            switch (typeof value) {
+                case "string":
+                    if (value == "0")
+                        return this.ZERO;
+                    if (value == "")
+                        throw new Error('string is no integer');
+                    value = BI.C(value);
+                case "number":
+                    if (value === 0)
+                        return this.ZERO;
+                    value = BI.C(value);
+                case "bigint":
+                    if (!value)
+                        return this.ZERO;
+                    if (value < BI.UMIN)
+                        throw new Error('signed value for ulong');
+                    if (value > BI.UMAX)
+                        throw new Error('ulong too large');
+                    BI.V.setBigUint64(0, value, true);
+                    return new PbULong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));
+            }
+        else
+            switch (typeof value) {
+                case "string":
+                    if (value == "0")
+                        return this.ZERO;
+                    value = value.trim();
+                    if (!RE_DECIMAL_STR.test(value))
+                        throw new Error('string is no integer');
+                    let [minus, lo, hi] = int64fromString(value);
+                    if (minus)
+                        throw new Error('signed value for ulong');
+                    return new PbULong(lo, hi);
+                case "number":
+                    if (value == 0)
+                        return this.ZERO;
+                    if (!Number.isSafeInteger(value))
+                        throw new Error('number is no integer');
+                    if (value < 0)
+                        throw new Error('signed value for ulong');
+                    return new PbULong(value, value / TWO_PWR_32_DBL);
+            }
+        throw new Error('unknown value ' + typeof value);
+    }
+    /**
+     * Convert to decimal string.
+     */
+    toString() {
+        return BI ? this.toBigInt().toString() : int64toString(this.lo, this.hi);
+    }
+    /**
+     * Convert to native bigint.
+     */
+    toBigInt() {
+        assertBi(BI);
+        BI.V.setInt32(0, this.lo, true);
+        BI.V.setInt32(4, this.hi, true);
+        return BI.V.getBigUint64(0, true);
+    }
+}
+/**
+ * ulong 0 singleton.
+ */
+PbULong.ZERO = new PbULong(0, 0);
+/**
+ * 64-bit signed integer as two 32-bit values.
+ * Converts between `string`, `number` and `bigint` representations.
+ */
+class PbLong extends SharedPbLong {
+    /**
+     * Create instance from a `string`, `number` or `bigint`.
+     */
+    static from(value) {
+        if (BI)
+            // noinspection FallThroughInSwitchStatementJS
+            switch (typeof value) {
+                case "string":
+                    if (value == "0")
+                        return this.ZERO;
+                    if (value == "")
+                        throw new Error('string is no integer');
+                    value = BI.C(value);
+                case "number":
+                    if (value === 0)
+                        return this.ZERO;
+                    value = BI.C(value);
+                case "bigint":
+                    if (!value)
+                        return this.ZERO;
+                    if (value < BI.MIN)
+                        throw new Error('signed long too small');
+                    if (value > BI.MAX)
+                        throw new Error('signed long too large');
+                    BI.V.setBigInt64(0, value, true);
+                    return new PbLong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));
+            }
+        else
+            switch (typeof value) {
+                case "string":
+                    if (value == "0")
+                        return this.ZERO;
+                    value = value.trim();
+                    if (!RE_DECIMAL_STR.test(value))
+                        throw new Error('string is no integer');
+                    let [minus, lo, hi] = int64fromString(value);
+                    if (minus) {
+                        if (hi > HALF_2_PWR_32 || (hi == HALF_2_PWR_32 && lo != 0))
+                            throw new Error('signed long too small');
+                    }
+                    else if (hi >= HALF_2_PWR_32)
+                        throw new Error('signed long too large');
+                    let pbl = new PbLong(lo, hi);
+                    return minus ? pbl.negate() : pbl;
+                case "number":
+                    if (value == 0)
+                        return this.ZERO;
+                    if (!Number.isSafeInteger(value))
+                        throw new Error('number is no integer');
+                    return value > 0
+                        ? new PbLong(value, value / TWO_PWR_32_DBL)
+                        : new PbLong(-value, -value / TWO_PWR_32_DBL).negate();
+            }
+        throw new Error('unknown value ' + typeof value);
+    }
+    /**
+     * Do we have a minus sign?
+     */
+    isNegative() {
+        return (this.hi & HALF_2_PWR_32) !== 0;
+    }
+    /**
+     * Negate two's complement.
+     * Invert all the bits and add one to the result.
+     */
+    negate() {
+        let hi = ~this.hi, lo = this.lo;
+        if (lo)
+            lo = ~lo + 1;
+        else
+            hi += 1;
+        return new PbLong(lo, hi);
+    }
+    /**
+     * Convert to decimal string.
+     */
+    toString() {
+        if (BI)
+            return this.toBigInt().toString();
+        if (this.isNegative()) {
+            let n = this.negate();
+            return '-' + int64toString(n.lo, n.hi);
+        }
+        return int64toString(this.lo, this.hi);
+    }
+    /**
+     * Convert to native bigint.
+     */
+    toBigInt() {
+        assertBi(BI);
+        BI.V.setInt32(0, this.lo, true);
+        BI.V.setInt32(4, this.hi, true);
+        return BI.V.getBigInt64(0, true);
+    }
+}
+/**
+ * long 0 singleton.
+ */
+PbLong.ZERO = new PbLong(0, 0);
+
+const defaultsRead$1 = {
+    readUnknownField: true,
+    readerFactory: bytes => new BinaryReader(bytes),
+};
+/**
+ * Make options for reading binary data form partial options.
+ */
+function binaryReadOptions(options) {
+    return options ? Object.assign(Object.assign({}, defaultsRead$1), options) : defaultsRead$1;
+}
+class BinaryReader {
+    constructor(buf, textDecoder) {
+        this.varint64 = varint64read; // dirty cast for `this`
+        /**
+         * Read a `uint32` field, an unsigned 32 bit varint.
+         */
+        this.uint32 = varint32read; // dirty cast for `this` and access to protected `buf`
+        this.buf = buf;
+        this.len = buf.length;
+        this.pos = 0;
+        this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
+        this.textDecoder = textDecoder !== null && textDecoder !== void 0 ? textDecoder : new TextDecoder("utf-8", {
+            fatal: true,
+            ignoreBOM: true,
+        });
+    }
+    /**
+     * Reads a tag - field number and wire type.
+     */
+    tag() {
+        let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;
+        if (fieldNo <= 0 || wireType < 0 || wireType > 5)
+            throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
+        return [fieldNo, wireType];
+    }
+    /**
+     * Skip one element on the wire and return the skipped data.
+     * Supports WireType.StartGroup since v2.0.0-alpha.23.
+     */
+    skip(wireType) {
+        let start = this.pos;
+        // noinspection FallThroughInSwitchStatementJS
+        switch (wireType) {
+            case WireType.Varint:
+                while (this.buf[this.pos++] & 0x80) {
+                    // ignore
+                }
+                break;
+            case WireType.Bit64:
+                this.pos += 4;
+            case WireType.Bit32:
+                this.pos += 4;
+                break;
+            case WireType.LengthDelimited:
+                let len = this.uint32();
+                this.pos += len;
+                break;
+            case WireType.StartGroup:
+                // From descriptor.proto: Group type is deprecated, not supported in proto3.
+                // But we must still be able to parse and treat as unknown.
+                let t;
+                while ((t = this.tag()[1]) !== WireType.EndGroup) {
+                    this.skip(t);
+                }
+                break;
+            default:
+                throw new Error("cant skip wire type " + wireType);
+        }
+        this.assertBounds();
+        return this.buf.subarray(start, this.pos);
+    }
+    /**
+     * Throws error if position in byte array is out of range.
+     */
+    assertBounds() {
+        if (this.pos > this.len)
+            throw new RangeError("premature EOF");
+    }
+    /**
+     * Read a `int32` field, a signed 32 bit varint.
+     */
+    int32() {
+        return this.uint32() | 0;
+    }
+    /**
+     * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.
+     */
+    sint32() {
+        let zze = this.uint32();
+        // decode zigzag
+        return (zze >>> 1) ^ -(zze & 1);
+    }
+    /**
+     * Read a `int64` field, a signed 64-bit varint.
+     */
+    int64() {
+        return new PbLong(...this.varint64());
+    }
+    /**
+     * Read a `uint64` field, an unsigned 64-bit varint.
+     */
+    uint64() {
+        return new PbULong(...this.varint64());
+    }
+    /**
+     * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.
+     */
+    sint64() {
+        let [lo, hi] = this.varint64();
+        // decode zig zag
+        let s = -(lo & 1);
+        lo = ((lo >>> 1 | (hi & 1) << 31) ^ s);
+        hi = (hi >>> 1 ^ s);
+        return new PbLong(lo, hi);
+    }
+    /**
+     * Read a `bool` field, a variant.
+     */
+    bool() {
+        let [lo, hi] = this.varint64();
+        return lo !== 0 || hi !== 0;
+    }
+    /**
+     * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.
+     */
+    fixed32() {
+        return this.view.getUint32((this.pos += 4) - 4, true);
+    }
+    /**
+     * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.
+     */
+    sfixed32() {
+        return this.view.getInt32((this.pos += 4) - 4, true);
+    }
+    /**
+     * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.
+     */
+    fixed64() {
+        return new PbULong(this.sfixed32(), this.sfixed32());
+    }
+    /**
+     * Read a `fixed64` field, a signed, fixed-length 64-bit integer.
+     */
+    sfixed64() {
+        return new PbLong(this.sfixed32(), this.sfixed32());
+    }
+    /**
+     * Read a `float` field, 32-bit floating point number.
+     */
+    float() {
+        return this.view.getFloat32((this.pos += 4) - 4, true);
+    }
+    /**
+     * Read a `double` field, a 64-bit floating point number.
+     */
+    double() {
+        return this.view.getFloat64((this.pos += 8) - 8, true);
+    }
+    /**
+     * Read a `bytes` field, length-delimited arbitrary data.
+     */
+    bytes() {
+        let len = this.uint32();
+        let start = this.pos;
+        this.pos += len;
+        this.assertBounds();
+        return this.buf.subarray(start, start + len);
+    }
+    /**
+     * Read a `string` field, length-delimited data converted to UTF-8 text.
+     */
+    string() {
+        return this.textDecoder.decode(this.bytes());
+    }
+}
+
+/**
+ * assert that condition is true or throw error (with message)
+ */
+function assert(condition, msg) {
+    if (!condition) {
+        throw new Error(msg);
+    }
+}
+/**
+ * assert that value cannot exist = type `never`. throw runtime error if it does.
+ */
+function assertNever(value, msg) {
+    throw new Error(msg !== null && msg !== void 0 ? msg : 'Unexpected object: ' + value);
+}
+const FLOAT32_MAX = 3.4028234663852886e+38, FLOAT32_MIN = -34028234663852886e22, UINT32_MAX = 0xFFFFFFFF, INT32_MAX = 0X7FFFFFFF, INT32_MIN = -2147483648;
+function assertInt32(arg) {
+    if (typeof arg !== "number")
+        throw new Error('invalid int 32: ' + typeof arg);
+    if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)
+        throw new Error('invalid int 32: ' + arg);
+}
+function assertUInt32(arg) {
+    if (typeof arg !== "number")
+        throw new Error('invalid uint 32: ' + typeof arg);
+    if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)
+        throw new Error('invalid uint 32: ' + arg);
+}
+function assertFloat32(arg) {
+    if (typeof arg !== "number")
+        throw new Error('invalid float 32: ' + typeof arg);
+    if (!Number.isFinite(arg))
+        return;
+    if (arg > FLOAT32_MAX || arg < FLOAT32_MIN)
+        throw new Error('invalid float 32: ' + arg);
+}
+
+const defaultsWrite$1 = {
+    writeUnknownFields: true,
+    writerFactory: () => new BinaryWriter(),
+};
+/**
+ * Make options for writing binary data form partial options.
+ */
+function binaryWriteOptions(options) {
+    return options ? Object.assign(Object.assign({}, defaultsWrite$1), options) : defaultsWrite$1;
+}
+class BinaryWriter {
+    constructor(textEncoder) {
+        /**
+         * Previous fork states.
+         */
+        this.stack = [];
+        this.textEncoder = textEncoder !== null && textEncoder !== void 0 ? textEncoder : new TextEncoder();
+        this.chunks = [];
+        this.buf = [];
+    }
+    /**
+     * Return all bytes written and reset this writer.
+     */
+    finish() {
+        this.chunks.push(new Uint8Array(this.buf)); // flush the buffer
+        let len = 0;
+        for (let i = 0; i < this.chunks.length; i++)
+            len += this.chunks[i].length;
+        let bytes = new Uint8Array(len);
+        let offset = 0;
+        for (let i = 0; i < this.chunks.length; i++) {
+            bytes.set(this.chunks[i], offset);
+            offset += this.chunks[i].length;
+        }
+        this.chunks = [];
+        return bytes;
+    }
+    /**
+     * Start a new fork for length-delimited data like a message
+     * or a packed repeated field.
+     *
+     * Must be joined later with `join()`.
+     */
+    fork() {
+        this.stack.push({ chunks: this.chunks, buf: this.buf });
+        this.chunks = [];
+        this.buf = [];
+        return this;
+    }
+    /**
+     * Join the last fork. Write its length and bytes, then
+     * return to the previous state.
+     */
+    join() {
+        // get chunk of fork
+        let chunk = this.finish();
+        // restore previous state
+        let prev = this.stack.pop();
+        if (!prev)
+            throw new Error('invalid state, fork stack empty');
+        this.chunks = prev.chunks;
+        this.buf = prev.buf;
+        // write length of chunk as varint
+        this.uint32(chunk.byteLength);
+        return this.raw(chunk);
+    }
+    /**
+     * Writes a tag (field number and wire type).
+     *
+     * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.
+     *
+     * Generated code should compute the tag ahead of time and call `uint32()`.
+     */
+    tag(fieldNo, type) {
+        return this.uint32((fieldNo << 3 | type) >>> 0);
+    }
+    /**
+     * Write a chunk of raw bytes.
+     */
+    raw(chunk) {
+        if (this.buf.length) {
+            this.chunks.push(new Uint8Array(this.buf));
+            this.buf = [];
+        }
+        this.chunks.push(chunk);
+        return this;
+    }
+    /**
+     * Write a `uint32` value, an unsigned 32 bit varint.
+     */
+    uint32(value) {
+        assertUInt32(value);
+        // write value as varint 32, inlined for speed
+        while (value > 0x7f) {
+            this.buf.push((value & 0x7f) | 0x80);
+            value = value >>> 7;
+        }
+        this.buf.push(value);
+        return this;
+    }
+    /**
+     * Write a `int32` value, a signed 32 bit varint.
+     */
+    int32(value) {
+        assertInt32(value);
+        varint32write(value, this.buf);
+        return this;
+    }
+    /**
+     * Write a `bool` value, a variant.
+     */
+    bool(value) {
+        this.buf.push(value ? 1 : 0);
+        return this;
+    }
+    /**
+     * Write a `bytes` value, length-delimited arbitrary data.
+     */
+    bytes(value) {
+        this.uint32(value.byteLength); // write length of chunk as varint
+        return this.raw(value);
+    }
+    /**
+     * Write a `string` value, length-delimited data converted to UTF-8 text.
+     */
+    string(value) {
+        let chunk = this.textEncoder.encode(value);
+        this.uint32(chunk.byteLength); // write length of chunk as varint
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `float` value, 32-bit floating point number.
+     */
+    float(value) {
+        assertFloat32(value);
+        let chunk = new Uint8Array(4);
+        new DataView(chunk.buffer).setFloat32(0, value, true);
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `double` value, a 64-bit floating point number.
+     */
+    double(value) {
+        let chunk = new Uint8Array(8);
+        new DataView(chunk.buffer).setFloat64(0, value, true);
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.
+     */
+    fixed32(value) {
+        assertUInt32(value);
+        let chunk = new Uint8Array(4);
+        new DataView(chunk.buffer).setUint32(0, value, true);
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.
+     */
+    sfixed32(value) {
+        assertInt32(value);
+        let chunk = new Uint8Array(4);
+        new DataView(chunk.buffer).setInt32(0, value, true);
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.
+     */
+    sint32(value) {
+        assertInt32(value);
+        // zigzag encode
+        value = ((value << 1) ^ (value >> 31)) >>> 0;
+        varint32write(value, this.buf);
+        return this;
+    }
+    /**
+     * Write a `fixed64` value, a signed, fixed-length 64-bit integer.
+     */
+    sfixed64(value) {
+        let chunk = new Uint8Array(8);
+        let view = new DataView(chunk.buffer);
+        let long = PbLong.from(value);
+        view.setInt32(0, long.lo, true);
+        view.setInt32(4, long.hi, true);
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.
+     */
+    fixed64(value) {
+        let chunk = new Uint8Array(8);
+        let view = new DataView(chunk.buffer);
+        let long = PbULong.from(value);
+        view.setInt32(0, long.lo, true);
+        view.setInt32(4, long.hi, true);
+        return this.raw(chunk);
+    }
+    /**
+     * Write a `int64` value, a signed 64-bit varint.
+     */
+    int64(value) {
+        let long = PbLong.from(value);
+        varint64write(long.lo, long.hi, this.buf);
+        return this;
+    }
+    /**
+     * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.
+     */
+    sint64(value) {
+        let long = PbLong.from(value), 
+        // zigzag encode
+        sign = long.hi >> 31, lo = (long.lo << 1) ^ sign, hi = ((long.hi << 1) | (long.lo >>> 31)) ^ sign;
+        varint64write(lo, hi, this.buf);
+        return this;
+    }
+    /**
+     * Write a `uint64` value, an unsigned 64-bit varint.
+     */
+    uint64(value) {
+        let long = PbULong.from(value);
+        varint64write(long.lo, long.hi, this.buf);
+        return this;
+    }
+}
+
+const defaultsWrite = {
+    emitDefaultValues: false,
+    enumAsInteger: false,
+    useProtoFieldName: false,
+    prettySpaces: 0,
+}, defaultsRead = {
+    ignoreUnknownFields: false,
+};
+/**
+ * Make options for reading JSON data from partial options.
+ */
+function jsonReadOptions(options) {
+    return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;
+}
+/**
+ * Make options for writing JSON data from partial options.
+ */
+function jsonWriteOptions(options) {
+    return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;
+}
+/**
+ * Merges JSON write or read options. Later values override earlier values. Type registries are merged.
+ */
+function mergeJsonOptions(a, b) {
+    var _a, _b;
+    let c = Object.assign(Object.assign({}, a), b);
+    c.typeRegistry = [...((_a = a === null || a === void 0 ? void 0 : a.typeRegistry) !== null && _a !== void 0 ? _a : []), ...((_b = b === null || b === void 0 ? void 0 : b.typeRegistry) !== null && _b !== void 0 ? _b : [])];
+    return c;
+}
+
+/**
+ * The symbol used as a key on message objects to store the message type.
+ *
+ * Note that this is an experimental feature - it is here to stay, but
+ * implementation details may change without notice.
+ */
+const MESSAGE_TYPE = Symbol.for("protobuf-ts/message-type");
+
+/**
+ * Converts snake_case to lowerCamelCase.
+ *
+ * Should behave like protoc:
+ * https://github.com/protocolbuffers/protobuf/blob/e8ae137c96444ea313485ed1118c5e43b2099cf1/src/google/protobuf/compiler/java/java_helpers.cc#L118
+ */
+function lowerCamelCase(snakeCase) {
+    let capNext = false;
+    const sb = [];
+    for (let i = 0; i < snakeCase.length; i++) {
+        let next = snakeCase.charAt(i);
+        if (next == '_') {
+            capNext = true;
+        }
+        else if (/\d/.test(next)) {
+            sb.push(next);
+            capNext = true;
+        }
+        else if (capNext) {
+            sb.push(next.toUpperCase());
+            capNext = false;
+        }
+        else if (i == 0) {
+            sb.push(next.toLowerCase());
+        }
+        else {
+            sb.push(next);
+        }
+    }
+    return sb.join('');
+}
+
+/**
+ * Scalar value types. This is a subset of field types declared by protobuf
+ * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE
+ * are omitted, but the numerical values are identical.
+ */
+var ScalarType;
+(function (ScalarType) {
+    // 0 is reserved for errors.
+    // Order is weird for historical reasons.
+    ScalarType[ScalarType["DOUBLE"] = 1] = "DOUBLE";
+    ScalarType[ScalarType["FLOAT"] = 2] = "FLOAT";
+    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
+    // negative values are likely.
+    ScalarType[ScalarType["INT64"] = 3] = "INT64";
+    ScalarType[ScalarType["UINT64"] = 4] = "UINT64";
+    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
+    // negative values are likely.
+    ScalarType[ScalarType["INT32"] = 5] = "INT32";
+    ScalarType[ScalarType["FIXED64"] = 6] = "FIXED64";
+    ScalarType[ScalarType["FIXED32"] = 7] = "FIXED32";
+    ScalarType[ScalarType["BOOL"] = 8] = "BOOL";
+    ScalarType[ScalarType["STRING"] = 9] = "STRING";
+    // Tag-delimited aggregate.
+    // Group type is deprecated and not supported in proto3. However, Proto3
+    // implementations should still be able to parse the group wire format and
+    // treat group fields as unknown fields.
+    // TYPE_GROUP = 10,
+    // TYPE_MESSAGE = 11,  // Length-delimited aggregate.
+    // New in version 2.
+    ScalarType[ScalarType["BYTES"] = 12] = "BYTES";
+    ScalarType[ScalarType["UINT32"] = 13] = "UINT32";
+    // TYPE_ENUM = 14,
+    ScalarType[ScalarType["SFIXED32"] = 15] = "SFIXED32";
+    ScalarType[ScalarType["SFIXED64"] = 16] = "SFIXED64";
+    ScalarType[ScalarType["SINT32"] = 17] = "SINT32";
+    ScalarType[ScalarType["SINT64"] = 18] = "SINT64";
+})(ScalarType || (ScalarType = {}));
+/**
+ * JavaScript representation of 64 bit integral types. Equivalent to the
+ * field option "jstype".
+ *
+ * By default, protobuf-ts represents 64 bit types as `bigint`.
+ *
+ * You can change the default behaviour by enabling the plugin parameter
+ * `long_type_string`, which will represent 64 bit types as `string`.
+ *
+ * Alternatively, you can change the behaviour for individual fields
+ * with the field option "jstype":
+ *
+ * ```protobuf
+ * uint64 my_field = 1 [jstype = JS_STRING];
+ * uint64 other_field = 2 [jstype = JS_NUMBER];
+ * ```
+ */
+var LongType;
+(function (LongType) {
+    /**
+     * Use JavaScript `bigint`.
+     *
+     * Field option `[jstype = JS_NORMAL]`.
+     */
+    LongType[LongType["BIGINT"] = 0] = "BIGINT";
+    /**
+     * Use JavaScript `string`.
+     *
+     * Field option `[jstype = JS_STRING]`.
+     */
+    LongType[LongType["STRING"] = 1] = "STRING";
+    /**
+     * Use JavaScript `number`.
+     *
+     * Large values will loose precision.
+     *
+     * Field option `[jstype = JS_NUMBER]`.
+     */
+    LongType[LongType["NUMBER"] = 2] = "NUMBER";
+})(LongType || (LongType = {}));
+/**
+ * Protobuf 2.1.0 introduced packed repeated fields.
+ * Setting the field option `[packed = true]` enables packing.
+ *
+ * In proto3, all repeated fields are packed by default.
+ * Setting the field option `[packed = false]` disables packing.
+ *
+ * Packed repeated fields are encoded with a single tag,
+ * then a length-delimiter, then the element values.
+ *
+ * Unpacked repeated fields are encoded with a tag and
+ * value for each element.
+ *
+ * `bytes` and `string` cannot be packed.
+ */
+var RepeatType;
+(function (RepeatType) {
+    /**
+     * The field is not repeated.
+     */
+    RepeatType[RepeatType["NO"] = 0] = "NO";
+    /**
+     * The field is repeated and should be packed.
+     * Invalid for `bytes` and `string`, they cannot be packed.
+     */
+    RepeatType[RepeatType["PACKED"] = 1] = "PACKED";
+    /**
+     * The field is repeated but should not be packed.
+     * The only valid repeat type for repeated `bytes` and `string`.
+     */
+    RepeatType[RepeatType["UNPACKED"] = 2] = "UNPACKED";
+})(RepeatType || (RepeatType = {}));
+/**
+ * Turns PartialFieldInfo into FieldInfo.
+ */
+function normalizeFieldInfo(field) {
+    var _a, _b, _c, _d;
+    field.localName = (_a = field.localName) !== null && _a !== void 0 ? _a : lowerCamelCase(field.name);
+    field.jsonName = (_b = field.jsonName) !== null && _b !== void 0 ? _b : lowerCamelCase(field.name);
+    field.repeat = (_c = field.repeat) !== null && _c !== void 0 ? _c : RepeatType.NO;
+    field.opt = (_d = field.opt) !== null && _d !== void 0 ? _d : (field.repeat ? false : field.oneof ? false : field.kind == "message");
+    return field;
+}
+/**
+ * Read custom field options from a generated message type.
+ *
+ * @deprecated use readFieldOption()
+ */
+function readFieldOptions(messageType, fieldName, extensionName, extensionType) {
+    var _a;
+    const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;
+    return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;
+}
+function readFieldOption(messageType, fieldName, extensionName, extensionType) {
+    var _a;
+    const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;
+    if (!options) {
+        return undefined;
+    }
+    const optionVal = options[extensionName];
+    if (optionVal === undefined) {
+        return optionVal;
+    }
+    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
+}
+function readMessageOption(messageType, extensionName, extensionType) {
+    const options = messageType.options;
+    const optionVal = options[extensionName];
+    if (optionVal === undefined) {
+        return optionVal;
+    }
+    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
+}
+
+/**
+ * Is the given value a valid oneof group?
+ *
+ * We represent protobuf `oneof` as algebraic data types (ADT) in generated
+ * code. But when working with messages of unknown type, the ADT does not
+ * help us.
+ *
+ * This type guard checks if the given object adheres to the ADT rules, which
+ * are as follows:
+ *
+ * 1) Must be an object.
+ *
+ * 2) Must have a "oneofKind" discriminator property.
+ *
+ * 3) If "oneofKind" is `undefined`, no member field is selected. The object
+ * must not have any other properties.
+ *
+ * 4) If "oneofKind" is a `string`, the member field with this name is
+ * selected.
+ *
+ * 5) If a member field is selected, the object must have a second property
+ * with this name. The property must not be `undefined`.
+ *
+ * 6) No extra properties are allowed. The object has either one property
+ * (no selection) or two properties (selection).
+ *
+ */
+function isOneofGroup(any) {
+    if (typeof any != 'object' || any === null || !any.hasOwnProperty('oneofKind')) {
+        return false;
+    }
+    switch (typeof any.oneofKind) {
+        case "string":
+            if (any[any.oneofKind] === undefined)
+                return false;
+            return Object.keys(any).length == 2;
+        case "undefined":
+            return Object.keys(any).length == 1;
+        default:
+            return false;
+    }
+}
+/**
+ * Returns the value of the given field in a oneof group.
+ */
+function getOneofValue(oneof, kind) {
+    return oneof[kind];
+}
+function setOneofValue(oneof, kind, value) {
+    if (oneof.oneofKind !== undefined) {
+        delete oneof[oneof.oneofKind];
+    }
+    oneof.oneofKind = kind;
+    if (value !== undefined) {
+        oneof[kind] = value;
+    }
+}
+/**
+ * Removes the selected field in a oneof group.
+ *
+ * Note that the recommended way to modify a oneof group is to set
+ * a new object:
+ *
+ * ```ts
+ * message.result = { oneofKind: undefined };
+ * ```
+ */
+function clearOneofValue(oneof) {
+    if (oneof.oneofKind !== undefined) {
+        delete oneof[oneof.oneofKind];
+    }
+    oneof.oneofKind = undefined;
+}
+/**
+ * Returns the selected value of the given oneof group.
+ *
+ * Not that the recommended way to access a oneof group is to check
+ * the "oneofKind" property and let TypeScript narrow down the union
+ * type for you:
+ *
+ * ```ts
+ * if (message.result.oneofKind === "error") {
+ *   message.result.error; // string
+ * }
+ * ```
+ *
+ * In the rare case you just need the value, and do not care about
+ * which protobuf field is selected, you can use this function
+ * for convenience.
+ */
+function getSelectedOneofValue(oneof) {
+    if (oneof.oneofKind === undefined) {
+        return undefined;
+    }
+    return oneof[oneof.oneofKind];
+}
+
+// noinspection JSMethodCanBeStatic
+class ReflectionTypeCheck {
+    constructor(info) {
+        var _a;
+        this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];
+    }
+    prepare() {
+        if (this.data)
+            return;
+        const req = [], known = [], oneofs = [];
+        for (let field of this.fields) {
+            if (field.oneof) {
+                if (!oneofs.includes(field.oneof)) {
+                    oneofs.push(field.oneof);
+                    req.push(field.oneof);
+                    known.push(field.oneof);
+                }
+            }
+            else {
+                known.push(field.localName);
+                switch (field.kind) {
+                    case "scalar":
+                    case "enum":
+                        if (!field.opt || field.repeat)
+                            req.push(field.localName);
+                        break;
+                    case "message":
+                        if (field.repeat)
+                            req.push(field.localName);
+                        break;
+                    case "map":
+                        req.push(field.localName);
+                        break;
+                }
+            }
+        }
+        this.data = { req, known, oneofs: Object.values(oneofs) };
+    }
+    /**
+     * Is the argument a valid message as specified by the
+     * reflection information?
+     *
+     * Checks all field types recursively. The `depth`
+     * specifies how deep into the structure the check will be.
+     *
+     * With a depth of 0, only the presence of fields
+     * is checked.
+     *
+     * With a depth of 1 or more, the field types are checked.
+     *
+     * With a depth of 2 or more, the members of map, repeated
+     * and message fields are checked.
+     *
+     * Message fields will be checked recursively with depth - 1.
+     *
+     * The number of map entries / repeated values being checked
+     * is < depth.
+     */
+    is(message, depth, allowExcessProperties = false) {
+        if (depth < 0)
+            return true;
+        if (message === null || message === undefined || typeof message != 'object')
+            return false;
+        this.prepare();
+        let keys = Object.keys(message), data = this.data;
+        // if a required field is missing in arg, this cannot be a T
+        if (keys.length < data.req.length || data.req.some(n => !keys.includes(n)))
+            return false;
+        if (!allowExcessProperties) {
+            // if the arg contains a key we dont know, this is not a literal T
+            if (keys.some(k => !data.known.includes(k)))
+                return false;
+        }
+        // "With a depth of 0, only the presence and absence of fields is checked."
+        // "With a depth of 1 or more, the field types are checked."
+        if (depth < 1) {
+            return true;
+        }
+        // check oneof group
+        for (const name of data.oneofs) {
+            const group = message[name];
+            if (!isOneofGroup(group))
+                return false;
+            if (group.oneofKind === undefined)
+                continue;
+            const field = this.fields.find(f => f.localName === group.oneofKind);
+            if (!field)
+                return false; // we found no field, but have a kind, something is wrong
+            if (!this.field(group[group.oneofKind], field, allowExcessProperties, depth))
+                return false;
+        }
+        // check types
+        for (const field of this.fields) {
+            if (field.oneof !== undefined)
+                continue;
+            if (!this.field(message[field.localName], field, allowExcessProperties, depth))
+                return false;
+        }
+        return true;
+    }
+    field(arg, field, allowExcessProperties, depth) {
+        let repeated = field.repeat;
+        switch (field.kind) {
+            case "scalar":
+                if (arg === undefined)
+                    return field.opt;
+                if (repeated)
+                    return this.scalars(arg, field.T, depth, field.L);
+                return this.scalar(arg, field.T, field.L);
+            case "enum":
+                if (arg === undefined)
+                    return field.opt;
+                if (repeated)
+                    return this.scalars(arg, ScalarType.INT32, depth);
+                return this.scalar(arg, ScalarType.INT32);
+            case "message":
+                if (arg === undefined)
+                    return true;
+                if (repeated)
+                    return this.messages(arg, field.T(), allowExcessProperties, depth);
+                return this.message(arg, field.T(), allowExcessProperties, depth);
+            case "map":
+                if (typeof arg != 'object' || arg === null)
+                    return false;
+                if (depth < 2)
+                    return true;
+                if (!this.mapKeys(arg, field.K, depth))
+                    return false;
+                switch (field.V.kind) {
+                    case "scalar":
+                        return this.scalars(Object.values(arg), field.V.T, depth, field.V.L);
+                    case "enum":
+                        return this.scalars(Object.values(arg), ScalarType.INT32, depth);
+                    case "message":
+                        return this.messages(Object.values(arg), field.V.T(), allowExcessProperties, depth);
+                }
+                break;
+        }
+        return true;
+    }
+    message(arg, type, allowExcessProperties, depth) {
+        if (allowExcessProperties) {
+            return type.isAssignable(arg, depth);
+        }
+        return type.is(arg, depth);
+    }
+    messages(arg, type, allowExcessProperties, depth) {
+        if (!Array.isArray(arg))
+            return false;
+        if (depth < 2)
+            return true;
+        if (allowExcessProperties) {
+            for (let i = 0; i < arg.length && i < depth; i++)
+                if (!type.isAssignable(arg[i], depth - 1))
+                    return false;
+        }
+        else {
+            for (let i = 0; i < arg.length && i < depth; i++)
+                if (!type.is(arg[i], depth - 1))
+                    return false;
+        }
+        return true;
+    }
+    scalar(arg, type, longType) {
+        let argType = typeof arg;
+        switch (type) {
+            case ScalarType.UINT64:
+            case ScalarType.FIXED64:
+            case ScalarType.INT64:
+            case ScalarType.SFIXED64:
+            case ScalarType.SINT64:
+                switch (longType) {
+                    case LongType.BIGINT:
+                        return argType == "bigint";
+                    case LongType.NUMBER:
+                        return argType == "number" && !isNaN(arg);
+                    default:
+                        return argType == "string";
+                }
+            case ScalarType.BOOL:
+                return argType == 'boolean';
+            case ScalarType.STRING:
+                return argType == 'string';
+            case ScalarType.BYTES:
+                return arg instanceof Uint8Array;
+            case ScalarType.DOUBLE:
+            case ScalarType.FLOAT:
+                return argType == 'number' && !isNaN(arg);
+            default:
+                // case ScalarType.UINT32:
+                // case ScalarType.FIXED32:
+                // case ScalarType.INT32:
+                // case ScalarType.SINT32:
+                // case ScalarType.SFIXED32:
+                return argType == 'number' && Number.isInteger(arg);
+        }
+    }
+    scalars(arg, type, depth, longType) {
+        if (!Array.isArray(arg))
+            return false;
+        if (depth < 2)
+            return true;
+        if (Array.isArray(arg))
+            for (let i = 0; i < arg.length && i < depth; i++)
+                if (!this.scalar(arg[i], type, longType))
+                    return false;
+        return true;
+    }
+    mapKeys(map, type, depth) {
+        let keys = Object.keys(map);
+        switch (type) {
+            case ScalarType.INT32:
+            case ScalarType.FIXED32:
+            case ScalarType.SFIXED32:
+            case ScalarType.SINT32:
+            case ScalarType.UINT32:
+                return this.scalars(keys.slice(0, depth).map(k => parseInt(k)), type, depth);
+            case ScalarType.BOOL:
+                return this.scalars(keys.slice(0, depth).map(k => k == 'true' ? true : k == 'false' ? false : k), type, depth);
+            default:
+                return this.scalars(keys, type, depth, LongType.STRING);
+        }
+    }
+}
+
+/**
+ * Utility method to convert a PbLong or PbUlong to a JavaScript
+ * representation during runtime.
+ *
+ * Works with generated field information, `undefined` is equivalent
+ * to `STRING`.
+ */
+function reflectionLongConvert(long, type) {
+    switch (type) {
+        case LongType.BIGINT:
+            return long.toBigInt();
+        case LongType.NUMBER:
+            return long.toNumber();
+        default:
+            // case undefined:
+            // case LongType.STRING:
+            return long.toString();
+    }
+}
+
+/**
+ * Reads proto3 messages in canonical JSON format using reflection information.
+ *
+ * https://developers.google.com/protocol-buffers/docs/proto3#json
+ */
+class ReflectionJsonReader {
+    constructor(info) {
+        this.info = info;
+    }
+    prepare() {
+        var _a;
+        if (this.fMap === undefined) {
+            this.fMap = {};
+            const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];
+            for (const field of fieldsInput) {
+                this.fMap[field.name] = field;
+                this.fMap[field.jsonName] = field;
+                this.fMap[field.localName] = field;
+            }
+        }
+    }
+    // Cannot parse JSON  for #.
+    assert(condition, fieldName, jsonValue) {
+        if (!condition) {
+            let what = typeofJsonValue(jsonValue);
+            if (what == "number" || what == "boolean")
+                what = jsonValue.toString();
+            throw new Error(`Cannot parse JSON ${what} for ${this.info.typeName}#${fieldName}`);
+        }
+    }
+    /**
+     * Reads a message from canonical JSON format into the target message.
+     *
+     * Repeated fields are appended. Map entries are added, overwriting
+     * existing keys.
+     *
+     * If a message field is already present, it will be merged with the
+     * new data.
+     */
+    read(input, message, options) {
+        this.prepare();
+        const oneofsHandled = [];
+        for (const [jsonKey, jsonValue] of Object.entries(input)) {
+            const field = this.fMap[jsonKey];
+            if (!field) {
+                if (!options.ignoreUnknownFields)
+                    throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${jsonKey}`);
+                continue;
+            }
+            const localName = field.localName;
+            // handle oneof ADT
+            let target; // this will be the target for the field value, whether it is member of a oneof or not
+            if (field.oneof) {
+                if (jsonValue === null && (field.kind !== 'enum' || field.T()[0] !== 'google.protobuf.NullValue')) {
+                    continue;
+                }
+                // since json objects are unordered by specification, it is not possible to take the last of multiple oneofs
+                if (oneofsHandled.includes(field.oneof))
+                    throw new Error(`Multiple members of the oneof group "${field.oneof}" of ${this.info.typeName} are present in JSON.`);
+                oneofsHandled.push(field.oneof);
+                target = message[field.oneof] = {
+                    oneofKind: localName
+                };
+            }
+            else {
+                target = message;
+            }
+            // we have handled oneof above. we just have read the value into `target`.
+            if (field.kind == 'map') {
+                if (jsonValue === null) {
+                    continue;
+                }
+                // check input
+                this.assert(isJsonObject(jsonValue), field.name, jsonValue);
+                // our target to put map entries into
+                const fieldObj = target[localName];
+                // read entries
+                for (const [jsonObjKey, jsonObjValue] of Object.entries(jsonValue)) {
+                    this.assert(jsonObjValue !== null, field.name + " map value", null);
+                    // read value
+                    let val;
+                    switch (field.V.kind) {
+                        case "message":
+                            val = field.V.T().internalJsonRead(jsonObjValue, options);
+                            break;
+                        case "enum":
+                            val = this.enum(field.V.T(), jsonObjValue, field.name, options.ignoreUnknownFields);
+                            if (val === false)
+                                continue;
+                            break;
+                        case "scalar":
+                            val = this.scalar(jsonObjValue, field.V.T, field.V.L, field.name);
+                            break;
+                    }
+                    this.assert(val !== undefined, field.name + " map value", jsonObjValue);
+                    // read key
+                    let key = jsonObjKey;
+                    if (field.K == ScalarType.BOOL)
+                        key = key == "true" ? true : key == "false" ? false : key;
+                    key = this.scalar(key, field.K, LongType.STRING, field.name).toString();
+                    fieldObj[key] = val;
+                }
+            }
+            else if (field.repeat) {
+                if (jsonValue === null)
+                    continue;
+                // check input
+                this.assert(Array.isArray(jsonValue), field.name, jsonValue);
+                // our target to put array entries into
+                const fieldArr = target[localName];
+                // read array entries
+                for (const jsonItem of jsonValue) {
+                    this.assert(jsonItem !== null, field.name, null);
+                    let val;
+                    switch (field.kind) {
+                        case "message":
+                            val = field.T().internalJsonRead(jsonItem, options);
+                            break;
+                        case "enum":
+                            val = this.enum(field.T(), jsonItem, field.name, options.ignoreUnknownFields);
+                            if (val === false)
+                                continue;
+                            break;
+                        case "scalar":
+                            val = this.scalar(jsonItem, field.T, field.L, field.name);
+                            break;
+                    }
+                    this.assert(val !== undefined, field.name, jsonValue);
+                    fieldArr.push(val);
+                }
+            }
+            else {
+                switch (field.kind) {
+                    case "message":
+                        if (jsonValue === null && field.T().typeName != 'google.protobuf.Value') {
+                            this.assert(field.oneof === undefined, field.name + " (oneof member)", null);
+                            continue;
+                        }
+                        target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]);
+                        break;
+                    case "enum":
+                        if (jsonValue === null)
+                            continue;
+                        let val = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields);
+                        if (val === false)
+                            continue;
+                        target[localName] = val;
+                        break;
+                    case "scalar":
+                        if (jsonValue === null)
+                            continue;
+                        target[localName] = this.scalar(jsonValue, field.T, field.L, field.name);
+                        break;
+                }
+            }
+        }
+    }
+    /**
+     * Returns `false` for unrecognized string representations.
+     *
+     * google.protobuf.NullValue accepts only JSON `null` (or the old `"NULL_VALUE"`).
+     */
+    enum(type, json, fieldName, ignoreUnknownFields) {
+        if (type[0] == 'google.protobuf.NullValue')
+            assert(json === null || json === "NULL_VALUE", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} only accepts null.`);
+        if (json === null)
+            // we require 0 to be default value for all enums
+            return 0;
+        switch (typeof json) {
+            case "number":
+                assert(Number.isInteger(json), `Unable to parse field ${this.info.typeName}#${fieldName}, enum can only be integral number, got ${json}.`);
+                return json;
+            case "string":
+                let localEnumName = json;
+                if (type[2] && json.substring(0, type[2].length) === type[2])
+                    // lookup without the shared prefix
+                    localEnumName = json.substring(type[2].length);
+                let enumNumber = type[1][localEnumName];
+                if (typeof enumNumber === 'undefined' && ignoreUnknownFields) {
+                    return false;
+                }
+                assert(typeof enumNumber == "number", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} has no value for "${json}".`);
+                return enumNumber;
+        }
+        assert(false, `Unable to parse field ${this.info.typeName}#${fieldName}, cannot parse enum value from ${typeof json}".`);
+    }
+    scalar(json, type, longType, fieldName) {
+        let e;
+        try {
+            switch (type) {
+                // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".
+                // Either numbers or strings are accepted. Exponent notation is also accepted.
+                case ScalarType.DOUBLE:
+                case ScalarType.FLOAT:
+                    if (json === null)
+                        return .0;
+                    if (json === "NaN")
+                        return Number.NaN;
+                    if (json === "Infinity")
+                        return Number.POSITIVE_INFINITY;
+                    if (json === "-Infinity")
+                        return Number.NEGATIVE_INFINITY;
+                    if (json === "") {
+                        e = "empty string";
+                        break;
+                    }
+                    if (typeof json == "string" && json.trim().length !== json.length) {
+                        e = "extra whitespace";
+                        break;
+                    }
+                    if (typeof json != "string" && typeof json != "number") {
+                        break;
+                    }
+                    let float = Number(json);
+                    if (Number.isNaN(float)) {
+                        e = "not a number";
+                        break;
+                    }
+                    if (!Number.isFinite(float)) {
+                        // infinity and -infinity are handled by string representation above, so this is an error
+                        e = "too large or small";
+                        break;
+                    }
+                    if (type == ScalarType.FLOAT)
+                        assertFloat32(float);
+                    return float;
+                // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.
+                case ScalarType.INT32:
+                case ScalarType.FIXED32:
+                case ScalarType.SFIXED32:
+                case ScalarType.SINT32:
+                case ScalarType.UINT32:
+                    if (json === null)
+                        return 0;
+                    let int32;
+                    if (typeof json == "number")
+                        int32 = json;
+                    else if (json === "")
+                        e = "empty string";
+                    else if (typeof json == "string") {
+                        if (json.trim().length !== json.length)
+                            e = "extra whitespace";
+                        else
+                            int32 = Number(json);
+                    }
+                    if (int32 === undefined)
+                        break;
+                    if (type == ScalarType.UINT32)
+                        assertUInt32(int32);
+                    else
+                        assertInt32(int32);
+                    return int32;
+                // int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.
+                case ScalarType.INT64:
+                case ScalarType.SFIXED64:
+                case ScalarType.SINT64:
+                    if (json === null)
+                        return reflectionLongConvert(PbLong.ZERO, longType);
+                    if (typeof json != "number" && typeof json != "string")
+                        break;
+                    return reflectionLongConvert(PbLong.from(json), longType);
+                case ScalarType.FIXED64:
+                case ScalarType.UINT64:
+                    if (json === null)
+                        return reflectionLongConvert(PbULong.ZERO, longType);
+                    if (typeof json != "number" && typeof json != "string")
+                        break;
+                    return reflectionLongConvert(PbULong.from(json), longType);
+                // bool:
+                case ScalarType.BOOL:
+                    if (json === null)
+                        return false;
+                    if (typeof json !== "boolean")
+                        break;
+                    return json;
+                // string:
+                case ScalarType.STRING:
+                    if (json === null)
+                        return "";
+                    if (typeof json !== "string") {
+                        e = "extra whitespace";
+                        break;
+                    }
+                    try {
+                        encodeURIComponent(json);
+                    }
+                    catch (e) {
+                        e = "invalid UTF8";
+                        break;
+                    }
+                    return json;
+                // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
+                // Either standard or URL-safe base64 encoding with/without paddings are accepted.
+                case ScalarType.BYTES:
+                    if (json === null || json === "")
+                        return new Uint8Array(0);
+                    if (typeof json !== 'string')
+                        break;
+                    return base64decode(json);
+            }
+        }
+        catch (error) {
+            e = error.message;
+        }
+        this.assert(false, fieldName + (e ? " - " + e : ""), json);
+    }
+}
+
+/**
+ * Writes proto3 messages in canonical JSON format using reflection
+ * information.
+ *
+ * https://developers.google.com/protocol-buffers/docs/proto3#json
+ */
+class ReflectionJsonWriter {
+    constructor(info) {
+        var _a;
+        this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];
+    }
+    /**
+     * Converts the message to a JSON object, based on the field descriptors.
+     */
+    write(message, options) {
+        const json = {}, source = message;
+        for (const field of this.fields) {
+            // field is not part of a oneof, simply write as is
+            if (!field.oneof) {
+                let jsonValue = this.field(field, source[field.localName], options);
+                if (jsonValue !== undefined)
+                    json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;
+                continue;
+            }
+            // field is part of a oneof
+            const group = source[field.oneof];
+            if (group.oneofKind !== field.localName)
+                continue; // not selected, skip
+            const opt = field.kind == 'scalar' || field.kind == 'enum'
+                ? Object.assign(Object.assign({}, options), { emitDefaultValues: true }) : options;
+            let jsonValue = this.field(field, group[field.localName], opt);
+            assert(jsonValue !== undefined);
+            json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;
+        }
+        return json;
+    }
+    field(field, value, options) {
+        let jsonValue = undefined;
+        if (field.kind == 'map') {
+            assert(typeof value == "object" && value !== null);
+            const jsonObj = {};
+            switch (field.V.kind) {
+                case "scalar":
+                    for (const [entryKey, entryValue] of Object.entries(value)) {
+                        const val = this.scalar(field.V.T, entryValue, field.name, false, true);
+                        assert(val !== undefined);
+                        jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
+                    }
+                    break;
+                case "message":
+                    const messageType = field.V.T();
+                    for (const [entryKey, entryValue] of Object.entries(value)) {
+                        const val = this.message(messageType, entryValue, field.name, options);
+                        assert(val !== undefined);
+                        jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
+                    }
+                    break;
+                case "enum":
+                    const enumInfo = field.V.T();
+                    for (const [entryKey, entryValue] of Object.entries(value)) {
+                        assert(entryValue === undefined || typeof entryValue == 'number');
+                        const val = this.enum(enumInfo, entryValue, field.name, false, true, options.enumAsInteger);
+                        assert(val !== undefined);
+                        jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
+                    }
+                    break;
+            }
+            if (options.emitDefaultValues || Object.keys(jsonObj).length > 0)
+                jsonValue = jsonObj;
+        }
+        else if (field.repeat) {
+            assert(Array.isArray(value));
+            const jsonArr = [];
+            switch (field.kind) {
+                case "scalar":
+                    for (let i = 0; i < value.length; i++) {
+                        const val = this.scalar(field.T, value[i], field.name, field.opt, true);
+                        assert(val !== undefined);
+                        jsonArr.push(val);
+                    }
+                    break;
+                case "enum":
+                    const enumInfo = field.T();
+                    for (let i = 0; i < value.length; i++) {
+                        assert(value[i] === undefined || typeof value[i] == 'number');
+                        const val = this.enum(enumInfo, value[i], field.name, field.opt, true, options.enumAsInteger);
+                        assert(val !== undefined);
+                        jsonArr.push(val);
+                    }
+                    break;
+                case "message":
+                    const messageType = field.T();
+                    for (let i = 0; i < value.length; i++) {
+                        const val = this.message(messageType, value[i], field.name, options);
+                        assert(val !== undefined);
+                        jsonArr.push(val);
+                    }
+                    break;
+            }
+            // add converted array to json output
+            if (options.emitDefaultValues || jsonArr.length > 0 || options.emitDefaultValues)
+                jsonValue = jsonArr;
+        }
+        else {
+            switch (field.kind) {
+                case "scalar":
+                    jsonValue = this.scalar(field.T, value, field.name, field.opt, options.emitDefaultValues);
+                    break;
+                case "enum":
+                    jsonValue = this.enum(field.T(), value, field.name, field.opt, options.emitDefaultValues, options.enumAsInteger);
+                    break;
+                case "message":
+                    jsonValue = this.message(field.T(), value, field.name, options);
+                    break;
+            }
+        }
+        return jsonValue;
+    }
+    /**
+     * Returns `null` as the default for google.protobuf.NullValue.
+     */
+    enum(type, value, fieldName, optional, emitDefaultValues, enumAsInteger) {
+        if (type[0] == 'google.protobuf.NullValue')
+            return !emitDefaultValues && !optional ? undefined : null;
+        if (value === undefined) {
+            assert(optional);
+            return undefined;
+        }
+        if (value === 0 && !emitDefaultValues && !optional)
+            // we require 0 to be default value for all enums
+            return undefined;
+        assert(typeof value == 'number');
+        assert(Number.isInteger(value));
+        if (enumAsInteger || !type[1].hasOwnProperty(value))
+            // if we don't now the enum value, just return the number
+            return value;
+        if (type[2])
+            // restore the dropped prefix
+            return type[2] + type[1][value];
+        return type[1][value];
+    }
+    message(type, value, fieldName, options) {
+        if (value === undefined)
+            return options.emitDefaultValues ? null : undefined;
+        return type.internalJsonWrite(value, options);
+    }
+    scalar(type, value, fieldName, optional, emitDefaultValues) {
+        if (value === undefined) {
+            assert(optional);
+            return undefined;
+        }
+        const ed = emitDefaultValues || optional;
+        // noinspection FallThroughInSwitchStatementJS
+        switch (type) {
+            // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.
+            case ScalarType.INT32:
+            case ScalarType.SFIXED32:
+            case ScalarType.SINT32:
+                if (value === 0)
+                    return ed ? 0 : undefined;
+                assertInt32(value);
+                return value;
+            case ScalarType.FIXED32:
+            case ScalarType.UINT32:
+                if (value === 0)
+                    return ed ? 0 : undefined;
+                assertUInt32(value);
+                return value;
+            // float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".
+            // Either numbers or strings are accepted. Exponent notation is also accepted.
+            case ScalarType.FLOAT:
+                assertFloat32(value);
+            case ScalarType.DOUBLE:
+                if (value === 0)
+                    return ed ? 0 : undefined;
+                assert(typeof value == 'number');
+                if (Number.isNaN(value))
+                    return 'NaN';
+                if (value === Number.POSITIVE_INFINITY)
+                    return 'Infinity';
+                if (value === Number.NEGATIVE_INFINITY)
+                    return '-Infinity';
+                return value;
+            // string:
+            case ScalarType.STRING:
+                if (value === "")
+                    return ed ? '' : undefined;
+                assert(typeof value == 'string');
+                return value;
+            // bool:
+            case ScalarType.BOOL:
+                if (value === false)
+                    return ed ? false : undefined;
+                assert(typeof value == 'boolean');
+                return value;
+            // JSON value will be a decimal string. Either numbers or strings are accepted.
+            case ScalarType.UINT64:
+            case ScalarType.FIXED64:
+                assert(typeof value == 'number' || typeof value == 'string' || typeof value == 'bigint');
+                let ulong = PbULong.from(value);
+                if (ulong.isZero() && !ed)
+                    return undefined;
+                return ulong.toString();
+            // JSON value will be a decimal string. Either numbers or strings are accepted.
+            case ScalarType.INT64:
+            case ScalarType.SFIXED64:
+            case ScalarType.SINT64:
+                assert(typeof value == 'number' || typeof value == 'string' || typeof value == 'bigint');
+                let long = PbLong.from(value);
+                if (long.isZero() && !ed)
+                    return undefined;
+                return long.toString();
+            // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
+            // Either standard or URL-safe base64 encoding with/without paddings are accepted.
+            case ScalarType.BYTES:
+                assert(value instanceof Uint8Array);
+                if (!value.byteLength)
+                    return ed ? "" : undefined;
+                return base64encode(value);
+        }
+    }
+}
+
+/**
+ * Creates the default value for a scalar type.
+ */
+function reflectionScalarDefault(type, longType = LongType.STRING) {
+    switch (type) {
+        case ScalarType.BOOL:
+            return false;
+        case ScalarType.UINT64:
+        case ScalarType.FIXED64:
+            return reflectionLongConvert(PbULong.ZERO, longType);
+        case ScalarType.INT64:
+        case ScalarType.SFIXED64:
+        case ScalarType.SINT64:
+            return reflectionLongConvert(PbLong.ZERO, longType);
+        case ScalarType.DOUBLE:
+        case ScalarType.FLOAT:
+            return 0.0;
+        case ScalarType.BYTES:
+            return new Uint8Array(0);
+        case ScalarType.STRING:
+            return "";
+        default:
+            // case ScalarType.INT32:
+            // case ScalarType.UINT32:
+            // case ScalarType.SINT32:
+            // case ScalarType.FIXED32:
+            // case ScalarType.SFIXED32:
+            return 0;
+    }
+}
+
+/**
+ * Reads proto3 messages in binary format using reflection information.
+ *
+ * https://developers.google.com/protocol-buffers/docs/encoding
+ */
+class ReflectionBinaryReader {
+    constructor(info) {
+        this.info = info;
+    }
+    prepare() {
+        var _a;
+        if (!this.fieldNoToField) {
+            const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];
+            this.fieldNoToField = new Map(fieldsInput.map(field => [field.no, field]));
+        }
+    }
+    /**
+     * Reads a message from binary format into the target message.
+     *
+     * Repeated fields are appended. Map entries are added, overwriting
+     * existing keys.
+     *
+     * If a message field is already present, it will be merged with the
+     * new data.
+     */
+    read(reader, message, options, length) {
+        this.prepare();
+        const end = length === undefined ? reader.len : reader.pos + length;
+        while (reader.pos < end) {
+            // read the tag and find the field
+            const [fieldNo, wireType] = reader.tag(), field = this.fieldNoToField.get(fieldNo);
+            if (!field) {
+                let u = options.readUnknownField;
+                if (u == "throw")
+                    throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.info.typeName}`);
+                let d = reader.skip(wireType);
+                if (u !== false)
+                    (u === true ? UnknownFieldHandler.onRead : u)(this.info.typeName, message, fieldNo, wireType, d);
+                continue;
+            }
+            // target object for the field we are reading
+            let target = message, repeated = field.repeat, localName = field.localName;
+            // if field is member of oneof ADT, use ADT as target
+            if (field.oneof) {
+                target = target[field.oneof];
+                // if other oneof member selected, set new ADT
+                if (target.oneofKind !== localName)
+                    target = message[field.oneof] = {
+                        oneofKind: localName
+                    };
+            }
+            // we have handled oneof above, we just have read the value into `target[localName]`
+            switch (field.kind) {
+                case "scalar":
+                case "enum":
+                    let T = field.kind == "enum" ? ScalarType.INT32 : field.T;
+                    let L = field.kind == "scalar" ? field.L : undefined;
+                    if (repeated) {
+                        let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
+                        if (wireType == WireType.LengthDelimited && T != ScalarType.STRING && T != ScalarType.BYTES) {
+                            let e = reader.uint32() + reader.pos;
+                            while (reader.pos < e)
+                                arr.push(this.scalar(reader, T, L));
+                        }
+                        else
+                            arr.push(this.scalar(reader, T, L));
+                    }
+                    else
+                        target[localName] = this.scalar(reader, T, L);
+                    break;
+                case "message":
+                    if (repeated) {
+                        let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
+                        let msg = field.T().internalBinaryRead(reader, reader.uint32(), options);
+                        arr.push(msg);
+                    }
+                    else
+                        target[localName] = field.T().internalBinaryRead(reader, reader.uint32(), options, target[localName]);
+                    break;
+                case "map":
+                    let [mapKey, mapVal] = this.mapEntry(field, reader, options);
+                    // safe to assume presence of map object, oneof cannot contain repeated values
+                    target[localName][mapKey] = mapVal;
+                    break;
+            }
+        }
+    }
+    /**
+     * Read a map field, expecting key field = 1, value field = 2
+     */
+    mapEntry(field, reader, options) {
+        let length = reader.uint32();
+        let end = reader.pos + length;
+        let key = undefined; // javascript only allows number or string for object properties
+        let val = undefined;
+        while (reader.pos < end) {
+            let [fieldNo, wireType] = reader.tag();
+            switch (fieldNo) {
+                case 1:
+                    if (field.K == ScalarType.BOOL)
+                        key = reader.bool().toString();
+                    else
+                        // long types are read as string, number types are okay as number
+                        key = this.scalar(reader, field.K, LongType.STRING);
+                    break;
+                case 2:
+                    switch (field.V.kind) {
+                        case "scalar":
+                            val = this.scalar(reader, field.V.T, field.V.L);
+                            break;
+                        case "enum":
+                            val = reader.int32();
+                            break;
+                        case "message":
+                            val = field.V.T().internalBinaryRead(reader, reader.uint32(), options);
+                            break;
+                    }
+                    break;
+                default:
+                    throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) in map entry for ${this.info.typeName}#${field.name}`);
+            }
+        }
+        if (key === undefined) {
+            let keyRaw = reflectionScalarDefault(field.K);
+            key = field.K == ScalarType.BOOL ? keyRaw.toString() : keyRaw;
+        }
+        if (val === undefined)
+            switch (field.V.kind) {
+                case "scalar":
+                    val = reflectionScalarDefault(field.V.T, field.V.L);
+                    break;
+                case "enum":
+                    val = 0;
+                    break;
+                case "message":
+                    val = field.V.T().create();
+                    break;
+            }
+        return [key, val];
+    }
+    scalar(reader, type, longType) {
+        switch (type) {
+            case ScalarType.INT32:
+                return reader.int32();
+            case ScalarType.STRING:
+                return reader.string();
+            case ScalarType.BOOL:
+                return reader.bool();
+            case ScalarType.DOUBLE:
+                return reader.double();
+            case ScalarType.FLOAT:
+                return reader.float();
+            case ScalarType.INT64:
+                return reflectionLongConvert(reader.int64(), longType);
+            case ScalarType.UINT64:
+                return reflectionLongConvert(reader.uint64(), longType);
+            case ScalarType.FIXED64:
+                return reflectionLongConvert(reader.fixed64(), longType);
+            case ScalarType.FIXED32:
+                return reader.fixed32();
+            case ScalarType.BYTES:
+                return reader.bytes();
+            case ScalarType.UINT32:
+                return reader.uint32();
+            case ScalarType.SFIXED32:
+                return reader.sfixed32();
+            case ScalarType.SFIXED64:
+                return reflectionLongConvert(reader.sfixed64(), longType);
+            case ScalarType.SINT32:
+                return reader.sint32();
+            case ScalarType.SINT64:
+                return reflectionLongConvert(reader.sint64(), longType);
+        }
+    }
+}
+
+/**
+ * Writes proto3 messages in binary format using reflection information.
+ *
+ * https://developers.google.com/protocol-buffers/docs/encoding
+ */
+class ReflectionBinaryWriter {
+    constructor(info) {
+        this.info = info;
+    }
+    prepare() {
+        if (!this.fields) {
+            const fieldsInput = this.info.fields ? this.info.fields.concat() : [];
+            this.fields = fieldsInput.sort((a, b) => a.no - b.no);
+        }
+    }
+    /**
+     * Writes the message to binary format.
+     */
+    write(message, writer, options) {
+        this.prepare();
+        for (const field of this.fields) {
+            let value, // this will be our field value, whether it is member of a oneof or not
+            emitDefault, // whether we emit the default value (only true for oneof members)
+            repeated = field.repeat, localName = field.localName;
+            // handle oneof ADT
+            if (field.oneof) {
+                const group = message[field.oneof];
+                if (group.oneofKind !== localName)
+                    continue; // if field is not selected, skip
+                value = group[localName];
+                emitDefault = true;
+            }
+            else {
+                value = message[localName];
+                emitDefault = false;
+            }
+            // we have handled oneof above. we just have to honor `emitDefault`.
+            switch (field.kind) {
+                case "scalar":
+                case "enum":
+                    let T = field.kind == "enum" ? ScalarType.INT32 : field.T;
+                    if (repeated) {
+                        assert(Array.isArray(value));
+                        if (repeated == RepeatType.PACKED)
+                            this.packed(writer, T, field.no, value);
+                        else
+                            for (const item of value)
+                                this.scalar(writer, T, field.no, item, true);
+                    }
+                    else if (value === undefined)
+                        assert(field.opt);
+                    else
+                        this.scalar(writer, T, field.no, value, emitDefault || field.opt);
+                    break;
+                case "message":
+                    if (repeated) {
+                        assert(Array.isArray(value));
+                        for (const item of value)
+                            this.message(writer, options, field.T(), field.no, item);
+                    }
+                    else {
+                        this.message(writer, options, field.T(), field.no, value);
+                    }
+                    break;
+                case "map":
+                    assert(typeof value == 'object' && value !== null);
+                    for (const [key, val] of Object.entries(value))
+                        this.mapEntry(writer, options, field, key, val);
+                    break;
+            }
+        }
+        let u = options.writeUnknownFields;
+        if (u !== false)
+            (u === true ? UnknownFieldHandler.onWrite : u)(this.info.typeName, message, writer);
+    }
+    mapEntry(writer, options, field, key, value) {
+        writer.tag(field.no, WireType.LengthDelimited);
+        writer.fork();
+        // javascript only allows number or string for object properties
+        // we convert from our representation to the protobuf type
+        let keyValue = key;
+        switch (field.K) {
+            case ScalarType.INT32:
+            case ScalarType.FIXED32:
+            case ScalarType.UINT32:
+            case ScalarType.SFIXED32:
+            case ScalarType.SINT32:
+                keyValue = Number.parseInt(key);
+                break;
+            case ScalarType.BOOL:
+                assert(key == 'true' || key == 'false');
+                keyValue = key == 'true';
+                break;
+        }
+        // write key, expecting key field number = 1
+        this.scalar(writer, field.K, 1, keyValue, true);
+        // write value, expecting value field number = 2
+        switch (field.V.kind) {
+            case 'scalar':
+                this.scalar(writer, field.V.T, 2, value, true);
+                break;
+            case 'enum':
+                this.scalar(writer, ScalarType.INT32, 2, value, true);
+                break;
+            case 'message':
+                this.message(writer, options, field.V.T(), 2, value);
+                break;
+        }
+        writer.join();
+    }
+    message(writer, options, handler, fieldNo, value) {
+        if (value === undefined)
+            return;
+        handler.internalBinaryWrite(value, writer.tag(fieldNo, WireType.LengthDelimited).fork(), options);
+        writer.join();
+    }
+    /**
+     * Write a single scalar value.
+     */
+    scalar(writer, type, fieldNo, value, emitDefault) {
+        let [wireType, method, isDefault] = this.scalarInfo(type, value);
+        if (!isDefault || emitDefault) {
+            writer.tag(fieldNo, wireType);
+            writer[method](value);
+        }
+    }
+    /**
+     * Write an array of scalar values in packed format.
+     */
+    packed(writer, type, fieldNo, value) {
+        if (!value.length)
+            return;
+        assert(type !== ScalarType.BYTES && type !== ScalarType.STRING);
+        // write tag
+        writer.tag(fieldNo, WireType.LengthDelimited);
+        // begin length-delimited
+        writer.fork();
+        // write values without tags
+        let [, method,] = this.scalarInfo(type);
+        for (let i = 0; i < value.length; i++)
+            writer[method](value[i]);
+        // end length delimited
+        writer.join();
+    }
+    /**
+     * Get information for writing a scalar value.
+     *
+     * Returns tuple:
+     * [0]: appropriate WireType
+     * [1]: name of the appropriate method of IBinaryWriter
+     * [2]: whether the given value is a default value
+     *
+     * If argument `value` is omitted, [2] is always false.
+     */
+    scalarInfo(type, value) {
+        let t = WireType.Varint;
+        let m;
+        let i = value === undefined;
+        let d = value === 0;
+        switch (type) {
+            case ScalarType.INT32:
+                m = "int32";
+                break;
+            case ScalarType.STRING:
+                d = i || !value.length;
+                t = WireType.LengthDelimited;
+                m = "string";
+                break;
+            case ScalarType.BOOL:
+                d = value === false;
+                m = "bool";
+                break;
+            case ScalarType.UINT32:
+                m = "uint32";
+                break;
+            case ScalarType.DOUBLE:
+                t = WireType.Bit64;
+                m = "double";
+                break;
+            case ScalarType.FLOAT:
+                t = WireType.Bit32;
+                m = "float";
+                break;
+            case ScalarType.INT64:
+                d = i || PbLong.from(value).isZero();
+                m = "int64";
+                break;
+            case ScalarType.UINT64:
+                d = i || PbULong.from(value).isZero();
+                m = "uint64";
+                break;
+            case ScalarType.FIXED64:
+                d = i || PbULong.from(value).isZero();
+                t = WireType.Bit64;
+                m = "fixed64";
+                break;
+            case ScalarType.BYTES:
+                d = i || !value.byteLength;
+                t = WireType.LengthDelimited;
+                m = "bytes";
+                break;
+            case ScalarType.FIXED32:
+                t = WireType.Bit32;
+                m = "fixed32";
+                break;
+            case ScalarType.SFIXED32:
+                t = WireType.Bit32;
+                m = "sfixed32";
+                break;
+            case ScalarType.SFIXED64:
+                d = i || PbLong.from(value).isZero();
+                t = WireType.Bit64;
+                m = "sfixed64";
+                break;
+            case ScalarType.SINT32:
+                m = "sint32";
+                break;
+            case ScalarType.SINT64:
+                d = i || PbLong.from(value).isZero();
+                m = "sint64";
+                break;
+        }
+        return [t, m, i || d];
+    }
+}
+
+/**
+ * Creates an instance of the generic message, using the field
+ * information.
+ */
+function reflectionCreate(type) {
+    /**
+     * This ternary can be removed in the next major version.
+     * The `Object.create()` code path utilizes a new `messagePrototype`
+     * property on the `IMessageType` which has this same `MESSAGE_TYPE`
+     * non-enumerable property on it. Doing it this way means that we only
+     * pay the cost of `Object.defineProperty()` once per `IMessageType`
+     * class of once per "instance". The falsy code path is only provided
+     * for backwards compatibility in cases where the runtime library is
+     * updated without also updating the generated code.
+     */
+    const msg = type.messagePrototype
+        ? Object.create(type.messagePrototype)
+        : Object.defineProperty({}, MESSAGE_TYPE, { value: type });
+    for (let field of type.fields) {
+        let name = field.localName;
+        if (field.opt)
+            continue;
+        if (field.oneof)
+            msg[field.oneof] = { oneofKind: undefined };
+        else if (field.repeat)
+            msg[name] = [];
+        else
+            switch (field.kind) {
+                case "scalar":
+                    msg[name] = reflectionScalarDefault(field.T, field.L);
+                    break;
+                case "enum":
+                    // we require 0 to be default value for all enums
+                    msg[name] = 0;
+                    break;
+                case "map":
+                    msg[name] = {};
+                    break;
+            }
+    }
+    return msg;
+}
+
+/**
+ * Copy partial data into the target message.
+ *
+ * If a singular scalar or enum field is present in the source, it
+ * replaces the field in the target.
+ *
+ * If a singular message field is present in the source, it is merged
+ * with the target field by calling mergePartial() of the responsible
+ * message type.
+ *
+ * If a repeated field is present in the source, its values replace
+ * all values in the target array, removing extraneous values.
+ * Repeated message fields are copied, not merged.
+ *
+ * If a map field is present in the source, entries are added to the
+ * target map, replacing entries with the same key. Entries that only
+ * exist in the target remain. Entries with message values are copied,
+ * not merged.
+ *
+ * Note that this function differs from protobuf merge semantics,
+ * which appends repeated fields.
+ */
+function reflectionMergePartial(info, target, source) {
+    let fieldValue, // the field value we are working with
+    input = source, output; // where we want our field value to go
+    for (let field of info.fields) {
+        let name = field.localName;
+        if (field.oneof) {
+            const group = input[field.oneof]; // this is the oneof`s group in the source
+            if ((group === null || group === void 0 ? void 0 : group.oneofKind) == undefined) { // the user is free to omit
+                continue; // we skip this field, and all other members too
+            }
+            fieldValue = group[name]; // our value comes from the the oneof group of the source
+            output = target[field.oneof]; // and our output is the oneof group of the target
+            output.oneofKind = group.oneofKind; // always update discriminator
+            if (fieldValue == undefined) {
+                delete output[name]; // remove any existing value
+                continue; // skip further work on field
+            }
+        }
+        else {
+            fieldValue = input[name]; // we are using the source directly
+            output = target; // we want our field value to go directly into the target
+            if (fieldValue == undefined) {
+                continue; // skip further work on field, existing value is used as is
+            }
+        }
+        if (field.repeat)
+            output[name].length = fieldValue.length; // resize target array to match source array
+        // now we just work with `fieldValue` and `output` to merge the value
+        switch (field.kind) {
+            case "scalar":
+            case "enum":
+                if (field.repeat)
+                    for (let i = 0; i < fieldValue.length; i++)
+                        output[name][i] = fieldValue[i]; // not a reference type
+                else
+                    output[name] = fieldValue; // not a reference type
+                break;
+            case "message":
+                let T = field.T();
+                if (field.repeat)
+                    for (let i = 0; i < fieldValue.length; i++)
+                        output[name][i] = T.create(fieldValue[i]);
+                else if (output[name] === undefined)
+                    output[name] = T.create(fieldValue); // nothing to merge with
+                else
+                    T.mergePartial(output[name], fieldValue);
+                break;
+            case "map":
+                // Map and repeated fields are simply overwritten, not appended or merged
+                switch (field.V.kind) {
+                    case "scalar":
+                    case "enum":
+                        Object.assign(output[name], fieldValue); // elements are not reference types
+                        break;
+                    case "message":
+                        let T = field.V.T();
+                        for (let k of Object.keys(fieldValue))
+                            output[name][k] = T.create(fieldValue[k]);
+                        break;
+                }
+                break;
+        }
+    }
+}
+
+/**
+ * Determines whether two message of the same type have the same field values.
+ * Checks for deep equality, traversing repeated fields, oneof groups, maps
+ * and messages recursively.
+ * Will also return true if both messages are `undefined`.
+ */
+function reflectionEquals(info, a, b) {
+    if (a === b)
+        return true;
+    if (!a || !b)
+        return false;
+    for (let field of info.fields) {
+        let localName = field.localName;
+        let val_a = field.oneof ? a[field.oneof][localName] : a[localName];
+        let val_b = field.oneof ? b[field.oneof][localName] : b[localName];
+        switch (field.kind) {
+            case "enum":
+            case "scalar":
+                let t = field.kind == "enum" ? ScalarType.INT32 : field.T;
+                if (!(field.repeat
+                    ? repeatedPrimitiveEq(t, val_a, val_b)
+                    : primitiveEq(t, val_a, val_b)))
+                    return false;
+                break;
+            case "map":
+                if (!(field.V.kind == "message"
+                    ? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b))
+                    : repeatedPrimitiveEq(field.V.kind == "enum" ? ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b))))
+                    return false;
+                break;
+            case "message":
+                let T = field.T();
+                if (!(field.repeat
+                    ? repeatedMsgEq(T, val_a, val_b)
+                    : T.equals(val_a, val_b)))
+                    return false;
+                break;
+        }
+    }
+    return true;
+}
+const objectValues = Object.values;
+function primitiveEq(type, a, b) {
+    if (a === b)
+        return true;
+    if (type !== ScalarType.BYTES)
+        return false;
+    let ba = a;
+    let bb = b;
+    if (ba.length !== bb.length)
+        return false;
+    for (let i = 0; i < ba.length; i++)
+        if (ba[i] != bb[i])
+            return false;
+    return true;
+}
+function repeatedPrimitiveEq(type, a, b) {
+    if (a.length !== b.length)
+        return false;
+    for (let i = 0; i < a.length; i++)
+        if (!primitiveEq(type, a[i], b[i]))
+            return false;
+    return true;
+}
+function repeatedMsgEq(type, a, b) {
+    if (a.length !== b.length)
+        return false;
+    for (let i = 0; i < a.length; i++)
+        if (!type.equals(a[i], b[i]))
+            return false;
+    return true;
+}
+
+const baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));
+const messageTypeDescriptor = baseDescriptors[MESSAGE_TYPE] = {};
+/**
+ * This standard message type provides reflection-based
+ * operations to work with a message.
+ */
+class MessageType {
+    constructor(name, fields, options) {
+        this.defaultCheckDepth = 16;
+        this.typeName = name;
+        this.fields = fields.map(normalizeFieldInfo);
+        this.options = options !== null && options !== void 0 ? options : {};
+        messageTypeDescriptor.value = this;
+        this.messagePrototype = Object.create(null, baseDescriptors);
+        this.refTypeCheck = new ReflectionTypeCheck(this);
+        this.refJsonReader = new ReflectionJsonReader(this);
+        this.refJsonWriter = new ReflectionJsonWriter(this);
+        this.refBinReader = new ReflectionBinaryReader(this);
+        this.refBinWriter = new ReflectionBinaryWriter(this);
+    }
+    create(value) {
+        let message = reflectionCreate(this);
+        if (value !== undefined) {
+            reflectionMergePartial(this, message, value);
+        }
+        return message;
+    }
+    /**
+     * Clone the message.
+     *
+     * Unknown fields are discarded.
+     */
+    clone(message) {
+        let copy = this.create();
+        reflectionMergePartial(this, copy, message);
+        return copy;
+    }
+    /**
+     * Determines whether two message of the same type have the same field values.
+     * Checks for deep equality, traversing repeated fields, oneof groups, maps
+     * and messages recursively.
+     * Will also return true if both messages are `undefined`.
+     */
+    equals(a, b) {
+        return reflectionEquals(this, a, b);
+    }
+    /**
+     * Is the given value assignable to our message type
+     * and contains no [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
+     */
+    is(arg, depth = this.defaultCheckDepth) {
+        return this.refTypeCheck.is(arg, depth, false);
+    }
+    /**
+     * Is the given value assignable to our message type,
+     * regardless of [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
+     */
+    isAssignable(arg, depth = this.defaultCheckDepth) {
+        return this.refTypeCheck.is(arg, depth, true);
+    }
+    /**
+     * Copy partial data into the target message.
+     */
+    mergePartial(target, source) {
+        reflectionMergePartial(this, target, source);
+    }
+    /**
+     * Create a new message from binary format.
+     */
+    fromBinary(data, options) {
+        let opt = binaryReadOptions(options);
+        return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt);
+    }
+    /**
+     * Read a new message from a JSON value.
+     */
+    fromJson(json, options) {
+        return this.internalJsonRead(json, jsonReadOptions(options));
+    }
+    /**
+     * Read a new message from a JSON string.
+     * This is equivalent to `T.fromJson(JSON.parse(json))`.
+     */
+    fromJsonString(json, options) {
+        let value = JSON.parse(json);
+        return this.fromJson(value, options);
+    }
+    /**
+     * Write the message to canonical JSON value.
+     */
+    toJson(message, options) {
+        return this.internalJsonWrite(message, jsonWriteOptions(options));
+    }
+    /**
+     * Convert the message to canonical JSON string.
+     * This is equivalent to `JSON.stringify(T.toJson(t))`
+     */
+    toJsonString(message, options) {
+        var _a;
+        let value = this.toJson(message, options);
+        return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);
+    }
+    /**
+     * Write the message to binary format.
+     */
+    toBinary(message, options) {
+        let opt = binaryWriteOptions(options);
+        return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish();
+    }
+    /**
+     * This is an internal method. If you just want to read a message from
+     * JSON, use `fromJson()` or `fromJsonString()`.
+     *
+     * Reads JSON value and merges the fields into the target
+     * according to protobuf rules. If the target is omitted,
+     * a new instance is created first.
+     */
+    internalJsonRead(json, options, target) {
+        if (json !== null && typeof json == "object" && !Array.isArray(json)) {
+            let message = target !== null && target !== void 0 ? target : this.create();
+            this.refJsonReader.read(json, message, options);
+            return message;
+        }
+        throw new Error(`Unable to parse message ${this.typeName} from JSON ${typeofJsonValue(json)}.`);
+    }
+    /**
+     * This is an internal method. If you just want to write a message
+     * to JSON, use `toJson()` or `toJsonString().
+     *
+     * Writes JSON value and returns it.
+     */
+    internalJsonWrite(message, options) {
+        return this.refJsonWriter.write(message, options);
+    }
+    /**
+     * This is an internal method. If you just want to write a message
+     * in binary format, use `toBinary()`.
+     *
+     * Serializes the message in binary format and appends it to the given
+     * writer. Returns passed writer.
+     */
+    internalBinaryWrite(message, writer, options) {
+        this.refBinWriter.write(message, writer, options);
+        return writer;
+    }
+    /**
+     * This is an internal method. If you just want to read a message from
+     * binary data, use `fromBinary()`.
+     *
+     * Reads data from binary format and merges the fields into
+     * the target according to protobuf rules. If the target is
+     * omitted, a new instance is created first.
+     */
+    internalBinaryRead(reader, length, options, target) {
+        let message = target !== null && target !== void 0 ? target : this.create();
+        this.refBinReader.read(reader, message, options, length);
+        return message;
+    }
+}
+
+/**
+ * Check if the provided object is a proto message.
+ *
+ * Note that this is an experimental feature - it is here to stay, but
+ * implementation details may change without notice.
+ */
+function containsMessageType(msg) {
+    return msg[MESSAGE_TYPE] != null;
+}
+
+/**
+ * Is this a lookup object generated by Typescript, for a Typescript enum
+ * generated by protobuf-ts?
+ *
+ * - No `const enum` (enum must not be inlined, we need reverse mapping).
+ * - No string enum (we need int32 for protobuf).
+ * - Must have a value for 0 (otherwise, we would need to support custom default values).
+ */
+function isEnumObject(arg) {
+    if (typeof arg != 'object' || arg === null) {
+        return false;
+    }
+    if (!arg.hasOwnProperty(0)) {
+        return false;
+    }
+    for (let k of Object.keys(arg)) {
+        let num = parseInt(k);
+        if (!Number.isNaN(num)) {
+            // is there a name for the number?
+            let nam = arg[num];
+            if (nam === undefined)
+                return false;
+            // does the name resolve back to the number?
+            if (arg[nam] !== num)
+                return false;
+        }
+        else {
+            // is there a number for the name?
+            let num = arg[k];
+            if (num === undefined)
+                return false;
+            // is it a string enum?
+            if (typeof num !== 'number')
+                return false;
+            // do we know the number?
+            if (arg[num] === undefined)
+                return false;
+        }
+    }
+    return true;
+}
+/**
+ * Lists all values of a Typescript enum, as an array of objects with a "name"
+ * property and a "number" property.
+ *
+ * Note that it is possible that a number appears more than once, because it is
+ * possible to have aliases in an enum.
+ *
+ * Throws if the enum does not adhere to the rules of enums generated by
+ * protobuf-ts. See `isEnumObject()`.
+ */
+function listEnumValues(enumObject) {
+    if (!isEnumObject(enumObject))
+        throw new Error("not a typescript enum object");
+    let values = [];
+    for (let [name, number] of Object.entries(enumObject))
+        if (typeof number == "number")
+            values.push({ name, number });
+    return values;
+}
+/**
+ * Lists the names of a Typescript enum.
+ *
+ * Throws if the enum does not adhere to the rules of enums generated by
+ * protobuf-ts. See `isEnumObject()`.
+ */
+function listEnumNames(enumObject) {
+    return listEnumValues(enumObject).map(val => val.name);
+}
+/**
+ * Lists the numbers of a Typescript enum.
+ *
+ * Throws if the enum does not adhere to the rules of enums generated by
+ * protobuf-ts. See `isEnumObject()`.
+ */
+function listEnumNumbers(enumObject) {
+    return listEnumValues(enumObject)
+        .map(val => val.number)
+        .filter((num, index, arr) => arr.indexOf(num) == index);
+}
+
+// Public API of the protobuf-ts runtime.
+// Note: we do not use `export * from ...` to help tree shakers,
+// webpack verbose output hints that this should be useful
+// Convenience JSON typings and corresponding type guards
+
+var es2015$1 = /*#__PURE__*/Object.freeze({
+	__proto__: null,
+	BinaryReader: BinaryReader,
+	BinaryWriter: BinaryWriter,
+	get LongType () { return LongType; },
+	MESSAGE_TYPE: MESSAGE_TYPE,
+	MessageType: MessageType,
+	PbLong: PbLong,
+	PbULong: PbULong,
+	ReflectionBinaryReader: ReflectionBinaryReader,
+	ReflectionBinaryWriter: ReflectionBinaryWriter,
+	ReflectionJsonReader: ReflectionJsonReader,
+	ReflectionJsonWriter: ReflectionJsonWriter,
+	ReflectionTypeCheck: ReflectionTypeCheck,
+	get RepeatType () { return RepeatType; },
+	get ScalarType () { return ScalarType; },
+	get UnknownFieldHandler () { return UnknownFieldHandler; },
+	get WireType () { return WireType; },
+	assert: assert,
+	assertFloat32: assertFloat32,
+	assertInt32: assertInt32,
+	assertNever: assertNever,
+	assertUInt32: assertUInt32,
+	base64decode: base64decode,
+	base64encode: base64encode,
+	binaryReadOptions: binaryReadOptions,
+	binaryWriteOptions: binaryWriteOptions,
+	clearOneofValue: clearOneofValue,
+	containsMessageType: containsMessageType,
+	getOneofValue: getOneofValue,
+	getSelectedOneofValue: getSelectedOneofValue,
+	isEnumObject: isEnumObject,
+	isJsonObject: isJsonObject,
+	isOneofGroup: isOneofGroup,
+	jsonReadOptions: jsonReadOptions,
+	jsonWriteOptions: jsonWriteOptions,
+	listEnumNames: listEnumNames,
+	listEnumNumbers: listEnumNumbers,
+	listEnumValues: listEnumValues,
+	lowerCamelCase: lowerCamelCase,
+	mergeBinaryOptions: mergeBinaryOptions,
+	mergeJsonOptions: mergeJsonOptions,
+	normalizeFieldInfo: normalizeFieldInfo,
+	readFieldOption: readFieldOption,
+	readFieldOptions: readFieldOptions,
+	readMessageOption: readMessageOption,
+	reflectionCreate: reflectionCreate,
+	reflectionEquals: reflectionEquals,
+	reflectionMergePartial: reflectionMergePartial,
+	reflectionScalarDefault: reflectionScalarDefault,
+	setOneofValue: setOneofValue,
+	typeofJsonValue: typeofJsonValue,
+	utf8read: utf8read
+});
+
+/**
+ * Turns PartialMethodInfo into MethodInfo.
+ */
+function normalizeMethodInfo(method, service) {
+    var _a, _b, _c;
+    let m = method;
+    m.service = service;
+    m.localName = (_a = m.localName) !== null && _a !== void 0 ? _a : lowerCamelCase(m.name);
+    // noinspection PointlessBooleanExpressionJS
+    m.serverStreaming = !!m.serverStreaming;
+    // noinspection PointlessBooleanExpressionJS
+    m.clientStreaming = !!m.clientStreaming;
+    m.options = (_b = m.options) !== null && _b !== void 0 ? _b : {};
+    m.idempotency = (_c = m.idempotency) !== null && _c !== void 0 ? _c : undefined;
+    return m;
+}
+/**
+ * Read custom method options from a generated service client.
+ *
+ * @deprecated use readMethodOption()
+ */
+function readMethodOptions(service, methodName, extensionName, extensionType) {
+    var _a;
+    const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;
+    return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;
+}
+function readMethodOption(service, methodName, extensionName, extensionType) {
+    var _a;
+    const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;
+    if (!options) {
+        return undefined;
+    }
+    const optionVal = options[extensionName];
+    if (optionVal === undefined) {
+        return optionVal;
+    }
+    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
+}
+function readServiceOption(service, extensionName, extensionType) {
+    const options = service.options;
+    if (!options) {
+        return undefined;
+    }
+    const optionVal = options[extensionName];
+    if (optionVal === undefined) {
+        return optionVal;
+    }
+    return extensionType ? extensionType.fromJson(optionVal) : optionVal;
+}
+
+class ServiceType {
+    constructor(typeName, methods, options) {
+        this.typeName = typeName;
+        this.methods = methods.map(i => normalizeMethodInfo(i, this));
+        this.options = options !== null && options !== void 0 ? options : {};
+    }
+}
+
+/**
+ * An error that occurred while calling a RPC method.
+ */
+class RpcError extends Error {
+    constructor(message, code = 'UNKNOWN', meta) {
+        super(message);
+        this.name = 'RpcError';
+        // see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example
+        Object.setPrototypeOf(this, new.target.prototype);
+        this.code = code;
+        this.meta = meta !== null && meta !== void 0 ? meta : {};
+    }
+    toString() {
+        const l = [this.name + ': ' + this.message];
+        if (this.code) {
+            l.push('');
+            l.push('Code: ' + this.code);
+        }
+        if (this.serviceName && this.methodName) {
+            l.push('Method: ' + this.serviceName + '/' + this.methodName);
+        }
+        let m = Object.entries(this.meta);
+        if (m.length) {
+            l.push('');
+            l.push('Meta:');
+            for (let [k, v] of m) {
+                l.push(`  ${k}: ${v}`);
+            }
+        }
+        return l.join('\n');
+    }
+}
+
+/**
+ * Merges custom RPC options with defaults. Returns a new instance and keeps
+ * the "defaults" and the "options" unmodified.
+ *
+ * Merges `RpcMetadata` "meta", overwriting values from "defaults" with
+ * values from "options". Does not append values to existing entries.
+ *
+ * Merges "jsonOptions", including "jsonOptions.typeRegistry", by creating
+ * a new array that contains types from "options.jsonOptions.typeRegistry"
+ * first, then types from "defaults.jsonOptions.typeRegistry".
+ *
+ * Merges "binaryOptions".
+ *
+ * Merges "interceptors" by creating a new array that contains interceptors
+ * from "defaults" first, then interceptors from "options".
+ *
+ * Works with objects that extend `RpcOptions`, but only if the added
+ * properties are of type Date, primitive like string, boolean, or Array
+ * of primitives. If you have other property types, you have to merge them
+ * yourself.
+ */
+function mergeRpcOptions(defaults, options) {
+    if (!options)
+        return defaults;
+    let o = {};
+    copy(defaults, o);
+    copy(options, o);
+    for (let key of Object.keys(options)) {
+        let val = options[key];
+        switch (key) {
+            case "jsonOptions":
+                o.jsonOptions = mergeJsonOptions(defaults.jsonOptions, o.jsonOptions);
+                break;
+            case "binaryOptions":
+                o.binaryOptions = mergeBinaryOptions(defaults.binaryOptions, o.binaryOptions);
+                break;
+            case "meta":
+                o.meta = {};
+                copy(defaults.meta, o.meta);
+                copy(options.meta, o.meta);
+                break;
+            case "interceptors":
+                o.interceptors = defaults.interceptors ? defaults.interceptors.concat(val) : val.concat();
+                break;
+        }
+    }
+    return o;
+}
+function copy(a, into) {
+    if (!a)
+        return;
+    let c = into;
+    for (let [k, v] of Object.entries(a)) {
+        if (v instanceof Date)
+            c[k] = new Date(v.getTime());
+        else if (Array.isArray(v))
+            c[k] = v.concat();
+        else
+            c[k] = v;
+    }
+}
+
+var DeferredState;
+(function (DeferredState) {
+    DeferredState[DeferredState["PENDING"] = 0] = "PENDING";
+    DeferredState[DeferredState["REJECTED"] = 1] = "REJECTED";
+    DeferredState[DeferredState["RESOLVED"] = 2] = "RESOLVED";
+})(DeferredState || (DeferredState = {}));
+/**
+ * A deferred promise. This is a "controller" for a promise, which lets you
+ * pass a promise around and reject or resolve it from the outside.
+ *
+ * Warning: This class is to be used with care. Using it can make code very
+ * difficult to read. It is intended for use in library code that exposes
+ * promises, not for regular business logic.
+ */
+class Deferred {
+    /**
+     * @param preventUnhandledRejectionWarning - prevents the warning
+     * "Unhandled Promise rejection" by adding a noop rejection handler.
+     * Working with calls returned from the runtime-rpc package in an
+     * async function usually means awaiting one call property after
+     * the other. This means that the "status" is not being awaited when
+     * an earlier await for the "headers" is rejected. This causes the
+     * "unhandled promise reject" warning. A more correct behaviour for
+     * calls might be to become aware whether at least one of the
+     * promises is handled and swallow the rejection warning for the
+     * others.
+     */
+    constructor(preventUnhandledRejectionWarning = true) {
+        this._state = DeferredState.PENDING;
+        this._promise = new Promise((resolve, reject) => {
+            this._resolve = resolve;
+            this._reject = reject;
+        });
+        if (preventUnhandledRejectionWarning) {
+            this._promise.catch(_ => { });
+        }
+    }
+    /**
+     * Get the current state of the promise.
+     */
+    get state() {
+        return this._state;
+    }
+    /**
+     * Get the deferred promise.
+     */
+    get promise() {
+        return this._promise;
+    }
+    /**
+     * Resolve the promise. Throws if the promise is already resolved or rejected.
+     */
+    resolve(value) {
+        if (this.state !== DeferredState.PENDING)
+            throw new Error(`cannot resolve ${DeferredState[this.state].toLowerCase()}`);
+        this._resolve(value);
+        this._state = DeferredState.RESOLVED;
+    }
+    /**
+     * Reject the promise. Throws if the promise is already resolved or rejected.
+     */
+    reject(reason) {
+        if (this.state !== DeferredState.PENDING)
+            throw new Error(`cannot reject ${DeferredState[this.state].toLowerCase()}`);
+        this._reject(reason);
+        this._state = DeferredState.REJECTED;
+    }
+    /**
+     * Resolve the promise. Ignore if not pending.
+     */
+    resolvePending(val) {
+        if (this._state === DeferredState.PENDING)
+            this.resolve(val);
+    }
+    /**
+     * Reject the promise. Ignore if not pending.
+     */
+    rejectPending(reason) {
+        if (this._state === DeferredState.PENDING)
+            this.reject(reason);
+    }
+}
+
+/**
+ * A `RpcOutputStream` that you control.
+ */
+class RpcOutputStreamController {
+    constructor() {
+        this._lis = {
+            nxt: [],
+            msg: [],
+            err: [],
+            cmp: [],
+        };
+        this._closed = false;
+        // --- RpcOutputStream async iterator API
+        // iterator state.
+        // is undefined when no iterator has been acquired yet.
+        this._itState = { q: [] };
+    }
+    // --- RpcOutputStream callback API
+    onNext(callback) {
+        return this.addLis(callback, this._lis.nxt);
+    }
+    onMessage(callback) {
+        return this.addLis(callback, this._lis.msg);
+    }
+    onError(callback) {
+        return this.addLis(callback, this._lis.err);
+    }
+    onComplete(callback) {
+        return this.addLis(callback, this._lis.cmp);
+    }
+    addLis(callback, list) {
+        list.push(callback);
+        return () => {
+            let i = list.indexOf(callback);
+            if (i >= 0)
+                list.splice(i, 1);
+        };
+    }
+    // remove all listeners
+    clearLis() {
+        for (let l of Object.values(this._lis))
+            l.splice(0, l.length);
+    }
+    // --- Controller API
+    /**
+     * Is this stream already closed by a completion or error?
+     */
+    get closed() {
+        return this._closed !== false;
+    }
+    /**
+     * Emit message, close with error, or close successfully, but only one
+     * at a time.
+     * Can be used to wrap a stream by using the other stream's `onNext`.
+     */
+    notifyNext(message, error, complete) {
+        assert((message ? 1 : 0) + (error ? 1 : 0) + (complete ? 1 : 0) <= 1, 'only one emission at a time');
+        if (message)
+            this.notifyMessage(message);
+        if (error)
+            this.notifyError(error);
+        if (complete)
+            this.notifyComplete();
+    }
+    /**
+     * Emits a new message. Throws if stream is closed.
+     *
+     * Triggers onNext and onMessage callbacks.
+     */
+    notifyMessage(message) {
+        assert(!this.closed, 'stream is closed');
+        this.pushIt({ value: message, done: false });
+        this._lis.msg.forEach(l => l(message));
+        this._lis.nxt.forEach(l => l(message, undefined, false));
+    }
+    /**
+     * Closes the stream with an error. Throws if stream is closed.
+     *
+     * Triggers onNext and onError callbacks.
+     */
+    notifyError(error) {
+        assert(!this.closed, 'stream is closed');
+        this._closed = error;
+        this.pushIt(error);
+        this._lis.err.forEach(l => l(error));
+        this._lis.nxt.forEach(l => l(undefined, error, false));
+        this.clearLis();
+    }
+    /**
+     * Closes the stream successfully. Throws if stream is closed.
+     *
+     * Triggers onNext and onComplete callbacks.
+     */
+    notifyComplete() {
+        assert(!this.closed, 'stream is closed');
+        this._closed = true;
+        this.pushIt({ value: null, done: true });
+        this._lis.cmp.forEach(l => l());
+        this._lis.nxt.forEach(l => l(undefined, undefined, true));
+        this.clearLis();
+    }
+    /**
+     * Creates an async iterator (that can be used with `for await {...}`)
+     * to consume the stream.
+     *
+     * Some things to note:
+     * - If an error occurs, the `for await` will throw it.
+     * - If an error occurred before the `for await` was started, `for await`
+     *   will re-throw it.
+     * - If the stream is already complete, the `for await` will be empty.
+     * - If your `for await` consumes slower than the stream produces,
+     *   for example because you are relaying messages in a slow operation,
+     *   messages are queued.
+     */
+    [Symbol.asyncIterator]() {
+        // if we are closed, we are definitely not receiving any more messages.
+        // but we can't let the iterator get stuck. we want to either:
+        // a) finish the new iterator immediately, because we are completed
+        // b) reject the new iterator, because we errored
+        if (this._closed === true)
+            this.pushIt({ value: null, done: true });
+        else if (this._closed !== false)
+            this.pushIt(this._closed);
+        // the async iterator
+        return {
+            next: () => {
+                let state = this._itState;
+                assert(state, "bad state"); // if we don't have a state here, code is broken
+                // there should be no pending result.
+                // did the consumer call next() before we resolved our previous result promise?
+                assert(!state.p, "iterator contract broken");
+                // did we produce faster than the iterator consumed?
+                // return the oldest result from the queue.
+                let first = state.q.shift();
+                if (first)
+                    return ("value" in first) ? Promise.resolve(first) : Promise.reject(first);
+                // we have no result ATM, but we promise one.
+                // as soon as we have a result, we must resolve promise.
+                state.p = new Deferred();
+                return state.p.promise;
+            },
+        };
+    }
+    // "push" a new iterator result.
+    // this either resolves a pending promise, or enqueues the result.
+    pushIt(result) {
+        let state = this._itState;
+        // is the consumer waiting for us?
+        if (state.p) {
+            // yes, consumer is waiting for this promise.
+            const p = state.p;
+            assert(p.state == DeferredState.PENDING, "iterator contract broken");
+            // resolve the promise
+            ("value" in result) ? p.resolve(result) : p.reject(result);
+            // must cleanup, otherwise iterator.next() would pick it up again.
+            delete state.p;
+        }
+        else {
+            // we are producing faster than the iterator consumes.
+            // push result onto queue.
+            state.q.push(result);
+        }
+    }
+}
+
+var __awaiter$5 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+/**
+ * A unary RPC call. Unary means there is exactly one input message and
+ * exactly one output message unless an error occurred.
+ */
+class UnaryCall {
+    constructor(method, requestHeaders, request, headers, response, status, trailers) {
+        this.method = method;
+        this.requestHeaders = requestHeaders;
+        this.request = request;
+        this.headers = headers;
+        this.response = response;
+        this.status = status;
+        this.trailers = trailers;
+    }
+    /**
+     * If you are only interested in the final outcome of this call,
+     * you can await it to receive a `FinishedUnaryCall`.
+     */
+    then(onfulfilled, onrejected) {
+        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
+    }
+    promiseFinished() {
+        return __awaiter$5(this, void 0, void 0, function* () {
+            let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);
+            return {
+                method: this.method,
+                requestHeaders: this.requestHeaders,
+                request: this.request,
+                headers,
+                response,
+                status,
+                trailers
+            };
+        });
+    }
+}
+
+var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+/**
+ * A server streaming RPC call. The client provides exactly one input message
+ * but the server may respond with 0, 1, or more messages.
+ */
+class ServerStreamingCall {
+    constructor(method, requestHeaders, request, headers, response, status, trailers) {
+        this.method = method;
+        this.requestHeaders = requestHeaders;
+        this.request = request;
+        this.headers = headers;
+        this.responses = response;
+        this.status = status;
+        this.trailers = trailers;
+    }
+    /**
+     * Instead of awaiting the response status and trailers, you can
+     * just as well await this call itself to receive the server outcome.
+     * You should first setup some listeners to the `request` to
+     * see the actual messages the server replied with.
+     */
+    then(onfulfilled, onrejected) {
+        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
+    }
+    promiseFinished() {
+        return __awaiter$4(this, void 0, void 0, function* () {
+            let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);
+            return {
+                method: this.method,
+                requestHeaders: this.requestHeaders,
+                request: this.request,
+                headers,
+                status,
+                trailers,
+            };
+        });
+    }
+}
+
+var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
 };
-var endpoints_default = Endpoints;
+/**
+ * A client streaming RPC call. This means that the clients sends 0, 1, or
+ * more messages to the server, and the server replies with exactly one
+ * message.
+ */
+class ClientStreamingCall {
+    constructor(method, requestHeaders, request, headers, response, status, trailers) {
+        this.method = method;
+        this.requestHeaders = requestHeaders;
+        this.requests = request;
+        this.headers = headers;
+        this.response = response;
+        this.status = status;
+        this.trailers = trailers;
+    }
+    /**
+     * Instead of awaiting the response status and trailers, you can
+     * just as well await this call itself to receive the server outcome.
+     * Note that it may still be valid to send more request messages.
+     */
+    then(onfulfilled, onrejected) {
+        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
+    }
+    promiseFinished() {
+        return __awaiter$3(this, void 0, void 0, function* () {
+            let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);
+            return {
+                method: this.method,
+                requestHeaders: this.requestHeaders,
+                headers,
+                response,
+                status,
+                trailers
+            };
+        });
+    }
+}
+
+var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+/**
+ * A duplex streaming RPC call. This means that the clients sends an
+ * arbitrary amount of messages to the server, while at the same time,
+ * the server sends an arbitrary amount of messages to the client.
+ */
+class DuplexStreamingCall {
+    constructor(method, requestHeaders, request, headers, response, status, trailers) {
+        this.method = method;
+        this.requestHeaders = requestHeaders;
+        this.requests = request;
+        this.headers = headers;
+        this.responses = response;
+        this.status = status;
+        this.trailers = trailers;
+    }
+    /**
+     * Instead of awaiting the response status and trailers, you can
+     * just as well await this call itself to receive the server outcome.
+     * Note that it may still be valid to send more request messages.
+     */
+    then(onfulfilled, onrejected) {
+        return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
+    }
+    promiseFinished() {
+        return __awaiter$2(this, void 0, void 0, function* () {
+            let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);
+            return {
+                method: this.method,
+                requestHeaders: this.requestHeaders,
+                headers,
+                status,
+                trailers,
+            };
+        });
+    }
+}
+
+var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+/**
+ * Transport for testing.
+ */
+class TestTransport {
+    /**
+     * Initialize with mock data. Omitted fields have default value.
+     */
+    constructor(data) {
+        /**
+         * Suppress warning / error about uncaught rejections of
+         * "status" and "trailers".
+         */
+        this.suppressUncaughtRejections = true;
+        this.headerDelay = 10;
+        this.responseDelay = 50;
+        this.betweenResponseDelay = 10;
+        this.afterResponseDelay = 10;
+        this.data = data !== null && data !== void 0 ? data : {};
+    }
+    /**
+     * Sent message(s) during the last operation.
+     */
+    get sentMessages() {
+        if (this.lastInput instanceof TestInputStream) {
+            return this.lastInput.sent;
+        }
+        else if (typeof this.lastInput == "object") {
+            return [this.lastInput.single];
+        }
+        return [];
+    }
+    /**
+     * Sending message(s) completed?
+     */
+    get sendComplete() {
+        if (this.lastInput instanceof TestInputStream) {
+            return this.lastInput.completed;
+        }
+        else if (typeof this.lastInput == "object") {
+            return true;
+        }
+        return false;
+    }
+    // Creates a promise for response headers from the mock data.
+    promiseHeaders() {
+        var _a;
+        const headers = (_a = this.data.headers) !== null && _a !== void 0 ? _a : TestTransport.defaultHeaders;
+        return headers instanceof RpcError
+            ? Promise.reject(headers)
+            : Promise.resolve(headers);
+    }
+    // Creates a promise for a single, valid, message from the mock data.
+    promiseSingleResponse(method) {
+        if (this.data.response instanceof RpcError) {
+            return Promise.reject(this.data.response);
+        }
+        let r;
+        if (Array.isArray(this.data.response)) {
+            assert(this.data.response.length > 0);
+            r = this.data.response[0];
+        }
+        else if (this.data.response !== undefined) {
+            r = this.data.response;
+        }
+        else {
+            r = method.O.create();
+        }
+        assert(method.O.is(r));
+        return Promise.resolve(r);
+    }
+    /**
+     * Pushes response messages from the mock data to the output stream.
+     * If an error response, status or trailers are mocked, the stream is
+     * closed with the respective error.
+     * Otherwise, stream is completed successfully.
+     *
+     * The returned promise resolves when the stream is closed. It should
+     * not reject. If it does, code is broken.
+     */
+    streamResponses(method, stream, abort) {
+        return __awaiter$1(this, void 0, void 0, function* () {
+            // normalize "data.response" into an array of valid output messages
+            const messages = [];
+            if (this.data.response === undefined) {
+                messages.push(method.O.create());
+            }
+            else if (Array.isArray(this.data.response)) {
+                for (let msg of this.data.response) {
+                    assert(method.O.is(msg));
+                    messages.push(msg);
+                }
+            }
+            else if (!(this.data.response instanceof RpcError)) {
+                assert(method.O.is(this.data.response));
+                messages.push(this.data.response);
+            }
+            // start the stream with an initial delay.
+            // if the request is cancelled, notify() error and exit.
+            try {
+                yield delay(this.responseDelay, abort)(undefined);
+            }
+            catch (error) {
+                stream.notifyError(error);
+                return;
+            }
+            // if error response was mocked, notify() error (stream is now closed with error) and exit.
+            if (this.data.response instanceof RpcError) {
+                stream.notifyError(this.data.response);
+                return;
+            }
+            // regular response messages were mocked. notify() them.
+            for (let msg of messages) {
+                stream.notifyMessage(msg);
+                // add a short delay between responses
+                // if the request is cancelled, notify() error and exit.
+                try {
+                    yield delay(this.betweenResponseDelay, abort)(undefined);
+                }
+                catch (error) {
+                    stream.notifyError(error);
+                    return;
+                }
+            }
+            // error status was mocked, notify() error (stream is now closed with error) and exit.
+            if (this.data.status instanceof RpcError) {
+                stream.notifyError(this.data.status);
+                return;
+            }
+            // error trailers were mocked, notify() error (stream is now closed with error) and exit.
+            if (this.data.trailers instanceof RpcError) {
+                stream.notifyError(this.data.trailers);
+                return;
+            }
+            // stream completed successfully
+            stream.notifyComplete();
+        });
+    }
+    // Creates a promise for response status from the mock data.
+    promiseStatus() {
+        var _a;
+        const status = (_a = this.data.status) !== null && _a !== void 0 ? _a : TestTransport.defaultStatus;
+        return status instanceof RpcError
+            ? Promise.reject(status)
+            : Promise.resolve(status);
+    }
+    // Creates a promise for response trailers from the mock data.
+    promiseTrailers() {
+        var _a;
+        const trailers = (_a = this.data.trailers) !== null && _a !== void 0 ? _a : TestTransport.defaultTrailers;
+        return trailers instanceof RpcError
+            ? Promise.reject(trailers)
+            : Promise.resolve(trailers);
+    }
+    maybeSuppressUncaught(...promise) {
+        if (this.suppressUncaughtRejections) {
+            for (let p of promise) {
+                p.catch(() => {
+                });
+            }
+        }
+    }
+    mergeOptions(options) {
+        return mergeRpcOptions({}, options);
+    }
+    unary(method, input, options) {
+        var _a;
+        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
+            .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise
+            .catch(_ => {
+        })
+            .then(delay(this.responseDelay, options.abort))
+            .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise
+            .catch(_ => {
+        })
+            .then(delay(this.afterResponseDelay, options.abort))
+            .then(_ => this.promiseStatus()), trailersPromise = responsePromise
+            .catch(_ => {
+        })
+            .then(delay(this.afterResponseDelay, options.abort))
+            .then(_ => this.promiseTrailers());
+        this.maybeSuppressUncaught(statusPromise, trailersPromise);
+        this.lastInput = { single: input };
+        return new UnaryCall(method, requestHeaders, input, headersPromise, responsePromise, statusPromise, trailersPromise);
+    }
+    serverStreaming(method, input, options) {
+        var _a;
+        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
+            .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise
+            .then(delay(this.responseDelay, options.abort))
+            .catch(() => {
+        })
+            .then(() => this.streamResponses(method, outputStream, options.abort))
+            .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise
+            .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise
+            .then(() => this.promiseTrailers());
+        this.maybeSuppressUncaught(statusPromise, trailersPromise);
+        this.lastInput = { single: input };
+        return new ServerStreamingCall(method, requestHeaders, input, headersPromise, outputStream, statusPromise, trailersPromise);
+    }
+    clientStreaming(method, options) {
+        var _a;
+        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
+            .then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise
+            .catch(_ => {
+        })
+            .then(delay(this.responseDelay, options.abort))
+            .then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise
+            .catch(_ => {
+        })
+            .then(delay(this.afterResponseDelay, options.abort))
+            .then(_ => this.promiseStatus()), trailersPromise = responsePromise
+            .catch(_ => {
+        })
+            .then(delay(this.afterResponseDelay, options.abort))
+            .then(_ => this.promiseTrailers());
+        this.maybeSuppressUncaught(statusPromise, trailersPromise);
+        this.lastInput = new TestInputStream(this.data, options.abort);
+        return new ClientStreamingCall(method, requestHeaders, this.lastInput, headersPromise, responsePromise, statusPromise, trailersPromise);
+    }
+    duplex(method, options) {
+        var _a;
+        const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
+            .then(delay(this.headerDelay, options.abort)), outputStream = new RpcOutputStreamController(), responseStreamClosedPromise = headersPromise
+            .then(delay(this.responseDelay, options.abort))
+            .catch(() => {
+        })
+            .then(() => this.streamResponses(method, outputStream, options.abort))
+            .then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise
+            .then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise
+            .then(() => this.promiseTrailers());
+        this.maybeSuppressUncaught(statusPromise, trailersPromise);
+        this.lastInput = new TestInputStream(this.data, options.abort);
+        return new DuplexStreamingCall(method, requestHeaders, this.lastInput, headersPromise, outputStream, statusPromise, trailersPromise);
+    }
+}
+TestTransport.defaultHeaders = {
+    responseHeader: "test"
+};
+TestTransport.defaultStatus = {
+    code: "OK", detail: "all good"
+};
+TestTransport.defaultTrailers = {
+    responseTrailer: "test"
+};
+function delay(ms, abort) {
+    return (v) => new Promise((resolve, reject) => {
+        if (abort === null || abort === void 0 ? void 0 : abort.aborted) {
+            reject(new RpcError("user cancel", "CANCELLED"));
+        }
+        else {
+            const id = setTimeout(() => resolve(v), ms);
+            if (abort) {
+                abort.addEventListener("abort", ev => {
+                    clearTimeout(id);
+                    reject(new RpcError("user cancel", "CANCELLED"));
+                });
+            }
+        }
+    });
+}
+class TestInputStream {
+    constructor(data, abort) {
+        this._completed = false;
+        this._sent = [];
+        this.data = data;
+        this.abort = abort;
+    }
+    get sent() {
+        return this._sent;
+    }
+    get completed() {
+        return this._completed;
+    }
+    send(message) {
+        if (this.data.inputMessage instanceof RpcError) {
+            return Promise.reject(this.data.inputMessage);
+        }
+        const delayMs = this.data.inputMessage === undefined
+            ? 10
+            : this.data.inputMessage;
+        return Promise.resolve(undefined)
+            .then(() => {
+            this._sent.push(message);
+        })
+            .then(delay(delayMs, this.abort));
+    }
+    complete() {
+        if (this.data.inputComplete instanceof RpcError) {
+            return Promise.reject(this.data.inputComplete);
+        }
+        const delayMs = this.data.inputComplete === undefined
+            ? 10
+            : this.data.inputComplete;
+        return Promise.resolve(undefined)
+            .then(() => {
+            this._completed = true;
+        })
+            .then(delay(delayMs, this.abort));
+    }
+}
+
+/**
+ * Creates a "stack" of of all interceptors specified in the given `RpcOptions`.
+ * Used by generated client implementations.
+ * @internal
+ */
+function stackIntercept(kind, transport, method, options, input) {
+    var _a, _b, _c, _d;
+    if (kind == "unary") {
+        let tail = (mtd, inp, opt) => transport.unary(mtd, inp, opt);
+        for (const curr of ((_a = options.interceptors) !== null && _a !== void 0 ? _a : []).filter(i => i.interceptUnary).reverse()) {
+            const next = tail;
+            tail = (mtd, inp, opt) => curr.interceptUnary(next, mtd, inp, opt);
+        }
+        return tail(method, input, options);
+    }
+    if (kind == "serverStreaming") {
+        let tail = (mtd, inp, opt) => transport.serverStreaming(mtd, inp, opt);
+        for (const curr of ((_b = options.interceptors) !== null && _b !== void 0 ? _b : []).filter(i => i.interceptServerStreaming).reverse()) {
+            const next = tail;
+            tail = (mtd, inp, opt) => curr.interceptServerStreaming(next, mtd, inp, opt);
+        }
+        return tail(method, input, options);
+    }
+    if (kind == "clientStreaming") {
+        let tail = (mtd, opt) => transport.clientStreaming(mtd, opt);
+        for (const curr of ((_c = options.interceptors) !== null && _c !== void 0 ? _c : []).filter(i => i.interceptClientStreaming).reverse()) {
+            const next = tail;
+            tail = (mtd, opt) => curr.interceptClientStreaming(next, mtd, opt);
+        }
+        return tail(method, options);
+    }
+    if (kind == "duplex") {
+        let tail = (mtd, opt) => transport.duplex(mtd, opt);
+        for (const curr of ((_d = options.interceptors) !== null && _d !== void 0 ? _d : []).filter(i => i.interceptDuplex).reverse()) {
+            const next = tail;
+            tail = (mtd, opt) => curr.interceptDuplex(next, mtd, opt);
+        }
+        return tail(method, options);
+    }
+    assertNever(kind);
+}
+/**
+ * @deprecated replaced by `stackIntercept()`, still here to support older generated code
+ */
+function stackUnaryInterceptors(transport, method, input, options) {
+    return stackIntercept("unary", transport, method, options, input);
+}
+/**
+ * @deprecated replaced by `stackIntercept()`, still here to support older generated code
+ */
+function stackServerStreamingInterceptors(transport, method, input, options) {
+    return stackIntercept("serverStreaming", transport, method, options, input);
+}
+/**
+ * @deprecated replaced by `stackIntercept()`, still here to support older generated code
+ */
+function stackClientStreamingInterceptors(transport, method, options) {
+    return stackIntercept("clientStreaming", transport, method, options);
+}
+/**
+ * @deprecated replaced by `stackIntercept()`, still here to support older generated code
+ */
+function stackDuplexStreamingInterceptors(transport, method, options) {
+    return stackIntercept("duplex", transport, method, options);
+}
+
+class ServerCallContextController {
+    constructor(method, headers, deadline, sendResponseHeadersFn, defaultStatus = { code: 'OK', detail: '' }) {
+        this._cancelled = false;
+        this._listeners = [];
+        this.method = method;
+        this.headers = headers;
+        this.deadline = deadline;
+        this.trailers = {};
+        this._sendRH = sendResponseHeadersFn;
+        this.status = defaultStatus;
+    }
+    /**
+     * Set the call cancelled.
+     *
+     * Invokes all callbacks registered with onCancel() and
+     * sets `cancelled = true`.
+     */
+    notifyCancelled() {
+        if (!this._cancelled) {
+            this._cancelled = true;
+            for (let l of this._listeners) {
+                l();
+            }
+        }
+    }
+    /**
+     * Send response headers.
+     */
+    sendResponseHeaders(data) {
+        this._sendRH(data);
+    }
+    /**
+     * Is the call cancelled?
+     *
+     * When the client closes the connection before the server
+     * is done, the call is cancelled.
+     *
+     * If you want to cancel a request on the server, throw a
+     * RpcError with the CANCELLED status code.
+     */
+    get cancelled() {
+        return this._cancelled;
+    }
+    /**
+     * Add a callback for cancellation.
+     */
+    onCancel(callback) {
+        const l = this._listeners;
+        l.push(callback);
+        return () => {
+            let i = l.indexOf(callback);
+            if (i >= 0)
+                l.splice(i, 1);
+        };
+    }
+}
+
+// Public API of the rpc runtime.
+// Note: we do not use `export * from ...` to help tree shakers,
+// webpack verbose output hints that this should be useful
+
+var es2015 = /*#__PURE__*/Object.freeze({
+	__proto__: null,
+	ClientStreamingCall: ClientStreamingCall,
+	Deferred: Deferred,
+	get DeferredState () { return DeferredState; },
+	DuplexStreamingCall: DuplexStreamingCall,
+	RpcError: RpcError,
+	RpcOutputStreamController: RpcOutputStreamController,
+	ServerCallContextController: ServerCallContextController,
+	ServerStreamingCall: ServerStreamingCall,
+	ServiceType: ServiceType,
+	TestTransport: TestTransport,
+	UnaryCall: UnaryCall,
+	mergeRpcOptions: mergeRpcOptions,
+	readMethodOption: readMethodOption,
+	readMethodOptions: readMethodOptions,
+	readServiceOption: readServiceOption,
+	stackClientStreamingInterceptors: stackClientStreamingInterceptors,
+	stackDuplexStreamingInterceptors: stackDuplexStreamingInterceptors,
+	stackIntercept: stackIntercept,
+	stackServerStreamingInterceptors: stackServerStreamingInterceptors,
+	stackUnaryInterceptors: stackUnaryInterceptors
+});
+
+var require$$0 = /*@__PURE__*/getAugmentedNamespace(es2015);
+
+var require$$1 = /*@__PURE__*/getAugmentedNamespace(es2015$1);
+
+var cachemetadata = {};
+
+var cachescope = {};
+
+var hasRequiredCachescope;
+
+function requireCachescope () {
+	if (hasRequiredCachescope) return cachescope;
+	hasRequiredCachescope = 1;
+	Object.defineProperty(cachescope, "__esModule", { value: true });
+	cachescope.CacheScope = void 0;
+	const runtime_1 = require$$1;
+	const runtime_2 = require$$1;
+	const runtime_3 = require$$1;
+	const runtime_4 = require$$1;
+	const runtime_5 = require$$1;
+	// @generated message type with reflection information, may provide speed optimized methods
+	class CacheScope$Type extends runtime_5.MessageType {
+	    constructor() {
+	        super("github.actions.results.entities.v1.CacheScope", [
+	            { no: 1, name: "scope", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
+	            { no: 2, name: "permission", kind: "scalar", T: 3 /*ScalarType.INT64*/ }
+	        ]);
+	    }
+	    create(value) {
+	        const message = { scope: "", permission: "0" };
+	        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+	        if (value !== undefined)
+	            (0, runtime_3.reflectionMergePartial)(this, message, value);
+	        return message;
+	    }
+	    internalBinaryRead(reader, length, options, target) {
+	        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+	        while (reader.pos < end) {
+	            let [fieldNo, wireType] = reader.tag();
+	            switch (fieldNo) {
+	                case /* string scope */ 1:
+	                    message.scope = reader.string();
+	                    break;
+	                case /* int64 permission */ 2:
+	                    message.permission = reader.int64().toString();
+	                    break;
+	                default:
+	                    let u = options.readUnknownField;
+	                    if (u === "throw")
+	                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+	                    let d = reader.skip(wireType);
+	                    if (u !== false)
+	                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+	            }
+	        }
+	        return message;
+	    }
+	    internalBinaryWrite(message, writer, options) {
+	        /* string scope = 1; */
+	        if (message.scope !== "")
+	            writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.scope);
+	        /* int64 permission = 2; */
+	        if (message.permission !== "0")
+	            writer.tag(2, runtime_1.WireType.Varint).int64(message.permission);
+	        let u = options.writeUnknownFields;
+	        if (u !== false)
+	            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+	        return writer;
+	    }
+	}
+	/**
+	 * @generated MessageType for protobuf message github.actions.results.entities.v1.CacheScope
+	 */
+	cachescope.CacheScope = new CacheScope$Type();
+	
+	return cachescope;
+}
+
+var hasRequiredCachemetadata;
+
+function requireCachemetadata () {
+	if (hasRequiredCachemetadata) return cachemetadata;
+	hasRequiredCachemetadata = 1;
+	Object.defineProperty(cachemetadata, "__esModule", { value: true });
+	cachemetadata.CacheMetadata = void 0;
+	const runtime_1 = require$$1;
+	const runtime_2 = require$$1;
+	const runtime_3 = require$$1;
+	const runtime_4 = require$$1;
+	const runtime_5 = require$$1;
+	const cachescope_1 = requireCachescope();
+	// @generated message type with reflection information, may provide speed optimized methods
+	class CacheMetadata$Type extends runtime_5.MessageType {
+	    constructor() {
+	        super("github.actions.results.entities.v1.CacheMetadata", [
+	            { no: 1, name: "repository_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
+	            { no: 2, name: "scope", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => cachescope_1.CacheScope }
+	        ]);
+	    }
+	    create(value) {
+	        const message = { repositoryId: "0", scope: [] };
+	        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+	        if (value !== undefined)
+	            (0, runtime_3.reflectionMergePartial)(this, message, value);
+	        return message;
+	    }
+	    internalBinaryRead(reader, length, options, target) {
+	        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+	        while (reader.pos < end) {
+	            let [fieldNo, wireType] = reader.tag();
+	            switch (fieldNo) {
+	                case /* int64 repository_id */ 1:
+	                    message.repositoryId = reader.int64().toString();
+	                    break;
+	                case /* repeated github.actions.results.entities.v1.CacheScope scope */ 2:
+	                    message.scope.push(cachescope_1.CacheScope.internalBinaryRead(reader, reader.uint32(), options));
+	                    break;
+	                default:
+	                    let u = options.readUnknownField;
+	                    if (u === "throw")
+	                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+	                    let d = reader.skip(wireType);
+	                    if (u !== false)
+	                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+	            }
+	        }
+	        return message;
+	    }
+	    internalBinaryWrite(message, writer, options) {
+	        /* int64 repository_id = 1; */
+	        if (message.repositoryId !== "0")
+	            writer.tag(1, runtime_1.WireType.Varint).int64(message.repositoryId);
+	        /* repeated github.actions.results.entities.v1.CacheScope scope = 2; */
+	        for (let i = 0; i < message.scope.length; i++)
+	            cachescope_1.CacheScope.internalBinaryWrite(message.scope[i], writer.tag(2, runtime_1.WireType.LengthDelimited).fork(), options).join();
+	        let u = options.writeUnknownFields;
+	        if (u !== false)
+	            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+	        return writer;
+	    }
+	}
+	/**
+	 * @generated MessageType for protobuf message github.actions.results.entities.v1.CacheMetadata
+	 */
+	cachemetadata.CacheMetadata = new CacheMetadata$Type();
+	
+	return cachemetadata;
+}
+
+var hasRequiredCache$2;
+
+function requireCache$2 () {
+	if (hasRequiredCache$2) return cache$1;
+	hasRequiredCache$2 = 1;
+	(function (exports$1) {
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.CacheService = exports$1.GetCacheEntryDownloadURLResponse = exports$1.GetCacheEntryDownloadURLRequest = exports$1.FinalizeCacheEntryUploadResponse = exports$1.FinalizeCacheEntryUploadRequest = exports$1.CreateCacheEntryResponse = exports$1.CreateCacheEntryRequest = void 0;
+		// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies
+		// @generated from protobuf file "results/api/v1/cache.proto" (package "github.actions.results.api.v1", syntax proto3)
+		// tslint:disable
+		const runtime_rpc_1 = require$$0;
+		const runtime_1 = require$$1;
+		const runtime_2 = require$$1;
+		const runtime_3 = require$$1;
+		const runtime_4 = require$$1;
+		const runtime_5 = require$$1;
+		const cachemetadata_1 = requireCachemetadata();
+		// @generated message type with reflection information, may provide speed optimized methods
+		class CreateCacheEntryRequest$Type extends runtime_5.MessageType {
+		    constructor() {
+		        super("github.actions.results.api.v1.CreateCacheEntryRequest", [
+		            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
+		            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
+		            { no: 3, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
+		        ]);
+		    }
+		    create(value) {
+		        const message = { key: "", version: "" };
+		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+		        if (value !== undefined)
+		            (0, runtime_3.reflectionMergePartial)(this, message, value);
+		        return message;
+		    }
+		    internalBinaryRead(reader, length, options, target) {
+		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+		        while (reader.pos < end) {
+		            let [fieldNo, wireType] = reader.tag();
+		            switch (fieldNo) {
+		                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
+		                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
+		                    break;
+		                case /* string key */ 2:
+		                    message.key = reader.string();
+		                    break;
+		                case /* string version */ 3:
+		                    message.version = reader.string();
+		                    break;
+		                default:
+		                    let u = options.readUnknownField;
+		                    if (u === "throw")
+		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+		                    let d = reader.skip(wireType);
+		                    if (u !== false)
+		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+		            }
+		        }
+		        return message;
+		    }
+		    internalBinaryWrite(message, writer, options) {
+		        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
+		        if (message.metadata)
+		            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
+		        /* string key = 2; */
+		        if (message.key !== "")
+		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
+		        /* string version = 3; */
+		        if (message.version !== "")
+		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.version);
+		        let u = options.writeUnknownFields;
+		        if (u !== false)
+		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+		        return writer;
+		    }
+		}
+		/**
+		 * @generated MessageType for protobuf message github.actions.results.api.v1.CreateCacheEntryRequest
+		 */
+		exports$1.CreateCacheEntryRequest = new CreateCacheEntryRequest$Type();
+		// @generated message type with reflection information, may provide speed optimized methods
+		class CreateCacheEntryResponse$Type extends runtime_5.MessageType {
+		    constructor() {
+		        super("github.actions.results.api.v1.CreateCacheEntryResponse", [
+		            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
+		            { no: 2, name: "signed_upload_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
+		            { no: 3, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
+		        ]);
+		    }
+		    create(value) {
+		        const message = { ok: false, signedUploadUrl: "", message: "" };
+		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+		        if (value !== undefined)
+		            (0, runtime_3.reflectionMergePartial)(this, message, value);
+		        return message;
+		    }
+		    internalBinaryRead(reader, length, options, target) {
+		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+		        while (reader.pos < end) {
+		            let [fieldNo, wireType] = reader.tag();
+		            switch (fieldNo) {
+		                case /* bool ok */ 1:
+		                    message.ok = reader.bool();
+		                    break;
+		                case /* string signed_upload_url */ 2:
+		                    message.signedUploadUrl = reader.string();
+		                    break;
+		                case /* string message */ 3:
+		                    message.message = reader.string();
+		                    break;
+		                default:
+		                    let u = options.readUnknownField;
+		                    if (u === "throw")
+		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+		                    let d = reader.skip(wireType);
+		                    if (u !== false)
+		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+		            }
+		        }
+		        return message;
+		    }
+		    internalBinaryWrite(message, writer, options) {
+		        /* bool ok = 1; */
+		        if (message.ok !== false)
+		            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
+		        /* string signed_upload_url = 2; */
+		        if (message.signedUploadUrl !== "")
+		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedUploadUrl);
+		        /* string message = 3; */
+		        if (message.message !== "")
+		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.message);
+		        let u = options.writeUnknownFields;
+		        if (u !== false)
+		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+		        return writer;
+		    }
+		}
+		/**
+		 * @generated MessageType for protobuf message github.actions.results.api.v1.CreateCacheEntryResponse
+		 */
+		exports$1.CreateCacheEntryResponse = new CreateCacheEntryResponse$Type();
+		// @generated message type with reflection information, may provide speed optimized methods
+		class FinalizeCacheEntryUploadRequest$Type extends runtime_5.MessageType {
+		    constructor() {
+		        super("github.actions.results.api.v1.FinalizeCacheEntryUploadRequest", [
+		            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
+		            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
+		            { no: 3, name: "size_bytes", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
+		            { no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
+		        ]);
+		    }
+		    create(value) {
+		        const message = { key: "", sizeBytes: "0", version: "" };
+		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+		        if (value !== undefined)
+		            (0, runtime_3.reflectionMergePartial)(this, message, value);
+		        return message;
+		    }
+		    internalBinaryRead(reader, length, options, target) {
+		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+		        while (reader.pos < end) {
+		            let [fieldNo, wireType] = reader.tag();
+		            switch (fieldNo) {
+		                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
+		                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
+		                    break;
+		                case /* string key */ 2:
+		                    message.key = reader.string();
+		                    break;
+		                case /* int64 size_bytes */ 3:
+		                    message.sizeBytes = reader.int64().toString();
+		                    break;
+		                case /* string version */ 4:
+		                    message.version = reader.string();
+		                    break;
+		                default:
+		                    let u = options.readUnknownField;
+		                    if (u === "throw")
+		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+		                    let d = reader.skip(wireType);
+		                    if (u !== false)
+		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+		            }
+		        }
+		        return message;
+		    }
+		    internalBinaryWrite(message, writer, options) {
+		        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
+		        if (message.metadata)
+		            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
+		        /* string key = 2; */
+		        if (message.key !== "")
+		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
+		        /* int64 size_bytes = 3; */
+		        if (message.sizeBytes !== "0")
+		            writer.tag(3, runtime_1.WireType.Varint).int64(message.sizeBytes);
+		        /* string version = 4; */
+		        if (message.version !== "")
+		            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.version);
+		        let u = options.writeUnknownFields;
+		        if (u !== false)
+		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+		        return writer;
+		    }
+		}
+		/**
+		 * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeCacheEntryUploadRequest
+		 */
+		exports$1.FinalizeCacheEntryUploadRequest = new FinalizeCacheEntryUploadRequest$Type();
+		// @generated message type with reflection information, may provide speed optimized methods
+		class FinalizeCacheEntryUploadResponse$Type extends runtime_5.MessageType {
+		    constructor() {
+		        super("github.actions.results.api.v1.FinalizeCacheEntryUploadResponse", [
+		            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
+		            { no: 2, name: "entry_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
+		            { no: 3, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
+		        ]);
+		    }
+		    create(value) {
+		        const message = { ok: false, entryId: "0", message: "" };
+		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+		        if (value !== undefined)
+		            (0, runtime_3.reflectionMergePartial)(this, message, value);
+		        return message;
+		    }
+		    internalBinaryRead(reader, length, options, target) {
+		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+		        while (reader.pos < end) {
+		            let [fieldNo, wireType] = reader.tag();
+		            switch (fieldNo) {
+		                case /* bool ok */ 1:
+		                    message.ok = reader.bool();
+		                    break;
+		                case /* int64 entry_id */ 2:
+		                    message.entryId = reader.int64().toString();
+		                    break;
+		                case /* string message */ 3:
+		                    message.message = reader.string();
+		                    break;
+		                default:
+		                    let u = options.readUnknownField;
+		                    if (u === "throw")
+		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+		                    let d = reader.skip(wireType);
+		                    if (u !== false)
+		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+		            }
+		        }
+		        return message;
+		    }
+		    internalBinaryWrite(message, writer, options) {
+		        /* bool ok = 1; */
+		        if (message.ok !== false)
+		            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
+		        /* int64 entry_id = 2; */
+		        if (message.entryId !== "0")
+		            writer.tag(2, runtime_1.WireType.Varint).int64(message.entryId);
+		        /* string message = 3; */
+		        if (message.message !== "")
+		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.message);
+		        let u = options.writeUnknownFields;
+		        if (u !== false)
+		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+		        return writer;
+		    }
+		}
+		/**
+		 * @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeCacheEntryUploadResponse
+		 */
+		exports$1.FinalizeCacheEntryUploadResponse = new FinalizeCacheEntryUploadResponse$Type();
+		// @generated message type with reflection information, may provide speed optimized methods
+		class GetCacheEntryDownloadURLRequest$Type extends runtime_5.MessageType {
+		    constructor() {
+		        super("github.actions.results.api.v1.GetCacheEntryDownloadURLRequest", [
+		            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
+		            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
+		            { no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
+		            { no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
+		        ]);
+		    }
+		    create(value) {
+		        const message = { key: "", restoreKeys: [], version: "" };
+		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+		        if (value !== undefined)
+		            (0, runtime_3.reflectionMergePartial)(this, message, value);
+		        return message;
+		    }
+		    internalBinaryRead(reader, length, options, target) {
+		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+		        while (reader.pos < end) {
+		            let [fieldNo, wireType] = reader.tag();
+		            switch (fieldNo) {
+		                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
+		                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
+		                    break;
+		                case /* string key */ 2:
+		                    message.key = reader.string();
+		                    break;
+		                case /* repeated string restore_keys */ 3:
+		                    message.restoreKeys.push(reader.string());
+		                    break;
+		                case /* string version */ 4:
+		                    message.version = reader.string();
+		                    break;
+		                default:
+		                    let u = options.readUnknownField;
+		                    if (u === "throw")
+		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+		                    let d = reader.skip(wireType);
+		                    if (u !== false)
+		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+		            }
+		        }
+		        return message;
+		    }
+		    internalBinaryWrite(message, writer, options) {
+		        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
+		        if (message.metadata)
+		            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
+		        /* string key = 2; */
+		        if (message.key !== "")
+		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
+		        /* repeated string restore_keys = 3; */
+		        for (let i = 0; i < message.restoreKeys.length; i++)
+		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.restoreKeys[i]);
+		        /* string version = 4; */
+		        if (message.version !== "")
+		            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.version);
+		        let u = options.writeUnknownFields;
+		        if (u !== false)
+		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+		        return writer;
+		    }
+		}
+		/**
+		 * @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLRequest
+		 */
+		exports$1.GetCacheEntryDownloadURLRequest = new GetCacheEntryDownloadURLRequest$Type();
+		// @generated message type with reflection information, may provide speed optimized methods
+		class GetCacheEntryDownloadURLResponse$Type extends runtime_5.MessageType {
+		    constructor() {
+		        super("github.actions.results.api.v1.GetCacheEntryDownloadURLResponse", [
+		            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
+		            { no: 2, name: "signed_download_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
+		            { no: 3, name: "matched_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
+		        ]);
+		    }
+		    create(value) {
+		        const message = { ok: false, signedDownloadUrl: "", matchedKey: "" };
+		        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
+		        if (value !== undefined)
+		            (0, runtime_3.reflectionMergePartial)(this, message, value);
+		        return message;
+		    }
+		    internalBinaryRead(reader, length, options, target) {
+		        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
+		        while (reader.pos < end) {
+		            let [fieldNo, wireType] = reader.tag();
+		            switch (fieldNo) {
+		                case /* bool ok */ 1:
+		                    message.ok = reader.bool();
+		                    break;
+		                case /* string signed_download_url */ 2:
+		                    message.signedDownloadUrl = reader.string();
+		                    break;
+		                case /* string matched_key */ 3:
+		                    message.matchedKey = reader.string();
+		                    break;
+		                default:
+		                    let u = options.readUnknownField;
+		                    if (u === "throw")
+		                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
+		                    let d = reader.skip(wireType);
+		                    if (u !== false)
+		                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
+		            }
+		        }
+		        return message;
+		    }
+		    internalBinaryWrite(message, writer, options) {
+		        /* bool ok = 1; */
+		        if (message.ok !== false)
+		            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
+		        /* string signed_download_url = 2; */
+		        if (message.signedDownloadUrl !== "")
+		            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedDownloadUrl);
+		        /* string matched_key = 3; */
+		        if (message.matchedKey !== "")
+		            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.matchedKey);
+		        let u = options.writeUnknownFields;
+		        if (u !== false)
+		            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+		        return writer;
+		    }
+		}
+		/**
+		 * @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLResponse
+		 */
+		exports$1.GetCacheEntryDownloadURLResponse = new GetCacheEntryDownloadURLResponse$Type();
+		/**
+		 * @generated ServiceType for protobuf service github.actions.results.api.v1.CacheService
+		 */
+		exports$1.CacheService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.CacheService", [
+		    { name: "CreateCacheEntry", options: {}, I: exports$1.CreateCacheEntryRequest, O: exports$1.CreateCacheEntryResponse },
+		    { name: "FinalizeCacheEntryUpload", options: {}, I: exports$1.FinalizeCacheEntryUploadRequest, O: exports$1.FinalizeCacheEntryUploadResponse },
+		    { name: "GetCacheEntryDownloadURL", options: {}, I: exports$1.GetCacheEntryDownloadURLRequest, O: exports$1.GetCacheEntryDownloadURLResponse }
+		]);
+		
+	} (cache$1));
+	return cache$1;
+}
+
+var hasRequiredCache_twirpClient;
+
+function requireCache_twirpClient () {
+	if (hasRequiredCache_twirpClient) return cache_twirpClient;
+	hasRequiredCache_twirpClient = 1;
+	Object.defineProperty(cache_twirpClient, "__esModule", { value: true });
+	cache_twirpClient.CacheServiceClientProtobuf = cache_twirpClient.CacheServiceClientJSON = void 0;
+	const cache_1 = requireCache$2();
+	class CacheServiceClientJSON {
+	    constructor(rpc) {
+	        this.rpc = rpc;
+	        this.CreateCacheEntry.bind(this);
+	        this.FinalizeCacheEntryUpload.bind(this);
+	        this.GetCacheEntryDownloadURL.bind(this);
+	    }
+	    CreateCacheEntry(request) {
+	        const data = cache_1.CreateCacheEntryRequest.toJson(request, {
+	            useProtoFieldName: true,
+	            emitDefaultValues: false,
+	        });
+	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "CreateCacheEntry", "application/json", data);
+	        return promise.then((data) => cache_1.CreateCacheEntryResponse.fromJson(data, {
+	            ignoreUnknownFields: true,
+	        }));
+	    }
+	    FinalizeCacheEntryUpload(request) {
+	        const data = cache_1.FinalizeCacheEntryUploadRequest.toJson(request, {
+	            useProtoFieldName: true,
+	            emitDefaultValues: false,
+	        });
+	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "FinalizeCacheEntryUpload", "application/json", data);
+	        return promise.then((data) => cache_1.FinalizeCacheEntryUploadResponse.fromJson(data, {
+	            ignoreUnknownFields: true,
+	        }));
+	    }
+	    GetCacheEntryDownloadURL(request) {
+	        const data = cache_1.GetCacheEntryDownloadURLRequest.toJson(request, {
+	            useProtoFieldName: true,
+	            emitDefaultValues: false,
+	        });
+	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/json", data);
+	        return promise.then((data) => cache_1.GetCacheEntryDownloadURLResponse.fromJson(data, {
+	            ignoreUnknownFields: true,
+	        }));
+	    }
+	}
+	cache_twirpClient.CacheServiceClientJSON = CacheServiceClientJSON;
+	class CacheServiceClientProtobuf {
+	    constructor(rpc) {
+	        this.rpc = rpc;
+	        this.CreateCacheEntry.bind(this);
+	        this.FinalizeCacheEntryUpload.bind(this);
+	        this.GetCacheEntryDownloadURL.bind(this);
+	    }
+	    CreateCacheEntry(request) {
+	        const data = cache_1.CreateCacheEntryRequest.toBinary(request);
+	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "CreateCacheEntry", "application/protobuf", data);
+	        return promise.then((data) => cache_1.CreateCacheEntryResponse.fromBinary(data));
+	    }
+	    FinalizeCacheEntryUpload(request) {
+	        const data = cache_1.FinalizeCacheEntryUploadRequest.toBinary(request);
+	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "FinalizeCacheEntryUpload", "application/protobuf", data);
+	        return promise.then((data) => cache_1.FinalizeCacheEntryUploadResponse.fromBinary(data));
+	    }
+	    GetCacheEntryDownloadURL(request) {
+	        const data = cache_1.GetCacheEntryDownloadURLRequest.toBinary(request);
+	        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/protobuf", data);
+	        return promise.then((data) => cache_1.GetCacheEntryDownloadURLResponse.fromBinary(data));
+	    }
+	}
+	cache_twirpClient.CacheServiceClientProtobuf = CacheServiceClientProtobuf;
+	
+	return cache_twirpClient;
+}
+
+var util$8 = {};
+
+var hasRequiredUtil$8;
+
+function requireUtil$8 () {
+	if (hasRequiredUtil$8) return util$8;
+	hasRequiredUtil$8 = 1;
+	Object.defineProperty(util$8, "__esModule", { value: true });
+	util$8.maskSigUrl = maskSigUrl;
+	util$8.maskSecretUrls = maskSecretUrls;
+	const core_1 = requireCore();
+	/**
+	 * Masks the `sig` parameter in a URL and sets it as a secret.
+	 *
+	 * @param url - The URL containing the signature parameter to mask
+	 * @remarks
+	 * This function attempts to parse the provided URL and identify the 'sig' query parameter.
+	 * If found, it registers both the raw and URL-encoded signature values as secrets using
+	 * the Actions `setSecret` API, which prevents them from being displayed in logs.
+	 *
+	 * The function handles errors gracefully if URL parsing fails, logging them as debug messages.
+	 *
+	 * @example
+	 * ```typescript
+	 * // Mask a signature in an Azure SAS token URL
+	 * maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01');
+	 * ```
+	 */
+	function maskSigUrl(url) {
+	    if (!url)
+	        return;
+	    try {
+	        const parsedUrl = new URL(url);
+	        const signature = parsedUrl.searchParams.get('sig');
+	        if (signature) {
+	            (0, core_1.setSecret)(signature);
+	            (0, core_1.setSecret)(encodeURIComponent(signature));
+	        }
+	    }
+	    catch (error) {
+	        (0, core_1.debug)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`);
+	    }
+	}
+	/**
+	 * Masks sensitive information in URLs containing signature parameters.
+	 * Currently supports masking 'sig' parameters in the 'signed_upload_url'
+	 * and 'signed_download_url' properties of the provided object.
+	 *
+	 * @param body - The object should contain a signature
+	 * @remarks
+	 * This function extracts URLs from the object properties and calls maskSigUrl
+	 * on each one to redact sensitive signature information. The function doesn't
+	 * modify the original object; it only marks the signatures as secrets for
+	 * logging purposes.
+	 *
+	 * @example
+	 * ```typescript
+	 * const responseBody = {
+	 *   signed_upload_url: 'https://blob.core.windows.net/?sig=abc123',
+	 *   signed_download_url: 'https://blob.core/windows.net/?sig=def456'
+	 * };
+	 * maskSecretUrls(responseBody);
+	 * ```
+	 */
+	function maskSecretUrls(body) {
+	    if (typeof body !== 'object' || body === null) {
+	        (0, core_1.debug)('body is not an object or is null');
+	        return;
+	    }
+	    if ('signed_upload_url' in body &&
+	        typeof body.signed_upload_url === 'string') {
+	        maskSigUrl(body.signed_upload_url);
+	    }
+	    if ('signed_download_url' in body &&
+	        typeof body.signed_download_url === 'string') {
+	        maskSigUrl(body.signed_download_url);
+	    }
+	}
+	
+	return util$8;
+}
+
+var hasRequiredCacheTwirpClient;
+
+function requireCacheTwirpClient () {
+	if (hasRequiredCacheTwirpClient) return cacheTwirpClient;
+	hasRequiredCacheTwirpClient = 1;
+	var __awaiter = (cacheTwirpClient && cacheTwirpClient.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(cacheTwirpClient, "__esModule", { value: true });
+	cacheTwirpClient.internalCacheTwirpClient = internalCacheTwirpClient;
+	const core_1 = requireCore();
+	const user_agent_1 = requireUserAgent();
+	const errors_1 = requireErrors$1();
+	const config_1 = requireConfig();
+	const cacheUtils_1 = requireCacheUtils();
+	const auth_1 = requireAuth();
+	const http_client_1 = requireLib();
+	const cache_twirp_client_1 = requireCache_twirpClient();
+	const util_1 = requireUtil$8();
+	/**
+	 * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
+	 *
+	 * It adds retry logic to the request method, which is not present in the generated client.
+	 *
+	 * This class is used to interact with cache service v2.
+	 */
+	class CacheServiceClient {
+	    constructor(userAgent, maxAttempts, baseRetryIntervalMilliseconds, retryMultiplier) {
+	        this.maxAttempts = 5;
+	        this.baseRetryIntervalMilliseconds = 3000;
+	        this.retryMultiplier = 1.5;
+	        const token = (0, cacheUtils_1.getRuntimeToken)();
+	        this.baseUrl = (0, config_1.getCacheServiceURL)();
+	        if (maxAttempts) {
+	            this.maxAttempts = maxAttempts;
+	        }
+	        if (baseRetryIntervalMilliseconds) {
+	            this.baseRetryIntervalMilliseconds = baseRetryIntervalMilliseconds;
+	        }
+	        if (retryMultiplier) {
+	            this.retryMultiplier = retryMultiplier;
+	        }
+	        this.httpClient = new http_client_1.HttpClient(userAgent, [
+	            new auth_1.BearerCredentialHandler(token)
+	        ]);
+	    }
+	    // This function satisfies the Rpc interface. It is compatible with the JSON
+	    // JSON generated client.
+	    request(service, method, contentType, data) {
+	        return __awaiter(this, void 0, void 0, function* () {
+	            const url = new URL(`/twirp/${service}/${method}`, this.baseUrl).href;
+	            (0, core_1.debug)(`[Request] ${method} ${url}`);
+	            const headers = {
+	                'Content-Type': contentType
+	            };
+	            try {
+	                const { body } = yield this.retryableRequest(() => __awaiter(this, void 0, void 0, function* () { return this.httpClient.post(url, JSON.stringify(data), headers); }));
+	                return body;
+	            }
+	            catch (error) {
+	                throw new Error(`Failed to ${method}: ${error.message}`);
+	            }
+	        });
+	    }
+	    retryableRequest(operation) {
+	        return __awaiter(this, void 0, void 0, function* () {
+	            let attempt = 0;
+	            let errorMessage = '';
+	            let rawBody = '';
+	            while (attempt < this.maxAttempts) {
+	                let isRetryable = false;
+	                try {
+	                    const response = yield operation();
+	                    const statusCode = response.message.statusCode;
+	                    rawBody = yield response.readBody();
+	                    (0, core_1.debug)(`[Response] - ${response.message.statusCode}`);
+	                    (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);
+	                    const body = JSON.parse(rawBody);
+	                    (0, util_1.maskSecretUrls)(body);
+	                    (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`);
+	                    if (this.isSuccessStatusCode(statusCode)) {
+	                        return { response, body };
+	                    }
+	                    isRetryable = this.isRetryableHttpStatusCode(statusCode);
+	                    errorMessage = `Failed request: (${statusCode}) ${response.message.statusMessage}`;
+	                    if (body.msg) {
+	                        if (errors_1.UsageError.isUsageErrorMessage(body.msg)) {
+	                            throw new errors_1.UsageError();
+	                        }
+	                        errorMessage = `${errorMessage}: ${body.msg}`;
+	                    }
+	                    // Handle rate limiting - don't retry, just warn and exit
+	                    // For more info, see https://docs.github.com/en/actions/reference/limits
+	                    if (statusCode === http_client_1.HttpCodes.TooManyRequests) {
+	                        const retryAfterHeader = response.message.headers['retry-after'];
+	                        if (retryAfterHeader) {
+	                            const parsedSeconds = parseInt(retryAfterHeader, 10);
+	                            if (!isNaN(parsedSeconds) && parsedSeconds > 0) {
+	                                (0, core_1.warning)(`You've hit a rate limit, your rate limit will reset in ${parsedSeconds} seconds`);
+	                            }
+	                        }
+	                        throw new errors_1.RateLimitError(`Rate limited: ${errorMessage}`);
+	                    }
+	                }
+	                catch (error) {
+	                    if (error instanceof SyntaxError) {
+	                        (0, core_1.debug)(`Raw Body: ${rawBody}`);
+	                    }
+	                    if (error instanceof errors_1.UsageError) {
+	                        throw error;
+	                    }
+	                    if (error instanceof errors_1.RateLimitError) {
+	                        throw error;
+	                    }
+	                    if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {
+	                        throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code);
+	                    }
+	                    isRetryable = true;
+	                    errorMessage = error.message;
+	                }
+	                if (!isRetryable) {
+	                    throw new Error(`Received non-retryable error: ${errorMessage}`);
+	                }
+	                if (attempt + 1 === this.maxAttempts) {
+	                    throw new Error(`Failed to make request after ${this.maxAttempts} attempts: ${errorMessage}`);
+	                }
+	                const retryTimeMilliseconds = this.getExponentialRetryTimeMilliseconds(attempt);
+	                (0, core_1.info)(`Attempt ${attempt + 1} of ${this.maxAttempts} failed with error: ${errorMessage}. Retrying request in ${retryTimeMilliseconds} ms...`);
+	                yield this.sleep(retryTimeMilliseconds);
+	                attempt++;
+	            }
+	            throw new Error(`Request failed`);
+	        });
+	    }
+	    isSuccessStatusCode(statusCode) {
+	        if (!statusCode)
+	            return false;
+	        return statusCode >= 200 && statusCode < 300;
+	    }
+	    isRetryableHttpStatusCode(statusCode) {
+	        if (!statusCode)
+	            return false;
+	        const retryableStatusCodes = [
+	            http_client_1.HttpCodes.BadGateway,
+	            http_client_1.HttpCodes.GatewayTimeout,
+	            http_client_1.HttpCodes.InternalServerError,
+	            http_client_1.HttpCodes.ServiceUnavailable
+	        ];
+	        return retryableStatusCodes.includes(statusCode);
+	    }
+	    sleep(milliseconds) {
+	        return __awaiter(this, void 0, void 0, function* () {
+	            return new Promise(resolve => setTimeout(resolve, milliseconds));
+	        });
+	    }
+	    getExponentialRetryTimeMilliseconds(attempt) {
+	        if (attempt < 0) {
+	            throw new Error('attempt should be a positive integer');
+	        }
+	        if (attempt === 0) {
+	            return this.baseRetryIntervalMilliseconds;
+	        }
+	        const minTime = this.baseRetryIntervalMilliseconds * Math.pow(this.retryMultiplier, attempt);
+	        const maxTime = minTime * this.retryMultiplier;
+	        // returns a random number between minTime and maxTime (exclusive)
+	        return Math.trunc(Math.random() * (maxTime - minTime) + minTime);
+	    }
+	}
+	function internalCacheTwirpClient(options) {
+	    const client = new CacheServiceClient((0, user_agent_1.getUserAgentString)(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);
+	    return new cache_twirp_client_1.CacheServiceClientJSON(client);
+	}
+	
+	return cacheTwirpClient;
+}
+
+var tar = {};
+
+var hasRequiredTar;
+
+function requireTar () {
+	if (hasRequiredTar) return tar;
+	hasRequiredTar = 1;
+	var __createBinding = (tar && tar.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (tar && tar.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (tar && tar.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (tar && tar.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(tar, "__esModule", { value: true });
+	tar.listTar = listTar;
+	tar.extractTar = extractTar;
+	tar.createTar = createTar;
+	const exec_1 = requireExec();
+	const io = __importStar(requireIo());
+	const fs_1 = fs__default;
+	const path = __importStar(require$$1$7);
+	const utils = __importStar(requireCacheUtils());
+	const constants_1 = requireConstants$b();
+	const IS_WINDOWS = process.platform === 'win32';
+	// Returns tar path and type: BSD or GNU
+	function getTarPath() {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        switch (process.platform) {
+	            case 'win32': {
+	                const gnuTar = yield utils.getGnuTarPathOnWindows();
+	                const systemTar = constants_1.SystemTarPathOnWindows;
+	                if (gnuTar) {
+	                    // Use GNUtar as default on windows
+	                    return { path: gnuTar, type: constants_1.ArchiveToolType.GNU };
+	                }
+	                else if ((0, fs_1.existsSync)(systemTar)) {
+	                    return { path: systemTar, type: constants_1.ArchiveToolType.BSD };
+	                }
+	                break;
+	            }
+	            case 'darwin': {
+	                const gnuTar = yield io.which('gtar', false);
+	                if (gnuTar) {
+	                    // fix permission denied errors when extracting BSD tar archive with GNU tar - https://github.com/actions/cache/issues/527
+	                    return { path: gnuTar, type: constants_1.ArchiveToolType.GNU };
+	                }
+	                else {
+	                    return {
+	                        path: yield io.which('tar', true),
+	                        type: constants_1.ArchiveToolType.BSD
+	                    };
+	                }
+	            }
+	        }
+	        // Default assumption is GNU tar is present in path
+	        return {
+	            path: yield io.which('tar', true),
+	            type: constants_1.ArchiveToolType.GNU
+	        };
+	    });
+	}
+	// Return arguments for tar as per tarPath, compressionMethod, method type and os
+	function getTarArgs(tarPath_1, compressionMethod_1, type_1) {
+	    return __awaiter(this, arguments, void 0, function* (tarPath, compressionMethod, type, archivePath = '') {
+	        const args = [`"${tarPath.path}"`];
+	        const cacheFileName = utils.getCacheFileName(compressionMethod);
+	        const tarFile = 'cache.tar';
+	        const workingDirectory = getWorkingDirectory();
+	        // Speficic args for BSD tar on windows for workaround
+	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
+	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
+	            IS_WINDOWS;
+	        // Method specific args
+	        switch (type) {
+	            case 'create':
+	                args.push('--posix', '-cf', BSD_TAR_ZSTD
+	                    ? tarFile
+	                    : cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '--exclude', BSD_TAR_ZSTD
+	                    ? tarFile
+	                    : cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '-P', '-C', workingDirectory.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '--files-from', constants_1.ManifestFilename);
+	                break;
+	            case 'extract':
+	                args.push('-xf', BSD_TAR_ZSTD
+	                    ? tarFile
+	                    : archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '-P', '-C', workingDirectory.replace(new RegExp(`\\${path.sep}`, 'g'), '/'));
+	                break;
+	            case 'list':
+	                args.push('-tf', BSD_TAR_ZSTD
+	                    ? tarFile
+	                    : archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), '-P');
+	                break;
+	        }
+	        // Platform specific args
+	        if (tarPath.type === constants_1.ArchiveToolType.GNU) {
+	            switch (process.platform) {
+	                case 'win32':
+	                    args.push('--force-local');
+	                    break;
+	                case 'darwin':
+	                    args.push('--delay-directory-restore');
+	                    break;
+	            }
+	        }
+	        return args;
+	    });
+	}
+	// Returns commands to run tar and compression program
+	function getCommands(compressionMethod_1, type_1) {
+	    return __awaiter(this, arguments, void 0, function* (compressionMethod, type, archivePath = '') {
+	        let args;
+	        const tarPath = yield getTarPath();
+	        const tarArgs = yield getTarArgs(tarPath, compressionMethod, type, archivePath);
+	        const compressionArgs = type !== 'create'
+	            ? yield getDecompressionProgram(tarPath, compressionMethod, archivePath)
+	            : yield getCompressionProgram(tarPath, compressionMethod);
+	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
+	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
+	            IS_WINDOWS;
+	        if (BSD_TAR_ZSTD && type !== 'create') {
+	            args = [[...compressionArgs].join(' '), [...tarArgs].join(' ')];
+	        }
+	        else {
+	            args = [[...tarArgs].join(' '), [...compressionArgs].join(' ')];
+	        }
+	        if (BSD_TAR_ZSTD) {
+	            return args;
+	        }
+	        return [args.join(' ')];
+	    });
+	}
+	function getWorkingDirectory() {
+	    var _a;
+	    return (_a = process.env['GITHUB_WORKSPACE']) !== null && _a !== void 0 ? _a : process.cwd();
+	}
+	// Common function for extractTar and listTar to get the compression method
+	function getDecompressionProgram(tarPath, compressionMethod, archivePath) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        // -d: Decompress.
+	        // unzstd is equivalent to 'zstd -d'
+	        // --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
+	        // Using 30 here because we also support 32-bit self-hosted runners.
+	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
+	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
+	            IS_WINDOWS;
+	        switch (compressionMethod) {
+	            case constants_1.CompressionMethod.Zstd:
+	                return BSD_TAR_ZSTD
+	                    ? [
+	                        'zstd -d --long=30 --force -o',
+	                        constants_1.TarFilename,
+	                        archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/')
+	                    ]
+	                    : [
+	                        '--use-compress-program',
+	                        IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30'
+	                    ];
+	            case constants_1.CompressionMethod.ZstdWithoutLong:
+	                return BSD_TAR_ZSTD
+	                    ? [
+	                        'zstd -d --force -o',
+	                        constants_1.TarFilename,
+	                        archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/')
+	                    ]
+	                    : ['--use-compress-program', IS_WINDOWS ? '"zstd -d"' : 'unzstd'];
+	            default:
+	                return ['-z'];
+	        }
+	    });
+	}
+	// Used for creating the archive
+	// -T#: Compress using # working thread. If # is 0, attempt to detect and use the number of physical CPU cores.
+	// zstdmt is equivalent to 'zstd -T0'
+	// --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
+	// Using 30 here because we also support 32-bit self-hosted runners.
+	// Long range mode is added to zstd in v1.3.2 release, so we will not use --long in older version of zstd.
+	function getCompressionProgram(tarPath, compressionMethod) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const cacheFileName = utils.getCacheFileName(compressionMethod);
+	        const BSD_TAR_ZSTD = tarPath.type === constants_1.ArchiveToolType.BSD &&
+	            compressionMethod !== constants_1.CompressionMethod.Gzip &&
+	            IS_WINDOWS;
+	        switch (compressionMethod) {
+	            case constants_1.CompressionMethod.Zstd:
+	                return BSD_TAR_ZSTD
+	                    ? [
+	                        'zstd -T0 --long=30 --force -o',
+	                        cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
+	                        constants_1.TarFilename
+	                    ]
+	                    : [
+	                        '--use-compress-program',
+	                        IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30'
+	                    ];
+	            case constants_1.CompressionMethod.ZstdWithoutLong:
+	                return BSD_TAR_ZSTD
+	                    ? [
+	                        'zstd -T0 --force -o',
+	                        cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
+	                        constants_1.TarFilename
+	                    ]
+	                    : ['--use-compress-program', IS_WINDOWS ? '"zstd -T0"' : 'zstdmt'];
+	            default:
+	                return ['-z'];
+	        }
+	    });
+	}
+	// Executes all commands as separate processes
+	function execCommands(commands, cwd) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        for (const command of commands) {
+	            try {
+	                yield (0, exec_1.exec)(command, undefined, {
+	                    cwd,
+	                    env: Object.assign(Object.assign({}, process.env), { MSYS: 'winsymlinks:nativestrict' })
+	                });
+	            }
+	            catch (error) {
+	                throw new Error(`${command.split(' ')[0]} failed with error: ${error === null || error === void 0 ? void 0 : error.message}`);
+	            }
+	        }
+	    });
+	}
+	// List the contents of a tar
+	function listTar(archivePath, compressionMethod) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        const commands = yield getCommands(compressionMethod, 'list', archivePath);
+	        yield execCommands(commands);
+	    });
+	}
+	// Extract a tar
+	function extractTar(archivePath, compressionMethod) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        // Create directory to extract tar into
+	        const workingDirectory = getWorkingDirectory();
+	        yield io.mkdirP(workingDirectory);
+	        const commands = yield getCommands(compressionMethod, 'extract', archivePath);
+	        yield execCommands(commands);
+	    });
+	}
+	// Create a tar
+	function createTar(archiveFolder, sourceDirectories, compressionMethod) {
+	    return __awaiter(this, void 0, void 0, function* () {
+	        // Write source directories to manifest.txt to avoid command length limits
+	        (0, fs_1.writeFileSync)(path.join(archiveFolder, constants_1.ManifestFilename), sourceDirectories.join('\n'));
+	        const commands = yield getCommands(compressionMethod, 'create');
+	        yield execCommands(commands, archiveFolder);
+	    });
+	}
+	
+	return tar;
+}
+
+var hasRequiredCache$1;
+
+function requireCache$1 () {
+	if (hasRequiredCache$1) return cache$3;
+	hasRequiredCache$1 = 1;
+	var __createBinding = (cache$3 && cache$3.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    var desc = Object.getOwnPropertyDescriptor(m, k);
+	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+	      desc = { enumerable: true, get: function() { return m[k]; } };
+	    }
+	    Object.defineProperty(o, k2, desc);
+	}) : (function(o, m, k, k2) {
+	    if (k2 === undefined) k2 = k;
+	    o[k2] = m[k];
+	}));
+	var __setModuleDefault = (cache$3 && cache$3.__setModuleDefault) || (Object.create ? (function(o, v) {
+	    Object.defineProperty(o, "default", { enumerable: true, value: v });
+	}) : function(o, v) {
+	    o["default"] = v;
+	});
+	var __importStar = (cache$3 && cache$3.__importStar) || (function () {
+	    var ownKeys = function(o) {
+	        ownKeys = Object.getOwnPropertyNames || function (o) {
+	            var ar = [];
+	            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+	            return ar;
+	        };
+	        return ownKeys(o);
+	    };
+	    return function (mod) {
+	        if (mod && mod.__esModule) return mod;
+	        var result = {};
+	        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
+	        __setModuleDefault(result, mod);
+	        return result;
+	    };
+	})();
+	var __awaiter = (cache$3 && cache$3.__awaiter) || function (thisArg, _arguments, P, generator) {
+	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+	    return new (P || (P = Promise))(function (resolve, reject) {
+	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	    });
+	};
+	Object.defineProperty(cache$3, "__esModule", { value: true });
+	cache$3.FinalizeCacheError = cache$3.ReserveCacheError = cache$3.ValidationError = void 0;
+	cache$3.isFeatureAvailable = isFeatureAvailable;
+	cache$3.restoreCache = restoreCache;
+	cache$3.saveCache = saveCache;
+	const core = __importStar(requireCore());
+	const path = __importStar(require$$1$7);
+	const utils = __importStar(requireCacheUtils());
+	const cacheHttpClient = __importStar(requireCacheHttpClient());
+	const cacheTwirpClient = __importStar(requireCacheTwirpClient());
+	const config_1 = requireConfig();
+	const tar_1 = requireTar();
+	const http_client_1 = requireLib();
+	class ValidationError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = 'ValidationError';
+	        Object.setPrototypeOf(this, ValidationError.prototype);
+	    }
+	}
+	cache$3.ValidationError = ValidationError;
+	class ReserveCacheError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = 'ReserveCacheError';
+	        Object.setPrototypeOf(this, ReserveCacheError.prototype);
+	    }
+	}
+	cache$3.ReserveCacheError = ReserveCacheError;
+	class FinalizeCacheError extends Error {
+	    constructor(message) {
+	        super(message);
+	        this.name = 'FinalizeCacheError';
+	        Object.setPrototypeOf(this, FinalizeCacheError.prototype);
+	    }
+	}
+	cache$3.FinalizeCacheError = FinalizeCacheError;
+	function checkPaths(paths) {
+	    if (!paths || paths.length === 0) {
+	        throw new ValidationError(`Path Validation Error: At least one directory or file path is required`);
+	    }
+	}
+	function checkKey(key) {
+	    if (key.length > 512) {
+	        throw new ValidationError(`Key Validation Error: ${key} cannot be larger than 512 characters.`);
+	    }
+	    const regex = /^[^,]*$/;
+	    if (!regex.test(key)) {
+	        throw new ValidationError(`Key Validation Error: ${key} cannot contain commas.`);
+	    }
+	}
+	/**
+	 * isFeatureAvailable to check the presence of Actions cache service
+	 *
+	 * @returns boolean return true if Actions cache service feature is available, otherwise false
+	 */
+	function isFeatureAvailable() {
+	    const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
+	    // Check availability based on cache service version
+	    switch (cacheServiceVersion) {
+	        case 'v2':
+	            // For v2, we need ACTIONS_RESULTS_URL
+	            return !!process.env['ACTIONS_RESULTS_URL'];
+	        case 'v1':
+	        default:
+	            // For v1, we only need ACTIONS_CACHE_URL
+	            return !!process.env['ACTIONS_CACHE_URL'];
+	    }
+	}
+	/**
+	 * Restores cache from keys
+	 *
+	 * @param paths a list of file paths to restore from the cache
+	 * @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching.
+	 * @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
+	 * @param downloadOptions cache download options
+	 * @param enableCrossOsArchive an optional boolean enabled to restore on windows any cache created on any platform
+	 * @returns string returns the key for the cache hit, otherwise returns undefined
+	 */
+	function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) {
+	    return __awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
+	        const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
+	        core.debug(`Cache service version: ${cacheServiceVersion}`);
+	        checkPaths(paths);
+	        switch (cacheServiceVersion) {
+	            case 'v2':
+	                return yield restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsArchive);
+	            case 'v1':
+	            default:
+	                return yield restoreCacheV1(paths, primaryKey, restoreKeys, options, enableCrossOsArchive);
+	        }
+	    });
+	}
+	/**
+	 * Restores cache using the legacy Cache Service
+	 *
+	 * @param paths a list of file paths to restore from the cache
+	 * @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching.
+	 * @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
+	 * @param options cache download options
+	 * @param enableCrossOsArchive an optional boolean enabled to restore on Windows any cache created on any platform
+	 * @returns string returns the key for the cache hit, otherwise returns undefined
+	 */
+	function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) {
+	    return __awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
+	        restoreKeys = restoreKeys || [];
+	        const keys = [primaryKey, ...restoreKeys];
+	        core.debug('Resolved Keys:');
+	        core.debug(JSON.stringify(keys));
+	        if (keys.length > 10) {
+	            throw new ValidationError(`Key Validation Error: Keys are limited to a maximum of 10.`);
+	        }
+	        for (const key of keys) {
+	            checkKey(key);
+	        }
+	        const compressionMethod = yield utils.getCompressionMethod();
+	        let archivePath = '';
+	        try {
+	            // path are needed to compute version
+	            const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, {
+	                compressionMethod,
+	                enableCrossOsArchive
+	            });
+	            if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) {
+	                // Cache not found
+	                return undefined;
+	            }
+	            if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
+	                core.info('Lookup only - skipping download');
+	                return cacheEntry.cacheKey;
+	            }
+	            archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod));
+	            core.debug(`Archive Path: ${archivePath}`);
+	            // Download the cache from the cache entry
+	            yield cacheHttpClient.downloadCache(cacheEntry.archiveLocation, archivePath, options);
+	            if (core.isDebug()) {
+	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
+	            }
+	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
+	            core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
+	            yield (0, tar_1.extractTar)(archivePath, compressionMethod);
+	            core.info('Cache restored successfully');
+	            return cacheEntry.cacheKey;
+	        }
+	        catch (error) {
+	            const typedError = error;
+	            if (typedError.name === ValidationError.name) {
+	                throw error;
+	            }
+	            else {
+	                // warn on cache restore failure and continue build
+	                // Log server errors (5xx) as errors, all other errors as warnings
+	                if (typedError instanceof http_client_1.HttpClientError &&
+	                    typeof typedError.statusCode === 'number' &&
+	                    typedError.statusCode >= 500) {
+	                    core.error(`Failed to restore: ${error.message}`);
+	                }
+	                else {
+	                    core.warning(`Failed to restore: ${error.message}`);
+	                }
+	            }
+	        }
+	        finally {
+	            // Try to delete the archive to save space
+	            try {
+	                yield utils.unlinkFile(archivePath);
+	            }
+	            catch (error) {
+	                core.debug(`Failed to delete archive: ${error}`);
+	            }
+	        }
+	        return undefined;
+	    });
+	}
+	/**
+	 * Restores cache using Cache Service v2
+	 *
+	 * @param paths a list of file paths to restore from the cache
+	 * @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching
+	 * @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
+	 * @param downloadOptions cache download options
+	 * @param enableCrossOsArchive an optional boolean enabled to restore on windows any cache created on any platform
+	 * @returns string returns the key for the cache hit, otherwise returns undefined
+	 */
+	function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) {
+	    return __awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
+	        // Override UploadOptions to force the use of Azure
+	        options = Object.assign(Object.assign({}, options), { useAzureSdk: true });
+	        restoreKeys = restoreKeys || [];
+	        const keys = [primaryKey, ...restoreKeys];
+	        core.debug('Resolved Keys:');
+	        core.debug(JSON.stringify(keys));
+	        if (keys.length > 10) {
+	            throw new ValidationError(`Key Validation Error: Keys are limited to a maximum of 10.`);
+	        }
+	        for (const key of keys) {
+	            checkKey(key);
+	        }
+	        let archivePath = '';
+	        try {
+	            const twirpClient = cacheTwirpClient.internalCacheTwirpClient();
+	            const compressionMethod = yield utils.getCompressionMethod();
+	            const request = {
+	                key: primaryKey,
+	                restoreKeys,
+	                version: utils.getCacheVersion(paths, compressionMethod, enableCrossOsArchive)
+	            };
+	            const response = yield twirpClient.GetCacheEntryDownloadURL(request);
+	            if (!response.ok) {
+	                core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`);
+	                return undefined;
+	            }
+	            const isRestoreKeyMatch = request.key !== response.matchedKey;
+	            if (isRestoreKeyMatch) {
+	                core.info(`Cache hit for restore-key: ${response.matchedKey}`);
+	            }
+	            else {
+	                core.info(`Cache hit for: ${response.matchedKey}`);
+	            }
+	            if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
+	                core.info('Lookup only - skipping download');
+	                return response.matchedKey;
+	            }
+	            archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod));
+	            core.debug(`Archive path: ${archivePath}`);
+	            core.debug(`Starting download of archive to: ${archivePath}`);
+	            yield cacheHttpClient.downloadCache(response.signedDownloadUrl, archivePath, options);
+	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
+	            core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
+	            if (core.isDebug()) {
+	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
+	            }
+	            yield (0, tar_1.extractTar)(archivePath, compressionMethod);
+	            core.info('Cache restored successfully');
+	            return response.matchedKey;
+	        }
+	        catch (error) {
+	            const typedError = error;
+	            if (typedError.name === ValidationError.name) {
+	                throw error;
+	            }
+	            else {
+	                // Supress all non-validation cache related errors because caching should be optional
+	                // Log server errors (5xx) as errors, all other errors as warnings
+	                if (typedError instanceof http_client_1.HttpClientError &&
+	                    typeof typedError.statusCode === 'number' &&
+	                    typedError.statusCode >= 500) {
+	                    core.error(`Failed to restore: ${error.message}`);
+	                }
+	                else {
+	                    core.warning(`Failed to restore: ${error.message}`);
+	                }
+	            }
+	        }
+	        finally {
+	            try {
+	                if (archivePath) {
+	                    yield utils.unlinkFile(archivePath);
+	                }
+	            }
+	            catch (error) {
+	                core.debug(`Failed to delete archive: ${error}`);
+	            }
+	        }
+	        return undefined;
+	    });
+	}
+	/**
+	 * Saves a list of files with the specified key
+	 *
+	 * @param paths a list of file paths to be cached
+	 * @param key an explicit key for restoring the cache
+	 * @param enableCrossOsArchive an optional boolean enabled to save cache on windows which could be restored on any platform
+	 * @param options cache upload options
+	 * @returns number returns cacheId if the cache was saved successfully and throws an error if save fails
+	 */
+	function saveCache(paths_1, key_1, options_1) {
+	    return __awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
+	        const cacheServiceVersion = (0, config_1.getCacheServiceVersion)();
+	        core.debug(`Cache service version: ${cacheServiceVersion}`);
+	        checkPaths(paths);
+	        checkKey(key);
+	        switch (cacheServiceVersion) {
+	            case 'v2':
+	                return yield saveCacheV2(paths, key, options, enableCrossOsArchive);
+	            case 'v1':
+	            default:
+	                return yield saveCacheV1(paths, key, options, enableCrossOsArchive);
+	        }
+	    });
+	}
+	/**
+	 * Save cache using the legacy Cache Service
+	 *
+	 * @param paths
+	 * @param key
+	 * @param options
+	 * @param enableCrossOsArchive
+	 * @returns
+	 */
+	function saveCacheV1(paths_1, key_1, options_1) {
+	    return __awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
+	        var _a, _b, _c, _d, _e;
+	        const compressionMethod = yield utils.getCompressionMethod();
+	        let cacheId = -1;
+	        const cachePaths = yield utils.resolvePaths(paths);
+	        core.debug('Cache Paths:');
+	        core.debug(`${JSON.stringify(cachePaths)}`);
+	        if (cachePaths.length === 0) {
+	            throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`);
+	        }
+	        const archiveFolder = yield utils.createTempDirectory();
+	        const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod));
+	        core.debug(`Archive Path: ${archivePath}`);
+	        try {
+	            yield (0, tar_1.createTar)(archiveFolder, cachePaths, compressionMethod);
+	            if (core.isDebug()) {
+	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
+	            }
+	            const fileSizeLimit = 10 * 1024 * 1024 * 1024; // 10GB per repo limit
+	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
+	            core.debug(`File Size: ${archiveFileSize}`);
+	            // For GHES, this check will take place in ReserveCache API with enterprise file size limit
+	            if (archiveFileSize > fileSizeLimit && !(0, config_1.isGhes)()) {
+	                throw new Error(`Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the 10GB limit, not saving cache.`);
+	            }
+	            core.debug('Reserving Cache');
+	            const reserveCacheResponse = yield cacheHttpClient.reserveCache(key, paths, {
+	                compressionMethod,
+	                enableCrossOsArchive,
+	                cacheSize: archiveFileSize
+	            });
+	            if ((_a = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.result) === null || _a === void 0 ? void 0 : _a.cacheId) {
+	                cacheId = (_b = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.result) === null || _b === void 0 ? void 0 : _b.cacheId;
+	            }
+	            else if ((reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.statusCode) === 400) {
+	                throw new Error((_d = (_c = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _c === void 0 ? void 0 : _c.message) !== null && _d !== void 0 ? _d : `Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the data cap limit, not saving cache.`);
+	            }
+	            else {
+	                throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache. More details: ${(_e = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _e === void 0 ? void 0 : _e.message}`);
+	            }
+	            core.debug(`Saving Cache (ID: ${cacheId})`);
+	            yield cacheHttpClient.saveCache(cacheId, archivePath, '', options);
+	        }
+	        catch (error) {
+	            const typedError = error;
+	            if (typedError.name === ValidationError.name) {
+	                throw error;
+	            }
+	            else if (typedError.name === ReserveCacheError.name) {
+	                core.info(`Failed to save: ${typedError.message}`);
+	            }
+	            else {
+	                // Log server errors (5xx) as errors, all other errors as warnings
+	                if (typedError instanceof http_client_1.HttpClientError &&
+	                    typeof typedError.statusCode === 'number' &&
+	                    typedError.statusCode >= 500) {
+	                    core.error(`Failed to save: ${typedError.message}`);
+	                }
+	                else {
+	                    core.warning(`Failed to save: ${typedError.message}`);
+	                }
+	            }
+	        }
+	        finally {
+	            // Try to delete the archive to save space
+	            try {
+	                yield utils.unlinkFile(archivePath);
+	            }
+	            catch (error) {
+	                core.debug(`Failed to delete archive: ${error}`);
+	            }
+	        }
+	        return cacheId;
+	    });
+	}
+	/**
+	 * Save cache using Cache Service v2
+	 *
+	 * @param paths a list of file paths to restore from the cache
+	 * @param key an explicit key for restoring the cache
+	 * @param options cache upload options
+	 * @param enableCrossOsArchive an optional boolean enabled to save cache on windows which could be restored on any platform
+	 * @returns
+	 */
+	function saveCacheV2(paths_1, key_1, options_1) {
+	    return __awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
+	        // Override UploadOptions to force the use of Azure
+	        // ...options goes first because we want to override the default values
+	        // set in UploadOptions with these specific figures
+	        options = Object.assign(Object.assign({}, options), { uploadChunkSize: 64 * 1024 * 1024, uploadConcurrency: 8, useAzureSdk: true });
+	        const compressionMethod = yield utils.getCompressionMethod();
+	        const twirpClient = cacheTwirpClient.internalCacheTwirpClient();
+	        let cacheId = -1;
+	        const cachePaths = yield utils.resolvePaths(paths);
+	        core.debug('Cache Paths:');
+	        core.debug(`${JSON.stringify(cachePaths)}`);
+	        if (cachePaths.length === 0) {
+	            throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`);
+	        }
+	        const archiveFolder = yield utils.createTempDirectory();
+	        const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod));
+	        core.debug(`Archive Path: ${archivePath}`);
+	        try {
+	            yield (0, tar_1.createTar)(archiveFolder, cachePaths, compressionMethod);
+	            if (core.isDebug()) {
+	                yield (0, tar_1.listTar)(archivePath, compressionMethod);
+	            }
+	            const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
+	            core.debug(`File Size: ${archiveFileSize}`);
+	            // Set the archive size in the options, will be used to display the upload progress
+	            options.archiveSizeBytes = archiveFileSize;
+	            core.debug('Reserving Cache');
+	            const version = utils.getCacheVersion(paths, compressionMethod, enableCrossOsArchive);
+	            const request = {
+	                key,
+	                version
+	            };
+	            let signedUploadUrl;
+	            try {
+	                const response = yield twirpClient.CreateCacheEntry(request);
+	                if (!response.ok) {
+	                    if (response.message) {
+	                        core.warning(`Cache reservation failed: ${response.message}`);
+	                    }
+	                    throw new Error(response.message || 'Response was not ok');
+	                }
+	                signedUploadUrl = response.signedUploadUrl;
+	            }
+	            catch (error) {
+	                core.debug(`Failed to reserve cache: ${error}`);
+	                throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache.`);
+	            }
+	            core.debug(`Attempting to upload cache located at: ${archivePath}`);
+	            yield cacheHttpClient.saveCache(cacheId, archivePath, signedUploadUrl, options);
+	            const finalizeRequest = {
+	                key,
+	                version,
+	                sizeBytes: `${archiveFileSize}`
+	            };
+	            const finalizeResponse = yield twirpClient.FinalizeCacheEntryUpload(finalizeRequest);
+	            core.debug(`FinalizeCacheEntryUploadResponse: ${finalizeResponse.ok}`);
+	            if (!finalizeResponse.ok) {
+	                if (finalizeResponse.message) {
+	                    throw new FinalizeCacheError(finalizeResponse.message);
+	                }
+	                throw new Error(`Unable to finalize cache with key ${key}, another job may be finalizing this cache.`);
+	            }
+	            cacheId = parseInt(finalizeResponse.entryId);
+	        }
+	        catch (error) {
+	            const typedError = error;
+	            if (typedError.name === ValidationError.name) {
+	                throw error;
+	            }
+	            else if (typedError.name === ReserveCacheError.name) {
+	                core.info(`Failed to save: ${typedError.message}`);
+	            }
+	            else if (typedError.name === FinalizeCacheError.name) {
+	                core.warning(typedError.message);
+	            }
+	            else {
+	                // Log server errors (5xx) as errors, all other errors as warnings
+	                if (typedError instanceof http_client_1.HttpClientError &&
+	                    typeof typedError.statusCode === 'number' &&
+	                    typedError.statusCode >= 500) {
+	                    core.error(`Failed to save: ${typedError.message}`);
+	                }
+	                else {
+	                    core.warning(`Failed to save: ${typedError.message}`);
+	                }
+	            }
+	        }
+	        finally {
+	            // Try to delete the archive to save space
+	            try {
+	                yield utils.unlinkFile(archivePath);
+	            }
+	            catch (error) {
+	                core.debug(`Failed to delete archive: ${error}`);
+	            }
+	        }
+	        return cacheId;
+	    });
+	}
+	
+	return cache$3;
+}
+
+var cacheExports = requireCache$1();
+
+var globExports = requireGlob();
+
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 GitHub, Inc. and contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Forked from https://github.com/actions/setup-java/blob/5b36705a13905facb447b6812d613a06a07e371d/src/cache.ts
+ *
+ * @fileoverview this file provides methods handling dependency cache
+ */
+const STATE_CACHE_PRIMARY_KEY = 'cache-primary-key';
+const CACHE_MATCHED_KEY = 'cache-matched-key';
+const supportedPackageManager = [
+    {
+        id: 'maven',
+        path: [join(os.homedir(), '.m2', 'repository')],
+        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven
+        pattern: ['**/pom.xml']
+    },
+    {
+        id: 'gradle',
+        path: [join(os.homedir(), '.gradle', 'caches'), join(os.homedir(), '.gradle', 'wrapper')],
+        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle
+        pattern: ['**/*.gradle*', '**/gradle-wrapper.properties', 'buildSrc/**/Versions.kt', 'buildSrc/**/Dependencies.kt']
+    },
+    {
+        id: 'sbt',
+        path: [
+            join(os.homedir(), '.ivy2', 'cache'),
+            join(os.homedir(), '.sbt'),
+            getCoursierCachePath(),
+            // Some files should not be cached to avoid resolution problems.
+            // In particular the resolution of snapshots (ideological gap between maven/ivy).
+            `!${join(os.homedir(), '.sbt', '*.lock')}`,
+            `!${join(os.homedir(), '**', 'ivydata-*.properties')}`
+        ],
+        pattern: ['**/*.sbt', '**/project/build.properties', '**/project/**.{scala,sbt}']
+    }
+];
+function getCoursierCachePath() {
+    if (os.type() === 'Linux')
+        return join(os.homedir(), '.cache', 'coursier');
+    if (os.type() === 'Darwin')
+        return join(os.homedir(), 'Library', 'Caches', 'Coursier');
+    return join(os.homedir(), 'AppData', 'Local', 'Coursier', 'Cache');
+}
+function findPackageManager(id) {
+    const packageManager = supportedPackageManager.find((pm) => pm.id === id);
+    if (packageManager === undefined) {
+        throw new Error(`unknown package manager specified: ${id}`);
+    }
+    return packageManager;
+}
+/**
+ * Save the dependency cache
+ * @param id ID of the package manager, should be "maven" or "gradle"
+ */
+async function save(id) {
+    const packageManager = findPackageManager(id);
+    const matchedKey = coreExports.getState(CACHE_MATCHED_KEY);
+    // Inputs are re-evaluted before the post action, so we want the original key used for restore
+    const primaryKey = coreExports.getState(STATE_CACHE_PRIMARY_KEY);
+    if (!primaryKey) {
+        coreExports.warning('Error retrieving key from state.');
+        return;
+    }
+    else if (matchedKey === primaryKey) {
+        // no change in target directories
+        coreExports.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
+        return;
+    }
+    try {
+        await cacheExports.saveCache(packageManager.path, primaryKey);
+        coreExports.info(`Cache saved with the key: ${primaryKey}`);
+    }
+    catch (error) {
+        if (!(error instanceof Error)) {
+            coreExports.info(`Not an Error: ${error}`);
+            throw error;
+        }
+        if (error.name === cacheExports.ReserveCacheError.name) {
+            coreExports.info(error.message);
+        }
+        else {
+            if (isProbablyGradleDaemonProblem(packageManager, error)) {
+                coreExports.warning('Failed to save Gradle cache on Windows. If tar.exe reported "Permission denied", try to run Gradle with `--no-daemon` option. Refer to https://github.com/actions/cache/issues/454 for details.');
+            }
+            throw error;
+        }
+    }
+}
+/**
+ * @param packageManager the specified package manager by user
+ * @param error the error thrown by the saveCache
+ * @returns true if the given error seems related to the {@link https://github.com/actions/cache/issues/454|running Gradle Daemon issue}.
+ * @see {@link https://github.com/actions/cache/issues/454#issuecomment-840493935|why --no-daemon is necessary}
+ */
+function isProbablyGradleDaemonProblem(packageManager, error) {
+    if (packageManager.id !== 'gradle' || process.env['RUNNER_OS'] !== 'Windows') {
+        return false;
+    }
+    const message = error.message || '';
+    return message.startsWith('Tar failed with error: ');
+}
+
+class Context {
+    /**
+     * Hydrate the context from the environment
+     */
+    constructor() {
+        var _a, _b, _c;
+        this.payload = {};
+        if (process.env.GITHUB_EVENT_PATH) {
+            if (existsSync(process.env.GITHUB_EVENT_PATH)) {
+                this.payload = JSON.parse(readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));
+            }
+            else {
+                const path = process.env.GITHUB_EVENT_PATH;
+                process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${EOL}`);
+            }
+        }
+        this.eventName = process.env.GITHUB_EVENT_NAME;
+        this.sha = process.env.GITHUB_SHA;
+        this.ref = process.env.GITHUB_REF;
+        this.workflow = process.env.GITHUB_WORKFLOW;
+        this.action = process.env.GITHUB_ACTION;
+        this.actor = process.env.GITHUB_ACTOR;
+        this.job = process.env.GITHUB_JOB;
+        this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10);
+        this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);
+        this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);
+        this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;
+        this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;
+        this.graphqlUrl =
+            (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;
+    }
+    get issue() {
+        const payload = this.payload;
+        return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });
+    }
+    get repo() {
+        if (process.env.GITHUB_REPOSITORY) {
+            const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
+            return { owner, repo };
+        }
+        if (this.payload.repository) {
+            return {
+                owner: this.payload.repository.owner.login,
+                repo: this.payload.repository.name
+            };
+        }
+        throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'");
+    }
+}
+
+var libExports = requireLib();
+
+var undici = {};
+
+var symbols$4;
+var hasRequiredSymbols$4;
+
+function requireSymbols$4 () {
+	if (hasRequiredSymbols$4) return symbols$4;
+	hasRequiredSymbols$4 = 1;
+	symbols$4 = {
+	  kClose: Symbol('close'),
+	  kDestroy: Symbol('destroy'),
+	  kDispatch: Symbol('dispatch'),
+	  kUrl: Symbol('url'),
+	  kWriting: Symbol('writing'),
+	  kResuming: Symbol('resuming'),
+	  kQueue: Symbol('queue'),
+	  kConnect: Symbol('connect'),
+	  kConnecting: Symbol('connecting'),
+	  kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),
+	  kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),
+	  kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),
+	  kKeepAliveTimeoutValue: Symbol('keep alive timeout'),
+	  kKeepAlive: Symbol('keep alive'),
+	  kHeadersTimeout: Symbol('headers timeout'),
+	  kBodyTimeout: Symbol('body timeout'),
+	  kServerName: Symbol('server name'),
+	  kLocalAddress: Symbol('local address'),
+	  kHost: Symbol('host'),
+	  kNoRef: Symbol('no ref'),
+	  kBodyUsed: Symbol('used'),
+	  kBody: Symbol('abstracted request body'),
+	  kRunning: Symbol('running'),
+	  kBlocking: Symbol('blocking'),
+	  kPending: Symbol('pending'),
+	  kSize: Symbol('size'),
+	  kBusy: Symbol('busy'),
+	  kQueued: Symbol('queued'),
+	  kFree: Symbol('free'),
+	  kConnected: Symbol('connected'),
+	  kClosed: Symbol('closed'),
+	  kNeedDrain: Symbol('need drain'),
+	  kReset: Symbol('reset'),
+	  kDestroyed: Symbol.for('nodejs.stream.destroyed'),
+	  kResume: Symbol('resume'),
+	  kOnError: Symbol('on error'),
+	  kMaxHeadersSize: Symbol('max headers size'),
+	  kRunningIdx: Symbol('running index'),
+	  kPendingIdx: Symbol('pending index'),
+	  kError: Symbol('error'),
+	  kClients: Symbol('clients'),
+	  kClient: Symbol('client'),
+	  kParser: Symbol('parser'),
+	  kOnDestroyed: Symbol('destroy callbacks'),
+	  kPipelining: Symbol('pipelining'),
+	  kSocket: Symbol('socket'),
+	  kHostHeader: Symbol('host header'),
+	  kConnector: Symbol('connector'),
+	  kStrictContentLength: Symbol('strict content length'),
+	  kMaxRedirections: Symbol('maxRedirections'),
+	  kMaxRequests: Symbol('maxRequestsPerClient'),
+	  kProxy: Symbol('proxy agent options'),
+	  kCounter: Symbol('socket request counter'),
+	  kInterceptors: Symbol('dispatch interceptors'),
+	  kMaxResponseSize: Symbol('max response size'),
+	  kHTTP2Session: Symbol('http2Session'),
+	  kHTTP2SessionState: Symbol('http2Session state'),
+	  kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),
+	  kConstruct: Symbol('constructable'),
+	  kListeners: Symbol('listeners'),
+	  kHTTPContext: Symbol('http context'),
+	  kMaxConcurrentStreams: Symbol('max concurrent streams'),
+	  kNoProxyAgent: Symbol('no proxy agent'),
+	  kHttpProxyAgent: Symbol('http proxy agent'),
+	  kHttpsProxyAgent: Symbol('https proxy agent')
+	};
+	return symbols$4;
+}
+
+var errors;
+var hasRequiredErrors;
+
+function requireErrors () {
+	if (hasRequiredErrors) return errors;
+	hasRequiredErrors = 1;
+
+	const kUndiciError = Symbol.for('undici.error.UND_ERR');
+	class UndiciError extends Error {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'UndiciError';
+	    this.code = 'UND_ERR';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kUndiciError] === true
+	  }
+
+	  [kUndiciError] = true
+	}
+
+	const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT');
+	class ConnectTimeoutError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'ConnectTimeoutError';
+	    this.message = message || 'Connect Timeout Error';
+	    this.code = 'UND_ERR_CONNECT_TIMEOUT';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kConnectTimeoutError] === true
+	  }
+
+	  [kConnectTimeoutError] = true
+	}
+
+	const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT');
+	class HeadersTimeoutError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'HeadersTimeoutError';
+	    this.message = message || 'Headers Timeout Error';
+	    this.code = 'UND_ERR_HEADERS_TIMEOUT';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kHeadersTimeoutError] === true
+	  }
+
+	  [kHeadersTimeoutError] = true
+	}
+
+	const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW');
+	class HeadersOverflowError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'HeadersOverflowError';
+	    this.message = message || 'Headers Overflow Error';
+	    this.code = 'UND_ERR_HEADERS_OVERFLOW';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kHeadersOverflowError] === true
+	  }
+
+	  [kHeadersOverflowError] = true
+	}
+
+	const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT');
+	class BodyTimeoutError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'BodyTimeoutError';
+	    this.message = message || 'Body Timeout Error';
+	    this.code = 'UND_ERR_BODY_TIMEOUT';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kBodyTimeoutError] === true
+	  }
+
+	  [kBodyTimeoutError] = true
+	}
+
+	const kResponseStatusCodeError = Symbol.for('undici.error.UND_ERR_RESPONSE_STATUS_CODE');
+	class ResponseStatusCodeError extends UndiciError {
+	  constructor (message, statusCode, headers, body) {
+	    super(message);
+	    this.name = 'ResponseStatusCodeError';
+	    this.message = message || 'Response Status Code Error';
+	    this.code = 'UND_ERR_RESPONSE_STATUS_CODE';
+	    this.body = body;
+	    this.status = statusCode;
+	    this.statusCode = statusCode;
+	    this.headers = headers;
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kResponseStatusCodeError] === true
+	  }
+
+	  [kResponseStatusCodeError] = true
+	}
+
+	const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG');
+	class InvalidArgumentError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'InvalidArgumentError';
+	    this.message = message || 'Invalid Argument Error';
+	    this.code = 'UND_ERR_INVALID_ARG';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kInvalidArgumentError] === true
+	  }
+
+	  [kInvalidArgumentError] = true
+	}
+
+	const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE');
+	class InvalidReturnValueError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'InvalidReturnValueError';
+	    this.message = message || 'Invalid Return Value Error';
+	    this.code = 'UND_ERR_INVALID_RETURN_VALUE';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kInvalidReturnValueError] === true
+	  }
+
+	  [kInvalidReturnValueError] = true
+	}
+
+	const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT');
+	class AbortError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'AbortError';
+	    this.message = message || 'The operation was aborted';
+	    this.code = 'UND_ERR_ABORT';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kAbortError] === true
+	  }
+
+	  [kAbortError] = true
+	}
+
+	const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED');
+	class RequestAbortedError extends AbortError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'AbortError';
+	    this.message = message || 'Request aborted';
+	    this.code = 'UND_ERR_ABORTED';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kRequestAbortedError] === true
+	  }
+
+	  [kRequestAbortedError] = true
+	}
+
+	const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO');
+	class InformationalError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'InformationalError';
+	    this.message = message || 'Request information';
+	    this.code = 'UND_ERR_INFO';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kInformationalError] === true
+	  }
+
+	  [kInformationalError] = true
+	}
+
+	const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH');
+	class RequestContentLengthMismatchError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'RequestContentLengthMismatchError';
+	    this.message = message || 'Request body length does not match content-length header';
+	    this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kRequestContentLengthMismatchError] === true
+	  }
+
+	  [kRequestContentLengthMismatchError] = true
+	}
+
+	const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH');
+	class ResponseContentLengthMismatchError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'ResponseContentLengthMismatchError';
+	    this.message = message || 'Response body length does not match content-length header';
+	    this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kResponseContentLengthMismatchError] === true
+	  }
+
+	  [kResponseContentLengthMismatchError] = true
+	}
+
+	const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED');
+	class ClientDestroyedError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'ClientDestroyedError';
+	    this.message = message || 'The client is destroyed';
+	    this.code = 'UND_ERR_DESTROYED';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kClientDestroyedError] === true
+	  }
+
+	  [kClientDestroyedError] = true
+	}
+
+	const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED');
+	class ClientClosedError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'ClientClosedError';
+	    this.message = message || 'The client is closed';
+	    this.code = 'UND_ERR_CLOSED';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kClientClosedError] === true
+	  }
+
+	  [kClientClosedError] = true
+	}
+
+	const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET');
+	class SocketError extends UndiciError {
+	  constructor (message, socket) {
+	    super(message);
+	    this.name = 'SocketError';
+	    this.message = message || 'Socket error';
+	    this.code = 'UND_ERR_SOCKET';
+	    this.socket = socket;
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kSocketError] === true
+	  }
+
+	  [kSocketError] = true
+	}
+
+	const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED');
+	class NotSupportedError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'NotSupportedError';
+	    this.message = message || 'Not supported error';
+	    this.code = 'UND_ERR_NOT_SUPPORTED';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kNotSupportedError] === true
+	  }
+
+	  [kNotSupportedError] = true
+	}
+
+	const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM');
+	class BalancedPoolMissingUpstreamError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'MissingUpstreamError';
+	    this.message = message || 'No upstream has been added to the BalancedPool';
+	    this.code = 'UND_ERR_BPL_MISSING_UPSTREAM';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kBalancedPoolMissingUpstreamError] === true
+	  }
+
+	  [kBalancedPoolMissingUpstreamError] = true
+	}
+
+	const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER');
+	class HTTPParserError extends Error {
+	  constructor (message, code, data) {
+	    super(message);
+	    this.name = 'HTTPParserError';
+	    this.code = code ? `HPE_${code}` : undefined;
+	    this.data = data ? data.toString() : undefined;
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kHTTPParserError] === true
+	  }
+
+	  [kHTTPParserError] = true
+	}
+
+	const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE');
+	class ResponseExceededMaxSizeError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    this.name = 'ResponseExceededMaxSizeError';
+	    this.message = message || 'Response content exceeded max size';
+	    this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kResponseExceededMaxSizeError] === true
+	  }
+
+	  [kResponseExceededMaxSizeError] = true
+	}
+
+	const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY');
+	class RequestRetryError extends UndiciError {
+	  constructor (message, code, { headers, data }) {
+	    super(message);
+	    this.name = 'RequestRetryError';
+	    this.message = message || 'Request retry error';
+	    this.code = 'UND_ERR_REQ_RETRY';
+	    this.statusCode = code;
+	    this.data = data;
+	    this.headers = headers;
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kRequestRetryError] === true
+	  }
+
+	  [kRequestRetryError] = true
+	}
+
+	const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE');
+	class ResponseError extends UndiciError {
+	  constructor (message, code, { headers, data }) {
+	    super(message);
+	    this.name = 'ResponseError';
+	    this.message = message || 'Response error';
+	    this.code = 'UND_ERR_RESPONSE';
+	    this.statusCode = code;
+	    this.data = data;
+	    this.headers = headers;
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kResponseError] === true
+	  }
+
+	  [kResponseError] = true
+	}
+
+	const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS');
+	class SecureProxyConnectionError extends UndiciError {
+	  constructor (cause, message, options) {
+	    super(message, { cause, ...(options ?? {}) });
+	    this.name = 'SecureProxyConnectionError';
+	    this.message = message || 'Secure Proxy Connection failed';
+	    this.code = 'UND_ERR_PRX_TLS';
+	    this.cause = cause;
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kSecureProxyConnectionError] === true
+	  }
+
+	  [kSecureProxyConnectionError] = true
+	}
+
+	errors = {
+	  AbortError,
+	  HTTPParserError,
+	  UndiciError,
+	  HeadersTimeoutError,
+	  HeadersOverflowError,
+	  BodyTimeoutError,
+	  RequestContentLengthMismatchError,
+	  ConnectTimeoutError,
+	  ResponseStatusCodeError,
+	  InvalidArgumentError,
+	  InvalidReturnValueError,
+	  RequestAbortedError,
+	  ClientDestroyedError,
+	  ClientClosedError,
+	  InformationalError,
+	  SocketError,
+	  NotSupportedError,
+	  ResponseContentLengthMismatchError,
+	  BalancedPoolMissingUpstreamError,
+	  ResponseExceededMaxSizeError,
+	  RequestRetryError,
+	  ResponseError,
+	  SecureProxyConnectionError
+	};
+	return errors;
+}
+
+var constants$5;
+var hasRequiredConstants$5;
+
+function requireConstants$5 () {
+	if (hasRequiredConstants$5) return constants$5;
+	hasRequiredConstants$5 = 1;
+
+	/** @type {Record} */
+	const headerNameLowerCasedRecord = {};
+
+	// https://developer.mozilla.org/docs/Web/HTTP/Headers
+	const wellknownHeaderNames = [
+	  'Accept',
+	  'Accept-Encoding',
+	  'Accept-Language',
+	  'Accept-Ranges',
+	  'Access-Control-Allow-Credentials',
+	  'Access-Control-Allow-Headers',
+	  'Access-Control-Allow-Methods',
+	  'Access-Control-Allow-Origin',
+	  'Access-Control-Expose-Headers',
+	  'Access-Control-Max-Age',
+	  'Access-Control-Request-Headers',
+	  'Access-Control-Request-Method',
+	  'Age',
+	  'Allow',
+	  'Alt-Svc',
+	  'Alt-Used',
+	  'Authorization',
+	  'Cache-Control',
+	  'Clear-Site-Data',
+	  'Connection',
+	  'Content-Disposition',
+	  'Content-Encoding',
+	  'Content-Language',
+	  'Content-Length',
+	  'Content-Location',
+	  'Content-Range',
+	  'Content-Security-Policy',
+	  'Content-Security-Policy-Report-Only',
+	  'Content-Type',
+	  'Cookie',
+	  'Cross-Origin-Embedder-Policy',
+	  'Cross-Origin-Opener-Policy',
+	  'Cross-Origin-Resource-Policy',
+	  'Date',
+	  'Device-Memory',
+	  'Downlink',
+	  'ECT',
+	  'ETag',
+	  'Expect',
+	  'Expect-CT',
+	  'Expires',
+	  'Forwarded',
+	  'From',
+	  'Host',
+	  'If-Match',
+	  'If-Modified-Since',
+	  'If-None-Match',
+	  'If-Range',
+	  'If-Unmodified-Since',
+	  'Keep-Alive',
+	  'Last-Modified',
+	  'Link',
+	  'Location',
+	  'Max-Forwards',
+	  'Origin',
+	  'Permissions-Policy',
+	  'Pragma',
+	  'Proxy-Authenticate',
+	  'Proxy-Authorization',
+	  'RTT',
+	  'Range',
+	  'Referer',
+	  'Referrer-Policy',
+	  'Refresh',
+	  'Retry-After',
+	  'Sec-WebSocket-Accept',
+	  'Sec-WebSocket-Extensions',
+	  'Sec-WebSocket-Key',
+	  'Sec-WebSocket-Protocol',
+	  'Sec-WebSocket-Version',
+	  'Server',
+	  'Server-Timing',
+	  'Service-Worker-Allowed',
+	  'Service-Worker-Navigation-Preload',
+	  'Set-Cookie',
+	  'SourceMap',
+	  'Strict-Transport-Security',
+	  'Supports-Loading-Mode',
+	  'TE',
+	  'Timing-Allow-Origin',
+	  'Trailer',
+	  'Transfer-Encoding',
+	  'Upgrade',
+	  'Upgrade-Insecure-Requests',
+	  'User-Agent',
+	  'Vary',
+	  'Via',
+	  'WWW-Authenticate',
+	  'X-Content-Type-Options',
+	  'X-DNS-Prefetch-Control',
+	  'X-Frame-Options',
+	  'X-Permitted-Cross-Domain-Policies',
+	  'X-Powered-By',
+	  'X-Requested-With',
+	  'X-XSS-Protection'
+	];
+
+	for (let i = 0; i < wellknownHeaderNames.length; ++i) {
+	  const key = wellknownHeaderNames[i];
+	  const lowerCasedKey = key.toLowerCase();
+	  headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] =
+	    lowerCasedKey;
+	}
+
+	// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
+	Object.setPrototypeOf(headerNameLowerCasedRecord, null);
+
+	constants$5 = {
+	  wellknownHeaderNames,
+	  headerNameLowerCasedRecord
+	};
+	return constants$5;
+}
+
+var tree_1;
+var hasRequiredTree;
+
+function requireTree () {
+	if (hasRequiredTree) return tree_1;
+	hasRequiredTree = 1;
+
+	const {
+	  wellknownHeaderNames,
+	  headerNameLowerCasedRecord
+	} = requireConstants$5();
+
+	class TstNode {
+	  /** @type {any} */
+	  value = null
+	  /** @type {null | TstNode} */
+	  left = null
+	  /** @type {null | TstNode} */
+	  middle = null
+	  /** @type {null | TstNode} */
+	  right = null
+	  /** @type {number} */
+	  code
+	  /**
+	   * @param {string} key
+	   * @param {any} value
+	   * @param {number} index
+	   */
+	  constructor (key, value, index) {
+	    if (index === undefined || index >= key.length) {
+	      throw new TypeError('Unreachable')
+	    }
+	    const code = this.code = key.charCodeAt(index);
+	    // check code is ascii string
+	    if (code > 0x7F) {
+	      throw new TypeError('key must be ascii string')
+	    }
+	    if (key.length !== ++index) {
+	      this.middle = new TstNode(key, value, index);
+	    } else {
+	      this.value = value;
+	    }
+	  }
+
+	  /**
+	   * @param {string} key
+	   * @param {any} value
+	   */
+	  add (key, value) {
+	    const length = key.length;
+	    if (length === 0) {
+	      throw new TypeError('Unreachable')
+	    }
+	    let index = 0;
+	    let node = this;
+	    while (true) {
+	      const code = key.charCodeAt(index);
+	      // check code is ascii string
+	      if (code > 0x7F) {
+	        throw new TypeError('key must be ascii string')
+	      }
+	      if (node.code === code) {
+	        if (length === ++index) {
+	          node.value = value;
+	          break
+	        } else if (node.middle !== null) {
+	          node = node.middle;
+	        } else {
+	          node.middle = new TstNode(key, value, index);
+	          break
+	        }
+	      } else if (node.code < code) {
+	        if (node.left !== null) {
+	          node = node.left;
+	        } else {
+	          node.left = new TstNode(key, value, index);
+	          break
+	        }
+	      } else if (node.right !== null) {
+	        node = node.right;
+	      } else {
+	        node.right = new TstNode(key, value, index);
+	        break
+	      }
+	    }
+	  }
+
+	  /**
+	   * @param {Uint8Array} key
+	   * @return {TstNode | null}
+	   */
+	  search (key) {
+	    const keylength = key.length;
+	    let index = 0;
+	    let node = this;
+	    while (node !== null && index < keylength) {
+	      let code = key[index];
+	      // A-Z
+	      // First check if it is bigger than 0x5a.
+	      // Lowercase letters have higher char codes than uppercase ones.
+	      // Also we assume that headers will mostly contain lowercase characters.
+	      if (code <= 0x5a && code >= 0x41) {
+	        // Lowercase for uppercase.
+	        code |= 32;
+	      }
+	      while (node !== null) {
+	        if (code === node.code) {
+	          if (keylength === ++index) {
+	            // Returns Node since it is the last key.
+	            return node
+	          }
+	          node = node.middle;
+	          break
+	        }
+	        node = node.code < code ? node.left : node.right;
+	      }
+	    }
+	    return null
+	  }
+	}
+
+	class TernarySearchTree {
+	  /** @type {TstNode | null} */
+	  node = null
+
+	  /**
+	   * @param {string} key
+	   * @param {any} value
+	   * */
+	  insert (key, value) {
+	    if (this.node === null) {
+	      this.node = new TstNode(key, value, 0);
+	    } else {
+	      this.node.add(key, value);
+	    }
+	  }
+
+	  /**
+	   * @param {Uint8Array} key
+	   * @return {any}
+	   */
+	  lookup (key) {
+	    return this.node?.search(key)?.value ?? null
+	  }
+	}
+
+	const tree = new TernarySearchTree();
+
+	for (let i = 0; i < wellknownHeaderNames.length; ++i) {
+	  const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]];
+	  tree.insert(key, key);
+	}
+
+	tree_1 = {
+	  TernarySearchTree,
+	  tree
+	};
+	return tree_1;
+}
+
+var util$7;
+var hasRequiredUtil$7;
+
+function requireUtil$7 () {
+	if (hasRequiredUtil$7) return util$7;
+	hasRequiredUtil$7 = 1;
+
+	const assert = require$$0$7;
+	const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols$4();
+	const { IncomingMessage } = require$$2;
+	const stream = require$$0$8;
+	const net = require$$0$9;
+	const { Blob } = require$$0$6;
+	const nodeUtil = require$$0$a;
+	const { stringify } = require$$7;
+	const { EventEmitter: EE } = require$$8;
+	const { InvalidArgumentError } = requireErrors();
+	const { headerNameLowerCasedRecord } = requireConstants$5();
+	const { tree } = requireTree();
+
+	const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v));
+
+	class BodyAsyncIterable {
+	  constructor (body) {
+	    this[kBody] = body;
+	    this[kBodyUsed] = false;
+	  }
+
+	  async * [Symbol.asyncIterator] () {
+	    assert(!this[kBodyUsed], 'disturbed');
+	    this[kBodyUsed] = true;
+	    yield * this[kBody];
+	  }
+	}
+
+	function wrapRequestBody (body) {
+	  if (isStream(body)) {
+	    // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp
+	    // so that it can be dispatched again?
+	    // TODO (fix): Do we need 100-expect support to provide a way to do this properly?
+	    if (bodyLength(body) === 0) {
+	      body
+	        .on('data', function () {
+	          assert(false);
+	        });
+	    }
+
+	    if (typeof body.readableDidRead !== 'boolean') {
+	      body[kBodyUsed] = false;
+	      EE.prototype.on.call(body, 'data', function () {
+	        this[kBodyUsed] = true;
+	      });
+	    }
+
+	    return body
+	  } else if (body && typeof body.pipeTo === 'function') {
+	    // TODO (fix): We can't access ReadableStream internal state
+	    // to determine whether or not it has been disturbed. This is just
+	    // a workaround.
+	    return new BodyAsyncIterable(body)
+	  } else if (
+	    body &&
+	    typeof body !== 'string' &&
+	    !ArrayBuffer.isView(body) &&
+	    isIterable(body)
+	  ) {
+	    // TODO: Should we allow re-using iterable if !this.opts.idempotent
+	    // or through some other flag?
+	    return new BodyAsyncIterable(body)
+	  } else {
+	    return body
+	  }
+	}
+
+	function nop () {}
+
+	function isStream (obj) {
+	  return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'
+	}
+
+	// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License)
+	function isBlobLike (object) {
+	  if (object === null) {
+	    return false
+	  } else if (object instanceof Blob) {
+	    return true
+	  } else if (typeof object !== 'object') {
+	    return false
+	  } else {
+	    const sTag = object[Symbol.toStringTag];
+
+	    return (sTag === 'Blob' || sTag === 'File') && (
+	      ('stream' in object && typeof object.stream === 'function') ||
+	      ('arrayBuffer' in object && typeof object.arrayBuffer === 'function')
+	    )
+	  }
+	}
+
+	function buildURL (url, queryParams) {
+	  if (url.includes('?') || url.includes('#')) {
+	    throw new Error('Query params cannot be passed when url already contains "?" or "#".')
+	  }
+
+	  const stringified = stringify(queryParams);
+
+	  if (stringified) {
+	    url += '?' + stringified;
+	  }
+
+	  return url
+	}
+
+	function isValidPort (port) {
+	  const value = parseInt(port, 10);
+	  return (
+	    value === Number(port) &&
+	    value >= 0 &&
+	    value <= 65535
+	  )
+	}
+
+	function isHttpOrHttpsPrefixed (value) {
+	  return (
+	    value != null &&
+	    value[0] === 'h' &&
+	    value[1] === 't' &&
+	    value[2] === 't' &&
+	    value[3] === 'p' &&
+	    (
+	      value[4] === ':' ||
+	      (
+	        value[4] === 's' &&
+	        value[5] === ':'
+	      )
+	    )
+	  )
+	}
+
+	function parseURL (url) {
+	  if (typeof url === 'string') {
+	    url = new URL(url);
+
+	    if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {
+	      throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')
+	    }
+
+	    return url
+	  }
+
+	  if (!url || typeof url !== 'object') {
+	    throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')
+	  }
+
+	  if (!(url instanceof URL)) {
+	    if (url.port != null && url.port !== '' && isValidPort(url.port) === false) {
+	      throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')
+	    }
+
+	    if (url.path != null && typeof url.path !== 'string') {
+	      throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')
+	    }
+
+	    if (url.pathname != null && typeof url.pathname !== 'string') {
+	      throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')
+	    }
+
+	    if (url.hostname != null && typeof url.hostname !== 'string') {
+	      throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')
+	    }
+
+	    if (url.origin != null && typeof url.origin !== 'string') {
+	      throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')
+	    }
+
+	    if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {
+	      throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')
+	    }
+
+	    const port = url.port != null
+	      ? url.port
+	      : (url.protocol === 'https:' ? 443 : 80);
+	    let origin = url.origin != null
+	      ? url.origin
+	      : `${url.protocol || ''}//${url.hostname || ''}:${port}`;
+	    let path = url.path != null
+	      ? url.path
+	      : `${url.pathname || ''}${url.search || ''}`;
+
+	    if (origin[origin.length - 1] === '/') {
+	      origin = origin.slice(0, origin.length - 1);
+	    }
+
+	    if (path && path[0] !== '/') {
+	      path = `/${path}`;
+	    }
+	    // new URL(path, origin) is unsafe when `path` contains an absolute URL
+	    // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:
+	    // If first parameter is a relative URL, second param is required, and will be used as the base URL.
+	    // If first parameter is an absolute URL, a given second param will be ignored.
+	    return new URL(`${origin}${path}`)
+	  }
+
+	  if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {
+	    throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')
+	  }
+
+	  return url
+	}
+
+	function parseOrigin (url) {
+	  url = parseURL(url);
+
+	  if (url.pathname !== '/' || url.search || url.hash) {
+	    throw new InvalidArgumentError('invalid url')
+	  }
+
+	  return url
+	}
+
+	function getHostname (host) {
+	  if (host[0] === '[') {
+	    const idx = host.indexOf(']');
+
+	    assert(idx !== -1);
+	    return host.substring(1, idx)
+	  }
+
+	  const idx = host.indexOf(':');
+	  if (idx === -1) return host
+
+	  return host.substring(0, idx)
+	}
+
+	// IP addresses are not valid server names per RFC6066
+	// > Currently, the only server names supported are DNS hostnames
+	function getServerName (host) {
+	  if (!host) {
+	    return null
+	  }
+
+	  assert(typeof host === 'string');
+
+	  const servername = getHostname(host);
+	  if (net.isIP(servername)) {
+	    return ''
+	  }
+
+	  return servername
+	}
+
+	function deepClone (obj) {
+	  return JSON.parse(JSON.stringify(obj))
+	}
+
+	function isAsyncIterable (obj) {
+	  return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')
+	}
+
+	function isIterable (obj) {
+	  return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))
+	}
+
+	function bodyLength (body) {
+	  if (body == null) {
+	    return 0
+	  } else if (isStream(body)) {
+	    const state = body._readableState;
+	    return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)
+	      ? state.length
+	      : null
+	  } else if (isBlobLike(body)) {
+	    return body.size != null ? body.size : null
+	  } else if (isBuffer(body)) {
+	    return body.byteLength
+	  }
+
+	  return null
+	}
+
+	function isDestroyed (body) {
+	  return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body)))
+	}
+
+	function destroy (stream, err) {
+	  if (stream == null || !isStream(stream) || isDestroyed(stream)) {
+	    return
+	  }
+
+	  if (typeof stream.destroy === 'function') {
+	    if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {
+	      // See: https://github.com/nodejs/node/pull/38505/files
+	      stream.socket = null;
+	    }
+
+	    stream.destroy(err);
+	  } else if (err) {
+	    queueMicrotask(() => {
+	      stream.emit('error', err);
+	    });
+	  }
+
+	  if (stream.destroyed !== true) {
+	    stream[kDestroyed] = true;
+	  }
+	}
+
+	const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/;
+	function parseKeepAliveTimeout (val) {
+	  const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR);
+	  return m ? parseInt(m[1], 10) * 1000 : null
+	}
+
+	/**
+	 * Retrieves a header name and returns its lowercase value.
+	 * @param {string | Buffer} value Header name
+	 * @returns {string}
+	 */
+	function headerNameToString (value) {
+	  return typeof value === 'string'
+	    ? headerNameLowerCasedRecord[value] ?? value.toLowerCase()
+	    : tree.lookup(value) ?? value.toString('latin1').toLowerCase()
+	}
+
+	/**
+	 * Receive the buffer as a string and return its lowercase value.
+	 * @param {Buffer} value Header name
+	 * @returns {string}
+	 */
+	function bufferToLowerCasedHeaderName (value) {
+	  return tree.lookup(value) ?? value.toString('latin1').toLowerCase()
+	}
+
+	/**
+	 * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers
+	 * @param {Record} [obj]
+	 * @returns {Record}
+	 */
+	function parseHeaders (headers, obj) {
+	  if (obj === undefined) obj = {};
+	  for (let i = 0; i < headers.length; i += 2) {
+	    const key = headerNameToString(headers[i]);
+	    let val = obj[key];
+
+	    if (val) {
+	      if (typeof val === 'string') {
+	        val = [val];
+	        obj[key] = val;
+	      }
+	      val.push(headers[i + 1].toString('utf8'));
+	    } else {
+	      const headersValue = headers[i + 1];
+	      if (typeof headersValue === 'string') {
+	        obj[key] = headersValue;
+	      } else {
+	        obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8');
+	      }
+	    }
+	  }
+
+	  // See https://github.com/nodejs/node/pull/46528
+	  if ('content-length' in obj && 'content-disposition' in obj) {
+	    obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1');
+	  }
+
+	  return obj
+	}
+
+	function parseRawHeaders (headers) {
+	  const len = headers.length;
+	  const ret = new Array(len);
+
+	  let hasContentLength = false;
+	  let contentDispositionIdx = -1;
+	  let key;
+	  let val;
+	  let kLen = 0;
+
+	  for (let n = 0; n < headers.length; n += 2) {
+	    key = headers[n];
+	    val = headers[n + 1];
+
+	    typeof key !== 'string' && (key = key.toString());
+	    typeof val !== 'string' && (val = val.toString('utf8'));
+
+	    kLen = key.length;
+	    if (kLen === 14 && key[7] === '-' && (key === 'content-length' || key.toLowerCase() === 'content-length')) {
+	      hasContentLength = true;
+	    } else if (kLen === 19 && key[7] === '-' && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) {
+	      contentDispositionIdx = n + 1;
+	    }
+	    ret[n] = key;
+	    ret[n + 1] = val;
+	  }
+
+	  // See https://github.com/nodejs/node/pull/46528
+	  if (hasContentLength && contentDispositionIdx !== -1) {
+	    ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1');
+	  }
+
+	  return ret
+	}
+
+	function isBuffer (buffer) {
+	  // See, https://github.com/mcollina/undici/pull/319
+	  return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)
+	}
+
+	function validateHandler (handler, method, upgrade) {
+	  if (!handler || typeof handler !== 'object') {
+	    throw new InvalidArgumentError('handler must be an object')
+	  }
+
+	  if (typeof handler.onConnect !== 'function') {
+	    throw new InvalidArgumentError('invalid onConnect method')
+	  }
+
+	  if (typeof handler.onError !== 'function') {
+	    throw new InvalidArgumentError('invalid onError method')
+	  }
+
+	  if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {
+	    throw new InvalidArgumentError('invalid onBodySent method')
+	  }
+
+	  if (upgrade || method === 'CONNECT') {
+	    if (typeof handler.onUpgrade !== 'function') {
+	      throw new InvalidArgumentError('invalid onUpgrade method')
+	    }
+	  } else {
+	    if (typeof handler.onHeaders !== 'function') {
+	      throw new InvalidArgumentError('invalid onHeaders method')
+	    }
+
+	    if (typeof handler.onData !== 'function') {
+	      throw new InvalidArgumentError('invalid onData method')
+	    }
+
+	    if (typeof handler.onComplete !== 'function') {
+	      throw new InvalidArgumentError('invalid onComplete method')
+	    }
+	  }
+	}
+
+	// A body is disturbed if it has been read from and it cannot
+	// be re-used without losing state or data.
+	function isDisturbed (body) {
+	  // TODO (fix): Why is body[kBodyUsed] needed?
+	  return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]))
+	}
+
+	function isErrored (body) {
+	  return !!(body && stream.isErrored(body))
+	}
+
+	function isReadable (body) {
+	  return !!(body && stream.isReadable(body))
+	}
+
+	function getSocketInfo (socket) {
+	  return {
+	    localAddress: socket.localAddress,
+	    localPort: socket.localPort,
+	    remoteAddress: socket.remoteAddress,
+	    remotePort: socket.remotePort,
+	    remoteFamily: socket.remoteFamily,
+	    timeout: socket.timeout,
+	    bytesWritten: socket.bytesWritten,
+	    bytesRead: socket.bytesRead
+	  }
+	}
+
+	/** @type {globalThis['ReadableStream']} */
+	function ReadableStreamFrom (iterable) {
+	  // We cannot use ReadableStream.from here because it does not return a byte stream.
+
+	  let iterator;
+	  return new ReadableStream(
+	    {
+	      async start () {
+	        iterator = iterable[Symbol.asyncIterator]();
+	      },
+	      async pull (controller) {
+	        const { done, value } = await iterator.next();
+	        if (done) {
+	          queueMicrotask(() => {
+	            controller.close();
+	            controller.byobRequest?.respond(0);
+	          });
+	        } else {
+	          const buf = Buffer.isBuffer(value) ? value : Buffer.from(value);
+	          if (buf.byteLength) {
+	            controller.enqueue(new Uint8Array(buf));
+	          }
+	        }
+	        return controller.desiredSize > 0
+	      },
+	      async cancel (reason) {
+	        await iterator.return();
+	      },
+	      type: 'bytes'
+	    }
+	  )
+	}
+
+	// The chunk should be a FormData instance and contains
+	// all the required methods.
+	function isFormDataLike (object) {
+	  return (
+	    object &&
+	    typeof object === 'object' &&
+	    typeof object.append === 'function' &&
+	    typeof object.delete === 'function' &&
+	    typeof object.get === 'function' &&
+	    typeof object.getAll === 'function' &&
+	    typeof object.has === 'function' &&
+	    typeof object.set === 'function' &&
+	    object[Symbol.toStringTag] === 'FormData'
+	  )
+	}
+
+	function addAbortListener (signal, listener) {
+	  if ('addEventListener' in signal) {
+	    signal.addEventListener('abort', listener, { once: true });
+	    return () => signal.removeEventListener('abort', listener)
+	  }
+	  signal.addListener('abort', listener);
+	  return () => signal.removeListener('abort', listener)
+	}
+
+	const hasToWellFormed = typeof String.prototype.toWellFormed === 'function';
+	const hasIsWellFormed = typeof String.prototype.isWellFormed === 'function';
+
+	/**
+	 * @param {string} val
+	 */
+	function toUSVString (val) {
+	  return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val)
+	}
+
+	/**
+	 * @param {string} val
+	 */
+	// TODO: move this to webidl
+	function isUSVString (val) {
+	  return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`
+	}
+
+	/**
+	 * @see https://tools.ietf.org/html/rfc7230#section-3.2.6
+	 * @param {number} c
+	 */
+	function isTokenCharCode (c) {
+	  switch (c) {
+	    case 0x22:
+	    case 0x28:
+	    case 0x29:
+	    case 0x2c:
+	    case 0x2f:
+	    case 0x3a:
+	    case 0x3b:
+	    case 0x3c:
+	    case 0x3d:
+	    case 0x3e:
+	    case 0x3f:
+	    case 0x40:
+	    case 0x5b:
+	    case 0x5c:
+	    case 0x5d:
+	    case 0x7b:
+	    case 0x7d:
+	      // DQUOTE and "(),/:;<=>?@[\]{}"
+	      return false
+	    default:
+	      // VCHAR %x21-7E
+	      return c >= 0x21 && c <= 0x7e
+	  }
+	}
+
+	/**
+	 * @param {string} characters
+	 */
+	function isValidHTTPToken (characters) {
+	  if (characters.length === 0) {
+	    return false
+	  }
+	  for (let i = 0; i < characters.length; ++i) {
+	    if (!isTokenCharCode(characters.charCodeAt(i))) {
+	      return false
+	    }
+	  }
+	  return true
+	}
+
+	// headerCharRegex have been lifted from
+	// https://github.com/nodejs/node/blob/main/lib/_http_common.js
+
+	/**
+	 * Matches if val contains an invalid field-vchar
+	 *  field-value    = *( field-content / obs-fold )
+	 *  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
+	 *  field-vchar    = VCHAR / obs-text
+	 */
+	const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
+
+	/**
+	 * @param {string} characters
+	 */
+	function isValidHeaderValue (characters) {
+	  return !headerCharRegex.test(characters)
+	}
+
+	// Parsed accordingly to RFC 9110
+	// https://www.rfc-editor.org/rfc/rfc9110#field.content-range
+	function parseRangeHeader (range) {
+	  if (range == null || range === '') return { start: 0, end: null, size: null }
+
+	  const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null;
+	  return m
+	    ? {
+	        start: parseInt(m[1]),
+	        end: m[2] ? parseInt(m[2]) : null,
+	        size: m[3] ? parseInt(m[3]) : null
+	      }
+	    : null
+	}
+
+	function addListener (obj, name, listener) {
+	  const listeners = (obj[kListeners] ??= []);
+	  listeners.push([name, listener]);
+	  obj.on(name, listener);
+	  return obj
+	}
+
+	function removeAllListeners (obj) {
+	  for (const [name, listener] of obj[kListeners] ?? []) {
+	    obj.removeListener(name, listener);
+	  }
+	  obj[kListeners] = null;
+	}
+
+	function errorRequest (client, request, err) {
+	  try {
+	    request.onError(err);
+	    assert(request.aborted);
+	  } catch (err) {
+	    client.emit('error', err);
+	  }
+	}
+
+	const kEnumerableProperty = Object.create(null);
+	kEnumerableProperty.enumerable = true;
+
+	const normalizedMethodRecordsBase = {
+	  delete: 'DELETE',
+	  DELETE: 'DELETE',
+	  get: 'GET',
+	  GET: 'GET',
+	  head: 'HEAD',
+	  HEAD: 'HEAD',
+	  options: 'OPTIONS',
+	  OPTIONS: 'OPTIONS',
+	  post: 'POST',
+	  POST: 'POST',
+	  put: 'PUT',
+	  PUT: 'PUT'
+	};
+
+	const normalizedMethodRecords = {
+	  ...normalizedMethodRecordsBase,
+	  patch: 'patch',
+	  PATCH: 'PATCH'
+	};
+
+	// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
+	Object.setPrototypeOf(normalizedMethodRecordsBase, null);
+	Object.setPrototypeOf(normalizedMethodRecords, null);
+
+	util$7 = {
+	  kEnumerableProperty,
+	  nop,
+	  isDisturbed,
+	  isErrored,
+	  isReadable,
+	  toUSVString,
+	  isUSVString,
+	  isBlobLike,
+	  parseOrigin,
+	  parseURL,
+	  getServerName,
+	  isStream,
+	  isIterable,
+	  isAsyncIterable,
+	  isDestroyed,
+	  headerNameToString,
+	  bufferToLowerCasedHeaderName,
+	  addListener,
+	  removeAllListeners,
+	  errorRequest,
+	  parseRawHeaders,
+	  parseHeaders,
+	  parseKeepAliveTimeout,
+	  destroy,
+	  bodyLength,
+	  deepClone,
+	  ReadableStreamFrom,
+	  isBuffer,
+	  validateHandler,
+	  getSocketInfo,
+	  isFormDataLike,
+	  buildURL,
+	  addAbortListener,
+	  isValidHTTPToken,
+	  isValidHeaderValue,
+	  isTokenCharCode,
+	  parseRangeHeader,
+	  normalizedMethodRecordsBase,
+	  normalizedMethodRecords,
+	  isValidPort,
+	  isHttpOrHttpsPrefixed,
+	  nodeMajor,
+	  nodeMinor,
+	  safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'],
+	  wrapRequestBody
+	};
+	return util$7;
+}
+
+var diagnostics;
+var hasRequiredDiagnostics;
+
+function requireDiagnostics () {
+	if (hasRequiredDiagnostics) return diagnostics;
+	hasRequiredDiagnostics = 1;
+	const diagnosticsChannel = require$$0$b;
+	const util = require$$0$a;
+
+	const undiciDebugLog = util.debuglog('undici');
+	const fetchDebuglog = util.debuglog('fetch');
+	const websocketDebuglog = util.debuglog('websocket');
+	let isClientSet = false;
+	const channels = {
+	  // Client
+	  beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'),
+	  connected: diagnosticsChannel.channel('undici:client:connected'),
+	  connectError: diagnosticsChannel.channel('undici:client:connectError'),
+	  sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'),
+	  // Request
+	  create: diagnosticsChannel.channel('undici:request:create'),
+	  bodySent: diagnosticsChannel.channel('undici:request:bodySent'),
+	  headers: diagnosticsChannel.channel('undici:request:headers'),
+	  trailers: diagnosticsChannel.channel('undici:request:trailers'),
+	  error: diagnosticsChannel.channel('undici:request:error'),
+	  // WebSocket
+	  open: diagnosticsChannel.channel('undici:websocket:open'),
+	  close: diagnosticsChannel.channel('undici:websocket:close'),
+	  socketError: diagnosticsChannel.channel('undici:websocket:socket_error'),
+	  ping: diagnosticsChannel.channel('undici:websocket:ping'),
+	  pong: diagnosticsChannel.channel('undici:websocket:pong')
+	};
+
+	if (undiciDebugLog.enabled || fetchDebuglog.enabled) {
+	  const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog;
+
+	  // Track all Client events
+	  diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => {
+	    const {
+	      connectParams: { version, protocol, port, host }
+	    } = evt;
+	    debuglog(
+	      'connecting to %s using %s%s',
+	      `${host}${port ? `:${port}` : ''}`,
+	      protocol,
+	      version
+	    );
+	  });
+
+	  diagnosticsChannel.channel('undici:client:connected').subscribe(evt => {
+	    const {
+	      connectParams: { version, protocol, port, host }
+	    } = evt;
+	    debuglog(
+	      'connected to %s using %s%s',
+	      `${host}${port ? `:${port}` : ''}`,
+	      protocol,
+	      version
+	    );
+	  });
+
+	  diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => {
+	    const {
+	      connectParams: { version, protocol, port, host },
+	      error
+	    } = evt;
+	    debuglog(
+	      'connection to %s using %s%s errored - %s',
+	      `${host}${port ? `:${port}` : ''}`,
+	      protocol,
+	      version,
+	      error.message
+	    );
+	  });
+
+	  diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => {
+	    const {
+	      request: { method, path, origin }
+	    } = evt;
+	    debuglog('sending request to %s %s/%s', method, origin, path);
+	  });
+
+	  // Track Request events
+	  diagnosticsChannel.channel('undici:request:headers').subscribe(evt => {
+	    const {
+	      request: { method, path, origin },
+	      response: { statusCode }
+	    } = evt;
+	    debuglog(
+	      'received response to %s %s/%s - HTTP %d',
+	      method,
+	      origin,
+	      path,
+	      statusCode
+	    );
+	  });
+
+	  diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => {
+	    const {
+	      request: { method, path, origin }
+	    } = evt;
+	    debuglog('trailers received from %s %s/%s', method, origin, path);
+	  });
+
+	  diagnosticsChannel.channel('undici:request:error').subscribe(evt => {
+	    const {
+	      request: { method, path, origin },
+	      error
+	    } = evt;
+	    debuglog(
+	      'request to %s %s/%s errored - %s',
+	      method,
+	      origin,
+	      path,
+	      error.message
+	    );
+	  });
+
+	  isClientSet = true;
+	}
+
+	if (websocketDebuglog.enabled) {
+	  if (!isClientSet) {
+	    const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog;
+	    diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => {
+	      const {
+	        connectParams: { version, protocol, port, host }
+	      } = evt;
+	      debuglog(
+	        'connecting to %s%s using %s%s',
+	        host,
+	        port ? `:${port}` : '',
+	        protocol,
+	        version
+	      );
+	    });
+
+	    diagnosticsChannel.channel('undici:client:connected').subscribe(evt => {
+	      const {
+	        connectParams: { version, protocol, port, host }
+	      } = evt;
+	      debuglog(
+	        'connected to %s%s using %s%s',
+	        host,
+	        port ? `:${port}` : '',
+	        protocol,
+	        version
+	      );
+	    });
+
+	    diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => {
+	      const {
+	        connectParams: { version, protocol, port, host },
+	        error
+	      } = evt;
+	      debuglog(
+	        'connection to %s%s using %s%s errored - %s',
+	        host,
+	        port ? `:${port}` : '',
+	        protocol,
+	        version,
+	        error.message
+	      );
+	    });
+
+	    diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => {
+	      const {
+	        request: { method, path, origin }
+	      } = evt;
+	      debuglog('sending request to %s %s/%s', method, origin, path);
+	    });
+	  }
+
+	  // Track all WebSocket events
+	  diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => {
+	    const {
+	      address: { address, port }
+	    } = evt;
+	    websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : '');
+	  });
+
+	  diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => {
+	    const { websocket, code, reason } = evt;
+	    websocketDebuglog(
+	      'closed connection to %s - %s %s',
+	      websocket.url,
+	      code,
+	      reason
+	    );
+	  });
+
+	  diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => {
+	    websocketDebuglog('connection errored - %s', err.message);
+	  });
+
+	  diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => {
+	    websocketDebuglog('ping received');
+	  });
+
+	  diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => {
+	    websocketDebuglog('pong received');
+	  });
+	}
+
+	diagnostics = {
+	  channels
+	};
+	return diagnostics;
+}
+
+var request$2;
+var hasRequiredRequest$1;
+
+function requireRequest$1 () {
+	if (hasRequiredRequest$1) return request$2;
+	hasRequiredRequest$1 = 1;
+
+	const {
+	  InvalidArgumentError,
+	  NotSupportedError
+	} = requireErrors();
+	const assert = require$$0$7;
+	const {
+	  isValidHTTPToken,
+	  isValidHeaderValue,
+	  isStream,
+	  destroy,
+	  isBuffer,
+	  isFormDataLike,
+	  isIterable,
+	  isBlobLike,
+	  buildURL,
+	  validateHandler,
+	  getServerName,
+	  normalizedMethodRecords
+	} = requireUtil$7();
+	const { channels } = requireDiagnostics();
+	const { headerNameLowerCasedRecord } = requireConstants$5();
+
+	// Verifies that a given path is valid does not contain control chars \x00 to \x20
+	const invalidPathRegex = /[^\u0021-\u00ff]/;
+
+	const kHandler = Symbol('handler');
+
+	class Request {
+	  constructor (origin, {
+	    path,
+	    method,
+	    body,
+	    headers,
+	    query,
+	    idempotent,
+	    blocking,
+	    upgrade,
+	    headersTimeout,
+	    bodyTimeout,
+	    reset,
+	    throwOnError,
+	    expectContinue,
+	    servername
+	  }, handler) {
+	    if (typeof path !== 'string') {
+	      throw new InvalidArgumentError('path must be a string')
+	    } else if (
+	      path[0] !== '/' &&
+	      !(path.startsWith('http://') || path.startsWith('https://')) &&
+	      method !== 'CONNECT'
+	    ) {
+	      throw new InvalidArgumentError('path must be an absolute URL or start with a slash')
+	    } else if (invalidPathRegex.test(path)) {
+	      throw new InvalidArgumentError('invalid request path')
+	    }
+
+	    if (typeof method !== 'string') {
+	      throw new InvalidArgumentError('method must be a string')
+	    } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) {
+	      throw new InvalidArgumentError('invalid request method')
+	    }
+
+	    if (upgrade && typeof upgrade !== 'string') {
+	      throw new InvalidArgumentError('upgrade must be a string')
+	    }
+
+	    if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
+	      throw new InvalidArgumentError('invalid headersTimeout')
+	    }
+
+	    if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {
+	      throw new InvalidArgumentError('invalid bodyTimeout')
+	    }
+
+	    if (reset != null && typeof reset !== 'boolean') {
+	      throw new InvalidArgumentError('invalid reset')
+	    }
+
+	    if (expectContinue != null && typeof expectContinue !== 'boolean') {
+	      throw new InvalidArgumentError('invalid expectContinue')
+	    }
+
+	    this.headersTimeout = headersTimeout;
+
+	    this.bodyTimeout = bodyTimeout;
+
+	    this.throwOnError = throwOnError === true;
+
+	    this.method = method;
+
+	    this.abort = null;
+
+	    if (body == null) {
+	      this.body = null;
+	    } else if (isStream(body)) {
+	      this.body = body;
+
+	      const rState = this.body._readableState;
+	      if (!rState || !rState.autoDestroy) {
+	        this.endHandler = function autoDestroy () {
+	          destroy(this);
+	        };
+	        this.body.on('end', this.endHandler);
+	      }
+
+	      this.errorHandler = err => {
+	        if (this.abort) {
+	          this.abort(err);
+	        } else {
+	          this.error = err;
+	        }
+	      };
+	      this.body.on('error', this.errorHandler);
+	    } else if (isBuffer(body)) {
+	      this.body = body.byteLength ? body : null;
+	    } else if (ArrayBuffer.isView(body)) {
+	      this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null;
+	    } else if (body instanceof ArrayBuffer) {
+	      this.body = body.byteLength ? Buffer.from(body) : null;
+	    } else if (typeof body === 'string') {
+	      this.body = body.length ? Buffer.from(body) : null;
+	    } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) {
+	      this.body = body;
+	    } else {
+	      throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')
+	    }
+
+	    this.completed = false;
+
+	    this.aborted = false;
+
+	    this.upgrade = upgrade || null;
+
+	    this.path = query ? buildURL(path, query) : path;
+
+	    this.origin = origin;
+
+	    this.idempotent = idempotent == null
+	      ? method === 'HEAD' || method === 'GET'
+	      : idempotent;
+
+	    this.blocking = blocking == null ? false : blocking;
+
+	    this.reset = reset == null ? null : reset;
+
+	    this.host = null;
+
+	    this.contentLength = null;
+
+	    this.contentType = null;
+
+	    this.headers = [];
+
+	    // Only for H2
+	    this.expectContinue = expectContinue != null ? expectContinue : false;
+
+	    if (Array.isArray(headers)) {
+	      if (headers.length % 2 !== 0) {
+	        throw new InvalidArgumentError('headers array must be even')
+	      }
+	      for (let i = 0; i < headers.length; i += 2) {
+	        processHeader(this, headers[i], headers[i + 1]);
+	      }
+	    } else if (headers && typeof headers === 'object') {
+	      if (headers[Symbol.iterator]) {
+	        for (const header of headers) {
+	          if (!Array.isArray(header) || header.length !== 2) {
+	            throw new InvalidArgumentError('headers must be in key-value pair format')
+	          }
+	          processHeader(this, header[0], header[1]);
+	        }
+	      } else {
+	        const keys = Object.keys(headers);
+	        for (let i = 0; i < keys.length; ++i) {
+	          processHeader(this, keys[i], headers[keys[i]]);
+	        }
+	      }
+	    } else if (headers != null) {
+	      throw new InvalidArgumentError('headers must be an object or an array')
+	    }
+
+	    validateHandler(handler, method, upgrade);
+
+	    this.servername = servername || getServerName(this.host);
+
+	    this[kHandler] = handler;
+
+	    if (channels.create.hasSubscribers) {
+	      channels.create.publish({ request: this });
+	    }
+	  }
+
+	  onBodySent (chunk) {
+	    if (this[kHandler].onBodySent) {
+	      try {
+	        return this[kHandler].onBodySent(chunk)
+	      } catch (err) {
+	        this.abort(err);
+	      }
+	    }
+	  }
+
+	  onRequestSent () {
+	    if (channels.bodySent.hasSubscribers) {
+	      channels.bodySent.publish({ request: this });
+	    }
+
+	    if (this[kHandler].onRequestSent) {
+	      try {
+	        return this[kHandler].onRequestSent()
+	      } catch (err) {
+	        this.abort(err);
+	      }
+	    }
+	  }
+
+	  onConnect (abort) {
+	    assert(!this.aborted);
+	    assert(!this.completed);
+
+	    if (this.error) {
+	      abort(this.error);
+	    } else {
+	      this.abort = abort;
+	      return this[kHandler].onConnect(abort)
+	    }
+	  }
+
+	  onResponseStarted () {
+	    return this[kHandler].onResponseStarted?.()
+	  }
+
+	  onHeaders (statusCode, headers, resume, statusText) {
+	    assert(!this.aborted);
+	    assert(!this.completed);
+
+	    if (channels.headers.hasSubscribers) {
+	      channels.headers.publish({ request: this, response: { statusCode, headers, statusText } });
+	    }
+
+	    try {
+	      return this[kHandler].onHeaders(statusCode, headers, resume, statusText)
+	    } catch (err) {
+	      this.abort(err);
+	    }
+	  }
+
+	  onData (chunk) {
+	    assert(!this.aborted);
+	    assert(!this.completed);
+
+	    try {
+	      return this[kHandler].onData(chunk)
+	    } catch (err) {
+	      this.abort(err);
+	      return false
+	    }
+	  }
+
+	  onUpgrade (statusCode, headers, socket) {
+	    assert(!this.aborted);
+	    assert(!this.completed);
+
+	    return this[kHandler].onUpgrade(statusCode, headers, socket)
+	  }
+
+	  onComplete (trailers) {
+	    this.onFinally();
+
+	    assert(!this.aborted);
+
+	    this.completed = true;
+	    if (channels.trailers.hasSubscribers) {
+	      channels.trailers.publish({ request: this, trailers });
+	    }
+
+	    try {
+	      return this[kHandler].onComplete(trailers)
+	    } catch (err) {
+	      // TODO (fix): This might be a bad idea?
+	      this.onError(err);
+	    }
+	  }
+
+	  onError (error) {
+	    this.onFinally();
+
+	    if (channels.error.hasSubscribers) {
+	      channels.error.publish({ request: this, error });
+	    }
+
+	    if (this.aborted) {
+	      return
+	    }
+	    this.aborted = true;
+
+	    return this[kHandler].onError(error)
+	  }
+
+	  onFinally () {
+	    if (this.errorHandler) {
+	      this.body.off('error', this.errorHandler);
+	      this.errorHandler = null;
+	    }
+
+	    if (this.endHandler) {
+	      this.body.off('end', this.endHandler);
+	      this.endHandler = null;
+	    }
+	  }
+
+	  addHeader (key, value) {
+	    processHeader(this, key, value);
+	    return this
+	  }
+	}
+
+	function processHeader (request, key, val) {
+	  if (val && (typeof val === 'object' && !Array.isArray(val))) {
+	    throw new InvalidArgumentError(`invalid ${key} header`)
+	  } else if (val === undefined) {
+	    return
+	  }
+
+	  let headerName = headerNameLowerCasedRecord[key];
+
+	  if (headerName === undefined) {
+	    headerName = key.toLowerCase();
+	    if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) {
+	      throw new InvalidArgumentError('invalid header key')
+	    }
+	  }
+
+	  if (Array.isArray(val)) {
+	    const arr = [];
+	    for (let i = 0; i < val.length; i++) {
+	      if (typeof val[i] === 'string') {
+	        if (!isValidHeaderValue(val[i])) {
+	          throw new InvalidArgumentError(`invalid ${key} header`)
+	        }
+	        arr.push(val[i]);
+	      } else if (val[i] === null) {
+	        arr.push('');
+	      } else if (typeof val[i] === 'object') {
+	        throw new InvalidArgumentError(`invalid ${key} header`)
+	      } else {
+	        arr.push(`${val[i]}`);
+	      }
+	    }
+	    val = arr;
+	  } else if (typeof val === 'string') {
+	    if (!isValidHeaderValue(val)) {
+	      throw new InvalidArgumentError(`invalid ${key} header`)
+	    }
+	  } else if (val === null) {
+	    val = '';
+	  } else {
+	    val = `${val}`;
+	  }
+
+	  if (request.host === null && headerName === 'host') {
+	    if (typeof val !== 'string') {
+	      throw new InvalidArgumentError('invalid host header')
+	    }
+	    // Consumed by Client
+	    request.host = val;
+	  } else if (request.contentLength === null && headerName === 'content-length') {
+	    request.contentLength = parseInt(val, 10);
+	    if (!Number.isFinite(request.contentLength)) {
+	      throw new InvalidArgumentError('invalid content-length header')
+	    }
+	  } else if (request.contentType === null && headerName === 'content-type') {
+	    request.contentType = val;
+	    request.headers.push(key, val);
+	  } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') {
+	    throw new InvalidArgumentError(`invalid ${headerName} header`)
+	  } else if (headerName === 'connection') {
+	    const value = typeof val === 'string' ? val.toLowerCase() : null;
+	    if (value !== 'close' && value !== 'keep-alive') {
+	      throw new InvalidArgumentError('invalid connection header')
+	    }
+
+	    if (value === 'close') {
+	      request.reset = true;
+	    }
+	  } else if (headerName === 'expect') {
+	    throw new NotSupportedError('expect header not supported')
+	  } else {
+	    request.headers.push(key, val);
+	  }
+	}
+
+	request$2 = Request;
+	return request$2;
+}
+
+var dispatcher;
+var hasRequiredDispatcher;
+
+function requireDispatcher () {
+	if (hasRequiredDispatcher) return dispatcher;
+	hasRequiredDispatcher = 1;
+	const EventEmitter = require$$8;
+
+	class Dispatcher extends EventEmitter {
+	  dispatch () {
+	    throw new Error('not implemented')
+	  }
+
+	  close () {
+	    throw new Error('not implemented')
+	  }
+
+	  destroy () {
+	    throw new Error('not implemented')
+	  }
+
+	  compose (...args) {
+	    // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...
+	    const interceptors = Array.isArray(args[0]) ? args[0] : args;
+	    let dispatch = this.dispatch.bind(this);
+
+	    for (const interceptor of interceptors) {
+	      if (interceptor == null) {
+	        continue
+	      }
+
+	      if (typeof interceptor !== 'function') {
+	        throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)
+	      }
+
+	      dispatch = interceptor(dispatch);
+
+	      if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {
+	        throw new TypeError('invalid interceptor')
+	      }
+	    }
+
+	    return new ComposedDispatcher(this, dispatch)
+	  }
+	}
+
+	class ComposedDispatcher extends Dispatcher {
+	  #dispatcher = null
+	  #dispatch = null
+
+	  constructor (dispatcher, dispatch) {
+	    super();
+	    this.#dispatcher = dispatcher;
+	    this.#dispatch = dispatch;
+	  }
+
+	  dispatch (...args) {
+	    this.#dispatch(...args);
+	  }
+
+	  close (...args) {
+	    return this.#dispatcher.close(...args)
+	  }
+
+	  destroy (...args) {
+	    return this.#dispatcher.destroy(...args)
+	  }
+	}
+
+	dispatcher = Dispatcher;
+	return dispatcher;
+}
+
+var dispatcherBase;
+var hasRequiredDispatcherBase;
+
+function requireDispatcherBase () {
+	if (hasRequiredDispatcherBase) return dispatcherBase;
+	hasRequiredDispatcherBase = 1;
+
+	const Dispatcher = requireDispatcher();
+	const {
+	  ClientDestroyedError,
+	  ClientClosedError,
+	  InvalidArgumentError
+	} = requireErrors();
+	const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = requireSymbols$4();
+
+	const kOnDestroyed = Symbol('onDestroyed');
+	const kOnClosed = Symbol('onClosed');
+	const kInterceptedDispatch = Symbol('Intercepted Dispatch');
+
+	class DispatcherBase extends Dispatcher {
+	  constructor () {
+	    super();
+
+	    this[kDestroyed] = false;
+	    this[kOnDestroyed] = null;
+	    this[kClosed] = false;
+	    this[kOnClosed] = [];
+	  }
+
+	  get destroyed () {
+	    return this[kDestroyed]
+	  }
+
+	  get closed () {
+	    return this[kClosed]
+	  }
+
+	  get interceptors () {
+	    return this[kInterceptors]
+	  }
+
+	  set interceptors (newInterceptors) {
+	    if (newInterceptors) {
+	      for (let i = newInterceptors.length - 1; i >= 0; i--) {
+	        const interceptor = this[kInterceptors][i];
+	        if (typeof interceptor !== 'function') {
+	          throw new InvalidArgumentError('interceptor must be an function')
+	        }
+	      }
+	    }
+
+	    this[kInterceptors] = newInterceptors;
+	  }
+
+	  close (callback) {
+	    if (callback === undefined) {
+	      return new Promise((resolve, reject) => {
+	        this.close((err, data) => {
+	          return err ? reject(err) : resolve(data)
+	        });
+	      })
+	    }
+
+	    if (typeof callback !== 'function') {
+	      throw new InvalidArgumentError('invalid callback')
+	    }
+
+	    if (this[kDestroyed]) {
+	      queueMicrotask(() => callback(new ClientDestroyedError(), null));
+	      return
+	    }
+
+	    if (this[kClosed]) {
+	      if (this[kOnClosed]) {
+	        this[kOnClosed].push(callback);
+	      } else {
+	        queueMicrotask(() => callback(null, null));
+	      }
+	      return
+	    }
+
+	    this[kClosed] = true;
+	    this[kOnClosed].push(callback);
+
+	    const onClosed = () => {
+	      const callbacks = this[kOnClosed];
+	      this[kOnClosed] = null;
+	      for (let i = 0; i < callbacks.length; i++) {
+	        callbacks[i](null, null);
+	      }
+	    };
+
+	    // Should not error.
+	    this[kClose]()
+	      .then(() => this.destroy())
+	      .then(() => {
+	        queueMicrotask(onClosed);
+	      });
+	  }
+
+	  destroy (err, callback) {
+	    if (typeof err === 'function') {
+	      callback = err;
+	      err = null;
+	    }
+
+	    if (callback === undefined) {
+	      return new Promise((resolve, reject) => {
+	        this.destroy(err, (err, data) => {
+	          return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data)
+	        });
+	      })
+	    }
+
+	    if (typeof callback !== 'function') {
+	      throw new InvalidArgumentError('invalid callback')
+	    }
+
+	    if (this[kDestroyed]) {
+	      if (this[kOnDestroyed]) {
+	        this[kOnDestroyed].push(callback);
+	      } else {
+	        queueMicrotask(() => callback(null, null));
+	      }
+	      return
+	    }
+
+	    if (!err) {
+	      err = new ClientDestroyedError();
+	    }
+
+	    this[kDestroyed] = true;
+	    this[kOnDestroyed] = this[kOnDestroyed] || [];
+	    this[kOnDestroyed].push(callback);
+
+	    const onDestroyed = () => {
+	      const callbacks = this[kOnDestroyed];
+	      this[kOnDestroyed] = null;
+	      for (let i = 0; i < callbacks.length; i++) {
+	        callbacks[i](null, null);
+	      }
+	    };
+
+	    // Should not error.
+	    this[kDestroy](err).then(() => {
+	      queueMicrotask(onDestroyed);
+	    });
+	  }
+
+	  [kInterceptedDispatch] (opts, handler) {
+	    if (!this[kInterceptors] || this[kInterceptors].length === 0) {
+	      this[kInterceptedDispatch] = this[kDispatch];
+	      return this[kDispatch](opts, handler)
+	    }
+
+	    let dispatch = this[kDispatch].bind(this);
+	    for (let i = this[kInterceptors].length - 1; i >= 0; i--) {
+	      dispatch = this[kInterceptors][i](dispatch);
+	    }
+	    this[kInterceptedDispatch] = dispatch;
+	    return dispatch(opts, handler)
+	  }
+
+	  dispatch (opts, handler) {
+	    if (!handler || typeof handler !== 'object') {
+	      throw new InvalidArgumentError('handler must be an object')
+	    }
+
+	    try {
+	      if (!opts || typeof opts !== 'object') {
+	        throw new InvalidArgumentError('opts must be an object.')
+	      }
+
+	      if (this[kDestroyed] || this[kOnDestroyed]) {
+	        throw new ClientDestroyedError()
+	      }
+
+	      if (this[kClosed]) {
+	        throw new ClientClosedError()
+	      }
+
+	      return this[kInterceptedDispatch](opts, handler)
+	    } catch (err) {
+	      if (typeof handler.onError !== 'function') {
+	        throw new InvalidArgumentError('invalid onError method')
+	      }
+
+	      handler.onError(err);
+
+	      return false
+	    }
+	  }
+	}
+
+	dispatcherBase = DispatcherBase;
+	return dispatcherBase;
+}
+
+var timers;
+var hasRequiredTimers;
+
+function requireTimers () {
+	if (hasRequiredTimers) return timers;
+	hasRequiredTimers = 1;
+
+	/**
+	 * This module offers an optimized timer implementation designed for scenarios
+	 * where high precision is not critical.
+	 *
+	 * The timer achieves faster performance by using a low-resolution approach,
+	 * with an accuracy target of within 500ms. This makes it particularly useful
+	 * for timers with delays of 1 second or more, where exact timing is less
+	 * crucial.
+	 *
+	 * It's important to note that Node.js timers are inherently imprecise, as
+	 * delays can occur due to the event loop being blocked by other operations.
+	 * Consequently, timers may trigger later than their scheduled time.
+	 */
+
+	/**
+	 * The fastNow variable contains the internal fast timer clock value.
+	 *
+	 * @type {number}
+	 */
+	let fastNow = 0;
+
+	/**
+	 * RESOLUTION_MS represents the target resolution time in milliseconds.
+	 *
+	 * @type {number}
+	 * @default 1000
+	 */
+	const RESOLUTION_MS = 1e3;
+
+	/**
+	 * TICK_MS defines the desired interval in milliseconds between each tick.
+	 * The target value is set to half the resolution time, minus 1 ms, to account
+	 * for potential event loop overhead.
+	 *
+	 * @type {number}
+	 * @default 499
+	 */
+	const TICK_MS = (RESOLUTION_MS >> 1) - 1;
+
+	/**
+	 * fastNowTimeout is a Node.js timer used to manage and process
+	 * the FastTimers stored in the `fastTimers` array.
+	 *
+	 * @type {NodeJS.Timeout}
+	 */
+	let fastNowTimeout;
+
+	/**
+	 * The kFastTimer symbol is used to identify FastTimer instances.
+	 *
+	 * @type {Symbol}
+	 */
+	const kFastTimer = Symbol('kFastTimer');
+
+	/**
+	 * The fastTimers array contains all active FastTimers.
+	 *
+	 * @type {FastTimer[]}
+	 */
+	const fastTimers = [];
+
+	/**
+	 * These constants represent the various states of a FastTimer.
+	 */
+
+	/**
+	 * The `NOT_IN_LIST` constant indicates that the FastTimer is not included
+	 * in the `fastTimers` array. Timers with this status will not be processed
+	 * during the next tick by the `onTick` function.
+	 *
+	 * A FastTimer can be re-added to the `fastTimers` array by invoking the
+	 * `refresh` method on the FastTimer instance.
+	 *
+	 * @type {-2}
+	 */
+	const NOT_IN_LIST = -2;
+
+	/**
+	 * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled
+	 * for removal from the `fastTimers` array. A FastTimer in this state will
+	 * be removed in the next tick by the `onTick` function and will no longer
+	 * be processed.
+	 *
+	 * This status is also set when the `clear` method is called on the FastTimer instance.
+	 *
+	 * @type {-1}
+	 */
+	const TO_BE_CLEARED = -1;
+
+	/**
+	 * The `PENDING` constant signifies that the FastTimer is awaiting processing
+	 * in the next tick by the `onTick` function. Timers with this status will have
+	 * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick.
+	 *
+	 * @type {0}
+	 */
+	const PENDING = 0;
+
+	/**
+	 * The `ACTIVE` constant indicates that the FastTimer is active and waiting
+	 * for its timer to expire. During the next tick, the `onTick` function will
+	 * check if the timer has expired, and if so, it will execute the associated callback.
+	 *
+	 * @type {1}
+	 */
+	const ACTIVE = 1;
+
+	/**
+	 * The onTick function processes the fastTimers array.
+	 *
+	 * @returns {void}
+	 */
+	function onTick () {
+	  /**
+	   * Increment the fastNow value by the TICK_MS value, despite the actual time
+	   * that has passed since the last tick. This approach ensures independence
+	   * from the system clock and delays caused by a blocked event loop.
+	   *
+	   * @type {number}
+	   */
+	  fastNow += TICK_MS;
+
+	  /**
+	   * The `idx` variable is used to iterate over the `fastTimers` array.
+	   * Expired timers are removed by replacing them with the last element in the array.
+	   * Consequently, `idx` is only incremented when the current element is not removed.
+	   *
+	   * @type {number}
+	   */
+	  let idx = 0;
+
+	  /**
+	   * The len variable will contain the length of the fastTimers array
+	   * and will be decremented when a FastTimer should be removed from the
+	   * fastTimers array.
+	   *
+	   * @type {number}
+	   */
+	  let len = fastTimers.length;
+
+	  while (idx < len) {
+	    /**
+	     * @type {FastTimer}
+	     */
+	    const timer = fastTimers[idx];
+
+	    // If the timer is in the ACTIVE state and the timer has expired, it will
+	    // be processed in the next tick.
+	    if (timer._state === PENDING) {
+	      // Set the _idleStart value to the fastNow value minus the TICK_MS value
+	      // to account for the time the timer was in the PENDING state.
+	      timer._idleStart = fastNow - TICK_MS;
+	      timer._state = ACTIVE;
+	    } else if (
+	      timer._state === ACTIVE &&
+	      fastNow >= timer._idleStart + timer._idleTimeout
+	    ) {
+	      timer._state = TO_BE_CLEARED;
+	      timer._idleStart = -1;
+	      timer._onTimeout(timer._timerArg);
+	    }
+
+	    if (timer._state === TO_BE_CLEARED) {
+	      timer._state = NOT_IN_LIST;
+
+	      // Move the last element to the current index and decrement len if it is
+	      // not the only element in the array.
+	      if (--len !== 0) {
+	        fastTimers[idx] = fastTimers[len];
+	      }
+	    } else {
+	      ++idx;
+	    }
+	  }
+
+	  // Set the length of the fastTimers array to the new length and thus
+	  // removing the excess FastTimers elements from the array.
+	  fastTimers.length = len;
+
+	  // If there are still active FastTimers in the array, refresh the Timer.
+	  // If there are no active FastTimers, the timer will be refreshed again
+	  // when a new FastTimer is instantiated.
+	  if (fastTimers.length !== 0) {
+	    refreshTimeout();
+	  }
+	}
+
+	function refreshTimeout () {
+	  // If the fastNowTimeout is already set, refresh it.
+	  if (fastNowTimeout) {
+	    fastNowTimeout.refresh();
+	  // fastNowTimeout is not instantiated yet, create a new Timer.
+	  } else {
+	    clearTimeout(fastNowTimeout);
+	    fastNowTimeout = setTimeout(onTick, TICK_MS);
+
+	    // If the Timer has an unref method, call it to allow the process to exit if
+	    // there are no other active handles.
+	    if (fastNowTimeout.unref) {
+	      fastNowTimeout.unref();
+	    }
+	  }
+	}
+
+	/**
+	 * The `FastTimer` class is a data structure designed to store and manage
+	 * timer information.
+	 */
+	class FastTimer {
+	  [kFastTimer] = true
+
+	  /**
+	   * The state of the timer, which can be one of the following:
+	   * - NOT_IN_LIST (-2)
+	   * - TO_BE_CLEARED (-1)
+	   * - PENDING (0)
+	   * - ACTIVE (1)
+	   *
+	   * @type {-2|-1|0|1}
+	   * @private
+	   */
+	  _state = NOT_IN_LIST
+
+	  /**
+	   * The number of milliseconds to wait before calling the callback.
+	   *
+	   * @type {number}
+	   * @private
+	   */
+	  _idleTimeout = -1
+
+	  /**
+	   * The time in milliseconds when the timer was started. This value is used to
+	   * calculate when the timer should expire.
+	   *
+	   * @type {number}
+	   * @default -1
+	   * @private
+	   */
+	  _idleStart = -1
+
+	  /**
+	   * The function to be executed when the timer expires.
+	   * @type {Function}
+	   * @private
+	   */
+	  _onTimeout
+
+	  /**
+	   * The argument to be passed to the callback when the timer expires.
+	   *
+	   * @type {*}
+	   * @private
+	   */
+	  _timerArg
+
+	  /**
+	   * @constructor
+	   * @param {Function} callback A function to be executed after the timer
+	   * expires.
+	   * @param {number} delay The time, in milliseconds that the timer should wait
+	   * before the specified function or code is executed.
+	   * @param {*} arg
+	   */
+	  constructor (callback, delay, arg) {
+	    this._onTimeout = callback;
+	    this._idleTimeout = delay;
+	    this._timerArg = arg;
+
+	    this.refresh();
+	  }
+
+	  /**
+	   * Sets the timer's start time to the current time, and reschedules the timer
+	   * to call its callback at the previously specified duration adjusted to the
+	   * current time.
+	   * Using this on a timer that has already called its callback will reactivate
+	   * the timer.
+	   *
+	   * @returns {void}
+	   */
+	  refresh () {
+	    // In the special case that the timer is not in the list of active timers,
+	    // add it back to the array to be processed in the next tick by the onTick
+	    // function.
+	    if (this._state === NOT_IN_LIST) {
+	      fastTimers.push(this);
+	    }
+
+	    // If the timer is the only active timer, refresh the fastNowTimeout for
+	    // better resolution.
+	    if (!fastNowTimeout || fastTimers.length === 1) {
+	      refreshTimeout();
+	    }
+
+	    // Setting the state to PENDING will cause the timer to be reset in the
+	    // next tick by the onTick function.
+	    this._state = PENDING;
+	  }
+
+	  /**
+	   * The `clear` method cancels the timer, preventing it from executing.
+	   *
+	   * @returns {void}
+	   * @private
+	   */
+	  clear () {
+	    // Set the state to TO_BE_CLEARED to mark the timer for removal in the next
+	    // tick by the onTick function.
+	    this._state = TO_BE_CLEARED;
+
+	    // Reset the _idleStart value to -1 to indicate that the timer is no longer
+	    // active.
+	    this._idleStart = -1;
+	  }
+	}
+
+	/**
+	 * This module exports a setTimeout and clearTimeout function that can be
+	 * used as a drop-in replacement for the native functions.
+	 */
+	timers = {
+	  /**
+	   * The setTimeout() method sets a timer which executes a function once the
+	   * timer expires.
+	   * @param {Function} callback A function to be executed after the timer
+	   * expires.
+	   * @param {number} delay The time, in milliseconds that the timer should
+	   * wait before the specified function or code is executed.
+	   * @param {*} [arg] An optional argument to be passed to the callback function
+	   * when the timer expires.
+	   * @returns {NodeJS.Timeout|FastTimer}
+	   */
+	  setTimeout (callback, delay, arg) {
+	    // If the delay is less than or equal to the RESOLUTION_MS value return a
+	    // native Node.js Timer instance.
+	    return delay <= RESOLUTION_MS
+	      ? setTimeout(callback, delay, arg)
+	      : new FastTimer(callback, delay, arg)
+	  },
+	  /**
+	   * The clearTimeout method cancels an instantiated Timer previously created
+	   * by calling setTimeout.
+	   *
+	   * @param {NodeJS.Timeout|FastTimer} timeout
+	   */
+	  clearTimeout (timeout) {
+	    // If the timeout is a FastTimer, call its own clear method.
+	    if (timeout[kFastTimer]) {
+	      /**
+	       * @type {FastTimer}
+	       */
+	      timeout.clear();
+	      // Otherwise it is an instance of a native NodeJS.Timeout, so call the
+	      // Node.js native clearTimeout function.
+	    } else {
+	      clearTimeout(timeout);
+	    }
+	  },
+	  /**
+	   * The setFastTimeout() method sets a fastTimer which executes a function once
+	   * the timer expires.
+	   * @param {Function} callback A function to be executed after the timer
+	   * expires.
+	   * @param {number} delay The time, in milliseconds that the timer should
+	   * wait before the specified function or code is executed.
+	   * @param {*} [arg] An optional argument to be passed to the callback function
+	   * when the timer expires.
+	   * @returns {FastTimer}
+	   */
+	  setFastTimeout (callback, delay, arg) {
+	    return new FastTimer(callback, delay, arg)
+	  },
+	  /**
+	   * The clearTimeout method cancels an instantiated FastTimer previously
+	   * created by calling setFastTimeout.
+	   *
+	   * @param {FastTimer} timeout
+	   */
+	  clearFastTimeout (timeout) {
+	    timeout.clear();
+	  },
+	  /**
+	   * The now method returns the value of the internal fast timer clock.
+	   *
+	   * @returns {number}
+	   */
+	  now () {
+	    return fastNow
+	  },
+	  /**
+	   * Trigger the onTick function to process the fastTimers array.
+	   * Exported for testing purposes only.
+	   * Marking as deprecated to discourage any use outside of testing.
+	   * @deprecated
+	   * @param {number} [delay=0] The delay in milliseconds to add to the now value.
+	   */
+	  tick (delay = 0) {
+	    fastNow += delay - RESOLUTION_MS + 1;
+	    onTick();
+	    onTick();
+	  },
+	  /**
+	   * Reset FastTimers.
+	   * Exported for testing purposes only.
+	   * Marking as deprecated to discourage any use outside of testing.
+	   * @deprecated
+	   */
+	  reset () {
+	    fastNow = 0;
+	    fastTimers.length = 0;
+	    clearTimeout(fastNowTimeout);
+	    fastNowTimeout = null;
+	  },
+	  /**
+	   * Exporting for testing purposes only.
+	   * Marking as deprecated to discourage any use outside of testing.
+	   * @deprecated
+	   */
+	  kFastTimer
+	};
+	return timers;
+}
+
+var connect;
+var hasRequiredConnect;
+
+function requireConnect () {
+	if (hasRequiredConnect) return connect;
+	hasRequiredConnect = 1;
+
+	const net = require$$0$9;
+	const assert = require$$0$7;
+	const util = requireUtil$7();
+	const { InvalidArgumentError, ConnectTimeoutError } = requireErrors();
+	const timers = requireTimers();
+
+	function noop () {}
+
+	let tls; // include tls conditionally since it is not always available
+
+	// TODO: session re-use does not wait for the first
+	// connection to resolve the session and might therefore
+	// resolve the same servername multiple times even when
+	// re-use is enabled.
+
+	let SessionCache;
+	// FIXME: remove workaround when the Node bug is fixed
+	// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308
+	if (commonjsGlobal.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) {
+	  SessionCache = class WeakSessionCache {
+	    constructor (maxCachedSessions) {
+	      this._maxCachedSessions = maxCachedSessions;
+	      this._sessionCache = new Map();
+	      this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => {
+	        if (this._sessionCache.size < this._maxCachedSessions) {
+	          return
+	        }
+
+	        const ref = this._sessionCache.get(key);
+	        if (ref !== undefined && ref.deref() === undefined) {
+	          this._sessionCache.delete(key);
+	        }
+	      });
+	    }
+
+	    get (sessionKey) {
+	      const ref = this._sessionCache.get(sessionKey);
+	      return ref ? ref.deref() : null
+	    }
+
+	    set (sessionKey, session) {
+	      if (this._maxCachedSessions === 0) {
+	        return
+	      }
+
+	      this._sessionCache.set(sessionKey, new WeakRef(session));
+	      this._sessionRegistry.register(session, sessionKey);
+	    }
+	  };
+	} else {
+	  SessionCache = class SimpleSessionCache {
+	    constructor (maxCachedSessions) {
+	      this._maxCachedSessions = maxCachedSessions;
+	      this._sessionCache = new Map();
+	    }
+
+	    get (sessionKey) {
+	      return this._sessionCache.get(sessionKey)
+	    }
+
+	    set (sessionKey, session) {
+	      if (this._maxCachedSessions === 0) {
+	        return
+	      }
+
+	      if (this._sessionCache.size >= this._maxCachedSessions) {
+	        // remove the oldest session
+	        const { value: oldestKey } = this._sessionCache.keys().next();
+	        this._sessionCache.delete(oldestKey);
+	      }
+
+	      this._sessionCache.set(sessionKey, session);
+	    }
+	  };
+	}
+
+	function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {
+	  if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {
+	    throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')
+	  }
+
+	  const options = { path: socketPath, ...opts };
+	  const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions);
+	  timeout = timeout == null ? 10e3 : timeout;
+	  allowH2 = allowH2 != null ? allowH2 : false;
+	  return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
+	    let socket;
+	    if (protocol === 'https:') {
+	      if (!tls) {
+	        tls = require$$5;
+	      }
+	      servername = servername || options.servername || util.getServerName(host) || null;
+
+	      const sessionKey = servername || hostname;
+	      assert(sessionKey);
+
+	      const session = customSession || sessionCache.get(sessionKey) || null;
+
+	      port = port || 443;
+
+	      socket = tls.connect({
+	        highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...
+	        ...options,
+	        servername,
+	        session,
+	        localAddress,
+	        // TODO(HTTP/2): Add support for h2c
+	        ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],
+	        socket: httpSocket, // upgrade socket connection
+	        port,
+	        host: hostname
+	      });
+
+	      socket
+	        .on('session', function (session) {
+	          // TODO (fix): Can a session become invalid once established? Don't think so?
+	          sessionCache.set(sessionKey, session);
+	        });
+	    } else {
+	      assert(!httpSocket, 'httpSocket can only be sent on TLS update');
+
+	      port = port || 80;
+
+	      socket = net.connect({
+	        highWaterMark: 64 * 1024, // Same as nodejs fs streams.
+	        ...options,
+	        localAddress,
+	        port,
+	        host: hostname
+	      });
+	    }
+
+	    // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket
+	    if (options.keepAlive == null || options.keepAlive) {
+	      const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay;
+	      socket.setKeepAlive(true, keepAliveInitialDelay);
+	    }
+
+	    const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port });
+
+	    socket
+	      .setNoDelay(true)
+	      .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {
+	        queueMicrotask(clearConnectTimeout);
+
+	        if (callback) {
+	          const cb = callback;
+	          callback = null;
+	          cb(null, this);
+	        }
+	      })
+	      .on('error', function (err) {
+	        queueMicrotask(clearConnectTimeout);
+
+	        if (callback) {
+	          const cb = callback;
+	          callback = null;
+	          cb(err);
+	        }
+	      });
+
+	    return socket
+	  }
+	}
+
+	/**
+	 * @param {WeakRef} socketWeakRef
+	 * @param {object} opts
+	 * @param {number} opts.timeout
+	 * @param {string} opts.hostname
+	 * @param {number} opts.port
+	 * @returns {() => void}
+	 */
+	const setupConnectTimeout = process.platform === 'win32'
+	  ? (socketWeakRef, opts) => {
+	      if (!opts.timeout) {
+	        return noop
+	      }
+
+	      let s1 = null;
+	      let s2 = null;
+	      const fastTimer = timers.setFastTimeout(() => {
+	      // setImmediate is added to make sure that we prioritize socket error events over timeouts
+	        s1 = setImmediate(() => {
+	        // Windows needs an extra setImmediate probably due to implementation differences in the socket logic
+	          s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts));
+	        });
+	      }, opts.timeout);
+	      return () => {
+	        timers.clearFastTimeout(fastTimer);
+	        clearImmediate(s1);
+	        clearImmediate(s2);
+	      }
+	    }
+	  : (socketWeakRef, opts) => {
+	      if (!opts.timeout) {
+	        return noop
+	      }
+
+	      let s1 = null;
+	      const fastTimer = timers.setFastTimeout(() => {
+	      // setImmediate is added to make sure that we prioritize socket error events over timeouts
+	        s1 = setImmediate(() => {
+	          onConnectTimeout(socketWeakRef.deref(), opts);
+	        });
+	      }, opts.timeout);
+	      return () => {
+	        timers.clearFastTimeout(fastTimer);
+	        clearImmediate(s1);
+	      }
+	    };
+
+	/**
+	 * @param {net.Socket} socket
+	 * @param {object} opts
+	 * @param {number} opts.timeout
+	 * @param {string} opts.hostname
+	 * @param {number} opts.port
+	 */
+	function onConnectTimeout (socket, opts) {
+	  // The socket could be already garbage collected
+	  if (socket == null) {
+	    return
+	  }
+
+	  let message = 'Connect Timeout Error';
+	  if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
+	    message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`;
+	  } else {
+	    message += ` (attempted address: ${opts.hostname}:${opts.port},`;
+	  }
+
+	  message += ` timeout: ${opts.timeout}ms)`;
+
+	  util.destroy(socket, new ConnectTimeoutError(message));
+	}
+
+	connect = buildConnector;
+	return connect;
+}
+
+var constants$4 = {};
+
+var utils = {};
+
+var hasRequiredUtils;
+
+function requireUtils () {
+	if (hasRequiredUtils) return utils;
+	hasRequiredUtils = 1;
+	Object.defineProperty(utils, "__esModule", { value: true });
+	utils.enumToMap = void 0;
+	function enumToMap(obj) {
+	    const res = {};
+	    Object.keys(obj).forEach((key) => {
+	        const value = obj[key];
+	        if (typeof value === 'number') {
+	            res[key] = value;
+	        }
+	    });
+	    return res;
+	}
+	utils.enumToMap = enumToMap;
+	
+	return utils;
+}
+
+var hasRequiredConstants$4;
+
+function requireConstants$4 () {
+	if (hasRequiredConstants$4) return constants$4;
+	hasRequiredConstants$4 = 1;
+	(function (exports$1) {
+		Object.defineProperty(exports$1, "__esModule", { value: true });
+		exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0;
+		const utils_1 = requireUtils();
+		(function (ERROR) {
+		    ERROR[ERROR["OK"] = 0] = "OK";
+		    ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL";
+		    ERROR[ERROR["STRICT"] = 2] = "STRICT";
+		    ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED";
+		    ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH";
+		    ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION";
+		    ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD";
+		    ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL";
+		    ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT";
+		    ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION";
+		    ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN";
+		    ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH";
+		    ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE";
+		    ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS";
+		    ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE";
+		    ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING";
+		    ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN";
+		    ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE";
+		    ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE";
+		    ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER";
+		    ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE";
+		    ERROR[ERROR["PAUSED"] = 21] = "PAUSED";
+		    ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE";
+		    ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE";
+		    ERROR[ERROR["USER"] = 24] = "USER";
+		})(exports$1.ERROR || (exports$1.ERROR = {}));
+		(function (TYPE) {
+		    TYPE[TYPE["BOTH"] = 0] = "BOTH";
+		    TYPE[TYPE["REQUEST"] = 1] = "REQUEST";
+		    TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE";
+		})(exports$1.TYPE || (exports$1.TYPE = {}));
+		(function (FLAGS) {
+		    FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE";
+		    FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE";
+		    FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE";
+		    FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED";
+		    FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE";
+		    FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH";
+		    FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY";
+		    FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING";
+		    // 1 << 8 is unused
+		    FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING";
+		})(exports$1.FLAGS || (exports$1.FLAGS = {}));
+		(function (LENIENT_FLAGS) {
+		    LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS";
+		    LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH";
+		    LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE";
+		})(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {}));
+		var METHODS;
+		(function (METHODS) {
+		    METHODS[METHODS["DELETE"] = 0] = "DELETE";
+		    METHODS[METHODS["GET"] = 1] = "GET";
+		    METHODS[METHODS["HEAD"] = 2] = "HEAD";
+		    METHODS[METHODS["POST"] = 3] = "POST";
+		    METHODS[METHODS["PUT"] = 4] = "PUT";
+		    /* pathological */
+		    METHODS[METHODS["CONNECT"] = 5] = "CONNECT";
+		    METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS";
+		    METHODS[METHODS["TRACE"] = 7] = "TRACE";
+		    /* WebDAV */
+		    METHODS[METHODS["COPY"] = 8] = "COPY";
+		    METHODS[METHODS["LOCK"] = 9] = "LOCK";
+		    METHODS[METHODS["MKCOL"] = 10] = "MKCOL";
+		    METHODS[METHODS["MOVE"] = 11] = "MOVE";
+		    METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND";
+		    METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH";
+		    METHODS[METHODS["SEARCH"] = 14] = "SEARCH";
+		    METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK";
+		    METHODS[METHODS["BIND"] = 16] = "BIND";
+		    METHODS[METHODS["REBIND"] = 17] = "REBIND";
+		    METHODS[METHODS["UNBIND"] = 18] = "UNBIND";
+		    METHODS[METHODS["ACL"] = 19] = "ACL";
+		    /* subversion */
+		    METHODS[METHODS["REPORT"] = 20] = "REPORT";
+		    METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY";
+		    METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT";
+		    METHODS[METHODS["MERGE"] = 23] = "MERGE";
+		    /* upnp */
+		    METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH";
+		    METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY";
+		    METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE";
+		    METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE";
+		    /* RFC-5789 */
+		    METHODS[METHODS["PATCH"] = 28] = "PATCH";
+		    METHODS[METHODS["PURGE"] = 29] = "PURGE";
+		    /* CalDAV */
+		    METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR";
+		    /* RFC-2068, section 19.6.1.2 */
+		    METHODS[METHODS["LINK"] = 31] = "LINK";
+		    METHODS[METHODS["UNLINK"] = 32] = "UNLINK";
+		    /* icecast */
+		    METHODS[METHODS["SOURCE"] = 33] = "SOURCE";
+		    /* RFC-7540, section 11.6 */
+		    METHODS[METHODS["PRI"] = 34] = "PRI";
+		    /* RFC-2326 RTSP */
+		    METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE";
+		    METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE";
+		    METHODS[METHODS["SETUP"] = 37] = "SETUP";
+		    METHODS[METHODS["PLAY"] = 38] = "PLAY";
+		    METHODS[METHODS["PAUSE"] = 39] = "PAUSE";
+		    METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN";
+		    METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER";
+		    METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER";
+		    METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT";
+		    METHODS[METHODS["RECORD"] = 44] = "RECORD";
+		    /* RAOP */
+		    METHODS[METHODS["FLUSH"] = 45] = "FLUSH";
+		})(METHODS = exports$1.METHODS || (exports$1.METHODS = {}));
+		exports$1.METHODS_HTTP = [
+		    METHODS.DELETE,
+		    METHODS.GET,
+		    METHODS.HEAD,
+		    METHODS.POST,
+		    METHODS.PUT,
+		    METHODS.CONNECT,
+		    METHODS.OPTIONS,
+		    METHODS.TRACE,
+		    METHODS.COPY,
+		    METHODS.LOCK,
+		    METHODS.MKCOL,
+		    METHODS.MOVE,
+		    METHODS.PROPFIND,
+		    METHODS.PROPPATCH,
+		    METHODS.SEARCH,
+		    METHODS.UNLOCK,
+		    METHODS.BIND,
+		    METHODS.REBIND,
+		    METHODS.UNBIND,
+		    METHODS.ACL,
+		    METHODS.REPORT,
+		    METHODS.MKACTIVITY,
+		    METHODS.CHECKOUT,
+		    METHODS.MERGE,
+		    METHODS['M-SEARCH'],
+		    METHODS.NOTIFY,
+		    METHODS.SUBSCRIBE,
+		    METHODS.UNSUBSCRIBE,
+		    METHODS.PATCH,
+		    METHODS.PURGE,
+		    METHODS.MKCALENDAR,
+		    METHODS.LINK,
+		    METHODS.UNLINK,
+		    METHODS.PRI,
+		    // TODO(indutny): should we allow it with HTTP?
+		    METHODS.SOURCE,
+		];
+		exports$1.METHODS_ICE = [
+		    METHODS.SOURCE,
+		];
+		exports$1.METHODS_RTSP = [
+		    METHODS.OPTIONS,
+		    METHODS.DESCRIBE,
+		    METHODS.ANNOUNCE,
+		    METHODS.SETUP,
+		    METHODS.PLAY,
+		    METHODS.PAUSE,
+		    METHODS.TEARDOWN,
+		    METHODS.GET_PARAMETER,
+		    METHODS.SET_PARAMETER,
+		    METHODS.REDIRECT,
+		    METHODS.RECORD,
+		    METHODS.FLUSH,
+		    // For AirPlay
+		    METHODS.GET,
+		    METHODS.POST,
+		];
+		exports$1.METHOD_MAP = utils_1.enumToMap(METHODS);
+		exports$1.H_METHOD_MAP = {};
+		Object.keys(exports$1.METHOD_MAP).forEach((key) => {
+		    if (/^H/.test(key)) {
+		        exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key];
+		    }
+		});
+		(function (FINISH) {
+		    FINISH[FINISH["SAFE"] = 0] = "SAFE";
+		    FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB";
+		    FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE";
+		})(exports$1.FINISH || (exports$1.FINISH = {}));
+		exports$1.ALPHA = [];
+		for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {
+		    // Upper case
+		    exports$1.ALPHA.push(String.fromCharCode(i));
+		    // Lower case
+		    exports$1.ALPHA.push(String.fromCharCode(i + 0x20));
+		}
+		exports$1.NUM_MAP = {
+		    0: 0, 1: 1, 2: 2, 3: 3, 4: 4,
+		    5: 5, 6: 6, 7: 7, 8: 8, 9: 9,
+		};
+		exports$1.HEX_MAP = {
+		    0: 0, 1: 1, 2: 2, 3: 3, 4: 4,
+		    5: 5, 6: 6, 7: 7, 8: 8, 9: 9,
+		    A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,
+		    a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,
+		};
+		exports$1.NUM = [
+		    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+		];
+		exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM);
+		exports$1.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')'];
+		exports$1.USERINFO_CHARS = exports$1.ALPHANUM
+		    .concat(exports$1.MARK)
+		    .concat(['%', ';', ':', '&', '=', '+', '$', ',']);
+		// TODO(indutny): use RFC
+		exports$1.STRICT_URL_CHAR = [
+		    '!', '"', '$', '%', '&', '\'',
+		    '(', ')', '*', '+', ',', '-', '.', '/',
+		    ':', ';', '<', '=', '>',
+		    '@', '[', '\\', ']', '^', '_',
+		    '`',
+		    '{', '|', '}', '~',
+		].concat(exports$1.ALPHANUM);
+		exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR
+		    .concat(['\t', '\f']);
+		// All characters with 0x80 bit set to 1
+		for (let i = 0x80; i <= 0xff; i++) {
+		    exports$1.URL_CHAR.push(i);
+		}
+		exports$1.HEX = exports$1.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);
+		/* Tokens as defined by rfc 2616. Also lowercases them.
+		 *        token       = 1*
+		 *     separators     = "(" | ")" | "<" | ">" | "@"
+		 *                    | "," | ";" | ":" | "\" | <">
+		 *                    | "/" | "[" | "]" | "?" | "="
+		 *                    | "{" | "}" | SP | HT
+		 */
+		exports$1.STRICT_TOKEN = [
+		    '!', '#', '$', '%', '&', '\'',
+		    '*', '+', '-', '.',
+		    '^', '_', '`',
+		    '|', '~',
+		].concat(exports$1.ALPHANUM);
+		exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([' ']);
+		/*
+		 * Verify that a char is a valid visible (printable) US-ASCII
+		 * character or %x80-FF
+		 */
+		exports$1.HEADER_CHARS = ['\t'];
+		for (let i = 32; i <= 255; i++) {
+		    if (i !== 127) {
+		        exports$1.HEADER_CHARS.push(i);
+		    }
+		}
+		// ',' = \x44
+		exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44);
+		exports$1.MAJOR = exports$1.NUM_MAP;
+		exports$1.MINOR = exports$1.MAJOR;
+		var HEADER_STATE;
+		(function (HEADER_STATE) {
+		    HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL";
+		    HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION";
+		    HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH";
+		    HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING";
+		    HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE";
+		    HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE";
+		    HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE";
+		    HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE";
+		    HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED";
+		})(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {}));
+		exports$1.SPECIAL_HEADERS = {
+		    'connection': HEADER_STATE.CONNECTION,
+		    'content-length': HEADER_STATE.CONTENT_LENGTH,
+		    'proxy-connection': HEADER_STATE.CONNECTION,
+		    'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING,
+		    'upgrade': HEADER_STATE.UPGRADE,
+		};
+		
+	} (constants$4));
+	return constants$4;
+}
+
+var llhttpWasm;
+var hasRequiredLlhttpWasm;
+
+function requireLlhttpWasm () {
+	if (hasRequiredLlhttpWasm) return llhttpWasm;
+	hasRequiredLlhttpWasm = 1;
+
+	const { Buffer } = require$$0$6;
+
+	llhttpWasm = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVuaWVudF9oZWFkZXJzACEhbGxodHRwX3NldF9sZW5pZW50X2NodW5rZWRfbGVuZ3RoACIdbGxodHRwX3NldF9sZW5pZW50X2tlZXBfYWxpdmUAIyRsbGh0dHBfc2V0X2xlbmllbnRfdHJhbnNmZXJfZW5jb2RpbmcAJBhsbGh0dHBfbWVzc2FnZV9uZWVkc19lb2YALgkXAQBBAQsRAQIDBAUKBgcrLSwqKSglJyYK07MCLBYAQYjQACgCAARAAAtBiNAAQQE2AgALFAAgABAwIAAgAjYCOCAAIAE6ACgLFAAgACAALwEyIAAtAC4gABAvEAALHgEBf0HAABAyIgEQMCABQYAINgI4IAEgADoAKCABC48MAQd/AkAgAEUNACAAQQhrIgEgAEEEaygCACIAQXhxIgRqIQUCQCAAQQFxDQAgAEEDcUUNASABIAEoAgAiAGsiAUGc0AAoAgBJDQEgACAEaiEEAkACQEGg0AAoAgAgAUcEQCAAQf8BTQRAIABBA3YhAyABKAIIIgAgASgCDCICRgRAQYzQAEGM0AAoAgBBfiADd3E2AgAMBQsgAiAANgIIIAAgAjYCDAwECyABKAIYIQYgASABKAIMIgBHBEAgACABKAIIIgI2AgggAiAANgIMDAMLIAFBFGoiAygCACICRQRAIAEoAhAiAkUNAiABQRBqIQMLA0AgAyEHIAIiAEEUaiIDKAIAIgINACAAQRBqIQMgACgCECICDQALIAdBADYCAAwCCyAFKAIEIgBBA3FBA0cNAiAFIABBfnE2AgRBlNAAIAQ2AgAgBSAENgIAIAEgBEEBcjYCBAwDC0EAIQALIAZFDQACQCABKAIcIgJBAnRBvNIAaiIDKAIAIAFGBEAgAyAANgIAIAANAUGQ0ABBkNAAKAIAQX4gAndxNgIADAILIAZBEEEUIAYoAhAgAUYbaiAANgIAIABFDQELIAAgBjYCGCABKAIQIgIEQCAAIAI2AhAgAiAANgIYCyABQRRqKAIAIgJFDQAgAEEUaiACNgIAIAIgADYCGAsgASAFTw0AIAUoAgQiAEEBcUUNAAJAAkACQAJAIABBAnFFBEBBpNAAKAIAIAVGBEBBpNAAIAE2AgBBmNAAQZjQACgCACAEaiIANgIAIAEgAEEBcjYCBCABQaDQACgCAEcNBkGU0ABBADYCAEGg0ABBADYCAAwGC0Gg0AAoAgAgBUYEQEGg0AAgATYCAEGU0ABBlNAAKAIAIARqIgA2AgAgASAAQQFyNgIEIAAgAWogADYCAAwGCyAAQXhxIARqIQQgAEH/AU0EQCAAQQN2IQMgBSgCCCIAIAUoAgwiAkYEQEGM0ABBjNAAKAIAQX4gA3dxNgIADAULIAIgADYCCCAAIAI2AgwMBAsgBSgCGCEGIAUgBSgCDCIARwRAQZzQACgCABogACAFKAIIIgI2AgggAiAANgIMDAMLIAVBFGoiAygCACICRQRAIAUoAhAiAkUNAiAFQRBqIQMLA0AgAyEHIAIiAEEUaiIDKAIAIgINACAAQRBqIQMgACgCECICDQALIAdBADYCAAwCCyAFIABBfnE2AgQgASAEaiAENgIAIAEgBEEBcjYCBAwDC0EAIQALIAZFDQACQCAFKAIcIgJBAnRBvNIAaiIDKAIAIAVGBEAgAyAANgIAIAANAUGQ0ABBkNAAKAIAQX4gAndxNgIADAILIAZBEEEUIAYoAhAgBUYbaiAANgIAIABFDQELIAAgBjYCGCAFKAIQIgIEQCAAIAI2AhAgAiAANgIYCyAFQRRqKAIAIgJFDQAgAEEUaiACNgIAIAIgADYCGAsgASAEaiAENgIAIAEgBEEBcjYCBCABQaDQACgCAEcNAEGU0AAgBDYCAAwBCyAEQf8BTQRAIARBeHFBtNAAaiEAAn9BjNAAKAIAIgJBASAEQQN2dCIDcUUEQEGM0AAgAiADcjYCACAADAELIAAoAggLIgIgATYCDCAAIAE2AgggASAANgIMIAEgAjYCCAwBC0EfIQIgBEH///8HTQRAIARBJiAEQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAgsgASACNgIcIAFCADcCECACQQJ0QbzSAGohAAJAQZDQACgCACIDQQEgAnQiB3FFBEAgACABNgIAQZDQACADIAdyNgIAIAEgADYCGCABIAE2AgggASABNgIMDAELIARBGSACQQF2a0EAIAJBH0cbdCECIAAoAgAhAAJAA0AgACIDKAIEQXhxIARGDQEgAkEddiEAIAJBAXQhAiADIABBBHFqQRBqIgcoAgAiAA0ACyAHIAE2AgAgASADNgIYIAEgATYCDCABIAE2AggMAQsgAygCCCIAIAE2AgwgAyABNgIIIAFBADYCGCABIAM2AgwgASAANgIIC0Gs0ABBrNAAKAIAQQFrIgBBfyAAGzYCAAsLBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LQAEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABAwIAAgBDYCOCAAIAM6ACggACACOgAtIAAgATYCGAu74gECB38DfiABIAJqIQQCQCAAIgIoAgwiAA0AIAIoAgQEQCACIAE2AgQLIwBBEGsiCCQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAhwiA0EBaw7dAdoBAdkBAgMEBQYHCAkKCwwNDtgBDxDXARES1gETFBUWFxgZGhvgAd8BHB0e1QEfICEiIyQl1AEmJygpKiss0wHSAS0u0QHQAS8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRtsBR0hJSs8BzgFLzQFMzAFNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBywHKAbgByQG5AcgBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgEA3AELQQAMxgELQQ4MxQELQQ0MxAELQQ8MwwELQRAMwgELQRMMwQELQRQMwAELQRUMvwELQRYMvgELQRgMvQELQRkMvAELQRoMuwELQRsMugELQRwMuQELQR0MuAELQQgMtwELQR4MtgELQSAMtQELQR8MtAELQQcMswELQSEMsgELQSIMsQELQSMMsAELQSQMrwELQRIMrgELQREMrQELQSUMrAELQSYMqwELQScMqgELQSgMqQELQcMBDKgBC0EqDKcBC0ErDKYBC0EsDKUBC0EtDKQBC0EuDKMBC0EvDKIBC0HEAQyhAQtBMAygAQtBNAyfAQtBDAyeAQtBMQydAQtBMgycAQtBMwybAQtBOQyaAQtBNQyZAQtBxQEMmAELQQsMlwELQToMlgELQTYMlQELQQoMlAELQTcMkwELQTgMkgELQTwMkQELQTsMkAELQT0MjwELQQkMjgELQSkMjQELQT4MjAELQT8MiwELQcAADIoBC0HBAAyJAQtBwgAMiAELQcMADIcBC0HEAAyGAQtBxQAMhQELQcYADIQBC0EXDIMBC0HHAAyCAQtByAAMgQELQckADIABC0HKAAx/C0HLAAx+C0HNAAx9C0HMAAx8C0HOAAx7C0HPAAx6C0HQAAx5C0HRAAx4C0HSAAx3C0HTAAx2C0HUAAx1C0HWAAx0C0HVAAxzC0EGDHILQdcADHELQQUMcAtB2AAMbwtBBAxuC0HZAAxtC0HaAAxsC0HbAAxrC0HcAAxqC0EDDGkLQd0ADGgLQd4ADGcLQd8ADGYLQeEADGULQeAADGQLQeIADGMLQeMADGILQQIMYQtB5AAMYAtB5QAMXwtB5gAMXgtB5wAMXQtB6AAMXAtB6QAMWwtB6gAMWgtB6wAMWQtB7AAMWAtB7QAMVwtB7gAMVgtB7wAMVQtB8AAMVAtB8QAMUwtB8gAMUgtB8wAMUQtB9AAMUAtB9QAMTwtB9gAMTgtB9wAMTQtB+AAMTAtB+QAMSwtB+gAMSgtB+wAMSQtB/AAMSAtB/QAMRwtB/gAMRgtB/wAMRQtBgAEMRAtBgQEMQwtBggEMQgtBgwEMQQtBhAEMQAtBhQEMPwtBhgEMPgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv', 'base64');
+	return llhttpWasm;
+}
+
+var llhttp_simdWasm;
+var hasRequiredLlhttp_simdWasm;
+
+function requireLlhttp_simdWasm () {
+	if (hasRequiredLlhttp_simdWasm) return llhttp_simdWasm;
+	hasRequiredLlhttp_simdWasm = 1;
+
+	const { Buffer } = require$$0$6;
+
+	llhttp_simdWasm = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxBACEDDKIBCyACQeQANgIcIAIgATYCFCACQeMXNgIQIAJBFTYCDEEAIQMMoQELIAJBADYCACAGQQFqIQEgAi0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACEDIAJBADYCHCACIAE2AhQgAkH3CTYCECACQQg2AgwMoAELIAJBADYCACAGQQFqIQEgAi0AKUEhRg0DIAJBADYCHCACIAE2AhQgAkGbCjYCECACQQg2AgxBACEDDJ8BCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJBkDM2AhAgAkEINgIMDJ0BCyACQQA2AgAgBkEBaiEBIAItAClBI0kNACACQQA2AhwgAiABNgIUIAJB0wk2AhAgAkEINgIMQQAhAwycAQtB0QAhAwyCAQsgAS0AAEEwayIAQf8BcUEKSQRAIAIgADoAKiABQQFqIQFBzwAhAwyCAQsgAigCBCEAIAJBADYCBCACIAAgARAoIgBFDYYBIAJB3gA2AhwgAiABNgIUIAIgADYCDEEAIQMMmgELIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ2GASACQdwANgIcIAIgATYCFCACIAA2AgxBACEDDJkBCyACKAIEIQAgAkEANgIEIAIgACAFECgiAEUEQCAFIQEMhwELIAJB2gA2AhwgAiAFNgIUIAIgADYCDAyYAQtBACEBQQEhAwsgAiADOgArIAVBAWohAwJAAkACQCACLQAtQRBxDQACQAJAAkAgAi0AKg4DAQACBAsgBkUNAwwCCyAADQEMAgsgAUUNAQsgAigCBCEAIAJBADYCBCACIAAgAxAoIgBFBEAgAyEBDAILIAJB2AA2AhwgAiADNgIUIAIgADYCDEEAIQMMmAELIAIoAgQhACACQQA2AgQgAiAAIAMQKCIARQRAIAMhAQyHAQsgAkHZADYCHCACIAM2AhQgAiAANgIMQQAhAwyXAQtBzAAhAwx9CyAAQRVHBEAgAkEANgIcIAIgATYCFCACQZQNNgIQIAJBITYCDEEAIQMMlgELIAJB1wA2AhwgAiABNgIUIAJByRc2AhAgAkEVNgIMQQAhAwyVAQtBACEDIAJBADYCHCACIAE2AhQgAkGAETYCECACQQk2AgwMlAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0AIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMkwELQckAIQMMeQsgAkEANgIcIAIgATYCFCACQcEoNgIQIAJBBzYCDCACQQA2AgBBACEDDJEBCyACKAIEIQBBACEDIAJBADYCBCACIAAgARAlIgBFDQAgAkHSADYCHCACIAE2AhQgAiAANgIMDJABC0HIACEDDHYLIAJBADYCACAFIQELIAJBgBI7ASogAUEBaiEBQQAhAAJAIAIoAjgiA0UNACADKAIwIgNFDQAgAiADEQAAIQALIAANAQtBxwAhAwxzCyAAQRVGBEAgAkHRADYCHCACIAE2AhQgAkHjFzYCECACQRU2AgxBACEDDIwBC0EAIQMgAkEANgIcIAIgATYCFCACQbkNNgIQIAJBGjYCDAyLAQtBACEDIAJBADYCHCACIAE2AhQgAkGgGTYCECACQR42AgwMigELIAEtAABBOkYEQCACKAIEIQBBACEDIAJBADYCBCACIAAgARApIgBFDQEgAkHDADYCHCACIAA2AgwgAiABQQFqNgIUDIoBC0EAIQMgAkEANgIcIAIgATYCFCACQbERNgIQIAJBCjYCDAyJAQsgAUEBaiEBQTshAwxvCyACQcMANgIcIAIgADYCDCACIAFBAWo2AhQMhwELQQAhAyACQQA2AhwgAiABNgIUIAJB8A42AhAgAkEcNgIMDIYBCyACIAIvATBBEHI7ATAMZgsCQCACLwEwIgBBCHFFDQAgAi0AKEEBRw0AIAItAC1BCHFFDQMLIAIgAEH3+wNxQYAEcjsBMAwECyABIARHBEACQANAIAEtAABBMGsiAEH/AXFBCk8EQEE1IQMMbgsgAikDICIKQpmz5syZs+bMGVYNASACIApCCn4iCjcDICAKIACtQv8BgyILQn+FVg0BIAIgCiALfDcDICAEIAFBAWoiAUcNAAtBOSEDDIUBCyACKAIEIQBBACEDIAJBADYCBCACIAAgAUEBaiIBECoiAA0MDHcLQTkhAwyDAQsgAi0AMEEgcQ0GQcUBIQMMaQtBACEDIAJBADYCBCACIAEgARAqIgBFDQQgAkE6NgIcIAIgADYCDCACIAFBAWo2AhQMgQELIAItAChBAUcNACACLQAtQQhxRQ0BC0E3IQMMZgsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIABEAgAkE7NgIcIAIgADYCDCACIAFBAWo2AhQMfwsgAUEBaiEBDG4LIAJBCDoALAwECyABQQFqIQEMbQtBACEDIAJBADYCHCACIAE2AhQgAkHkEjYCECACQQQ2AgwMewsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIARQ1sIAJBNzYCHCACIAE2AhQgAiAANgIMDHoLIAIgAi8BMEEgcjsBMAtBMCEDDF8LIAJBNjYCHCACIAE2AhQgAiAANgIMDHcLIABBLEcNASABQQFqIQBBASEBAkACQAJAAkACQCACLQAsQQVrDgQDAQIEAAsgACEBDAQLQQIhAQwBC0EEIQELIAJBAToALCACIAIvATAgAXI7ATAgACEBDAELIAIgAi8BMEEIcjsBMCAAIQELQTkhAwxcCyACQQA6ACwLQTQhAwxaCyABIARGBEBBLSEDDHMLAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0EtIQMMdAsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIARQ0CIAJBLDYCHCACIAE2AhQgAiAANgIMDHMLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABECoiAEUEQCABQQFqIQEMAgsgAkEsNgIcIAIgADYCDCACIAFBAWo2AhQMcgsgAS0AAEENRgRAIAIoAgQhAEEAIQMgAkEANgIEIAIgACABECoiAEUEQCABQQFqIQEMAgsgAkEsNgIcIAIgADYCDCACIAFBAWo2AhQMcgsgAi0ALUEBcQRAQcQBIQMMWQsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIADQEMZQtBLyEDDFcLIAJBLjYCHCACIAE2AhQgAiAANgIMDG8LQQAhAyACQQA2AhwgAiABNgIUIAJB8BQ2AhAgAkEDNgIMDG4LQQEhAwJAAkACQAJAIAItACxBBWsOBAMBAgAECyACIAIvATBBCHI7ATAMAwtBAiEDDAELQQQhAwsgAkEBOgAsIAIgAi8BMCADcjsBMAtBKiEDDFMLQQAhAyACQQA2AhwgAiABNgIUIAJB4Q82AhAgAkEKNgIMDGsLQQEhAwJAAkACQAJAAkACQCACLQAsQQJrDgcFBAQDAQIABAsgAiACLwEwQQhyOwEwDAMLQQIhAwwBC0EEIQMLIAJBAToALCACIAIvATAgA3I7ATALQSshAwxSC0EAIQMgAkEANgIcIAIgATYCFCACQasSNgIQIAJBCzYCDAxqC0EAIQMgAkEANgIcIAIgATYCFCACQf0NNgIQIAJBHTYCDAxpCyABIARHBEADQCABLQAAQSBHDUggBCABQQFqIgFHDQALQSUhAwxpC0ElIQMMaAsgAi0ALUEBcQRAQcMBIQMMTwsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKSIABEAgAkEmNgIcIAIgADYCDCACIAFBAWo2AhQMaAsgAUEBaiEBDFwLIAFBAWohASACLwEwIgBBgAFxBEBBACEAAkAgAigCOCIDRQ0AIAMoAlQiA0UNACACIAMRAAAhAAsgAEUNBiAAQRVHDR8gAkEFNgIcIAIgATYCFCACQfkXNgIQIAJBFTYCDEEAIQMMZwsCQCAAQaAEcUGgBEcNACACLQAtQQJxDQBBACEDIAJBADYCHCACIAE2AhQgAkGWEzYCECACQQQ2AgwMZwsgAgJ/IAIvATBBFHFBFEYEQEEBIAItAChBAUYNARogAi8BMkHlAEYMAQsgAi0AKUEFRgs6AC5BACEAAkAgAigCOCIDRQ0AIAMoAiQiA0UNACACIAMRAAAhAAsCQAJAAkACQAJAIAAOFgIBAAQEBAQEBAQEBAQEBAQEBAQEBAMECyACQQE6AC4LIAIgAi8BMEHAAHI7ATALQSchAwxPCyACQSM2AhwgAiABNgIUIAJBpRY2AhAgAkEVNgIMQQAhAwxnC0EAIQMgAkEANgIcIAIgATYCFCACQdULNgIQIAJBETYCDAxmC0EAIQACQCACKAI4IgNFDQAgAygCLCIDRQ0AIAIgAxEAACEACyAADQELQQ4hAwxLCyAAQRVGBEAgAkECNgIcIAIgATYCFCACQbAYNgIQIAJBFTYCDEEAIQMMZAtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMYwtBACEDIAJBADYCHCACIAE2AhQgAkGqHDYCECACQQ82AgwMYgsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEgCqdqIgEQKyIARQ0AIAJBBTYCHCACIAE2AhQgAiAANgIMDGELQQ8hAwxHC0EAIQMgAkEANgIcIAIgATYCFCACQc0TNgIQIAJBDDYCDAxfC0IBIQoLIAFBAWohAQJAIAIpAyAiC0L//////////w9YBEAgAiALQgSGIAqENwMgDAELQQAhAyACQQA2AhwgAiABNgIUIAJBrQk2AhAgAkEMNgIMDF4LQSQhAwxEC0EAIQMgAkEANgIcIAIgATYCFCACQc0TNgIQIAJBDDYCDAxcCyACKAIEIQBBACEDIAJBADYCBCACIAAgARAsIgBFBEAgAUEBaiEBDFILIAJBFzYCHCACIAA2AgwgAiABQQFqNgIUDFsLIAIoAgQhAEEAIQMgAkEANgIEAkAgAiAAIAEQLCIARQRAIAFBAWohAQwBCyACQRY2AhwgAiAANgIMIAIgAUEBajYCFAxbC0EfIQMMQQtBACEDIAJBADYCHCACIAE2AhQgAkGaDzYCECACQSI2AgwMWQsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQLSIARQRAIAFBAWohAQxQCyACQRQ2AhwgAiAANgIMIAIgAUEBajYCFAxYCyACKAIEIQBBACEDIAJBADYCBAJAIAIgACABEC0iAEUEQCABQQFqIQEMAQsgAkETNgIcIAIgADYCDCACIAFBAWo2AhQMWAtBHiEDDD4LQQAhAyACQQA2AhwgAiABNgIUIAJBxgw2AhAgAkEjNgIMDFYLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABEC0iAEUEQCABQQFqIQEMTgsgAkERNgIcIAIgADYCDCACIAFBAWo2AhQMVQsgAkEQNgIcIAIgATYCFCACIAA2AgwMVAtBACEDIAJBADYCHCACIAE2AhQgAkHGDDYCECACQSM2AgwMUwtBACEDIAJBADYCHCACIAE2AhQgAkHAFTYCECACQQI2AgwMUgsgAigCBCEAQQAhAyACQQA2AgQCQCACIAAgARAtIgBFBEAgAUEBaiEBDAELIAJBDjYCHCACIAA2AgwgAiABQQFqNgIUDFILQRshAww4C0EAIQMgAkEANgIcIAIgATYCFCACQcYMNgIQIAJBIzYCDAxQCyACKAIEIQBBACEDIAJBADYCBAJAIAIgACABECwiAEUEQCABQQFqIQEMAQsgAkENNgIcIAIgADYCDCACIAFBAWo2AhQMUAtBGiEDDDYLQQAhAyACQQA2AhwgAiABNgIUIAJBmg82AhAgAkEiNgIMDE4LIAIoAgQhAEEAIQMgAkEANgIEAkAgAiAAIAEQLCIARQRAIAFBAWohAQwBCyACQQw2AhwgAiAANgIMIAIgAUEBajYCFAxOC0EZIQMMNAtBACEDIAJBADYCHCACIAE2AhQgAkGaDzYCECACQSI2AgwMTAsgAEEVRwRAQQAhAyACQQA2AhwgAiABNgIUIAJBgww2AhAgAkETNgIMDEwLIAJBCjYCHCACIAE2AhQgAkHkFjYCECACQRU2AgxBACEDDEsLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABIAqnaiIBECsiAARAIAJBBzYCHCACIAE2AhQgAiAANgIMDEsLQRMhAwwxCyAAQRVHBEBBACEDIAJBADYCHCACIAE2AhQgAkHaDTYCECACQRQ2AgwMSgsgAkEeNgIcIAIgATYCFCACQfkXNgIQIAJBFTYCDEEAIQMMSQtBACEAAkAgAigCOCIDRQ0AIAMoAiwiA0UNACACIAMRAAAhAAsgAEUNQSAAQRVGBEAgAkEDNgIcIAIgATYCFCACQbAYNgIQIAJBFTYCDEEAIQMMSQtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMSAtBACEDIAJBADYCHCACIAE2AhQgAkHaDTYCECACQRQ2AgwMRwtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMRgsgAkEAOgAvIAItAC1BBHFFDT8LIAJBADoALyACQQE6ADRBACEDDCsLQQAhAyACQQA2AhwgAkHkETYCECACQQc2AgwgAiABQQFqNgIUDEMLAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB3QEhAwxDCwJAAkAgAi0ANEEBRw0AQQAhAAJAIAIoAjgiA0UNACADKAJYIgNFDQAgAiADEQAAIQALIABFDQAgAEEVRw0BIAJB3AE2AhwgAiABNgIUIAJB1RY2AhAgAkEVNgIMQQAhAwxEC0HBASEDDCoLIAJBADYCHCACIAE2AhQgAkHpCzYCECACQR82AgxBACEDDEILAkACQCACLQAoQQFrDgIEAQALQcABIQMMKQtBuQEhAwwoCyACQQI6AC9BACEAAkAgAigCOCIDRQ0AIAMoAgAiA0UNACACIAMRAAAhAAsgAEUEQEHCASEDDCgLIABBFUcEQCACQQA2AhwgAiABNgIUIAJBpAw2AhAgAkEQNgIMQQAhAwxBCyACQdsBNgIcIAIgATYCFCACQfoWNgIQIAJBFTYCDEEAIQMMQAsgASAERgRAQdoBIQMMQAsgAS0AAEHIAEYNASACQQE6ACgLQawBIQMMJQtBvwEhAwwkCyABIARHBEAgAkEQNgIIIAIgATYCBEG+ASEDDCQLQdkBIQMMPAsgASAERgRAQdgBIQMMPAsgAS0AAEHIAEcNBCABQQFqIQFBvQEhAwwiCyABIARGBEBB1wEhAww7CwJAAkAgAS0AAEHFAGsOEAAFBQUFBQUFBQUFBQUFBQEFCyABQQFqIQFBuwEhAwwiCyABQQFqIQFBvAEhAwwhC0HWASEDIAEgBEYNOSACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGD0ABqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAw6CyACKAIEIQAgAkIANwMAIAIgACAGQQFqIgEQJyIARQRAQcYBIQMMIQsgAkHVATYCHCACIAE2AhQgAiAANgIMQQAhAww5C0HUASEDIAEgBEYNOCACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGB0ABqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAw5CyACQYEEOwEoIAIoAgQhACACQgA3AwAgAiAAIAZBAWoiARAnIgANAwwCCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJB2Bs2AhAgAkEINgIMDDYLQboBIQMMHAsgAkHTATYCHCACIAE2AhQgAiAANgIMQQAhAww0C0EAIQACQCACKAI4IgNFDQAgAygCOCIDRQ0AIAIgAxEAACEACyAARQ0AIABBFUYNASACQQA2AhwgAiABNgIUIAJBzA42AhAgAkEgNgIMQQAhAwwzC0HkACEDDBkLIAJB+AA2AhwgAiABNgIUIAJByhg2AhAgAkEVNgIMQQAhAwwxC0HSASEDIAQgASIARg0wIAQgAWsgAigCACIBaiEFIAAgAWtBBGohBgJAA0AgAC0AACABQfzPAGotAABHDQEgAUEERg0DIAFBAWohASAEIABBAWoiAEcNAAsgAiAFNgIADDELIAJBADYCHCACIAA2AhQgAkGQMzYCECACQQg2AgwgAkEANgIAQQAhAwwwCyABIARHBEAgAkEONgIIIAIgATYCBEG3ASEDDBcLQdEBIQMMLwsgAkEANgIAIAZBAWohAQtBuAEhAwwUCyABIARGBEBB0AEhAwwtCyABLQAAQTBrIgBB/wFxQQpJBEAgAiAAOgAqIAFBAWohAUG2ASEDDBQLIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ0UIAJBzwE2AhwgAiABNgIUIAIgADYCDEEAIQMMLAsgASAERgRAQc4BIQMMLAsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ0VIAJBzQE2AhwgAiABNgIUIAIgADYCDEEAIQMMLAtBtQEhAwwSCyAEIAEiBUYEQEHMASEDDCsLQQAhAEEBIQFBASEGQQAhAwJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAUtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyEDQQAhAUEAIQYMAgtBCSEDQQEhAEEAIQFBACEGDAELQQAhAUEBIQMLIAIgAzoAKyAFQQFqIQMCQAJAIAItAC1BEHENAAJAAkACQCACLQAqDgMBAAIECyAGRQ0DDAILIAANAQwCCyABRQ0BCyACKAIEIQAgAkEANgIEIAIgACADECgiAEUEQCADIQEMAwsgAkHJATYCHCACIAM2AhQgAiAANgIMQQAhAwwtCyACKAIEIQAgAkEANgIEIAIgACADECgiAEUEQCADIQEMGAsgAkHKATYCHCACIAM2AhQgAiAANgIMQQAhAwwsCyACKAIEIQAgAkEANgIEIAIgACAFECgiAEUEQCAFIQEMFgsgAkHLATYCHCACIAU2AhQgAiAANgIMDCsLQbQBIQMMEQtBACEAAkAgAigCOCIDRQ0AIAMoAjwiA0UNACACIAMRAAAhAAsCQCAABEAgAEEVRg0BIAJBADYCHCACIAE2AhQgAkGUDTYCECACQSE2AgxBACEDDCsLQbIBIQMMEQsgAkHIATYCHCACIAE2AhQgAkHJFzYCECACQRU2AgxBACEDDCkLIAJBADYCACAGQQFqIQFB9QAhAwwPCyACLQApQQVGBEBB4wAhAwwPC0HiACEDDA4LIAAhASACQQA2AgALIAJBADoALEEJIQMMDAsgAkEANgIAIAdBAWohAUHAACEDDAsLQQELOgAsIAJBADYCACAGQQFqIQELQSkhAwwIC0E4IQMMBwsCQCABIARHBEADQCABLQAAQYA+ai0AACIAQQFHBEAgAEECRw0DIAFBAWohAQwFCyAEIAFBAWoiAUcNAAtBPiEDDCELQT4hAwwgCwsgAkEAOgAsDAELQQshAwwEC0E6IQMMAwsgAUEBaiEBQS0hAwwCCyACIAE6ACwgAkEANgIAIAZBAWohAUEMIQMMAQsgAkEANgIAIAZBAWohAUEKIQMMAAsAC0EAIQMgAkEANgIcIAIgATYCFCACQc0QNgIQIAJBCTYCDAwXC0EAIQMgAkEANgIcIAIgATYCFCACQekKNgIQIAJBCTYCDAwWC0EAIQMgAkEANgIcIAIgATYCFCACQbcQNgIQIAJBCTYCDAwVC0EAIQMgAkEANgIcIAIgATYCFCACQZwRNgIQIAJBCTYCDAwUC0EAIQMgAkEANgIcIAIgATYCFCACQc0QNgIQIAJBCTYCDAwTC0EAIQMgAkEANgIcIAIgATYCFCACQekKNgIQIAJBCTYCDAwSC0EAIQMgAkEANgIcIAIgATYCFCACQbcQNgIQIAJBCTYCDAwRC0EAIQMgAkEANgIcIAIgATYCFCACQZwRNgIQIAJBCTYCDAwQC0EAIQMgAkEANgIcIAIgATYCFCACQZcVNgIQIAJBDzYCDAwPC0EAIQMgAkEANgIcIAIgATYCFCACQZcVNgIQIAJBDzYCDAwOC0EAIQMgAkEANgIcIAIgATYCFCACQcASNgIQIAJBCzYCDAwNC0EAIQMgAkEANgIcIAIgATYCFCACQZUJNgIQIAJBCzYCDAwMC0EAIQMgAkEANgIcIAIgATYCFCACQeEPNgIQIAJBCjYCDAwLC0EAIQMgAkEANgIcIAIgATYCFCACQfsPNgIQIAJBCjYCDAwKC0EAIQMgAkEANgIcIAIgATYCFCACQfEZNgIQIAJBAjYCDAwJC0EAIQMgAkEANgIcIAIgATYCFCACQcQUNgIQIAJBAjYCDAwIC0EAIQMgAkEANgIcIAIgATYCFCACQfIVNgIQIAJBAjYCDAwHCyACQQI2AhwgAiABNgIUIAJBnBo2AhAgAkEWNgIMQQAhAwwGC0EBIQMMBQtB1AAhAyABIARGDQQgCEEIaiEJIAIoAgAhBQJAAkAgASAERwRAIAVB2MIAaiEHIAQgBWogAWshACAFQX9zQQpqIgUgAWohBgNAIAEtAAAgBy0AAEcEQEECIQcMAwsgBUUEQEEAIQcgBiEBDAMLIAVBAWshBSAHQQFqIQcgBCABQQFqIgFHDQALIAAhBSAEIQELIAlBATYCACACIAU2AgAMAQsgAkEANgIAIAkgBzYCAAsgCSABNgIEIAgoAgwhACAIKAIIDgMBBAIACwALIAJBADYCHCACQbUaNgIQIAJBFzYCDCACIABBAWo2AhRBACEDDAILIAJBADYCHCACIAA2AhQgAkHKGjYCECACQQk2AgxBACEDDAELIAEgBEYEQEEiIQMMAQsgAkEJNgIIIAIgATYCBEEhIQMLIAhBEGokACADRQRAIAIoAgwhAAwBCyACIAM2AhxBACEAIAIoAgQiAUUNACACIAEgBCACKAIIEQEAIgFFDQAgAiAENgIUIAIgATYCDCABIQALIAALvgIBAn8gAEEAOgAAIABB3ABqIgFBAWtBADoAACAAQQA6AAIgAEEAOgABIAFBA2tBADoAACABQQJrQQA6AAAgAEEAOgADIAFBBGtBADoAAEEAIABrQQNxIgEgAGoiAEEANgIAQdwAIAFrQXxxIgIgAGoiAUEEa0EANgIAAkAgAkEJSQ0AIABBADYCCCAAQQA2AgQgAUEIa0EANgIAIAFBDGtBADYCACACQRlJDQAgAEEANgIYIABBADYCFCAAQQA2AhAgAEEANgIMIAFBEGtBADYCACABQRRrQQA2AgAgAUEYa0EANgIAIAFBHGtBADYCACACIABBBHFBGHIiAmsiAUEgSQ0AIAAgAmohAANAIABCADcDGCAAQgA3AxAgAEIANwMIIABCADcDACAAQSBqIQAgAUEgayIBQR9LDQALCwtWAQF/AkAgACgCDA0AAkACQAJAAkAgAC0ALw4DAQADAgsgACgCOCIBRQ0AIAEoAiwiAUUNACAAIAERAAAiAQ0DC0EADwsACyAAQcMWNgIQQQ4hAQsgAQsaACAAKAIMRQRAIABB0Rs2AhAgAEEVNgIMCwsUACAAKAIMQRVGBEAgAEEANgIMCwsUACAAKAIMQRZGBEAgAEEANgIMCwsHACAAKAIMCwcAIAAoAhALCQAgACABNgIQCwcAIAAoAhQLFwAgAEEkTwRAAAsgAEECdEGgM2ooAgALFwAgAEEuTwRAAAsgAEECdEGwNGooAgALvwkBAX9B6yghAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==', 'base64');
+	return llhttp_simdWasm;
+}
+
+var constants$3;
+var hasRequiredConstants$3;
+
+function requireConstants$3 () {
+	if (hasRequiredConstants$3) return constants$3;
+	hasRequiredConstants$3 = 1;
+
+	const corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST']);
+	const corsSafeListedMethodsSet = new Set(corsSafeListedMethods);
+
+	const nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304]);
+
+	const redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308]);
+	const redirectStatusSet = new Set(redirectStatus);
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#block-bad-port
+	 */
+	const badPorts = /** @type {const} */ ([
+	  '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',
+	  '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',
+	  '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',
+	  '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',
+	  '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679',
+	  '6697', '10080'
+	]);
+	const badPortsSet = new Set(badPorts);
+
+	/**
+	 * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
+	 */
+	const referrerPolicy = /** @type {const} */ ([
+	  '',
+	  'no-referrer',
+	  'no-referrer-when-downgrade',
+	  'same-origin',
+	  'origin',
+	  'strict-origin',
+	  'origin-when-cross-origin',
+	  'strict-origin-when-cross-origin',
+	  'unsafe-url'
+	]);
+	const referrerPolicySet = new Set(referrerPolicy);
+
+	const requestRedirect = /** @type {const} */ (['follow', 'manual', 'error']);
+
+	const safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE']);
+	const safeMethodsSet = new Set(safeMethods);
+
+	const requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors']);
+
+	const requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include']);
+
+	const requestCache = /** @type {const} */ ([
+	  'default',
+	  'no-store',
+	  'reload',
+	  'no-cache',
+	  'force-cache',
+	  'only-if-cached'
+	]);
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#request-body-header-name
+	 */
+	const requestBodyHeader = /** @type {const} */ ([
+	  'content-encoding',
+	  'content-language',
+	  'content-location',
+	  'content-type',
+	  // See https://github.com/nodejs/undici/issues/2021
+	  // 'Content-Length' is a forbidden header name, which is typically
+	  // removed in the Headers implementation. However, undici doesn't
+	  // filter out headers, so we add it here.
+	  'content-length'
+	]);
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex
+	 */
+	const requestDuplex = /** @type {const} */ ([
+	  'half'
+	]);
+
+	/**
+	 * @see http://fetch.spec.whatwg.org/#forbidden-method
+	 */
+	const forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK']);
+	const forbiddenMethodsSet = new Set(forbiddenMethods);
+
+	const subresource = /** @type {const} */ ([
+	  'audio',
+	  'audioworklet',
+	  'font',
+	  'image',
+	  'manifest',
+	  'paintworklet',
+	  'script',
+	  'style',
+	  'track',
+	  'video',
+	  'xslt',
+	  ''
+	]);
+	const subresourceSet = new Set(subresource);
+
+	constants$3 = {
+	  subresource,
+	  forbiddenMethods,
+	  requestBodyHeader,
+	  referrerPolicy,
+	  requestRedirect,
+	  requestMode,
+	  requestCredentials,
+	  requestCache,
+	  redirectStatus,
+	  corsSafeListedMethods,
+	  nullBodyStatus,
+	  safeMethods,
+	  badPorts,
+	  requestDuplex,
+	  subresourceSet,
+	  badPortsSet,
+	  redirectStatusSet,
+	  corsSafeListedMethodsSet,
+	  safeMethodsSet,
+	  forbiddenMethodsSet,
+	  referrerPolicySet
+	};
+	return constants$3;
+}
+
+var global$2;
+var hasRequiredGlobal$1;
+
+function requireGlobal$1 () {
+	if (hasRequiredGlobal$1) return global$2;
+	hasRequiredGlobal$1 = 1;
+
+	// In case of breaking changes, increase the version
+	// number to avoid conflicts.
+	const globalOrigin = Symbol.for('undici.globalOrigin.1');
+
+	function getGlobalOrigin () {
+	  return globalThis[globalOrigin]
+	}
+
+	function setGlobalOrigin (newOrigin) {
+	  if (newOrigin === undefined) {
+	    Object.defineProperty(globalThis, globalOrigin, {
+	      value: undefined,
+	      writable: true,
+	      enumerable: false,
+	      configurable: false
+	    });
+
+	    return
+	  }
+
+	  const parsedURL = new URL(newOrigin);
+
+	  if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {
+	    throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)
+	  }
+
+	  Object.defineProperty(globalThis, globalOrigin, {
+	    value: parsedURL,
+	    writable: true,
+	    enumerable: false,
+	    configurable: false
+	  });
+	}
+
+	global$2 = {
+	  getGlobalOrigin,
+	  setGlobalOrigin
+	};
+	return global$2;
+}
+
+var dataUrl;
+var hasRequiredDataUrl;
+
+function requireDataUrl () {
+	if (hasRequiredDataUrl) return dataUrl;
+	hasRequiredDataUrl = 1;
+
+	const assert = require$$0$7;
+
+	const encoder = new TextEncoder();
+
+	/**
+	 * @see https://mimesniff.spec.whatwg.org/#http-token-code-point
+	 */
+	const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+\-.^_|~A-Za-z0-9]+$/;
+	const HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; // eslint-disable-line
+	const ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; // eslint-disable-line
+	/**
+	 * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point
+	 */
+	const HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/; // eslint-disable-line
+
+	// https://fetch.spec.whatwg.org/#data-url-processor
+	/** @param {URL} dataURL */
+	function dataURLProcessor (dataURL) {
+	  // 1. Assert: dataURL’s scheme is "data".
+	  assert(dataURL.protocol === 'data:');
+
+	  // 2. Let input be the result of running the URL
+	  // serializer on dataURL with exclude fragment
+	  // set to true.
+	  let input = URLSerializer(dataURL, true);
+
+	  // 3. Remove the leading "data:" string from input.
+	  input = input.slice(5);
+
+	  // 4. Let position point at the start of input.
+	  const position = { position: 0 };
+
+	  // 5. Let mimeType be the result of collecting a
+	  // sequence of code points that are not equal
+	  // to U+002C (,), given position.
+	  let mimeType = collectASequenceOfCodePointsFast(
+	    ',',
+	    input,
+	    position
+	  );
+
+	  // 6. Strip leading and trailing ASCII whitespace
+	  // from mimeType.
+	  // Undici implementation note: we need to store the
+	  // length because if the mimetype has spaces removed,
+	  // the wrong amount will be sliced from the input in
+	  // step #9
+	  const mimeTypeLength = mimeType.length;
+	  mimeType = removeASCIIWhitespace(mimeType, true, true);
+
+	  // 7. If position is past the end of input, then
+	  // return failure
+	  if (position.position >= input.length) {
+	    return 'failure'
+	  }
+
+	  // 8. Advance position by 1.
+	  position.position++;
+
+	  // 9. Let encodedBody be the remainder of input.
+	  const encodedBody = input.slice(mimeTypeLength + 1);
+
+	  // 10. Let body be the percent-decoding of encodedBody.
+	  let body = stringPercentDecode(encodedBody);
+
+	  // 11. If mimeType ends with U+003B (;), followed by
+	  // zero or more U+0020 SPACE, followed by an ASCII
+	  // case-insensitive match for "base64", then:
+	  if (/;(\u0020){0,}base64$/i.test(mimeType)) {
+	    // 1. Let stringBody be the isomorphic decode of body.
+	    const stringBody = isomorphicDecode(body);
+
+	    // 2. Set body to the forgiving-base64 decode of
+	    // stringBody.
+	    body = forgivingBase64(stringBody);
+
+	    // 3. If body is failure, then return failure.
+	    if (body === 'failure') {
+	      return 'failure'
+	    }
+
+	    // 4. Remove the last 6 code points from mimeType.
+	    mimeType = mimeType.slice(0, -6);
+
+	    // 5. Remove trailing U+0020 SPACE code points from mimeType,
+	    // if any.
+	    mimeType = mimeType.replace(/(\u0020)+$/, '');
+
+	    // 6. Remove the last U+003B (;) code point from mimeType.
+	    mimeType = mimeType.slice(0, -1);
+	  }
+
+	  // 12. If mimeType starts with U+003B (;), then prepend
+	  // "text/plain" to mimeType.
+	  if (mimeType.startsWith(';')) {
+	    mimeType = 'text/plain' + mimeType;
+	  }
+
+	  // 13. Let mimeTypeRecord be the result of parsing
+	  // mimeType.
+	  let mimeTypeRecord = parseMIMEType(mimeType);
+
+	  // 14. If mimeTypeRecord is failure, then set
+	  // mimeTypeRecord to text/plain;charset=US-ASCII.
+	  if (mimeTypeRecord === 'failure') {
+	    mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII');
+	  }
+
+	  // 15. Return a new data: URL struct whose MIME
+	  // type is mimeTypeRecord and body is body.
+	  // https://fetch.spec.whatwg.org/#data-url-struct
+	  return { mimeType: mimeTypeRecord, body }
+	}
+
+	// https://url.spec.whatwg.org/#concept-url-serializer
+	/**
+	 * @param {URL} url
+	 * @param {boolean} excludeFragment
+	 */
+	function URLSerializer (url, excludeFragment = false) {
+	  if (!excludeFragment) {
+	    return url.href
+	  }
+
+	  const href = url.href;
+	  const hashLength = url.hash.length;
+
+	  const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength);
+
+	  if (!hashLength && href.endsWith('#')) {
+	    return serialized.slice(0, -1)
+	  }
+
+	  return serialized
+	}
+
+	// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points
+	/**
+	 * @param {(char: string) => boolean} condition
+	 * @param {string} input
+	 * @param {{ position: number }} position
+	 */
+	function collectASequenceOfCodePoints (condition, input, position) {
+	  // 1. Let result be the empty string.
+	  let result = '';
+
+	  // 2. While position doesn’t point past the end of input and the
+	  // code point at position within input meets the condition condition:
+	  while (position.position < input.length && condition(input[position.position])) {
+	    // 1. Append that code point to the end of result.
+	    result += input[position.position];
+
+	    // 2. Advance position by 1.
+	    position.position++;
+	  }
+
+	  // 3. Return result.
+	  return result
+	}
+
+	/**
+	 * A faster collectASequenceOfCodePoints that only works when comparing a single character.
+	 * @param {string} char
+	 * @param {string} input
+	 * @param {{ position: number }} position
+	 */
+	function collectASequenceOfCodePointsFast (char, input, position) {
+	  const idx = input.indexOf(char, position.position);
+	  const start = position.position;
+
+	  if (idx === -1) {
+	    position.position = input.length;
+	    return input.slice(start)
+	  }
+
+	  position.position = idx;
+	  return input.slice(start, position.position)
+	}
+
+	// https://url.spec.whatwg.org/#string-percent-decode
+	/** @param {string} input */
+	function stringPercentDecode (input) {
+	  // 1. Let bytes be the UTF-8 encoding of input.
+	  const bytes = encoder.encode(input);
+
+	  // 2. Return the percent-decoding of bytes.
+	  return percentDecode(bytes)
+	}
+
+	/**
+	 * @param {number} byte
+	 */
+	function isHexCharByte (byte) {
+	  // 0-9 A-F a-f
+	  return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66)
+	}
+
+	/**
+	 * @param {number} byte
+	 */
+	function hexByteToNumber (byte) {
+	  return (
+	    // 0-9
+	    byte >= 0x30 && byte <= 0x39
+	      ? (byte - 48)
+	    // Convert to uppercase
+	    // ((byte & 0xDF) - 65) + 10
+	      : ((byte & 0xDF) - 55)
+	  )
+	}
+
+	// https://url.spec.whatwg.org/#percent-decode
+	/** @param {Uint8Array} input */
+	function percentDecode (input) {
+	  const length = input.length;
+	  // 1. Let output be an empty byte sequence.
+	  /** @type {Uint8Array} */
+	  const output = new Uint8Array(length);
+	  let j = 0;
+	  // 2. For each byte byte in input:
+	  for (let i = 0; i < length; ++i) {
+	    const byte = input[i];
+
+	    // 1. If byte is not 0x25 (%), then append byte to output.
+	    if (byte !== 0x25) {
+	      output[j++] = byte;
+
+	    // 2. Otherwise, if byte is 0x25 (%) and the next two bytes
+	    // after byte in input are not in the ranges
+	    // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),
+	    // and 0x61 (a) to 0x66 (f), all inclusive, append byte
+	    // to output.
+	    } else if (
+	      byte === 0x25 &&
+	      !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))
+	    ) {
+	      output[j++] = 0x25;
+
+	    // 3. Otherwise:
+	    } else {
+	      // 1. Let bytePoint be the two bytes after byte in input,
+	      // decoded, and then interpreted as hexadecimal number.
+	      // 2. Append a byte whose value is bytePoint to output.
+	      output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2]);
+
+	      // 3. Skip the next two bytes in input.
+	      i += 2;
+	    }
+	  }
+
+	  // 3. Return output.
+	  return length === j ? output : output.subarray(0, j)
+	}
+
+	// https://mimesniff.spec.whatwg.org/#parse-a-mime-type
+	/** @param {string} input */
+	function parseMIMEType (input) {
+	  // 1. Remove any leading and trailing HTTP whitespace
+	  // from input.
+	  input = removeHTTPWhitespace(input, true, true);
+
+	  // 2. Let position be a position variable for input,
+	  // initially pointing at the start of input.
+	  const position = { position: 0 };
+
+	  // 3. Let type be the result of collecting a sequence
+	  // of code points that are not U+002F (/) from
+	  // input, given position.
+	  const type = collectASequenceOfCodePointsFast(
+	    '/',
+	    input,
+	    position
+	  );
+
+	  // 4. If type is the empty string or does not solely
+	  // contain HTTP token code points, then return failure.
+	  // https://mimesniff.spec.whatwg.org/#http-token-code-point
+	  if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {
+	    return 'failure'
+	  }
+
+	  // 5. If position is past the end of input, then return
+	  // failure
+	  if (position.position > input.length) {
+	    return 'failure'
+	  }
+
+	  // 6. Advance position by 1. (This skips past U+002F (/).)
+	  position.position++;
+
+	  // 7. Let subtype be the result of collecting a sequence of
+	  // code points that are not U+003B (;) from input, given
+	  // position.
+	  let subtype = collectASequenceOfCodePointsFast(
+	    ';',
+	    input,
+	    position
+	  );
+
+	  // 8. Remove any trailing HTTP whitespace from subtype.
+	  subtype = removeHTTPWhitespace(subtype, false, true);
+
+	  // 9. If subtype is the empty string or does not solely
+	  // contain HTTP token code points, then return failure.
+	  if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {
+	    return 'failure'
+	  }
+
+	  const typeLowercase = type.toLowerCase();
+	  const subtypeLowercase = subtype.toLowerCase();
+
+	  // 10. Let mimeType be a new MIME type record whose type
+	  // is type, in ASCII lowercase, and subtype is subtype,
+	  // in ASCII lowercase.
+	  // https://mimesniff.spec.whatwg.org/#mime-type
+	  const mimeType = {
+	    type: typeLowercase,
+	    subtype: subtypeLowercase,
+	    /** @type {Map} */
+	    parameters: new Map(),
+	    // https://mimesniff.spec.whatwg.org/#mime-type-essence
+	    essence: `${typeLowercase}/${subtypeLowercase}`
+	  };
+
+	  // 11. While position is not past the end of input:
+	  while (position.position < input.length) {
+	    // 1. Advance position by 1. (This skips past U+003B (;).)
+	    position.position++;
+
+	    // 2. Collect a sequence of code points that are HTTP
+	    // whitespace from input given position.
+	    collectASequenceOfCodePoints(
+	      // https://fetch.spec.whatwg.org/#http-whitespace
+	      char => HTTP_WHITESPACE_REGEX.test(char),
+	      input,
+	      position
+	    );
+
+	    // 3. Let parameterName be the result of collecting a
+	    // sequence of code points that are not U+003B (;)
+	    // or U+003D (=) from input, given position.
+	    let parameterName = collectASequenceOfCodePoints(
+	      (char) => char !== ';' && char !== '=',
+	      input,
+	      position
+	    );
+
+	    // 4. Set parameterName to parameterName, in ASCII
+	    // lowercase.
+	    parameterName = parameterName.toLowerCase();
+
+	    // 5. If position is not past the end of input, then:
+	    if (position.position < input.length) {
+	      // 1. If the code point at position within input is
+	      // U+003B (;), then continue.
+	      if (input[position.position] === ';') {
+	        continue
+	      }
+
+	      // 2. Advance position by 1. (This skips past U+003D (=).)
+	      position.position++;
+	    }
+
+	    // 6. If position is past the end of input, then break.
+	    if (position.position > input.length) {
+	      break
+	    }
+
+	    // 7. Let parameterValue be null.
+	    let parameterValue = null;
+
+	    // 8. If the code point at position within input is
+	    // U+0022 ("), then:
+	    if (input[position.position] === '"') {
+	      // 1. Set parameterValue to the result of collecting
+	      // an HTTP quoted string from input, given position
+	      // and the extract-value flag.
+	      parameterValue = collectAnHTTPQuotedString(input, position, true);
+
+	      // 2. Collect a sequence of code points that are not
+	      // U+003B (;) from input, given position.
+	      collectASequenceOfCodePointsFast(
+	        ';',
+	        input,
+	        position
+	      );
+
+	    // 9. Otherwise:
+	    } else {
+	      // 1. Set parameterValue to the result of collecting
+	      // a sequence of code points that are not U+003B (;)
+	      // from input, given position.
+	      parameterValue = collectASequenceOfCodePointsFast(
+	        ';',
+	        input,
+	        position
+	      );
+
+	      // 2. Remove any trailing HTTP whitespace from parameterValue.
+	      parameterValue = removeHTTPWhitespace(parameterValue, false, true);
+
+	      // 3. If parameterValue is the empty string, then continue.
+	      if (parameterValue.length === 0) {
+	        continue
+	      }
+	    }
+
+	    // 10. If all of the following are true
+	    // - parameterName is not the empty string
+	    // - parameterName solely contains HTTP token code points
+	    // - parameterValue solely contains HTTP quoted-string token code points
+	    // - mimeType’s parameters[parameterName] does not exist
+	    // then set mimeType’s parameters[parameterName] to parameterValue.
+	    if (
+	      parameterName.length !== 0 &&
+	      HTTP_TOKEN_CODEPOINTS.test(parameterName) &&
+	      (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&
+	      !mimeType.parameters.has(parameterName)
+	    ) {
+	      mimeType.parameters.set(parameterName, parameterValue);
+	    }
+	  }
+
+	  // 12. Return mimeType.
+	  return mimeType
+	}
+
+	// https://infra.spec.whatwg.org/#forgiving-base64-decode
+	/** @param {string} data */
+	function forgivingBase64 (data) {
+	  // 1. Remove all ASCII whitespace from data.
+	  data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, '');  // eslint-disable-line
+
+	  let dataLength = data.length;
+	  // 2. If data’s code point length divides by 4 leaving
+	  // no remainder, then:
+	  if (dataLength % 4 === 0) {
+	    // 1. If data ends with one or two U+003D (=) code points,
+	    // then remove them from data.
+	    if (data.charCodeAt(dataLength - 1) === 0x003D) {
+	      --dataLength;
+	      if (data.charCodeAt(dataLength - 1) === 0x003D) {
+	        --dataLength;
+	      }
+	    }
+	  }
+
+	  // 3. If data’s code point length divides by 4 leaving
+	  // a remainder of 1, then return failure.
+	  if (dataLength % 4 === 1) {
+	    return 'failure'
+	  }
+
+	  // 4. If data contains a code point that is not one of
+	  //  U+002B (+)
+	  //  U+002F (/)
+	  //  ASCII alphanumeric
+	  // then return failure.
+	  if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) {
+	    return 'failure'
+	  }
+
+	  const buffer = Buffer.from(data, 'base64');
+	  return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)
+	}
+
+	// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string
+	// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string
+	/**
+	 * @param {string} input
+	 * @param {{ position: number }} position
+	 * @param {boolean?} extractValue
+	 */
+	function collectAnHTTPQuotedString (input, position, extractValue) {
+	  // 1. Let positionStart be position.
+	  const positionStart = position.position;
+
+	  // 2. Let value be the empty string.
+	  let value = '';
+
+	  // 3. Assert: the code point at position within input
+	  // is U+0022 (").
+	  assert(input[position.position] === '"');
+
+	  // 4. Advance position by 1.
+	  position.position++;
+
+	  // 5. While true:
+	  while (true) {
+	    // 1. Append the result of collecting a sequence of code points
+	    // that are not U+0022 (") or U+005C (\) from input, given
+	    // position, to value.
+	    value += collectASequenceOfCodePoints(
+	      (char) => char !== '"' && char !== '\\',
+	      input,
+	      position
+	    );
+
+	    // 2. If position is past the end of input, then break.
+	    if (position.position >= input.length) {
+	      break
+	    }
+
+	    // 3. Let quoteOrBackslash be the code point at position within
+	    // input.
+	    const quoteOrBackslash = input[position.position];
+
+	    // 4. Advance position by 1.
+	    position.position++;
+
+	    // 5. If quoteOrBackslash is U+005C (\), then:
+	    if (quoteOrBackslash === '\\') {
+	      // 1. If position is past the end of input, then append
+	      // U+005C (\) to value and break.
+	      if (position.position >= input.length) {
+	        value += '\\';
+	        break
+	      }
+
+	      // 2. Append the code point at position within input to value.
+	      value += input[position.position];
+
+	      // 3. Advance position by 1.
+	      position.position++;
+
+	    // 6. Otherwise:
+	    } else {
+	      // 1. Assert: quoteOrBackslash is U+0022 (").
+	      assert(quoteOrBackslash === '"');
+
+	      // 2. Break.
+	      break
+	    }
+	  }
+
+	  // 6. If the extract-value flag is set, then return value.
+	  if (extractValue) {
+	    return value
+	  }
+
+	  // 7. Return the code points from positionStart to position,
+	  // inclusive, within input.
+	  return input.slice(positionStart, position.position)
+	}
+
+	/**
+	 * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type
+	 */
+	function serializeAMimeType (mimeType) {
+	  assert(mimeType !== 'failure');
+	  const { parameters, essence } = mimeType;
+
+	  // 1. Let serialization be the concatenation of mimeType’s
+	  //    type, U+002F (/), and mimeType’s subtype.
+	  let serialization = essence;
+
+	  // 2. For each name → value of mimeType’s parameters:
+	  for (let [name, value] of parameters.entries()) {
+	    // 1. Append U+003B (;) to serialization.
+	    serialization += ';';
+
+	    // 2. Append name to serialization.
+	    serialization += name;
+
+	    // 3. Append U+003D (=) to serialization.
+	    serialization += '=';
+
+	    // 4. If value does not solely contain HTTP token code
+	    //    points or value is the empty string, then:
+	    if (!HTTP_TOKEN_CODEPOINTS.test(value)) {
+	      // 1. Precede each occurrence of U+0022 (") or
+	      //    U+005C (\) in value with U+005C (\).
+	      value = value.replace(/(\\|")/g, '\\$1');
+
+	      // 2. Prepend U+0022 (") to value.
+	      value = '"' + value;
+
+	      // 3. Append U+0022 (") to value.
+	      value += '"';
+	    }
+
+	    // 5. Append value to serialization.
+	    serialization += value;
+	  }
+
+	  // 3. Return serialization.
+	  return serialization
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#http-whitespace
+	 * @param {number} char
+	 */
+	function isHTTPWhiteSpace (char) {
+	  // "\r\n\t "
+	  return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#http-whitespace
+	 * @param {string} str
+	 * @param {boolean} [leading=true]
+	 * @param {boolean} [trailing=true]
+	 */
+	function removeHTTPWhitespace (str, leading = true, trailing = true) {
+	  return removeChars(str, leading, trailing, isHTTPWhiteSpace)
+	}
+
+	/**
+	 * @see https://infra.spec.whatwg.org/#ascii-whitespace
+	 * @param {number} char
+	 */
+	function isASCIIWhitespace (char) {
+	  // "\r\n\t\f "
+	  return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x00c || char === 0x020
+	}
+
+	/**
+	 * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace
+	 * @param {string} str
+	 * @param {boolean} [leading=true]
+	 * @param {boolean} [trailing=true]
+	 */
+	function removeASCIIWhitespace (str, leading = true, trailing = true) {
+	  return removeChars(str, leading, trailing, isASCIIWhitespace)
+	}
+
+	/**
+	 * @param {string} str
+	 * @param {boolean} leading
+	 * @param {boolean} trailing
+	 * @param {(charCode: number) => boolean} predicate
+	 * @returns
+	 */
+	function removeChars (str, leading, trailing, predicate) {
+	  let lead = 0;
+	  let trail = str.length - 1;
+
+	  if (leading) {
+	    while (lead < str.length && predicate(str.charCodeAt(lead))) lead++;
+	  }
+
+	  if (trailing) {
+	    while (trail > 0 && predicate(str.charCodeAt(trail))) trail--;
+	  }
+
+	  return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1)
+	}
+
+	/**
+	 * @see https://infra.spec.whatwg.org/#isomorphic-decode
+	 * @param {Uint8Array} input
+	 * @returns {string}
+	 */
+	function isomorphicDecode (input) {
+	  // 1. To isomorphic decode a byte sequence input, return a string whose code point
+	  //    length is equal to input’s length and whose code points have the same values
+	  //    as the values of input’s bytes, in the same order.
+	  const length = input.length;
+	  if ((2 << 15) - 1 > length) {
+	    return String.fromCharCode.apply(null, input)
+	  }
+	  let result = ''; let i = 0;
+	  let addition = (2 << 15) - 1;
+	  while (i < length) {
+	    if (i + addition > length) {
+	      addition = length - i;
+	    }
+	    result += String.fromCharCode.apply(null, input.subarray(i, i += addition));
+	  }
+	  return result
+	}
+
+	/**
+	 * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type
+	 * @param {Exclude, 'failure'>} mimeType
+	 */
+	function minimizeSupportedMimeType (mimeType) {
+	  switch (mimeType.essence) {
+	    case 'application/ecmascript':
+	    case 'application/javascript':
+	    case 'application/x-ecmascript':
+	    case 'application/x-javascript':
+	    case 'text/ecmascript':
+	    case 'text/javascript':
+	    case 'text/javascript1.0':
+	    case 'text/javascript1.1':
+	    case 'text/javascript1.2':
+	    case 'text/javascript1.3':
+	    case 'text/javascript1.4':
+	    case 'text/javascript1.5':
+	    case 'text/jscript':
+	    case 'text/livescript':
+	    case 'text/x-ecmascript':
+	    case 'text/x-javascript':
+	      // 1. If mimeType is a JavaScript MIME type, then return "text/javascript".
+	      return 'text/javascript'
+	    case 'application/json':
+	    case 'text/json':
+	      // 2. If mimeType is a JSON MIME type, then return "application/json".
+	      return 'application/json'
+	    case 'image/svg+xml':
+	      // 3. If mimeType’s essence is "image/svg+xml", then return "image/svg+xml".
+	      return 'image/svg+xml'
+	    case 'text/xml':
+	    case 'application/xml':
+	      // 4. If mimeType is an XML MIME type, then return "application/xml".
+	      return 'application/xml'
+	  }
+
+	  // 2. If mimeType is a JSON MIME type, then return "application/json".
+	  if (mimeType.subtype.endsWith('+json')) {
+	    return 'application/json'
+	  }
+
+	  // 4. If mimeType is an XML MIME type, then return "application/xml".
+	  if (mimeType.subtype.endsWith('+xml')) {
+	    return 'application/xml'
+	  }
+
+	  // 5. If mimeType is supported by the user agent, then return mimeType’s essence.
+	  // Technically, node doesn't support any mimetypes.
+
+	  // 6. Return the empty string.
+	  return ''
+	}
+
+	dataUrl = {
+	  dataURLProcessor,
+	  URLSerializer,
+	  collectASequenceOfCodePoints,
+	  collectASequenceOfCodePointsFast,
+	  stringPercentDecode,
+	  parseMIMEType,
+	  collectAnHTTPQuotedString,
+	  serializeAMimeType,
+	  removeChars,
+	  removeHTTPWhitespace,
+	  minimizeSupportedMimeType,
+	  HTTP_TOKEN_CODEPOINTS,
+	  isomorphicDecode
+	};
+	return dataUrl;
+}
+
+var webidl_1;
+var hasRequiredWebidl;
+
+function requireWebidl () {
+	if (hasRequiredWebidl) return webidl_1;
+	hasRequiredWebidl = 1;
+
+	const { types, inspect } = require$$0$a;
+	const { markAsUncloneable } = require$$1$3;
+	const { toUSVString } = requireUtil$7();
+
+	/** @type {import('../../../types/webidl').Webidl} */
+	const webidl = {};
+	webidl.converters = {};
+	webidl.util = {};
+	webidl.errors = {};
+
+	webidl.errors.exception = function (message) {
+	  return new TypeError(`${message.header}: ${message.message}`)
+	};
+
+	webidl.errors.conversionFailed = function (context) {
+	  const plural = context.types.length === 1 ? '' : ' one of';
+	  const message =
+	    `${context.argument} could not be converted to` +
+	    `${plural}: ${context.types.join(', ')}.`;
+
+	  return webidl.errors.exception({
+	    header: context.prefix,
+	    message
+	  })
+	};
+
+	webidl.errors.invalidArgument = function (context) {
+	  return webidl.errors.exception({
+	    header: context.prefix,
+	    message: `"${context.value}" is an invalid ${context.type}.`
+	  })
+	};
+
+	// https://webidl.spec.whatwg.org/#implements
+	webidl.brandCheck = function (V, I, opts) {
+	  if (opts?.strict !== false) {
+	    if (!(V instanceof I)) {
+	      const err = new TypeError('Illegal invocation');
+	      err.code = 'ERR_INVALID_THIS'; // node compat.
+	      throw err
+	    }
+	  } else {
+	    if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) {
+	      const err = new TypeError('Illegal invocation');
+	      err.code = 'ERR_INVALID_THIS'; // node compat.
+	      throw err
+	    }
+	  }
+	};
+
+	webidl.argumentLengthCheck = function ({ length }, min, ctx) {
+	  if (length < min) {
+	    throw webidl.errors.exception({
+	      message: `${min} argument${min !== 1 ? 's' : ''} required, ` +
+	               `but${length ? ' only' : ''} ${length} found.`,
+	      header: ctx
+	    })
+	  }
+	};
+
+	webidl.illegalConstructor = function () {
+	  throw webidl.errors.exception({
+	    header: 'TypeError',
+	    message: 'Illegal constructor'
+	  })
+	};
+
+	// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values
+	webidl.util.Type = function (V) {
+	  switch (typeof V) {
+	    case 'undefined': return 'Undefined'
+	    case 'boolean': return 'Boolean'
+	    case 'string': return 'String'
+	    case 'symbol': return 'Symbol'
+	    case 'number': return 'Number'
+	    case 'bigint': return 'BigInt'
+	    case 'function':
+	    case 'object': {
+	      if (V === null) {
+	        return 'Null'
+	      }
+
+	      return 'Object'
+	    }
+	  }
+	};
+
+	webidl.util.markAsUncloneable = markAsUncloneable || (() => {});
+	// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint
+	webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
+	  let upperBound;
+	  let lowerBound;
+
+	  // 1. If bitLength is 64, then:
+	  if (bitLength === 64) {
+	    // 1. Let upperBound be 2^53 − 1.
+	    upperBound = Math.pow(2, 53) - 1;
+
+	    // 2. If signedness is "unsigned", then let lowerBound be 0.
+	    if (signedness === 'unsigned') {
+	      lowerBound = 0;
+	    } else {
+	      // 3. Otherwise let lowerBound be −2^53 + 1.
+	      lowerBound = Math.pow(-2, 53) + 1;
+	    }
+	  } else if (signedness === 'unsigned') {
+	    // 2. Otherwise, if signedness is "unsigned", then:
+
+	    // 1. Let lowerBound be 0.
+	    lowerBound = 0;
+
+	    // 2. Let upperBound be 2^bitLength − 1.
+	    upperBound = Math.pow(2, bitLength) - 1;
+	  } else {
+	    // 3. Otherwise:
+
+	    // 1. Let lowerBound be -2^bitLength − 1.
+	    lowerBound = Math.pow(-2, bitLength) - 1;
+
+	    // 2. Let upperBound be 2^bitLength − 1 − 1.
+	    upperBound = Math.pow(2, bitLength - 1) - 1;
+	  }
+
+	  // 4. Let x be ? ToNumber(V).
+	  let x = Number(V);
+
+	  // 5. If x is −0, then set x to +0.
+	  if (x === 0) {
+	    x = 0;
+	  }
+
+	  // 6. If the conversion is to an IDL type associated
+	  //    with the [EnforceRange] extended attribute, then:
+	  if (opts?.enforceRange === true) {
+	    // 1. If x is NaN, +∞, or −∞, then throw a TypeError.
+	    if (
+	      Number.isNaN(x) ||
+	      x === Number.POSITIVE_INFINITY ||
+	      x === Number.NEGATIVE_INFINITY
+	    ) {
+	      throw webidl.errors.exception({
+	        header: 'Integer conversion',
+	        message: `Could not convert ${webidl.util.Stringify(V)} to an integer.`
+	      })
+	    }
+
+	    // 2. Set x to IntegerPart(x).
+	    x = webidl.util.IntegerPart(x);
+
+	    // 3. If x < lowerBound or x > upperBound, then
+	    //    throw a TypeError.
+	    if (x < lowerBound || x > upperBound) {
+	      throw webidl.errors.exception({
+	        header: 'Integer conversion',
+	        message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`
+	      })
+	    }
+
+	    // 4. Return x.
+	    return x
+	  }
+
+	  // 7. If x is not NaN and the conversion is to an IDL
+	  //    type associated with the [Clamp] extended
+	  //    attribute, then:
+	  if (!Number.isNaN(x) && opts?.clamp === true) {
+	    // 1. Set x to min(max(x, lowerBound), upperBound).
+	    x = Math.min(Math.max(x, lowerBound), upperBound);
+
+	    // 2. Round x to the nearest integer, choosing the
+	    //    even integer if it lies halfway between two,
+	    //    and choosing +0 rather than −0.
+	    if (Math.floor(x) % 2 === 0) {
+	      x = Math.floor(x);
+	    } else {
+	      x = Math.ceil(x);
+	    }
+
+	    // 3. Return x.
+	    return x
+	  }
+
+	  // 8. If x is NaN, +0, +∞, or −∞, then return +0.
+	  if (
+	    Number.isNaN(x) ||
+	    (x === 0 && Object.is(0, x)) ||
+	    x === Number.POSITIVE_INFINITY ||
+	    x === Number.NEGATIVE_INFINITY
+	  ) {
+	    return 0
+	  }
+
+	  // 9. Set x to IntegerPart(x).
+	  x = webidl.util.IntegerPart(x);
+
+	  // 10. Set x to x modulo 2^bitLength.
+	  x = x % Math.pow(2, bitLength);
+
+	  // 11. If signedness is "signed" and x ≥ 2^bitLength − 1,
+	  //    then return x − 2^bitLength.
+	  if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {
+	    return x - Math.pow(2, bitLength)
+	  }
+
+	  // 12. Otherwise, return x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart
+	webidl.util.IntegerPart = function (n) {
+	  // 1. Let r be floor(abs(n)).
+	  const r = Math.floor(Math.abs(n));
+
+	  // 2. If n < 0, then return -1 × r.
+	  if (n < 0) {
+	    return -1 * r
+	  }
+
+	  // 3. Otherwise, return r.
+	  return r
+	};
+
+	webidl.util.Stringify = function (V) {
+	  const type = webidl.util.Type(V);
+
+	  switch (type) {
+	    case 'Symbol':
+	      return `Symbol(${V.description})`
+	    case 'Object':
+	      return inspect(V)
+	    case 'String':
+	      return `"${V}"`
+	    default:
+	      return `${V}`
+	  }
+	};
+
+	// https://webidl.spec.whatwg.org/#es-sequence
+	webidl.sequenceConverter = function (converter) {
+	  return (V, prefix, argument, Iterable) => {
+	    // 1. If Type(V) is not Object, throw a TypeError.
+	    if (webidl.util.Type(V) !== 'Object') {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.`
+	      })
+	    }
+
+	    // 2. Let method be ? GetMethod(V, @@iterator).
+	    /** @type {Generator} */
+	    const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.();
+	    const seq = [];
+	    let index = 0;
+
+	    // 3. If method is undefined, throw a TypeError.
+	    if (
+	      method === undefined ||
+	      typeof method.next !== 'function'
+	    ) {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: `${argument} is not iterable.`
+	      })
+	    }
+
+	    // https://webidl.spec.whatwg.org/#create-sequence-from-iterable
+	    while (true) {
+	      const { done, value } = method.next();
+
+	      if (done) {
+	        break
+	      }
+
+	      seq.push(converter(value, prefix, `${argument}[${index++}]`));
+	    }
+
+	    return seq
+	  }
+	};
+
+	// https://webidl.spec.whatwg.org/#es-to-record
+	webidl.recordConverter = function (keyConverter, valueConverter) {
+	  return (O, prefix, argument) => {
+	    // 1. If Type(O) is not Object, throw a TypeError.
+	    if (webidl.util.Type(O) !== 'Object') {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: `${argument} ("${webidl.util.Type(O)}") is not an Object.`
+	      })
+	    }
+
+	    // 2. Let result be a new empty instance of record.
+	    const result = {};
+
+	    if (!types.isProxy(O)) {
+	      // 1. Let desc be ? O.[[GetOwnProperty]](key).
+	      const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)];
+
+	      for (const key of keys) {
+	        // 1. Let typedKey be key converted to an IDL value of type K.
+	        const typedKey = keyConverter(key, prefix, argument);
+
+	        // 2. Let value be ? Get(O, key).
+	        // 3. Let typedValue be value converted to an IDL value of type V.
+	        const typedValue = valueConverter(O[key], prefix, argument);
+
+	        // 4. Set result[typedKey] to typedValue.
+	        result[typedKey] = typedValue;
+	      }
+
+	      // 5. Return result.
+	      return result
+	    }
+
+	    // 3. Let keys be ? O.[[OwnPropertyKeys]]().
+	    const keys = Reflect.ownKeys(O);
+
+	    // 4. For each key of keys.
+	    for (const key of keys) {
+	      // 1. Let desc be ? O.[[GetOwnProperty]](key).
+	      const desc = Reflect.getOwnPropertyDescriptor(O, key);
+
+	      // 2. If desc is not undefined and desc.[[Enumerable]] is true:
+	      if (desc?.enumerable) {
+	        // 1. Let typedKey be key converted to an IDL value of type K.
+	        const typedKey = keyConverter(key, prefix, argument);
+
+	        // 2. Let value be ? Get(O, key).
+	        // 3. Let typedValue be value converted to an IDL value of type V.
+	        const typedValue = valueConverter(O[key], prefix, argument);
+
+	        // 4. Set result[typedKey] to typedValue.
+	        result[typedKey] = typedValue;
+	      }
+	    }
+
+	    // 5. Return result.
+	    return result
+	  }
+	};
+
+	webidl.interfaceConverter = function (i) {
+	  return (V, prefix, argument, opts) => {
+	    if (opts?.strict !== false && !(V instanceof i)) {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.`
+	      })
+	    }
+
+	    return V
+	  }
+	};
+
+	webidl.dictionaryConverter = function (converters) {
+	  return (dictionary, prefix, argument) => {
+	    const type = webidl.util.Type(dictionary);
+	    const dict = {};
+
+	    if (type === 'Null' || type === 'Undefined') {
+	      return dict
+	    } else if (type !== 'Object') {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`
+	      })
+	    }
+
+	    for (const options of converters) {
+	      const { key, defaultValue, required, converter } = options;
+
+	      if (required === true) {
+	        if (!Object.hasOwn(dictionary, key)) {
+	          throw webidl.errors.exception({
+	            header: prefix,
+	            message: `Missing required key "${key}".`
+	          })
+	        }
+	      }
+
+	      let value = dictionary[key];
+	      const hasDefault = Object.hasOwn(options, 'defaultValue');
+
+	      // Only use defaultValue if value is undefined and
+	      // a defaultValue options was provided.
+	      if (hasDefault && value !== null) {
+	        value ??= defaultValue();
+	      }
+
+	      // A key can be optional and have no default value.
+	      // When this happens, do not perform a conversion,
+	      // and do not assign the key a value.
+	      if (required || hasDefault || value !== undefined) {
+	        value = converter(value, prefix, `${argument}.${key}`);
+
+	        if (
+	          options.allowedValues &&
+	          !options.allowedValues.includes(value)
+	        ) {
+	          throw webidl.errors.exception({
+	            header: prefix,
+	            message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`
+	          })
+	        }
+
+	        dict[key] = value;
+	      }
+	    }
+
+	    return dict
+	  }
+	};
+
+	webidl.nullableConverter = function (converter) {
+	  return (V, prefix, argument) => {
+	    if (V === null) {
+	      return V
+	    }
+
+	    return converter(V, prefix, argument)
+	  }
+	};
+
+	// https://webidl.spec.whatwg.org/#es-DOMString
+	webidl.converters.DOMString = function (V, prefix, argument, opts) {
+	  // 1. If V is null and the conversion is to an IDL type
+	  //    associated with the [LegacyNullToEmptyString]
+	  //    extended attribute, then return the DOMString value
+	  //    that represents the empty string.
+	  if (V === null && opts?.legacyNullToEmptyString) {
+	    return ''
+	  }
+
+	  // 2. Let x be ? ToString(V).
+	  if (typeof V === 'symbol') {
+	    throw webidl.errors.exception({
+	      header: prefix,
+	      message: `${argument} is a symbol, which cannot be converted to a DOMString.`
+	    })
+	  }
+
+	  // 3. Return the IDL DOMString value that represents the
+	  //    same sequence of code units as the one the
+	  //    ECMAScript String value x represents.
+	  return String(V)
+	};
+
+	// https://webidl.spec.whatwg.org/#es-ByteString
+	webidl.converters.ByteString = function (V, prefix, argument) {
+	  // 1. Let x be ? ToString(V).
+	  // Note: DOMString converter perform ? ToString(V)
+	  const x = webidl.converters.DOMString(V, prefix, argument);
+
+	  // 2. If the value of any element of x is greater than
+	  //    255, then throw a TypeError.
+	  for (let index = 0; index < x.length; index++) {
+	    if (x.charCodeAt(index) > 255) {
+	      throw new TypeError(
+	        'Cannot convert argument to a ByteString because the character at ' +
+	        `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`
+	      )
+	    }
+	  }
+
+	  // 3. Return an IDL ByteString value whose length is the
+	  //    length of x, and where the value of each element is
+	  //    the value of the corresponding element of x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#es-USVString
+	// TODO: rewrite this so we can control the errors thrown
+	webidl.converters.USVString = toUSVString;
+
+	// https://webidl.spec.whatwg.org/#es-boolean
+	webidl.converters.boolean = function (V) {
+	  // 1. Let x be the result of computing ToBoolean(V).
+	  const x = Boolean(V);
+
+	  // 2. Return the IDL boolean value that is the one that represents
+	  //    the same truth value as the ECMAScript Boolean value x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#es-any
+	webidl.converters.any = function (V) {
+	  return V
+	};
+
+	// https://webidl.spec.whatwg.org/#es-long-long
+	webidl.converters['long long'] = function (V, prefix, argument) {
+	  // 1. Let x be ? ConvertToInt(V, 64, "signed").
+	  const x = webidl.util.ConvertToInt(V, 64, 'signed', undefined, prefix, argument);
+
+	  // 2. Return the IDL long long value that represents
+	  //    the same numeric value as x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#es-unsigned-long-long
+	webidl.converters['unsigned long long'] = function (V, prefix, argument) {
+	  // 1. Let x be ? ConvertToInt(V, 64, "unsigned").
+	  const x = webidl.util.ConvertToInt(V, 64, 'unsigned', undefined, prefix, argument);
+
+	  // 2. Return the IDL unsigned long long value that
+	  //    represents the same numeric value as x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#es-unsigned-long
+	webidl.converters['unsigned long'] = function (V, prefix, argument) {
+	  // 1. Let x be ? ConvertToInt(V, 32, "unsigned").
+	  const x = webidl.util.ConvertToInt(V, 32, 'unsigned', undefined, prefix, argument);
+
+	  // 2. Return the IDL unsigned long value that
+	  //    represents the same numeric value as x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#es-unsigned-short
+	webidl.converters['unsigned short'] = function (V, prefix, argument, opts) {
+	  // 1. Let x be ? ConvertToInt(V, 16, "unsigned").
+	  const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts, prefix, argument);
+
+	  // 2. Return the IDL unsigned short value that represents
+	  //    the same numeric value as x.
+	  return x
+	};
+
+	// https://webidl.spec.whatwg.org/#idl-ArrayBuffer
+	webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
+	  // 1. If Type(V) is not Object, or V does not have an
+	  //    [[ArrayBufferData]] internal slot, then throw a
+	  //    TypeError.
+	  // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances
+	  // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances
+	  if (
+	    webidl.util.Type(V) !== 'Object' ||
+	    !types.isAnyArrayBuffer(V)
+	  ) {
+	    throw webidl.errors.conversionFailed({
+	      prefix,
+	      argument: `${argument} ("${webidl.util.Stringify(V)}")`,
+	      types: ['ArrayBuffer']
+	    })
+	  }
+
+	  // 2. If the conversion is not to an IDL type associated
+	  //    with the [AllowShared] extended attribute, and
+	  //    IsSharedArrayBuffer(V) is true, then throw a
+	  //    TypeError.
+	  if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) {
+	    throw webidl.errors.exception({
+	      header: 'ArrayBuffer',
+	      message: 'SharedArrayBuffer is not allowed.'
+	    })
+	  }
+
+	  // 3. If the conversion is not to an IDL type associated
+	  //    with the [AllowResizable] extended attribute, and
+	  //    IsResizableArrayBuffer(V) is true, then throw a
+	  //    TypeError.
+	  if (V.resizable || V.growable) {
+	    throw webidl.errors.exception({
+	      header: 'ArrayBuffer',
+	      message: 'Received a resizable ArrayBuffer.'
+	    })
+	  }
+
+	  // 4. Return the IDL ArrayBuffer value that is a
+	  //    reference to the same object as V.
+	  return V
+	};
+
+	webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
+	  // 1. Let T be the IDL type V is being converted to.
+
+	  // 2. If Type(V) is not Object, or V does not have a
+	  //    [[TypedArrayName]] internal slot with a value
+	  //    equal to T’s name, then throw a TypeError.
+	  if (
+	    webidl.util.Type(V) !== 'Object' ||
+	    !types.isTypedArray(V) ||
+	    V.constructor.name !== T.name
+	  ) {
+	    throw webidl.errors.conversionFailed({
+	      prefix,
+	      argument: `${name} ("${webidl.util.Stringify(V)}")`,
+	      types: [T.name]
+	    })
+	  }
+
+	  // 3. If the conversion is not to an IDL type associated
+	  //    with the [AllowShared] extended attribute, and
+	  //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is
+	  //    true, then throw a TypeError.
+	  if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
+	    throw webidl.errors.exception({
+	      header: 'ArrayBuffer',
+	      message: 'SharedArrayBuffer is not allowed.'
+	    })
+	  }
+
+	  // 4. If the conversion is not to an IDL type associated
+	  //    with the [AllowResizable] extended attribute, and
+	  //    IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
+	  //    true, then throw a TypeError.
+	  if (V.buffer.resizable || V.buffer.growable) {
+	    throw webidl.errors.exception({
+	      header: 'ArrayBuffer',
+	      message: 'Received a resizable ArrayBuffer.'
+	    })
+	  }
+
+	  // 5. Return the IDL value of type T that is a reference
+	  //    to the same object as V.
+	  return V
+	};
+
+	webidl.converters.DataView = function (V, prefix, name, opts) {
+	  // 1. If Type(V) is not Object, or V does not have a
+	  //    [[DataView]] internal slot, then throw a TypeError.
+	  if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) {
+	    throw webidl.errors.exception({
+	      header: prefix,
+	      message: `${name} is not a DataView.`
+	    })
+	  }
+
+	  // 2. If the conversion is not to an IDL type associated
+	  //    with the [AllowShared] extended attribute, and
+	  //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,
+	  //    then throw a TypeError.
+	  if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
+	    throw webidl.errors.exception({
+	      header: 'ArrayBuffer',
+	      message: 'SharedArrayBuffer is not allowed.'
+	    })
+	  }
+
+	  // 3. If the conversion is not to an IDL type associated
+	  //    with the [AllowResizable] extended attribute, and
+	  //    IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
+	  //    true, then throw a TypeError.
+	  if (V.buffer.resizable || V.buffer.growable) {
+	    throw webidl.errors.exception({
+	      header: 'ArrayBuffer',
+	      message: 'Received a resizable ArrayBuffer.'
+	    })
+	  }
+
+	  // 4. Return the IDL DataView value that is a reference
+	  //    to the same object as V.
+	  return V
+	};
+
+	// https://webidl.spec.whatwg.org/#BufferSource
+	webidl.converters.BufferSource = function (V, prefix, name, opts) {
+	  if (types.isAnyArrayBuffer(V)) {
+	    return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false })
+	  }
+
+	  if (types.isTypedArray(V)) {
+	    return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false })
+	  }
+
+	  if (types.isDataView(V)) {
+	    return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false })
+	  }
+
+	  throw webidl.errors.conversionFailed({
+	    prefix,
+	    argument: `${name} ("${webidl.util.Stringify(V)}")`,
+	    types: ['BufferSource']
+	  })
+	};
+
+	webidl.converters['sequence'] = webidl.sequenceConverter(
+	  webidl.converters.ByteString
+	);
+
+	webidl.converters['sequence>'] = webidl.sequenceConverter(
+	  webidl.converters['sequence']
+	);
+
+	webidl.converters['record'] = webidl.recordConverter(
+	  webidl.converters.ByteString,
+	  webidl.converters.ByteString
+	);
+
+	webidl_1 = {
+	  webidl
+	};
+	return webidl_1;
+}
+
+var util$6;
+var hasRequiredUtil$6;
+
+function requireUtil$6 () {
+	if (hasRequiredUtil$6) return util$6;
+	hasRequiredUtil$6 = 1;
+
+	const { Transform } = require$$0$8;
+	const zlib = require$$3;
+	const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$3();
+	const { getGlobalOrigin } = requireGlobal$1();
+	const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = requireDataUrl();
+	const { performance } = require$$5$1;
+	const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = requireUtil$7();
+	const assert = require$$0$7;
+	const { isUint8Array } = require$$8$1;
+	const { webidl } = requireWebidl();
+
+	let supportedHashes = [];
+
+	// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable
+	/** @type {import('crypto')} */
+	let crypto;
+	try {
+	  crypto = require('node:crypto');
+	  const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'];
+	  supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash));
+	/* c8 ignore next 3 */
+	} catch {
+
+	}
+
+	function responseURL (response) {
+	  // https://fetch.spec.whatwg.org/#responses
+	  // A response has an associated URL. It is a pointer to the last URL
+	  // in response’s URL list and null if response’s URL list is empty.
+	  const urlList = response.urlList;
+	  const length = urlList.length;
+	  return length === 0 ? null : urlList[length - 1].toString()
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-response-location-url
+	function responseLocationURL (response, requestFragment) {
+	  // 1. If response’s status is not a redirect status, then return null.
+	  if (!redirectStatusSet.has(response.status)) {
+	    return null
+	  }
+
+	  // 2. Let location be the result of extracting header list values given
+	  // `Location` and response’s header list.
+	  let location = response.headersList.get('location', true);
+
+	  // 3. If location is a header value, then set location to the result of
+	  //    parsing location with response’s URL.
+	  if (location !== null && isValidHeaderValue(location)) {
+	    if (!isValidEncodedURL(location)) {
+	      // Some websites respond location header in UTF-8 form without encoding them as ASCII
+	      // and major browsers redirect them to correctly UTF-8 encoded addresses.
+	      // Here, we handle that behavior in the same way.
+	      location = normalizeBinaryStringToUtf8(location);
+	    }
+	    location = new URL(location, responseURL(response));
+	  }
+
+	  // 4. If location is a URL whose fragment is null, then set location’s
+	  // fragment to requestFragment.
+	  if (location && !location.hash) {
+	    location.hash = requestFragment;
+	  }
+
+	  // 5. Return location.
+	  return location
+	}
+
+	/**
+	 * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2
+	 * @param {string} url
+	 * @returns {boolean}
+	 */
+	function isValidEncodedURL (url) {
+	  for (let i = 0; i < url.length; ++i) {
+	    const code = url.charCodeAt(i);
+
+	    if (
+	      code > 0x7E || // Non-US-ASCII + DEL
+	      code < 0x20 // Control characters NUL - US
+	    ) {
+	      return false
+	    }
+	  }
+	  return true
+	}
+
+	/**
+	 * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it.
+	 * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well.
+	 * @param {string} value
+	 * @returns {string}
+	 */
+	function normalizeBinaryStringToUtf8 (value) {
+	  return Buffer.from(value, 'binary').toString('utf8')
+	}
+
+	/** @returns {URL} */
+	function requestCurrentURL (request) {
+	  return request.urlList[request.urlList.length - 1]
+	}
+
+	function requestBadPort (request) {
+	  // 1. Let url be request’s current URL.
+	  const url = requestCurrentURL(request);
+
+	  // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,
+	  // then return blocked.
+	  if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
+	    return 'blocked'
+	  }
+
+	  // 3. Return allowed.
+	  return 'allowed'
+	}
+
+	function isErrorLike (object) {
+	  return object instanceof Error || (
+	    object?.constructor?.name === 'Error' ||
+	    object?.constructor?.name === 'DOMException'
+	  )
+	}
+
+	// Check whether |statusText| is a ByteString and
+	// matches the Reason-Phrase token production.
+	// RFC 2616: https://tools.ietf.org/html/rfc2616
+	// RFC 7230: https://tools.ietf.org/html/rfc7230
+	// "reason-phrase = *( HTAB / SP / VCHAR / obs-text )"
+	// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116
+	function isValidReasonPhrase (statusText) {
+	  for (let i = 0; i < statusText.length; ++i) {
+	    const c = statusText.charCodeAt(i);
+	    if (
+	      !(
+	        (
+	          c === 0x09 || // HTAB
+	          (c >= 0x20 && c <= 0x7e) || // SP / VCHAR
+	          (c >= 0x80 && c <= 0xff)
+	        ) // obs-text
+	      )
+	    ) {
+	      return false
+	    }
+	  }
+	  return true
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#header-name
+	 * @param {string} potentialValue
+	 */
+	const isValidHeaderName = isValidHTTPToken;
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#header-value
+	 * @param {string} potentialValue
+	 */
+	function isValidHeaderValue (potentialValue) {
+	  // - Has no leading or trailing HTTP tab or space bytes.
+	  // - Contains no 0x00 (NUL) or HTTP newline bytes.
+	  return (
+	    potentialValue[0] === '\t' ||
+	    potentialValue[0] === ' ' ||
+	    potentialValue[potentialValue.length - 1] === '\t' ||
+	    potentialValue[potentialValue.length - 1] === ' ' ||
+	    potentialValue.includes('\n') ||
+	    potentialValue.includes('\r') ||
+	    potentialValue.includes('\0')
+	  ) === false
+	}
+
+	// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect
+	function setRequestReferrerPolicyOnRedirect (request, actualResponse) {
+	  //  Given a request request and a response actualResponse, this algorithm
+	  //  updates request’s referrer policy according to the Referrer-Policy
+	  //  header (if any) in actualResponse.
+
+	  // 1. Let policy be the result of executing § 8.1 Parse a referrer policy
+	  // from a Referrer-Policy header on actualResponse.
+
+	  // 8.1 Parse a referrer policy from a Referrer-Policy header
+	  // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.
+	  const { headersList } = actualResponse;
+	  // 2. Let policy be the empty string.
+	  // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.
+	  // 4. Return policy.
+	  const policyHeader = (headersList.get('referrer-policy', true) ?? '').split(',');
+
+	  // Note: As the referrer-policy can contain multiple policies
+	  // separated by comma, we need to loop through all of them
+	  // and pick the first valid one.
+	  // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy
+	  let policy = '';
+	  if (policyHeader.length > 0) {
+	    // The right-most policy takes precedence.
+	    // The left-most policy is the fallback.
+	    for (let i = policyHeader.length; i !== 0; i--) {
+	      const token = policyHeader[i - 1].trim();
+	      if (referrerPolicyTokens.has(token)) {
+	        policy = token;
+	        break
+	      }
+	    }
+	  }
+
+	  // 2. If policy is not the empty string, then set request’s referrer policy to policy.
+	  if (policy !== '') {
+	    request.referrerPolicy = policy;
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check
+	function crossOriginResourcePolicyCheck () {
+	  // TODO
+	  return 'allowed'
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-cors-check
+	function corsCheck () {
+	  // TODO
+	  return 'success'
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-tao-check
+	function TAOCheck () {
+	  // TODO
+	  return 'success'
+	}
+
+	function appendFetchMetadata (httpRequest) {
+	  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header
+	  //  TODO
+
+	  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header
+
+	  //  1. Assert: r’s url is a potentially trustworthy URL.
+	  //  TODO
+
+	  //  2. Let header be a Structured Header whose value is a token.
+	  let header = null;
+
+	  //  3. Set header’s value to r’s mode.
+	  header = httpRequest.mode;
+
+	  //  4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.
+	  httpRequest.headersList.set('sec-fetch-mode', header, true);
+
+	  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header
+	  //  TODO
+
+	  //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header
+	  //  TODO
+	}
+
+	// https://fetch.spec.whatwg.org/#append-a-request-origin-header
+	function appendRequestOriginHeader (request) {
+	  // 1. Let serializedOrigin be the result of byte-serializing a request origin
+	  //    with request.
+	  // TODO: implement "byte-serializing a request origin"
+	  let serializedOrigin = request.origin;
+
+	  // - "'client' is changed to an origin during fetching."
+	  //   This doesn't happen in undici (in most cases) because undici, by default,
+	  //   has no concept of origin.
+	  // - request.origin can also be set to request.client.origin (client being
+	  //   an environment settings object), which is undefined without using
+	  //   setGlobalOrigin.
+	  if (serializedOrigin === 'client' || serializedOrigin === undefined) {
+	    return
+	  }
+
+	  // 2. If request’s response tainting is "cors" or request’s mode is "websocket",
+	  //    then append (`Origin`, serializedOrigin) to request’s header list.
+	  // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:
+	  if (request.responseTainting === 'cors' || request.mode === 'websocket') {
+	    request.headersList.append('origin', serializedOrigin, true);
+	  } else if (request.method !== 'GET' && request.method !== 'HEAD') {
+	    // 1. Switch on request’s referrer policy:
+	    switch (request.referrerPolicy) {
+	      case 'no-referrer':
+	        // Set serializedOrigin to `null`.
+	        serializedOrigin = null;
+	        break
+	      case 'no-referrer-when-downgrade':
+	      case 'strict-origin':
+	      case 'strict-origin-when-cross-origin':
+	        // If request’s origin is a tuple origin, its scheme is "https", and
+	        // request’s current URL’s scheme is not "https", then set
+	        // serializedOrigin to `null`.
+	        if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {
+	          serializedOrigin = null;
+	        }
+	        break
+	      case 'same-origin':
+	        // If request’s origin is not same origin with request’s current URL’s
+	        // origin, then set serializedOrigin to `null`.
+	        if (!sameOrigin(request, requestCurrentURL(request))) {
+	          serializedOrigin = null;
+	        }
+	        break
+	        // Do nothing.
+	    }
+
+	    // 2. Append (`Origin`, serializedOrigin) to request’s header list.
+	    request.headersList.append('origin', serializedOrigin, true);
+	  }
+	}
+
+	// https://w3c.github.io/hr-time/#dfn-coarsen-time
+	function coarsenTime (timestamp, crossOriginIsolatedCapability) {
+	  // TODO
+	  return timestamp
+	}
+
+	// https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info
+	function clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {
+	  if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {
+	    return {
+	      domainLookupStartTime: defaultStartTime,
+	      domainLookupEndTime: defaultStartTime,
+	      connectionStartTime: defaultStartTime,
+	      connectionEndTime: defaultStartTime,
+	      secureConnectionStartTime: defaultStartTime,
+	      ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol
+	    }
+	  }
+
+	  return {
+	    domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime),
+	    domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime),
+	    connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime),
+	    connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime),
+	    secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime),
+	    ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol
+	  }
+	}
+
+	// https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time
+	function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {
+	  return coarsenTime(performance.now())
+	}
+
+	// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info
+	function createOpaqueTimingInfo (timingInfo) {
+	  return {
+	    startTime: timingInfo.startTime ?? 0,
+	    redirectStartTime: 0,
+	    redirectEndTime: 0,
+	    postRedirectStartTime: timingInfo.startTime ?? 0,
+	    finalServiceWorkerStartTime: 0,
+	    finalNetworkResponseStartTime: 0,
+	    finalNetworkRequestStartTime: 0,
+	    endTime: 0,
+	    encodedBodySize: 0,
+	    decodedBodySize: 0,
+	    finalConnectionTimingInfo: null
+	  }
+	}
+
+	// https://html.spec.whatwg.org/multipage/origin.html#policy-container
+	function makePolicyContainer () {
+	  // Note: the fetch spec doesn't make use of embedder policy or CSP list
+	  return {
+	    referrerPolicy: 'strict-origin-when-cross-origin'
+	  }
+	}
+
+	// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container
+	function clonePolicyContainer (policyContainer) {
+	  return {
+	    referrerPolicy: policyContainer.referrerPolicy
+	  }
+	}
+
+	// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
+	function determineRequestsReferrer (request) {
+	  // 1. Let policy be request's referrer policy.
+	  const policy = request.referrerPolicy;
+
+	  // Note: policy cannot (shouldn't) be null or an empty string.
+	  assert(policy);
+
+	  // 2. Let environment be request’s client.
+
+	  let referrerSource = null;
+
+	  // 3. Switch on request’s referrer:
+	  if (request.referrer === 'client') {
+	    // Note: node isn't a browser and doesn't implement document/iframes,
+	    // so we bypass this step and replace it with our own.
+
+	    const globalOrigin = getGlobalOrigin();
+
+	    if (!globalOrigin || globalOrigin.origin === 'null') {
+	      return 'no-referrer'
+	    }
+
+	    // note: we need to clone it as it's mutated
+	    referrerSource = new URL(globalOrigin);
+	  } else if (request.referrer instanceof URL) {
+	    // Let referrerSource be request’s referrer.
+	    referrerSource = request.referrer;
+	  }
+
+	  // 4. Let request’s referrerURL be the result of stripping referrerSource for
+	  //    use as a referrer.
+	  let referrerURL = stripURLForReferrer(referrerSource);
+
+	  // 5. Let referrerOrigin be the result of stripping referrerSource for use as
+	  //    a referrer, with the origin-only flag set to true.
+	  const referrerOrigin = stripURLForReferrer(referrerSource, true);
+
+	  // 6. If the result of serializing referrerURL is a string whose length is
+	  //    greater than 4096, set referrerURL to referrerOrigin.
+	  if (referrerURL.toString().length > 4096) {
+	    referrerURL = referrerOrigin;
+	  }
+
+	  const areSameOrigin = sameOrigin(request, referrerURL);
+	  const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) &&
+	    !isURLPotentiallyTrustworthy(request.url);
+
+	  // 8. Execute the switch statements corresponding to the value of policy:
+	  switch (policy) {
+	    case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true)
+	    case 'unsafe-url': return referrerURL
+	    case 'same-origin':
+	      return areSameOrigin ? referrerOrigin : 'no-referrer'
+	    case 'origin-when-cross-origin':
+	      return areSameOrigin ? referrerURL : referrerOrigin
+	    case 'strict-origin-when-cross-origin': {
+	      const currentURL = requestCurrentURL(request);
+
+	      // 1. If the origin of referrerURL and the origin of request’s current
+	      //    URL are the same, then return referrerURL.
+	      if (sameOrigin(referrerURL, currentURL)) {
+	        return referrerURL
+	      }
+
+	      // 2. If referrerURL is a potentially trustworthy URL and request’s
+	      //    current URL is not a potentially trustworthy URL, then return no
+	      //    referrer.
+	      if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
+	        return 'no-referrer'
+	      }
+
+	      // 3. Return referrerOrigin.
+	      return referrerOrigin
+	    }
+	    case 'strict-origin': // eslint-disable-line
+	      /**
+	         * 1. If referrerURL is a potentially trustworthy URL and
+	         * request’s current URL is not a potentially trustworthy URL,
+	         * then return no referrer.
+	         * 2. Return referrerOrigin
+	        */
+	    case 'no-referrer-when-downgrade': // eslint-disable-line
+	      /**
+	       * 1. If referrerURL is a potentially trustworthy URL and
+	       * request’s current URL is not a potentially trustworthy URL,
+	       * then return no referrer.
+	       * 2. Return referrerOrigin
+	      */
+
+	    default: // eslint-disable-line
+	      return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin
+	  }
+	}
+
+	/**
+	 * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url
+	 * @param {URL} url
+	 * @param {boolean|undefined} originOnly
+	 */
+	function stripURLForReferrer (url, originOnly) {
+	  // 1. Assert: url is a URL.
+	  assert(url instanceof URL);
+
+	  url = new URL(url);
+
+	  // 2. If url’s scheme is a local scheme, then return no referrer.
+	  if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') {
+	    return 'no-referrer'
+	  }
+
+	  // 3. Set url’s username to the empty string.
+	  url.username = '';
+
+	  // 4. Set url’s password to the empty string.
+	  url.password = '';
+
+	  // 5. Set url’s fragment to null.
+	  url.hash = '';
+
+	  // 6. If the origin-only flag is true, then:
+	  if (originOnly) {
+	    // 1. Set url’s path to « the empty string ».
+	    url.pathname = '';
+
+	    // 2. Set url’s query to null.
+	    url.search = '';
+	  }
+
+	  // 7. Return url.
+	  return url
+	}
+
+	function isURLPotentiallyTrustworthy (url) {
+	  if (!(url instanceof URL)) {
+	    return false
+	  }
+
+	  // If child of about, return true
+	  if (url.href === 'about:blank' || url.href === 'about:srcdoc') {
+	    return true
+	  }
+
+	  // If scheme is data, return true
+	  if (url.protocol === 'data:') return true
+
+	  // If file, return true
+	  if (url.protocol === 'file:') return true
+
+	  return isOriginPotentiallyTrustworthy(url.origin)
+
+	  function isOriginPotentiallyTrustworthy (origin) {
+	    // If origin is explicitly null, return false
+	    if (origin == null || origin === 'null') return false
+
+	    const originAsURL = new URL(origin);
+
+	    // If secure, return true
+	    if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') {
+	      return true
+	    }
+
+	    // If localhost or variants, return true
+	    if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) ||
+	     (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) ||
+	     (originAsURL.hostname.endsWith('.localhost'))) {
+	      return true
+	    }
+
+	    // If any other, return false
+	    return false
+	  }
+	}
+
+	/**
+	 * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist
+	 * @param {Uint8Array} bytes
+	 * @param {string} metadataList
+	 */
+	function bytesMatch (bytes, metadataList) {
+	  // If node is not built with OpenSSL support, we cannot check
+	  // a request's integrity, so allow it by default (the spec will
+	  // allow requests if an invalid hash is given, as precedence).
+	  /* istanbul ignore if: only if node is built with --without-ssl */
+	  if (crypto === undefined) {
+	    return true
+	  }
+
+	  // 1. Let parsedMetadata be the result of parsing metadataList.
+	  const parsedMetadata = parseMetadata(metadataList);
+
+	  // 2. If parsedMetadata is no metadata, return true.
+	  if (parsedMetadata === 'no metadata') {
+	    return true
+	  }
+
+	  // 3. If response is not eligible for integrity validation, return false.
+	  // TODO
+
+	  // 4. If parsedMetadata is the empty set, return true.
+	  if (parsedMetadata.length === 0) {
+	    return true
+	  }
+
+	  // 5. Let metadata be the result of getting the strongest
+	  //    metadata from parsedMetadata.
+	  const strongest = getStrongestMetadata(parsedMetadata);
+	  const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest);
+
+	  // 6. For each item in metadata:
+	  for (const item of metadata) {
+	    // 1. Let algorithm be the alg component of item.
+	    const algorithm = item.algo;
+
+	    // 2. Let expectedValue be the val component of item.
+	    const expectedValue = item.hash;
+
+	    // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e
+	    // "be liberal with padding". This is annoying, and it's not even in the spec.
+
+	    // 3. Let actualValue be the result of applying algorithm to bytes.
+	    let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64');
+
+	    if (actualValue[actualValue.length - 1] === '=') {
+	      if (actualValue[actualValue.length - 2] === '=') {
+	        actualValue = actualValue.slice(0, -2);
+	      } else {
+	        actualValue = actualValue.slice(0, -1);
+	      }
+	    }
+
+	    // 4. If actualValue is a case-sensitive match for expectedValue,
+	    //    return true.
+	    if (compareBase64Mixed(actualValue, expectedValue)) {
+	      return true
+	    }
+	  }
+
+	  // 7. Return false.
+	  return false
+	}
+
+	// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options
+	// https://www.w3.org/TR/CSP2/#source-list-syntax
+	// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1
+	const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i;
+
+	/**
+	 * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata
+	 * @param {string} metadata
+	 */
+	function parseMetadata (metadata) {
+	  // 1. Let result be the empty set.
+	  /** @type {{ algo: string, hash: string }[]} */
+	  const result = [];
+
+	  // 2. Let empty be equal to true.
+	  let empty = true;
+
+	  // 3. For each token returned by splitting metadata on spaces:
+	  for (const token of metadata.split(' ')) {
+	    // 1. Set empty to false.
+	    empty = false;
+
+	    // 2. Parse token as a hash-with-options.
+	    const parsedToken = parseHashWithOptions.exec(token);
+
+	    // 3. If token does not parse, continue to the next token.
+	    if (
+	      parsedToken === null ||
+	      parsedToken.groups === undefined ||
+	      parsedToken.groups.algo === undefined
+	    ) {
+	      // Note: Chromium blocks the request at this point, but Firefox
+	      // gives a warning that an invalid integrity was given. The
+	      // correct behavior is to ignore these, and subsequently not
+	      // check the integrity of the resource.
+	      continue
+	    }
+
+	    // 4. Let algorithm be the hash-algo component of token.
+	    const algorithm = parsedToken.groups.algo.toLowerCase();
+
+	    // 5. If algorithm is a hash function recognized by the user
+	    //    agent, add the parsed token to result.
+	    if (supportedHashes.includes(algorithm)) {
+	      result.push(parsedToken.groups);
+	    }
+	  }
+
+	  // 4. Return no metadata if empty is true, otherwise return result.
+	  if (empty === true) {
+	    return 'no metadata'
+	  }
+
+	  return result
+	}
+
+	/**
+	 * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList
+	 */
+	function getStrongestMetadata (metadataList) {
+	  // Let algorithm be the algo component of the first item in metadataList.
+	  // Can be sha256
+	  let algorithm = metadataList[0].algo;
+	  // If the algorithm is sha512, then it is the strongest
+	  // and we can return immediately
+	  if (algorithm[3] === '5') {
+	    return algorithm
+	  }
+
+	  for (let i = 1; i < metadataList.length; ++i) {
+	    const metadata = metadataList[i];
+	    // If the algorithm is sha512, then it is the strongest
+	    // and we can break the loop immediately
+	    if (metadata.algo[3] === '5') {
+	      algorithm = 'sha512';
+	      break
+	    // If the algorithm is sha384, then a potential sha256 or sha384 is ignored
+	    } else if (algorithm[3] === '3') {
+	      continue
+	    // algorithm is sha256, check if algorithm is sha384 and if so, set it as
+	    // the strongest
+	    } else if (metadata.algo[3] === '3') {
+	      algorithm = 'sha384';
+	    }
+	  }
+	  return algorithm
+	}
+
+	function filterMetadataListByAlgorithm (metadataList, algorithm) {
+	  if (metadataList.length === 1) {
+	    return metadataList
+	  }
+
+	  let pos = 0;
+	  for (let i = 0; i < metadataList.length; ++i) {
+	    if (metadataList[i].algo === algorithm) {
+	      metadataList[pos++] = metadataList[i];
+	    }
+	  }
+
+	  metadataList.length = pos;
+
+	  return metadataList
+	}
+
+	/**
+	 * Compares two base64 strings, allowing for base64url
+	 * in the second string.
+	 *
+	* @param {string} actualValue always base64
+	 * @param {string} expectedValue base64 or base64url
+	 * @returns {boolean}
+	 */
+	function compareBase64Mixed (actualValue, expectedValue) {
+	  if (actualValue.length !== expectedValue.length) {
+	    return false
+	  }
+	  for (let i = 0; i < actualValue.length; ++i) {
+	    if (actualValue[i] !== expectedValue[i]) {
+	      if (
+	        (actualValue[i] === '+' && expectedValue[i] === '-') ||
+	        (actualValue[i] === '/' && expectedValue[i] === '_')
+	      ) {
+	        continue
+	      }
+	      return false
+	    }
+	  }
+
+	  return true
+	}
+
+	// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request
+	function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {
+	  // TODO
+	}
+
+	/**
+	 * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}
+	 * @param {URL} A
+	 * @param {URL} B
+	 */
+	function sameOrigin (A, B) {
+	  // 1. If A and B are the same opaque origin, then return true.
+	  if (A.origin === B.origin && A.origin === 'null') {
+	    return true
+	  }
+
+	  // 2. If A and B are both tuple origins and their schemes,
+	  //    hosts, and port are identical, then return true.
+	  if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {
+	    return true
+	  }
+
+	  // 3. Return false.
+	  return false
+	}
+
+	function createDeferredPromise () {
+	  let res;
+	  let rej;
+	  const promise = new Promise((resolve, reject) => {
+	    res = resolve;
+	    rej = reject;
+	  });
+
+	  return { promise, resolve: res, reject: rej }
+	}
+
+	function isAborted (fetchParams) {
+	  return fetchParams.controller.state === 'aborted'
+	}
+
+	function isCancelled (fetchParams) {
+	  return fetchParams.controller.state === 'aborted' ||
+	    fetchParams.controller.state === 'terminated'
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-method-normalize
+	 * @param {string} method
+	 */
+	function normalizeMethod (method) {
+	  return normalizedMethodRecordsBase[method.toLowerCase()] ?? method
+	}
+
+	// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string
+	function serializeJavascriptValueToJSONString (value) {
+	  // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).
+	  const result = JSON.stringify(value);
+
+	  // 2. If result is undefined, then throw a TypeError.
+	  if (result === undefined) {
+	    throw new TypeError('Value is not JSON serializable')
+	  }
+
+	  // 3. Assert: result is a string.
+	  assert(typeof result === 'string');
+
+	  // 4. Return result.
+	  return result
+	}
+
+	// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object
+	const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
+
+	/**
+	 * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
+	 * @param {string} name name of the instance
+	 * @param {symbol} kInternalIterator
+	 * @param {string | number} [keyIndex]
+	 * @param {string | number} [valueIndex]
+	 */
+	function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) {
+	  class FastIterableIterator {
+	    /** @type {any} */
+	    #target
+	    /** @type {'key' | 'value' | 'key+value'} */
+	    #kind
+	    /** @type {number} */
+	    #index
+
+	    /**
+	     * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object
+	     * @param {unknown} target
+	     * @param {'key' | 'value' | 'key+value'} kind
+	     */
+	    constructor (target, kind) {
+	      this.#target = target;
+	      this.#kind = kind;
+	      this.#index = 0;
+	    }
+
+	    next () {
+	      // 1. Let interface be the interface for which the iterator prototype object exists.
+	      // 2. Let thisValue be the this value.
+	      // 3. Let object be ? ToObject(thisValue).
+	      // 4. If object is a platform object, then perform a security
+	      //    check, passing:
+	      // 5. If object is not a default iterator object for interface,
+	      //    then throw a TypeError.
+	      if (typeof this !== 'object' || this === null || !(#target in this)) {
+	        throw new TypeError(
+	          `'next' called on an object that does not implement interface ${name} Iterator.`
+	        )
+	      }
+
+	      // 6. Let index be object’s index.
+	      // 7. Let kind be object’s kind.
+	      // 8. Let values be object’s target's value pairs to iterate over.
+	      const index = this.#index;
+	      const values = this.#target[kInternalIterator];
+
+	      // 9. Let len be the length of values.
+	      const len = values.length;
+
+	      // 10. If index is greater than or equal to len, then return
+	      //     CreateIterResultObject(undefined, true).
+	      if (index >= len) {
+	        return {
+	          value: undefined,
+	          done: true
+	        }
+	      }
+
+	      // 11. Let pair be the entry in values at index index.
+	      const { [keyIndex]: key, [valueIndex]: value } = values[index];
+
+	      // 12. Set object’s index to index + 1.
+	      this.#index = index + 1;
+
+	      // 13. Return the iterator result for pair and kind.
+
+	      // https://webidl.spec.whatwg.org/#iterator-result
+
+	      // 1. Let result be a value determined by the value of kind:
+	      let result;
+	      switch (this.#kind) {
+	        case 'key':
+	          // 1. Let idlKey be pair’s key.
+	          // 2. Let key be the result of converting idlKey to an
+	          //    ECMAScript value.
+	          // 3. result is key.
+	          result = key;
+	          break
+	        case 'value':
+	          // 1. Let idlValue be pair’s value.
+	          // 2. Let value be the result of converting idlValue to
+	          //    an ECMAScript value.
+	          // 3. result is value.
+	          result = value;
+	          break
+	        case 'key+value':
+	          // 1. Let idlKey be pair’s key.
+	          // 2. Let idlValue be pair’s value.
+	          // 3. Let key be the result of converting idlKey to an
+	          //    ECMAScript value.
+	          // 4. Let value be the result of converting idlValue to
+	          //    an ECMAScript value.
+	          // 5. Let array be ! ArrayCreate(2).
+	          // 6. Call ! CreateDataProperty(array, "0", key).
+	          // 7. Call ! CreateDataProperty(array, "1", value).
+	          // 8. result is array.
+	          result = [key, value];
+	          break
+	      }
+
+	      // 2. Return CreateIterResultObject(result, false).
+	      return {
+	        value: result,
+	        done: false
+	      }
+	    }
+	  }
+
+	  // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
+	  // @ts-ignore
+	  delete FastIterableIterator.prototype.constructor;
+
+	  Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype);
+
+	  Object.defineProperties(FastIterableIterator.prototype, {
+	    [Symbol.toStringTag]: {
+	      writable: false,
+	      enumerable: false,
+	      configurable: true,
+	      value: `${name} Iterator`
+	    },
+	    next: { writable: true, enumerable: true, configurable: true }
+	  });
+
+	  /**
+	   * @param {unknown} target
+	   * @param {'key' | 'value' | 'key+value'} kind
+	   * @returns {IterableIterator}
+	   */
+	  return function (target, kind) {
+	    return new FastIterableIterator(target, kind)
+	  }
+	}
+
+	/**
+	 * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
+	 * @param {string} name name of the instance
+	 * @param {any} object class
+	 * @param {symbol} kInternalIterator
+	 * @param {string | number} [keyIndex]
+	 * @param {string | number} [valueIndex]
+	 */
+	function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) {
+	  const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex);
+
+	  const properties = {
+	    keys: {
+	      writable: true,
+	      enumerable: true,
+	      configurable: true,
+	      value: function keys () {
+	        webidl.brandCheck(this, object);
+	        return makeIterator(this, 'key')
+	      }
+	    },
+	    values: {
+	      writable: true,
+	      enumerable: true,
+	      configurable: true,
+	      value: function values () {
+	        webidl.brandCheck(this, object);
+	        return makeIterator(this, 'value')
+	      }
+	    },
+	    entries: {
+	      writable: true,
+	      enumerable: true,
+	      configurable: true,
+	      value: function entries () {
+	        webidl.brandCheck(this, object);
+	        return makeIterator(this, 'key+value')
+	      }
+	    },
+	    forEach: {
+	      writable: true,
+	      enumerable: true,
+	      configurable: true,
+	      value: function forEach (callbackfn, thisArg = globalThis) {
+	        webidl.brandCheck(this, object);
+	        webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`);
+	        if (typeof callbackfn !== 'function') {
+	          throw new TypeError(
+	            `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.`
+	          )
+	        }
+	        for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) {
+	          callbackfn.call(thisArg, value, key, this);
+	        }
+	      }
+	    }
+	  };
+
+	  return Object.defineProperties(object.prototype, {
+	    ...properties,
+	    [Symbol.iterator]: {
+	      writable: true,
+	      enumerable: false,
+	      configurable: true,
+	      value: properties.entries.value
+	    }
+	  })
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#body-fully-read
+	 */
+	async function fullyReadBody (body, processBody, processBodyError) {
+	  // 1. If taskDestination is null, then set taskDestination to
+	  //    the result of starting a new parallel queue.
+
+	  // 2. Let successSteps given a byte sequence bytes be to queue a
+	  //    fetch task to run processBody given bytes, with taskDestination.
+	  const successSteps = processBody;
+
+	  // 3. Let errorSteps be to queue a fetch task to run processBodyError,
+	  //    with taskDestination.
+	  const errorSteps = processBodyError;
+
+	  // 4. Let reader be the result of getting a reader for body’s stream.
+	  //    If that threw an exception, then run errorSteps with that
+	  //    exception and return.
+	  let reader;
+
+	  try {
+	    reader = body.stream.getReader();
+	  } catch (e) {
+	    errorSteps(e);
+	    return
+	  }
+
+	  // 5. Read all bytes from reader, given successSteps and errorSteps.
+	  try {
+	    successSteps(await readAllBytes(reader));
+	  } catch (e) {
+	    errorSteps(e);
+	  }
+	}
+
+	function isReadableStreamLike (stream) {
+	  return stream instanceof ReadableStream || (
+	    stream[Symbol.toStringTag] === 'ReadableStream' &&
+	    typeof stream.tee === 'function'
+	  )
+	}
+
+	/**
+	 * @param {ReadableStreamController} controller
+	 */
+	function readableStreamClose (controller) {
+	  try {
+	    controller.close();
+	    controller.byobRequest?.respond(0);
+	  } catch (err) {
+	    // TODO: add comment explaining why this error occurs.
+	    if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) {
+	      throw err
+	    }
+	  }
+	}
+
+	const invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; // eslint-disable-line
+
+	/**
+	 * @see https://infra.spec.whatwg.org/#isomorphic-encode
+	 * @param {string} input
+	 */
+	function isomorphicEncode (input) {
+	  // 1. Assert: input contains no code points greater than U+00FF.
+	  assert(!invalidIsomorphicEncodeValueRegex.test(input));
+
+	  // 2. Return a byte sequence whose length is equal to input’s code
+	  //    point length and whose bytes have the same values as the
+	  //    values of input’s code points, in the same order
+	  return input
+	}
+
+	/**
+	 * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes
+	 * @see https://streams.spec.whatwg.org/#read-loop
+	 * @param {ReadableStreamDefaultReader} reader
+	 */
+	async function readAllBytes (reader) {
+	  const bytes = [];
+	  let byteLength = 0;
+
+	  while (true) {
+	    const { done, value: chunk } = await reader.read();
+
+	    if (done) {
+	      // 1. Call successSteps with bytes.
+	      return Buffer.concat(bytes, byteLength)
+	    }
+
+	    // 1. If chunk is not a Uint8Array object, call failureSteps
+	    //    with a TypeError and abort these steps.
+	    if (!isUint8Array(chunk)) {
+	      throw new TypeError('Received non-Uint8Array chunk')
+	    }
+
+	    // 2. Append the bytes represented by chunk to bytes.
+	    bytes.push(chunk);
+	    byteLength += chunk.length;
+
+	    // 3. Read-loop given reader, bytes, successSteps, and failureSteps.
+	  }
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#is-local
+	 * @param {URL} url
+	 */
+	function urlIsLocal (url) {
+	  assert('protocol' in url); // ensure it's a url object
+
+	  const protocol = url.protocol;
+
+	  return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'
+	}
+
+	/**
+	 * @param {string|URL} url
+	 * @returns {boolean}
+	 */
+	function urlHasHttpsScheme (url) {
+	  return (
+	    (
+	      typeof url === 'string' &&
+	      url[5] === ':' &&
+	      url[0] === 'h' &&
+	      url[1] === 't' &&
+	      url[2] === 't' &&
+	      url[3] === 'p' &&
+	      url[4] === 's'
+	    ) ||
+	    url.protocol === 'https:'
+	  )
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#http-scheme
+	 * @param {URL} url
+	 */
+	function urlIsHttpHttpsScheme (url) {
+	  assert('protocol' in url); // ensure it's a url object
+
+	  const protocol = url.protocol;
+
+	  return protocol === 'http:' || protocol === 'https:'
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#simple-range-header-value
+	 * @param {string} value
+	 * @param {boolean} allowWhitespace
+	 */
+	function simpleRangeHeaderValue (value, allowWhitespace) {
+	  // 1. Let data be the isomorphic decoding of value.
+	  // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string,
+	  // nothing more. We obviously don't need to do that if value is a string already.
+	  const data = value;
+
+	  // 2. If data does not start with "bytes", then return failure.
+	  if (!data.startsWith('bytes')) {
+	    return 'failure'
+	  }
+
+	  // 3. Let position be a position variable for data, initially pointing at the 5th code point of data.
+	  const position = { position: 5 };
+
+	  // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,
+	  //    from data given position.
+	  if (allowWhitespace) {
+	    collectASequenceOfCodePoints(
+	      (char) => char === '\t' || char === ' ',
+	      data,
+	      position
+	    );
+	  }
+
+	  // 5. If the code point at position within data is not U+003D (=), then return failure.
+	  if (data.charCodeAt(position.position) !== 0x3D) {
+	    return 'failure'
+	  }
+
+	  // 6. Advance position by 1.
+	  position.position++;
+
+	  // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from
+	  //    data given position.
+	  if (allowWhitespace) {
+	    collectASequenceOfCodePoints(
+	      (char) => char === '\t' || char === ' ',
+	      data,
+	      position
+	    );
+	  }
+
+	  // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits,
+	  //    from data given position.
+	  const rangeStart = collectASequenceOfCodePoints(
+	    (char) => {
+	      const code = char.charCodeAt(0);
+
+	      return code >= 0x30 && code <= 0x39
+	    },
+	    data,
+	    position
+	  );
+
+	  // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the
+	  //    empty string; otherwise null.
+	  const rangeStartValue = rangeStart.length ? Number(rangeStart) : null;
+
+	  // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,
+	  //     from data given position.
+	  if (allowWhitespace) {
+	    collectASequenceOfCodePoints(
+	      (char) => char === '\t' || char === ' ',
+	      data,
+	      position
+	    );
+	  }
+
+	  // 11. If the code point at position within data is not U+002D (-), then return failure.
+	  if (data.charCodeAt(position.position) !== 0x2D) {
+	    return 'failure'
+	  }
+
+	  // 12. Advance position by 1.
+	  position.position++;
+
+	  // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab
+	  //     or space, from data given position.
+	  // Note from Khafra: its the same step as in #8 again lol
+	  if (allowWhitespace) {
+	    collectASequenceOfCodePoints(
+	      (char) => char === '\t' || char === ' ',
+	      data,
+	      position
+	    );
+	  }
+
+	  // 14. Let rangeEnd be the result of collecting a sequence of code points that are
+	  //     ASCII digits, from data given position.
+	  // Note from Khafra: you wouldn't guess it, but this is also the same step as #8
+	  const rangeEnd = collectASequenceOfCodePoints(
+	    (char) => {
+	      const code = char.charCodeAt(0);
+
+	      return code >= 0x30 && code <= 0x39
+	    },
+	    data,
+	    position
+	  );
+
+	  // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd
+	  //     is not the empty string; otherwise null.
+	  // Note from Khafra: THE SAME STEP, AGAIN!!!
+	  // Note: why interpret as a decimal if we only collect ascii digits?
+	  const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null;
+
+	  // 16. If position is not past the end of data, then return failure.
+	  if (position.position < data.length) {
+	    return 'failure'
+	  }
+
+	  // 17. If rangeEndValue and rangeStartValue are null, then return failure.
+	  if (rangeEndValue === null && rangeStartValue === null) {
+	    return 'failure'
+	  }
+
+	  // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is
+	  //     greater than rangeEndValue, then return failure.
+	  // Note: ... when can they not be numbers?
+	  if (rangeStartValue > rangeEndValue) {
+	    return 'failure'
+	  }
+
+	  // 19. Return (rangeStartValue, rangeEndValue).
+	  return { rangeStartValue, rangeEndValue }
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#build-a-content-range
+	 * @param {number} rangeStart
+	 * @param {number} rangeEnd
+	 * @param {number} fullLength
+	 */
+	function buildContentRange (rangeStart, rangeEnd, fullLength) {
+	  // 1. Let contentRange be `bytes `.
+	  let contentRange = 'bytes ';
+
+	  // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange.
+	  contentRange += isomorphicEncode(`${rangeStart}`);
+
+	  // 3. Append 0x2D (-) to contentRange.
+	  contentRange += '-';
+
+	  // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange.
+	  contentRange += isomorphicEncode(`${rangeEnd}`);
+
+	  // 5. Append 0x2F (/) to contentRange.
+	  contentRange += '/';
+
+	  // 6. Append fullLength, serialized and isomorphic encoded to contentRange.
+	  contentRange += isomorphicEncode(`${fullLength}`);
+
+	  // 7. Return contentRange.
+	  return contentRange
+	}
+
+	// A Stream, which pipes the response to zlib.createInflate() or
+	// zlib.createInflateRaw() depending on the first byte of the Buffer.
+	// If the lower byte of the first byte is 0x08, then the stream is
+	// interpreted as a zlib stream, otherwise it's interpreted as a
+	// raw deflate stream.
+	class InflateStream extends Transform {
+	  #zlibOptions
+
+	  /** @param {zlib.ZlibOptions} [zlibOptions] */
+	  constructor (zlibOptions) {
+	    super();
+	    this.#zlibOptions = zlibOptions;
+	  }
+
+	  _transform (chunk, encoding, callback) {
+	    if (!this._inflateStream) {
+	      if (chunk.length === 0) {
+	        callback();
+	        return
+	      }
+	      this._inflateStream = (chunk[0] & 0x0F) === 0x08
+	        ? zlib.createInflate(this.#zlibOptions)
+	        : zlib.createInflateRaw(this.#zlibOptions);
+
+	      this._inflateStream.on('data', this.push.bind(this));
+	      this._inflateStream.on('end', () => this.push(null));
+	      this._inflateStream.on('error', (err) => this.destroy(err));
+	    }
+
+	    this._inflateStream.write(chunk, encoding, callback);
+	  }
+
+	  _final (callback) {
+	    if (this._inflateStream) {
+	      this._inflateStream.end();
+	      this._inflateStream = null;
+	    }
+	    callback();
+	  }
+	}
+
+	/**
+	 * @param {zlib.ZlibOptions} [zlibOptions]
+	 * @returns {InflateStream}
+	 */
+	function createInflate (zlibOptions) {
+	  return new InflateStream(zlibOptions)
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type
+	 * @param {import('./headers').HeadersList} headers
+	 */
+	function extractMimeType (headers) {
+	  // 1. Let charset be null.
+	  let charset = null;
+
+	  // 2. Let essence be null.
+	  let essence = null;
+
+	  // 3. Let mimeType be null.
+	  let mimeType = null;
+
+	  // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers.
+	  const values = getDecodeSplit('content-type', headers);
+
+	  // 5. If values is null, then return failure.
+	  if (values === null) {
+	    return 'failure'
+	  }
+
+	  // 6. For each value of values:
+	  for (const value of values) {
+	    // 6.1. Let temporaryMimeType be the result of parsing value.
+	    const temporaryMimeType = parseMIMEType(value);
+
+	    // 6.2. If temporaryMimeType is failure or its essence is "*/*", then continue.
+	    if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') {
+	      continue
+	    }
+
+	    // 6.3. Set mimeType to temporaryMimeType.
+	    mimeType = temporaryMimeType;
+
+	    // 6.4. If mimeType’s essence is not essence, then:
+	    if (mimeType.essence !== essence) {
+	      // 6.4.1. Set charset to null.
+	      charset = null;
+
+	      // 6.4.2. If mimeType’s parameters["charset"] exists, then set charset to
+	      //        mimeType’s parameters["charset"].
+	      if (mimeType.parameters.has('charset')) {
+	        charset = mimeType.parameters.get('charset');
+	      }
+
+	      // 6.4.3. Set essence to mimeType’s essence.
+	      essence = mimeType.essence;
+	    } else if (!mimeType.parameters.has('charset') && charset !== null) {
+	      // 6.5. Otherwise, if mimeType’s parameters["charset"] does not exist, and
+	      //      charset is non-null, set mimeType’s parameters["charset"] to charset.
+	      mimeType.parameters.set('charset', charset);
+	    }
+	  }
+
+	  // 7. If mimeType is null, then return failure.
+	  if (mimeType == null) {
+	    return 'failure'
+	  }
+
+	  // 8. Return mimeType.
+	  return mimeType
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split
+	 * @param {string|null} value
+	 */
+	function gettingDecodingSplitting (value) {
+	  // 1. Let input be the result of isomorphic decoding value.
+	  const input = value;
+
+	  // 2. Let position be a position variable for input, initially pointing at the start of input.
+	  const position = { position: 0 };
+
+	  // 3. Let values be a list of strings, initially empty.
+	  const values = [];
+
+	  // 4. Let temporaryValue be the empty string.
+	  let temporaryValue = '';
+
+	  // 5. While position is not past the end of input:
+	  while (position.position < input.length) {
+	    // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (")
+	    //      or U+002C (,) from input, given position, to temporaryValue.
+	    temporaryValue += collectASequenceOfCodePoints(
+	      (char) => char !== '"' && char !== ',',
+	      input,
+	      position
+	    );
+
+	    // 5.2. If position is not past the end of input, then:
+	    if (position.position < input.length) {
+	      // 5.2.1. If the code point at position within input is U+0022 ("), then:
+	      if (input.charCodeAt(position.position) === 0x22) {
+	        // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue.
+	        temporaryValue += collectAnHTTPQuotedString(
+	          input,
+	          position
+	        );
+
+	        // 5.2.1.2. If position is not past the end of input, then continue.
+	        if (position.position < input.length) {
+	          continue
+	        }
+	      } else {
+	        // 5.2.2. Otherwise:
+
+	        // 5.2.2.1. Assert: the code point at position within input is U+002C (,).
+	        assert(input.charCodeAt(position.position) === 0x2C);
+
+	        // 5.2.2.2. Advance position by 1.
+	        position.position++;
+	      }
+	    }
+
+	    // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue.
+	    temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20);
+
+	    // 5.4. Append temporaryValue to values.
+	    values.push(temporaryValue);
+
+	    // 5.6. Set temporaryValue to the empty string.
+	    temporaryValue = '';
+	  }
+
+	  // 6. Return values.
+	  return values
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split
+	 * @param {string} name lowercase header name
+	 * @param {import('./headers').HeadersList} list
+	 */
+	function getDecodeSplit (name, list) {
+	  // 1. Let value be the result of getting name from list.
+	  const value = list.get(name, true);
+
+	  // 2. If value is null, then return null.
+	  if (value === null) {
+	    return null
+	  }
+
+	  // 3. Return the result of getting, decoding, and splitting value.
+	  return gettingDecodingSplitting(value)
+	}
+
+	const textDecoder = new TextDecoder();
+
+	/**
+	 * @see https://encoding.spec.whatwg.org/#utf-8-decode
+	 * @param {Buffer} buffer
+	 */
+	function utf8DecodeBytes (buffer) {
+	  if (buffer.length === 0) {
+	    return ''
+	  }
+
+	  // 1. Let buffer be the result of peeking three bytes from
+	  //    ioQueue, converted to a byte sequence.
+
+	  // 2. If buffer is 0xEF 0xBB 0xBF, then read three
+	  //    bytes from ioQueue. (Do nothing with those bytes.)
+	  if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
+	    buffer = buffer.subarray(3);
+	  }
+
+	  // 3. Process a queue with an instance of UTF-8’s
+	  //    decoder, ioQueue, output, and "replacement".
+	  const output = textDecoder.decode(buffer);
+
+	  // 4. Return output.
+	  return output
+	}
+
+	class EnvironmentSettingsObjectBase {
+	  get baseUrl () {
+	    return getGlobalOrigin()
+	  }
+
+	  get origin () {
+	    return this.baseUrl?.origin
+	  }
+
+	  policyContainer = makePolicyContainer()
+	}
+
+	class EnvironmentSettingsObject {
+	  settingsObject = new EnvironmentSettingsObjectBase()
+	}
+
+	const environmentSettingsObject = new EnvironmentSettingsObject();
+
+	util$6 = {
+	  isAborted,
+	  isCancelled,
+	  isValidEncodedURL,
+	  createDeferredPromise,
+	  ReadableStreamFrom,
+	  tryUpgradeRequestToAPotentiallyTrustworthyURL,
+	  clampAndCoarsenConnectionTimingInfo,
+	  coarsenedSharedCurrentTime,
+	  determineRequestsReferrer,
+	  makePolicyContainer,
+	  clonePolicyContainer,
+	  appendFetchMetadata,
+	  appendRequestOriginHeader,
+	  TAOCheck,
+	  corsCheck,
+	  crossOriginResourcePolicyCheck,
+	  createOpaqueTimingInfo,
+	  setRequestReferrerPolicyOnRedirect,
+	  isValidHTTPToken,
+	  requestBadPort,
+	  requestCurrentURL,
+	  responseURL,
+	  responseLocationURL,
+	  isBlobLike,
+	  isURLPotentiallyTrustworthy,
+	  isValidReasonPhrase,
+	  sameOrigin,
+	  normalizeMethod,
+	  serializeJavascriptValueToJSONString,
+	  iteratorMixin,
+	  createIterator,
+	  isValidHeaderName,
+	  isValidHeaderValue,
+	  isErrorLike,
+	  fullyReadBody,
+	  bytesMatch,
+	  isReadableStreamLike,
+	  readableStreamClose,
+	  isomorphicEncode,
+	  urlIsLocal,
+	  urlHasHttpsScheme,
+	  urlIsHttpHttpsScheme,
+	  readAllBytes,
+	  simpleRangeHeaderValue,
+	  buildContentRange,
+	  parseMetadata,
+	  createInflate,
+	  extractMimeType,
+	  getDecodeSplit,
+	  utf8DecodeBytes,
+	  environmentSettingsObject
+	};
+	return util$6;
+}
+
+var symbols$3;
+var hasRequiredSymbols$3;
+
+function requireSymbols$3 () {
+	if (hasRequiredSymbols$3) return symbols$3;
+	hasRequiredSymbols$3 = 1;
+
+	symbols$3 = {
+	  kUrl: Symbol('url'),
+	  kHeaders: Symbol('headers'),
+	  kSignal: Symbol('signal'),
+	  kState: Symbol('state'),
+	  kDispatcher: Symbol('dispatcher')
+	};
+	return symbols$3;
+}
+
+var file;
+var hasRequiredFile;
+
+function requireFile () {
+	if (hasRequiredFile) return file;
+	hasRequiredFile = 1;
+
+	const { Blob, File } = require$$0$6;
+	const { kState } = requireSymbols$3();
+	const { webidl } = requireWebidl();
+
+	// TODO(@KhafraDev): remove
+	class FileLike {
+	  constructor (blobLike, fileName, options = {}) {
+	    // TODO: argument idl type check
+
+	    // The File constructor is invoked with two or three parameters, depending
+	    // on whether the optional dictionary parameter is used. When the File()
+	    // constructor is invoked, user agents must run the following steps:
+
+	    // 1. Let bytes be the result of processing blob parts given fileBits and
+	    // options.
+
+	    // 2. Let n be the fileName argument to the constructor.
+	    const n = fileName;
+
+	    // 3. Process FilePropertyBag dictionary argument by running the following
+	    // substeps:
+
+	    //    1. If the type member is provided and is not the empty string, let t
+	    //    be set to the type dictionary member. If t contains any characters
+	    //    outside the range U+0020 to U+007E, then set t to the empty string
+	    //    and return from these substeps.
+	    //    TODO
+	    const t = options.type;
+
+	    //    2. Convert every character in t to ASCII lowercase.
+	    //    TODO
+
+	    //    3. If the lastModified member is provided, let d be set to the
+	    //    lastModified dictionary member. If it is not provided, set d to the
+	    //    current date and time represented as the number of milliseconds since
+	    //    the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).
+	    const d = options.lastModified ?? Date.now();
+
+	    // 4. Return a new File object F such that:
+	    // F refers to the bytes byte sequence.
+	    // F.size is set to the number of total bytes in bytes.
+	    // F.name is set to n.
+	    // F.type is set to t.
+	    // F.lastModified is set to d.
+
+	    this[kState] = {
+	      blobLike,
+	      name: n,
+	      type: t,
+	      lastModified: d
+	    };
+	  }
+
+	  stream (...args) {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].blobLike.stream(...args)
+	  }
+
+	  arrayBuffer (...args) {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].blobLike.arrayBuffer(...args)
+	  }
+
+	  slice (...args) {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].blobLike.slice(...args)
+	  }
+
+	  text (...args) {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].blobLike.text(...args)
+	  }
+
+	  get size () {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].blobLike.size
+	  }
+
+	  get type () {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].blobLike.type
+	  }
+
+	  get name () {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].name
+	  }
+
+	  get lastModified () {
+	    webidl.brandCheck(this, FileLike);
+
+	    return this[kState].lastModified
+	  }
+
+	  get [Symbol.toStringTag] () {
+	    return 'File'
+	  }
+	}
+
+	webidl.converters.Blob = webidl.interfaceConverter(Blob);
+
+	// If this function is moved to ./util.js, some tools (such as
+	// rollup) will warn about circular dependencies. See:
+	// https://github.com/nodejs/undici/issues/1629
+	function isFileLike (object) {
+	  return (
+	    (object instanceof File) ||
+	    (
+	      object &&
+	      (typeof object.stream === 'function' ||
+	      typeof object.arrayBuffer === 'function') &&
+	      object[Symbol.toStringTag] === 'File'
+	    )
+	  )
+	}
+
+	file = { FileLike, isFileLike };
+	return file;
+}
+
+var formdata;
+var hasRequiredFormdata;
+
+function requireFormdata () {
+	if (hasRequiredFormdata) return formdata;
+	hasRequiredFormdata = 1;
+
+	const { isBlobLike, iteratorMixin } = requireUtil$6();
+	const { kState } = requireSymbols$3();
+	const { kEnumerableProperty } = requireUtil$7();
+	const { FileLike, isFileLike } = requireFile();
+	const { webidl } = requireWebidl();
+	const { File: NativeFile } = require$$0$6;
+	const nodeUtil = require$$0$a;
+
+	/** @type {globalThis['File']} */
+	const File = globalThis.File ?? NativeFile;
+
+	// https://xhr.spec.whatwg.org/#formdata
+	class FormData {
+	  constructor (form) {
+	    webidl.util.markAsUncloneable(this);
+
+	    if (form !== undefined) {
+	      throw webidl.errors.conversionFailed({
+	        prefix: 'FormData constructor',
+	        argument: 'Argument 1',
+	        types: ['undefined']
+	      })
+	    }
+
+	    this[kState] = [];
+	  }
+
+	  append (name, value, filename = undefined) {
+	    webidl.brandCheck(this, FormData);
+
+	    const prefix = 'FormData.append';
+	    webidl.argumentLengthCheck(arguments, 2, prefix);
+
+	    if (arguments.length === 3 && !isBlobLike(value)) {
+	      throw new TypeError(
+	        "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'"
+	      )
+	    }
+
+	    // 1. Let value be value if given; otherwise blobValue.
+
+	    name = webidl.converters.USVString(name, prefix, 'name');
+	    value = isBlobLike(value)
+	      ? webidl.converters.Blob(value, prefix, 'value', { strict: false })
+	      : webidl.converters.USVString(value, prefix, 'value');
+	    filename = arguments.length === 3
+	      ? webidl.converters.USVString(filename, prefix, 'filename')
+	      : undefined;
+
+	    // 2. Let entry be the result of creating an entry with
+	    // name, value, and filename if given.
+	    const entry = makeEntry(name, value, filename);
+
+	    // 3. Append entry to this’s entry list.
+	    this[kState].push(entry);
+	  }
+
+	  delete (name) {
+	    webidl.brandCheck(this, FormData);
+
+	    const prefix = 'FormData.delete';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    name = webidl.converters.USVString(name, prefix, 'name');
+
+	    // The delete(name) method steps are to remove all entries whose name
+	    // is name from this’s entry list.
+	    this[kState] = this[kState].filter(entry => entry.name !== name);
+	  }
+
+	  get (name) {
+	    webidl.brandCheck(this, FormData);
+
+	    const prefix = 'FormData.get';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    name = webidl.converters.USVString(name, prefix, 'name');
+
+	    // 1. If there is no entry whose name is name in this’s entry list,
+	    // then return null.
+	    const idx = this[kState].findIndex((entry) => entry.name === name);
+	    if (idx === -1) {
+	      return null
+	    }
+
+	    // 2. Return the value of the first entry whose name is name from
+	    // this’s entry list.
+	    return this[kState][idx].value
+	  }
+
+	  getAll (name) {
+	    webidl.brandCheck(this, FormData);
+
+	    const prefix = 'FormData.getAll';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    name = webidl.converters.USVString(name, prefix, 'name');
+
+	    // 1. If there is no entry whose name is name in this’s entry list,
+	    // then return the empty list.
+	    // 2. Return the values of all entries whose name is name, in order,
+	    // from this’s entry list.
+	    return this[kState]
+	      .filter((entry) => entry.name === name)
+	      .map((entry) => entry.value)
+	  }
+
+	  has (name) {
+	    webidl.brandCheck(this, FormData);
+
+	    const prefix = 'FormData.has';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    name = webidl.converters.USVString(name, prefix, 'name');
+
+	    // The has(name) method steps are to return true if there is an entry
+	    // whose name is name in this’s entry list; otherwise false.
+	    return this[kState].findIndex((entry) => entry.name === name) !== -1
+	  }
+
+	  set (name, value, filename = undefined) {
+	    webidl.brandCheck(this, FormData);
+
+	    const prefix = 'FormData.set';
+	    webidl.argumentLengthCheck(arguments, 2, prefix);
+
+	    if (arguments.length === 3 && !isBlobLike(value)) {
+	      throw new TypeError(
+	        "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'"
+	      )
+	    }
+
+	    // The set(name, value) and set(name, blobValue, filename) method steps
+	    // are:
+
+	    // 1. Let value be value if given; otherwise blobValue.
+
+	    name = webidl.converters.USVString(name, prefix, 'name');
+	    value = isBlobLike(value)
+	      ? webidl.converters.Blob(value, prefix, 'name', { strict: false })
+	      : webidl.converters.USVString(value, prefix, 'name');
+	    filename = arguments.length === 3
+	      ? webidl.converters.USVString(filename, prefix, 'name')
+	      : undefined;
+
+	    // 2. Let entry be the result of creating an entry with name, value, and
+	    // filename if given.
+	    const entry = makeEntry(name, value, filename);
+
+	    // 3. If there are entries in this’s entry list whose name is name, then
+	    // replace the first such entry with entry and remove the others.
+	    const idx = this[kState].findIndex((entry) => entry.name === name);
+	    if (idx !== -1) {
+	      this[kState] = [
+	        ...this[kState].slice(0, idx),
+	        entry,
+	        ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name)
+	      ];
+	    } else {
+	      // 4. Otherwise, append entry to this’s entry list.
+	      this[kState].push(entry);
+	    }
+	  }
+
+	  [nodeUtil.inspect.custom] (depth, options) {
+	    const state = this[kState].reduce((a, b) => {
+	      if (a[b.name]) {
+	        if (Array.isArray(a[b.name])) {
+	          a[b.name].push(b.value);
+	        } else {
+	          a[b.name] = [a[b.name], b.value];
+	        }
+	      } else {
+	        a[b.name] = b.value;
+	      }
+
+	      return a
+	    }, { __proto__: null });
+
+	    options.depth ??= depth;
+	    options.colors ??= true;
+
+	    const output = nodeUtil.formatWithOptions(options, state);
+
+	    // remove [Object null prototype]
+	    return `FormData ${output.slice(output.indexOf(']') + 2)}`
+	  }
+	}
+
+	iteratorMixin('FormData', FormData, kState, 'name', 'value');
+
+	Object.defineProperties(FormData.prototype, {
+	  append: kEnumerableProperty,
+	  delete: kEnumerableProperty,
+	  get: kEnumerableProperty,
+	  getAll: kEnumerableProperty,
+	  has: kEnumerableProperty,
+	  set: kEnumerableProperty,
+	  [Symbol.toStringTag]: {
+	    value: 'FormData',
+	    configurable: true
+	  }
+	});
+
+	/**
+	 * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry
+	 * @param {string} name
+	 * @param {string|Blob} value
+	 * @param {?string} filename
+	 * @returns
+	 */
+	function makeEntry (name, value, filename) {
+	  // 1. Set name to the result of converting name into a scalar value string.
+	  // Note: This operation was done by the webidl converter USVString.
+
+	  // 2. If value is a string, then set value to the result of converting
+	  //    value into a scalar value string.
+	  if (typeof value === 'string') ; else {
+	    // 3. Otherwise:
+
+	    // 1. If value is not a File object, then set value to a new File object,
+	    //    representing the same bytes, whose name attribute value is "blob"
+	    if (!isFileLike(value)) {
+	      value = value instanceof Blob
+	        ? new File([value], 'blob', { type: value.type })
+	        : new FileLike(value, 'blob', { type: value.type });
+	    }
+
+	    // 2. If filename is given, then set value to a new File object,
+	    //    representing the same bytes, whose name attribute is filename.
+	    if (filename !== undefined) {
+	      /** @type {FilePropertyBag} */
+	      const options = {
+	        type: value.type,
+	        lastModified: value.lastModified
+	      };
+
+	      value = value instanceof NativeFile
+	        ? new File([value], filename, options)
+	        : new FileLike(value, filename, options);
+	    }
+	  }
+
+	  // 4. Return an entry whose name is name and whose value is value.
+	  return { name, value }
+	}
+
+	formdata = { FormData, makeEntry };
+	return formdata;
+}
+
+var formdataParser;
+var hasRequiredFormdataParser;
+
+function requireFormdataParser () {
+	if (hasRequiredFormdataParser) return formdataParser;
+	hasRequiredFormdataParser = 1;
+
+	const { isUSVString, bufferToLowerCasedHeaderName } = requireUtil$7();
+	const { utf8DecodeBytes } = requireUtil$6();
+	const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = requireDataUrl();
+	const { isFileLike } = requireFile();
+	const { makeEntry } = requireFormdata();
+	const assert = require$$0$7;
+	const { File: NodeFile } = require$$0$6;
+
+	const File = globalThis.File ?? NodeFile;
+
+	const formDataNameBuffer = Buffer.from('form-data; name="');
+	const filenameBuffer = Buffer.from('; filename');
+	const dd = Buffer.from('--');
+	const ddcrlf = Buffer.from('--\r\n');
+
+	/**
+	 * @param {string} chars
+	 */
+	function isAsciiString (chars) {
+	  for (let i = 0; i < chars.length; ++i) {
+	    if ((chars.charCodeAt(i) & -128) !== 0) {
+	      return false
+	    }
+	  }
+	  return true
+	}
+
+	/**
+	 * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary
+	 * @param {string} boundary
+	 */
+	function validateBoundary (boundary) {
+	  const length = boundary.length;
+
+	  // - its length is greater or equal to 27 and lesser or equal to 70, and
+	  if (length < 27 || length > 70) {
+	    return false
+	  }
+
+	  // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or
+	  //   0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('),
+	  //   0x2D (-) or 0x5F (_).
+	  for (let i = 0; i < length; ++i) {
+	    const cp = boundary.charCodeAt(i);
+
+	    if (!(
+	      (cp >= 0x30 && cp <= 0x39) ||
+	      (cp >= 0x41 && cp <= 0x5a) ||
+	      (cp >= 0x61 && cp <= 0x7a) ||
+	      cp === 0x27 ||
+	      cp === 0x2d ||
+	      cp === 0x5f
+	    )) {
+	      return false
+	    }
+	  }
+
+	  return true
+	}
+
+	/**
+	 * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser
+	 * @param {Buffer} input
+	 * @param {ReturnType} mimeType
+	 */
+	function multipartFormDataParser (input, mimeType) {
+	  // 1. Assert: mimeType’s essence is "multipart/form-data".
+	  assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data');
+
+	  const boundaryString = mimeType.parameters.get('boundary');
+
+	  // 2. If mimeType’s parameters["boundary"] does not exist, return failure.
+	  //    Otherwise, let boundary be the result of UTF-8 decoding mimeType’s
+	  //    parameters["boundary"].
+	  if (boundaryString === undefined) {
+	    return 'failure'
+	  }
+
+	  const boundary = Buffer.from(`--${boundaryString}`, 'utf8');
+
+	  // 3. Let entry list be an empty entry list.
+	  const entryList = [];
+
+	  // 4. Let position be a pointer to a byte in input, initially pointing at
+	  //    the first byte.
+	  const position = { position: 0 };
+
+	  // Note: undici addition, allows leading and trailing CRLFs.
+	  while (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) {
+	    position.position += 2;
+	  }
+
+	  let trailing = input.length;
+
+	  while (input[trailing - 1] === 0x0a && input[trailing - 2] === 0x0d) {
+	    trailing -= 2;
+	  }
+
+	  if (trailing !== input.length) {
+	    input = input.subarray(0, trailing);
+	  }
+
+	  // 5. While true:
+	  while (true) {
+	    // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D
+	    //      (`--`) followed by boundary, advance position by 2 + the length of
+	    //      boundary. Otherwise, return failure.
+	    // Note: boundary is padded with 2 dashes already, no need to add 2.
+	    if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) {
+	      position.position += boundary.length;
+	    } else {
+	      return 'failure'
+	    }
+
+	    // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A
+	    //      (`--` followed by CR LF) followed by the end of input, return entry list.
+	    // Note: a body does NOT need to end with CRLF. It can end with --.
+	    if (
+	      (position.position === input.length - 2 && bufferStartsWith(input, dd, position)) ||
+	      (position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position))
+	    ) {
+	      return entryList
+	    }
+
+	    // 5.3. If position does not point to a sequence of bytes starting with 0x0D
+	    //      0x0A (CR LF), return failure.
+	    if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {
+	      return 'failure'
+	    }
+
+	    // 5.4. Advance position by 2. (This skips past the newline.)
+	    position.position += 2;
+
+	    // 5.5. Let name, filename and contentType be the result of parsing
+	    //      multipart/form-data headers on input and position, if the result
+	    //      is not failure. Otherwise, return failure.
+	    const result = parseMultipartFormDataHeaders(input, position);
+
+	    if (result === 'failure') {
+	      return 'failure'
+	    }
+
+	    let { name, filename, contentType, encoding } = result;
+
+	    // 5.6. Advance position by 2. (This skips past the empty line that marks
+	    //      the end of the headers.)
+	    position.position += 2;
+
+	    // 5.7. Let body be the empty byte sequence.
+	    let body;
+
+	    // 5.8. Body loop: While position is not past the end of input:
+	    // TODO: the steps here are completely wrong
+	    {
+	      const boundaryIndex = input.indexOf(boundary.subarray(2), position.position);
+
+	      if (boundaryIndex === -1) {
+	        return 'failure'
+	      }
+
+	      body = input.subarray(position.position, boundaryIndex - 4);
+
+	      position.position += body.length;
+
+	      // Note: position must be advanced by the body's length before being
+	      // decoded, otherwise the parsing will fail.
+	      if (encoding === 'base64') {
+	        body = Buffer.from(body.toString(), 'base64');
+	      }
+	    }
+
+	    // 5.9. If position does not point to a sequence of bytes starting with
+	    //      0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2.
+	    if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {
+	      return 'failure'
+	    } else {
+	      position.position += 2;
+	    }
+
+	    // 5.10. If filename is not null:
+	    let value;
+
+	    if (filename !== null) {
+	      // 5.10.1. If contentType is null, set contentType to "text/plain".
+	      contentType ??= 'text/plain';
+
+	      // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string.
+
+	      // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead.
+	      // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`.
+	      if (!isAsciiString(contentType)) {
+	        contentType = '';
+	      }
+
+	      // 5.10.3. Let value be a new File object with name filename, type contentType, and body body.
+	      value = new File([body], filename, { type: contentType });
+	    } else {
+	      // 5.11. Otherwise:
+
+	      // 5.11.1. Let value be the UTF-8 decoding without BOM of body.
+	      value = utf8DecodeBytes(Buffer.from(body));
+	    }
+
+	    // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.
+	    assert(isUSVString(name));
+	    assert((typeof value === 'string' && isUSVString(value)) || isFileLike(value));
+
+	    // 5.13. Create an entry with name and value, and append it to entry list.
+	    entryList.push(makeEntry(name, value, filename));
+	  }
+	}
+
+	/**
+	 * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers
+	 * @param {Buffer} input
+	 * @param {{ position: number }} position
+	 */
+	function parseMultipartFormDataHeaders (input, position) {
+	  // 1. Let name, filename and contentType be null.
+	  let name = null;
+	  let filename = null;
+	  let contentType = null;
+	  let encoding = null;
+
+	  // 2. While true:
+	  while (true) {
+	    // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF):
+	    if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) {
+	      // 2.1.1. If name is null, return failure.
+	      if (name === null) {
+	        return 'failure'
+	      }
+
+	      // 2.1.2. Return name, filename and contentType.
+	      return { name, filename, contentType, encoding }
+	    }
+
+	    // 2.2. Let header name be the result of collecting a sequence of bytes that are
+	    //      not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position.
+	    let headerName = collectASequenceOfBytes(
+	      (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a,
+	      input,
+	      position
+	    );
+
+	    // 2.3. Remove any HTTP tab or space bytes from the start or end of header name.
+	    headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20);
+
+	    // 2.4. If header name does not match the field-name token production, return failure.
+	    if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) {
+	      return 'failure'
+	    }
+
+	    // 2.5. If the byte at position is not 0x3A (:), return failure.
+	    if (input[position.position] !== 0x3a) {
+	      return 'failure'
+	    }
+
+	    // 2.6. Advance position by 1.
+	    position.position++;
+
+	    // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position.
+	    //      (Do nothing with those bytes.)
+	    collectASequenceOfBytes(
+	      (char) => char === 0x20 || char === 0x09,
+	      input,
+	      position
+	    );
+
+	    // 2.8. Byte-lowercase header name and switch on the result:
+	    switch (bufferToLowerCasedHeaderName(headerName)) {
+	      case 'content-disposition': {
+	        // 1. Set name and filename to null.
+	        name = filename = null;
+
+	        // 2. If position does not point to a sequence of bytes starting with
+	        //    `form-data; name="`, return failure.
+	        if (!bufferStartsWith(input, formDataNameBuffer, position)) {
+	          return 'failure'
+	        }
+
+	        // 3. Advance position so it points at the byte after the next 0x22 (")
+	        //    byte (the one in the sequence of bytes matched above).
+	        position.position += 17;
+
+	        // 4. Set name to the result of parsing a multipart/form-data name given
+	        //    input and position, if the result is not failure. Otherwise, return
+	        //    failure.
+	        name = parseMultipartFormDataName(input, position);
+
+	        if (name === null) {
+	          return 'failure'
+	        }
+
+	        // 5. If position points to a sequence of bytes starting with `; filename="`:
+	        if (bufferStartsWith(input, filenameBuffer, position)) {
+	          // Note: undici also handles filename*
+	          let check = position.position + filenameBuffer.length;
+
+	          if (input[check] === 0x2a) {
+	            position.position += 1;
+	            check += 1;
+	          }
+
+	          if (input[check] !== 0x3d || input[check + 1] !== 0x22) { // ="
+	            return 'failure'
+	          }
+
+	          // 1. Advance position so it points at the byte after the next 0x22 (") byte
+	          //    (the one in the sequence of bytes matched above).
+	          position.position += 12;
+
+	          // 2. Set filename to the result of parsing a multipart/form-data name given
+	          //    input and position, if the result is not failure. Otherwise, return failure.
+	          filename = parseMultipartFormDataName(input, position);
+
+	          if (filename === null) {
+	            return 'failure'
+	          }
+	        }
+
+	        break
+	      }
+	      case 'content-type': {
+	        // 1. Let header value be the result of collecting a sequence of bytes that are
+	        //    not 0x0A (LF) or 0x0D (CR), given position.
+	        let headerValue = collectASequenceOfBytes(
+	          (char) => char !== 0x0a && char !== 0x0d,
+	          input,
+	          position
+	        );
+
+	        // 2. Remove any HTTP tab or space bytes from the end of header value.
+	        headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20);
+
+	        // 3. Set contentType to the isomorphic decoding of header value.
+	        contentType = isomorphicDecode(headerValue);
+
+	        break
+	      }
+	      case 'content-transfer-encoding': {
+	        let headerValue = collectASequenceOfBytes(
+	          (char) => char !== 0x0a && char !== 0x0d,
+	          input,
+	          position
+	        );
+
+	        headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20);
+
+	        encoding = isomorphicDecode(headerValue);
+
+	        break
+	      }
+	      default: {
+	        // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position.
+	        // (Do nothing with those bytes.)
+	        collectASequenceOfBytes(
+	          (char) => char !== 0x0a && char !== 0x0d,
+	          input,
+	          position
+	        );
+	      }
+	    }
+
+	    // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A
+	    //      (CR LF), return failure. Otherwise, advance position by 2 (past the newline).
+	    if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) {
+	      return 'failure'
+	    } else {
+	      position.position += 2;
+	    }
+	  }
+	}
+
+	/**
+	 * @see https://andreubotella.github.io/multipart-form-data/#parse-a-multipart-form-data-name
+	 * @param {Buffer} input
+	 * @param {{ position: number }} position
+	 */
+	function parseMultipartFormDataName (input, position) {
+	  // 1. Assert: The byte at (position - 1) is 0x22 (").
+	  assert(input[position.position - 1] === 0x22);
+
+	  // 2. Let name be the result of collecting a sequence of bytes that are not 0x0A (LF), 0x0D (CR) or 0x22 ("), given position.
+	  /** @type {string | Buffer} */
+	  let name = collectASequenceOfBytes(
+	    (char) => char !== 0x0a && char !== 0x0d && char !== 0x22,
+	    input,
+	    position
+	  );
+
+	  // 3. If the byte at position is not 0x22 ("), return failure. Otherwise, advance position by 1.
+	  if (input[position.position] !== 0x22) {
+	    return null // name could be 'failure'
+	  } else {
+	    position.position++;
+	  }
+
+	  // 4. Replace any occurrence of the following subsequences in name with the given byte:
+	  // - `%0A`: 0x0A (LF)
+	  // - `%0D`: 0x0D (CR)
+	  // - `%22`: 0x22 (")
+	  name = new TextDecoder().decode(name)
+	    .replace(/%0A/ig, '\n')
+	    .replace(/%0D/ig, '\r')
+	    .replace(/%22/g, '"');
+
+	  // 5. Return the UTF-8 decoding without BOM of name.
+	  return name
+	}
+
+	/**
+	 * @param {(char: number) => boolean} condition
+	 * @param {Buffer} input
+	 * @param {{ position: number }} position
+	 */
+	function collectASequenceOfBytes (condition, input, position) {
+	  let start = position.position;
+
+	  while (start < input.length && condition(input[start])) {
+	    ++start;
+	  }
+
+	  return input.subarray(position.position, (position.position = start))
+	}
+
+	/**
+	 * @param {Buffer} buf
+	 * @param {boolean} leading
+	 * @param {boolean} trailing
+	 * @param {(charCode: number) => boolean} predicate
+	 * @returns {Buffer}
+	 */
+	function removeChars (buf, leading, trailing, predicate) {
+	  let lead = 0;
+	  let trail = buf.length - 1;
+
+	  if (leading) {
+	    while (lead < buf.length && predicate(buf[lead])) lead++;
+	  }
+
+	  {
+	    while (trail > 0 && predicate(buf[trail])) trail--;
+	  }
+
+	  return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1)
+	}
+
+	/**
+	 * Checks if {@param buffer} starts with {@param start}
+	 * @param {Buffer} buffer
+	 * @param {Buffer} start
+	 * @param {{ position: number }} position
+	 */
+	function bufferStartsWith (buffer, start, position) {
+	  if (buffer.length < start.length) {
+	    return false
+	  }
+
+	  for (let i = 0; i < start.length; i++) {
+	    if (start[i] !== buffer[position.position + i]) {
+	      return false
+	    }
+	  }
+
+	  return true
+	}
+
+	formdataParser = {
+	  multipartFormDataParser,
+	  validateBoundary
+	};
+	return formdataParser;
+}
+
+var body;
+var hasRequiredBody;
+
+function requireBody () {
+	if (hasRequiredBody) return body;
+	hasRequiredBody = 1;
+
+	const util = requireUtil$7();
+	const {
+	  ReadableStreamFrom,
+	  isBlobLike,
+	  isReadableStreamLike,
+	  readableStreamClose,
+	  createDeferredPromise,
+	  fullyReadBody,
+	  extractMimeType,
+	  utf8DecodeBytes
+	} = requireUtil$6();
+	const { FormData } = requireFormdata();
+	const { kState } = requireSymbols$3();
+	const { webidl } = requireWebidl();
+	const { Blob } = require$$0$6;
+	const assert = require$$0$7;
+	const { isErrored, isDisturbed } = require$$0$8;
+	const { isArrayBuffer } = require$$8$1;
+	const { serializeAMimeType } = requireDataUrl();
+	const { multipartFormDataParser } = requireFormdataParser();
+	let random;
+
+	try {
+	  const crypto = require('node:crypto');
+	  random = (max) => crypto.randomInt(0, max);
+	} catch {
+	  random = (max) => Math.floor(Math.random(max));
+	}
+
+	const textEncoder = new TextEncoder();
+	function noop () {}
+
+	const hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf('v18') !== 0;
+	let streamRegistry;
+
+	if (hasFinalizationRegistry) {
+	  streamRegistry = new FinalizationRegistry((weakRef) => {
+	    const stream = weakRef.deref();
+	    if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) {
+	      stream.cancel('Response object has been garbage collected').catch(noop);
+	    }
+	  });
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-bodyinit-extract
+	function extractBody (object, keepalive = false) {
+	  // 1. Let stream be null.
+	  let stream = null;
+
+	  // 2. If object is a ReadableStream object, then set stream to object.
+	  if (object instanceof ReadableStream) {
+	    stream = object;
+	  } else if (isBlobLike(object)) {
+	    // 3. Otherwise, if object is a Blob object, set stream to the
+	    //    result of running object’s get stream.
+	    stream = object.stream();
+	  } else {
+	    // 4. Otherwise, set stream to a new ReadableStream object, and set
+	    //    up stream with byte reading support.
+	    stream = new ReadableStream({
+	      async pull (controller) {
+	        const buffer = typeof source === 'string' ? textEncoder.encode(source) : source;
+
+	        if (buffer.byteLength) {
+	          controller.enqueue(buffer);
+	        }
+
+	        queueMicrotask(() => readableStreamClose(controller));
+	      },
+	      start () {},
+	      type: 'bytes'
+	    });
+	  }
+
+	  // 5. Assert: stream is a ReadableStream object.
+	  assert(isReadableStreamLike(stream));
+
+	  // 6. Let action be null.
+	  let action = null;
+
+	  // 7. Let source be null.
+	  let source = null;
+
+	  // 8. Let length be null.
+	  let length = null;
+
+	  // 9. Let type be null.
+	  let type = null;
+
+	  // 10. Switch on object:
+	  if (typeof object === 'string') {
+	    // Set source to the UTF-8 encoding of object.
+	    // Note: setting source to a Uint8Array here breaks some mocking assumptions.
+	    source = object;
+
+	    // Set type to `text/plain;charset=UTF-8`.
+	    type = 'text/plain;charset=UTF-8';
+	  } else if (object instanceof URLSearchParams) {
+	    // URLSearchParams
+
+	    // spec says to run application/x-www-form-urlencoded on body.list
+	    // this is implemented in Node.js as apart of an URLSearchParams instance toString method
+	    // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490
+	    // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100
+
+	    // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list.
+	    source = object.toString();
+
+	    // Set type to `application/x-www-form-urlencoded;charset=UTF-8`.
+	    type = 'application/x-www-form-urlencoded;charset=UTF-8';
+	  } else if (isArrayBuffer(object)) {
+	    // BufferSource/ArrayBuffer
+
+	    // Set source to a copy of the bytes held by object.
+	    source = new Uint8Array(object.slice());
+	  } else if (ArrayBuffer.isView(object)) {
+	    // BufferSource/ArrayBufferView
+
+	    // Set source to a copy of the bytes held by object.
+	    source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength));
+	  } else if (util.isFormDataLike(object)) {
+	    const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`;
+	    const prefix = `--${boundary}\r\nContent-Disposition: form-data`;
+
+	    /*! formdata-polyfill. MIT License. Jimmy Wärting  */
+	    const escape = (str) =>
+	      str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22');
+	    const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n');
+
+	    // Set action to this step: run the multipart/form-data
+	    // encoding algorithm, with object’s entry list and UTF-8.
+	    // - This ensures that the body is immutable and can't be changed afterwords
+	    // - That the content-length is calculated in advance.
+	    // - And that all parts are pre-encoded and ready to be sent.
+
+	    const blobParts = [];
+	    const rn = new Uint8Array([13, 10]); // '\r\n'
+	    length = 0;
+	    let hasUnknownSizeValue = false;
+
+	    for (const [name, value] of object) {
+	      if (typeof value === 'string') {
+	        const chunk = textEncoder.encode(prefix +
+	          `; name="${escape(normalizeLinefeeds(name))}"` +
+	          `\r\n\r\n${normalizeLinefeeds(value)}\r\n`);
+	        blobParts.push(chunk);
+	        length += chunk.byteLength;
+	      } else {
+	        const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` +
+	          (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' +
+	          `Content-Type: ${
+	            value.type || 'application/octet-stream'
+	          }\r\n\r\n`);
+	        blobParts.push(chunk, value, rn);
+	        if (typeof value.size === 'number') {
+	          length += chunk.byteLength + value.size + rn.byteLength;
+	        } else {
+	          hasUnknownSizeValue = true;
+	        }
+	      }
+	    }
+
+	    // CRLF is appended to the body to function with legacy servers and match other implementations.
+	    // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030
+	    // https://github.com/form-data/form-data/issues/63
+	    const chunk = textEncoder.encode(`--${boundary}--\r\n`);
+	    blobParts.push(chunk);
+	    length += chunk.byteLength;
+	    if (hasUnknownSizeValue) {
+	      length = null;
+	    }
+
+	    // Set source to object.
+	    source = object;
+
+	    action = async function * () {
+	      for (const part of blobParts) {
+	        if (part.stream) {
+	          yield * part.stream();
+	        } else {
+	          yield part;
+	        }
+	      }
+	    };
+
+	    // Set type to `multipart/form-data; boundary=`,
+	    // followed by the multipart/form-data boundary string generated
+	    // by the multipart/form-data encoding algorithm.
+	    type = `multipart/form-data; boundary=${boundary}`;
+	  } else if (isBlobLike(object)) {
+	    // Blob
+
+	    // Set source to object.
+	    source = object;
+
+	    // Set length to object’s size.
+	    length = object.size;
+
+	    // If object’s type attribute is not the empty byte sequence, set
+	    // type to its value.
+	    if (object.type) {
+	      type = object.type;
+	    }
+	  } else if (typeof object[Symbol.asyncIterator] === 'function') {
+	    // If keepalive is true, then throw a TypeError.
+	    if (keepalive) {
+	      throw new TypeError('keepalive')
+	    }
+
+	    // If object is disturbed or locked, then throw a TypeError.
+	    if (util.isDisturbed(object) || object.locked) {
+	      throw new TypeError(
+	        'Response body object should not be disturbed or locked'
+	      )
+	    }
+
+	    stream =
+	      object instanceof ReadableStream ? object : ReadableStreamFrom(object);
+	  }
+
+	  // 11. If source is a byte sequence, then set action to a
+	  // step that returns source and length to source’s length.
+	  if (typeof source === 'string' || util.isBuffer(source)) {
+	    length = Buffer.byteLength(source);
+	  }
+
+	  // 12. If action is non-null, then run these steps in in parallel:
+	  if (action != null) {
+	    // Run action.
+	    let iterator;
+	    stream = new ReadableStream({
+	      async start () {
+	        iterator = action(object)[Symbol.asyncIterator]();
+	      },
+	      async pull (controller) {
+	        const { value, done } = await iterator.next();
+	        if (done) {
+	          // When running action is done, close stream.
+	          queueMicrotask(() => {
+	            controller.close();
+	            controller.byobRequest?.respond(0);
+	          });
+	        } else {
+	          // Whenever one or more bytes are available and stream is not errored,
+	          // enqueue a Uint8Array wrapping an ArrayBuffer containing the available
+	          // bytes into stream.
+	          if (!isErrored(stream)) {
+	            const buffer = new Uint8Array(value);
+	            if (buffer.byteLength) {
+	              controller.enqueue(buffer);
+	            }
+	          }
+	        }
+	        return controller.desiredSize > 0
+	      },
+	      async cancel (reason) {
+	        await iterator.return();
+	      },
+	      type: 'bytes'
+	    });
+	  }
+
+	  // 13. Let body be a body whose stream is stream, source is source,
+	  // and length is length.
+	  const body = { stream, source, length };
+
+	  // 14. Return (body, type).
+	  return [body, type]
+	}
+
+	// https://fetch.spec.whatwg.org/#bodyinit-safely-extract
+	function safelyExtractBody (object, keepalive = false) {
+	  // To safely extract a body and a `Content-Type` value from
+	  // a byte sequence or BodyInit object object, run these steps:
+
+	  // 1. If object is a ReadableStream object, then:
+	  if (object instanceof ReadableStream) {
+	    // Assert: object is neither disturbed nor locked.
+	    // istanbul ignore next
+	    assert(!util.isDisturbed(object), 'The body has already been consumed.');
+	    // istanbul ignore next
+	    assert(!object.locked, 'The stream is locked.');
+	  }
+
+	  // 2. Return the results of extracting object.
+	  return extractBody(object, keepalive)
+	}
+
+	function cloneBody (instance, body) {
+	  // To clone a body body, run these steps:
+
+	  // https://fetch.spec.whatwg.org/#concept-body-clone
+
+	  // 1. Let « out1, out2 » be the result of teeing body’s stream.
+	  const [out1, out2] = body.stream.tee();
+
+	  // 2. Set body’s stream to out1.
+	  body.stream = out1;
+
+	  // 3. Return a body whose stream is out2 and other members are copied from body.
+	  return {
+	    stream: out2,
+	    length: body.length,
+	    source: body.source
+	  }
+	}
+
+	function throwIfAborted (state) {
+	  if (state.aborted) {
+	    throw new DOMException('The operation was aborted.', 'AbortError')
+	  }
+	}
+
+	function bodyMixinMethods (instance) {
+	  const methods = {
+	    blob () {
+	      // The blob() method steps are to return the result of
+	      // running consume body with this and the following step
+	      // given a byte sequence bytes: return a Blob whose
+	      // contents are bytes and whose type attribute is this’s
+	      // MIME type.
+	      return consumeBody(this, (bytes) => {
+	        let mimeType = bodyMimeType(this);
+
+	        if (mimeType === null) {
+	          mimeType = '';
+	        } else if (mimeType) {
+	          mimeType = serializeAMimeType(mimeType);
+	        }
+
+	        // Return a Blob whose contents are bytes and type attribute
+	        // is mimeType.
+	        return new Blob([bytes], { type: mimeType })
+	      }, instance)
+	    },
+
+	    arrayBuffer () {
+	      // The arrayBuffer() method steps are to return the result
+	      // of running consume body with this and the following step
+	      // given a byte sequence bytes: return a new ArrayBuffer
+	      // whose contents are bytes.
+	      return consumeBody(this, (bytes) => {
+	        return new Uint8Array(bytes).buffer
+	      }, instance)
+	    },
+
+	    text () {
+	      // The text() method steps are to return the result of running
+	      // consume body with this and UTF-8 decode.
+	      return consumeBody(this, utf8DecodeBytes, instance)
+	    },
+
+	    json () {
+	      // The json() method steps are to return the result of running
+	      // consume body with this and parse JSON from bytes.
+	      return consumeBody(this, parseJSONFromBytes, instance)
+	    },
+
+	    formData () {
+	      // The formData() method steps are to return the result of running
+	      // consume body with this and the following step given a byte sequence bytes:
+	      return consumeBody(this, (value) => {
+	        // 1. Let mimeType be the result of get the MIME type with this.
+	        const mimeType = bodyMimeType(this);
+
+	        // 2. If mimeType is non-null, then switch on mimeType’s essence and run
+	        //    the corresponding steps:
+	        if (mimeType !== null) {
+	          switch (mimeType.essence) {
+	            case 'multipart/form-data': {
+	              // 1. ... [long step]
+	              const parsed = multipartFormDataParser(value, mimeType);
+
+	              // 2. If that fails for some reason, then throw a TypeError.
+	              if (parsed === 'failure') {
+	                throw new TypeError('Failed to parse body as FormData.')
+	              }
+
+	              // 3. Return a new FormData object, appending each entry,
+	              //    resulting from the parsing operation, to its entry list.
+	              const fd = new FormData();
+	              fd[kState] = parsed;
+
+	              return fd
+	            }
+	            case 'application/x-www-form-urlencoded': {
+	              // 1. Let entries be the result of parsing bytes.
+	              const entries = new URLSearchParams(value.toString());
+
+	              // 2. If entries is failure, then throw a TypeError.
+
+	              // 3. Return a new FormData object whose entry list is entries.
+	              const fd = new FormData();
+
+	              for (const [name, value] of entries) {
+	                fd.append(name, value);
+	              }
+
+	              return fd
+	            }
+	          }
+	        }
+
+	        // 3. Throw a TypeError.
+	        throw new TypeError(
+	          'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".'
+	        )
+	      }, instance)
+	    },
+
+	    bytes () {
+	      // The bytes() method steps are to return the result of running consume body
+	      // with this and the following step given a byte sequence bytes: return the
+	      // result of creating a Uint8Array from bytes in this’s relevant realm.
+	      return consumeBody(this, (bytes) => {
+	        return new Uint8Array(bytes)
+	      }, instance)
+	    }
+	  };
+
+	  return methods
+	}
+
+	function mixinBody (prototype) {
+	  Object.assign(prototype.prototype, bodyMixinMethods(prototype));
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-body-consume-body
+	 * @param {Response|Request} object
+	 * @param {(value: unknown) => unknown} convertBytesToJSValue
+	 * @param {Response|Request} instance
+	 */
+	async function consumeBody (object, convertBytesToJSValue, instance) {
+	  webidl.brandCheck(object, instance);
+
+	  // 1. If object is unusable, then return a promise rejected
+	  //    with a TypeError.
+	  if (bodyUnusable(object)) {
+	    throw new TypeError('Body is unusable: Body has already been read')
+	  }
+
+	  throwIfAborted(object[kState]);
+
+	  // 2. Let promise be a new promise.
+	  const promise = createDeferredPromise();
+
+	  // 3. Let errorSteps given error be to reject promise with error.
+	  const errorSteps = (error) => promise.reject(error);
+
+	  // 4. Let successSteps given a byte sequence data be to resolve
+	  //    promise with the result of running convertBytesToJSValue
+	  //    with data. If that threw an exception, then run errorSteps
+	  //    with that exception.
+	  const successSteps = (data) => {
+	    try {
+	      promise.resolve(convertBytesToJSValue(data));
+	    } catch (e) {
+	      errorSteps(e);
+	    }
+	  };
+
+	  // 5. If object’s body is null, then run successSteps with an
+	  //    empty byte sequence.
+	  if (object[kState].body == null) {
+	    successSteps(Buffer.allocUnsafe(0));
+	    return promise.promise
+	  }
+
+	  // 6. Otherwise, fully read object’s body given successSteps,
+	  //    errorSteps, and object’s relevant global object.
+	  await fullyReadBody(object[kState].body, successSteps, errorSteps);
+
+	  // 7. Return promise.
+	  return promise.promise
+	}
+
+	// https://fetch.spec.whatwg.org/#body-unusable
+	function bodyUnusable (object) {
+	  const body = object[kState].body;
+
+	  // An object including the Body interface mixin is
+	  // said to be unusable if its body is non-null and
+	  // its body’s stream is disturbed or locked.
+	  return body != null && (body.stream.locked || util.isDisturbed(body.stream))
+	}
+
+	/**
+	 * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value
+	 * @param {Uint8Array} bytes
+	 */
+	function parseJSONFromBytes (bytes) {
+	  return JSON.parse(utf8DecodeBytes(bytes))
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-body-mime-type
+	 * @param {import('./response').Response|import('./request').Request} requestOrResponse
+	 */
+	function bodyMimeType (requestOrResponse) {
+	  // 1. Let headers be null.
+	  // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list.
+	  // 3. Otherwise, set headers to requestOrResponse’s response’s header list.
+	  /** @type {import('./headers').HeadersList} */
+	  const headers = requestOrResponse[kState].headersList;
+
+	  // 4. Let mimeType be the result of extracting a MIME type from headers.
+	  const mimeType = extractMimeType(headers);
+
+	  // 5. If mimeType is failure, then return null.
+	  if (mimeType === 'failure') {
+	    return null
+	  }
+
+	  // 6. Return mimeType.
+	  return mimeType
+	}
+
+	body = {
+	  extractBody,
+	  safelyExtractBody,
+	  cloneBody,
+	  mixinBody,
+	  streamRegistry,
+	  hasFinalizationRegistry,
+	  bodyUnusable
+	};
+	return body;
+}
+
+var clientH1;
+var hasRequiredClientH1;
+
+function requireClientH1 () {
+	if (hasRequiredClientH1) return clientH1;
+	hasRequiredClientH1 = 1;
+
+	/* global WebAssembly */
+
+	const assert = require$$0$7;
+	const util = requireUtil$7();
+	const { channels } = requireDiagnostics();
+	const timers = requireTimers();
+	const {
+	  RequestContentLengthMismatchError,
+	  ResponseContentLengthMismatchError,
+	  RequestAbortedError,
+	  HeadersTimeoutError,
+	  HeadersOverflowError,
+	  SocketError,
+	  InformationalError,
+	  BodyTimeoutError,
+	  HTTPParserError,
+	  ResponseExceededMaxSizeError
+	} = requireErrors();
+	const {
+	  kUrl,
+	  kReset,
+	  kClient,
+	  kParser,
+	  kBlocking,
+	  kRunning,
+	  kPending,
+	  kSize,
+	  kWriting,
+	  kQueue,
+	  kNoRef,
+	  kKeepAliveDefaultTimeout,
+	  kHostHeader,
+	  kPendingIdx,
+	  kRunningIdx,
+	  kError,
+	  kPipelining,
+	  kSocket,
+	  kKeepAliveTimeoutValue,
+	  kMaxHeadersSize,
+	  kKeepAliveMaxTimeout,
+	  kKeepAliveTimeoutThreshold,
+	  kHeadersTimeout,
+	  kBodyTimeout,
+	  kStrictContentLength,
+	  kMaxRequests,
+	  kCounter,
+	  kMaxResponseSize,
+	  kOnError,
+	  kResume,
+	  kHTTPContext
+	} = requireSymbols$4();
+
+	const constants = requireConstants$4();
+	const EMPTY_BUF = Buffer.alloc(0);
+	const FastBuffer = Buffer[Symbol.species];
+	const addListener = util.addListener;
+	const removeAllListeners = util.removeAllListeners;
+
+	let extractBody;
+
+	async function lazyllhttp () {
+	  const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm() : undefined;
+
+	  let mod;
+	  try {
+	    mod = await WebAssembly.compile(requireLlhttp_simdWasm());
+	  } catch (e) {
+	    /* istanbul ignore next */
+
+	    // We could check if the error was caused by the simd option not
+	    // being enabled, but the occurring of this other error
+	    // * https://github.com/emscripten-core/emscripten/issues/11495
+	    // got me to remove that check to avoid breaking Node 12.
+	    mod = await WebAssembly.compile(llhttpWasmData || requireLlhttpWasm());
+	  }
+
+	  return await WebAssembly.instantiate(mod, {
+	    env: {
+	      /* eslint-disable camelcase */
+
+	      wasm_on_url: (p, at, len) => {
+	        /* istanbul ignore next */
+	        return 0
+	      },
+	      wasm_on_status: (p, at, len) => {
+	        assert(currentParser.ptr === p);
+	        const start = at - currentBufferPtr + currentBufferRef.byteOffset;
+	        return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
+	      },
+	      wasm_on_message_begin: (p) => {
+	        assert(currentParser.ptr === p);
+	        return currentParser.onMessageBegin() || 0
+	      },
+	      wasm_on_header_field: (p, at, len) => {
+	        assert(currentParser.ptr === p);
+	        const start = at - currentBufferPtr + currentBufferRef.byteOffset;
+	        return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
+	      },
+	      wasm_on_header_value: (p, at, len) => {
+	        assert(currentParser.ptr === p);
+	        const start = at - currentBufferPtr + currentBufferRef.byteOffset;
+	        return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
+	      },
+	      wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {
+	        assert(currentParser.ptr === p);
+	        return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0
+	      },
+	      wasm_on_body: (p, at, len) => {
+	        assert(currentParser.ptr === p);
+	        const start = at - currentBufferPtr + currentBufferRef.byteOffset;
+	        return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
+	      },
+	      wasm_on_message_complete: (p) => {
+	        assert(currentParser.ptr === p);
+	        return currentParser.onMessageComplete() || 0
+	      }
+
+	      /* eslint-enable camelcase */
+	    }
+	  })
+	}
+
+	let llhttpInstance = null;
+	let llhttpPromise = lazyllhttp();
+	llhttpPromise.catch();
+
+	let currentParser = null;
+	let currentBufferRef = null;
+	let currentBufferSize = 0;
+	let currentBufferPtr = null;
+
+	const USE_NATIVE_TIMER = 0;
+	const USE_FAST_TIMER = 1;
+
+	// Use fast timers for headers and body to take eventual event loop
+	// latency into account.
+	const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER;
+	const TIMEOUT_BODY = 4 | USE_FAST_TIMER;
+
+	// Use native timers to ignore event loop latency for keep-alive
+	// handling.
+	const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER;
+
+	class Parser {
+	  constructor (client, socket, { exports: exports$1 }) {
+	    assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0);
+
+	    this.llhttp = exports$1;
+	    this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE);
+	    this.client = client;
+	    this.socket = socket;
+	    this.timeout = null;
+	    this.timeoutValue = null;
+	    this.timeoutType = null;
+	    this.statusCode = null;
+	    this.statusText = '';
+	    this.upgrade = false;
+	    this.headers = [];
+	    this.headersSize = 0;
+	    this.headersMaxSize = client[kMaxHeadersSize];
+	    this.shouldKeepAlive = false;
+	    this.paused = false;
+	    this.resume = this.resume.bind(this);
+
+	    this.bytesRead = 0;
+
+	    this.keepAlive = '';
+	    this.contentLength = '';
+	    this.connection = '';
+	    this.maxResponseSize = client[kMaxResponseSize];
+	  }
+
+	  setTimeout (delay, type) {
+	    // If the existing timer and the new timer are of different timer type
+	    // (fast or native) or have different delay, we need to clear the existing
+	    // timer and set a new one.
+	    if (
+	      delay !== this.timeoutValue ||
+	      (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER)
+	    ) {
+	      // If a timeout is already set, clear it with clearTimeout of the fast
+	      // timer implementation, as it can clear fast and native timers.
+	      if (this.timeout) {
+	        timers.clearTimeout(this.timeout);
+	        this.timeout = null;
+	      }
+
+	      if (delay) {
+	        if (type & USE_FAST_TIMER) {
+	          this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this));
+	        } else {
+	          this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this));
+	          this.timeout.unref();
+	        }
+	      }
+
+	      this.timeoutValue = delay;
+	    } else if (this.timeout) {
+	      // istanbul ignore else: only for jest
+	      if (this.timeout.refresh) {
+	        this.timeout.refresh();
+	      }
+	    }
+
+	    this.timeoutType = type;
+	  }
+
+	  resume () {
+	    if (this.socket.destroyed || !this.paused) {
+	      return
+	    }
+
+	    assert(this.ptr != null);
+	    assert(currentParser == null);
+
+	    this.llhttp.llhttp_resume(this.ptr);
+
+	    assert(this.timeoutType === TIMEOUT_BODY);
+	    if (this.timeout) {
+	      // istanbul ignore else: only for jest
+	      if (this.timeout.refresh) {
+	        this.timeout.refresh();
+	      }
+	    }
+
+	    this.paused = false;
+	    this.execute(this.socket.read() || EMPTY_BUF); // Flush parser.
+	    this.readMore();
+	  }
+
+	  readMore () {
+	    while (!this.paused && this.ptr) {
+	      const chunk = this.socket.read();
+	      if (chunk === null) {
+	        break
+	      }
+	      this.execute(chunk);
+	    }
+	  }
+
+	  execute (data) {
+	    assert(this.ptr != null);
+	    assert(currentParser == null);
+	    assert(!this.paused);
+
+	    const { socket, llhttp } = this;
+
+	    if (data.length > currentBufferSize) {
+	      if (currentBufferPtr) {
+	        llhttp.free(currentBufferPtr);
+	      }
+	      currentBufferSize = Math.ceil(data.length / 4096) * 4096;
+	      currentBufferPtr = llhttp.malloc(currentBufferSize);
+	    }
+
+	    new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data);
+
+	    // Call `execute` on the wasm parser.
+	    // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,
+	    // and finally the length of bytes to parse.
+	    // The return value is an error code or `constants.ERROR.OK`.
+	    try {
+	      let ret;
+
+	      try {
+	        currentBufferRef = data;
+	        currentParser = this;
+	        ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length);
+	        /* eslint-disable-next-line no-useless-catch */
+	      } catch (err) {
+	        /* istanbul ignore next: difficult to make a test case for */
+	        throw err
+	      } finally {
+	        currentParser = null;
+	        currentBufferRef = null;
+	      }
+
+	      const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr;
+
+	      if (ret === constants.ERROR.PAUSED_UPGRADE) {
+	        this.onUpgrade(data.slice(offset));
+	      } else if (ret === constants.ERROR.PAUSED) {
+	        this.paused = true;
+	        socket.unshift(data.slice(offset));
+	      } else if (ret !== constants.ERROR.OK) {
+	        const ptr = llhttp.llhttp_get_error_reason(this.ptr);
+	        let message = '';
+	        /* istanbul ignore else: difficult to make a test case for */
+	        if (ptr) {
+	          const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0);
+	          message =
+	            'Response does not match the HTTP/1.1 protocol (' +
+	            Buffer.from(llhttp.memory.buffer, ptr, len).toString() +
+	            ')';
+	        }
+	        throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset))
+	      }
+	    } catch (err) {
+	      util.destroy(socket, err);
+	    }
+	  }
+
+	  destroy () {
+	    assert(this.ptr != null);
+	    assert(currentParser == null);
+
+	    this.llhttp.llhttp_free(this.ptr);
+	    this.ptr = null;
+
+	    this.timeout && timers.clearTimeout(this.timeout);
+	    this.timeout = null;
+	    this.timeoutValue = null;
+	    this.timeoutType = null;
+
+	    this.paused = false;
+	  }
+
+	  onStatus (buf) {
+	    this.statusText = buf.toString();
+	  }
+
+	  onMessageBegin () {
+	    const { socket, client } = this;
+
+	    /* istanbul ignore next: difficult to make a test case for */
+	    if (socket.destroyed) {
+	      return -1
+	    }
+
+	    const request = client[kQueue][client[kRunningIdx]];
+	    if (!request) {
+	      return -1
+	    }
+	    request.onResponseStarted();
+	  }
+
+	  onHeaderField (buf) {
+	    const len = this.headers.length;
+
+	    if ((len & 1) === 0) {
+	      this.headers.push(buf);
+	    } else {
+	      this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]);
+	    }
+
+	    this.trackHeader(buf.length);
+	  }
+
+	  onHeaderValue (buf) {
+	    let len = this.headers.length;
+
+	    if ((len & 1) === 1) {
+	      this.headers.push(buf);
+	      len += 1;
+	    } else {
+	      this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]);
+	    }
+
+	    const key = this.headers[len - 2];
+	    if (key.length === 10) {
+	      const headerName = util.bufferToLowerCasedHeaderName(key);
+	      if (headerName === 'keep-alive') {
+	        this.keepAlive += buf.toString();
+	      } else if (headerName === 'connection') {
+	        this.connection += buf.toString();
+	      }
+	    } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') {
+	      this.contentLength += buf.toString();
+	    }
+
+	    this.trackHeader(buf.length);
+	  }
+
+	  trackHeader (len) {
+	    this.headersSize += len;
+	    if (this.headersSize >= this.headersMaxSize) {
+	      util.destroy(this.socket, new HeadersOverflowError());
+	    }
+	  }
+
+	  onUpgrade (head) {
+	    const { upgrade, client, socket, headers, statusCode } = this;
+
+	    assert(upgrade);
+	    assert(client[kSocket] === socket);
+	    assert(!socket.destroyed);
+	    assert(!this.paused);
+	    assert((headers.length & 1) === 0);
+
+	    const request = client[kQueue][client[kRunningIdx]];
+	    assert(request);
+	    assert(request.upgrade || request.method === 'CONNECT');
+
+	    this.statusCode = null;
+	    this.statusText = '';
+	    this.shouldKeepAlive = null;
+
+	    this.headers = [];
+	    this.headersSize = 0;
+
+	    socket.unshift(head);
+
+	    socket[kParser].destroy();
+	    socket[kParser] = null;
+
+	    socket[kClient] = null;
+	    socket[kError] = null;
+
+	    removeAllListeners(socket);
+
+	    client[kSocket] = null;
+	    client[kHTTPContext] = null; // TODO (fix): This is hacky...
+	    client[kQueue][client[kRunningIdx]++] = null;
+	    client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'));
+
+	    try {
+	      request.onUpgrade(statusCode, headers, socket);
+	    } catch (err) {
+	      util.destroy(socket, err);
+	    }
+
+	    client[kResume]();
+	  }
+
+	  onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {
+	    const { client, socket, headers, statusText } = this;
+
+	    /* istanbul ignore next: difficult to make a test case for */
+	    if (socket.destroyed) {
+	      return -1
+	    }
+
+	    const request = client[kQueue][client[kRunningIdx]];
+
+	    /* istanbul ignore next: difficult to make a test case for */
+	    if (!request) {
+	      return -1
+	    }
+
+	    assert(!this.upgrade);
+	    assert(this.statusCode < 200);
+
+	    if (statusCode === 100) {
+	      util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)));
+	      return -1
+	    }
+
+	    /* this can only happen if server is misbehaving */
+	    if (upgrade && !request.upgrade) {
+	      util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)));
+	      return -1
+	    }
+
+	    assert(this.timeoutType === TIMEOUT_HEADERS);
+
+	    this.statusCode = statusCode;
+	    this.shouldKeepAlive = (
+	      shouldKeepAlive ||
+	      // Override llhttp value which does not allow keepAlive for HEAD.
+	      (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')
+	    );
+
+	    if (this.statusCode >= 200) {
+	      const bodyTimeout = request.bodyTimeout != null
+	        ? request.bodyTimeout
+	        : client[kBodyTimeout];
+	      this.setTimeout(bodyTimeout, TIMEOUT_BODY);
+	    } else if (this.timeout) {
+	      // istanbul ignore else: only for jest
+	      if (this.timeout.refresh) {
+	        this.timeout.refresh();
+	      }
+	    }
+
+	    if (request.method === 'CONNECT') {
+	      assert(client[kRunning] === 1);
+	      this.upgrade = true;
+	      return 2
+	    }
+
+	    if (upgrade) {
+	      assert(client[kRunning] === 1);
+	      this.upgrade = true;
+	      return 2
+	    }
+
+	    assert((this.headers.length & 1) === 0);
+	    this.headers = [];
+	    this.headersSize = 0;
+
+	    if (this.shouldKeepAlive && client[kPipelining]) {
+	      const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null;
+
+	      if (keepAliveTimeout != null) {
+	        const timeout = Math.min(
+	          keepAliveTimeout - client[kKeepAliveTimeoutThreshold],
+	          client[kKeepAliveMaxTimeout]
+	        );
+	        if (timeout <= 0) {
+	          socket[kReset] = true;
+	        } else {
+	          client[kKeepAliveTimeoutValue] = timeout;
+	        }
+	      } else {
+	        client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout];
+	      }
+	    } else {
+	      // Stop more requests from being dispatched.
+	      socket[kReset] = true;
+	    }
+
+	    const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false;
+
+	    if (request.aborted) {
+	      return -1
+	    }
+
+	    if (request.method === 'HEAD') {
+	      return 1
+	    }
+
+	    if (statusCode < 200) {
+	      return 1
+	    }
+
+	    if (socket[kBlocking]) {
+	      socket[kBlocking] = false;
+	      client[kResume]();
+	    }
+
+	    return pause ? constants.ERROR.PAUSED : 0
+	  }
+
+	  onBody (buf) {
+	    const { client, socket, statusCode, maxResponseSize } = this;
+
+	    if (socket.destroyed) {
+	      return -1
+	    }
+
+	    const request = client[kQueue][client[kRunningIdx]];
+	    assert(request);
+
+	    assert(this.timeoutType === TIMEOUT_BODY);
+	    if (this.timeout) {
+	      // istanbul ignore else: only for jest
+	      if (this.timeout.refresh) {
+	        this.timeout.refresh();
+	      }
+	    }
+
+	    assert(statusCode >= 200);
+
+	    if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {
+	      util.destroy(socket, new ResponseExceededMaxSizeError());
+	      return -1
+	    }
+
+	    this.bytesRead += buf.length;
+
+	    if (request.onData(buf) === false) {
+	      return constants.ERROR.PAUSED
+	    }
+	  }
+
+	  onMessageComplete () {
+	    const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this;
+
+	    if (socket.destroyed && (!statusCode || shouldKeepAlive)) {
+	      return -1
+	    }
+
+	    if (upgrade) {
+	      return
+	    }
+
+	    assert(statusCode >= 100);
+	    assert((this.headers.length & 1) === 0);
+
+	    const request = client[kQueue][client[kRunningIdx]];
+	    assert(request);
+
+	    this.statusCode = null;
+	    this.statusText = '';
+	    this.bytesRead = 0;
+	    this.contentLength = '';
+	    this.keepAlive = '';
+	    this.connection = '';
+
+	    this.headers = [];
+	    this.headersSize = 0;
+
+	    if (statusCode < 200) {
+	      return
+	    }
+
+	    /* istanbul ignore next: should be handled by llhttp? */
+	    if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {
+	      util.destroy(socket, new ResponseContentLengthMismatchError());
+	      return -1
+	    }
+
+	    request.onComplete(headers);
+
+	    client[kQueue][client[kRunningIdx]++] = null;
+
+	    if (socket[kWriting]) {
+	      assert(client[kRunning] === 0);
+	      // Response completed before request.
+	      util.destroy(socket, new InformationalError('reset'));
+	      return constants.ERROR.PAUSED
+	    } else if (!shouldKeepAlive) {
+	      util.destroy(socket, new InformationalError('reset'));
+	      return constants.ERROR.PAUSED
+	    } else if (socket[kReset] && client[kRunning] === 0) {
+	      // Destroy socket once all requests have completed.
+	      // The request at the tail of the pipeline is the one
+	      // that requested reset and no further requests should
+	      // have been queued since then.
+	      util.destroy(socket, new InformationalError('reset'));
+	      return constants.ERROR.PAUSED
+	    } else if (client[kPipelining] == null || client[kPipelining] === 1) {
+	      // We must wait a full event loop cycle to reuse this socket to make sure
+	      // that non-spec compliant servers are not closing the connection even if they
+	      // said they won't.
+	      setImmediate(() => client[kResume]());
+	    } else {
+	      client[kResume]();
+	    }
+	  }
+	}
+
+	function onParserTimeout (parser) {
+	  const { socket, timeoutType, client, paused } = parser.deref();
+
+	  /* istanbul ignore else */
+	  if (timeoutType === TIMEOUT_HEADERS) {
+	    if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {
+	      assert(!paused, 'cannot be paused while waiting for headers');
+	      util.destroy(socket, new HeadersTimeoutError());
+	    }
+	  } else if (timeoutType === TIMEOUT_BODY) {
+	    if (!paused) {
+	      util.destroy(socket, new BodyTimeoutError());
+	    }
+	  } else if (timeoutType === TIMEOUT_KEEP_ALIVE) {
+	    assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]);
+	    util.destroy(socket, new InformationalError('socket idle timeout'));
+	  }
+	}
+
+	async function connectH1 (client, socket) {
+	  client[kSocket] = socket;
+
+	  if (!llhttpInstance) {
+	    llhttpInstance = await llhttpPromise;
+	    llhttpPromise = null;
+	  }
+
+	  socket[kNoRef] = false;
+	  socket[kWriting] = false;
+	  socket[kReset] = false;
+	  socket[kBlocking] = false;
+	  socket[kParser] = new Parser(client, socket, llhttpInstance);
+
+	  addListener(socket, 'error', function (err) {
+	    assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID');
+
+	    const parser = this[kParser];
+
+	    // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded
+	    // to the user.
+	    if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {
+	      // We treat all incoming data so for as a valid response.
+	      parser.onMessageComplete();
+	      return
+	    }
+
+	    this[kError] = err;
+
+	    this[kClient][kOnError](err);
+	  });
+	  addListener(socket, 'readable', function () {
+	    const parser = this[kParser];
+
+	    if (parser) {
+	      parser.readMore();
+	    }
+	  });
+	  addListener(socket, 'end', function () {
+	    const parser = this[kParser];
+
+	    if (parser.statusCode && !parser.shouldKeepAlive) {
+	      // We treat all incoming data so far as a valid response.
+	      parser.onMessageComplete();
+	      return
+	    }
+
+	    util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)));
+	  });
+	  addListener(socket, 'close', function () {
+	    const client = this[kClient];
+	    const parser = this[kParser];
+
+	    if (parser) {
+	      if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
+	        // We treat all incoming data so far as a valid response.
+	        parser.onMessageComplete();
+	      }
+
+	      this[kParser].destroy();
+	      this[kParser] = null;
+	    }
+
+	    const err = this[kError] || new SocketError('closed', util.getSocketInfo(this));
+
+	    client[kSocket] = null;
+	    client[kHTTPContext] = null; // TODO (fix): This is hacky...
+
+	    if (client.destroyed) {
+	      assert(client[kPending] === 0);
+
+	      // Fail entire queue.
+	      const requests = client[kQueue].splice(client[kRunningIdx]);
+	      for (let i = 0; i < requests.length; i++) {
+	        const request = requests[i];
+	        util.errorRequest(client, request, err);
+	      }
+	    } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {
+	      // Fail head of pipeline.
+	      const request = client[kQueue][client[kRunningIdx]];
+	      client[kQueue][client[kRunningIdx]++] = null;
+
+	      util.errorRequest(client, request, err);
+	    }
+
+	    client[kPendingIdx] = client[kRunningIdx];
+
+	    assert(client[kRunning] === 0);
+
+	    client.emit('disconnect', client[kUrl], [client], err);
+
+	    client[kResume]();
+	  });
+
+	  let closed = false;
+	  socket.on('close', () => {
+	    closed = true;
+	  });
+
+	  return {
+	    version: 'h1',
+	    defaultPipelining: 1,
+	    write (...args) {
+	      return writeH1(client, ...args)
+	    },
+	    resume () {
+	      resumeH1(client);
+	    },
+	    destroy (err, callback) {
+	      if (closed) {
+	        queueMicrotask(callback);
+	      } else {
+	        socket.destroy(err).on('close', callback);
+	      }
+	    },
+	    get destroyed () {
+	      return socket.destroyed
+	    },
+	    busy (request) {
+	      if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {
+	        return true
+	      }
+
+	      if (request) {
+	        if (client[kRunning] > 0 && !request.idempotent) {
+	          // Non-idempotent request cannot be retried.
+	          // Ensure that no other requests are inflight and
+	          // could cause failure.
+	          return true
+	        }
+
+	        if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {
+	          // Don't dispatch an upgrade until all preceding requests have completed.
+	          // A misbehaving server might upgrade the connection before all pipelined
+	          // request has completed.
+	          return true
+	        }
+
+	        if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&
+	          (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) {
+	          // Request with stream or iterator body can error while other requests
+	          // are inflight and indirectly error those as well.
+	          // Ensure this doesn't happen by waiting for inflight
+	          // to complete before dispatching.
+
+	          // Request with stream or iterator body cannot be retried.
+	          // Ensure that no other requests are inflight and
+	          // could cause failure.
+	          return true
+	        }
+	      }
+
+	      return false
+	    }
+	  }
+	}
+
+	function resumeH1 (client) {
+	  const socket = client[kSocket];
+
+	  if (socket && !socket.destroyed) {
+	    if (client[kSize] === 0) {
+	      if (!socket[kNoRef] && socket.unref) {
+	        socket.unref();
+	        socket[kNoRef] = true;
+	      }
+	    } else if (socket[kNoRef] && socket.ref) {
+	      socket.ref();
+	      socket[kNoRef] = false;
+	    }
+
+	    if (client[kSize] === 0) {
+	      if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {
+	        socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE);
+	      }
+	    } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {
+	      if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {
+	        const request = client[kQueue][client[kRunningIdx]];
+	        const headersTimeout = request.headersTimeout != null
+	          ? request.headersTimeout
+	          : client[kHeadersTimeout];
+	        socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS);
+	      }
+	    }
+	  }
+	}
+
+	// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2
+	function shouldSendContentLength (method) {
+	  return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'
+	}
+
+	function writeH1 (client, request) {
+	  const { method, path, host, upgrade, blocking, reset } = request;
+
+	  let { body, headers, contentLength } = request;
+
+	  // https://tools.ietf.org/html/rfc7231#section-4.3.1
+	  // https://tools.ietf.org/html/rfc7231#section-4.3.2
+	  // https://tools.ietf.org/html/rfc7231#section-4.3.5
+
+	  // Sending a payload body on a request that does not
+	  // expect it can cause undefined behavior on some
+	  // servers and corrupt connection state. Do not
+	  // re-use the connection for further requests.
+
+	  const expectsPayload = (
+	    method === 'PUT' ||
+	    method === 'POST' ||
+	    method === 'PATCH' ||
+	    method === 'QUERY' ||
+	    method === 'PROPFIND' ||
+	    method === 'PROPPATCH'
+	  );
+
+	  if (util.isFormDataLike(body)) {
+	    if (!extractBody) {
+	      extractBody = requireBody().extractBody;
+	    }
+
+	    const [bodyStream, contentType] = extractBody(body);
+	    if (request.contentType == null) {
+	      headers.push('content-type', contentType);
+	    }
+	    body = bodyStream.stream;
+	    contentLength = bodyStream.length;
+	  } else if (util.isBlobLike(body) && request.contentType == null && body.type) {
+	    headers.push('content-type', body.type);
+	  }
+
+	  if (body && typeof body.read === 'function') {
+	    // Try to read EOF in order to get length.
+	    body.read(0);
+	  }
+
+	  const bodyLength = util.bodyLength(body);
+
+	  contentLength = bodyLength ?? contentLength;
+
+	  if (contentLength === null) {
+	    contentLength = request.contentLength;
+	  }
+
+	  if (contentLength === 0 && !expectsPayload) {
+	    // https://tools.ietf.org/html/rfc7230#section-3.3.2
+	    // A user agent SHOULD NOT send a Content-Length header field when
+	    // the request message does not contain a payload body and the method
+	    // semantics do not anticipate such a body.
+
+	    contentLength = null;
+	  }
+
+	  // https://github.com/nodejs/undici/issues/2046
+	  // A user agent may send a Content-Length header with 0 value, this should be allowed.
+	  if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {
+	    if (client[kStrictContentLength]) {
+	      util.errorRequest(client, request, new RequestContentLengthMismatchError());
+	      return false
+	    }
+
+	    process.emitWarning(new RequestContentLengthMismatchError());
+	  }
+
+	  const socket = client[kSocket];
+
+	  const abort = (err) => {
+	    if (request.aborted || request.completed) {
+	      return
+	    }
+
+	    util.errorRequest(client, request, err || new RequestAbortedError());
+
+	    util.destroy(body);
+	    util.destroy(socket, new InformationalError('aborted'));
+	  };
+
+	  try {
+	    request.onConnect(abort);
+	  } catch (err) {
+	    util.errorRequest(client, request, err);
+	  }
+
+	  if (request.aborted) {
+	    return false
+	  }
+
+	  if (method === 'HEAD') {
+	    // https://github.com/mcollina/undici/issues/258
+	    // Close after a HEAD request to interop with misbehaving servers
+	    // that may send a body in the response.
+
+	    socket[kReset] = true;
+	  }
+
+	  if (upgrade || method === 'CONNECT') {
+	    // On CONNECT or upgrade, block pipeline from dispatching further
+	    // requests on this connection.
+
+	    socket[kReset] = true;
+	  }
+
+	  if (reset != null) {
+	    socket[kReset] = reset;
+	  }
+
+	  if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {
+	    socket[kReset] = true;
+	  }
+
+	  if (blocking) {
+	    socket[kBlocking] = true;
+	  }
+
+	  let header = `${method} ${path} HTTP/1.1\r\n`;
+
+	  if (typeof host === 'string') {
+	    header += `host: ${host}\r\n`;
+	  } else {
+	    header += client[kHostHeader];
+	  }
+
+	  if (upgrade) {
+	    header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`;
+	  } else if (client[kPipelining] && !socket[kReset]) {
+	    header += 'connection: keep-alive\r\n';
+	  } else {
+	    header += 'connection: close\r\n';
+	  }
+
+	  if (Array.isArray(headers)) {
+	    for (let n = 0; n < headers.length; n += 2) {
+	      const key = headers[n + 0];
+	      const val = headers[n + 1];
+
+	      if (Array.isArray(val)) {
+	        for (let i = 0; i < val.length; i++) {
+	          header += `${key}: ${val[i]}\r\n`;
+	        }
+	      } else {
+	        header += `${key}: ${val}\r\n`;
+	      }
+	    }
+	  }
+
+	  if (channels.sendHeaders.hasSubscribers) {
+	    channels.sendHeaders.publish({ request, headers: header, socket });
+	  }
+
+	  /* istanbul ignore else: assertion */
+	  if (!body || bodyLength === 0) {
+	    writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload);
+	  } else if (util.isBuffer(body)) {
+	    writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload);
+	  } else if (util.isBlobLike(body)) {
+	    if (typeof body.stream === 'function') {
+	      writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload);
+	    } else {
+	      writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload);
+	    }
+	  } else if (util.isStream(body)) {
+	    writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload);
+	  } else if (util.isIterable(body)) {
+	    writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload);
+	  } else {
+	    assert(false);
+	  }
+
+	  return true
+	}
+
+	function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) {
+	  assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined');
+
+	  let finished = false;
+
+	  const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header });
+
+	  const onData = function (chunk) {
+	    if (finished) {
+	      return
+	    }
+
+	    try {
+	      if (!writer.write(chunk) && this.pause) {
+	        this.pause();
+	      }
+	    } catch (err) {
+	      util.destroy(this, err);
+	    }
+	  };
+	  const onDrain = function () {
+	    if (finished) {
+	      return
+	    }
+
+	    if (body.resume) {
+	      body.resume();
+	    }
+	  };
+	  const onClose = function () {
+	    // 'close' might be emitted *before* 'error' for
+	    // broken streams. Wait a tick to avoid this case.
+	    queueMicrotask(() => {
+	      // It's only safe to remove 'error' listener after
+	      // 'close'.
+	      body.removeListener('error', onFinished);
+	    });
+
+	    if (!finished) {
+	      const err = new RequestAbortedError();
+	      queueMicrotask(() => onFinished(err));
+	    }
+	  };
+	  const onFinished = function (err) {
+	    if (finished) {
+	      return
+	    }
+
+	    finished = true;
+
+	    assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1));
+
+	    socket
+	      .off('drain', onDrain)
+	      .off('error', onFinished);
+
+	    body
+	      .removeListener('data', onData)
+	      .removeListener('end', onFinished)
+	      .removeListener('close', onClose);
+
+	    if (!err) {
+	      try {
+	        writer.end();
+	      } catch (er) {
+	        err = er;
+	      }
+	    }
+
+	    writer.destroy(err);
+
+	    if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {
+	      util.destroy(body, err);
+	    } else {
+	      util.destroy(body);
+	    }
+	  };
+
+	  body
+	    .on('data', onData)
+	    .on('end', onFinished)
+	    .on('error', onFinished)
+	    .on('close', onClose);
+
+	  if (body.resume) {
+	    body.resume();
+	  }
+
+	  socket
+	    .on('drain', onDrain)
+	    .on('error', onFinished);
+
+	  if (body.errorEmitted ?? body.errored) {
+	    setImmediate(() => onFinished(body.errored));
+	  } else if (body.endEmitted ?? body.readableEnded) {
+	    setImmediate(() => onFinished(null));
+	  }
+
+	  if (body.closeEmitted ?? body.closed) {
+	    setImmediate(onClose);
+	  }
+	}
+
+	function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) {
+	  try {
+	    if (!body) {
+	      if (contentLength === 0) {
+	        socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1');
+	      } else {
+	        assert(contentLength === null, 'no body must not have content length');
+	        socket.write(`${header}\r\n`, 'latin1');
+	      }
+	    } else if (util.isBuffer(body)) {
+	      assert(contentLength === body.byteLength, 'buffer body must have content length');
+
+	      socket.cork();
+	      socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1');
+	      socket.write(body);
+	      socket.uncork();
+	      request.onBodySent(body);
+
+	      if (!expectsPayload && request.reset !== false) {
+	        socket[kReset] = true;
+	      }
+	    }
+	    request.onRequestSent();
+
+	    client[kResume]();
+	  } catch (err) {
+	    abort(err);
+	  }
+	}
+
+	async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) {
+	  assert(contentLength === body.size, 'blob body must have content length');
+
+	  try {
+	    if (contentLength != null && contentLength !== body.size) {
+	      throw new RequestContentLengthMismatchError()
+	    }
+
+	    const buffer = Buffer.from(await body.arrayBuffer());
+
+	    socket.cork();
+	    socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1');
+	    socket.write(buffer);
+	    socket.uncork();
+
+	    request.onBodySent(buffer);
+	    request.onRequestSent();
+
+	    if (!expectsPayload && request.reset !== false) {
+	      socket[kReset] = true;
+	    }
+
+	    client[kResume]();
+	  } catch (err) {
+	    abort(err);
+	  }
+	}
+
+	async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) {
+	  assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined');
+
+	  let callback = null;
+	  function onDrain () {
+	    if (callback) {
+	      const cb = callback;
+	      callback = null;
+	      cb();
+	    }
+	  }
+
+	  const waitForDrain = () => new Promise((resolve, reject) => {
+	    assert(callback === null);
+
+	    if (socket[kError]) {
+	      reject(socket[kError]);
+	    } else {
+	      callback = resolve;
+	    }
+	  });
+
+	  socket
+	    .on('close', onDrain)
+	    .on('drain', onDrain);
+
+	  const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header });
+	  try {
+	    // It's up to the user to somehow abort the async iterable.
+	    for await (const chunk of body) {
+	      if (socket[kError]) {
+	        throw socket[kError]
+	      }
+
+	      if (!writer.write(chunk)) {
+	        await waitForDrain();
+	      }
+	    }
+
+	    writer.end();
+	  } catch (err) {
+	    writer.destroy(err);
+	  } finally {
+	    socket
+	      .off('close', onDrain)
+	      .off('drain', onDrain);
+	  }
+	}
+
+	class AsyncWriter {
+	  constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) {
+	    this.socket = socket;
+	    this.request = request;
+	    this.contentLength = contentLength;
+	    this.client = client;
+	    this.bytesWritten = 0;
+	    this.expectsPayload = expectsPayload;
+	    this.header = header;
+	    this.abort = abort;
+
+	    socket[kWriting] = true;
+	  }
+
+	  write (chunk) {
+	    const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this;
+
+	    if (socket[kError]) {
+	      throw socket[kError]
+	    }
+
+	    if (socket.destroyed) {
+	      return false
+	    }
+
+	    const len = Buffer.byteLength(chunk);
+	    if (!len) {
+	      return true
+	    }
+
+	    // We should defer writing chunks.
+	    if (contentLength !== null && bytesWritten + len > contentLength) {
+	      if (client[kStrictContentLength]) {
+	        throw new RequestContentLengthMismatchError()
+	      }
+
+	      process.emitWarning(new RequestContentLengthMismatchError());
+	    }
+
+	    socket.cork();
+
+	    if (bytesWritten === 0) {
+	      if (!expectsPayload && request.reset !== false) {
+	        socket[kReset] = true;
+	      }
+
+	      if (contentLength === null) {
+	        socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1');
+	      } else {
+	        socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1');
+	      }
+	    }
+
+	    if (contentLength === null) {
+	      socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1');
+	    }
+
+	    this.bytesWritten += len;
+
+	    const ret = socket.write(chunk);
+
+	    socket.uncork();
+
+	    request.onBodySent(chunk);
+
+	    if (!ret) {
+	      if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
+	        // istanbul ignore else: only for jest
+	        if (socket[kParser].timeout.refresh) {
+	          socket[kParser].timeout.refresh();
+	        }
+	      }
+	    }
+
+	    return ret
+	  }
+
+	  end () {
+	    const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this;
+	    request.onRequestSent();
+
+	    socket[kWriting] = false;
+
+	    if (socket[kError]) {
+	      throw socket[kError]
+	    }
+
+	    if (socket.destroyed) {
+	      return
+	    }
+
+	    if (bytesWritten === 0) {
+	      if (expectsPayload) {
+	        // https://tools.ietf.org/html/rfc7230#section-3.3.2
+	        // A user agent SHOULD send a Content-Length in a request message when
+	        // no Transfer-Encoding is sent and the request method defines a meaning
+	        // for an enclosed payload body.
+
+	        socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1');
+	      } else {
+	        socket.write(`${header}\r\n`, 'latin1');
+	      }
+	    } else if (contentLength === null) {
+	      socket.write('\r\n0\r\n\r\n', 'latin1');
+	    }
+
+	    if (contentLength !== null && bytesWritten !== contentLength) {
+	      if (client[kStrictContentLength]) {
+	        throw new RequestContentLengthMismatchError()
+	      } else {
+	        process.emitWarning(new RequestContentLengthMismatchError());
+	      }
+	    }
+
+	    if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
+	      // istanbul ignore else: only for jest
+	      if (socket[kParser].timeout.refresh) {
+	        socket[kParser].timeout.refresh();
+	      }
+	    }
+
+	    client[kResume]();
+	  }
+
+	  destroy (err) {
+	    const { socket, client, abort } = this;
+
+	    socket[kWriting] = false;
+
+	    if (err) {
+	      assert(client[kRunning] <= 1, 'pipeline should only contain this request');
+	      abort(err);
+	    }
+	  }
+	}
+
+	clientH1 = connectH1;
+	return clientH1;
+}
+
+var clientH2;
+var hasRequiredClientH2;
+
+function requireClientH2 () {
+	if (hasRequiredClientH2) return clientH2;
+	hasRequiredClientH2 = 1;
+
+	const assert = require$$0$7;
+	const { pipeline } = require$$0$8;
+	const util = requireUtil$7();
+	const {
+	  RequestContentLengthMismatchError,
+	  RequestAbortedError,
+	  SocketError,
+	  InformationalError
+	} = requireErrors();
+	const {
+	  kUrl,
+	  kReset,
+	  kClient,
+	  kRunning,
+	  kPending,
+	  kQueue,
+	  kPendingIdx,
+	  kRunningIdx,
+	  kError,
+	  kSocket,
+	  kStrictContentLength,
+	  kOnError,
+	  kMaxConcurrentStreams,
+	  kHTTP2Session,
+	  kResume,
+	  kSize,
+	  kHTTPContext
+	} = requireSymbols$4();
+
+	const kOpenStreams = Symbol('open streams');
+
+	let extractBody;
+
+	// Experimental
+	let h2ExperimentalWarned = false;
+
+	/** @type {import('http2')} */
+	let http2;
+	try {
+	  http2 = require('node:http2');
+	} catch {
+	  // @ts-ignore
+	  http2 = { constants: {} };
+	}
+
+	const {
+	  constants: {
+	    HTTP2_HEADER_AUTHORITY,
+	    HTTP2_HEADER_METHOD,
+	    HTTP2_HEADER_PATH,
+	    HTTP2_HEADER_SCHEME,
+	    HTTP2_HEADER_CONTENT_LENGTH,
+	    HTTP2_HEADER_EXPECT,
+	    HTTP2_HEADER_STATUS
+	  }
+	} = http2;
+
+	function parseH2Headers (headers) {
+	  const result = [];
+
+	  for (const [name, value] of Object.entries(headers)) {
+	    // h2 may concat the header value by array
+	    // e.g. Set-Cookie
+	    if (Array.isArray(value)) {
+	      for (const subvalue of value) {
+	        // we need to provide each header value of header name
+	        // because the headers handler expect name-value pair
+	        result.push(Buffer.from(name), Buffer.from(subvalue));
+	      }
+	    } else {
+	      result.push(Buffer.from(name), Buffer.from(value));
+	    }
+	  }
+
+	  return result
+	}
+
+	async function connectH2 (client, socket) {
+	  client[kSocket] = socket;
+
+	  if (!h2ExperimentalWarned) {
+	    h2ExperimentalWarned = true;
+	    process.emitWarning('H2 support is experimental, expect them to change at any time.', {
+	      code: 'UNDICI-H2'
+	    });
+	  }
+
+	  const session = http2.connect(client[kUrl], {
+	    createConnection: () => socket,
+	    peerMaxConcurrentStreams: client[kMaxConcurrentStreams]
+	  });
+
+	  session[kOpenStreams] = 0;
+	  session[kClient] = client;
+	  session[kSocket] = socket;
+
+	  util.addListener(session, 'error', onHttp2SessionError);
+	  util.addListener(session, 'frameError', onHttp2FrameError);
+	  util.addListener(session, 'end', onHttp2SessionEnd);
+	  util.addListener(session, 'goaway', onHTTP2GoAway);
+	  util.addListener(session, 'close', function () {
+	    const { [kClient]: client } = this;
+	    const { [kSocket]: socket } = client;
+
+	    const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket));
+
+	    client[kHTTP2Session] = null;
+
+	    if (client.destroyed) {
+	      assert(client[kPending] === 0);
+
+	      // Fail entire queue.
+	      const requests = client[kQueue].splice(client[kRunningIdx]);
+	      for (let i = 0; i < requests.length; i++) {
+	        const request = requests[i];
+	        util.errorRequest(client, request, err);
+	      }
+	    }
+	  });
+
+	  session.unref();
+
+	  client[kHTTP2Session] = session;
+	  socket[kHTTP2Session] = session;
+
+	  util.addListener(socket, 'error', function (err) {
+	    assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID');
+
+	    this[kError] = err;
+
+	    this[kClient][kOnError](err);
+	  });
+
+	  util.addListener(socket, 'end', function () {
+	    util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)));
+	  });
+
+	  util.addListener(socket, 'close', function () {
+	    const err = this[kError] || new SocketError('closed', util.getSocketInfo(this));
+
+	    client[kSocket] = null;
+
+	    if (this[kHTTP2Session] != null) {
+	      this[kHTTP2Session].destroy(err);
+	    }
+
+	    client[kPendingIdx] = client[kRunningIdx];
+
+	    assert(client[kRunning] === 0);
+
+	    client.emit('disconnect', client[kUrl], [client], err);
+
+	    client[kResume]();
+	  });
+
+	  let closed = false;
+	  socket.on('close', () => {
+	    closed = true;
+	  });
+
+	  return {
+	    version: 'h2',
+	    defaultPipelining: Infinity,
+	    write (...args) {
+	      return writeH2(client, ...args)
+	    },
+	    resume () {
+	      resumeH2(client);
+	    },
+	    destroy (err, callback) {
+	      if (closed) {
+	        queueMicrotask(callback);
+	      } else {
+	        // Destroying the socket will trigger the session close
+	        socket.destroy(err).on('close', callback);
+	      }
+	    },
+	    get destroyed () {
+	      return socket.destroyed
+	    },
+	    busy () {
+	      return false
+	    }
+	  }
+	}
+
+	function resumeH2 (client) {
+	  const socket = client[kSocket];
+
+	  if (socket?.destroyed === false) {
+	    if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) {
+	      socket.unref();
+	      client[kHTTP2Session].unref();
+	    } else {
+	      socket.ref();
+	      client[kHTTP2Session].ref();
+	    }
+	  }
+	}
+
+	function onHttp2SessionError (err) {
+	  assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID');
+
+	  this[kSocket][kError] = err;
+	  this[kClient][kOnError](err);
+	}
+
+	function onHttp2FrameError (type, code, id) {
+	  if (id === 0) {
+	    const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`);
+	    this[kSocket][kError] = err;
+	    this[kClient][kOnError](err);
+	  }
+	}
+
+	function onHttp2SessionEnd () {
+	  const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket]));
+	  this.destroy(err);
+	  util.destroy(this[kSocket], err);
+	}
+
+	/**
+	 * This is the root cause of #3011
+	 * We need to handle GOAWAY frames properly, and trigger the session close
+	 * along with the socket right away
+	 */
+	function onHTTP2GoAway (code) {
+	  // We cannot recover, so best to close the session and the socket
+	  const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this));
+	  const client = this[kClient];
+
+	  client[kSocket] = null;
+	  client[kHTTPContext] = null;
+
+	  if (this[kHTTP2Session] != null) {
+	    this[kHTTP2Session].destroy(err);
+	    this[kHTTP2Session] = null;
+	  }
+
+	  util.destroy(this[kSocket], err);
+
+	  // Fail head of pipeline.
+	  if (client[kRunningIdx] < client[kQueue].length) {
+	    const request = client[kQueue][client[kRunningIdx]];
+	    client[kQueue][client[kRunningIdx]++] = null;
+	    util.errorRequest(client, request, err);
+	    client[kPendingIdx] = client[kRunningIdx];
+	  }
+
+	  assert(client[kRunning] === 0);
+
+	  client.emit('disconnect', client[kUrl], [client], err);
+
+	  client[kResume]();
+	}
+
+	// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2
+	function shouldSendContentLength (method) {
+	  return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'
+	}
+
+	function writeH2 (client, request) {
+	  const session = client[kHTTP2Session];
+	  const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request;
+	  let { body } = request;
+
+	  if (upgrade) {
+	    util.errorRequest(client, request, new Error('Upgrade not supported for H2'));
+	    return false
+	  }
+
+	  const headers = {};
+	  for (let n = 0; n < reqHeaders.length; n += 2) {
+	    const key = reqHeaders[n + 0];
+	    const val = reqHeaders[n + 1];
+
+	    if (Array.isArray(val)) {
+	      for (let i = 0; i < val.length; i++) {
+	        if (headers[key]) {
+	          headers[key] += `,${val[i]}`;
+	        } else {
+	          headers[key] = val[i];
+	        }
+	      }
+	    } else {
+	      headers[key] = val;
+	    }
+	  }
+
+	  /** @type {import('node:http2').ClientHttp2Stream} */
+	  let stream;
+
+	  const { hostname, port } = client[kUrl];
+
+	  headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`;
+	  headers[HTTP2_HEADER_METHOD] = method;
+
+	  const abort = (err) => {
+	    if (request.aborted || request.completed) {
+	      return
+	    }
+
+	    err = err || new RequestAbortedError();
+
+	    util.errorRequest(client, request, err);
+
+	    if (stream != null) {
+	      util.destroy(stream, err);
+	    }
+
+	    // We do not destroy the socket as we can continue using the session
+	    // the stream get's destroyed and the session remains to create new streams
+	    util.destroy(body, err);
+	    client[kQueue][client[kRunningIdx]++] = null;
+	    client[kResume]();
+	  };
+
+	  try {
+	    // We are already connected, streams are pending.
+	    // We can call on connect, and wait for abort
+	    request.onConnect(abort);
+	  } catch (err) {
+	    util.errorRequest(client, request, err);
+	  }
+
+	  if (request.aborted) {
+	    return false
+	  }
+
+	  if (method === 'CONNECT') {
+	    session.ref();
+	    // We are already connected, streams are pending, first request
+	    // will create a new stream. We trigger a request to create the stream and wait until
+	    // `ready` event is triggered
+	    // We disabled endStream to allow the user to write to the stream
+	    stream = session.request(headers, { endStream: false, signal });
+
+	    if (stream.id && !stream.pending) {
+	      request.onUpgrade(null, null, stream);
+	      ++session[kOpenStreams];
+	      client[kQueue][client[kRunningIdx]++] = null;
+	    } else {
+	      stream.once('ready', () => {
+	        request.onUpgrade(null, null, stream);
+	        ++session[kOpenStreams];
+	        client[kQueue][client[kRunningIdx]++] = null;
+	      });
+	    }
+
+	    stream.once('close', () => {
+	      session[kOpenStreams] -= 1;
+	      if (session[kOpenStreams] === 0) session.unref();
+	    });
+
+	    return true
+	  }
+
+	  // https://tools.ietf.org/html/rfc7540#section-8.3
+	  // :path and :scheme headers must be omitted when sending CONNECT
+
+	  headers[HTTP2_HEADER_PATH] = path;
+	  headers[HTTP2_HEADER_SCHEME] = 'https';
+
+	  // https://tools.ietf.org/html/rfc7231#section-4.3.1
+	  // https://tools.ietf.org/html/rfc7231#section-4.3.2
+	  // https://tools.ietf.org/html/rfc7231#section-4.3.5
+
+	  // Sending a payload body on a request that does not
+	  // expect it can cause undefined behavior on some
+	  // servers and corrupt connection state. Do not
+	  // re-use the connection for further requests.
+
+	  const expectsPayload = (
+	    method === 'PUT' ||
+	    method === 'POST' ||
+	    method === 'PATCH'
+	  );
+
+	  if (body && typeof body.read === 'function') {
+	    // Try to read EOF in order to get length.
+	    body.read(0);
+	  }
+
+	  let contentLength = util.bodyLength(body);
+
+	  if (util.isFormDataLike(body)) {
+	    extractBody ??= requireBody().extractBody;
+
+	    const [bodyStream, contentType] = extractBody(body);
+	    headers['content-type'] = contentType;
+
+	    body = bodyStream.stream;
+	    contentLength = bodyStream.length;
+	  }
+
+	  if (contentLength == null) {
+	    contentLength = request.contentLength;
+	  }
+
+	  if (contentLength === 0 || !expectsPayload) {
+	    // https://tools.ietf.org/html/rfc7230#section-3.3.2
+	    // A user agent SHOULD NOT send a Content-Length header field when
+	    // the request message does not contain a payload body and the method
+	    // semantics do not anticipate such a body.
+
+	    contentLength = null;
+	  }
+
+	  // https://github.com/nodejs/undici/issues/2046
+	  // A user agent may send a Content-Length header with 0 value, this should be allowed.
+	  if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {
+	    if (client[kStrictContentLength]) {
+	      util.errorRequest(client, request, new RequestContentLengthMismatchError());
+	      return false
+	    }
+
+	    process.emitWarning(new RequestContentLengthMismatchError());
+	  }
+
+	  if (contentLength != null) {
+	    assert(body, 'no body must not have content length');
+	    headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`;
+	  }
+
+	  session.ref();
+
+	  const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null;
+	  if (expectContinue) {
+	    headers[HTTP2_HEADER_EXPECT] = '100-continue';
+	    stream = session.request(headers, { endStream: shouldEndStream, signal });
+
+	    stream.once('continue', writeBodyH2);
+	  } else {
+	    stream = session.request(headers, {
+	      endStream: shouldEndStream,
+	      signal
+	    });
+	    writeBodyH2();
+	  }
+
+	  // Increment counter as we have new streams open
+	  ++session[kOpenStreams];
+
+	  stream.once('response', headers => {
+	    const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers;
+	    request.onResponseStarted();
+
+	    // Due to the stream nature, it is possible we face a race condition
+	    // where the stream has been assigned, but the request has been aborted
+	    // the request remains in-flight and headers hasn't been received yet
+	    // for those scenarios, best effort is to destroy the stream immediately
+	    // as there's no value to keep it open.
+	    if (request.aborted) {
+	      const err = new RequestAbortedError();
+	      util.errorRequest(client, request, err);
+	      util.destroy(stream, err);
+	      return
+	    }
+
+	    if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) {
+	      stream.pause();
+	    }
+
+	    stream.on('data', (chunk) => {
+	      if (request.onData(chunk) === false) {
+	        stream.pause();
+	      }
+	    });
+	  });
+
+	  stream.once('end', () => {
+	    // When state is null, it means we haven't consumed body and the stream still do not have
+	    // a state.
+	    // Present specially when using pipeline or stream
+	    if (stream.state?.state == null || stream.state.state < 6) {
+	      request.onComplete([]);
+	    }
+
+	    if (session[kOpenStreams] === 0) {
+	      // Stream is closed or half-closed-remote (6), decrement counter and cleanup
+	      // It does not have sense to continue working with the stream as we do not
+	      // have yet RST_STREAM support on client-side
+
+	      session.unref();
+	    }
+
+	    abort(new InformationalError('HTTP/2: stream half-closed (remote)'));
+	    client[kQueue][client[kRunningIdx]++] = null;
+	    client[kPendingIdx] = client[kRunningIdx];
+	    client[kResume]();
+	  });
+
+	  stream.once('close', () => {
+	    session[kOpenStreams] -= 1;
+	    if (session[kOpenStreams] === 0) {
+	      session.unref();
+	    }
+	  });
+
+	  stream.once('error', function (err) {
+	    abort(err);
+	  });
+
+	  stream.once('frameError', (type, code) => {
+	    abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`));
+	  });
+
+	  // stream.on('aborted', () => {
+	  //   // TODO(HTTP/2): Support aborted
+	  // })
+
+	  // stream.on('timeout', () => {
+	  //   // TODO(HTTP/2): Support timeout
+	  // })
+
+	  // stream.on('push', headers => {
+	  //   // TODO(HTTP/2): Support push
+	  // })
+
+	  // stream.on('trailers', headers => {
+	  //   // TODO(HTTP/2): Support trailers
+	  // })
+
+	  return true
+
+	  function writeBodyH2 () {
+	    /* istanbul ignore else: assertion */
+	    if (!body || contentLength === 0) {
+	      writeBuffer(
+	        abort,
+	        stream,
+	        null,
+	        client,
+	        request,
+	        client[kSocket],
+	        contentLength,
+	        expectsPayload
+	      );
+	    } else if (util.isBuffer(body)) {
+	      writeBuffer(
+	        abort,
+	        stream,
+	        body,
+	        client,
+	        request,
+	        client[kSocket],
+	        contentLength,
+	        expectsPayload
+	      );
+	    } else if (util.isBlobLike(body)) {
+	      if (typeof body.stream === 'function') {
+	        writeIterable(
+	          abort,
+	          stream,
+	          body.stream(),
+	          client,
+	          request,
+	          client[kSocket],
+	          contentLength,
+	          expectsPayload
+	        );
+	      } else {
+	        writeBlob(
+	          abort,
+	          stream,
+	          body,
+	          client,
+	          request,
+	          client[kSocket],
+	          contentLength,
+	          expectsPayload
+	        );
+	      }
+	    } else if (util.isStream(body)) {
+	      writeStream(
+	        abort,
+	        client[kSocket],
+	        expectsPayload,
+	        stream,
+	        body,
+	        client,
+	        request,
+	        contentLength
+	      );
+	    } else if (util.isIterable(body)) {
+	      writeIterable(
+	        abort,
+	        stream,
+	        body,
+	        client,
+	        request,
+	        client[kSocket],
+	        contentLength,
+	        expectsPayload
+	      );
+	    } else {
+	      assert(false);
+	    }
+	  }
+	}
+
+	function writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {
+	  try {
+	    if (body != null && util.isBuffer(body)) {
+	      assert(contentLength === body.byteLength, 'buffer body must have content length');
+	      h2stream.cork();
+	      h2stream.write(body);
+	      h2stream.uncork();
+	      h2stream.end();
+
+	      request.onBodySent(body);
+	    }
+
+	    if (!expectsPayload) {
+	      socket[kReset] = true;
+	    }
+
+	    request.onRequestSent();
+	    client[kResume]();
+	  } catch (error) {
+	    abort(error);
+	  }
+	}
+
+	function writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) {
+	  assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined');
+
+	  // For HTTP/2, is enough to pipe the stream
+	  const pipe = pipeline(
+	    body,
+	    h2stream,
+	    (err) => {
+	      if (err) {
+	        util.destroy(pipe, err);
+	        abort(err);
+	      } else {
+	        util.removeAllListeners(pipe);
+	        request.onRequestSent();
+
+	        if (!expectsPayload) {
+	          socket[kReset] = true;
+	        }
+
+	        client[kResume]();
+	      }
+	    }
+	  );
+
+	  util.addListener(pipe, 'data', onPipeData);
+
+	  function onPipeData (chunk) {
+	    request.onBodySent(chunk);
+	  }
+	}
+
+	async function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {
+	  assert(contentLength === body.size, 'blob body must have content length');
+
+	  try {
+	    if (contentLength != null && contentLength !== body.size) {
+	      throw new RequestContentLengthMismatchError()
+	    }
+
+	    const buffer = Buffer.from(await body.arrayBuffer());
+
+	    h2stream.cork();
+	    h2stream.write(buffer);
+	    h2stream.uncork();
+	    h2stream.end();
+
+	    request.onBodySent(buffer);
+	    request.onRequestSent();
+
+	    if (!expectsPayload) {
+	      socket[kReset] = true;
+	    }
+
+	    client[kResume]();
+	  } catch (err) {
+	    abort(err);
+	  }
+	}
+
+	async function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) {
+	  assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined');
+
+	  let callback = null;
+	  function onDrain () {
+	    if (callback) {
+	      const cb = callback;
+	      callback = null;
+	      cb();
+	    }
+	  }
+
+	  const waitForDrain = () => new Promise((resolve, reject) => {
+	    assert(callback === null);
+
+	    if (socket[kError]) {
+	      reject(socket[kError]);
+	    } else {
+	      callback = resolve;
+	    }
+	  });
+
+	  h2stream
+	    .on('close', onDrain)
+	    .on('drain', onDrain);
+
+	  try {
+	    // It's up to the user to somehow abort the async iterable.
+	    for await (const chunk of body) {
+	      if (socket[kError]) {
+	        throw socket[kError]
+	      }
+
+	      const res = h2stream.write(chunk);
+	      request.onBodySent(chunk);
+	      if (!res) {
+	        await waitForDrain();
+	      }
+	    }
+
+	    h2stream.end();
+
+	    request.onRequestSent();
+
+	    if (!expectsPayload) {
+	      socket[kReset] = true;
+	    }
+
+	    client[kResume]();
+	  } catch (err) {
+	    abort(err);
+	  } finally {
+	    h2stream
+	      .off('close', onDrain)
+	      .off('drain', onDrain);
+	  }
+	}
+
+	clientH2 = connectH2;
+	return clientH2;
+}
+
+var redirectHandler;
+var hasRequiredRedirectHandler;
+
+function requireRedirectHandler () {
+	if (hasRequiredRedirectHandler) return redirectHandler;
+	hasRequiredRedirectHandler = 1;
+
+	const util = requireUtil$7();
+	const { kBodyUsed } = requireSymbols$4();
+	const assert = require$$0$7;
+	const { InvalidArgumentError } = requireErrors();
+	const EE = require$$8;
+
+	const redirectableStatusCodes = [300, 301, 302, 303, 307, 308];
+
+	const kBody = Symbol('body');
+
+	class BodyAsyncIterable {
+	  constructor (body) {
+	    this[kBody] = body;
+	    this[kBodyUsed] = false;
+	  }
+
+	  async * [Symbol.asyncIterator] () {
+	    assert(!this[kBodyUsed], 'disturbed');
+	    this[kBodyUsed] = true;
+	    yield * this[kBody];
+	  }
+	}
+
+	class RedirectHandler {
+	  constructor (dispatch, maxRedirections, opts, handler) {
+	    if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
+	      throw new InvalidArgumentError('maxRedirections must be a positive number')
+	    }
+
+	    util.validateHandler(handler, opts.method, opts.upgrade);
+
+	    this.dispatch = dispatch;
+	    this.location = null;
+	    this.abort = null;
+	    this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy
+	    this.maxRedirections = maxRedirections;
+	    this.handler = handler;
+	    this.history = [];
+	    this.redirectionLimitReached = false;
+
+	    if (util.isStream(this.opts.body)) {
+	      // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp
+	      // so that it can be dispatched again?
+	      // TODO (fix): Do we need 100-expect support to provide a way to do this properly?
+	      if (util.bodyLength(this.opts.body) === 0) {
+	        this.opts.body
+	          .on('data', function () {
+	            assert(false);
+	          });
+	      }
+
+	      if (typeof this.opts.body.readableDidRead !== 'boolean') {
+	        this.opts.body[kBodyUsed] = false;
+	        EE.prototype.on.call(this.opts.body, 'data', function () {
+	          this[kBodyUsed] = true;
+	        });
+	      }
+	    } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') {
+	      // TODO (fix): We can't access ReadableStream internal state
+	      // to determine whether or not it has been disturbed. This is just
+	      // a workaround.
+	      this.opts.body = new BodyAsyncIterable(this.opts.body);
+	    } else if (
+	      this.opts.body &&
+	      typeof this.opts.body !== 'string' &&
+	      !ArrayBuffer.isView(this.opts.body) &&
+	      util.isIterable(this.opts.body)
+	    ) {
+	      // TODO: Should we allow re-using iterable if !this.opts.idempotent
+	      // or through some other flag?
+	      this.opts.body = new BodyAsyncIterable(this.opts.body);
+	    }
+	  }
+
+	  onConnect (abort) {
+	    this.abort = abort;
+	    this.handler.onConnect(abort, { history: this.history });
+	  }
+
+	  onUpgrade (statusCode, headers, socket) {
+	    this.handler.onUpgrade(statusCode, headers, socket);
+	  }
+
+	  onError (error) {
+	    this.handler.onError(error);
+	  }
+
+	  onHeaders (statusCode, headers, resume, statusText) {
+	    this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body)
+	      ? null
+	      : parseLocation(statusCode, headers);
+
+	    if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {
+	      if (this.request) {
+	        this.request.abort(new Error('max redirects'));
+	      }
+
+	      this.redirectionLimitReached = true;
+	      this.abort(new Error('max redirects'));
+	      return
+	    }
+
+	    if (this.opts.origin) {
+	      this.history.push(new URL(this.opts.path, this.opts.origin));
+	    }
+
+	    if (!this.location) {
+	      return this.handler.onHeaders(statusCode, headers, resume, statusText)
+	    }
+
+	    const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)));
+	    const path = search ? `${pathname}${search}` : pathname;
+
+	    // Remove headers referring to the original URL.
+	    // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.
+	    // https://tools.ietf.org/html/rfc7231#section-6.4
+	    this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin);
+	    this.opts.path = path;
+	    this.opts.origin = origin;
+	    this.opts.maxRedirections = 0;
+	    this.opts.query = null;
+
+	    // https://tools.ietf.org/html/rfc7231#section-6.4.4
+	    // In case of HTTP 303, always replace method to be either HEAD or GET
+	    if (statusCode === 303 && this.opts.method !== 'HEAD') {
+	      this.opts.method = 'GET';
+	      this.opts.body = null;
+	    }
+	  }
+
+	  onData (chunk) {
+	    if (this.location) ; else {
+	      return this.handler.onData(chunk)
+	    }
+	  }
+
+	  onComplete (trailers) {
+	    if (this.location) {
+	      /*
+	        https://tools.ietf.org/html/rfc7231#section-6.4
+
+	        TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections
+	        and neither are useful if present.
+
+	        See comment on onData method above for more detailed information.
+	      */
+
+	      this.location = null;
+	      this.abort = null;
+
+	      this.dispatch(this.opts, this);
+	    } else {
+	      this.handler.onComplete(trailers);
+	    }
+	  }
+
+	  onBodySent (chunk) {
+	    if (this.handler.onBodySent) {
+	      this.handler.onBodySent(chunk);
+	    }
+	  }
+	}
+
+	function parseLocation (statusCode, headers) {
+	  if (redirectableStatusCodes.indexOf(statusCode) === -1) {
+	    return null
+	  }
+
+	  for (let i = 0; i < headers.length; i += 2) {
+	    if (headers[i].length === 8 && util.headerNameToString(headers[i]) === 'location') {
+	      return headers[i + 1]
+	    }
+	  }
+	}
+
+	// https://tools.ietf.org/html/rfc7231#section-6.4.4
+	function shouldRemoveHeader (header, removeContent, unknownOrigin) {
+	  if (header.length === 4) {
+	    return util.headerNameToString(header) === 'host'
+	  }
+	  if (removeContent && util.headerNameToString(header).startsWith('content-')) {
+	    return true
+	  }
+	  if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) {
+	    const name = util.headerNameToString(header);
+	    return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization'
+	  }
+	  return false
+	}
+
+	// https://tools.ietf.org/html/rfc7231#section-6.4
+	function cleanRequestHeaders (headers, removeContent, unknownOrigin) {
+	  const ret = [];
+	  if (Array.isArray(headers)) {
+	    for (let i = 0; i < headers.length; i += 2) {
+	      if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {
+	        ret.push(headers[i], headers[i + 1]);
+	      }
+	    }
+	  } else if (headers && typeof headers === 'object') {
+	    for (const key of Object.keys(headers)) {
+	      if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
+	        ret.push(key, headers[key]);
+	      }
+	    }
+	  } else {
+	    assert(headers == null, 'headers must be an object or an array');
+	  }
+	  return ret
+	}
+
+	redirectHandler = RedirectHandler;
+	return redirectHandler;
+}
+
+var redirectInterceptor;
+var hasRequiredRedirectInterceptor;
+
+function requireRedirectInterceptor () {
+	if (hasRequiredRedirectInterceptor) return redirectInterceptor;
+	hasRequiredRedirectInterceptor = 1;
+
+	const RedirectHandler = requireRedirectHandler();
+
+	function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) {
+	  return (dispatch) => {
+	    return function Intercept (opts, handler) {
+	      const { maxRedirections = defaultMaxRedirections } = opts;
+
+	      if (!maxRedirections) {
+	        return dispatch(opts, handler)
+	      }
+
+	      const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler);
+	      opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting.
+	      return dispatch(opts, redirectHandler)
+	    }
+	  }
+	}
+
+	redirectInterceptor = createRedirectInterceptor;
+	return redirectInterceptor;
+}
+
+var client;
+var hasRequiredClient;
+
+function requireClient () {
+	if (hasRequiredClient) return client;
+	hasRequiredClient = 1;
+
+	const assert = require$$0$7;
+	const net = require$$0$9;
+	const http = require$$2;
+	const util = requireUtil$7();
+	const { channels } = requireDiagnostics();
+	const Request = requireRequest$1();
+	const DispatcherBase = requireDispatcherBase();
+	const {
+	  InvalidArgumentError,
+	  InformationalError,
+	  ClientDestroyedError
+	} = requireErrors();
+	const buildConnector = requireConnect();
+	const {
+	  kUrl,
+	  kServerName,
+	  kClient,
+	  kBusy,
+	  kConnect,
+	  kResuming,
+	  kRunning,
+	  kPending,
+	  kSize,
+	  kQueue,
+	  kConnected,
+	  kConnecting,
+	  kNeedDrain,
+	  kKeepAliveDefaultTimeout,
+	  kHostHeader,
+	  kPendingIdx,
+	  kRunningIdx,
+	  kError,
+	  kPipelining,
+	  kKeepAliveTimeoutValue,
+	  kMaxHeadersSize,
+	  kKeepAliveMaxTimeout,
+	  kKeepAliveTimeoutThreshold,
+	  kHeadersTimeout,
+	  kBodyTimeout,
+	  kStrictContentLength,
+	  kConnector,
+	  kMaxRedirections,
+	  kMaxRequests,
+	  kCounter,
+	  kClose,
+	  kDestroy,
+	  kDispatch,
+	  kInterceptors,
+	  kLocalAddress,
+	  kMaxResponseSize,
+	  kOnError,
+	  kHTTPContext,
+	  kMaxConcurrentStreams,
+	  kResume
+	} = requireSymbols$4();
+	const connectH1 = requireClientH1();
+	const connectH2 = requireClientH2();
+	let deprecatedInterceptorWarned = false;
+
+	const kClosedResolve = Symbol('kClosedResolve');
+
+	const noop = () => {};
+
+	function getPipelining (client) {
+	  return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1
+	}
+
+	/**
+	 * @type {import('../../types/client.js').default}
+	 */
+	class Client extends DispatcherBase {
+	  /**
+	   *
+	   * @param {string|URL} url
+	   * @param {import('../../types/client.js').Client.Options} options
+	   */
+	  constructor (url, {
+	    interceptors,
+	    maxHeaderSize,
+	    headersTimeout,
+	    socketTimeout,
+	    requestTimeout,
+	    connectTimeout,
+	    bodyTimeout,
+	    idleTimeout,
+	    keepAlive,
+	    keepAliveTimeout,
+	    maxKeepAliveTimeout,
+	    keepAliveMaxTimeout,
+	    keepAliveTimeoutThreshold,
+	    socketPath,
+	    pipelining,
+	    tls,
+	    strictContentLength,
+	    maxCachedSessions,
+	    maxRedirections,
+	    connect,
+	    maxRequestsPerClient,
+	    localAddress,
+	    maxResponseSize,
+	    autoSelectFamily,
+	    autoSelectFamilyAttemptTimeout,
+	    // h2
+	    maxConcurrentStreams,
+	    allowH2
+	  } = {}) {
+	    super();
+
+	    if (keepAlive !== undefined) {
+	      throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')
+	    }
+
+	    if (socketTimeout !== undefined) {
+	      throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead')
+	    }
+
+	    if (requestTimeout !== undefined) {
+	      throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead')
+	    }
+
+	    if (idleTimeout !== undefined) {
+	      throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead')
+	    }
+
+	    if (maxKeepAliveTimeout !== undefined) {
+	      throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead')
+	    }
+
+	    if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) {
+	      throw new InvalidArgumentError('invalid maxHeaderSize')
+	    }
+
+	    if (socketPath != null && typeof socketPath !== 'string') {
+	      throw new InvalidArgumentError('invalid socketPath')
+	    }
+
+	    if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {
+	      throw new InvalidArgumentError('invalid connectTimeout')
+	    }
+
+	    if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {
+	      throw new InvalidArgumentError('invalid keepAliveTimeout')
+	    }
+
+	    if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {
+	      throw new InvalidArgumentError('invalid keepAliveMaxTimeout')
+	    }
+
+	    if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {
+	      throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold')
+	    }
+
+	    if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {
+	      throw new InvalidArgumentError('headersTimeout must be a positive integer or zero')
+	    }
+
+	    if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {
+	      throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero')
+	    }
+
+	    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {
+	      throw new InvalidArgumentError('connect must be a function or an object')
+	    }
+
+	    if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
+	      throw new InvalidArgumentError('maxRedirections must be a positive number')
+	    }
+
+	    if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {
+	      throw new InvalidArgumentError('maxRequestsPerClient must be a positive number')
+	    }
+
+	    if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) {
+	      throw new InvalidArgumentError('localAddress must be valid string IP address')
+	    }
+
+	    if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {
+	      throw new InvalidArgumentError('maxResponseSize must be a positive number')
+	    }
+
+	    if (
+	      autoSelectFamilyAttemptTimeout != null &&
+	      (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)
+	    ) {
+	      throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number')
+	    }
+
+	    // h2
+	    if (allowH2 != null && typeof allowH2 !== 'boolean') {
+	      throw new InvalidArgumentError('allowH2 must be a valid boolean value')
+	    }
+
+	    if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {
+	      throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')
+	    }
+
+	    if (typeof connect !== 'function') {
+	      connect = buildConnector({
+	        ...tls,
+	        maxCachedSessions,
+	        allowH2,
+	        socketPath,
+	        timeout: connectTimeout,
+	        ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
+	        ...connect
+	      });
+	    }
+
+	    if (interceptors?.Client && Array.isArray(interceptors.Client)) {
+	      this[kInterceptors] = interceptors.Client;
+	      if (!deprecatedInterceptorWarned) {
+	        deprecatedInterceptorWarned = true;
+	        process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', {
+	          code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED'
+	        });
+	      }
+	    } else {
+	      this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })];
+	    }
+
+	    this[kUrl] = util.parseOrigin(url);
+	    this[kConnector] = connect;
+	    this[kPipelining] = pipelining != null ? pipelining : 1;
+	    this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize;
+	    this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout;
+	    this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout;
+	    this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold;
+	    this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout];
+	    this[kServerName] = null;
+	    this[kLocalAddress] = localAddress != null ? localAddress : null;
+	    this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming
+	    this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming
+	    this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`;
+	    this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3;
+	    this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3;
+	    this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength;
+	    this[kMaxRedirections] = maxRedirections;
+	    this[kMaxRequests] = maxRequestsPerClient;
+	    this[kClosedResolve] = null;
+	    this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1;
+	    this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; // Max peerConcurrentStreams for a Node h2 server
+	    this[kHTTPContext] = null;
+
+	    // kQueue is built up of 3 sections separated by
+	    // the kRunningIdx and kPendingIdx indices.
+	    // |   complete   |   running   |   pending   |
+	    //                ^ kRunningIdx ^ kPendingIdx ^ kQueue.length
+	    // kRunningIdx points to the first running element.
+	    // kPendingIdx points to the first pending element.
+	    // This implements a fast queue with an amortized
+	    // time of O(1).
+
+	    this[kQueue] = [];
+	    this[kRunningIdx] = 0;
+	    this[kPendingIdx] = 0;
+
+	    this[kResume] = (sync) => resume(this, sync);
+	    this[kOnError] = (err) => onError(this, err);
+	  }
+
+	  get pipelining () {
+	    return this[kPipelining]
+	  }
+
+	  set pipelining (value) {
+	    this[kPipelining] = value;
+	    this[kResume](true);
+	  }
+
+	  get [kPending] () {
+	    return this[kQueue].length - this[kPendingIdx]
+	  }
+
+	  get [kRunning] () {
+	    return this[kPendingIdx] - this[kRunningIdx]
+	  }
+
+	  get [kSize] () {
+	    return this[kQueue].length - this[kRunningIdx]
+	  }
+
+	  get [kConnected] () {
+	    return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed
+	  }
+
+	  get [kBusy] () {
+	    return Boolean(
+	      this[kHTTPContext]?.busy(null) ||
+	      (this[kSize] >= (getPipelining(this) || 1)) ||
+	      this[kPending] > 0
+	    )
+	  }
+
+	  /* istanbul ignore: only used for test */
+	  [kConnect] (cb) {
+	    connect(this);
+	    this.once('connect', cb);
+	  }
+
+	  [kDispatch] (opts, handler) {
+	    const origin = opts.origin || this[kUrl].origin;
+	    const request = new Request(origin, opts, handler);
+
+	    this[kQueue].push(request);
+	    if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {
+	      // Wait a tick in case stream/iterator is ended in the same tick.
+	      this[kResuming] = 1;
+	      queueMicrotask(() => resume(this));
+	    } else {
+	      this[kResume](true);
+	    }
+
+	    if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {
+	      this[kNeedDrain] = 2;
+	    }
+
+	    return this[kNeedDrain] < 2
+	  }
+
+	  async [kClose] () {
+	    // TODO: for H2 we need to gracefully flush the remaining enqueued
+	    // request and close each stream.
+	    return new Promise((resolve) => {
+	      if (this[kSize]) {
+	        this[kClosedResolve] = resolve;
+	      } else {
+	        resolve(null);
+	      }
+	    })
+	  }
+
+	  async [kDestroy] (err) {
+	    return new Promise((resolve) => {
+	      const requests = this[kQueue].splice(this[kPendingIdx]);
+	      for (let i = 0; i < requests.length; i++) {
+	        const request = requests[i];
+	        util.errorRequest(this, request, err);
+	      }
+
+	      const callback = () => {
+	        if (this[kClosedResolve]) {
+	          // TODO (fix): Should we error here with ClientDestroyedError?
+	          this[kClosedResolve]();
+	          this[kClosedResolve] = null;
+	        }
+	        resolve(null);
+	      };
+
+	      if (this[kHTTPContext]) {
+	        this[kHTTPContext].destroy(err, callback);
+	        this[kHTTPContext] = null;
+	      } else {
+	        queueMicrotask(callback);
+	      }
+
+	      this[kResume]();
+	    })
+	  }
+	}
+
+	const createRedirectInterceptor = requireRedirectInterceptor();
+
+	function onError (client, err) {
+	  if (
+	    client[kRunning] === 0 &&
+	    err.code !== 'UND_ERR_INFO' &&
+	    err.code !== 'UND_ERR_SOCKET'
+	  ) {
+	    // Error is not caused by running request and not a recoverable
+	    // socket error.
+
+	    assert(client[kPendingIdx] === client[kRunningIdx]);
+
+	    const requests = client[kQueue].splice(client[kRunningIdx]);
+
+	    for (let i = 0; i < requests.length; i++) {
+	      const request = requests[i];
+	      util.errorRequest(client, request, err);
+	    }
+	    assert(client[kSize] === 0);
+	  }
+	}
+
+	/**
+	 * @param {Client} client
+	 * @returns
+	 */
+	async function connect (client) {
+	  assert(!client[kConnecting]);
+	  assert(!client[kHTTPContext]);
+
+	  let { host, hostname, protocol, port } = client[kUrl];
+
+	  // Resolve ipv6
+	  if (hostname[0] === '[') {
+	    const idx = hostname.indexOf(']');
+
+	    assert(idx !== -1);
+	    const ip = hostname.substring(1, idx);
+
+	    assert(net.isIP(ip));
+	    hostname = ip;
+	  }
+
+	  client[kConnecting] = true;
+
+	  if (channels.beforeConnect.hasSubscribers) {
+	    channels.beforeConnect.publish({
+	      connectParams: {
+	        host,
+	        hostname,
+	        protocol,
+	        port,
+	        version: client[kHTTPContext]?.version,
+	        servername: client[kServerName],
+	        localAddress: client[kLocalAddress]
+	      },
+	      connector: client[kConnector]
+	    });
+	  }
+
+	  try {
+	    const socket = await new Promise((resolve, reject) => {
+	      client[kConnector]({
+	        host,
+	        hostname,
+	        protocol,
+	        port,
+	        servername: client[kServerName],
+	        localAddress: client[kLocalAddress]
+	      }, (err, socket) => {
+	        if (err) {
+	          reject(err);
+	        } else {
+	          resolve(socket);
+	        }
+	      });
+	    });
+
+	    if (client.destroyed) {
+	      util.destroy(socket.on('error', noop), new ClientDestroyedError());
+	      return
+	    }
+
+	    assert(socket);
+
+	    try {
+	      client[kHTTPContext] = socket.alpnProtocol === 'h2'
+	        ? await connectH2(client, socket)
+	        : await connectH1(client, socket);
+	    } catch (err) {
+	      socket.destroy().on('error', noop);
+	      throw err
+	    }
+
+	    client[kConnecting] = false;
+
+	    socket[kCounter] = 0;
+	    socket[kMaxRequests] = client[kMaxRequests];
+	    socket[kClient] = client;
+	    socket[kError] = null;
+
+	    if (channels.connected.hasSubscribers) {
+	      channels.connected.publish({
+	        connectParams: {
+	          host,
+	          hostname,
+	          protocol,
+	          port,
+	          version: client[kHTTPContext]?.version,
+	          servername: client[kServerName],
+	          localAddress: client[kLocalAddress]
+	        },
+	        connector: client[kConnector],
+	        socket
+	      });
+	    }
+	    client.emit('connect', client[kUrl], [client]);
+	  } catch (err) {
+	    if (client.destroyed) {
+	      return
+	    }
+
+	    client[kConnecting] = false;
+
+	    if (channels.connectError.hasSubscribers) {
+	      channels.connectError.publish({
+	        connectParams: {
+	          host,
+	          hostname,
+	          protocol,
+	          port,
+	          version: client[kHTTPContext]?.version,
+	          servername: client[kServerName],
+	          localAddress: client[kLocalAddress]
+	        },
+	        connector: client[kConnector],
+	        error: err
+	      });
+	    }
+
+	    if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
+	      assert(client[kRunning] === 0);
+	      while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
+	        const request = client[kQueue][client[kPendingIdx]++];
+	        util.errorRequest(client, request, err);
+	      }
+	    } else {
+	      onError(client, err);
+	    }
+
+	    client.emit('connectionError', client[kUrl], [client], err);
+	  }
+
+	  client[kResume]();
+	}
+
+	function emitDrain (client) {
+	  client[kNeedDrain] = 0;
+	  client.emit('drain', client[kUrl], [client]);
+	}
+
+	function resume (client, sync) {
+	  if (client[kResuming] === 2) {
+	    return
+	  }
+
+	  client[kResuming] = 2;
+
+	  _resume(client, sync);
+	  client[kResuming] = 0;
+
+	  if (client[kRunningIdx] > 256) {
+	    client[kQueue].splice(0, client[kRunningIdx]);
+	    client[kPendingIdx] -= client[kRunningIdx];
+	    client[kRunningIdx] = 0;
+	  }
+	}
+
+	function _resume (client, sync) {
+	  while (true) {
+	    if (client.destroyed) {
+	      assert(client[kPending] === 0);
+	      return
+	    }
+
+	    if (client[kClosedResolve] && !client[kSize]) {
+	      client[kClosedResolve]();
+	      client[kClosedResolve] = null;
+	      return
+	    }
+
+	    if (client[kHTTPContext]) {
+	      client[kHTTPContext].resume();
+	    }
+
+	    if (client[kBusy]) {
+	      client[kNeedDrain] = 2;
+	    } else if (client[kNeedDrain] === 2) {
+	      if (sync) {
+	        client[kNeedDrain] = 1;
+	        queueMicrotask(() => emitDrain(client));
+	      } else {
+	        emitDrain(client);
+	      }
+	      continue
+	    }
+
+	    if (client[kPending] === 0) {
+	      return
+	    }
+
+	    if (client[kRunning] >= (getPipelining(client) || 1)) {
+	      return
+	    }
+
+	    const request = client[kQueue][client[kPendingIdx]];
+
+	    if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {
+	      if (client[kRunning] > 0) {
+	        return
+	      }
+
+	      client[kServerName] = request.servername;
+	      client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => {
+	        client[kHTTPContext] = null;
+	        resume(client);
+	      });
+	    }
+
+	    if (client[kConnecting]) {
+	      return
+	    }
+
+	    if (!client[kHTTPContext]) {
+	      connect(client);
+	      return
+	    }
+
+	    if (client[kHTTPContext].destroyed) {
+	      return
+	    }
+
+	    if (client[kHTTPContext].busy(request)) {
+	      return
+	    }
+
+	    if (!request.aborted && client[kHTTPContext].write(request)) {
+	      client[kPendingIdx]++;
+	    } else {
+	      client[kQueue].splice(client[kPendingIdx], 1);
+	    }
+	  }
+	}
+
+	client = Client;
+	return client;
+}
+
+/* eslint-disable */
+
+var fixedQueue;
+var hasRequiredFixedQueue;
+
+function requireFixedQueue () {
+	if (hasRequiredFixedQueue) return fixedQueue;
+	hasRequiredFixedQueue = 1;
+
+	// Extracted from node/lib/internal/fixed_queue.js
+
+	// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.
+	const kSize = 2048;
+	const kMask = kSize - 1;
+
+	// The FixedQueue is implemented as a singly-linked list of fixed-size
+	// circular buffers. It looks something like this:
+	//
+	//  head                                                       tail
+	//    |                                                          |
+	//    v                                                          v
+	// +-----------+ <-----\       +-----------+ <------\         +-----------+
+	// |  [null]   |        \----- |   next    |         \------- |   next    |
+	// +-----------+               +-----------+                  +-----------+
+	// |   item    | <-- bottom    |   item    | <-- bottom       |  [empty]  |
+	// |   item    |               |   item    |                  |  [empty]  |
+	// |   item    |               |   item    |                  |  [empty]  |
+	// |   item    |               |   item    |                  |  [empty]  |
+	// |   item    |               |   item    |       bottom --> |   item    |
+	// |   item    |               |   item    |                  |   item    |
+	// |    ...    |               |    ...    |                  |    ...    |
+	// |   item    |               |   item    |                  |   item    |
+	// |   item    |               |   item    |                  |   item    |
+	// |  [empty]  | <-- top       |   item    |                  |   item    |
+	// |  [empty]  |               |   item    |                  |   item    |
+	// |  [empty]  |               |  [empty]  | <-- top  top --> |  [empty]  |
+	// +-----------+               +-----------+                  +-----------+
+	//
+	// Or, if there is only one circular buffer, it looks something
+	// like either of these:
+	//
+	//  head   tail                                 head   tail
+	//    |     |                                     |     |
+	//    v     v                                     v     v
+	// +-----------+                               +-----------+
+	// |  [null]   |                               |  [null]   |
+	// +-----------+                               +-----------+
+	// |  [empty]  |                               |   item    |
+	// |  [empty]  |                               |   item    |
+	// |   item    | <-- bottom            top --> |  [empty]  |
+	// |   item    |                               |  [empty]  |
+	// |  [empty]  | <-- top            bottom --> |   item    |
+	// |  [empty]  |                               |   item    |
+	// +-----------+                               +-----------+
+	//
+	// Adding a value means moving `top` forward by one, removing means
+	// moving `bottom` forward by one. After reaching the end, the queue
+	// wraps around.
+	//
+	// When `top === bottom` the current queue is empty and when
+	// `top + 1 === bottom` it's full. This wastes a single space of storage
+	// but allows much quicker checks.
+
+	class FixedCircularBuffer {
+	  constructor() {
+	    this.bottom = 0;
+	    this.top = 0;
+	    this.list = new Array(kSize);
+	    this.next = null;
+	  }
+
+	  isEmpty() {
+	    return this.top === this.bottom;
+	  }
+
+	  isFull() {
+	    return ((this.top + 1) & kMask) === this.bottom;
+	  }
+
+	  push(data) {
+	    this.list[this.top] = data;
+	    this.top = (this.top + 1) & kMask;
+	  }
+
+	  shift() {
+	    const nextItem = this.list[this.bottom];
+	    if (nextItem === undefined)
+	      return null;
+	    this.list[this.bottom] = undefined;
+	    this.bottom = (this.bottom + 1) & kMask;
+	    return nextItem;
+	  }
+	}
+
+	fixedQueue = class FixedQueue {
+	  constructor() {
+	    this.head = this.tail = new FixedCircularBuffer();
+	  }
+
+	  isEmpty() {
+	    return this.head.isEmpty();
+	  }
+
+	  push(data) {
+	    if (this.head.isFull()) {
+	      // Head is full: Creates a new queue, sets the old queue's `.next` to it,
+	      // and sets it as the new main queue.
+	      this.head = this.head.next = new FixedCircularBuffer();
+	    }
+	    this.head.push(data);
+	  }
+
+	  shift() {
+	    const tail = this.tail;
+	    const next = tail.shift();
+	    if (tail.isEmpty() && tail.next !== null) {
+	      // If there is another queue, it forms the new tail.
+	      this.tail = tail.next;
+	    }
+	    return next;
+	  }
+	};
+	return fixedQueue;
+}
+
+var poolStats;
+var hasRequiredPoolStats;
+
+function requirePoolStats () {
+	if (hasRequiredPoolStats) return poolStats;
+	hasRequiredPoolStats = 1;
+	const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$4();
+	const kPool = Symbol('pool');
+
+	class PoolStats {
+	  constructor (pool) {
+	    this[kPool] = pool;
+	  }
+
+	  get connected () {
+	    return this[kPool][kConnected]
+	  }
+
+	  get free () {
+	    return this[kPool][kFree]
+	  }
+
+	  get pending () {
+	    return this[kPool][kPending]
+	  }
+
+	  get queued () {
+	    return this[kPool][kQueued]
+	  }
+
+	  get running () {
+	    return this[kPool][kRunning]
+	  }
+
+	  get size () {
+	    return this[kPool][kSize]
+	  }
+	}
+
+	poolStats = PoolStats;
+	return poolStats;
+}
+
+var poolBase;
+var hasRequiredPoolBase;
+
+function requirePoolBase () {
+	if (hasRequiredPoolBase) return poolBase;
+	hasRequiredPoolBase = 1;
+
+	const DispatcherBase = requireDispatcherBase();
+	const FixedQueue = requireFixedQueue();
+	const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$4();
+	const PoolStats = requirePoolStats();
+
+	const kClients = Symbol('clients');
+	const kNeedDrain = Symbol('needDrain');
+	const kQueue = Symbol('queue');
+	const kClosedResolve = Symbol('closed resolve');
+	const kOnDrain = Symbol('onDrain');
+	const kOnConnect = Symbol('onConnect');
+	const kOnDisconnect = Symbol('onDisconnect');
+	const kOnConnectionError = Symbol('onConnectionError');
+	const kGetDispatcher = Symbol('get dispatcher');
+	const kAddClient = Symbol('add client');
+	const kRemoveClient = Symbol('remove client');
+	const kStats = Symbol('stats');
+
+	class PoolBase extends DispatcherBase {
+	  constructor () {
+	    super();
+
+	    this[kQueue] = new FixedQueue();
+	    this[kClients] = [];
+	    this[kQueued] = 0;
+
+	    const pool = this;
+
+	    this[kOnDrain] = function onDrain (origin, targets) {
+	      const queue = pool[kQueue];
+
+	      let needDrain = false;
+
+	      while (!needDrain) {
+	        const item = queue.shift();
+	        if (!item) {
+	          break
+	        }
+	        pool[kQueued]--;
+	        needDrain = !this.dispatch(item.opts, item.handler);
+	      }
+
+	      this[kNeedDrain] = needDrain;
+
+	      if (!this[kNeedDrain] && pool[kNeedDrain]) {
+	        pool[kNeedDrain] = false;
+	        pool.emit('drain', origin, [pool, ...targets]);
+	      }
+
+	      if (pool[kClosedResolve] && queue.isEmpty()) {
+	        Promise
+	          .all(pool[kClients].map(c => c.close()))
+	          .then(pool[kClosedResolve]);
+	      }
+	    };
+
+	    this[kOnConnect] = (origin, targets) => {
+	      pool.emit('connect', origin, [pool, ...targets]);
+	    };
+
+	    this[kOnDisconnect] = (origin, targets, err) => {
+	      pool.emit('disconnect', origin, [pool, ...targets], err);
+	    };
+
+	    this[kOnConnectionError] = (origin, targets, err) => {
+	      pool.emit('connectionError', origin, [pool, ...targets], err);
+	    };
+
+	    this[kStats] = new PoolStats(this);
+	  }
+
+	  get [kBusy] () {
+	    return this[kNeedDrain]
+	  }
+
+	  get [kConnected] () {
+	    return this[kClients].filter(client => client[kConnected]).length
+	  }
+
+	  get [kFree] () {
+	    return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length
+	  }
+
+	  get [kPending] () {
+	    let ret = this[kQueued];
+	    for (const { [kPending]: pending } of this[kClients]) {
+	      ret += pending;
+	    }
+	    return ret
+	  }
+
+	  get [kRunning] () {
+	    let ret = 0;
+	    for (const { [kRunning]: running } of this[kClients]) {
+	      ret += running;
+	    }
+	    return ret
+	  }
+
+	  get [kSize] () {
+	    let ret = this[kQueued];
+	    for (const { [kSize]: size } of this[kClients]) {
+	      ret += size;
+	    }
+	    return ret
+	  }
+
+	  get stats () {
+	    return this[kStats]
+	  }
+
+	  async [kClose] () {
+	    if (this[kQueue].isEmpty()) {
+	      await Promise.all(this[kClients].map(c => c.close()));
+	    } else {
+	      await new Promise((resolve) => {
+	        this[kClosedResolve] = resolve;
+	      });
+	    }
+	  }
+
+	  async [kDestroy] (err) {
+	    while (true) {
+	      const item = this[kQueue].shift();
+	      if (!item) {
+	        break
+	      }
+	      item.handler.onError(err);
+	    }
+
+	    await Promise.all(this[kClients].map(c => c.destroy(err)));
+	  }
+
+	  [kDispatch] (opts, handler) {
+	    const dispatcher = this[kGetDispatcher]();
+
+	    if (!dispatcher) {
+	      this[kNeedDrain] = true;
+	      this[kQueue].push({ opts, handler });
+	      this[kQueued]++;
+	    } else if (!dispatcher.dispatch(opts, handler)) {
+	      dispatcher[kNeedDrain] = true;
+	      this[kNeedDrain] = !this[kGetDispatcher]();
+	    }
+
+	    return !this[kNeedDrain]
+	  }
+
+	  [kAddClient] (client) {
+	    client
+	      .on('drain', this[kOnDrain])
+	      .on('connect', this[kOnConnect])
+	      .on('disconnect', this[kOnDisconnect])
+	      .on('connectionError', this[kOnConnectionError]);
+
+	    this[kClients].push(client);
+
+	    if (this[kNeedDrain]) {
+	      queueMicrotask(() => {
+	        if (this[kNeedDrain]) {
+	          this[kOnDrain](client[kUrl], [this, client]);
+	        }
+	      });
+	    }
+
+	    return this
+	  }
+
+	  [kRemoveClient] (client) {
+	    client.close(() => {
+	      const idx = this[kClients].indexOf(client);
+	      if (idx !== -1) {
+	        this[kClients].splice(idx, 1);
+	      }
+	    });
+
+	    this[kNeedDrain] = this[kClients].some(dispatcher => (
+	      !dispatcher[kNeedDrain] &&
+	      dispatcher.closed !== true &&
+	      dispatcher.destroyed !== true
+	    ));
+	  }
+	}
+
+	poolBase = {
+	  PoolBase,
+	  kClients,
+	  kNeedDrain,
+	  kAddClient,
+	  kRemoveClient,
+	  kGetDispatcher
+	};
+	return poolBase;
+}
+
+var pool;
+var hasRequiredPool;
+
+function requirePool () {
+	if (hasRequiredPool) return pool;
+	hasRequiredPool = 1;
+
+	const {
+	  PoolBase,
+	  kClients,
+	  kNeedDrain,
+	  kAddClient,
+	  kGetDispatcher
+	} = requirePoolBase();
+	const Client = requireClient();
+	const {
+	  InvalidArgumentError
+	} = requireErrors();
+	const util = requireUtil$7();
+	const { kUrl, kInterceptors } = requireSymbols$4();
+	const buildConnector = requireConnect();
+
+	const kOptions = Symbol('options');
+	const kConnections = Symbol('connections');
+	const kFactory = Symbol('factory');
+
+	function defaultFactory (origin, opts) {
+	  return new Client(origin, opts)
+	}
+
+	class Pool extends PoolBase {
+	  constructor (origin, {
+	    connections,
+	    factory = defaultFactory,
+	    connect,
+	    connectTimeout,
+	    tls,
+	    maxCachedSessions,
+	    socketPath,
+	    autoSelectFamily,
+	    autoSelectFamilyAttemptTimeout,
+	    allowH2,
+	    ...options
+	  } = {}) {
+	    super();
+
+	    if (connections != null && (!Number.isFinite(connections) || connections < 0)) {
+	      throw new InvalidArgumentError('invalid connections')
+	    }
+
+	    if (typeof factory !== 'function') {
+	      throw new InvalidArgumentError('factory must be a function.')
+	    }
+
+	    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {
+	      throw new InvalidArgumentError('connect must be a function or an object')
+	    }
+
+	    if (typeof connect !== 'function') {
+	      connect = buildConnector({
+	        ...tls,
+	        maxCachedSessions,
+	        allowH2,
+	        socketPath,
+	        timeout: connectTimeout,
+	        ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
+	        ...connect
+	      });
+	    }
+
+	    this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool)
+	      ? options.interceptors.Pool
+	      : [];
+	    this[kConnections] = connections || null;
+	    this[kUrl] = util.parseOrigin(origin);
+	    this[kOptions] = { ...util.deepClone(options), connect, allowH2 };
+	    this[kOptions].interceptors = options.interceptors
+	      ? { ...options.interceptors }
+	      : undefined;
+	    this[kFactory] = factory;
+
+	    this.on('connectionError', (origin, targets, error) => {
+	      // If a connection error occurs, we remove the client from the pool,
+	      // and emit a connectionError event. They will not be re-used.
+	      // Fixes https://github.com/nodejs/undici/issues/3895
+	      for (const target of targets) {
+	        // Do not use kRemoveClient here, as it will close the client,
+	        // but the client cannot be closed in this state.
+	        const idx = this[kClients].indexOf(target);
+	        if (idx !== -1) {
+	          this[kClients].splice(idx, 1);
+	        }
+	      }
+	    });
+	  }
+
+	  [kGetDispatcher] () {
+	    for (const client of this[kClients]) {
+	      if (!client[kNeedDrain]) {
+	        return client
+	      }
+	    }
+
+	    if (!this[kConnections] || this[kClients].length < this[kConnections]) {
+	      const dispatcher = this[kFactory](this[kUrl], this[kOptions]);
+	      this[kAddClient](dispatcher);
+	      return dispatcher
+	    }
+	  }
+	}
+
+	pool = Pool;
+	return pool;
+}
+
+var balancedPool;
+var hasRequiredBalancedPool;
+
+function requireBalancedPool () {
+	if (hasRequiredBalancedPool) return balancedPool;
+	hasRequiredBalancedPool = 1;
+
+	const {
+	  BalancedPoolMissingUpstreamError,
+	  InvalidArgumentError
+	} = requireErrors();
+	const {
+	  PoolBase,
+	  kClients,
+	  kNeedDrain,
+	  kAddClient,
+	  kRemoveClient,
+	  kGetDispatcher
+	} = requirePoolBase();
+	const Pool = requirePool();
+	const { kUrl, kInterceptors } = requireSymbols$4();
+	const { parseOrigin } = requireUtil$7();
+	const kFactory = Symbol('factory');
+
+	const kOptions = Symbol('options');
+	const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor');
+	const kCurrentWeight = Symbol('kCurrentWeight');
+	const kIndex = Symbol('kIndex');
+	const kWeight = Symbol('kWeight');
+	const kMaxWeightPerServer = Symbol('kMaxWeightPerServer');
+	const kErrorPenalty = Symbol('kErrorPenalty');
+
+	/**
+	 * Calculate the greatest common divisor of two numbers by
+	 * using the Euclidean algorithm.
+	 *
+	 * @param {number} a
+	 * @param {number} b
+	 * @returns {number}
+	 */
+	function getGreatestCommonDivisor (a, b) {
+	  if (a === 0) return b
+
+	  while (b !== 0) {
+	    const t = b;
+	    b = a % b;
+	    a = t;
+	  }
+	  return a
+	}
+
+	function defaultFactory (origin, opts) {
+	  return new Pool(origin, opts)
+	}
+
+	class BalancedPool extends PoolBase {
+	  constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {
+	    super();
+
+	    this[kOptions] = opts;
+	    this[kIndex] = -1;
+	    this[kCurrentWeight] = 0;
+
+	    this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100;
+	    this[kErrorPenalty] = this[kOptions].errorPenalty || 15;
+
+	    if (!Array.isArray(upstreams)) {
+	      upstreams = [upstreams];
+	    }
+
+	    if (typeof factory !== 'function') {
+	      throw new InvalidArgumentError('factory must be a function.')
+	    }
+
+	    this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool)
+	      ? opts.interceptors.BalancedPool
+	      : [];
+	    this[kFactory] = factory;
+
+	    for (const upstream of upstreams) {
+	      this.addUpstream(upstream);
+	    }
+	    this._updateBalancedPoolStats();
+	  }
+
+	  addUpstream (upstream) {
+	    const upstreamOrigin = parseOrigin(upstream).origin;
+
+	    if (this[kClients].find((pool) => (
+	      pool[kUrl].origin === upstreamOrigin &&
+	      pool.closed !== true &&
+	      pool.destroyed !== true
+	    ))) {
+	      return this
+	    }
+	    const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions]));
+
+	    this[kAddClient](pool);
+	    pool.on('connect', () => {
+	      pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]);
+	    });
+
+	    pool.on('connectionError', () => {
+	      pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]);
+	      this._updateBalancedPoolStats();
+	    });
+
+	    pool.on('disconnect', (...args) => {
+	      const err = args[2];
+	      if (err && err.code === 'UND_ERR_SOCKET') {
+	        // decrease the weight of the pool.
+	        pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]);
+	        this._updateBalancedPoolStats();
+	      }
+	    });
+
+	    for (const client of this[kClients]) {
+	      client[kWeight] = this[kMaxWeightPerServer];
+	    }
+
+	    this._updateBalancedPoolStats();
+
+	    return this
+	  }
+
+	  _updateBalancedPoolStats () {
+	    let result = 0;
+	    for (let i = 0; i < this[kClients].length; i++) {
+	      result = getGreatestCommonDivisor(this[kClients][i][kWeight], result);
+	    }
+
+	    this[kGreatestCommonDivisor] = result;
+	  }
+
+	  removeUpstream (upstream) {
+	    const upstreamOrigin = parseOrigin(upstream).origin;
+
+	    const pool = this[kClients].find((pool) => (
+	      pool[kUrl].origin === upstreamOrigin &&
+	      pool.closed !== true &&
+	      pool.destroyed !== true
+	    ));
+
+	    if (pool) {
+	      this[kRemoveClient](pool);
+	    }
+
+	    return this
+	  }
+
+	  get upstreams () {
+	    return this[kClients]
+	      .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true)
+	      .map((p) => p[kUrl].origin)
+	  }
+
+	  [kGetDispatcher] () {
+	    // We validate that pools is greater than 0,
+	    // otherwise we would have to wait until an upstream
+	    // is added, which might never happen.
+	    if (this[kClients].length === 0) {
+	      throw new BalancedPoolMissingUpstreamError()
+	    }
+
+	    const dispatcher = this[kClients].find(dispatcher => (
+	      !dispatcher[kNeedDrain] &&
+	      dispatcher.closed !== true &&
+	      dispatcher.destroyed !== true
+	    ));
+
+	    if (!dispatcher) {
+	      return
+	    }
+
+	    const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true);
+
+	    if (allClientsBusy) {
+	      return
+	    }
+
+	    let counter = 0;
+
+	    let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]);
+
+	    while (counter++ < this[kClients].length) {
+	      this[kIndex] = (this[kIndex] + 1) % this[kClients].length;
+	      const pool = this[kClients][this[kIndex]];
+
+	      // find pool index with the largest weight
+	      if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) {
+	        maxWeightIndex = this[kIndex];
+	      }
+
+	      // decrease the current weight every `this[kClients].length`.
+	      if (this[kIndex] === 0) {
+	        // Set the current weight to the next lower weight.
+	        this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor];
+
+	        if (this[kCurrentWeight] <= 0) {
+	          this[kCurrentWeight] = this[kMaxWeightPerServer];
+	        }
+	      }
+	      if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) {
+	        return pool
+	      }
+	    }
+
+	    this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight];
+	    this[kIndex] = maxWeightIndex;
+	    return this[kClients][maxWeightIndex]
+	  }
+	}
+
+	balancedPool = BalancedPool;
+	return balancedPool;
+}
+
+var agent;
+var hasRequiredAgent;
+
+function requireAgent () {
+	if (hasRequiredAgent) return agent;
+	hasRequiredAgent = 1;
+
+	const { InvalidArgumentError } = requireErrors();
+	const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4();
+	const DispatcherBase = requireDispatcherBase();
+	const Pool = requirePool();
+	const Client = requireClient();
+	const util = requireUtil$7();
+	const createRedirectInterceptor = requireRedirectInterceptor();
+
+	const kOnConnect = Symbol('onConnect');
+	const kOnDisconnect = Symbol('onDisconnect');
+	const kOnConnectionError = Symbol('onConnectionError');
+	const kMaxRedirections = Symbol('maxRedirections');
+	const kOnDrain = Symbol('onDrain');
+	const kFactory = Symbol('factory');
+	const kOptions = Symbol('options');
+
+	function defaultFactory (origin, opts) {
+	  return opts && opts.connections === 1
+	    ? new Client(origin, opts)
+	    : new Pool(origin, opts)
+	}
+
+	class Agent extends DispatcherBase {
+	  constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) {
+	    super();
+
+	    if (typeof factory !== 'function') {
+	      throw new InvalidArgumentError('factory must be a function.')
+	    }
+
+	    if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {
+	      throw new InvalidArgumentError('connect must be a function or an object')
+	    }
+
+	    if (!Number.isInteger(maxRedirections) || maxRedirections < 0) {
+	      throw new InvalidArgumentError('maxRedirections must be a positive number')
+	    }
+
+	    if (connect && typeof connect !== 'function') {
+	      connect = { ...connect };
+	    }
+
+	    this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent)
+	      ? options.interceptors.Agent
+	      : [createRedirectInterceptor({ maxRedirections })];
+
+	    this[kOptions] = { ...util.deepClone(options), connect };
+	    this[kOptions].interceptors = options.interceptors
+	      ? { ...options.interceptors }
+	      : undefined;
+	    this[kMaxRedirections] = maxRedirections;
+	    this[kFactory] = factory;
+	    this[kClients] = new Map();
+
+	    this[kOnDrain] = (origin, targets) => {
+	      this.emit('drain', origin, [this, ...targets]);
+	    };
+
+	    this[kOnConnect] = (origin, targets) => {
+	      this.emit('connect', origin, [this, ...targets]);
+	    };
+
+	    this[kOnDisconnect] = (origin, targets, err) => {
+	      this.emit('disconnect', origin, [this, ...targets], err);
+	    };
+
+	    this[kOnConnectionError] = (origin, targets, err) => {
+	      this.emit('connectionError', origin, [this, ...targets], err);
+	    };
+	  }
+
+	  get [kRunning] () {
+	    let ret = 0;
+	    for (const client of this[kClients].values()) {
+	      ret += client[kRunning];
+	    }
+	    return ret
+	  }
+
+	  [kDispatch] (opts, handler) {
+	    let key;
+	    if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) {
+	      key = String(opts.origin);
+	    } else {
+	      throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')
+	    }
+
+	    let dispatcher = this[kClients].get(key);
+
+	    if (!dispatcher) {
+	      dispatcher = this[kFactory](opts.origin, this[kOptions])
+	        .on('drain', this[kOnDrain])
+	        .on('connect', this[kOnConnect])
+	        .on('disconnect', this[kOnDisconnect])
+	        .on('connectionError', this[kOnConnectionError]);
+
+	      // This introduces a tiny memory leak, as dispatchers are never removed from the map.
+	      // TODO(mcollina): remove te timer when the client/pool do not have any more
+	      // active connections.
+	      this[kClients].set(key, dispatcher);
+	    }
+
+	    return dispatcher.dispatch(opts, handler)
+	  }
+
+	  async [kClose] () {
+	    const closePromises = [];
+	    for (const client of this[kClients].values()) {
+	      closePromises.push(client.close());
+	    }
+	    this[kClients].clear();
+
+	    await Promise.all(closePromises);
+	  }
+
+	  async [kDestroy] (err) {
+	    const destroyPromises = [];
+	    for (const client of this[kClients].values()) {
+	      destroyPromises.push(client.destroy(err));
+	    }
+	    this[kClients].clear();
+
+	    await Promise.all(destroyPromises);
+	  }
+	}
+
+	agent = Agent;
+	return agent;
+}
+
+var proxyAgent;
+var hasRequiredProxyAgent;
+
+function requireProxyAgent () {
+	if (hasRequiredProxyAgent) return proxyAgent;
+	hasRequiredProxyAgent = 1;
+
+	const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4();
+	const { URL } = require$$1$4;
+	const Agent = requireAgent();
+	const Pool = requirePool();
+	const DispatcherBase = requireDispatcherBase();
+	const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = requireErrors();
+	const buildConnector = requireConnect();
+	const Client = requireClient();
+
+	const kAgent = Symbol('proxy agent');
+	const kClient = Symbol('proxy client');
+	const kProxyHeaders = Symbol('proxy headers');
+	const kRequestTls = Symbol('request tls settings');
+	const kProxyTls = Symbol('proxy tls settings');
+	const kConnectEndpoint = Symbol('connect endpoint function');
+	const kTunnelProxy = Symbol('tunnel proxy');
+
+	function defaultProtocolPort (protocol) {
+	  return protocol === 'https:' ? 443 : 80
+	}
+
+	function defaultFactory (origin, opts) {
+	  return new Pool(origin, opts)
+	}
+
+	const noop = () => {};
+
+	function defaultAgentFactory (origin, opts) {
+	  if (opts.connections === 1) {
+	    return new Client(origin, opts)
+	  }
+	  return new Pool(origin, opts)
+	}
+
+	class Http1ProxyWrapper extends DispatcherBase {
+	  #client
+
+	  constructor (proxyUrl, { headers = {}, connect, factory }) {
+	    super();
+	    if (!proxyUrl) {
+	      throw new InvalidArgumentError('Proxy URL is mandatory')
+	    }
+
+	    this[kProxyHeaders] = headers;
+	    if (factory) {
+	      this.#client = factory(proxyUrl, { connect });
+	    } else {
+	      this.#client = new Client(proxyUrl, { connect });
+	    }
+	  }
+
+	  [kDispatch] (opts, handler) {
+	    const onHeaders = handler.onHeaders;
+	    handler.onHeaders = function (statusCode, data, resume) {
+	      if (statusCode === 407) {
+	        if (typeof handler.onError === 'function') {
+	          handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)'));
+	        }
+	        return
+	      }
+	      if (onHeaders) onHeaders.call(this, statusCode, data, resume);
+	    };
+
+	    // Rewrite request as an HTTP1 Proxy request, without tunneling.
+	    const {
+	      origin,
+	      path = '/',
+	      headers = {}
+	    } = opts;
+
+	    opts.path = origin + path;
+
+	    if (!('host' in headers) && !('Host' in headers)) {
+	      const { host } = new URL(origin);
+	      headers.host = host;
+	    }
+	    opts.headers = { ...this[kProxyHeaders], ...headers };
+
+	    return this.#client[kDispatch](opts, handler)
+	  }
+
+	  async [kClose] () {
+	    return this.#client.close()
+	  }
+
+	  async [kDestroy] (err) {
+	    return this.#client.destroy(err)
+	  }
+	}
+
+	class ProxyAgent extends DispatcherBase {
+	  constructor (opts) {
+	    super();
+
+	    if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {
+	      throw new InvalidArgumentError('Proxy uri is mandatory')
+	    }
+
+	    const { clientFactory = defaultFactory } = opts;
+	    if (typeof clientFactory !== 'function') {
+	      throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')
+	    }
+
+	    const { proxyTunnel = true } = opts;
+
+	    const url = this.#getUrl(opts);
+	    const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url;
+
+	    this[kProxy] = { uri: href, protocol };
+	    this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent)
+	      ? opts.interceptors.ProxyAgent
+	      : [];
+	    this[kRequestTls] = opts.requestTls;
+	    this[kProxyTls] = opts.proxyTls;
+	    this[kProxyHeaders] = opts.headers || {};
+	    this[kTunnelProxy] = proxyTunnel;
+
+	    if (opts.auth && opts.token) {
+	      throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
+	    } else if (opts.auth) {
+	      /* @deprecated in favour of opts.token */
+	      this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`;
+	    } else if (opts.token) {
+	      this[kProxyHeaders]['proxy-authorization'] = opts.token;
+	    } else if (username && password) {
+	      this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`;
+	    }
+
+	    const connect = buildConnector({ ...opts.proxyTls });
+	    this[kConnectEndpoint] = buildConnector({ ...opts.requestTls });
+
+	    const agentFactory = opts.factory || defaultAgentFactory;
+	    const factory = (origin, options) => {
+	      const { protocol } = new URL(origin);
+	      if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {
+	        return new Http1ProxyWrapper(this[kProxy].uri, {
+	          headers: this[kProxyHeaders],
+	          connect,
+	          factory: agentFactory
+	        })
+	      }
+	      return agentFactory(origin, options)
+	    };
+	    this[kClient] = clientFactory(url, { connect });
+	    this[kAgent] = new Agent({
+	      ...opts,
+	      factory,
+	      connect: async (opts, callback) => {
+	        let requestedPath = opts.host;
+	        if (!opts.port) {
+	          requestedPath += `:${defaultProtocolPort(opts.protocol)}`;
+	        }
+	        try {
+	          const { socket, statusCode } = await this[kClient].connect({
+	            origin,
+	            port,
+	            path: requestedPath,
+	            signal: opts.signal,
+	            headers: {
+	              ...this[kProxyHeaders],
+	              host: opts.host
+	            },
+	            servername: this[kProxyTls]?.servername || proxyHostname
+	          });
+	          if (statusCode !== 200) {
+	            socket.on('error', noop).destroy();
+	            callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`));
+	          }
+	          if (opts.protocol !== 'https:') {
+	            callback(null, socket);
+	            return
+	          }
+	          let servername;
+	          if (this[kRequestTls]) {
+	            servername = this[kRequestTls].servername;
+	          } else {
+	            servername = opts.servername;
+	          }
+	          this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback);
+	        } catch (err) {
+	          if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
+	            // Throw a custom error to avoid loop in client.js#connect
+	            callback(new SecureProxyConnectionError(err));
+	          } else {
+	            callback(err);
+	          }
+	        }
+	      }
+	    });
+	  }
+
+	  dispatch (opts, handler) {
+	    const headers = buildHeaders(opts.headers);
+	    throwIfProxyAuthIsSent(headers);
+
+	    if (headers && !('host' in headers) && !('Host' in headers)) {
+	      const { host } = new URL(opts.origin);
+	      headers.host = host;
+	    }
+
+	    return this[kAgent].dispatch(
+	      {
+	        ...opts,
+	        headers
+	      },
+	      handler
+	    )
+	  }
+
+	  /**
+	   * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts
+	   * @returns {URL}
+	   */
+	  #getUrl (opts) {
+	    if (typeof opts === 'string') {
+	      return new URL(opts)
+	    } else if (opts instanceof URL) {
+	      return opts
+	    } else {
+	      return new URL(opts.uri)
+	    }
+	  }
+
+	  async [kClose] () {
+	    await this[kAgent].close();
+	    await this[kClient].close();
+	  }
+
+	  async [kDestroy] () {
+	    await this[kAgent].destroy();
+	    await this[kClient].destroy();
+	  }
+	}
+
+	/**
+	 * @param {string[] | Record} headers
+	 * @returns {Record}
+	 */
+	function buildHeaders (headers) {
+	  // When using undici.fetch, the headers list is stored
+	  // as an array.
+	  if (Array.isArray(headers)) {
+	    /** @type {Record} */
+	    const headersPair = {};
+
+	    for (let i = 0; i < headers.length; i += 2) {
+	      headersPair[headers[i]] = headers[i + 1];
+	    }
+
+	    return headersPair
+	  }
+
+	  return headers
+	}
+
+	/**
+	 * @param {Record} headers
+	 *
+	 * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers
+	 * Nevertheless, it was changed and to avoid a security vulnerability by end users
+	 * this check was created.
+	 * It should be removed in the next major version for performance reasons
+	 */
+	function throwIfProxyAuthIsSent (headers) {
+	  const existProxyAuth = headers && Object.keys(headers)
+	    .find((key) => key.toLowerCase() === 'proxy-authorization');
+	  if (existProxyAuth) {
+	    throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')
+	  }
+	}
+
+	proxyAgent = ProxyAgent;
+	return proxyAgent;
+}
+
+var envHttpProxyAgent;
+var hasRequiredEnvHttpProxyAgent;
+
+function requireEnvHttpProxyAgent () {
+	if (hasRequiredEnvHttpProxyAgent) return envHttpProxyAgent;
+	hasRequiredEnvHttpProxyAgent = 1;
+
+	const DispatcherBase = requireDispatcherBase();
+	const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = requireSymbols$4();
+	const ProxyAgent = requireProxyAgent();
+	const Agent = requireAgent();
+
+	const DEFAULT_PORTS = {
+	  'http:': 80,
+	  'https:': 443
+	};
+
+	let experimentalWarned = false;
+
+	class EnvHttpProxyAgent extends DispatcherBase {
+	  #noProxyValue = null
+	  #noProxyEntries = null
+	  #opts = null
+
+	  constructor (opts = {}) {
+	    super();
+	    this.#opts = opts;
+
+	    if (!experimentalWarned) {
+	      experimentalWarned = true;
+	      process.emitWarning('EnvHttpProxyAgent is experimental, expect them to change at any time.', {
+	        code: 'UNDICI-EHPA'
+	      });
+	    }
+
+	    const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts;
+
+	    this[kNoProxyAgent] = new Agent(agentOpts);
+
+	    const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY;
+	    if (HTTP_PROXY) {
+	      this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY });
+	    } else {
+	      this[kHttpProxyAgent] = this[kNoProxyAgent];
+	    }
+
+	    const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY;
+	    if (HTTPS_PROXY) {
+	      this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY });
+	    } else {
+	      this[kHttpsProxyAgent] = this[kHttpProxyAgent];
+	    }
+
+	    this.#parseNoProxy();
+	  }
+
+	  [kDispatch] (opts, handler) {
+	    const url = new URL(opts.origin);
+	    const agent = this.#getProxyAgentForUrl(url);
+	    return agent.dispatch(opts, handler)
+	  }
+
+	  async [kClose] () {
+	    await this[kNoProxyAgent].close();
+	    if (!this[kHttpProxyAgent][kClosed]) {
+	      await this[kHttpProxyAgent].close();
+	    }
+	    if (!this[kHttpsProxyAgent][kClosed]) {
+	      await this[kHttpsProxyAgent].close();
+	    }
+	  }
+
+	  async [kDestroy] (err) {
+	    await this[kNoProxyAgent].destroy(err);
+	    if (!this[kHttpProxyAgent][kDestroyed]) {
+	      await this[kHttpProxyAgent].destroy(err);
+	    }
+	    if (!this[kHttpsProxyAgent][kDestroyed]) {
+	      await this[kHttpsProxyAgent].destroy(err);
+	    }
+	  }
+
+	  #getProxyAgentForUrl (url) {
+	    let { protocol, host: hostname, port } = url;
+
+	    // Stripping ports in this way instead of using parsedUrl.hostname to make
+	    // sure that the brackets around IPv6 addresses are kept.
+	    hostname = hostname.replace(/:\d*$/, '').toLowerCase();
+	    port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0;
+	    if (!this.#shouldProxy(hostname, port)) {
+	      return this[kNoProxyAgent]
+	    }
+	    if (protocol === 'https:') {
+	      return this[kHttpsProxyAgent]
+	    }
+	    return this[kHttpProxyAgent]
+	  }
+
+	  #shouldProxy (hostname, port) {
+	    if (this.#noProxyChanged) {
+	      this.#parseNoProxy();
+	    }
+
+	    if (this.#noProxyEntries.length === 0) {
+	      return true // Always proxy if NO_PROXY is not set or empty.
+	    }
+	    if (this.#noProxyValue === '*') {
+	      return false // Never proxy if wildcard is set.
+	    }
+
+	    for (let i = 0; i < this.#noProxyEntries.length; i++) {
+	      const entry = this.#noProxyEntries[i];
+	      if (entry.port && entry.port !== port) {
+	        continue // Skip if ports don't match.
+	      }
+	      if (!/^[.*]/.test(entry.hostname)) {
+	        // No wildcards, so don't proxy only if there is not an exact match.
+	        if (hostname === entry.hostname) {
+	          return false
+	        }
+	      } else {
+	        // Don't proxy if the hostname ends with the no_proxy host.
+	        if (hostname.endsWith(entry.hostname.replace(/^\*/, ''))) {
+	          return false
+	        }
+	      }
+	    }
+
+	    return true
+	  }
+
+	  #parseNoProxy () {
+	    const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv;
+	    const noProxySplit = noProxyValue.split(/[,\s]/);
+	    const noProxyEntries = [];
+
+	    for (let i = 0; i < noProxySplit.length; i++) {
+	      const entry = noProxySplit[i];
+	      if (!entry) {
+	        continue
+	      }
+	      const parsed = entry.match(/^(.+):(\d+)$/);
+	      noProxyEntries.push({
+	        hostname: (parsed ? parsed[1] : entry).toLowerCase(),
+	        port: parsed ? Number.parseInt(parsed[2], 10) : 0
+	      });
+	    }
+
+	    this.#noProxyValue = noProxyValue;
+	    this.#noProxyEntries = noProxyEntries;
+	  }
+
+	  get #noProxyChanged () {
+	    if (this.#opts.noProxy !== undefined) {
+	      return false
+	    }
+	    return this.#noProxyValue !== this.#noProxyEnv
+	  }
+
+	  get #noProxyEnv () {
+	    return process.env.no_proxy ?? process.env.NO_PROXY ?? ''
+	  }
+	}
+
+	envHttpProxyAgent = EnvHttpProxyAgent;
+	return envHttpProxyAgent;
+}
+
+var retryHandler;
+var hasRequiredRetryHandler;
+
+function requireRetryHandler () {
+	if (hasRequiredRetryHandler) return retryHandler;
+	hasRequiredRetryHandler = 1;
+	const assert = require$$0$7;
+
+	const { kRetryHandlerDefaultRetry } = requireSymbols$4();
+	const { RequestRetryError } = requireErrors();
+	const {
+	  isDisturbed,
+	  parseHeaders,
+	  parseRangeHeader,
+	  wrapRequestBody
+	} = requireUtil$7();
+
+	function calculateRetryAfterHeader (retryAfter) {
+	  const current = Date.now();
+	  return new Date(retryAfter).getTime() - current
+	}
+
+	class RetryHandler {
+	  constructor (opts, handlers) {
+	    const { retryOptions, ...dispatchOpts } = opts;
+	    const {
+	      // Retry scoped
+	      retry: retryFn,
+	      maxRetries,
+	      maxTimeout,
+	      minTimeout,
+	      timeoutFactor,
+	      // Response scoped
+	      methods,
+	      errorCodes,
+	      retryAfter,
+	      statusCodes
+	    } = retryOptions ?? {};
+
+	    this.dispatch = handlers.dispatch;
+	    this.handler = handlers.handler;
+	    this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) };
+	    this.abort = null;
+	    this.aborted = false;
+	    this.retryOpts = {
+	      retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
+	      retryAfter: retryAfter ?? true,
+	      maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
+	      minTimeout: minTimeout ?? 500, // .5s
+	      timeoutFactor: timeoutFactor ?? 2,
+	      maxRetries: maxRetries ?? 5,
+	      // What errors we should retry
+	      methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],
+	      // Indicates which errors to retry
+	      statusCodes: statusCodes ?? [500, 502, 503, 504, 429],
+	      // List of errors to retry
+	      errorCodes: errorCodes ?? [
+	        'ECONNRESET',
+	        'ECONNREFUSED',
+	        'ENOTFOUND',
+	        'ENETDOWN',
+	        'ENETUNREACH',
+	        'EHOSTDOWN',
+	        'EHOSTUNREACH',
+	        'EPIPE',
+	        'UND_ERR_SOCKET'
+	      ]
+	    };
+
+	    this.retryCount = 0;
+	    this.retryCountCheckpoint = 0;
+	    this.start = 0;
+	    this.end = null;
+	    this.etag = null;
+	    this.resume = null;
+
+	    // Handle possible onConnect duplication
+	    this.handler.onConnect(reason => {
+	      this.aborted = true;
+	      if (this.abort) {
+	        this.abort(reason);
+	      } else {
+	        this.reason = reason;
+	      }
+	    });
+	  }
+
+	  onRequestSent () {
+	    if (this.handler.onRequestSent) {
+	      this.handler.onRequestSent();
+	    }
+	  }
+
+	  onUpgrade (statusCode, headers, socket) {
+	    if (this.handler.onUpgrade) {
+	      this.handler.onUpgrade(statusCode, headers, socket);
+	    }
+	  }
+
+	  onConnect (abort) {
+	    if (this.aborted) {
+	      abort(this.reason);
+	    } else {
+	      this.abort = abort;
+	    }
+	  }
+
+	  onBodySent (chunk) {
+	    if (this.handler.onBodySent) return this.handler.onBodySent(chunk)
+	  }
+
+	  static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {
+	    const { statusCode, code, headers } = err;
+	    const { method, retryOptions } = opts;
+	    const {
+	      maxRetries,
+	      minTimeout,
+	      maxTimeout,
+	      timeoutFactor,
+	      statusCodes,
+	      errorCodes,
+	      methods
+	    } = retryOptions;
+	    const { counter } = state;
+
+	    // Any code that is not a Undici's originated and allowed to retry
+	    if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) {
+	      cb(err);
+	      return
+	    }
+
+	    // If a set of method are provided and the current method is not in the list
+	    if (Array.isArray(methods) && !methods.includes(method)) {
+	      cb(err);
+	      return
+	    }
+
+	    // If a set of status code are provided and the current status code is not in the list
+	    if (
+	      statusCode != null &&
+	      Array.isArray(statusCodes) &&
+	      !statusCodes.includes(statusCode)
+	    ) {
+	      cb(err);
+	      return
+	    }
+
+	    // If we reached the max number of retries
+	    if (counter > maxRetries) {
+	      cb(err);
+	      return
+	    }
+
+	    let retryAfterHeader = headers?.['retry-after'];
+	    if (retryAfterHeader) {
+	      retryAfterHeader = Number(retryAfterHeader);
+	      retryAfterHeader = Number.isNaN(retryAfterHeader)
+	        ? calculateRetryAfterHeader(retryAfterHeader)
+	        : retryAfterHeader * 1e3; // Retry-After is in seconds
+	    }
+
+	    const retryTimeout =
+	      retryAfterHeader > 0
+	        ? Math.min(retryAfterHeader, maxTimeout)
+	        : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout);
+
+	    setTimeout(() => cb(null), retryTimeout);
+	  }
+
+	  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
+	    const headers = parseHeaders(rawHeaders);
+
+	    this.retryCount += 1;
+
+	    if (statusCode >= 300) {
+	      if (this.retryOpts.statusCodes.includes(statusCode) === false) {
+	        return this.handler.onHeaders(
+	          statusCode,
+	          rawHeaders,
+	          resume,
+	          statusMessage
+	        )
+	      } else {
+	        this.abort(
+	          new RequestRetryError('Request failed', statusCode, {
+	            headers,
+	            data: {
+	              count: this.retryCount
+	            }
+	          })
+	        );
+	        return false
+	      }
+	    }
+
+	    // Checkpoint for resume from where we left it
+	    if (this.resume != null) {
+	      this.resume = null;
+
+	      // Only Partial Content 206 supposed to provide Content-Range,
+	      // any other status code that partially consumed the payload
+	      // should not be retry because it would result in downstream
+	      // wrongly concatanete multiple responses.
+	      if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) {
+	        this.abort(
+	          new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, {
+	            headers,
+	            data: { count: this.retryCount }
+	          })
+	        );
+	        return false
+	      }
+
+	      const contentRange = parseRangeHeader(headers['content-range']);
+	      // If no content range
+	      if (!contentRange) {
+	        this.abort(
+	          new RequestRetryError('Content-Range mismatch', statusCode, {
+	            headers,
+	            data: { count: this.retryCount }
+	          })
+	        );
+	        return false
+	      }
+
+	      // Let's start with a weak etag check
+	      if (this.etag != null && this.etag !== headers.etag) {
+	        this.abort(
+	          new RequestRetryError('ETag mismatch', statusCode, {
+	            headers,
+	            data: { count: this.retryCount }
+	          })
+	        );
+	        return false
+	      }
+
+	      const { start, size, end = size - 1 } = contentRange;
+
+	      assert(this.start === start, 'content-range mismatch');
+	      assert(this.end == null || this.end === end, 'content-range mismatch');
+
+	      this.resume = resume;
+	      return true
+	    }
+
+	    if (this.end == null) {
+	      if (statusCode === 206) {
+	        // First time we receive 206
+	        const range = parseRangeHeader(headers['content-range']);
+
+	        if (range == null) {
+	          return this.handler.onHeaders(
+	            statusCode,
+	            rawHeaders,
+	            resume,
+	            statusMessage
+	          )
+	        }
+
+	        const { start, size, end = size - 1 } = range;
+	        assert(
+	          start != null && Number.isFinite(start),
+	          'content-range mismatch'
+	        );
+	        assert(end != null && Number.isFinite(end), 'invalid content-length');
+
+	        this.start = start;
+	        this.end = end;
+	      }
+
+	      // We make our best to checkpoint the body for further range headers
+	      if (this.end == null) {
+	        const contentLength = headers['content-length'];
+	        this.end = contentLength != null ? Number(contentLength) - 1 : null;
+	      }
+
+	      assert(Number.isFinite(this.start));
+	      assert(
+	        this.end == null || Number.isFinite(this.end),
+	        'invalid content-length'
+	      );
+
+	      this.resume = resume;
+	      this.etag = headers.etag != null ? headers.etag : null;
+
+	      // Weak etags are not useful for comparison nor cache
+	      // for instance not safe to assume if the response is byte-per-byte
+	      // equal
+	      if (this.etag != null && this.etag.startsWith('W/')) {
+	        this.etag = null;
+	      }
+
+	      return this.handler.onHeaders(
+	        statusCode,
+	        rawHeaders,
+	        resume,
+	        statusMessage
+	      )
+	    }
+
+	    const err = new RequestRetryError('Request failed', statusCode, {
+	      headers,
+	      data: { count: this.retryCount }
+	    });
+
+	    this.abort(err);
+
+	    return false
+	  }
+
+	  onData (chunk) {
+	    this.start += chunk.length;
+
+	    return this.handler.onData(chunk)
+	  }
+
+	  onComplete (rawTrailers) {
+	    this.retryCount = 0;
+	    return this.handler.onComplete(rawTrailers)
+	  }
+
+	  onError (err) {
+	    if (this.aborted || isDisturbed(this.opts.body)) {
+	      return this.handler.onError(err)
+	    }
+
+	    // We reconcile in case of a mix between network errors
+	    // and server error response
+	    if (this.retryCount - this.retryCountCheckpoint > 0) {
+	      // We count the difference between the last checkpoint and the current retry count
+	      this.retryCount =
+	        this.retryCountCheckpoint +
+	        (this.retryCount - this.retryCountCheckpoint);
+	    } else {
+	      this.retryCount += 1;
+	    }
+
+	    this.retryOpts.retry(
+	      err,
+	      {
+	        state: { counter: this.retryCount },
+	        opts: { retryOptions: this.retryOpts, ...this.opts }
+	      },
+	      onRetry.bind(this)
+	    );
+
+	    function onRetry (err) {
+	      if (err != null || this.aborted || isDisturbed(this.opts.body)) {
+	        return this.handler.onError(err)
+	      }
+
+	      if (this.start !== 0) {
+	        const headers = { range: `bytes=${this.start}-${this.end ?? ''}` };
+
+	        // Weak etag check - weak etags will make comparison algorithms never match
+	        if (this.etag != null) {
+	          headers['if-match'] = this.etag;
+	        }
+
+	        this.opts = {
+	          ...this.opts,
+	          headers: {
+	            ...this.opts.headers,
+	            ...headers
+	          }
+	        };
+	      }
+
+	      try {
+	        this.retryCountCheckpoint = this.retryCount;
+	        this.dispatch(this.opts, this);
+	      } catch (err) {
+	        this.handler.onError(err);
+	      }
+	    }
+	  }
+	}
+
+	retryHandler = RetryHandler;
+	return retryHandler;
+}
+
+var retryAgent;
+var hasRequiredRetryAgent;
+
+function requireRetryAgent () {
+	if (hasRequiredRetryAgent) return retryAgent;
+	hasRequiredRetryAgent = 1;
+
+	const Dispatcher = requireDispatcher();
+	const RetryHandler = requireRetryHandler();
+
+	class RetryAgent extends Dispatcher {
+	  #agent = null
+	  #options = null
+	  constructor (agent, options = {}) {
+	    super(options);
+	    this.#agent = agent;
+	    this.#options = options;
+	  }
+
+	  dispatch (opts, handler) {
+	    const retry = new RetryHandler({
+	      ...opts,
+	      retryOptions: this.#options
+	    }, {
+	      dispatch: this.#agent.dispatch.bind(this.#agent),
+	      handler
+	    });
+	    return this.#agent.dispatch(opts, retry)
+	  }
+
+	  close () {
+	    return this.#agent.close()
+	  }
+
+	  destroy () {
+	    return this.#agent.destroy()
+	  }
+	}
+
+	retryAgent = RetryAgent;
+	return retryAgent;
+}
+
+var api = {};
+
+var apiRequest = {exports: {}};
+
+var readable;
+var hasRequiredReadable;
+
+function requireReadable () {
+	if (hasRequiredReadable) return readable;
+	hasRequiredReadable = 1;
+
+	const assert = require$$0$7;
+	const { Readable } = require$$0$8;
+	const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = requireErrors();
+	const util = requireUtil$7();
+	const { ReadableStreamFrom } = requireUtil$7();
+
+	const kConsume = Symbol('kConsume');
+	const kReading = Symbol('kReading');
+	const kBody = Symbol('kBody');
+	const kAbort = Symbol('kAbort');
+	const kContentType = Symbol('kContentType');
+	const kContentLength = Symbol('kContentLength');
+
+	const noop = () => {};
+
+	class BodyReadable extends Readable {
+	  constructor ({
+	    resume,
+	    abort,
+	    contentType = '',
+	    contentLength,
+	    highWaterMark = 64 * 1024 // Same as nodejs fs streams.
+	  }) {
+	    super({
+	      autoDestroy: true,
+	      read: resume,
+	      highWaterMark
+	    });
+
+	    this._readableState.dataEmitted = false;
+
+	    this[kAbort] = abort;
+	    this[kConsume] = null;
+	    this[kBody] = null;
+	    this[kContentType] = contentType;
+	    this[kContentLength] = contentLength;
+
+	    // Is stream being consumed through Readable API?
+	    // This is an optimization so that we avoid checking
+	    // for 'data' and 'readable' listeners in the hot path
+	    // inside push().
+	    this[kReading] = false;
+	  }
+
+	  destroy (err) {
+	    if (!err && !this._readableState.endEmitted) {
+	      err = new RequestAbortedError();
+	    }
+
+	    if (err) {
+	      this[kAbort]();
+	    }
+
+	    return super.destroy(err)
+	  }
+
+	  _destroy (err, callback) {
+	    // Workaround for Node "bug". If the stream is destroyed in same
+	    // tick as it is created, then a user who is waiting for a
+	    // promise (i.e micro tick) for installing a 'error' listener will
+	    // never get a chance and will always encounter an unhandled exception.
+	    if (!this[kReading]) {
+	      setImmediate(() => {
+	        callback(err);
+	      });
+	    } else {
+	      callback(err);
+	    }
+	  }
+
+	  on (ev, ...args) {
+	    if (ev === 'data' || ev === 'readable') {
+	      this[kReading] = true;
+	    }
+	    return super.on(ev, ...args)
+	  }
+
+	  addListener (ev, ...args) {
+	    return this.on(ev, ...args)
+	  }
+
+	  off (ev, ...args) {
+	    const ret = super.off(ev, ...args);
+	    if (ev === 'data' || ev === 'readable') {
+	      this[kReading] = (
+	        this.listenerCount('data') > 0 ||
+	        this.listenerCount('readable') > 0
+	      );
+	    }
+	    return ret
+	  }
+
+	  removeListener (ev, ...args) {
+	    return this.off(ev, ...args)
+	  }
+
+	  push (chunk) {
+	    if (this[kConsume] && chunk !== null) {
+	      consumePush(this[kConsume], chunk);
+	      return this[kReading] ? super.push(chunk) : true
+	    }
+	    return super.push(chunk)
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-text
+	  async text () {
+	    return consume(this, 'text')
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-json
+	  async json () {
+	    return consume(this, 'json')
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-blob
+	  async blob () {
+	    return consume(this, 'blob')
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-bytes
+	  async bytes () {
+	    return consume(this, 'bytes')
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-arraybuffer
+	  async arrayBuffer () {
+	    return consume(this, 'arrayBuffer')
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-formdata
+	  async formData () {
+	    // TODO: Implement.
+	    throw new NotSupportedError()
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-bodyused
+	  get bodyUsed () {
+	    return util.isDisturbed(this)
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-body-body
+	  get body () {
+	    if (!this[kBody]) {
+	      this[kBody] = ReadableStreamFrom(this);
+	      if (this[kConsume]) {
+	        // TODO: Is this the best way to force a lock?
+	        this[kBody].getReader(); // Ensure stream is locked.
+	        assert(this[kBody].locked);
+	      }
+	    }
+	    return this[kBody]
+	  }
+
+	  async dump (opts) {
+	    let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024;
+	    const signal = opts?.signal;
+
+	    if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) {
+	      throw new InvalidArgumentError('signal must be an AbortSignal')
+	    }
+
+	    signal?.throwIfAborted();
+
+	    if (this._readableState.closeEmitted) {
+	      return null
+	    }
+
+	    return await new Promise((resolve, reject) => {
+	      if (this[kContentLength] > limit) {
+	        this.destroy(new AbortError());
+	      }
+
+	      const onAbort = () => {
+	        this.destroy(signal.reason ?? new AbortError());
+	      };
+	      signal?.addEventListener('abort', onAbort);
+
+	      this
+	        .on('close', function () {
+	          signal?.removeEventListener('abort', onAbort);
+	          if (signal?.aborted) {
+	            reject(signal.reason ?? new AbortError());
+	          } else {
+	            resolve(null);
+	          }
+	        })
+	        .on('error', noop)
+	        .on('data', function (chunk) {
+	          limit -= chunk.length;
+	          if (limit <= 0) {
+	            this.destroy();
+	          }
+	        })
+	        .resume();
+	    })
+	  }
+	}
+
+	// https://streams.spec.whatwg.org/#readablestream-locked
+	function isLocked (self) {
+	  // Consume is an implicit lock.
+	  return (self[kBody] && self[kBody].locked === true) || self[kConsume]
+	}
+
+	// https://fetch.spec.whatwg.org/#body-unusable
+	function isUnusable (self) {
+	  return util.isDisturbed(self) || isLocked(self)
+	}
+
+	async function consume (stream, type) {
+	  assert(!stream[kConsume]);
+
+	  return new Promise((resolve, reject) => {
+	    if (isUnusable(stream)) {
+	      const rState = stream._readableState;
+	      if (rState.destroyed && rState.closeEmitted === false) {
+	        stream
+	          .on('error', err => {
+	            reject(err);
+	          })
+	          .on('close', () => {
+	            reject(new TypeError('unusable'));
+	          });
+	      } else {
+	        reject(rState.errored ?? new TypeError('unusable'));
+	      }
+	    } else {
+	      queueMicrotask(() => {
+	        stream[kConsume] = {
+	          type,
+	          stream,
+	          resolve,
+	          reject,
+	          length: 0,
+	          body: []
+	        };
+
+	        stream
+	          .on('error', function (err) {
+	            consumeFinish(this[kConsume], err);
+	          })
+	          .on('close', function () {
+	            if (this[kConsume].body !== null) {
+	              consumeFinish(this[kConsume], new RequestAbortedError());
+	            }
+	          });
+
+	        consumeStart(stream[kConsume]);
+	      });
+	    }
+	  })
+	}
+
+	function consumeStart (consume) {
+	  if (consume.body === null) {
+	    return
+	  }
+
+	  const { _readableState: state } = consume.stream;
+
+	  if (state.bufferIndex) {
+	    const start = state.bufferIndex;
+	    const end = state.buffer.length;
+	    for (let n = start; n < end; n++) {
+	      consumePush(consume, state.buffer[n]);
+	    }
+	  } else {
+	    for (const chunk of state.buffer) {
+	      consumePush(consume, chunk);
+	    }
+	  }
+
+	  if (state.endEmitted) {
+	    consumeEnd(this[kConsume]);
+	  } else {
+	    consume.stream.on('end', function () {
+	      consumeEnd(this[kConsume]);
+	    });
+	  }
+
+	  consume.stream.resume();
+
+	  while (consume.stream.read() != null) {
+	    // Loop
+	  }
+	}
+
+	/**
+	 * @param {Buffer[]} chunks
+	 * @param {number} length
+	 */
+	function chunksDecode (chunks, length) {
+	  if (chunks.length === 0 || length === 0) {
+	    return ''
+	  }
+	  const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length);
+	  const bufferLength = buffer.length;
+
+	  // Skip BOM.
+	  const start =
+	    bufferLength > 2 &&
+	    buffer[0] === 0xef &&
+	    buffer[1] === 0xbb &&
+	    buffer[2] === 0xbf
+	      ? 3
+	      : 0;
+	  return buffer.utf8Slice(start, bufferLength)
+	}
+
+	/**
+	 * @param {Buffer[]} chunks
+	 * @param {number} length
+	 * @returns {Uint8Array}
+	 */
+	function chunksConcat (chunks, length) {
+	  if (chunks.length === 0 || length === 0) {
+	    return new Uint8Array(0)
+	  }
+	  if (chunks.length === 1) {
+	    // fast-path
+	    return new Uint8Array(chunks[0])
+	  }
+	  const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer);
+
+	  let offset = 0;
+	  for (let i = 0; i < chunks.length; ++i) {
+	    const chunk = chunks[i];
+	    buffer.set(chunk, offset);
+	    offset += chunk.length;
+	  }
+
+	  return buffer
+	}
+
+	function consumeEnd (consume) {
+	  const { type, body, resolve, stream, length } = consume;
+
+	  try {
+	    if (type === 'text') {
+	      resolve(chunksDecode(body, length));
+	    } else if (type === 'json') {
+	      resolve(JSON.parse(chunksDecode(body, length)));
+	    } else if (type === 'arrayBuffer') {
+	      resolve(chunksConcat(body, length).buffer);
+	    } else if (type === 'blob') {
+	      resolve(new Blob(body, { type: stream[kContentType] }));
+	    } else if (type === 'bytes') {
+	      resolve(chunksConcat(body, length));
+	    }
+
+	    consumeFinish(consume);
+	  } catch (err) {
+	    stream.destroy(err);
+	  }
+	}
+
+	function consumePush (consume, chunk) {
+	  consume.length += chunk.length;
+	  consume.body.push(chunk);
+	}
+
+	function consumeFinish (consume, err) {
+	  if (consume.body === null) {
+	    return
+	  }
+
+	  if (err) {
+	    consume.reject(err);
+	  } else {
+	    consume.resolve();
+	  }
+
+	  consume.type = null;
+	  consume.stream = null;
+	  consume.resolve = null;
+	  consume.reject = null;
+	  consume.length = 0;
+	  consume.body = null;
+	}
+
+	readable = { Readable: BodyReadable, chunksDecode };
+	return readable;
+}
+
+var util$5;
+var hasRequiredUtil$5;
+
+function requireUtil$5 () {
+	if (hasRequiredUtil$5) return util$5;
+	hasRequiredUtil$5 = 1;
+	const assert = require$$0$7;
+	const {
+	  ResponseStatusCodeError
+	} = requireErrors();
+
+	const { chunksDecode } = requireReadable();
+	const CHUNK_LIMIT = 128 * 1024;
+
+	async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) {
+	  assert(body);
+
+	  let chunks = [];
+	  let length = 0;
+
+	  try {
+	    for await (const chunk of body) {
+	      chunks.push(chunk);
+	      length += chunk.length;
+	      if (length > CHUNK_LIMIT) {
+	        chunks = [];
+	        length = 0;
+	        break
+	      }
+	    }
+	  } catch {
+	    chunks = [];
+	    length = 0;
+	    // Do nothing....
+	  }
+
+	  const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`;
+
+	  if (statusCode === 204 || !contentType || !length) {
+	    queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers)));
+	    return
+	  }
+
+	  const stackTraceLimit = Error.stackTraceLimit;
+	  Error.stackTraceLimit = 0;
+	  let payload;
+
+	  try {
+	    if (isContentTypeApplicationJson(contentType)) {
+	      payload = JSON.parse(chunksDecode(chunks, length));
+	    } else if (isContentTypeText(contentType)) {
+	      payload = chunksDecode(chunks, length);
+	    }
+	  } catch {
+	    // process in a callback to avoid throwing in the microtask queue
+	  } finally {
+	    Error.stackTraceLimit = stackTraceLimit;
+	  }
+	  queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload)));
+	}
+
+	const isContentTypeApplicationJson = (contentType) => {
+	  return (
+	    contentType.length > 15 &&
+	    contentType[11] === '/' &&
+	    contentType[0] === 'a' &&
+	    contentType[1] === 'p' &&
+	    contentType[2] === 'p' &&
+	    contentType[3] === 'l' &&
+	    contentType[4] === 'i' &&
+	    contentType[5] === 'c' &&
+	    contentType[6] === 'a' &&
+	    contentType[7] === 't' &&
+	    contentType[8] === 'i' &&
+	    contentType[9] === 'o' &&
+	    contentType[10] === 'n' &&
+	    contentType[12] === 'j' &&
+	    contentType[13] === 's' &&
+	    contentType[14] === 'o' &&
+	    contentType[15] === 'n'
+	  )
+	};
+
+	const isContentTypeText = (contentType) => {
+	  return (
+	    contentType.length > 4 &&
+	    contentType[4] === '/' &&
+	    contentType[0] === 't' &&
+	    contentType[1] === 'e' &&
+	    contentType[2] === 'x' &&
+	    contentType[3] === 't'
+	  )
+	};
+
+	util$5 = {
+	  getResolveErrorBodyCallback,
+	  isContentTypeApplicationJson,
+	  isContentTypeText
+	};
+	return util$5;
+}
+
+var hasRequiredApiRequest;
+
+function requireApiRequest () {
+	if (hasRequiredApiRequest) return apiRequest.exports;
+	hasRequiredApiRequest = 1;
+
+	const assert = require$$0$7;
+	const { Readable } = requireReadable();
+	const { InvalidArgumentError, RequestAbortedError } = requireErrors();
+	const util = requireUtil$7();
+	const { getResolveErrorBodyCallback } = requireUtil$5();
+	const { AsyncResource } = require$$5$2;
+
+	class RequestHandler extends AsyncResource {
+	  constructor (opts, callback) {
+	    if (!opts || typeof opts !== 'object') {
+	      throw new InvalidArgumentError('invalid opts')
+	    }
+
+	    const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts;
+
+	    try {
+	      if (typeof callback !== 'function') {
+	        throw new InvalidArgumentError('invalid callback')
+	      }
+
+	      if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {
+	        throw new InvalidArgumentError('invalid highWaterMark')
+	      }
+
+	      if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {
+	        throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')
+	      }
+
+	      if (method === 'CONNECT') {
+	        throw new InvalidArgumentError('invalid method')
+	      }
+
+	      if (onInfo && typeof onInfo !== 'function') {
+	        throw new InvalidArgumentError('invalid onInfo callback')
+	      }
+
+	      super('UNDICI_REQUEST');
+	    } catch (err) {
+	      if (util.isStream(body)) {
+	        util.destroy(body.on('error', util.nop), err);
+	      }
+	      throw err
+	    }
+
+	    this.method = method;
+	    this.responseHeaders = responseHeaders || null;
+	    this.opaque = opaque || null;
+	    this.callback = callback;
+	    this.res = null;
+	    this.abort = null;
+	    this.body = body;
+	    this.trailers = {};
+	    this.context = null;
+	    this.onInfo = onInfo || null;
+	    this.throwOnError = throwOnError;
+	    this.highWaterMark = highWaterMark;
+	    this.signal = signal;
+	    this.reason = null;
+	    this.removeAbortListener = null;
+
+	    if (util.isStream(body)) {
+	      body.on('error', (err) => {
+	        this.onError(err);
+	      });
+	    }
+
+	    if (this.signal) {
+	      if (this.signal.aborted) {
+	        this.reason = this.signal.reason ?? new RequestAbortedError();
+	      } else {
+	        this.removeAbortListener = util.addAbortListener(this.signal, () => {
+	          this.reason = this.signal.reason ?? new RequestAbortedError();
+	          if (this.res) {
+	            util.destroy(this.res.on('error', util.nop), this.reason);
+	          } else if (this.abort) {
+	            this.abort(this.reason);
+	          }
+
+	          if (this.removeAbortListener) {
+	            this.res?.off('close', this.removeAbortListener);
+	            this.removeAbortListener();
+	            this.removeAbortListener = null;
+	          }
+	        });
+	      }
+	    }
+	  }
+
+	  onConnect (abort, context) {
+	    if (this.reason) {
+	      abort(this.reason);
+	      return
+	    }
+
+	    assert(this.callback);
+
+	    this.abort = abort;
+	    this.context = context;
+	  }
+
+	  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
+	    const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this;
+
+	    const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+
+	    if (statusCode < 200) {
+	      if (this.onInfo) {
+	        this.onInfo({ statusCode, headers });
+	      }
+	      return
+	    }
+
+	    const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers;
+	    const contentType = parsedHeaders['content-type'];
+	    const contentLength = parsedHeaders['content-length'];
+	    const res = new Readable({
+	      resume,
+	      abort,
+	      contentType,
+	      contentLength: this.method !== 'HEAD' && contentLength
+	        ? Number(contentLength)
+	        : null,
+	      highWaterMark
+	    });
+
+	    if (this.removeAbortListener) {
+	      res.on('close', this.removeAbortListener);
+	    }
+
+	    this.callback = null;
+	    this.res = res;
+	    if (callback !== null) {
+	      if (this.throwOnError && statusCode >= 400) {
+	        this.runInAsyncScope(getResolveErrorBodyCallback, null,
+	          { callback, body: res, contentType, statusCode, statusMessage, headers }
+	        );
+	      } else {
+	        this.runInAsyncScope(callback, null, null, {
+	          statusCode,
+	          headers,
+	          trailers: this.trailers,
+	          opaque,
+	          body: res,
+	          context
+	        });
+	      }
+	    }
+	  }
+
+	  onData (chunk) {
+	    return this.res.push(chunk)
+	  }
+
+	  onComplete (trailers) {
+	    util.parseHeaders(trailers, this.trailers);
+	    this.res.push(null);
+	  }
+
+	  onError (err) {
+	    const { res, callback, body, opaque } = this;
+
+	    if (callback) {
+	      // TODO: Does this need queueMicrotask?
+	      this.callback = null;
+	      queueMicrotask(() => {
+	        this.runInAsyncScope(callback, null, err, { opaque });
+	      });
+	    }
+
+	    if (res) {
+	      this.res = null;
+	      // Ensure all queued handlers are invoked before destroying res.
+	      queueMicrotask(() => {
+	        util.destroy(res, err);
+	      });
+	    }
+
+	    if (body) {
+	      this.body = null;
+	      util.destroy(body, err);
+	    }
+
+	    if (this.removeAbortListener) {
+	      res?.off('close', this.removeAbortListener);
+	      this.removeAbortListener();
+	      this.removeAbortListener = null;
+	    }
+	  }
+	}
+
+	function request (opts, callback) {
+	  if (callback === undefined) {
+	    return new Promise((resolve, reject) => {
+	      request.call(this, opts, (err, data) => {
+	        return err ? reject(err) : resolve(data)
+	      });
+	    })
+	  }
+
+	  try {
+	    this.dispatch(opts, new RequestHandler(opts, callback));
+	  } catch (err) {
+	    if (typeof callback !== 'function') {
+	      throw err
+	    }
+	    const opaque = opts?.opaque;
+	    queueMicrotask(() => callback(err, { opaque }));
+	  }
+	}
+
+	apiRequest.exports = request;
+	apiRequest.exports.RequestHandler = RequestHandler;
+	return apiRequest.exports;
+}
+
+var abortSignal;
+var hasRequiredAbortSignal;
+
+function requireAbortSignal () {
+	if (hasRequiredAbortSignal) return abortSignal;
+	hasRequiredAbortSignal = 1;
+	const { addAbortListener } = requireUtil$7();
+	const { RequestAbortedError } = requireErrors();
+
+	const kListener = Symbol('kListener');
+	const kSignal = Symbol('kSignal');
+
+	function abort (self) {
+	  if (self.abort) {
+	    self.abort(self[kSignal]?.reason);
+	  } else {
+	    self.reason = self[kSignal]?.reason ?? new RequestAbortedError();
+	  }
+	  removeSignal(self);
+	}
+
+	function addSignal (self, signal) {
+	  self.reason = null;
+
+	  self[kSignal] = null;
+	  self[kListener] = null;
+
+	  if (!signal) {
+	    return
+	  }
+
+	  if (signal.aborted) {
+	    abort(self);
+	    return
+	  }
+
+	  self[kSignal] = signal;
+	  self[kListener] = () => {
+	    abort(self);
+	  };
+
+	  addAbortListener(self[kSignal], self[kListener]);
+	}
+
+	function removeSignal (self) {
+	  if (!self[kSignal]) {
+	    return
+	  }
+
+	  if ('removeEventListener' in self[kSignal]) {
+	    self[kSignal].removeEventListener('abort', self[kListener]);
+	  } else {
+	    self[kSignal].removeListener('abort', self[kListener]);
+	  }
+
+	  self[kSignal] = null;
+	  self[kListener] = null;
+	}
+
+	abortSignal = {
+	  addSignal,
+	  removeSignal
+	};
+	return abortSignal;
+}
+
+var apiStream;
+var hasRequiredApiStream;
+
+function requireApiStream () {
+	if (hasRequiredApiStream) return apiStream;
+	hasRequiredApiStream = 1;
+
+	const assert = require$$0$7;
+	const { finished, PassThrough } = require$$0$8;
+	const { InvalidArgumentError, InvalidReturnValueError } = requireErrors();
+	const util = requireUtil$7();
+	const { getResolveErrorBodyCallback } = requireUtil$5();
+	const { AsyncResource } = require$$5$2;
+	const { addSignal, removeSignal } = requireAbortSignal();
+
+	class StreamHandler extends AsyncResource {
+	  constructor (opts, factory, callback) {
+	    if (!opts || typeof opts !== 'object') {
+	      throw new InvalidArgumentError('invalid opts')
+	    }
+
+	    const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts;
+
+	    try {
+	      if (typeof callback !== 'function') {
+	        throw new InvalidArgumentError('invalid callback')
+	      }
+
+	      if (typeof factory !== 'function') {
+	        throw new InvalidArgumentError('invalid factory')
+	      }
+
+	      if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {
+	        throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')
+	      }
+
+	      if (method === 'CONNECT') {
+	        throw new InvalidArgumentError('invalid method')
+	      }
+
+	      if (onInfo && typeof onInfo !== 'function') {
+	        throw new InvalidArgumentError('invalid onInfo callback')
+	      }
+
+	      super('UNDICI_STREAM');
+	    } catch (err) {
+	      if (util.isStream(body)) {
+	        util.destroy(body.on('error', util.nop), err);
+	      }
+	      throw err
+	    }
+
+	    this.responseHeaders = responseHeaders || null;
+	    this.opaque = opaque || null;
+	    this.factory = factory;
+	    this.callback = callback;
+	    this.res = null;
+	    this.abort = null;
+	    this.context = null;
+	    this.trailers = null;
+	    this.body = body;
+	    this.onInfo = onInfo || null;
+	    this.throwOnError = throwOnError || false;
+
+	    if (util.isStream(body)) {
+	      body.on('error', (err) => {
+	        this.onError(err);
+	      });
+	    }
+
+	    addSignal(this, signal);
+	  }
+
+	  onConnect (abort, context) {
+	    if (this.reason) {
+	      abort(this.reason);
+	      return
+	    }
+
+	    assert(this.callback);
+
+	    this.abort = abort;
+	    this.context = context;
+	  }
+
+	  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
+	    const { factory, opaque, context, callback, responseHeaders } = this;
+
+	    const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+
+	    if (statusCode < 200) {
+	      if (this.onInfo) {
+	        this.onInfo({ statusCode, headers });
+	      }
+	      return
+	    }
+
+	    this.factory = null;
+
+	    let res;
+
+	    if (this.throwOnError && statusCode >= 400) {
+	      const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers;
+	      const contentType = parsedHeaders['content-type'];
+	      res = new PassThrough();
+
+	      this.callback = null;
+	      this.runInAsyncScope(getResolveErrorBodyCallback, null,
+	        { callback, body: res, contentType, statusCode, statusMessage, headers }
+	      );
+	    } else {
+	      if (factory === null) {
+	        return
+	      }
+
+	      res = this.runInAsyncScope(factory, null, {
+	        statusCode,
+	        headers,
+	        opaque,
+	        context
+	      });
+
+	      if (
+	        !res ||
+	        typeof res.write !== 'function' ||
+	        typeof res.end !== 'function' ||
+	        typeof res.on !== 'function'
+	      ) {
+	        throw new InvalidReturnValueError('expected Writable')
+	      }
+
+	      // TODO: Avoid finished. It registers an unnecessary amount of listeners.
+	      finished(res, { readable: false }, (err) => {
+	        const { callback, res, opaque, trailers, abort } = this;
+
+	        this.res = null;
+	        if (err || !res.readable) {
+	          util.destroy(res, err);
+	        }
+
+	        this.callback = null;
+	        this.runInAsyncScope(callback, null, err || null, { opaque, trailers });
+
+	        if (err) {
+	          abort();
+	        }
+	      });
+	    }
+
+	    res.on('drain', resume);
+
+	    this.res = res;
+
+	    const needDrain = res.writableNeedDrain !== undefined
+	      ? res.writableNeedDrain
+	      : res._writableState?.needDrain;
+
+	    return needDrain !== true
+	  }
+
+	  onData (chunk) {
+	    const { res } = this;
+
+	    return res ? res.write(chunk) : true
+	  }
+
+	  onComplete (trailers) {
+	    const { res } = this;
+
+	    removeSignal(this);
+
+	    if (!res) {
+	      return
+	    }
+
+	    this.trailers = util.parseHeaders(trailers);
+
+	    res.end();
+	  }
+
+	  onError (err) {
+	    const { res, callback, opaque, body } = this;
+
+	    removeSignal(this);
+
+	    this.factory = null;
+
+	    if (res) {
+	      this.res = null;
+	      util.destroy(res, err);
+	    } else if (callback) {
+	      this.callback = null;
+	      queueMicrotask(() => {
+	        this.runInAsyncScope(callback, null, err, { opaque });
+	      });
+	    }
+
+	    if (body) {
+	      this.body = null;
+	      util.destroy(body, err);
+	    }
+	  }
+	}
+
+	function stream (opts, factory, callback) {
+	  if (callback === undefined) {
+	    return new Promise((resolve, reject) => {
+	      stream.call(this, opts, factory, (err, data) => {
+	        return err ? reject(err) : resolve(data)
+	      });
+	    })
+	  }
+
+	  try {
+	    this.dispatch(opts, new StreamHandler(opts, factory, callback));
+	  } catch (err) {
+	    if (typeof callback !== 'function') {
+	      throw err
+	    }
+	    const opaque = opts?.opaque;
+	    queueMicrotask(() => callback(err, { opaque }));
+	  }
+	}
+
+	apiStream = stream;
+	return apiStream;
+}
+
+var apiPipeline;
+var hasRequiredApiPipeline;
+
+function requireApiPipeline () {
+	if (hasRequiredApiPipeline) return apiPipeline;
+	hasRequiredApiPipeline = 1;
+
+	const {
+	  Readable,
+	  Duplex,
+	  PassThrough
+	} = require$$0$8;
+	const {
+	  InvalidArgumentError,
+	  InvalidReturnValueError,
+	  RequestAbortedError
+	} = requireErrors();
+	const util = requireUtil$7();
+	const { AsyncResource } = require$$5$2;
+	const { addSignal, removeSignal } = requireAbortSignal();
+	const assert = require$$0$7;
+
+	const kResume = Symbol('resume');
+
+	class PipelineRequest extends Readable {
+	  constructor () {
+	    super({ autoDestroy: true });
+
+	    this[kResume] = null;
+	  }
+
+	  _read () {
+	    const { [kResume]: resume } = this;
+
+	    if (resume) {
+	      this[kResume] = null;
+	      resume();
+	    }
+	  }
+
+	  _destroy (err, callback) {
+	    this._read();
+
+	    callback(err);
+	  }
+	}
+
+	class PipelineResponse extends Readable {
+	  constructor (resume) {
+	    super({ autoDestroy: true });
+	    this[kResume] = resume;
+	  }
+
+	  _read () {
+	    this[kResume]();
+	  }
+
+	  _destroy (err, callback) {
+	    if (!err && !this._readableState.endEmitted) {
+	      err = new RequestAbortedError();
+	    }
+
+	    callback(err);
+	  }
+	}
+
+	class PipelineHandler extends AsyncResource {
+	  constructor (opts, handler) {
+	    if (!opts || typeof opts !== 'object') {
+	      throw new InvalidArgumentError('invalid opts')
+	    }
+
+	    if (typeof handler !== 'function') {
+	      throw new InvalidArgumentError('invalid handler')
+	    }
+
+	    const { signal, method, opaque, onInfo, responseHeaders } = opts;
+
+	    if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {
+	      throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')
+	    }
+
+	    if (method === 'CONNECT') {
+	      throw new InvalidArgumentError('invalid method')
+	    }
+
+	    if (onInfo && typeof onInfo !== 'function') {
+	      throw new InvalidArgumentError('invalid onInfo callback')
+	    }
+
+	    super('UNDICI_PIPELINE');
+
+	    this.opaque = opaque || null;
+	    this.responseHeaders = responseHeaders || null;
+	    this.handler = handler;
+	    this.abort = null;
+	    this.context = null;
+	    this.onInfo = onInfo || null;
+
+	    this.req = new PipelineRequest().on('error', util.nop);
+
+	    this.ret = new Duplex({
+	      readableObjectMode: opts.objectMode,
+	      autoDestroy: true,
+	      read: () => {
+	        const { body } = this;
+
+	        if (body?.resume) {
+	          body.resume();
+	        }
+	      },
+	      write: (chunk, encoding, callback) => {
+	        const { req } = this;
+
+	        if (req.push(chunk, encoding) || req._readableState.destroyed) {
+	          callback();
+	        } else {
+	          req[kResume] = callback;
+	        }
+	      },
+	      destroy: (err, callback) => {
+	        const { body, req, res, ret, abort } = this;
+
+	        if (!err && !ret._readableState.endEmitted) {
+	          err = new RequestAbortedError();
+	        }
+
+	        if (abort && err) {
+	          abort();
+	        }
+
+	        util.destroy(body, err);
+	        util.destroy(req, err);
+	        util.destroy(res, err);
+
+	        removeSignal(this);
+
+	        callback(err);
+	      }
+	    }).on('prefinish', () => {
+	      const { req } = this;
+
+	      // Node < 15 does not call _final in same tick.
+	      req.push(null);
+	    });
+
+	    this.res = null;
+
+	    addSignal(this, signal);
+	  }
+
+	  onConnect (abort, context) {
+	    const { ret, res } = this;
+
+	    if (this.reason) {
+	      abort(this.reason);
+	      return
+	    }
+
+	    assert(!res, 'pipeline cannot be retried');
+	    assert(!ret.destroyed);
+
+	    this.abort = abort;
+	    this.context = context;
+	  }
+
+	  onHeaders (statusCode, rawHeaders, resume) {
+	    const { opaque, handler, context } = this;
+
+	    if (statusCode < 200) {
+	      if (this.onInfo) {
+	        const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+	        this.onInfo({ statusCode, headers });
+	      }
+	      return
+	    }
+
+	    this.res = new PipelineResponse(resume);
+
+	    let body;
+	    try {
+	      this.handler = null;
+	      const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+	      body = this.runInAsyncScope(handler, null, {
+	        statusCode,
+	        headers,
+	        opaque,
+	        body: this.res,
+	        context
+	      });
+	    } catch (err) {
+	      this.res.on('error', util.nop);
+	      throw err
+	    }
+
+	    if (!body || typeof body.on !== 'function') {
+	      throw new InvalidReturnValueError('expected Readable')
+	    }
+
+	    body
+	      .on('data', (chunk) => {
+	        const { ret, body } = this;
+
+	        if (!ret.push(chunk) && body.pause) {
+	          body.pause();
+	        }
+	      })
+	      .on('error', (err) => {
+	        const { ret } = this;
+
+	        util.destroy(ret, err);
+	      })
+	      .on('end', () => {
+	        const { ret } = this;
+
+	        ret.push(null);
+	      })
+	      .on('close', () => {
+	        const { ret } = this;
+
+	        if (!ret._readableState.ended) {
+	          util.destroy(ret, new RequestAbortedError());
+	        }
+	      });
+
+	    this.body = body;
+	  }
+
+	  onData (chunk) {
+	    const { res } = this;
+	    return res.push(chunk)
+	  }
+
+	  onComplete (trailers) {
+	    const { res } = this;
+	    res.push(null);
+	  }
+
+	  onError (err) {
+	    const { ret } = this;
+	    this.handler = null;
+	    util.destroy(ret, err);
+	  }
+	}
+
+	function pipeline (opts, handler) {
+	  try {
+	    const pipelineHandler = new PipelineHandler(opts, handler);
+	    this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler);
+	    return pipelineHandler.ret
+	  } catch (err) {
+	    return new PassThrough().destroy(err)
+	  }
+	}
+
+	apiPipeline = pipeline;
+	return apiPipeline;
+}
+
+var apiUpgrade;
+var hasRequiredApiUpgrade;
+
+function requireApiUpgrade () {
+	if (hasRequiredApiUpgrade) return apiUpgrade;
+	hasRequiredApiUpgrade = 1;
+
+	const { InvalidArgumentError, SocketError } = requireErrors();
+	const { AsyncResource } = require$$5$2;
+	const util = requireUtil$7();
+	const { addSignal, removeSignal } = requireAbortSignal();
+	const assert = require$$0$7;
+
+	class UpgradeHandler extends AsyncResource {
+	  constructor (opts, callback) {
+	    if (!opts || typeof opts !== 'object') {
+	      throw new InvalidArgumentError('invalid opts')
+	    }
+
+	    if (typeof callback !== 'function') {
+	      throw new InvalidArgumentError('invalid callback')
+	    }
+
+	    const { signal, opaque, responseHeaders } = opts;
+
+	    if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {
+	      throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')
+	    }
+
+	    super('UNDICI_UPGRADE');
+
+	    this.responseHeaders = responseHeaders || null;
+	    this.opaque = opaque || null;
+	    this.callback = callback;
+	    this.abort = null;
+	    this.context = null;
+
+	    addSignal(this, signal);
+	  }
+
+	  onConnect (abort, context) {
+	    if (this.reason) {
+	      abort(this.reason);
+	      return
+	    }
+
+	    assert(this.callback);
+
+	    this.abort = abort;
+	    this.context = null;
+	  }
+
+	  onHeaders () {
+	    throw new SocketError('bad upgrade', null)
+	  }
+
+	  onUpgrade (statusCode, rawHeaders, socket) {
+	    assert(statusCode === 101);
+
+	    const { callback, opaque, context } = this;
+
+	    removeSignal(this);
+
+	    this.callback = null;
+	    const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+	    this.runInAsyncScope(callback, null, null, {
+	      headers,
+	      socket,
+	      opaque,
+	      context
+	    });
+	  }
+
+	  onError (err) {
+	    const { callback, opaque } = this;
+
+	    removeSignal(this);
+
+	    if (callback) {
+	      this.callback = null;
+	      queueMicrotask(() => {
+	        this.runInAsyncScope(callback, null, err, { opaque });
+	      });
+	    }
+	  }
+	}
+
+	function upgrade (opts, callback) {
+	  if (callback === undefined) {
+	    return new Promise((resolve, reject) => {
+	      upgrade.call(this, opts, (err, data) => {
+	        return err ? reject(err) : resolve(data)
+	      });
+	    })
+	  }
+
+	  try {
+	    const upgradeHandler = new UpgradeHandler(opts, callback);
+	    this.dispatch({
+	      ...opts,
+	      method: opts.method || 'GET',
+	      upgrade: opts.protocol || 'Websocket'
+	    }, upgradeHandler);
+	  } catch (err) {
+	    if (typeof callback !== 'function') {
+	      throw err
+	    }
+	    const opaque = opts?.opaque;
+	    queueMicrotask(() => callback(err, { opaque }));
+	  }
+	}
+
+	apiUpgrade = upgrade;
+	return apiUpgrade;
+}
+
+var apiConnect;
+var hasRequiredApiConnect;
+
+function requireApiConnect () {
+	if (hasRequiredApiConnect) return apiConnect;
+	hasRequiredApiConnect = 1;
+
+	const assert = require$$0$7;
+	const { AsyncResource } = require$$5$2;
+	const { InvalidArgumentError, SocketError } = requireErrors();
+	const util = requireUtil$7();
+	const { addSignal, removeSignal } = requireAbortSignal();
+
+	class ConnectHandler extends AsyncResource {
+	  constructor (opts, callback) {
+	    if (!opts || typeof opts !== 'object') {
+	      throw new InvalidArgumentError('invalid opts')
+	    }
+
+	    if (typeof callback !== 'function') {
+	      throw new InvalidArgumentError('invalid callback')
+	    }
+
+	    const { signal, opaque, responseHeaders } = opts;
+
+	    if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {
+	      throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')
+	    }
+
+	    super('UNDICI_CONNECT');
+
+	    this.opaque = opaque || null;
+	    this.responseHeaders = responseHeaders || null;
+	    this.callback = callback;
+	    this.abort = null;
+
+	    addSignal(this, signal);
+	  }
+
+	  onConnect (abort, context) {
+	    if (this.reason) {
+	      abort(this.reason);
+	      return
+	    }
+
+	    assert(this.callback);
+
+	    this.abort = abort;
+	    this.context = context;
+	  }
+
+	  onHeaders () {
+	    throw new SocketError('bad connect', null)
+	  }
+
+	  onUpgrade (statusCode, rawHeaders, socket) {
+	    const { callback, opaque, context } = this;
+
+	    removeSignal(this);
+
+	    this.callback = null;
+
+	    let headers = rawHeaders;
+	    // Indicates is an HTTP2Session
+	    if (headers != null) {
+	      headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders);
+	    }
+
+	    this.runInAsyncScope(callback, null, null, {
+	      statusCode,
+	      headers,
+	      socket,
+	      opaque,
+	      context
+	    });
+	  }
+
+	  onError (err) {
+	    const { callback, opaque } = this;
+
+	    removeSignal(this);
+
+	    if (callback) {
+	      this.callback = null;
+	      queueMicrotask(() => {
+	        this.runInAsyncScope(callback, null, err, { opaque });
+	      });
+	    }
+	  }
+	}
+
+	function connect (opts, callback) {
+	  if (callback === undefined) {
+	    return new Promise((resolve, reject) => {
+	      connect.call(this, opts, (err, data) => {
+	        return err ? reject(err) : resolve(data)
+	      });
+	    })
+	  }
+
+	  try {
+	    const connectHandler = new ConnectHandler(opts, callback);
+	    this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler);
+	  } catch (err) {
+	    if (typeof callback !== 'function') {
+	      throw err
+	    }
+	    const opaque = opts?.opaque;
+	    queueMicrotask(() => callback(err, { opaque }));
+	  }
+	}
+
+	apiConnect = connect;
+	return apiConnect;
+}
+
+var hasRequiredApi;
+
+function requireApi () {
+	if (hasRequiredApi) return api;
+	hasRequiredApi = 1;
+
+	api.request = requireApiRequest();
+	api.stream = requireApiStream();
+	api.pipeline = requireApiPipeline();
+	api.upgrade = requireApiUpgrade();
+	api.connect = requireApiConnect();
+	return api;
+}
+
+var mockErrors;
+var hasRequiredMockErrors;
+
+function requireMockErrors () {
+	if (hasRequiredMockErrors) return mockErrors;
+	hasRequiredMockErrors = 1;
+
+	const { UndiciError } = requireErrors();
+
+	const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED');
+
+	/**
+	 * The request does not match any registered mock dispatches.
+	 */
+	class MockNotMatchedError extends UndiciError {
+	  constructor (message) {
+	    super(message);
+	    Error.captureStackTrace(this, MockNotMatchedError);
+	    this.name = 'MockNotMatchedError';
+	    this.message = message || 'The request does not match any registered mock dispatches';
+	    this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED';
+	  }
+
+	  static [Symbol.hasInstance] (instance) {
+	    return instance && instance[kMockNotMatchedError] === true
+	  }
+
+	  [kMockNotMatchedError] = true
+	}
+
+	mockErrors = {
+	  MockNotMatchedError
+	};
+	return mockErrors;
+}
+
+var mockSymbols;
+var hasRequiredMockSymbols;
+
+function requireMockSymbols () {
+	if (hasRequiredMockSymbols) return mockSymbols;
+	hasRequiredMockSymbols = 1;
+
+	mockSymbols = {
+	  kAgent: Symbol('agent'),
+	  kOptions: Symbol('options'),
+	  kFactory: Symbol('factory'),
+	  kDispatches: Symbol('dispatches'),
+	  kDispatchKey: Symbol('dispatch key'),
+	  kDefaultHeaders: Symbol('default headers'),
+	  kDefaultTrailers: Symbol('default trailers'),
+	  kContentLength: Symbol('content length'),
+	  kMockAgent: Symbol('mock agent'),
+	  kMockAgentSet: Symbol('mock agent set'),
+	  kMockAgentGet: Symbol('mock agent get'),
+	  kMockDispatch: Symbol('mock dispatch'),
+	  kClose: Symbol('close'),
+	  kOriginalClose: Symbol('original agent close'),
+	  kOrigin: Symbol('origin'),
+	  kIsMockActive: Symbol('is mock active'),
+	  kNetConnect: Symbol('net connect'),
+	  kGetNetConnect: Symbol('get net connect'),
+	  kConnected: Symbol('connected')
+	};
+	return mockSymbols;
+}
+
+var mockUtils;
+var hasRequiredMockUtils;
+
+function requireMockUtils () {
+	if (hasRequiredMockUtils) return mockUtils;
+	hasRequiredMockUtils = 1;
+
+	const { MockNotMatchedError } = requireMockErrors();
+	const {
+	  kDispatches,
+	  kMockAgent,
+	  kOriginalDispatch,
+	  kOrigin,
+	  kGetNetConnect
+	} = requireMockSymbols();
+	const { buildURL } = requireUtil$7();
+	const { STATUS_CODES } = require$$2;
+	const {
+	  types: {
+	    isPromise
+	  }
+	} = require$$0$a;
+
+	function matchValue (match, value) {
+	  if (typeof match === 'string') {
+	    return match === value
+	  }
+	  if (match instanceof RegExp) {
+	    return match.test(value)
+	  }
+	  if (typeof match === 'function') {
+	    return match(value) === true
+	  }
+	  return false
+	}
+
+	function lowerCaseEntries (headers) {
+	  return Object.fromEntries(
+	    Object.entries(headers).map(([headerName, headerValue]) => {
+	      return [headerName.toLocaleLowerCase(), headerValue]
+	    })
+	  )
+	}
+
+	/**
+	 * @param {import('../../index').Headers|string[]|Record} headers
+	 * @param {string} key
+	 */
+	function getHeaderByName (headers, key) {
+	  if (Array.isArray(headers)) {
+	    for (let i = 0; i < headers.length; i += 2) {
+	      if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {
+	        return headers[i + 1]
+	      }
+	    }
+
+	    return undefined
+	  } else if (typeof headers.get === 'function') {
+	    return headers.get(key)
+	  } else {
+	    return lowerCaseEntries(headers)[key.toLocaleLowerCase()]
+	  }
+	}
+
+	/** @param {string[]} headers */
+	function buildHeadersFromArray (headers) { // fetch HeadersList
+	  const clone = headers.slice();
+	  const entries = [];
+	  for (let index = 0; index < clone.length; index += 2) {
+	    entries.push([clone[index], clone[index + 1]]);
+	  }
+	  return Object.fromEntries(entries)
+	}
+
+	function matchHeaders (mockDispatch, headers) {
+	  if (typeof mockDispatch.headers === 'function') {
+	    if (Array.isArray(headers)) { // fetch HeadersList
+	      headers = buildHeadersFromArray(headers);
+	    }
+	    return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})
+	  }
+	  if (typeof mockDispatch.headers === 'undefined') {
+	    return true
+	  }
+	  if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {
+	    return false
+	  }
+
+	  for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {
+	    const headerValue = getHeaderByName(headers, matchHeaderName);
+
+	    if (!matchValue(matchHeaderValue, headerValue)) {
+	      return false
+	    }
+	  }
+	  return true
+	}
+
+	function safeUrl (path) {
+	  if (typeof path !== 'string') {
+	    return path
+	  }
+
+	  const pathSegments = path.split('?');
+
+	  if (pathSegments.length !== 2) {
+	    return path
+	  }
+
+	  const qp = new URLSearchParams(pathSegments.pop());
+	  qp.sort();
+	  return [...pathSegments, qp.toString()].join('?')
+	}
+
+	function matchKey (mockDispatch, { path, method, body, headers }) {
+	  const pathMatch = matchValue(mockDispatch.path, path);
+	  const methodMatch = matchValue(mockDispatch.method, method);
+	  const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true;
+	  const headersMatch = matchHeaders(mockDispatch, headers);
+	  return pathMatch && methodMatch && bodyMatch && headersMatch
+	}
+
+	function getResponseData (data) {
+	  if (Buffer.isBuffer(data)) {
+	    return data
+	  } else if (data instanceof Uint8Array) {
+	    return data
+	  } else if (data instanceof ArrayBuffer) {
+	    return data
+	  } else if (typeof data === 'object') {
+	    return JSON.stringify(data)
+	  } else {
+	    return data.toString()
+	  }
+	}
+
+	function getMockDispatch (mockDispatches, key) {
+	  const basePath = key.query ? buildURL(key.path, key.query) : key.path;
+	  const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath;
+
+	  // Match path
+	  let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath));
+	  if (matchedMockDispatches.length === 0) {
+	    throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)
+	  }
+
+	  // Match method
+	  matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method));
+	  if (matchedMockDispatches.length === 0) {
+	    throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`)
+	  }
+
+	  // Match body
+	  matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true);
+	  if (matchedMockDispatches.length === 0) {
+	    throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`)
+	  }
+
+	  // Match headers
+	  matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers));
+	  if (matchedMockDispatches.length === 0) {
+	    const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers;
+	    throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`)
+	  }
+
+	  return matchedMockDispatches[0]
+	}
+
+	function addMockDispatch (mockDispatches, key, data) {
+	  const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false };
+	  const replyData = typeof data === 'function' ? { callback: data } : { ...data };
+	  const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } };
+	  mockDispatches.push(newMockDispatch);
+	  return newMockDispatch
+	}
+
+	function deleteMockDispatch (mockDispatches, key) {
+	  const index = mockDispatches.findIndex(dispatch => {
+	    if (!dispatch.consumed) {
+	      return false
+	    }
+	    return matchKey(dispatch, key)
+	  });
+	  if (index !== -1) {
+	    mockDispatches.splice(index, 1);
+	  }
+	}
+
+	function buildKey (opts) {
+	  const { path, method, body, headers, query } = opts;
+	  return {
+	    path,
+	    method,
+	    body,
+	    headers,
+	    query
+	  }
+	}
+
+	function generateKeyValues (data) {
+	  const keys = Object.keys(data);
+	  const result = [];
+	  for (let i = 0; i < keys.length; ++i) {
+	    const key = keys[i];
+	    const value = data[key];
+	    const name = Buffer.from(`${key}`);
+	    if (Array.isArray(value)) {
+	      for (let j = 0; j < value.length; ++j) {
+	        result.push(name, Buffer.from(`${value[j]}`));
+	      }
+	    } else {
+	      result.push(name, Buffer.from(`${value}`));
+	    }
+	  }
+	  return result
+	}
+
+	/**
+	 * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
+	 * @param {number} statusCode
+	 */
+	function getStatusText (statusCode) {
+	  return STATUS_CODES[statusCode] || 'unknown'
+	}
+
+	async function getResponse (body) {
+	  const buffers = [];
+	  for await (const data of body) {
+	    buffers.push(data);
+	  }
+	  return Buffer.concat(buffers).toString('utf8')
+	}
+
+	/**
+	 * Mock dispatch function used to simulate undici dispatches
+	 */
+	function mockDispatch (opts, handler) {
+	  // Get mock dispatch from built key
+	  const key = buildKey(opts);
+	  const mockDispatch = getMockDispatch(this[kDispatches], key);
+
+	  mockDispatch.timesInvoked++;
+
+	  // Here's where we resolve a callback if a callback is present for the dispatch data.
+	  if (mockDispatch.data.callback) {
+	    mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) };
+	  }
+
+	  // Parse mockDispatch data
+	  const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch;
+	  const { timesInvoked, times } = mockDispatch;
+
+	  // If it's used up and not persistent, mark as consumed
+	  mockDispatch.consumed = !persist && timesInvoked >= times;
+	  mockDispatch.pending = timesInvoked < times;
+
+	  // If specified, trigger dispatch error
+	  if (error !== null) {
+	    deleteMockDispatch(this[kDispatches], key);
+	    handler.onError(error);
+	    return true
+	  }
+
+	  // Handle the request with a delay if necessary
+	  if (typeof delay === 'number' && delay > 0) {
+	    setTimeout(() => {
+	      handleReply(this[kDispatches]);
+	    }, delay);
+	  } else {
+	    handleReply(this[kDispatches]);
+	  }
+
+	  function handleReply (mockDispatches, _data = data) {
+	    // fetch's HeadersList is a 1D string array
+	    const optsHeaders = Array.isArray(opts.headers)
+	      ? buildHeadersFromArray(opts.headers)
+	      : opts.headers;
+	    const body = typeof _data === 'function'
+	      ? _data({ ...opts, headers: optsHeaders })
+	      : _data;
+
+	    // util.types.isPromise is likely needed for jest.
+	    if (isPromise(body)) {
+	      // If handleReply is asynchronous, throwing an error
+	      // in the callback will reject the promise, rather than
+	      // synchronously throw the error, which breaks some tests.
+	      // Rather, we wait for the callback to resolve if it is a
+	      // promise, and then re-run handleReply with the new body.
+	      body.then((newData) => handleReply(mockDispatches, newData));
+	      return
+	    }
+
+	    const responseData = getResponseData(body);
+	    const responseHeaders = generateKeyValues(headers);
+	    const responseTrailers = generateKeyValues(trailers);
+
+	    handler.onConnect?.(err => handler.onError(err), null);
+	    handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode));
+	    handler.onData?.(Buffer.from(responseData));
+	    handler.onComplete?.(responseTrailers);
+	    deleteMockDispatch(mockDispatches, key);
+	  }
+
+	  function resume () {}
+
+	  return true
+	}
+
+	function buildMockDispatch () {
+	  const agent = this[kMockAgent];
+	  const origin = this[kOrigin];
+	  const originalDispatch = this[kOriginalDispatch];
+
+	  return function dispatch (opts, handler) {
+	    if (agent.isMockActive) {
+	      try {
+	        mockDispatch.call(this, opts, handler);
+	      } catch (error) {
+	        if (error instanceof MockNotMatchedError) {
+	          const netConnect = agent[kGetNetConnect]();
+	          if (netConnect === false) {
+	            throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
+	          }
+	          if (checkNetConnect(netConnect, origin)) {
+	            originalDispatch.call(this, opts, handler);
+	          } else {
+	            throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)
+	          }
+	        } else {
+	          throw error
+	        }
+	      }
+	    } else {
+	      originalDispatch.call(this, opts, handler);
+	    }
+	  }
+	}
+
+	function checkNetConnect (netConnect, origin) {
+	  const url = new URL(origin);
+	  if (netConnect === true) {
+	    return true
+	  } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {
+	    return true
+	  }
+	  return false
+	}
+
+	function buildMockOptions (opts) {
+	  if (opts) {
+	    const { agent, ...mockOptions } = opts;
+	    return mockOptions
+	  }
+	}
+
+	mockUtils = {
+	  getResponseData,
+	  getMockDispatch,
+	  addMockDispatch,
+	  deleteMockDispatch,
+	  buildKey,
+	  generateKeyValues,
+	  matchValue,
+	  getResponse,
+	  getStatusText,
+	  mockDispatch,
+	  buildMockDispatch,
+	  checkNetConnect,
+	  buildMockOptions,
+	  getHeaderByName,
+	  buildHeadersFromArray
+	};
+	return mockUtils;
+}
+
+var mockInterceptor = {};
+
+var hasRequiredMockInterceptor;
+
+function requireMockInterceptor () {
+	if (hasRequiredMockInterceptor) return mockInterceptor;
+	hasRequiredMockInterceptor = 1;
+
+	const { getResponseData, buildKey, addMockDispatch } = requireMockUtils();
+	const {
+	  kDispatches,
+	  kDispatchKey,
+	  kDefaultHeaders,
+	  kDefaultTrailers,
+	  kContentLength,
+	  kMockDispatch
+	} = requireMockSymbols();
+	const { InvalidArgumentError } = requireErrors();
+	const { buildURL } = requireUtil$7();
+
+	/**
+	 * Defines the scope API for an interceptor reply
+	 */
+	class MockScope {
+	  constructor (mockDispatch) {
+	    this[kMockDispatch] = mockDispatch;
+	  }
+
+	  /**
+	   * Delay a reply by a set amount in ms.
+	   */
+	  delay (waitInMs) {
+	    if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {
+	      throw new InvalidArgumentError('waitInMs must be a valid integer > 0')
+	    }
+
+	    this[kMockDispatch].delay = waitInMs;
+	    return this
+	  }
+
+	  /**
+	   * For a defined reply, never mark as consumed.
+	   */
+	  persist () {
+	    this[kMockDispatch].persist = true;
+	    return this
+	  }
+
+	  /**
+	   * Allow one to define a reply for a set amount of matching requests.
+	   */
+	  times (repeatTimes) {
+	    if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {
+	      throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')
+	    }
+
+	    this[kMockDispatch].times = repeatTimes;
+	    return this
+	  }
+	}
+
+	/**
+	 * Defines an interceptor for a Mock
+	 */
+	class MockInterceptor {
+	  constructor (opts, mockDispatches) {
+	    if (typeof opts !== 'object') {
+	      throw new InvalidArgumentError('opts must be an object')
+	    }
+	    if (typeof opts.path === 'undefined') {
+	      throw new InvalidArgumentError('opts.path must be defined')
+	    }
+	    if (typeof opts.method === 'undefined') {
+	      opts.method = 'GET';
+	    }
+	    // See https://github.com/nodejs/undici/issues/1245
+	    // As per RFC 3986, clients are not supposed to send URI
+	    // fragments to servers when they retrieve a document,
+	    if (typeof opts.path === 'string') {
+	      if (opts.query) {
+	        opts.path = buildURL(opts.path, opts.query);
+	      } else {
+	        // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811
+	        const parsedURL = new URL(opts.path, 'data://');
+	        opts.path = parsedURL.pathname + parsedURL.search;
+	      }
+	    }
+	    if (typeof opts.method === 'string') {
+	      opts.method = opts.method.toUpperCase();
+	    }
+
+	    this[kDispatchKey] = buildKey(opts);
+	    this[kDispatches] = mockDispatches;
+	    this[kDefaultHeaders] = {};
+	    this[kDefaultTrailers] = {};
+	    this[kContentLength] = false;
+	  }
+
+	  createMockScopeDispatchData ({ statusCode, data, responseOptions }) {
+	    const responseData = getResponseData(data);
+	    const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {};
+	    const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers };
+	    const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers };
+
+	    return { statusCode, data, headers, trailers }
+	  }
+
+	  validateReplyParameters (replyParameters) {
+	    if (typeof replyParameters.statusCode === 'undefined') {
+	      throw new InvalidArgumentError('statusCode must be defined')
+	    }
+	    if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) {
+	      throw new InvalidArgumentError('responseOptions must be an object')
+	    }
+	  }
+
+	  /**
+	   * Mock an undici request with a defined reply.
+	   */
+	  reply (replyOptionsCallbackOrStatusCode) {
+	    // Values of reply aren't available right now as they
+	    // can only be available when the reply callback is invoked.
+	    if (typeof replyOptionsCallbackOrStatusCode === 'function') {
+	      // We'll first wrap the provided callback in another function,
+	      // this function will properly resolve the data from the callback
+	      // when invoked.
+	      const wrappedDefaultsCallback = (opts) => {
+	        // Our reply options callback contains the parameter for statusCode, data and options.
+	        const resolvedData = replyOptionsCallbackOrStatusCode(opts);
+
+	        // Check if it is in the right format
+	        if (typeof resolvedData !== 'object' || resolvedData === null) {
+	          throw new InvalidArgumentError('reply options callback must return an object')
+	        }
+
+	        const replyParameters = { data: '', responseOptions: {}, ...resolvedData };
+	        this.validateReplyParameters(replyParameters);
+	        // Since the values can be obtained immediately we return them
+	        // from this higher order function that will be resolved later.
+	        return {
+	          ...this.createMockScopeDispatchData(replyParameters)
+	        }
+	      };
+
+	      // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.
+	      const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback);
+	      return new MockScope(newMockDispatch)
+	    }
+
+	    // We can have either one or three parameters, if we get here,
+	    // we should have 1-3 parameters. So we spread the arguments of
+	    // this function to obtain the parameters, since replyData will always
+	    // just be the statusCode.
+	    const replyParameters = {
+	      statusCode: replyOptionsCallbackOrStatusCode,
+	      data: arguments[1] === undefined ? '' : arguments[1],
+	      responseOptions: arguments[2] === undefined ? {} : arguments[2]
+	    };
+	    this.validateReplyParameters(replyParameters);
+
+	    // Send in-already provided data like usual
+	    const dispatchData = this.createMockScopeDispatchData(replyParameters);
+	    const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData);
+	    return new MockScope(newMockDispatch)
+	  }
+
+	  /**
+	   * Mock an undici request with a defined error.
+	   */
+	  replyWithError (error) {
+	    if (typeof error === 'undefined') {
+	      throw new InvalidArgumentError('error must be defined')
+	    }
+
+	    const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error });
+	    return new MockScope(newMockDispatch)
+	  }
+
+	  /**
+	   * Set default reply headers on the interceptor for subsequent replies
+	   */
+	  defaultReplyHeaders (headers) {
+	    if (typeof headers === 'undefined') {
+	      throw new InvalidArgumentError('headers must be defined')
+	    }
+
+	    this[kDefaultHeaders] = headers;
+	    return this
+	  }
+
+	  /**
+	   * Set default reply trailers on the interceptor for subsequent replies
+	   */
+	  defaultReplyTrailers (trailers) {
+	    if (typeof trailers === 'undefined') {
+	      throw new InvalidArgumentError('trailers must be defined')
+	    }
+
+	    this[kDefaultTrailers] = trailers;
+	    return this
+	  }
+
+	  /**
+	   * Set reply content length header for replies on the interceptor
+	   */
+	  replyContentLength () {
+	    this[kContentLength] = true;
+	    return this
+	  }
+	}
+
+	mockInterceptor.MockInterceptor = MockInterceptor;
+	mockInterceptor.MockScope = MockScope;
+	return mockInterceptor;
+}
+
+var mockClient;
+var hasRequiredMockClient;
+
+function requireMockClient () {
+	if (hasRequiredMockClient) return mockClient;
+	hasRequiredMockClient = 1;
+
+	const { promisify } = require$$0$a;
+	const Client = requireClient();
+	const { buildMockDispatch } = requireMockUtils();
+	const {
+	  kDispatches,
+	  kMockAgent,
+	  kClose,
+	  kOriginalClose,
+	  kOrigin,
+	  kOriginalDispatch,
+	  kConnected
+	} = requireMockSymbols();
+	const { MockInterceptor } = requireMockInterceptor();
+	const Symbols = requireSymbols$4();
+	const { InvalidArgumentError } = requireErrors();
+
+	/**
+	 * MockClient provides an API that extends the Client to influence the mockDispatches.
+	 */
+	class MockClient extends Client {
+	  constructor (origin, opts) {
+	    super(origin, opts);
+
+	    if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {
+	      throw new InvalidArgumentError('Argument opts.agent must implement Agent')
+	    }
+
+	    this[kMockAgent] = opts.agent;
+	    this[kOrigin] = origin;
+	    this[kDispatches] = [];
+	    this[kConnected] = 1;
+	    this[kOriginalDispatch] = this.dispatch;
+	    this[kOriginalClose] = this.close.bind(this);
+
+	    this.dispatch = buildMockDispatch.call(this);
+	    this.close = this[kClose];
+	  }
+
+	  get [Symbols.kConnected] () {
+	    return this[kConnected]
+	  }
+
+	  /**
+	   * Sets up the base interceptor for mocking replies from undici.
+	   */
+	  intercept (opts) {
+	    return new MockInterceptor(opts, this[kDispatches])
+	  }
+
+	  async [kClose] () {
+	    await promisify(this[kOriginalClose])();
+	    this[kConnected] = 0;
+	    this[kMockAgent][Symbols.kClients].delete(this[kOrigin]);
+	  }
+	}
+
+	mockClient = MockClient;
+	return mockClient;
+}
+
+var mockPool;
+var hasRequiredMockPool;
+
+function requireMockPool () {
+	if (hasRequiredMockPool) return mockPool;
+	hasRequiredMockPool = 1;
+
+	const { promisify } = require$$0$a;
+	const Pool = requirePool();
+	const { buildMockDispatch } = requireMockUtils();
+	const {
+	  kDispatches,
+	  kMockAgent,
+	  kClose,
+	  kOriginalClose,
+	  kOrigin,
+	  kOriginalDispatch,
+	  kConnected
+	} = requireMockSymbols();
+	const { MockInterceptor } = requireMockInterceptor();
+	const Symbols = requireSymbols$4();
+	const { InvalidArgumentError } = requireErrors();
+
+	/**
+	 * MockPool provides an API that extends the Pool to influence the mockDispatches.
+	 */
+	class MockPool extends Pool {
+	  constructor (origin, opts) {
+	    super(origin, opts);
+
+	    if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {
+	      throw new InvalidArgumentError('Argument opts.agent must implement Agent')
+	    }
+
+	    this[kMockAgent] = opts.agent;
+	    this[kOrigin] = origin;
+	    this[kDispatches] = [];
+	    this[kConnected] = 1;
+	    this[kOriginalDispatch] = this.dispatch;
+	    this[kOriginalClose] = this.close.bind(this);
+
+	    this.dispatch = buildMockDispatch.call(this);
+	    this.close = this[kClose];
+	  }
+
+	  get [Symbols.kConnected] () {
+	    return this[kConnected]
+	  }
+
+	  /**
+	   * Sets up the base interceptor for mocking replies from undici.
+	   */
+	  intercept (opts) {
+	    return new MockInterceptor(opts, this[kDispatches])
+	  }
+
+	  async [kClose] () {
+	    await promisify(this[kOriginalClose])();
+	    this[kConnected] = 0;
+	    this[kMockAgent][Symbols.kClients].delete(this[kOrigin]);
+	  }
+	}
+
+	mockPool = MockPool;
+	return mockPool;
+}
+
+var pluralizer;
+var hasRequiredPluralizer;
+
+function requirePluralizer () {
+	if (hasRequiredPluralizer) return pluralizer;
+	hasRequiredPluralizer = 1;
+
+	const singulars = {
+	  pronoun: 'it',
+	  is: 'is',
+	  was: 'was',
+	  this: 'this'
+	};
+
+	const plurals = {
+	  pronoun: 'they',
+	  is: 'are',
+	  was: 'were',
+	  this: 'these'
+	};
+
+	pluralizer = class Pluralizer {
+	  constructor (singular, plural) {
+	    this.singular = singular;
+	    this.plural = plural;
+	  }
+
+	  pluralize (count) {
+	    const one = count === 1;
+	    const keys = one ? singulars : plurals;
+	    const noun = one ? this.singular : this.plural;
+	    return { ...keys, count, noun }
+	  }
+	};
+	return pluralizer;
+}
+
+var pendingInterceptorsFormatter;
+var hasRequiredPendingInterceptorsFormatter;
+
+function requirePendingInterceptorsFormatter () {
+	if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter;
+	hasRequiredPendingInterceptorsFormatter = 1;
+
+	const { Transform } = require$$0$8;
+	const { Console } = require$$1$5;
+
+	const PERSISTENT = process.versions.icu ? '✅' : 'Y ';
+	const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N ';
+
+	/**
+	 * Gets the output of `console.table(…)` as a string.
+	 */
+	pendingInterceptorsFormatter = class PendingInterceptorsFormatter {
+	  constructor ({ disableColors } = {}) {
+	    this.transform = new Transform({
+	      transform (chunk, _enc, cb) {
+	        cb(null, chunk);
+	      }
+	    });
+
+	    this.logger = new Console({
+	      stdout: this.transform,
+	      inspectOptions: {
+	        colors: !disableColors && !process.env.CI
+	      }
+	    });
+	  }
+
+	  format (pendingInterceptors) {
+	    const withPrettyHeaders = pendingInterceptors.map(
+	      ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({
+	        Method: method,
+	        Origin: origin,
+	        Path: path,
+	        'Status code': statusCode,
+	        Persistent: persist ? PERSISTENT : NOT_PERSISTENT,
+	        Invocations: timesInvoked,
+	        Remaining: persist ? Infinity : times - timesInvoked
+	      }));
+
+	    this.logger.table(withPrettyHeaders);
+	    return this.transform.read().toString()
+	  }
+	};
+	return pendingInterceptorsFormatter;
+}
+
+var mockAgent;
+var hasRequiredMockAgent;
+
+function requireMockAgent () {
+	if (hasRequiredMockAgent) return mockAgent;
+	hasRequiredMockAgent = 1;
+
+	const { kClients } = requireSymbols$4();
+	const Agent = requireAgent();
+	const {
+	  kAgent,
+	  kMockAgentSet,
+	  kMockAgentGet,
+	  kDispatches,
+	  kIsMockActive,
+	  kNetConnect,
+	  kGetNetConnect,
+	  kOptions,
+	  kFactory
+	} = requireMockSymbols();
+	const MockClient = requireMockClient();
+	const MockPool = requireMockPool();
+	const { matchValue, buildMockOptions } = requireMockUtils();
+	const { InvalidArgumentError, UndiciError } = requireErrors();
+	const Dispatcher = requireDispatcher();
+	const Pluralizer = requirePluralizer();
+	const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter();
+
+	class MockAgent extends Dispatcher {
+	  constructor (opts) {
+	    super(opts);
+
+	    this[kNetConnect] = true;
+	    this[kIsMockActive] = true;
+
+	    // Instantiate Agent and encapsulate
+	    if ((opts?.agent && typeof opts.agent.dispatch !== 'function')) {
+	      throw new InvalidArgumentError('Argument opts.agent must implement Agent')
+	    }
+	    const agent = opts?.agent ? opts.agent : new Agent(opts);
+	    this[kAgent] = agent;
+
+	    this[kClients] = agent[kClients];
+	    this[kOptions] = buildMockOptions(opts);
+	  }
+
+	  get (origin) {
+	    let dispatcher = this[kMockAgentGet](origin);
+
+	    if (!dispatcher) {
+	      dispatcher = this[kFactory](origin);
+	      this[kMockAgentSet](origin, dispatcher);
+	    }
+	    return dispatcher
+	  }
+
+	  dispatch (opts, handler) {
+	    // Call MockAgent.get to perform additional setup before dispatching as normal
+	    this.get(opts.origin);
+	    return this[kAgent].dispatch(opts, handler)
+	  }
+
+	  async close () {
+	    await this[kAgent].close();
+	    this[kClients].clear();
+	  }
+
+	  deactivate () {
+	    this[kIsMockActive] = false;
+	  }
+
+	  activate () {
+	    this[kIsMockActive] = true;
+	  }
+
+	  enableNetConnect (matcher) {
+	    if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {
+	      if (Array.isArray(this[kNetConnect])) {
+	        this[kNetConnect].push(matcher);
+	      } else {
+	        this[kNetConnect] = [matcher];
+	      }
+	    } else if (typeof matcher === 'undefined') {
+	      this[kNetConnect] = true;
+	    } else {
+	      throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')
+	    }
+	  }
+
+	  disableNetConnect () {
+	    this[kNetConnect] = false;
+	  }
+
+	  // This is required to bypass issues caused by using global symbols - see:
+	  // https://github.com/nodejs/undici/issues/1447
+	  get isMockActive () {
+	    return this[kIsMockActive]
+	  }
+
+	  [kMockAgentSet] (origin, dispatcher) {
+	    this[kClients].set(origin, dispatcher);
+	  }
+
+	  [kFactory] (origin) {
+	    const mockOptions = Object.assign({ agent: this }, this[kOptions]);
+	    return this[kOptions] && this[kOptions].connections === 1
+	      ? new MockClient(origin, mockOptions)
+	      : new MockPool(origin, mockOptions)
+	  }
+
+	  [kMockAgentGet] (origin) {
+	    // First check if we can immediately find it
+	    const client = this[kClients].get(origin);
+	    if (client) {
+	      return client
+	    }
+
+	    // If the origin is not a string create a dummy parent pool and return to user
+	    if (typeof origin !== 'string') {
+	      const dispatcher = this[kFactory]('http://localhost:9999');
+	      this[kMockAgentSet](origin, dispatcher);
+	      return dispatcher
+	    }
+
+	    // If we match, create a pool and assign the same dispatches
+	    for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) {
+	      if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {
+	        const dispatcher = this[kFactory](origin);
+	        this[kMockAgentSet](origin, dispatcher);
+	        dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches];
+	        return dispatcher
+	      }
+	    }
+	  }
+
+	  [kGetNetConnect] () {
+	    return this[kNetConnect]
+	  }
+
+	  pendingInterceptors () {
+	    const mockAgentClients = this[kClients];
+
+	    return Array.from(mockAgentClients.entries())
+	      .flatMap(([origin, scope]) => scope[kDispatches].map(dispatch => ({ ...dispatch, origin })))
+	      .filter(({ pending }) => pending)
+	  }
+
+	  assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {
+	    const pending = this.pendingInterceptors();
+
+	    if (pending.length === 0) {
+	      return
+	    }
+
+	    const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length);
+
+	    throw new UndiciError(`
+${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending:
+
+${pendingInterceptorsFormatter.format(pending)}
+`.trim())
+	  }
+	}
+
+	mockAgent = MockAgent;
+	return mockAgent;
+}
+
+var global$1;
+var hasRequiredGlobal;
+
+function requireGlobal () {
+	if (hasRequiredGlobal) return global$1;
+	hasRequiredGlobal = 1;
+
+	// We include a version number for the Dispatcher API. In case of breaking changes,
+	// this version number must be increased to avoid conflicts.
+	const globalDispatcher = Symbol.for('undici.globalDispatcher.1');
+	const { InvalidArgumentError } = requireErrors();
+	const Agent = requireAgent();
+
+	if (getGlobalDispatcher() === undefined) {
+	  setGlobalDispatcher(new Agent());
+	}
+
+	function setGlobalDispatcher (agent) {
+	  if (!agent || typeof agent.dispatch !== 'function') {
+	    throw new InvalidArgumentError('Argument agent must implement Agent')
+	  }
+	  Object.defineProperty(globalThis, globalDispatcher, {
+	    value: agent,
+	    writable: true,
+	    enumerable: false,
+	    configurable: false
+	  });
+	}
+
+	function getGlobalDispatcher () {
+	  return globalThis[globalDispatcher]
+	}
+
+	global$1 = {
+	  setGlobalDispatcher,
+	  getGlobalDispatcher
+	};
+	return global$1;
+}
+
+var decoratorHandler;
+var hasRequiredDecoratorHandler;
+
+function requireDecoratorHandler () {
+	if (hasRequiredDecoratorHandler) return decoratorHandler;
+	hasRequiredDecoratorHandler = 1;
+
+	decoratorHandler = class DecoratorHandler {
+	  #handler
+
+	  constructor (handler) {
+	    if (typeof handler !== 'object' || handler === null) {
+	      throw new TypeError('handler must be an object')
+	    }
+	    this.#handler = handler;
+	  }
+
+	  onConnect (...args) {
+	    return this.#handler.onConnect?.(...args)
+	  }
+
+	  onError (...args) {
+	    return this.#handler.onError?.(...args)
+	  }
+
+	  onUpgrade (...args) {
+	    return this.#handler.onUpgrade?.(...args)
+	  }
+
+	  onResponseStarted (...args) {
+	    return this.#handler.onResponseStarted?.(...args)
+	  }
+
+	  onHeaders (...args) {
+	    return this.#handler.onHeaders?.(...args)
+	  }
+
+	  onData (...args) {
+	    return this.#handler.onData?.(...args)
+	  }
+
+	  onComplete (...args) {
+	    return this.#handler.onComplete?.(...args)
+	  }
+
+	  onBodySent (...args) {
+	    return this.#handler.onBodySent?.(...args)
+	  }
+	};
+	return decoratorHandler;
+}
+
+var redirect;
+var hasRequiredRedirect;
+
+function requireRedirect () {
+	if (hasRequiredRedirect) return redirect;
+	hasRequiredRedirect = 1;
+	const RedirectHandler = requireRedirectHandler();
+
+	redirect = opts => {
+	  const globalMaxRedirections = opts?.maxRedirections;
+	  return dispatch => {
+	    return function redirectInterceptor (opts, handler) {
+	      const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts;
+
+	      if (!maxRedirections) {
+	        return dispatch(opts, handler)
+	      }
+
+	      const redirectHandler = new RedirectHandler(
+	        dispatch,
+	        maxRedirections,
+	        opts,
+	        handler
+	      );
+
+	      return dispatch(baseOpts, redirectHandler)
+	    }
+	  }
+	};
+	return redirect;
+}
+
+var retry;
+var hasRequiredRetry;
+
+function requireRetry () {
+	if (hasRequiredRetry) return retry;
+	hasRequiredRetry = 1;
+	const RetryHandler = requireRetryHandler();
+
+	retry = globalOpts => {
+	  return dispatch => {
+	    return function retryInterceptor (opts, handler) {
+	      return dispatch(
+	        opts,
+	        new RetryHandler(
+	          { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } },
+	          {
+	            handler,
+	            dispatch
+	          }
+	        )
+	      )
+	    }
+	  }
+	};
+	return retry;
+}
+
+var dump;
+var hasRequiredDump;
+
+function requireDump () {
+	if (hasRequiredDump) return dump;
+	hasRequiredDump = 1;
+
+	const util = requireUtil$7();
+	const { InvalidArgumentError, RequestAbortedError } = requireErrors();
+	const DecoratorHandler = requireDecoratorHandler();
+
+	class DumpHandler extends DecoratorHandler {
+	  #maxSize = 1024 * 1024
+	  #abort = null
+	  #dumped = false
+	  #aborted = false
+	  #size = 0
+	  #reason = null
+	  #handler = null
+
+	  constructor ({ maxSize }, handler) {
+	    super(handler);
+
+	    if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) {
+	      throw new InvalidArgumentError('maxSize must be a number greater than 0')
+	    }
+
+	    this.#maxSize = maxSize ?? this.#maxSize;
+	    this.#handler = handler;
+	  }
+
+	  onConnect (abort) {
+	    this.#abort = abort;
+
+	    this.#handler.onConnect(this.#customAbort.bind(this));
+	  }
+
+	  #customAbort (reason) {
+	    this.#aborted = true;
+	    this.#reason = reason;
+	  }
+
+	  // TODO: will require adjustment after new hooks are out
+	  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
+	    const headers = util.parseHeaders(rawHeaders);
+	    const contentLength = headers['content-length'];
+
+	    if (contentLength != null && contentLength > this.#maxSize) {
+	      throw new RequestAbortedError(
+	        `Response size (${contentLength}) larger than maxSize (${
+	          this.#maxSize
+	        })`
+	      )
+	    }
+
+	    if (this.#aborted) {
+	      return true
+	    }
+
+	    return this.#handler.onHeaders(
+	      statusCode,
+	      rawHeaders,
+	      resume,
+	      statusMessage
+	    )
+	  }
+
+	  onError (err) {
+	    if (this.#dumped) {
+	      return
+	    }
+
+	    err = this.#reason ?? err;
+
+	    this.#handler.onError(err);
+	  }
+
+	  onData (chunk) {
+	    this.#size = this.#size + chunk.length;
+
+	    if (this.#size >= this.#maxSize) {
+	      this.#dumped = true;
+
+	      if (this.#aborted) {
+	        this.#handler.onError(this.#reason);
+	      } else {
+	        this.#handler.onComplete([]);
+	      }
+	    }
+
+	    return true
+	  }
+
+	  onComplete (trailers) {
+	    if (this.#dumped) {
+	      return
+	    }
+
+	    if (this.#aborted) {
+	      this.#handler.onError(this.reason);
+	      return
+	    }
+
+	    this.#handler.onComplete(trailers);
+	  }
+	}
+
+	function createDumpInterceptor (
+	  { maxSize: defaultMaxSize } = {
+	    maxSize: 1024 * 1024
+	  }
+	) {
+	  return dispatch => {
+	    return function Intercept (opts, handler) {
+	      const { dumpMaxSize = defaultMaxSize } =
+	        opts;
+
+	      const dumpHandler = new DumpHandler(
+	        { maxSize: dumpMaxSize },
+	        handler
+	      );
+
+	      return dispatch(opts, dumpHandler)
+	    }
+	  }
+	}
+
+	dump = createDumpInterceptor;
+	return dump;
+}
+
+var dns;
+var hasRequiredDns;
+
+function requireDns () {
+	if (hasRequiredDns) return dns;
+	hasRequiredDns = 1;
+	const { isIP } = require$$0$9;
+	const { lookup } = require$$1$6;
+	const DecoratorHandler = requireDecoratorHandler();
+	const { InvalidArgumentError, InformationalError } = requireErrors();
+	const maxInt = Math.pow(2, 31) - 1;
+
+	class DNSInstance {
+	  #maxTTL = 0
+	  #maxItems = 0
+	  #records = new Map()
+	  dualStack = true
+	  affinity = null
+	  lookup = null
+	  pick = null
+
+	  constructor (opts) {
+	    this.#maxTTL = opts.maxTTL;
+	    this.#maxItems = opts.maxItems;
+	    this.dualStack = opts.dualStack;
+	    this.affinity = opts.affinity;
+	    this.lookup = opts.lookup ?? this.#defaultLookup;
+	    this.pick = opts.pick ?? this.#defaultPick;
+	  }
+
+	  get full () {
+	    return this.#records.size === this.#maxItems
+	  }
+
+	  runLookup (origin, opts, cb) {
+	    const ips = this.#records.get(origin.hostname);
+
+	    // If full, we just return the origin
+	    if (ips == null && this.full) {
+	      cb(null, origin.origin);
+	      return
+	    }
+
+	    const newOpts = {
+	      affinity: this.affinity,
+	      dualStack: this.dualStack,
+	      lookup: this.lookup,
+	      pick: this.pick,
+	      ...opts.dns,
+	      maxTTL: this.#maxTTL,
+	      maxItems: this.#maxItems
+	    };
+
+	    // If no IPs we lookup
+	    if (ips == null) {
+	      this.lookup(origin, newOpts, (err, addresses) => {
+	        if (err || addresses == null || addresses.length === 0) {
+	          cb(err ?? new InformationalError('No DNS entries found'));
+	          return
+	        }
+
+	        this.setRecords(origin, addresses);
+	        const records = this.#records.get(origin.hostname);
+
+	        const ip = this.pick(
+	          origin,
+	          records,
+	          newOpts.affinity
+	        );
+
+	        let port;
+	        if (typeof ip.port === 'number') {
+	          port = `:${ip.port}`;
+	        } else if (origin.port !== '') {
+	          port = `:${origin.port}`;
+	        } else {
+	          port = '';
+	        }
+
+	        cb(
+	          null,
+	          `${origin.protocol}//${
+	            ip.family === 6 ? `[${ip.address}]` : ip.address
+	          }${port}`
+	        );
+	      });
+	    } else {
+	      // If there's IPs we pick
+	      const ip = this.pick(
+	        origin,
+	        ips,
+	        newOpts.affinity
+	      );
+
+	      // If no IPs we lookup - deleting old records
+	      if (ip == null) {
+	        this.#records.delete(origin.hostname);
+	        this.runLookup(origin, opts, cb);
+	        return
+	      }
+
+	      let port;
+	      if (typeof ip.port === 'number') {
+	        port = `:${ip.port}`;
+	      } else if (origin.port !== '') {
+	        port = `:${origin.port}`;
+	      } else {
+	        port = '';
+	      }
+
+	      cb(
+	        null,
+	        `${origin.protocol}//${
+	          ip.family === 6 ? `[${ip.address}]` : ip.address
+	        }${port}`
+	      );
+	    }
+	  }
+
+	  #defaultLookup (origin, opts, cb) {
+	    lookup(
+	      origin.hostname,
+	      {
+	        all: true,
+	        family: this.dualStack === false ? this.affinity : 0,
+	        order: 'ipv4first'
+	      },
+	      (err, addresses) => {
+	        if (err) {
+	          return cb(err)
+	        }
+
+	        const results = new Map();
+
+	        for (const addr of addresses) {
+	          // On linux we found duplicates, we attempt to remove them with
+	          // the latest record
+	          results.set(`${addr.address}:${addr.family}`, addr);
+	        }
+
+	        cb(null, results.values());
+	      }
+	    );
+	  }
+
+	  #defaultPick (origin, hostnameRecords, affinity) {
+	    let ip = null;
+	    const { records, offset } = hostnameRecords;
+
+	    let family;
+	    if (this.dualStack) {
+	      if (affinity == null) {
+	        // Balance between ip families
+	        if (offset == null || offset === maxInt) {
+	          hostnameRecords.offset = 0;
+	          affinity = 4;
+	        } else {
+	          hostnameRecords.offset++;
+	          affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4;
+	        }
+	      }
+
+	      if (records[affinity] != null && records[affinity].ips.length > 0) {
+	        family = records[affinity];
+	      } else {
+	        family = records[affinity === 4 ? 6 : 4];
+	      }
+	    } else {
+	      family = records[affinity];
+	    }
+
+	    // If no IPs we return null
+	    if (family == null || family.ips.length === 0) {
+	      return ip
+	    }
+
+	    if (family.offset == null || family.offset === maxInt) {
+	      family.offset = 0;
+	    } else {
+	      family.offset++;
+	    }
+
+	    const position = family.offset % family.ips.length;
+	    ip = family.ips[position] ?? null;
+
+	    if (ip == null) {
+	      return ip
+	    }
+
+	    if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms
+	      // We delete expired records
+	      // It is possible that they have different TTL, so we manage them individually
+	      family.ips.splice(position, 1);
+	      return this.pick(origin, hostnameRecords, affinity)
+	    }
+
+	    return ip
+	  }
+
+	  setRecords (origin, addresses) {
+	    const timestamp = Date.now();
+	    const records = { records: { 4: null, 6: null } };
+	    for (const record of addresses) {
+	      record.timestamp = timestamp;
+	      if (typeof record.ttl === 'number') {
+	        // The record TTL is expected to be in ms
+	        record.ttl = Math.min(record.ttl, this.#maxTTL);
+	      } else {
+	        record.ttl = this.#maxTTL;
+	      }
+
+	      const familyRecords = records.records[record.family] ?? { ips: [] };
+
+	      familyRecords.ips.push(record);
+	      records.records[record.family] = familyRecords;
+	    }
+
+	    this.#records.set(origin.hostname, records);
+	  }
+
+	  getHandler (meta, opts) {
+	    return new DNSDispatchHandler(this, meta, opts)
+	  }
+	}
+
+	class DNSDispatchHandler extends DecoratorHandler {
+	  #state = null
+	  #opts = null
+	  #dispatch = null
+	  #handler = null
+	  #origin = null
+
+	  constructor (state, { origin, handler, dispatch }, opts) {
+	    super(handler);
+	    this.#origin = origin;
+	    this.#handler = handler;
+	    this.#opts = { ...opts };
+	    this.#state = state;
+	    this.#dispatch = dispatch;
+	  }
+
+	  onError (err) {
+	    switch (err.code) {
+	      case 'ETIMEDOUT':
+	      case 'ECONNREFUSED': {
+	        if (this.#state.dualStack) {
+	          // We delete the record and retry
+	          this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => {
+	            if (err) {
+	              return this.#handler.onError(err)
+	            }
+
+	            const dispatchOpts = {
+	              ...this.#opts,
+	              origin: newOrigin
+	            };
+
+	            this.#dispatch(dispatchOpts, this);
+	          });
+
+	          // if dual-stack disabled, we error out
+	          return
+	        }
+
+	        this.#handler.onError(err);
+	        return
+	      }
+	      case 'ENOTFOUND':
+	        this.#state.deleteRecord(this.#origin);
+	      // eslint-disable-next-line no-fallthrough
+	      default:
+	        this.#handler.onError(err);
+	        break
+	    }
+	  }
+	}
+
+	dns = interceptorOpts => {
+	  if (
+	    interceptorOpts?.maxTTL != null &&
+	    (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0)
+	  ) {
+	    throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number')
+	  }
+
+	  if (
+	    interceptorOpts?.maxItems != null &&
+	    (typeof interceptorOpts?.maxItems !== 'number' ||
+	      interceptorOpts?.maxItems < 1)
+	  ) {
+	    throw new InvalidArgumentError(
+	      'Invalid maxItems. Must be a positive number and greater than zero'
+	    )
+	  }
+
+	  if (
+	    interceptorOpts?.affinity != null &&
+	    interceptorOpts?.affinity !== 4 &&
+	    interceptorOpts?.affinity !== 6
+	  ) {
+	    throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6')
+	  }
+
+	  if (
+	    interceptorOpts?.dualStack != null &&
+	    typeof interceptorOpts?.dualStack !== 'boolean'
+	  ) {
+	    throw new InvalidArgumentError('Invalid dualStack. Must be a boolean')
+	  }
+
+	  if (
+	    interceptorOpts?.lookup != null &&
+	    typeof interceptorOpts?.lookup !== 'function'
+	  ) {
+	    throw new InvalidArgumentError('Invalid lookup. Must be a function')
+	  }
+
+	  if (
+	    interceptorOpts?.pick != null &&
+	    typeof interceptorOpts?.pick !== 'function'
+	  ) {
+	    throw new InvalidArgumentError('Invalid pick. Must be a function')
+	  }
+
+	  const dualStack = interceptorOpts?.dualStack ?? true;
+	  let affinity;
+	  if (dualStack) {
+	    affinity = interceptorOpts?.affinity ?? null;
+	  } else {
+	    affinity = interceptorOpts?.affinity ?? 4;
+	  }
+
+	  const opts = {
+	    maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms
+	    lookup: interceptorOpts?.lookup ?? null,
+	    pick: interceptorOpts?.pick ?? null,
+	    dualStack,
+	    affinity,
+	    maxItems: interceptorOpts?.maxItems ?? Infinity
+	  };
+
+	  const instance = new DNSInstance(opts);
+
+	  return dispatch => {
+	    return function dnsInterceptor (origDispatchOpts, handler) {
+	      const origin =
+	        origDispatchOpts.origin.constructor === URL
+	          ? origDispatchOpts.origin
+	          : new URL(origDispatchOpts.origin);
+
+	      if (isIP(origin.hostname) !== 0) {
+	        return dispatch(origDispatchOpts, handler)
+	      }
+
+	      instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => {
+	        if (err) {
+	          return handler.onError(err)
+	        }
+
+	        let dispatchOpts = null;
+	        dispatchOpts = {
+	          ...origDispatchOpts,
+	          servername: origin.hostname, // For SNI on TLS
+	          origin: newOrigin,
+	          headers: {
+	            host: origin.hostname,
+	            ...origDispatchOpts.headers
+	          }
+	        };
+
+	        dispatch(
+	          dispatchOpts,
+	          instance.getHandler({ origin, dispatch, handler }, origDispatchOpts)
+	        );
+	      });
+
+	      return true
+	    }
+	  }
+	};
+	return dns;
+}
+
+var headers;
+var hasRequiredHeaders;
+
+function requireHeaders () {
+	if (hasRequiredHeaders) return headers;
+	hasRequiredHeaders = 1;
+
+	const { kConstruct } = requireSymbols$4();
+	const { kEnumerableProperty } = requireUtil$7();
+	const {
+	  iteratorMixin,
+	  isValidHeaderName,
+	  isValidHeaderValue
+	} = requireUtil$6();
+	const { webidl } = requireWebidl();
+	const assert = require$$0$7;
+	const util = require$$0$a;
+
+	const kHeadersMap = Symbol('headers map');
+	const kHeadersSortedMap = Symbol('headers map sorted');
+
+	/**
+	 * @param {number} code
+	 */
+	function isHTTPWhiteSpaceCharCode (code) {
+	  return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize
+	 * @param {string} potentialValue
+	 */
+	function headerValueNormalize (potentialValue) {
+	  //  To normalize a byte sequence potentialValue, remove
+	  //  any leading and trailing HTTP whitespace bytes from
+	  //  potentialValue.
+	  let i = 0; let j = potentialValue.length;
+
+	  while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j;
+	  while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i;
+
+	  return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)
+	}
+
+	function fill (headers, object) {
+	  // To fill a Headers object headers with a given object object, run these steps:
+
+	  // 1. If object is a sequence, then for each header in object:
+	  // Note: webidl conversion to array has already been done.
+	  if (Array.isArray(object)) {
+	    for (let i = 0; i < object.length; ++i) {
+	      const header = object[i];
+	      // 1. If header does not contain exactly two items, then throw a TypeError.
+	      if (header.length !== 2) {
+	        throw webidl.errors.exception({
+	          header: 'Headers constructor',
+	          message: `expected name/value pair to be length 2, found ${header.length}.`
+	        })
+	      }
+
+	      // 2. Append (header’s first item, header’s second item) to headers.
+	      appendHeader(headers, header[0], header[1]);
+	    }
+	  } else if (typeof object === 'object' && object !== null) {
+	    // Note: null should throw
+
+	    // 2. Otherwise, object is a record, then for each key → value in object,
+	    //    append (key, value) to headers
+	    const keys = Object.keys(object);
+	    for (let i = 0; i < keys.length; ++i) {
+	      appendHeader(headers, keys[i], object[keys[i]]);
+	    }
+	  } else {
+	    throw webidl.errors.conversionFailed({
+	      prefix: 'Headers constructor',
+	      argument: 'Argument 1',
+	      types: ['sequence>', 'record']
+	    })
+	  }
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#concept-headers-append
+	 */
+	function appendHeader (headers, name, value) {
+	  // 1. Normalize value.
+	  value = headerValueNormalize(value);
+
+	  // 2. If name is not a header name or value is not a
+	  //    header value, then throw a TypeError.
+	  if (!isValidHeaderName(name)) {
+	    throw webidl.errors.invalidArgument({
+	      prefix: 'Headers.append',
+	      value: name,
+	      type: 'header name'
+	    })
+	  } else if (!isValidHeaderValue(value)) {
+	    throw webidl.errors.invalidArgument({
+	      prefix: 'Headers.append',
+	      value,
+	      type: 'header value'
+	    })
+	  }
+
+	  // 3. If headers’s guard is "immutable", then throw a TypeError.
+	  // 4. Otherwise, if headers’s guard is "request" and name is a
+	  //    forbidden header name, return.
+	  // 5. Otherwise, if headers’s guard is "request-no-cors":
+	  //    TODO
+	  // Note: undici does not implement forbidden header names
+	  if (getHeadersGuard(headers) === 'immutable') {
+	    throw new TypeError('immutable')
+	  }
+
+	  // 6. Otherwise, if headers’s guard is "response" and name is a
+	  //    forbidden response-header name, return.
+
+	  // 7. Append (name, value) to headers’s header list.
+	  return getHeadersList(headers).append(name, value, false)
+
+	  // 8. If headers’s guard is "request-no-cors", then remove
+	  //    privileged no-CORS request headers from headers
+	}
+
+	function compareHeaderName (a, b) {
+	  return a[0] < b[0] ? -1 : 1
+	}
+
+	class HeadersList {
+	  /** @type {[string, string][]|null} */
+	  cookies = null
+
+	  constructor (init) {
+	    if (init instanceof HeadersList) {
+	      this[kHeadersMap] = new Map(init[kHeadersMap]);
+	      this[kHeadersSortedMap] = init[kHeadersSortedMap];
+	      this.cookies = init.cookies === null ? null : [...init.cookies];
+	    } else {
+	      this[kHeadersMap] = new Map(init);
+	      this[kHeadersSortedMap] = null;
+	    }
+	  }
+
+	  /**
+	   * @see https://fetch.spec.whatwg.org/#header-list-contains
+	   * @param {string} name
+	   * @param {boolean} isLowerCase
+	   */
+	  contains (name, isLowerCase) {
+	    // A header list list contains a header name name if list
+	    // contains a header whose name is a byte-case-insensitive
+	    // match for name.
+
+	    return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase())
+	  }
+
+	  clear () {
+	    this[kHeadersMap].clear();
+	    this[kHeadersSortedMap] = null;
+	    this.cookies = null;
+	  }
+
+	  /**
+	   * @see https://fetch.spec.whatwg.org/#concept-header-list-append
+	   * @param {string} name
+	   * @param {string} value
+	   * @param {boolean} isLowerCase
+	   */
+	  append (name, value, isLowerCase) {
+	    this[kHeadersSortedMap] = null;
+
+	    // 1. If list contains name, then set name to the first such
+	    //    header’s name.
+	    const lowercaseName = isLowerCase ? name : name.toLowerCase();
+	    const exists = this[kHeadersMap].get(lowercaseName);
+
+	    // 2. Append (name, value) to list.
+	    if (exists) {
+	      const delimiter = lowercaseName === 'cookie' ? '; ' : ', ';
+	      this[kHeadersMap].set(lowercaseName, {
+	        name: exists.name,
+	        value: `${exists.value}${delimiter}${value}`
+	      });
+	    } else {
+	      this[kHeadersMap].set(lowercaseName, { name, value });
+	    }
+
+	    if (lowercaseName === 'set-cookie') {
+	      (this.cookies ??= []).push(value);
+	    }
+	  }
+
+	  /**
+	   * @see https://fetch.spec.whatwg.org/#concept-header-list-set
+	   * @param {string} name
+	   * @param {string} value
+	   * @param {boolean} isLowerCase
+	   */
+	  set (name, value, isLowerCase) {
+	    this[kHeadersSortedMap] = null;
+	    const lowercaseName = isLowerCase ? name : name.toLowerCase();
+
+	    if (lowercaseName === 'set-cookie') {
+	      this.cookies = [value];
+	    }
+
+	    // 1. If list contains name, then set the value of
+	    //    the first such header to value and remove the
+	    //    others.
+	    // 2. Otherwise, append header (name, value) to list.
+	    this[kHeadersMap].set(lowercaseName, { name, value });
+	  }
+
+	  /**
+	   * @see https://fetch.spec.whatwg.org/#concept-header-list-delete
+	   * @param {string} name
+	   * @param {boolean} isLowerCase
+	   */
+	  delete (name, isLowerCase) {
+	    this[kHeadersSortedMap] = null;
+	    if (!isLowerCase) name = name.toLowerCase();
+
+	    if (name === 'set-cookie') {
+	      this.cookies = null;
+	    }
+
+	    this[kHeadersMap].delete(name);
+	  }
+
+	  /**
+	   * @see https://fetch.spec.whatwg.org/#concept-header-list-get
+	   * @param {string} name
+	   * @param {boolean} isLowerCase
+	   * @returns {string | null}
+	   */
+	  get (name, isLowerCase) {
+	    // 1. If list does not contain name, then return null.
+	    // 2. Return the values of all headers in list whose name
+	    //    is a byte-case-insensitive match for name,
+	    //    separated from each other by 0x2C 0x20, in order.
+	    return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null
+	  }
+
+	  * [Symbol.iterator] () {
+	    // use the lowercased name
+	    for (const { 0: name, 1: { value } } of this[kHeadersMap]) {
+	      yield [name, value];
+	    }
+	  }
+
+	  get entries () {
+	    const headers = {};
+
+	    if (this[kHeadersMap].size !== 0) {
+	      for (const { name, value } of this[kHeadersMap].values()) {
+	        headers[name] = value;
+	      }
+	    }
+
+	    return headers
+	  }
+
+	  rawValues () {
+	    return this[kHeadersMap].values()
+	  }
+
+	  get entriesList () {
+	    const headers = [];
+
+	    if (this[kHeadersMap].size !== 0) {
+	      for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) {
+	        if (lowerName === 'set-cookie') {
+	          for (const cookie of this.cookies) {
+	            headers.push([name, cookie]);
+	          }
+	        } else {
+	          headers.push([name, value]);
+	        }
+	      }
+	    }
+
+	    return headers
+	  }
+
+	  // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set
+	  toSortedArray () {
+	    const size = this[kHeadersMap].size;
+	    const array = new Array(size);
+	    // In most cases, you will use the fast-path.
+	    // fast-path: Use binary insertion sort for small arrays.
+	    if (size <= 32) {
+	      if (size === 0) {
+	        // If empty, it is an empty array. To avoid the first index assignment.
+	        return array
+	      }
+	      // Improve performance by unrolling loop and avoiding double-loop.
+	      // Double-loop-less version of the binary insertion sort.
+	      const iterator = this[kHeadersMap][Symbol.iterator]();
+	      const firstValue = iterator.next().value;
+	      // set [name, value] to first index.
+	      array[0] = [firstValue[0], firstValue[1].value];
+	      // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
+	      // 3.2.2. Assert: value is non-null.
+	      assert(firstValue[1].value !== null);
+	      for (
+	        let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value;
+	        i < size;
+	        ++i
+	      ) {
+	        // get next value
+	        value = iterator.next().value;
+	        // set [name, value] to current index.
+	        x = array[i] = [value[0], value[1].value];
+	        // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
+	        // 3.2.2. Assert: value is non-null.
+	        assert(x[1] !== null);
+	        left = 0;
+	        right = i;
+	        // binary search
+	        while (left < right) {
+	          // middle index
+	          pivot = left + ((right - left) >> 1);
+	          // compare header name
+	          if (array[pivot][0] <= x[0]) {
+	            left = pivot + 1;
+	          } else {
+	            right = pivot;
+	          }
+	        }
+	        if (i !== pivot) {
+	          j = i;
+	          while (j > left) {
+	            array[j] = array[--j];
+	          }
+	          array[left] = x;
+	        }
+	      }
+	      /* c8 ignore next 4 */
+	      if (!iterator.next().done) {
+	        // This is for debugging and will never be called.
+	        throw new TypeError('Unreachable')
+	      }
+	      return array
+	    } else {
+	      // This case would be a rare occurrence.
+	      // slow-path: fallback
+	      let i = 0;
+	      for (const { 0: name, 1: { value } } of this[kHeadersMap]) {
+	        array[i++] = [name, value];
+	        // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
+	        // 3.2.2. Assert: value is non-null.
+	        assert(value !== null);
+	      }
+	      return array.sort(compareHeaderName)
+	    }
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#headers-class
+	class Headers {
+	  #guard
+	  #headersList
+
+	  constructor (init = undefined) {
+	    webidl.util.markAsUncloneable(this);
+
+	    if (init === kConstruct) {
+	      return
+	    }
+
+	    this.#headersList = new HeadersList();
+
+	    // The new Headers(init) constructor steps are:
+
+	    // 1. Set this’s guard to "none".
+	    this.#guard = 'none';
+
+	    // 2. If init is given, then fill this with init.
+	    if (init !== undefined) {
+	      init = webidl.converters.HeadersInit(init, 'Headers contructor', 'init');
+	      fill(this, init);
+	    }
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-headers-append
+	  append (name, value) {
+	    webidl.brandCheck(this, Headers);
+
+	    webidl.argumentLengthCheck(arguments, 2, 'Headers.append');
+
+	    const prefix = 'Headers.append';
+	    name = webidl.converters.ByteString(name, prefix, 'name');
+	    value = webidl.converters.ByteString(value, prefix, 'value');
+
+	    return appendHeader(this, name, value)
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-headers-delete
+	  delete (name) {
+	    webidl.brandCheck(this, Headers);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'Headers.delete');
+
+	    const prefix = 'Headers.delete';
+	    name = webidl.converters.ByteString(name, prefix, 'name');
+
+	    // 1. If name is not a header name, then throw a TypeError.
+	    if (!isValidHeaderName(name)) {
+	      throw webidl.errors.invalidArgument({
+	        prefix: 'Headers.delete',
+	        value: name,
+	        type: 'header name'
+	      })
+	    }
+
+	    // 2. If this’s guard is "immutable", then throw a TypeError.
+	    // 3. Otherwise, if this’s guard is "request" and name is a
+	    //    forbidden header name, return.
+	    // 4. Otherwise, if this’s guard is "request-no-cors", name
+	    //    is not a no-CORS-safelisted request-header name, and
+	    //    name is not a privileged no-CORS request-header name,
+	    //    return.
+	    // 5. Otherwise, if this’s guard is "response" and name is
+	    //    a forbidden response-header name, return.
+	    // Note: undici does not implement forbidden header names
+	    if (this.#guard === 'immutable') {
+	      throw new TypeError('immutable')
+	    }
+
+	    // 6. If this’s header list does not contain name, then
+	    //    return.
+	    if (!this.#headersList.contains(name, false)) {
+	      return
+	    }
+
+	    // 7. Delete name from this’s header list.
+	    // 8. If this’s guard is "request-no-cors", then remove
+	    //    privileged no-CORS request headers from this.
+	    this.#headersList.delete(name, false);
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-headers-get
+	  get (name) {
+	    webidl.brandCheck(this, Headers);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'Headers.get');
+
+	    const prefix = 'Headers.get';
+	    name = webidl.converters.ByteString(name, prefix, 'name');
+
+	    // 1. If name is not a header name, then throw a TypeError.
+	    if (!isValidHeaderName(name)) {
+	      throw webidl.errors.invalidArgument({
+	        prefix,
+	        value: name,
+	        type: 'header name'
+	      })
+	    }
+
+	    // 2. Return the result of getting name from this’s header
+	    //    list.
+	    return this.#headersList.get(name, false)
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-headers-has
+	  has (name) {
+	    webidl.brandCheck(this, Headers);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'Headers.has');
+
+	    const prefix = 'Headers.has';
+	    name = webidl.converters.ByteString(name, prefix, 'name');
+
+	    // 1. If name is not a header name, then throw a TypeError.
+	    if (!isValidHeaderName(name)) {
+	      throw webidl.errors.invalidArgument({
+	        prefix,
+	        value: name,
+	        type: 'header name'
+	      })
+	    }
+
+	    // 2. Return true if this’s header list contains name;
+	    //    otherwise false.
+	    return this.#headersList.contains(name, false)
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-headers-set
+	  set (name, value) {
+	    webidl.brandCheck(this, Headers);
+
+	    webidl.argumentLengthCheck(arguments, 2, 'Headers.set');
+
+	    const prefix = 'Headers.set';
+	    name = webidl.converters.ByteString(name, prefix, 'name');
+	    value = webidl.converters.ByteString(value, prefix, 'value');
+
+	    // 1. Normalize value.
+	    value = headerValueNormalize(value);
+
+	    // 2. If name is not a header name or value is not a
+	    //    header value, then throw a TypeError.
+	    if (!isValidHeaderName(name)) {
+	      throw webidl.errors.invalidArgument({
+	        prefix,
+	        value: name,
+	        type: 'header name'
+	      })
+	    } else if (!isValidHeaderValue(value)) {
+	      throw webidl.errors.invalidArgument({
+	        prefix,
+	        value,
+	        type: 'header value'
+	      })
+	    }
+
+	    // 3. If this’s guard is "immutable", then throw a TypeError.
+	    // 4. Otherwise, if this’s guard is "request" and name is a
+	    //    forbidden header name, return.
+	    // 5. Otherwise, if this’s guard is "request-no-cors" and
+	    //    name/value is not a no-CORS-safelisted request-header,
+	    //    return.
+	    // 6. Otherwise, if this’s guard is "response" and name is a
+	    //    forbidden response-header name, return.
+	    // Note: undici does not implement forbidden header names
+	    if (this.#guard === 'immutable') {
+	      throw new TypeError('immutable')
+	    }
+
+	    // 7. Set (name, value) in this’s header list.
+	    // 8. If this’s guard is "request-no-cors", then remove
+	    //    privileged no-CORS request headers from this
+	    this.#headersList.set(name, value, false);
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
+	  getSetCookie () {
+	    webidl.brandCheck(this, Headers);
+
+	    // 1. If this’s header list does not contain `Set-Cookie`, then return « ».
+	    // 2. Return the values of all headers in this’s header list whose name is
+	    //    a byte-case-insensitive match for `Set-Cookie`, in order.
+
+	    const list = this.#headersList.cookies;
+
+	    if (list) {
+	      return [...list]
+	    }
+
+	    return []
+	  }
+
+	  // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
+	  get [kHeadersSortedMap] () {
+	    if (this.#headersList[kHeadersSortedMap]) {
+	      return this.#headersList[kHeadersSortedMap]
+	    }
+
+	    // 1. Let headers be an empty list of headers with the key being the name
+	    //    and value the value.
+	    const headers = [];
+
+	    // 2. Let names be the result of convert header names to a sorted-lowercase
+	    //    set with all the names of the headers in list.
+	    const names = this.#headersList.toSortedArray();
+
+	    const cookies = this.#headersList.cookies;
+
+	    // fast-path
+	    if (cookies === null || cookies.length === 1) {
+	      // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray`
+	      return (this.#headersList[kHeadersSortedMap] = names)
+	    }
+
+	    // 3. For each name of names:
+	    for (let i = 0; i < names.length; ++i) {
+	      const { 0: name, 1: value } = names[i];
+	      // 1. If name is `set-cookie`, then:
+	      if (name === 'set-cookie') {
+	        // 1. Let values be a list of all values of headers in list whose name
+	        //    is a byte-case-insensitive match for name, in order.
+
+	        // 2. For each value of values:
+	        // 1. Append (name, value) to headers.
+	        for (let j = 0; j < cookies.length; ++j) {
+	          headers.push([name, cookies[j]]);
+	        }
+	      } else {
+	        // 2. Otherwise:
+
+	        // 1. Let value be the result of getting name from list.
+
+	        // 2. Assert: value is non-null.
+	        // Note: This operation was done by `HeadersList#toSortedArray`.
+
+	        // 3. Append (name, value) to headers.
+	        headers.push([name, value]);
+	      }
+	    }
+
+	    // 4. Return headers.
+	    return (this.#headersList[kHeadersSortedMap] = headers)
+	  }
+
+	  [util.inspect.custom] (depth, options) {
+	    options.depth ??= depth;
+
+	    return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}`
+	  }
+
+	  static getHeadersGuard (o) {
+	    return o.#guard
+	  }
+
+	  static setHeadersGuard (o, guard) {
+	    o.#guard = guard;
+	  }
+
+	  static getHeadersList (o) {
+	    return o.#headersList
+	  }
+
+	  static setHeadersList (o, list) {
+	    o.#headersList = list;
+	  }
+	}
+
+	const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers;
+	Reflect.deleteProperty(Headers, 'getHeadersGuard');
+	Reflect.deleteProperty(Headers, 'setHeadersGuard');
+	Reflect.deleteProperty(Headers, 'getHeadersList');
+	Reflect.deleteProperty(Headers, 'setHeadersList');
+
+	iteratorMixin('Headers', Headers, kHeadersSortedMap, 0, 1);
+
+	Object.defineProperties(Headers.prototype, {
+	  append: kEnumerableProperty,
+	  delete: kEnumerableProperty,
+	  get: kEnumerableProperty,
+	  has: kEnumerableProperty,
+	  set: kEnumerableProperty,
+	  getSetCookie: kEnumerableProperty,
+	  [Symbol.toStringTag]: {
+	    value: 'Headers',
+	    configurable: true
+	  },
+	  [util.inspect.custom]: {
+	    enumerable: false
+	  }
+	});
+
+	webidl.converters.HeadersInit = function (V, prefix, argument) {
+	  if (webidl.util.Type(V) === 'Object') {
+	    const iterator = Reflect.get(V, Symbol.iterator);
+
+	    // A work-around to ensure we send the properly-cased Headers when V is a Headers object.
+	    // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please.
+	    if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object
+	      try {
+	        return getHeadersList(V).entriesList
+	      } catch {
+	        // fall-through
+	      }
+	    }
+
+	    if (typeof iterator === 'function') {
+	      return webidl.converters['sequence>'](V, prefix, argument, iterator.bind(V))
+	    }
+
+	    return webidl.converters['record'](V, prefix, argument)
+	  }
+
+	  throw webidl.errors.conversionFailed({
+	    prefix: 'Headers constructor',
+	    argument: 'Argument 1',
+	    types: ['sequence>', 'record']
+	  })
+	};
+
+	headers = {
+	  fill,
+	  // for test.
+	  compareHeaderName,
+	  Headers,
+	  HeadersList,
+	  getHeadersGuard,
+	  setHeadersGuard,
+	  setHeadersList,
+	  getHeadersList
+	};
+	return headers;
+}
+
+var response;
+var hasRequiredResponse;
+
+function requireResponse () {
+	if (hasRequiredResponse) return response;
+	hasRequiredResponse = 1;
+
+	const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = requireHeaders();
+	const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = requireBody();
+	const util = requireUtil$7();
+	const nodeUtil = require$$0$a;
+	const { kEnumerableProperty } = util;
+	const {
+	  isValidReasonPhrase,
+	  isCancelled,
+	  isAborted,
+	  isBlobLike,
+	  serializeJavascriptValueToJSONString,
+	  isErrorLike,
+	  isomorphicEncode,
+	  environmentSettingsObject: relevantRealm
+	} = requireUtil$6();
+	const {
+	  redirectStatusSet,
+	  nullBodyStatus
+	} = requireConstants$3();
+	const { kState, kHeaders } = requireSymbols$3();
+	const { webidl } = requireWebidl();
+	const { FormData } = requireFormdata();
+	const { URLSerializer } = requireDataUrl();
+	const { kConstruct } = requireSymbols$4();
+	const assert = require$$0$7;
+	const { types } = require$$0$a;
+
+	const textEncoder = new TextEncoder('utf-8');
+
+	// https://fetch.spec.whatwg.org/#response-class
+	class Response {
+	  // Creates network error Response.
+	  static error () {
+	    // The static error() method steps are to return the result of creating a
+	    // Response object, given a new network error, "immutable", and this’s
+	    // relevant Realm.
+	    const responseObject = fromInnerResponse(makeNetworkError(), 'immutable');
+
+	    return responseObject
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-response-json
+	  static json (data, init = {}) {
+	    webidl.argumentLengthCheck(arguments, 1, 'Response.json');
+
+	    if (init !== null) {
+	      init = webidl.converters.ResponseInit(init);
+	    }
+
+	    // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.
+	    const bytes = textEncoder.encode(
+	      serializeJavascriptValueToJSONString(data)
+	    );
+
+	    // 2. Let body be the result of extracting bytes.
+	    const body = extractBody(bytes);
+
+	    // 3. Let responseObject be the result of creating a Response object, given a new response,
+	    //    "response", and this’s relevant Realm.
+	    const responseObject = fromInnerResponse(makeResponse({}), 'response');
+
+	    // 4. Perform initialize a response given responseObject, init, and (body, "application/json").
+	    initializeResponse(responseObject, init, { body: body[0], type: 'application/json' });
+
+	    // 5. Return responseObject.
+	    return responseObject
+	  }
+
+	  // Creates a redirect Response that redirects to url with status status.
+	  static redirect (url, status = 302) {
+	    webidl.argumentLengthCheck(arguments, 1, 'Response.redirect');
+
+	    url = webidl.converters.USVString(url);
+	    status = webidl.converters['unsigned short'](status);
+
+	    // 1. Let parsedURL be the result of parsing url with current settings
+	    // object’s API base URL.
+	    // 2. If parsedURL is failure, then throw a TypeError.
+	    // TODO: base-URL?
+	    let parsedURL;
+	    try {
+	      parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl);
+	    } catch (err) {
+	      throw new TypeError(`Failed to parse URL from ${url}`, { cause: err })
+	    }
+
+	    // 3. If status is not a redirect status, then throw a RangeError.
+	    if (!redirectStatusSet.has(status)) {
+	      throw new RangeError(`Invalid status code ${status}`)
+	    }
+
+	    // 4. Let responseObject be the result of creating a Response object,
+	    // given a new response, "immutable", and this’s relevant Realm.
+	    const responseObject = fromInnerResponse(makeResponse({}), 'immutable');
+
+	    // 5. Set responseObject’s response’s status to status.
+	    responseObject[kState].status = status;
+
+	    // 6. Let value be parsedURL, serialized and isomorphic encoded.
+	    const value = isomorphicEncode(URLSerializer(parsedURL));
+
+	    // 7. Append `Location`/value to responseObject’s response’s header list.
+	    responseObject[kState].headersList.append('location', value, true);
+
+	    // 8. Return responseObject.
+	    return responseObject
+	  }
+
+	  // https://fetch.spec.whatwg.org/#dom-response
+	  constructor (body = null, init = {}) {
+	    webidl.util.markAsUncloneable(this);
+	    if (body === kConstruct) {
+	      return
+	    }
+
+	    if (body !== null) {
+	      body = webidl.converters.BodyInit(body);
+	    }
+
+	    init = webidl.converters.ResponseInit(init);
+
+	    // 1. Set this’s response to a new response.
+	    this[kState] = makeResponse({});
+
+	    // 2. Set this’s headers to a new Headers object with this’s relevant
+	    // Realm, whose header list is this’s response’s header list and guard
+	    // is "response".
+	    this[kHeaders] = new Headers(kConstruct);
+	    setHeadersGuard(this[kHeaders], 'response');
+	    setHeadersList(this[kHeaders], this[kState].headersList);
+
+	    // 3. Let bodyWithType be null.
+	    let bodyWithType = null;
+
+	    // 4. If body is non-null, then set bodyWithType to the result of extracting body.
+	    if (body != null) {
+	      const [extractedBody, type] = extractBody(body);
+	      bodyWithType = { body: extractedBody, type };
+	    }
+
+	    // 5. Perform initialize a response given this, init, and bodyWithType.
+	    initializeResponse(this, init, bodyWithType);
+	  }
+
+	  // Returns response’s type, e.g., "cors".
+	  get type () {
+	    webidl.brandCheck(this, Response);
+
+	    // The type getter steps are to return this’s response’s type.
+	    return this[kState].type
+	  }
+
+	  // Returns response’s URL, if it has one; otherwise the empty string.
+	  get url () {
+	    webidl.brandCheck(this, Response);
+
+	    const urlList = this[kState].urlList;
+
+	    // The url getter steps are to return the empty string if this’s
+	    // response’s URL is null; otherwise this’s response’s URL,
+	    // serialized with exclude fragment set to true.
+	    const url = urlList[urlList.length - 1] ?? null;
+
+	    if (url === null) {
+	      return ''
+	    }
+
+	    return URLSerializer(url, true)
+	  }
+
+	  // Returns whether response was obtained through a redirect.
+	  get redirected () {
+	    webidl.brandCheck(this, Response);
+
+	    // The redirected getter steps are to return true if this’s response’s URL
+	    // list has more than one item; otherwise false.
+	    return this[kState].urlList.length > 1
+	  }
+
+	  // Returns response’s status.
+	  get status () {
+	    webidl.brandCheck(this, Response);
+
+	    // The status getter steps are to return this’s response’s status.
+	    return this[kState].status
+	  }
+
+	  // Returns whether response’s status is an ok status.
+	  get ok () {
+	    webidl.brandCheck(this, Response);
+
+	    // The ok getter steps are to return true if this’s response’s status is an
+	    // ok status; otherwise false.
+	    return this[kState].status >= 200 && this[kState].status <= 299
+	  }
+
+	  // Returns response’s status message.
+	  get statusText () {
+	    webidl.brandCheck(this, Response);
+
+	    // The statusText getter steps are to return this’s response’s status
+	    // message.
+	    return this[kState].statusText
+	  }
+
+	  // Returns response’s headers as Headers.
+	  get headers () {
+	    webidl.brandCheck(this, Response);
+
+	    // The headers getter steps are to return this’s headers.
+	    return this[kHeaders]
+	  }
+
+	  get body () {
+	    webidl.brandCheck(this, Response);
+
+	    return this[kState].body ? this[kState].body.stream : null
+	  }
+
+	  get bodyUsed () {
+	    webidl.brandCheck(this, Response);
+
+	    return !!this[kState].body && util.isDisturbed(this[kState].body.stream)
+	  }
+
+	  // Returns a clone of response.
+	  clone () {
+	    webidl.brandCheck(this, Response);
+
+	    // 1. If this is unusable, then throw a TypeError.
+	    if (bodyUnusable(this)) {
+	      throw webidl.errors.exception({
+	        header: 'Response.clone',
+	        message: 'Body has already been consumed.'
+	      })
+	    }
+
+	    // 2. Let clonedResponse be the result of cloning this’s response.
+	    const clonedResponse = cloneResponse(this[kState]);
+
+	    // Note: To re-register because of a new stream.
+	    if (hasFinalizationRegistry && this[kState].body?.stream) {
+	      streamRegistry.register(this, new WeakRef(this[kState].body.stream));
+	    }
+
+	    // 3. Return the result of creating a Response object, given
+	    // clonedResponse, this’s headers’s guard, and this’s relevant Realm.
+	    return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders]))
+	  }
+
+	  [nodeUtil.inspect.custom] (depth, options) {
+	    if (options.depth === null) {
+	      options.depth = 2;
+	    }
+
+	    options.colors ??= true;
+
+	    const properties = {
+	      status: this.status,
+	      statusText: this.statusText,
+	      headers: this.headers,
+	      body: this.body,
+	      bodyUsed: this.bodyUsed,
+	      ok: this.ok,
+	      redirected: this.redirected,
+	      type: this.type,
+	      url: this.url
+	    };
+
+	    return `Response ${nodeUtil.formatWithOptions(options, properties)}`
+	  }
+	}
+
+	mixinBody(Response);
+
+	Object.defineProperties(Response.prototype, {
+	  type: kEnumerableProperty,
+	  url: kEnumerableProperty,
+	  status: kEnumerableProperty,
+	  ok: kEnumerableProperty,
+	  redirected: kEnumerableProperty,
+	  statusText: kEnumerableProperty,
+	  headers: kEnumerableProperty,
+	  clone: kEnumerableProperty,
+	  body: kEnumerableProperty,
+	  bodyUsed: kEnumerableProperty,
+	  [Symbol.toStringTag]: {
+	    value: 'Response',
+	    configurable: true
+	  }
+	});
+
+	Object.defineProperties(Response, {
+	  json: kEnumerableProperty,
+	  redirect: kEnumerableProperty,
+	  error: kEnumerableProperty
+	});
+
+	// https://fetch.spec.whatwg.org/#concept-response-clone
+	function cloneResponse (response) {
+	  // To clone a response response, run these steps:
+
+	  // 1. If response is a filtered response, then return a new identical
+	  // filtered response whose internal response is a clone of response’s
+	  // internal response.
+	  if (response.internalResponse) {
+	    return filterResponse(
+	      cloneResponse(response.internalResponse),
+	      response.type
+	    )
+	  }
+
+	  // 2. Let newResponse be a copy of response, except for its body.
+	  const newResponse = makeResponse({ ...response, body: null });
+
+	  // 3. If response’s body is non-null, then set newResponse’s body to the
+	  // result of cloning response’s body.
+	  if (response.body != null) {
+	    newResponse.body = cloneBody(newResponse, response.body);
+	  }
+
+	  // 4. Return newResponse.
+	  return newResponse
+	}
+
+	function makeResponse (init) {
+	  return {
+	    aborted: false,
+	    rangeRequested: false,
+	    timingAllowPassed: false,
+	    requestIncludesCredentials: false,
+	    type: 'default',
+	    status: 200,
+	    timingInfo: null,
+	    cacheState: '',
+	    statusText: '',
+	    ...init,
+	    headersList: init?.headersList
+	      ? new HeadersList(init?.headersList)
+	      : new HeadersList(),
+	    urlList: init?.urlList ? [...init.urlList] : []
+	  }
+	}
+
+	function makeNetworkError (reason) {
+	  const isError = isErrorLike(reason);
+	  return makeResponse({
+	    type: 'error',
+	    status: 0,
+	    error: isError
+	      ? reason
+	      : new Error(reason ? String(reason) : reason),
+	    aborted: reason && reason.name === 'AbortError'
+	  })
+	}
+
+	// @see https://fetch.spec.whatwg.org/#concept-network-error
+	function isNetworkError (response) {
+	  return (
+	    // A network error is a response whose type is "error",
+	    response.type === 'error' &&
+	    // status is 0
+	    response.status === 0
+	  )
+	}
+
+	function makeFilteredResponse (response, state) {
+	  state = {
+	    internalResponse: response,
+	    ...state
+	  };
+
+	  return new Proxy(response, {
+	    get (target, p) {
+	      return p in state ? state[p] : target[p]
+	    },
+	    set (target, p, value) {
+	      assert(!(p in state));
+	      target[p] = value;
+	      return true
+	    }
+	  })
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-filtered-response
+	function filterResponse (response, type) {
+	  // Set response to the following filtered response with response as its
+	  // internal response, depending on request’s response tainting:
+	  if (type === 'basic') {
+	    // A basic filtered response is a filtered response whose type is "basic"
+	    // and header list excludes any headers in internal response’s header list
+	    // whose name is a forbidden response-header name.
+
+	    // Note: undici does not implement forbidden response-header names
+	    return makeFilteredResponse(response, {
+	      type: 'basic',
+	      headersList: response.headersList
+	    })
+	  } else if (type === 'cors') {
+	    // A CORS filtered response is a filtered response whose type is "cors"
+	    // and header list excludes any headers in internal response’s header
+	    // list whose name is not a CORS-safelisted response-header name, given
+	    // internal response’s CORS-exposed header-name list.
+
+	    // Note: undici does not implement CORS-safelisted response-header names
+	    return makeFilteredResponse(response, {
+	      type: 'cors',
+	      headersList: response.headersList
+	    })
+	  } else if (type === 'opaque') {
+	    // An opaque filtered response is a filtered response whose type is
+	    // "opaque", URL list is the empty list, status is 0, status message
+	    // is the empty byte sequence, header list is empty, and body is null.
+
+	    return makeFilteredResponse(response, {
+	      type: 'opaque',
+	      urlList: Object.freeze([]),
+	      status: 0,
+	      statusText: '',
+	      body: null
+	    })
+	  } else if (type === 'opaqueredirect') {
+	    // An opaque-redirect filtered response is a filtered response whose type
+	    // is "opaqueredirect", status is 0, status message is the empty byte
+	    // sequence, header list is empty, and body is null.
+
+	    return makeFilteredResponse(response, {
+	      type: 'opaqueredirect',
+	      status: 0,
+	      statusText: '',
+	      headersList: [],
+	      body: null
+	    })
+	  } else {
+	    assert(false);
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#appropriate-network-error
+	function makeAppropriateNetworkError (fetchParams, err = null) {
+	  // 1. Assert: fetchParams is canceled.
+	  assert(isCancelled(fetchParams));
+
+	  // 2. Return an aborted network error if fetchParams is aborted;
+	  // otherwise return a network error.
+	  return isAborted(fetchParams)
+	    ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))
+	    : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))
+	}
+
+	// https://whatpr.org/fetch/1392.html#initialize-a-response
+	function initializeResponse (response, init, body) {
+	  // 1. If init["status"] is not in the range 200 to 599, inclusive, then
+	  //    throw a RangeError.
+	  if (init.status !== null && (init.status < 200 || init.status > 599)) {
+	    throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.')
+	  }
+
+	  // 2. If init["statusText"] does not match the reason-phrase token production,
+	  //    then throw a TypeError.
+	  if ('statusText' in init && init.statusText != null) {
+	    // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:
+	    //   reason-phrase  = *( HTAB / SP / VCHAR / obs-text )
+	    if (!isValidReasonPhrase(String(init.statusText))) {
+	      throw new TypeError('Invalid statusText')
+	    }
+	  }
+
+	  // 3. Set response’s response’s status to init["status"].
+	  if ('status' in init && init.status != null) {
+	    response[kState].status = init.status;
+	  }
+
+	  // 4. Set response’s response’s status message to init["statusText"].
+	  if ('statusText' in init && init.statusText != null) {
+	    response[kState].statusText = init.statusText;
+	  }
+
+	  // 5. If init["headers"] exists, then fill response’s headers with init["headers"].
+	  if ('headers' in init && init.headers != null) {
+	    fill(response[kHeaders], init.headers);
+	  }
+
+	  // 6. If body was given, then:
+	  if (body) {
+	    // 1. If response's status is a null body status, then throw a TypeError.
+	    if (nullBodyStatus.includes(response.status)) {
+	      throw webidl.errors.exception({
+	        header: 'Response constructor',
+	        message: `Invalid response status code ${response.status}`
+	      })
+	    }
+
+	    // 2. Set response's body to body's body.
+	    response[kState].body = body.body;
+
+	    // 3. If body's type is non-null and response's header list does not contain
+	    //    `Content-Type`, then append (`Content-Type`, body's type) to response's header list.
+	    if (body.type != null && !response[kState].headersList.contains('content-type', true)) {
+	      response[kState].headersList.append('content-type', body.type, true);
+	    }
+	  }
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#response-create
+	 * @param {any} innerResponse
+	 * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard
+	 * @returns {Response}
+	 */
+	function fromInnerResponse (innerResponse, guard) {
+	  const response = new Response(kConstruct);
+	  response[kState] = innerResponse;
+	  response[kHeaders] = new Headers(kConstruct);
+	  setHeadersList(response[kHeaders], innerResponse.headersList);
+	  setHeadersGuard(response[kHeaders], guard);
+
+	  if (hasFinalizationRegistry && innerResponse.body?.stream) {
+	    // If the target (response) is reclaimed, the cleanup callback may be called at some point with
+	    // the held value provided for it (innerResponse.body.stream). The held value can be any value:
+	    // a primitive or an object, even undefined. If the held value is an object, the registry keeps
+	    // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from
+	    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry
+	    streamRegistry.register(response, new WeakRef(innerResponse.body.stream));
+	  }
+
+	  return response
+	}
+
+	webidl.converters.ReadableStream = webidl.interfaceConverter(
+	  ReadableStream
+	);
+
+	webidl.converters.FormData = webidl.interfaceConverter(
+	  FormData
+	);
+
+	webidl.converters.URLSearchParams = webidl.interfaceConverter(
+	  URLSearchParams
+	);
+
+	// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit
+	webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {
+	  if (typeof V === 'string') {
+	    return webidl.converters.USVString(V, prefix, name)
+	  }
+
+	  if (isBlobLike(V)) {
+	    return webidl.converters.Blob(V, prefix, name, { strict: false })
+	  }
+
+	  if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) {
+	    return webidl.converters.BufferSource(V, prefix, name)
+	  }
+
+	  if (util.isFormDataLike(V)) {
+	    return webidl.converters.FormData(V, prefix, name, { strict: false })
+	  }
+
+	  if (V instanceof URLSearchParams) {
+	    return webidl.converters.URLSearchParams(V, prefix, name)
+	  }
+
+	  return webidl.converters.DOMString(V, prefix, name)
+	};
+
+	// https://fetch.spec.whatwg.org/#bodyinit
+	webidl.converters.BodyInit = function (V, prefix, argument) {
+	  if (V instanceof ReadableStream) {
+	    return webidl.converters.ReadableStream(V, prefix, argument)
+	  }
+
+	  // Note: the spec doesn't include async iterables,
+	  // this is an undici extension.
+	  if (V?.[Symbol.asyncIterator]) {
+	    return V
+	  }
+
+	  return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument)
+	};
+
+	webidl.converters.ResponseInit = webidl.dictionaryConverter([
+	  {
+	    key: 'status',
+	    converter: webidl.converters['unsigned short'],
+	    defaultValue: () => 200
+	  },
+	  {
+	    key: 'statusText',
+	    converter: webidl.converters.ByteString,
+	    defaultValue: () => ''
+	  },
+	  {
+	    key: 'headers',
+	    converter: webidl.converters.HeadersInit
+	  }
+	]);
+
+	response = {
+	  isNetworkError,
+	  makeNetworkError,
+	  makeResponse,
+	  makeAppropriateNetworkError,
+	  filterResponse,
+	  Response,
+	  cloneResponse,
+	  fromInnerResponse
+	};
+	return response;
+}
+
+var dispatcherWeakref;
+var hasRequiredDispatcherWeakref;
+
+function requireDispatcherWeakref () {
+	if (hasRequiredDispatcherWeakref) return dispatcherWeakref;
+	hasRequiredDispatcherWeakref = 1;
+
+	const { kConnected, kSize } = requireSymbols$4();
+
+	class CompatWeakRef {
+	  constructor (value) {
+	    this.value = value;
+	  }
+
+	  deref () {
+	    return this.value[kConnected] === 0 && this.value[kSize] === 0
+	      ? undefined
+	      : this.value
+	  }
+	}
+
+	class CompatFinalizer {
+	  constructor (finalizer) {
+	    this.finalizer = finalizer;
+	  }
+
+	  register (dispatcher, key) {
+	    if (dispatcher.on) {
+	      dispatcher.on('disconnect', () => {
+	        if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) {
+	          this.finalizer(key);
+	        }
+	      });
+	    }
+	  }
+
+	  unregister (key) {}
+	}
+
+	dispatcherWeakref = function () {
+	  // FIXME: remove workaround when the Node bug is backported to v18
+	  // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308
+	  if (process.env.NODE_V8_COVERAGE && process.version.startsWith('v18')) {
+	    process._rawDebug('Using compatibility WeakRef and FinalizationRegistry');
+	    return {
+	      WeakRef: CompatWeakRef,
+	      FinalizationRegistry: CompatFinalizer
+	    }
+	  }
+	  return { WeakRef, FinalizationRegistry }
+	};
+	return dispatcherWeakref;
+}
+
+/* globals AbortController */
+
+var request$1;
+var hasRequiredRequest;
+
+function requireRequest () {
+	if (hasRequiredRequest) return request$1;
+	hasRequiredRequest = 1;
+
+	const { extractBody, mixinBody, cloneBody, bodyUnusable } = requireBody();
+	const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = requireHeaders();
+	const { FinalizationRegistry } = requireDispatcherWeakref()();
+	const util = requireUtil$7();
+	const nodeUtil = require$$0$a;
+	const {
+	  isValidHTTPToken,
+	  sameOrigin,
+	  environmentSettingsObject
+	} = requireUtil$6();
+	const {
+	  forbiddenMethodsSet,
+	  corsSafeListedMethodsSet,
+	  referrerPolicy,
+	  requestRedirect,
+	  requestMode,
+	  requestCredentials,
+	  requestCache,
+	  requestDuplex
+	} = requireConstants$3();
+	const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util;
+	const { kHeaders, kSignal, kState, kDispatcher } = requireSymbols$3();
+	const { webidl } = requireWebidl();
+	const { URLSerializer } = requireDataUrl();
+	const { kConstruct } = requireSymbols$4();
+	const assert = require$$0$7;
+	const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$8;
+
+	const kAbortController = Symbol('abortController');
+
+	const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
+	  signal.removeEventListener('abort', abort);
+	});
+
+	const dependentControllerMap = new WeakMap();
+
+	function buildAbort (acRef) {
+	  return abort
+
+	  function abort () {
+	    const ac = acRef.deref();
+	    if (ac !== undefined) {
+	      // Currently, there is a problem with FinalizationRegistry.
+	      // https://github.com/nodejs/node/issues/49344
+	      // https://github.com/nodejs/node/issues/47748
+	      // In the case of abort, the first step is to unregister from it.
+	      // If the controller can refer to it, it is still registered.
+	      // It will be removed in the future.
+	      requestFinalizer.unregister(abort);
+
+	      // Unsubscribe a listener.
+	      // FinalizationRegistry will no longer be called, so this must be done.
+	      this.removeEventListener('abort', abort);
+
+	      ac.abort(this.reason);
+
+	      const controllerList = dependentControllerMap.get(ac.signal);
+
+	      if (controllerList !== undefined) {
+	        if (controllerList.size !== 0) {
+	          for (const ref of controllerList) {
+	            const ctrl = ref.deref();
+	            if (ctrl !== undefined) {
+	              ctrl.abort(this.reason);
+	            }
+	          }
+	          controllerList.clear();
+	        }
+	        dependentControllerMap.delete(ac.signal);
+	      }
+	    }
+	  }
+	}
+
+	let patchMethodWarning = false;
+
+	// https://fetch.spec.whatwg.org/#request-class
+	class Request {
+	  // https://fetch.spec.whatwg.org/#dom-request
+	  constructor (input, init = {}) {
+	    webidl.util.markAsUncloneable(this);
+	    if (input === kConstruct) {
+	      return
+	    }
+
+	    const prefix = 'Request constructor';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    input = webidl.converters.RequestInfo(input, prefix, 'input');
+	    init = webidl.converters.RequestInit(init, prefix, 'init');
+
+	    // 1. Let request be null.
+	    let request = null;
+
+	    // 2. Let fallbackMode be null.
+	    let fallbackMode = null;
+
+	    // 3. Let baseURL be this’s relevant settings object’s API base URL.
+	    const baseUrl = environmentSettingsObject.settingsObject.baseUrl;
+
+	    // 4. Let signal be null.
+	    let signal = null;
+
+	    // 5. If input is a string, then:
+	    if (typeof input === 'string') {
+	      this[kDispatcher] = init.dispatcher;
+
+	      // 1. Let parsedURL be the result of parsing input with baseURL.
+	      // 2. If parsedURL is failure, then throw a TypeError.
+	      let parsedURL;
+	      try {
+	        parsedURL = new URL(input, baseUrl);
+	      } catch (err) {
+	        throw new TypeError('Failed to parse URL from ' + input, { cause: err })
+	      }
+
+	      // 3. If parsedURL includes credentials, then throw a TypeError.
+	      if (parsedURL.username || parsedURL.password) {
+	        throw new TypeError(
+	          'Request cannot be constructed from a URL that includes credentials: ' +
+	            input
+	        )
+	      }
+
+	      // 4. Set request to a new request whose URL is parsedURL.
+	      request = makeRequest({ urlList: [parsedURL] });
+
+	      // 5. Set fallbackMode to "cors".
+	      fallbackMode = 'cors';
+	    } else {
+	      this[kDispatcher] = init.dispatcher || input[kDispatcher];
+
+	      // 6. Otherwise:
+
+	      // 7. Assert: input is a Request object.
+	      assert(input instanceof Request);
+
+	      // 8. Set request to input’s request.
+	      request = input[kState];
+
+	      // 9. Set signal to input’s signal.
+	      signal = input[kSignal];
+	    }
+
+	    // 7. Let origin be this’s relevant settings object’s origin.
+	    const origin = environmentSettingsObject.settingsObject.origin;
+
+	    // 8. Let window be "client".
+	    let window = 'client';
+
+	    // 9. If request’s window is an environment settings object and its origin
+	    // is same origin with origin, then set window to request’s window.
+	    if (
+	      request.window?.constructor?.name === 'EnvironmentSettingsObject' &&
+	      sameOrigin(request.window, origin)
+	    ) {
+	      window = request.window;
+	    }
+
+	    // 10. If init["window"] exists and is non-null, then throw a TypeError.
+	    if (init.window != null) {
+	      throw new TypeError(`'window' option '${window}' must be null`)
+	    }
+
+	    // 11. If init["window"] exists, then set window to "no-window".
+	    if ('window' in init) {
+	      window = 'no-window';
+	    }
+
+	    // 12. Set request to a new request with the following properties:
+	    request = makeRequest({
+	      // URL request’s URL.
+	      // undici implementation note: this is set as the first item in request's urlList in makeRequest
+	      // method request’s method.
+	      method: request.method,
+	      // header list A copy of request’s header list.
+	      // undici implementation note: headersList is cloned in makeRequest
+	      headersList: request.headersList,
+	      // unsafe-request flag Set.
+	      unsafeRequest: request.unsafeRequest,
+	      // client This’s relevant settings object.
+	      client: environmentSettingsObject.settingsObject,
+	      // window window.
+	      window,
+	      // priority request’s priority.
+	      priority: request.priority,
+	      // origin request’s origin. The propagation of the origin is only significant for navigation requests
+	      // being handled by a service worker. In this scenario a request can have an origin that is different
+	      // from the current client.
+	      origin: request.origin,
+	      // referrer request’s referrer.
+	      referrer: request.referrer,
+	      // referrer policy request’s referrer policy.
+	      referrerPolicy: request.referrerPolicy,
+	      // mode request’s mode.
+	      mode: request.mode,
+	      // credentials mode request’s credentials mode.
+	      credentials: request.credentials,
+	      // cache mode request’s cache mode.
+	      cache: request.cache,
+	      // redirect mode request’s redirect mode.
+	      redirect: request.redirect,
+	      // integrity metadata request’s integrity metadata.
+	      integrity: request.integrity,
+	      // keepalive request’s keepalive.
+	      keepalive: request.keepalive,
+	      // reload-navigation flag request’s reload-navigation flag.
+	      reloadNavigation: request.reloadNavigation,
+	      // history-navigation flag request’s history-navigation flag.
+	      historyNavigation: request.historyNavigation,
+	      // URL list A clone of request’s URL list.
+	      urlList: [...request.urlList]
+	    });
+
+	    const initHasKey = Object.keys(init).length !== 0;
+
+	    // 13. If init is not empty, then:
+	    if (initHasKey) {
+	      // 1. If request’s mode is "navigate", then set it to "same-origin".
+	      if (request.mode === 'navigate') {
+	        request.mode = 'same-origin';
+	      }
+
+	      // 2. Unset request’s reload-navigation flag.
+	      request.reloadNavigation = false;
+
+	      // 3. Unset request’s history-navigation flag.
+	      request.historyNavigation = false;
+
+	      // 4. Set request’s origin to "client".
+	      request.origin = 'client';
+
+	      // 5. Set request’s referrer to "client"
+	      request.referrer = 'client';
+
+	      // 6. Set request’s referrer policy to the empty string.
+	      request.referrerPolicy = '';
+
+	      // 7. Set request’s URL to request’s current URL.
+	      request.url = request.urlList[request.urlList.length - 1];
+
+	      // 8. Set request’s URL list to « request’s URL ».
+	      request.urlList = [request.url];
+	    }
+
+	    // 14. If init["referrer"] exists, then:
+	    if (init.referrer !== undefined) {
+	      // 1. Let referrer be init["referrer"].
+	      const referrer = init.referrer;
+
+	      // 2. If referrer is the empty string, then set request’s referrer to "no-referrer".
+	      if (referrer === '') {
+	        request.referrer = 'no-referrer';
+	      } else {
+	        // 1. Let parsedReferrer be the result of parsing referrer with
+	        // baseURL.
+	        // 2. If parsedReferrer is failure, then throw a TypeError.
+	        let parsedReferrer;
+	        try {
+	          parsedReferrer = new URL(referrer, baseUrl);
+	        } catch (err) {
+	          throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err })
+	        }
+
+	        // 3. If one of the following is true
+	        // - parsedReferrer’s scheme is "about" and path is the string "client"
+	        // - parsedReferrer’s origin is not same origin with origin
+	        // then set request’s referrer to "client".
+	        if (
+	          (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||
+	          (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl))
+	        ) {
+	          request.referrer = 'client';
+	        } else {
+	          // 4. Otherwise, set request’s referrer to parsedReferrer.
+	          request.referrer = parsedReferrer;
+	        }
+	      }
+	    }
+
+	    // 15. If init["referrerPolicy"] exists, then set request’s referrer policy
+	    // to it.
+	    if (init.referrerPolicy !== undefined) {
+	      request.referrerPolicy = init.referrerPolicy;
+	    }
+
+	    // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise.
+	    let mode;
+	    if (init.mode !== undefined) {
+	      mode = init.mode;
+	    } else {
+	      mode = fallbackMode;
+	    }
+
+	    // 17. If mode is "navigate", then throw a TypeError.
+	    if (mode === 'navigate') {
+	      throw webidl.errors.exception({
+	        header: 'Request constructor',
+	        message: 'invalid request mode navigate.'
+	      })
+	    }
+
+	    // 18. If mode is non-null, set request’s mode to mode.
+	    if (mode != null) {
+	      request.mode = mode;
+	    }
+
+	    // 19. If init["credentials"] exists, then set request’s credentials mode
+	    // to it.
+	    if (init.credentials !== undefined) {
+	      request.credentials = init.credentials;
+	    }
+
+	    // 18. If init["cache"] exists, then set request’s cache mode to it.
+	    if (init.cache !== undefined) {
+	      request.cache = init.cache;
+	    }
+
+	    // 21. If request’s cache mode is "only-if-cached" and request’s mode is
+	    // not "same-origin", then throw a TypeError.
+	    if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
+	      throw new TypeError(
+	        "'only-if-cached' can be set only with 'same-origin' mode"
+	      )
+	    }
+
+	    // 22. If init["redirect"] exists, then set request’s redirect mode to it.
+	    if (init.redirect !== undefined) {
+	      request.redirect = init.redirect;
+	    }
+
+	    // 23. If init["integrity"] exists, then set request’s integrity metadata to it.
+	    if (init.integrity != null) {
+	      request.integrity = String(init.integrity);
+	    }
+
+	    // 24. If init["keepalive"] exists, then set request’s keepalive to it.
+	    if (init.keepalive !== undefined) {
+	      request.keepalive = Boolean(init.keepalive);
+	    }
+
+	    // 25. If init["method"] exists, then:
+	    if (init.method !== undefined) {
+	      // 1. Let method be init["method"].
+	      let method = init.method;
+
+	      const mayBeNormalized = normalizedMethodRecords[method];
+
+	      if (mayBeNormalized !== undefined) {
+	        // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones
+	        request.method = mayBeNormalized;
+	      } else {
+	        // 2. If method is not a method or method is a forbidden method, then
+	        // throw a TypeError.
+	        if (!isValidHTTPToken(method)) {
+	          throw new TypeError(`'${method}' is not a valid HTTP method.`)
+	        }
+
+	        const upperCase = method.toUpperCase();
+
+	        if (forbiddenMethodsSet.has(upperCase)) {
+	          throw new TypeError(`'${method}' HTTP method is unsupported.`)
+	        }
+
+	        // 3. Normalize method.
+	        // https://fetch.spec.whatwg.org/#concept-method-normalize
+	        // Note: must be in uppercase
+	        method = normalizedMethodRecordsBase[upperCase] ?? method;
+
+	        // 4. Set request’s method to method.
+	        request.method = method;
+	      }
+
+	      if (!patchMethodWarning && request.method === 'patch') {
+	        process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', {
+	          code: 'UNDICI-FETCH-patch'
+	        });
+
+	        patchMethodWarning = true;
+	      }
+	    }
+
+	    // 26. If init["signal"] exists, then set signal to it.
+	    if (init.signal !== undefined) {
+	      signal = init.signal;
+	    }
+
+	    // 27. Set this’s request to request.
+	    this[kState] = request;
+
+	    // 28. Set this’s signal to a new AbortSignal object with this’s relevant
+	    // Realm.
+	    // TODO: could this be simplified with AbortSignal.any
+	    // (https://dom.spec.whatwg.org/#dom-abortsignal-any)
+	    const ac = new AbortController();
+	    this[kSignal] = ac.signal;
+
+	    // 29. If signal is not null, then make this’s signal follow signal.
+	    if (signal != null) {
+	      if (
+	        !signal ||
+	        typeof signal.aborted !== 'boolean' ||
+	        typeof signal.addEventListener !== 'function'
+	      ) {
+	        throw new TypeError(
+	          "Failed to construct 'Request': member signal is not of type AbortSignal."
+	        )
+	      }
+
+	      if (signal.aborted) {
+	        ac.abort(signal.reason);
+	      } else {
+	        // Keep a strong ref to ac while request object
+	        // is alive. This is needed to prevent AbortController
+	        // from being prematurely garbage collected.
+	        // See, https://github.com/nodejs/undici/issues/1926.
+	        this[kAbortController] = ac;
+
+	        const acRef = new WeakRef(ac);
+	        const abort = buildAbort(acRef);
+
+	        // Third-party AbortControllers may not work with these.
+	        // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619.
+	        try {
+	          // If the max amount of listeners is equal to the default, increase it
+	          // This is only available in node >= v19.9.0
+	          if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) {
+	            setMaxListeners(1500, signal);
+	          } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) {
+	            setMaxListeners(1500, signal);
+	          }
+	        } catch {}
+
+	        util.addAbortListener(signal, abort);
+	        // The third argument must be a registry key to be unregistered.
+	        // Without it, you cannot unregister.
+	        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry
+	        // abort is used as the unregister key. (because it is unique)
+	        requestFinalizer.register(ac, { signal, abort }, abort);
+	      }
+	    }
+
+	    // 30. Set this’s headers to a new Headers object with this’s relevant
+	    // Realm, whose header list is request’s header list and guard is
+	    // "request".
+	    this[kHeaders] = new Headers(kConstruct);
+	    setHeadersList(this[kHeaders], request.headersList);
+	    setHeadersGuard(this[kHeaders], 'request');
+
+	    // 31. If this’s request’s mode is "no-cors", then:
+	    if (mode === 'no-cors') {
+	      // 1. If this’s request’s method is not a CORS-safelisted method,
+	      // then throw a TypeError.
+	      if (!corsSafeListedMethodsSet.has(request.method)) {
+	        throw new TypeError(
+	          `'${request.method} is unsupported in no-cors mode.`
+	        )
+	      }
+
+	      // 2. Set this’s headers’s guard to "request-no-cors".
+	      setHeadersGuard(this[kHeaders], 'request-no-cors');
+	    }
+
+	    // 32. If init is not empty, then:
+	    if (initHasKey) {
+	      /** @type {HeadersList} */
+	      const headersList = getHeadersList(this[kHeaders]);
+	      // 1. Let headers be a copy of this’s headers and its associated header
+	      // list.
+	      // 2. If init["headers"] exists, then set headers to init["headers"].
+	      const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList);
+
+	      // 3. Empty this’s headers’s header list.
+	      headersList.clear();
+
+	      // 4. If headers is a Headers object, then for each header in its header
+	      // list, append header’s name/header’s value to this’s headers.
+	      if (headers instanceof HeadersList) {
+	        for (const { name, value } of headers.rawValues()) {
+	          headersList.append(name, value, false);
+	        }
+	        // Note: Copy the `set-cookie` meta-data.
+	        headersList.cookies = headers.cookies;
+	      } else {
+	        // 5. Otherwise, fill this’s headers with headers.
+	        fillHeaders(this[kHeaders], headers);
+	      }
+	    }
+
+	    // 33. Let inputBody be input’s request’s body if input is a Request
+	    // object; otherwise null.
+	    const inputBody = input instanceof Request ? input[kState].body : null;
+
+	    // 34. If either init["body"] exists and is non-null or inputBody is
+	    // non-null, and request’s method is `GET` or `HEAD`, then throw a
+	    // TypeError.
+	    if (
+	      (init.body != null || inputBody != null) &&
+	      (request.method === 'GET' || request.method === 'HEAD')
+	    ) {
+	      throw new TypeError('Request with GET/HEAD method cannot have body.')
+	    }
+
+	    // 35. Let initBody be null.
+	    let initBody = null;
+
+	    // 36. If init["body"] exists and is non-null, then:
+	    if (init.body != null) {
+	      // 1. Let Content-Type be null.
+	      // 2. Set initBody and Content-Type to the result of extracting
+	      // init["body"], with keepalive set to request’s keepalive.
+	      const [extractedBody, contentType] = extractBody(
+	        init.body,
+	        request.keepalive
+	      );
+	      initBody = extractedBody;
+
+	      // 3, If Content-Type is non-null and this’s headers’s header list does
+	      // not contain `Content-Type`, then append `Content-Type`/Content-Type to
+	      // this’s headers.
+	      if (contentType && !getHeadersList(this[kHeaders]).contains('content-type', true)) {
+	        this[kHeaders].append('content-type', contentType);
+	      }
+	    }
+
+	    // 37. Let inputOrInitBody be initBody if it is non-null; otherwise
+	    // inputBody.
+	    const inputOrInitBody = initBody ?? inputBody;
+
+	    // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is
+	    // null, then:
+	    if (inputOrInitBody != null && inputOrInitBody.source == null) {
+	      // 1. If initBody is non-null and init["duplex"] does not exist,
+	      //    then throw a TypeError.
+	      if (initBody != null && init.duplex == null) {
+	        throw new TypeError('RequestInit: duplex option is required when sending a body.')
+	      }
+
+	      // 2. If this’s request’s mode is neither "same-origin" nor "cors",
+	      // then throw a TypeError.
+	      if (request.mode !== 'same-origin' && request.mode !== 'cors') {
+	        throw new TypeError(
+	          'If request is made from ReadableStream, mode should be "same-origin" or "cors"'
+	        )
+	      }
+
+	      // 3. Set this’s request’s use-CORS-preflight flag.
+	      request.useCORSPreflightFlag = true;
+	    }
+
+	    // 39. Let finalBody be inputOrInitBody.
+	    let finalBody = inputOrInitBody;
+
+	    // 40. If initBody is null and inputBody is non-null, then:
+	    if (initBody == null && inputBody != null) {
+	      // 1. If input is unusable, then throw a TypeError.
+	      if (bodyUnusable(input)) {
+	        throw new TypeError(
+	          'Cannot construct a Request with a Request object that has already been used.'
+	        )
+	      }
+
+	      // 2. Set finalBody to the result of creating a proxy for inputBody.
+	      // https://streams.spec.whatwg.org/#readablestream-create-a-proxy
+	      const identityTransform = new TransformStream();
+	      inputBody.stream.pipeThrough(identityTransform);
+	      finalBody = {
+	        source: inputBody.source,
+	        length: inputBody.length,
+	        stream: identityTransform.readable
+	      };
+	    }
+
+	    // 41. Set this’s request’s body to finalBody.
+	    this[kState].body = finalBody;
+	  }
+
+	  // Returns request’s HTTP method, which is "GET" by default.
+	  get method () {
+	    webidl.brandCheck(this, Request);
+
+	    // The method getter steps are to return this’s request’s method.
+	    return this[kState].method
+	  }
+
+	  // Returns the URL of request as a string.
+	  get url () {
+	    webidl.brandCheck(this, Request);
+
+	    // The url getter steps are to return this’s request’s URL, serialized.
+	    return URLSerializer(this[kState].url)
+	  }
+
+	  // Returns a Headers object consisting of the headers associated with request.
+	  // Note that headers added in the network layer by the user agent will not
+	  // be accounted for in this object, e.g., the "Host" header.
+	  get headers () {
+	    webidl.brandCheck(this, Request);
+
+	    // The headers getter steps are to return this’s headers.
+	    return this[kHeaders]
+	  }
+
+	  // Returns the kind of resource requested by request, e.g., "document"
+	  // or "script".
+	  get destination () {
+	    webidl.brandCheck(this, Request);
+
+	    // The destination getter are to return this’s request’s destination.
+	    return this[kState].destination
+	  }
+
+	  // Returns the referrer of request. Its value can be a same-origin URL if
+	  // explicitly set in init, the empty string to indicate no referrer, and
+	  // "about:client" when defaulting to the global’s default. This is used
+	  // during fetching to determine the value of the `Referer` header of the
+	  // request being made.
+	  get referrer () {
+	    webidl.brandCheck(this, Request);
+
+	    // 1. If this’s request’s referrer is "no-referrer", then return the
+	    // empty string.
+	    if (this[kState].referrer === 'no-referrer') {
+	      return ''
+	    }
+
+	    // 2. If this’s request’s referrer is "client", then return
+	    // "about:client".
+	    if (this[kState].referrer === 'client') {
+	      return 'about:client'
+	    }
+
+	    // Return this’s request’s referrer, serialized.
+	    return this[kState].referrer.toString()
+	  }
+
+	  // Returns the referrer policy associated with request.
+	  // This is used during fetching to compute the value of the request’s
+	  // referrer.
+	  get referrerPolicy () {
+	    webidl.brandCheck(this, Request);
+
+	    // The referrerPolicy getter steps are to return this’s request’s referrer policy.
+	    return this[kState].referrerPolicy
+	  }
+
+	  // Returns the mode associated with request, which is a string indicating
+	  // whether the request will use CORS, or will be restricted to same-origin
+	  // URLs.
+	  get mode () {
+	    webidl.brandCheck(this, Request);
+
+	    // The mode getter steps are to return this’s request’s mode.
+	    return this[kState].mode
+	  }
+
+	  // Returns the credentials mode associated with request,
+	  // which is a string indicating whether credentials will be sent with the
+	  // request always, never, or only when sent to a same-origin URL.
+	  get credentials () {
+	    // The credentials getter steps are to return this’s request’s credentials mode.
+	    return this[kState].credentials
+	  }
+
+	  // Returns the cache mode associated with request,
+	  // which is a string indicating how the request will
+	  // interact with the browser’s cache when fetching.
+	  get cache () {
+	    webidl.brandCheck(this, Request);
+
+	    // The cache getter steps are to return this’s request’s cache mode.
+	    return this[kState].cache
+	  }
+
+	  // Returns the redirect mode associated with request,
+	  // which is a string indicating how redirects for the
+	  // request will be handled during fetching. A request
+	  // will follow redirects by default.
+	  get redirect () {
+	    webidl.brandCheck(this, Request);
+
+	    // The redirect getter steps are to return this’s request’s redirect mode.
+	    return this[kState].redirect
+	  }
+
+	  // Returns request’s subresource integrity metadata, which is a
+	  // cryptographic hash of the resource being fetched. Its value
+	  // consists of multiple hashes separated by whitespace. [SRI]
+	  get integrity () {
+	    webidl.brandCheck(this, Request);
+
+	    // The integrity getter steps are to return this’s request’s integrity
+	    // metadata.
+	    return this[kState].integrity
+	  }
+
+	  // Returns a boolean indicating whether or not request can outlive the
+	  // global in which it was created.
+	  get keepalive () {
+	    webidl.brandCheck(this, Request);
+
+	    // The keepalive getter steps are to return this’s request’s keepalive.
+	    return this[kState].keepalive
+	  }
+
+	  // Returns a boolean indicating whether or not request is for a reload
+	  // navigation.
+	  get isReloadNavigation () {
+	    webidl.brandCheck(this, Request);
+
+	    // The isReloadNavigation getter steps are to return true if this’s
+	    // request’s reload-navigation flag is set; otherwise false.
+	    return this[kState].reloadNavigation
+	  }
+
+	  // Returns a boolean indicating whether or not request is for a history
+	  // navigation (a.k.a. back-forward navigation).
+	  get isHistoryNavigation () {
+	    webidl.brandCheck(this, Request);
+
+	    // The isHistoryNavigation getter steps are to return true if this’s request’s
+	    // history-navigation flag is set; otherwise false.
+	    return this[kState].historyNavigation
+	  }
+
+	  // Returns the signal associated with request, which is an AbortSignal
+	  // object indicating whether or not request has been aborted, and its
+	  // abort event handler.
+	  get signal () {
+	    webidl.brandCheck(this, Request);
+
+	    // The signal getter steps are to return this’s signal.
+	    return this[kSignal]
+	  }
+
+	  get body () {
+	    webidl.brandCheck(this, Request);
+
+	    return this[kState].body ? this[kState].body.stream : null
+	  }
+
+	  get bodyUsed () {
+	    webidl.brandCheck(this, Request);
+
+	    return !!this[kState].body && util.isDisturbed(this[kState].body.stream)
+	  }
+
+	  get duplex () {
+	    webidl.brandCheck(this, Request);
+
+	    return 'half'
+	  }
+
+	  // Returns a clone of request.
+	  clone () {
+	    webidl.brandCheck(this, Request);
+
+	    // 1. If this is unusable, then throw a TypeError.
+	    if (bodyUnusable(this)) {
+	      throw new TypeError('unusable')
+	    }
+
+	    // 2. Let clonedRequest be the result of cloning this’s request.
+	    const clonedRequest = cloneRequest(this[kState]);
+
+	    // 3. Let clonedRequestObject be the result of creating a Request object,
+	    // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.
+	    // 4. Make clonedRequestObject’s signal follow this’s signal.
+	    const ac = new AbortController();
+	    if (this.signal.aborted) {
+	      ac.abort(this.signal.reason);
+	    } else {
+	      let list = dependentControllerMap.get(this.signal);
+	      if (list === undefined) {
+	        list = new Set();
+	        dependentControllerMap.set(this.signal, list);
+	      }
+	      const acRef = new WeakRef(ac);
+	      list.add(acRef);
+	      util.addAbortListener(
+	        ac.signal,
+	        buildAbort(acRef)
+	      );
+	    }
+
+	    // 4. Return clonedRequestObject.
+	    return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders]))
+	  }
+
+	  [nodeUtil.inspect.custom] (depth, options) {
+	    if (options.depth === null) {
+	      options.depth = 2;
+	    }
+
+	    options.colors ??= true;
+
+	    const properties = {
+	      method: this.method,
+	      url: this.url,
+	      headers: this.headers,
+	      destination: this.destination,
+	      referrer: this.referrer,
+	      referrerPolicy: this.referrerPolicy,
+	      mode: this.mode,
+	      credentials: this.credentials,
+	      cache: this.cache,
+	      redirect: this.redirect,
+	      integrity: this.integrity,
+	      keepalive: this.keepalive,
+	      isReloadNavigation: this.isReloadNavigation,
+	      isHistoryNavigation: this.isHistoryNavigation,
+	      signal: this.signal
+	    };
+
+	    return `Request ${nodeUtil.formatWithOptions(options, properties)}`
+	  }
+	}
+
+	mixinBody(Request);
+
+	// https://fetch.spec.whatwg.org/#requests
+	function makeRequest (init) {
+	  return {
+	    method: init.method ?? 'GET',
+	    localURLsOnly: init.localURLsOnly ?? false,
+	    unsafeRequest: init.unsafeRequest ?? false,
+	    body: init.body ?? null,
+	    client: init.client ?? null,
+	    reservedClient: init.reservedClient ?? null,
+	    replacesClientId: init.replacesClientId ?? '',
+	    window: init.window ?? 'client',
+	    keepalive: init.keepalive ?? false,
+	    serviceWorkers: init.serviceWorkers ?? 'all',
+	    initiator: init.initiator ?? '',
+	    destination: init.destination ?? '',
+	    priority: init.priority ?? null,
+	    origin: init.origin ?? 'client',
+	    policyContainer: init.policyContainer ?? 'client',
+	    referrer: init.referrer ?? 'client',
+	    referrerPolicy: init.referrerPolicy ?? '',
+	    mode: init.mode ?? 'no-cors',
+	    useCORSPreflightFlag: init.useCORSPreflightFlag ?? false,
+	    credentials: init.credentials ?? 'same-origin',
+	    useCredentials: init.useCredentials ?? false,
+	    cache: init.cache ?? 'default',
+	    redirect: init.redirect ?? 'follow',
+	    integrity: init.integrity ?? '',
+	    cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '',
+	    parserMetadata: init.parserMetadata ?? '',
+	    reloadNavigation: init.reloadNavigation ?? false,
+	    historyNavigation: init.historyNavigation ?? false,
+	    userActivation: init.userActivation ?? false,
+	    taintedOrigin: init.taintedOrigin ?? false,
+	    redirectCount: init.redirectCount ?? 0,
+	    responseTainting: init.responseTainting ?? 'basic',
+	    preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false,
+	    done: init.done ?? false,
+	    timingAllowFailed: init.timingAllowFailed ?? false,
+	    urlList: init.urlList,
+	    url: init.urlList[0],
+	    headersList: init.headersList
+	      ? new HeadersList(init.headersList)
+	      : new HeadersList()
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-request-clone
+	function cloneRequest (request) {
+	  // To clone a request request, run these steps:
+
+	  // 1. Let newRequest be a copy of request, except for its body.
+	  const newRequest = makeRequest({ ...request, body: null });
+
+	  // 2. If request’s body is non-null, set newRequest’s body to the
+	  // result of cloning request’s body.
+	  if (request.body != null) {
+	    newRequest.body = cloneBody(newRequest, request.body);
+	  }
+
+	  // 3. Return newRequest.
+	  return newRequest
+	}
+
+	/**
+	 * @see https://fetch.spec.whatwg.org/#request-create
+	 * @param {any} innerRequest
+	 * @param {AbortSignal} signal
+	 * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard
+	 * @returns {Request}
+	 */
+	function fromInnerRequest (innerRequest, signal, guard) {
+	  const request = new Request(kConstruct);
+	  request[kState] = innerRequest;
+	  request[kSignal] = signal;
+	  request[kHeaders] = new Headers(kConstruct);
+	  setHeadersList(request[kHeaders], innerRequest.headersList);
+	  setHeadersGuard(request[kHeaders], guard);
+	  return request
+	}
+
+	Object.defineProperties(Request.prototype, {
+	  method: kEnumerableProperty,
+	  url: kEnumerableProperty,
+	  headers: kEnumerableProperty,
+	  redirect: kEnumerableProperty,
+	  clone: kEnumerableProperty,
+	  signal: kEnumerableProperty,
+	  duplex: kEnumerableProperty,
+	  destination: kEnumerableProperty,
+	  body: kEnumerableProperty,
+	  bodyUsed: kEnumerableProperty,
+	  isHistoryNavigation: kEnumerableProperty,
+	  isReloadNavigation: kEnumerableProperty,
+	  keepalive: kEnumerableProperty,
+	  integrity: kEnumerableProperty,
+	  cache: kEnumerableProperty,
+	  credentials: kEnumerableProperty,
+	  attribute: kEnumerableProperty,
+	  referrerPolicy: kEnumerableProperty,
+	  referrer: kEnumerableProperty,
+	  mode: kEnumerableProperty,
+	  [Symbol.toStringTag]: {
+	    value: 'Request',
+	    configurable: true
+	  }
+	});
+
+	webidl.converters.Request = webidl.interfaceConverter(
+	  Request
+	);
+
+	// https://fetch.spec.whatwg.org/#requestinfo
+	webidl.converters.RequestInfo = function (V, prefix, argument) {
+	  if (typeof V === 'string') {
+	    return webidl.converters.USVString(V, prefix, argument)
+	  }
+
+	  if (V instanceof Request) {
+	    return webidl.converters.Request(V, prefix, argument)
+	  }
+
+	  return webidl.converters.USVString(V, prefix, argument)
+	};
+
+	webidl.converters.AbortSignal = webidl.interfaceConverter(
+	  AbortSignal
+	);
+
+	// https://fetch.spec.whatwg.org/#requestinit
+	webidl.converters.RequestInit = webidl.dictionaryConverter([
+	  {
+	    key: 'method',
+	    converter: webidl.converters.ByteString
+	  },
+	  {
+	    key: 'headers',
+	    converter: webidl.converters.HeadersInit
+	  },
+	  {
+	    key: 'body',
+	    converter: webidl.nullableConverter(
+	      webidl.converters.BodyInit
+	    )
+	  },
+	  {
+	    key: 'referrer',
+	    converter: webidl.converters.USVString
+	  },
+	  {
+	    key: 'referrerPolicy',
+	    converter: webidl.converters.DOMString,
+	    // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy
+	    allowedValues: referrerPolicy
+	  },
+	  {
+	    key: 'mode',
+	    converter: webidl.converters.DOMString,
+	    // https://fetch.spec.whatwg.org/#concept-request-mode
+	    allowedValues: requestMode
+	  },
+	  {
+	    key: 'credentials',
+	    converter: webidl.converters.DOMString,
+	    // https://fetch.spec.whatwg.org/#requestcredentials
+	    allowedValues: requestCredentials
+	  },
+	  {
+	    key: 'cache',
+	    converter: webidl.converters.DOMString,
+	    // https://fetch.spec.whatwg.org/#requestcache
+	    allowedValues: requestCache
+	  },
+	  {
+	    key: 'redirect',
+	    converter: webidl.converters.DOMString,
+	    // https://fetch.spec.whatwg.org/#requestredirect
+	    allowedValues: requestRedirect
+	  },
+	  {
+	    key: 'integrity',
+	    converter: webidl.converters.DOMString
+	  },
+	  {
+	    key: 'keepalive',
+	    converter: webidl.converters.boolean
+	  },
+	  {
+	    key: 'signal',
+	    converter: webidl.nullableConverter(
+	      (signal) => webidl.converters.AbortSignal(
+	        signal,
+	        'RequestInit',
+	        'signal',
+	        { strict: false }
+	      )
+	    )
+	  },
+	  {
+	    key: 'window',
+	    converter: webidl.converters.any
+	  },
+	  {
+	    key: 'duplex',
+	    converter: webidl.converters.DOMString,
+	    allowedValues: requestDuplex
+	  },
+	  {
+	    key: 'dispatcher', // undici specific option
+	    converter: webidl.converters.any
+	  }
+	]);
+
+	request$1 = { Request, makeRequest, fromInnerRequest, cloneRequest };
+	return request$1;
+}
+
+var fetch_1;
+var hasRequiredFetch;
+
+function requireFetch () {
+	if (hasRequiredFetch) return fetch_1;
+	hasRequiredFetch = 1;
+
+	const {
+	  makeNetworkError,
+	  makeAppropriateNetworkError,
+	  filterResponse,
+	  makeResponse,
+	  fromInnerResponse
+	} = requireResponse();
+	const { HeadersList } = requireHeaders();
+	const { Request, cloneRequest } = requireRequest();
+	const zlib = require$$3;
+	const {
+	  bytesMatch,
+	  makePolicyContainer,
+	  clonePolicyContainer,
+	  requestBadPort,
+	  TAOCheck,
+	  appendRequestOriginHeader,
+	  responseLocationURL,
+	  requestCurrentURL,
+	  setRequestReferrerPolicyOnRedirect,
+	  tryUpgradeRequestToAPotentiallyTrustworthyURL,
+	  createOpaqueTimingInfo,
+	  appendFetchMetadata,
+	  corsCheck,
+	  crossOriginResourcePolicyCheck,
+	  determineRequestsReferrer,
+	  coarsenedSharedCurrentTime,
+	  createDeferredPromise,
+	  isBlobLike,
+	  sameOrigin,
+	  isCancelled,
+	  isAborted,
+	  isErrorLike,
+	  fullyReadBody,
+	  readableStreamClose,
+	  isomorphicEncode,
+	  urlIsLocal,
+	  urlIsHttpHttpsScheme,
+	  urlHasHttpsScheme,
+	  clampAndCoarsenConnectionTimingInfo,
+	  simpleRangeHeaderValue,
+	  buildContentRange,
+	  createInflate,
+	  extractMimeType
+	} = requireUtil$6();
+	const { kState, kDispatcher } = requireSymbols$3();
+	const assert = require$$0$7;
+	const { safelyExtractBody, extractBody } = requireBody();
+	const {
+	  redirectStatusSet,
+	  nullBodyStatus,
+	  safeMethodsSet,
+	  requestBodyHeader,
+	  subresourceSet
+	} = requireConstants$3();
+	const EE = require$$8;
+	const { Readable, pipeline, finished } = require$$0$8;
+	const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = requireUtil$7();
+	const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = requireDataUrl();
+	const { getGlobalDispatcher } = requireGlobal();
+	const { webidl } = requireWebidl();
+	const { STATUS_CODES } = require$$2;
+	const GET_OR_HEAD = ['GET', 'HEAD'];
+
+	const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'
+	  ? 'node'
+	  : 'undici';
+
+	/** @type {import('buffer').resolveObjectURL} */
+	let resolveObjectURL;
+
+	class Fetch extends EE {
+	  constructor (dispatcher) {
+	    super();
+
+	    this.dispatcher = dispatcher;
+	    this.connection = null;
+	    this.dump = false;
+	    this.state = 'ongoing';
+	  }
+
+	  terminate (reason) {
+	    if (this.state !== 'ongoing') {
+	      return
+	    }
+
+	    this.state = 'terminated';
+	    this.connection?.destroy(reason);
+	    this.emit('terminated', reason);
+	  }
+
+	  // https://fetch.spec.whatwg.org/#fetch-controller-abort
+	  abort (error) {
+	    if (this.state !== 'ongoing') {
+	      return
+	    }
+
+	    // 1. Set controller’s state to "aborted".
+	    this.state = 'aborted';
+
+	    // 2. Let fallbackError be an "AbortError" DOMException.
+	    // 3. Set error to fallbackError if it is not given.
+	    if (!error) {
+	      error = new DOMException('The operation was aborted.', 'AbortError');
+	    }
+
+	    // 4. Let serializedError be StructuredSerialize(error).
+	    //    If that threw an exception, catch it, and let
+	    //    serializedError be StructuredSerialize(fallbackError).
+
+	    // 5. Set controller’s serialized abort reason to serializedError.
+	    this.serializedAbortReason = error;
+
+	    this.connection?.destroy(error);
+	    this.emit('terminated', error);
+	  }
+	}
+
+	function handleFetchDone (response) {
+	  finalizeAndReportTiming(response, 'fetch');
+	}
+
+	// https://fetch.spec.whatwg.org/#fetch-method
+	function fetch (input, init = undefined) {
+	  webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch');
+
+	  // 1. Let p be a new promise.
+	  let p = createDeferredPromise();
+
+	  // 2. Let requestObject be the result of invoking the initial value of
+	  // Request as constructor with input and init as arguments. If this throws
+	  // an exception, reject p with it and return p.
+	  let requestObject;
+
+	  try {
+	    requestObject = new Request(input, init);
+	  } catch (e) {
+	    p.reject(e);
+	    return p.promise
+	  }
+
+	  // 3. Let request be requestObject’s request.
+	  const request = requestObject[kState];
+
+	  // 4. If requestObject’s signal’s aborted flag is set, then:
+	  if (requestObject.signal.aborted) {
+	    // 1. Abort the fetch() call with p, request, null, and
+	    //    requestObject’s signal’s abort reason.
+	    abortFetch(p, request, null, requestObject.signal.reason);
+
+	    // 2. Return p.
+	    return p.promise
+	  }
+
+	  // 5. Let globalObject be request’s client’s global object.
+	  const globalObject = request.client.globalObject;
+
+	  // 6. If globalObject is a ServiceWorkerGlobalScope object, then set
+	  // request’s service-workers mode to "none".
+	  if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {
+	    request.serviceWorkers = 'none';
+	  }
+
+	  // 7. Let responseObject be null.
+	  let responseObject = null;
+
+	  // 8. Let relevantRealm be this’s relevant Realm.
+
+	  // 9. Let locallyAborted be false.
+	  let locallyAborted = false;
+
+	  // 10. Let controller be null.
+	  let controller = null;
+
+	  // 11. Add the following abort steps to requestObject’s signal:
+	  addAbortListener(
+	    requestObject.signal,
+	    () => {
+	      // 1. Set locallyAborted to true.
+	      locallyAborted = true;
+
+	      // 2. Assert: controller is non-null.
+	      assert(controller != null);
+
+	      // 3. Abort controller with requestObject’s signal’s abort reason.
+	      controller.abort(requestObject.signal.reason);
+
+	      const realResponse = responseObject?.deref();
+
+	      // 4. Abort the fetch() call with p, request, responseObject,
+	      //    and requestObject’s signal’s abort reason.
+	      abortFetch(p, request, realResponse, requestObject.signal.reason);
+	    }
+	  );
+
+	  // 12. Let handleFetchDone given response response be to finalize and
+	  // report timing with response, globalObject, and "fetch".
+	  // see function handleFetchDone
+
+	  // 13. Set controller to the result of calling fetch given request,
+	  // with processResponseEndOfBody set to handleFetchDone, and processResponse
+	  // given response being these substeps:
+
+	  const processResponse = (response) => {
+	    // 1. If locallyAborted is true, terminate these substeps.
+	    if (locallyAborted) {
+	      return
+	    }
+
+	    // 2. If response’s aborted flag is set, then:
+	    if (response.aborted) {
+	      // 1. Let deserializedError be the result of deserialize a serialized
+	      //    abort reason given controller’s serialized abort reason and
+	      //    relevantRealm.
+
+	      // 2. Abort the fetch() call with p, request, responseObject, and
+	      //    deserializedError.
+
+	      abortFetch(p, request, responseObject, controller.serializedAbortReason);
+	      return
+	    }
+
+	    // 3. If response is a network error, then reject p with a TypeError
+	    // and terminate these substeps.
+	    if (response.type === 'error') {
+	      p.reject(new TypeError('fetch failed', { cause: response.error }));
+	      return
+	    }
+
+	    // 4. Set responseObject to the result of creating a Response object,
+	    // given response, "immutable", and relevantRealm.
+	    responseObject = new WeakRef(fromInnerResponse(response, 'immutable'));
+
+	    // 5. Resolve p with responseObject.
+	    p.resolve(responseObject.deref());
+	    p = null;
+	  };
+
+	  controller = fetching({
+	    request,
+	    processResponseEndOfBody: handleFetchDone,
+	    processResponse,
+	    dispatcher: requestObject[kDispatcher] // undici
+	  });
+
+	  // 14. Return p.
+	  return p.promise
+	}
+
+	// https://fetch.spec.whatwg.org/#finalize-and-report-timing
+	function finalizeAndReportTiming (response, initiatorType = 'other') {
+	  // 1. If response is an aborted network error, then return.
+	  if (response.type === 'error' && response.aborted) {
+	    return
+	  }
+
+	  // 2. If response’s URL list is null or empty, then return.
+	  if (!response.urlList?.length) {
+	    return
+	  }
+
+	  // 3. Let originalURL be response’s URL list[0].
+	  const originalURL = response.urlList[0];
+
+	  // 4. Let timingInfo be response’s timing info.
+	  let timingInfo = response.timingInfo;
+
+	  // 5. Let cacheState be response’s cache state.
+	  let cacheState = response.cacheState;
+
+	  // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.
+	  if (!urlIsHttpHttpsScheme(originalURL)) {
+	    return
+	  }
+
+	  // 7. If timingInfo is null, then return.
+	  if (timingInfo === null) {
+	    return
+	  }
+
+	  // 8. If response’s timing allow passed flag is not set, then:
+	  if (!response.timingAllowPassed) {
+	    //  1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.
+	    timingInfo = createOpaqueTimingInfo({
+	      startTime: timingInfo.startTime
+	    });
+
+	    //  2. Set cacheState to the empty string.
+	    cacheState = '';
+	  }
+
+	  // 9. Set timingInfo’s end time to the coarsened shared current time
+	  // given global’s relevant settings object’s cross-origin isolated
+	  // capability.
+	  // TODO: given global’s relevant settings object’s cross-origin isolated
+	  // capability?
+	  timingInfo.endTime = coarsenedSharedCurrentTime();
+
+	  // 10. Set response’s timing info to timingInfo.
+	  response.timingInfo = timingInfo;
+
+	  // 11. Mark resource timing for timingInfo, originalURL, initiatorType,
+	  // global, and cacheState.
+	  markResourceTiming(
+	    timingInfo,
+	    originalURL.href,
+	    initiatorType,
+	    globalThis,
+	    cacheState
+	  );
+	}
+
+	// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing
+	const markResourceTiming = performance.markResourceTiming;
+
+	// https://fetch.spec.whatwg.org/#abort-fetch
+	function abortFetch (p, request, responseObject, error) {
+	  // 1. Reject promise with error.
+	  if (p) {
+	    // We might have already resolved the promise at this stage
+	    p.reject(error);
+	  }
+
+	  // 2. If request’s body is not null and is readable, then cancel request’s
+	  // body with error.
+	  if (request.body != null && isReadable(request.body?.stream)) {
+	    request.body.stream.cancel(error).catch((err) => {
+	      if (err.code === 'ERR_INVALID_STATE') {
+	        // Node bug?
+	        return
+	      }
+	      throw err
+	    });
+	  }
+
+	  // 3. If responseObject is null, then return.
+	  if (responseObject == null) {
+	    return
+	  }
+
+	  // 4. Let response be responseObject’s response.
+	  const response = responseObject[kState];
+
+	  // 5. If response’s body is not null and is readable, then error response’s
+	  // body with error.
+	  if (response.body != null && isReadable(response.body?.stream)) {
+	    response.body.stream.cancel(error).catch((err) => {
+	      if (err.code === 'ERR_INVALID_STATE') {
+	        // Node bug?
+	        return
+	      }
+	      throw err
+	    });
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#fetching
+	function fetching ({
+	  request,
+	  processRequestBodyChunkLength,
+	  processRequestEndOfBody,
+	  processResponse,
+	  processResponseEndOfBody,
+	  processResponseConsumeBody,
+	  useParallelQueue = false,
+	  dispatcher = getGlobalDispatcher() // undici
+	}) {
+	  // Ensure that the dispatcher is set accordingly
+	  assert(dispatcher);
+
+	  // 1. Let taskDestination be null.
+	  let taskDestination = null;
+
+	  // 2. Let crossOriginIsolatedCapability be false.
+	  let crossOriginIsolatedCapability = false;
+
+	  // 3. If request’s client is non-null, then:
+	  if (request.client != null) {
+	    // 1. Set taskDestination to request’s client’s global object.
+	    taskDestination = request.client.globalObject;
+
+	    // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin
+	    // isolated capability.
+	    crossOriginIsolatedCapability =
+	      request.client.crossOriginIsolatedCapability;
+	  }
+
+	  // 4. If useParallelQueue is true, then set taskDestination to the result of
+	  // starting a new parallel queue.
+	  // TODO
+
+	  // 5. Let timingInfo be a new fetch timing info whose start time and
+	  // post-redirect start time are the coarsened shared current time given
+	  // crossOriginIsolatedCapability.
+	  const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability);
+	  const timingInfo = createOpaqueTimingInfo({
+	    startTime: currentTime
+	  });
+
+	  // 6. Let fetchParams be a new fetch params whose
+	  // request is request,
+	  // timing info is timingInfo,
+	  // process request body chunk length is processRequestBodyChunkLength,
+	  // process request end-of-body is processRequestEndOfBody,
+	  // process response is processResponse,
+	  // process response consume body is processResponseConsumeBody,
+	  // process response end-of-body is processResponseEndOfBody,
+	  // task destination is taskDestination,
+	  // and cross-origin isolated capability is crossOriginIsolatedCapability.
+	  const fetchParams = {
+	    controller: new Fetch(dispatcher),
+	    request,
+	    timingInfo,
+	    processRequestBodyChunkLength,
+	    processRequestEndOfBody,
+	    processResponse,
+	    processResponseConsumeBody,
+	    processResponseEndOfBody,
+	    taskDestination,
+	    crossOriginIsolatedCapability
+	  };
+
+	  // 7. If request’s body is a byte sequence, then set request’s body to
+	  //    request’s body as a body.
+	  // NOTE: Since fetching is only called from fetch, body should already be
+	  // extracted.
+	  assert(!request.body || request.body.stream);
+
+	  // 8. If request’s window is "client", then set request’s window to request’s
+	  // client, if request’s client’s global object is a Window object; otherwise
+	  // "no-window".
+	  if (request.window === 'client') {
+	    // TODO: What if request.client is null?
+	    request.window =
+	      request.client?.globalObject?.constructor?.name === 'Window'
+	        ? request.client
+	        : 'no-window';
+	  }
+
+	  // 9. If request’s origin is "client", then set request’s origin to request’s
+	  // client’s origin.
+	  if (request.origin === 'client') {
+	    request.origin = request.client.origin;
+	  }
+
+	  // 10. If all of the following conditions are true:
+	  // TODO
+
+	  // 11. If request’s policy container is "client", then:
+	  if (request.policyContainer === 'client') {
+	    // 1. If request’s client is non-null, then set request’s policy
+	    // container to a clone of request’s client’s policy container. [HTML]
+	    if (request.client != null) {
+	      request.policyContainer = clonePolicyContainer(
+	        request.client.policyContainer
+	      );
+	    } else {
+	      // 2. Otherwise, set request’s policy container to a new policy
+	      // container.
+	      request.policyContainer = makePolicyContainer();
+	    }
+	  }
+
+	  // 12. If request’s header list does not contain `Accept`, then:
+	  if (!request.headersList.contains('accept', true)) {
+	    // 1. Let value be `*/*`.
+	    const value = '*/*';
+
+	    // 2. A user agent should set value to the first matching statement, if
+	    // any, switching on request’s destination:
+	    // "document"
+	    // "frame"
+	    // "iframe"
+	    // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`
+	    // "image"
+	    // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`
+	    // "style"
+	    // `text/css,*/*;q=0.1`
+	    // TODO
+
+	    // 3. Append `Accept`/value to request’s header list.
+	    request.headersList.append('accept', value, true);
+	  }
+
+	  // 13. If request’s header list does not contain `Accept-Language`, then
+	  // user agents should append `Accept-Language`/an appropriate value to
+	  // request’s header list.
+	  if (!request.headersList.contains('accept-language', true)) {
+	    request.headersList.append('accept-language', '*', true);
+	  }
+
+	  // 14. If request’s priority is null, then use request’s initiator and
+	  // destination appropriately in setting request’s priority to a
+	  // user-agent-defined object.
+	  if (request.priority === null) ;
+
+	  // 15. If request is a subresource request, then:
+	  if (subresourceSet.has(request.destination)) ;
+
+	  // 16. Run main fetch given fetchParams.
+	  mainFetch(fetchParams)
+	    .catch(err => {
+	      fetchParams.controller.terminate(err);
+	    });
+
+	  // 17. Return fetchParam's controller
+	  return fetchParams.controller
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-main-fetch
+	async function mainFetch (fetchParams, recursive = false) {
+	  // 1. Let request be fetchParams’s request.
+	  const request = fetchParams.request;
+
+	  // 2. Let response be null.
+	  let response = null;
+
+	  // 3. If request’s local-URLs-only flag is set and request’s current URL is
+	  // not local, then set response to a network error.
+	  if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {
+	    response = makeNetworkError('local URLs only');
+	  }
+
+	  // 4. Run report Content Security Policy violations for request.
+	  // TODO
+
+	  // 5. Upgrade request to a potentially trustworthy URL, if appropriate.
+	  tryUpgradeRequestToAPotentiallyTrustworthyURL(request);
+
+	  // 6. If should request be blocked due to a bad port, should fetching request
+	  // be blocked as mixed content, or should request be blocked by Content
+	  // Security Policy returns blocked, then set response to a network error.
+	  if (requestBadPort(request) === 'blocked') {
+	    response = makeNetworkError('bad port');
+	  }
+	  // TODO: should fetching request be blocked as mixed content?
+	  // TODO: should request be blocked by Content Security Policy?
+
+	  // 7. If request’s referrer policy is the empty string, then set request’s
+	  // referrer policy to request’s policy container’s referrer policy.
+	  if (request.referrerPolicy === '') {
+	    request.referrerPolicy = request.policyContainer.referrerPolicy;
+	  }
+
+	  // 8. If request’s referrer is not "no-referrer", then set request’s
+	  // referrer to the result of invoking determine request’s referrer.
+	  if (request.referrer !== 'no-referrer') {
+	    request.referrer = determineRequestsReferrer(request);
+	  }
+
+	  // 9. Set request’s current URL’s scheme to "https" if all of the following
+	  // conditions are true:
+	  // - request’s current URL’s scheme is "http"
+	  // - request’s current URL’s host is a domain
+	  // - Matching request’s current URL’s host per Known HSTS Host Domain Name
+	  //   Matching results in either a superdomain match with an asserted
+	  //   includeSubDomains directive or a congruent match (with or without an
+	  //   asserted includeSubDomains directive). [HSTS]
+	  // TODO
+
+	  // 10. If recursive is false, then run the remaining steps in parallel.
+	  // TODO
+
+	  // 11. If response is null, then set response to the result of running
+	  // the steps corresponding to the first matching statement:
+	  if (response === null) {
+	    response = await (async () => {
+	      const currentURL = requestCurrentURL(request);
+
+	      if (
+	        // - request’s current URL’s origin is same origin with request’s origin,
+	        //   and request’s response tainting is "basic"
+	        (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||
+	        // request’s current URL’s scheme is "data"
+	        (currentURL.protocol === 'data:') ||
+	        // - request’s mode is "navigate" or "websocket"
+	        (request.mode === 'navigate' || request.mode === 'websocket')
+	      ) {
+	        // 1. Set request’s response tainting to "basic".
+	        request.responseTainting = 'basic';
+
+	        // 2. Return the result of running scheme fetch given fetchParams.
+	        return await schemeFetch(fetchParams)
+	      }
+
+	      // request’s mode is "same-origin"
+	      if (request.mode === 'same-origin') {
+	        // 1. Return a network error.
+	        return makeNetworkError('request mode cannot be "same-origin"')
+	      }
+
+	      // request’s mode is "no-cors"
+	      if (request.mode === 'no-cors') {
+	        // 1. If request’s redirect mode is not "follow", then return a network
+	        // error.
+	        if (request.redirect !== 'follow') {
+	          return makeNetworkError(
+	            'redirect mode cannot be "follow" for "no-cors" request'
+	          )
+	        }
+
+	        // 2. Set request’s response tainting to "opaque".
+	        request.responseTainting = 'opaque';
+
+	        // 3. Return the result of running scheme fetch given fetchParams.
+	        return await schemeFetch(fetchParams)
+	      }
+
+	      // request’s current URL’s scheme is not an HTTP(S) scheme
+	      if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {
+	        // Return a network error.
+	        return makeNetworkError('URL scheme must be a HTTP(S) scheme')
+	      }
+
+	      // - request’s use-CORS-preflight flag is set
+	      // - request’s unsafe-request flag is set and either request’s method is
+	      //   not a CORS-safelisted method or CORS-unsafe request-header names with
+	      //   request’s header list is not empty
+	      //    1. Set request’s response tainting to "cors".
+	      //    2. Let corsWithPreflightResponse be the result of running HTTP fetch
+	      //    given fetchParams and true.
+	      //    3. If corsWithPreflightResponse is a network error, then clear cache
+	      //    entries using request.
+	      //    4. Return corsWithPreflightResponse.
+	      // TODO
+
+	      // Otherwise
+	      //    1. Set request’s response tainting to "cors".
+	      request.responseTainting = 'cors';
+
+	      //    2. Return the result of running HTTP fetch given fetchParams.
+	      return await httpFetch(fetchParams)
+	    })();
+	  }
+
+	  // 12. If recursive is true, then return response.
+	  if (recursive) {
+	    return response
+	  }
+
+	  // 13. If response is not a network error and response is not a filtered
+	  // response, then:
+	  if (response.status !== 0 && !response.internalResponse) {
+	    // If request’s response tainting is "cors", then:
+	    if (request.responseTainting === 'cors') ;
+
+	    // Set response to the following filtered response with response as its
+	    // internal response, depending on request’s response tainting:
+	    if (request.responseTainting === 'basic') {
+	      response = filterResponse(response, 'basic');
+	    } else if (request.responseTainting === 'cors') {
+	      response = filterResponse(response, 'cors');
+	    } else if (request.responseTainting === 'opaque') {
+	      response = filterResponse(response, 'opaque');
+	    } else {
+	      assert(false);
+	    }
+	  }
+
+	  // 14. Let internalResponse be response, if response is a network error,
+	  // and response’s internal response otherwise.
+	  let internalResponse =
+	    response.status === 0 ? response : response.internalResponse;
+
+	  // 15. If internalResponse’s URL list is empty, then set it to a clone of
+	  // request’s URL list.
+	  if (internalResponse.urlList.length === 0) {
+	    internalResponse.urlList.push(...request.urlList);
+	  }
+
+	  // 16. If request’s timing allow failed flag is unset, then set
+	  // internalResponse’s timing allow passed flag.
+	  if (!request.timingAllowFailed) {
+	    response.timingAllowPassed = true;
+	  }
+
+	  // 17. If response is not a network error and any of the following returns
+	  // blocked
+	  // - should internalResponse to request be blocked as mixed content
+	  // - should internalResponse to request be blocked by Content Security Policy
+	  // - should internalResponse to request be blocked due to its MIME type
+	  // - should internalResponse to request be blocked due to nosniff
+	  // TODO
+
+	  // 18. If response’s type is "opaque", internalResponse’s status is 206,
+	  // internalResponse’s range-requested flag is set, and request’s header
+	  // list does not contain `Range`, then set response and internalResponse
+	  // to a network error.
+	  if (
+	    response.type === 'opaque' &&
+	    internalResponse.status === 206 &&
+	    internalResponse.rangeRequested &&
+	    !request.headers.contains('range', true)
+	  ) {
+	    response = internalResponse = makeNetworkError();
+	  }
+
+	  // 19. If response is not a network error and either request’s method is
+	  // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,
+	  // set internalResponse’s body to null and disregard any enqueuing toward
+	  // it (if any).
+	  if (
+	    response.status !== 0 &&
+	    (request.method === 'HEAD' ||
+	      request.method === 'CONNECT' ||
+	      nullBodyStatus.includes(internalResponse.status))
+	  ) {
+	    internalResponse.body = null;
+	    fetchParams.controller.dump = true;
+	  }
+
+	  // 20. If request’s integrity metadata is not the empty string, then:
+	  if (request.integrity) {
+	    // 1. Let processBodyError be this step: run fetch finale given fetchParams
+	    // and a network error.
+	    const processBodyError = (reason) =>
+	      fetchFinale(fetchParams, makeNetworkError(reason));
+
+	    // 2. If request’s response tainting is "opaque", or response’s body is null,
+	    // then run processBodyError and abort these steps.
+	    if (request.responseTainting === 'opaque' || response.body == null) {
+	      processBodyError(response.error);
+	      return
+	    }
+
+	    // 3. Let processBody given bytes be these steps:
+	    const processBody = (bytes) => {
+	      // 1. If bytes do not match request’s integrity metadata,
+	      // then run processBodyError and abort these steps. [SRI]
+	      if (!bytesMatch(bytes, request.integrity)) {
+	        processBodyError('integrity mismatch');
+	        return
+	      }
+
+	      // 2. Set response’s body to bytes as a body.
+	      response.body = safelyExtractBody(bytes)[0];
+
+	      // 3. Run fetch finale given fetchParams and response.
+	      fetchFinale(fetchParams, response);
+	    };
+
+	    // 4. Fully read response’s body given processBody and processBodyError.
+	    await fullyReadBody(response.body, processBody, processBodyError);
+	  } else {
+	    // 21. Otherwise, run fetch finale given fetchParams and response.
+	    fetchFinale(fetchParams, response);
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#concept-scheme-fetch
+	// given a fetch params fetchParams
+	function schemeFetch (fetchParams) {
+	  // Note: since the connection is destroyed on redirect, which sets fetchParams to a
+	  // cancelled state, we do not want this condition to trigger *unless* there have been
+	  // no redirects. See https://github.com/nodejs/undici/issues/1776
+	  // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.
+	  if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
+	    return Promise.resolve(makeAppropriateNetworkError(fetchParams))
+	  }
+
+	  // 2. Let request be fetchParams’s request.
+	  const { request } = fetchParams;
+
+	  const { protocol: scheme } = requestCurrentURL(request);
+
+	  // 3. Switch on request’s current URL’s scheme and run the associated steps:
+	  switch (scheme) {
+	    case 'about:': {
+	      // If request’s current URL’s path is the string "blank", then return a new response
+	      // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,
+	      // and body is the empty byte sequence as a body.
+
+	      // Otherwise, return a network error.
+	      return Promise.resolve(makeNetworkError('about scheme is not supported'))
+	    }
+	    case 'blob:': {
+	      if (!resolveObjectURL) {
+	        resolveObjectURL = require$$0$6.resolveObjectURL;
+	      }
+
+	      // 1. Let blobURLEntry be request’s current URL’s blob URL entry.
+	      const blobURLEntry = requestCurrentURL(request);
+
+	      // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56
+	      // Buffer.resolveObjectURL does not ignore URL queries.
+	      if (blobURLEntry.search.length !== 0) {
+	        return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))
+	      }
+
+	      const blob = resolveObjectURL(blobURLEntry.toString());
+
+	      // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s
+	      //    object is not a Blob object, then return a network error.
+	      if (request.method !== 'GET' || !isBlobLike(blob)) {
+	        return Promise.resolve(makeNetworkError('invalid method'))
+	      }
+
+	      // 3. Let blob be blobURLEntry’s object.
+	      // Note: done above
+
+	      // 4. Let response be a new response.
+	      const response = makeResponse();
+
+	      // 5. Let fullLength be blob’s size.
+	      const fullLength = blob.size;
+
+	      // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded.
+	      const serializedFullLength = isomorphicEncode(`${fullLength}`);
+
+	      // 7. Let type be blob’s type.
+	      const type = blob.type;
+
+	      // 8. If request’s header list does not contain `Range`:
+	      // 9. Otherwise:
+	      if (!request.headersList.contains('range', true)) {
+	        // 1. Let bodyWithType be the result of safely extracting blob.
+	        // Note: in the FileAPI a blob "object" is a Blob *or* a MediaSource.
+	        // In node, this can only ever be a Blob. Therefore we can safely
+	        // use extractBody directly.
+	        const bodyWithType = extractBody(blob);
+
+	        // 2. Set response’s status message to `OK`.
+	        response.statusText = 'OK';
+
+	        // 3. Set response’s body to bodyWithType’s body.
+	        response.body = bodyWithType[0];
+
+	        // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ».
+	        response.headersList.set('content-length', serializedFullLength, true);
+	        response.headersList.set('content-type', type, true);
+	      } else {
+	        // 1. Set response’s range-requested flag.
+	        response.rangeRequested = true;
+
+	        // 2. Let rangeHeader be the result of getting `Range` from request’s header list.
+	        const rangeHeader = request.headersList.get('range', true);
+
+	        // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true.
+	        const rangeValue = simpleRangeHeaderValue(rangeHeader, true);
+
+	        // 4. If rangeValue is failure, then return a network error.
+	        if (rangeValue === 'failure') {
+	          return Promise.resolve(makeNetworkError('failed to fetch the data URL'))
+	        }
+
+	        // 5. Let (rangeStart, rangeEnd) be rangeValue.
+	        let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue;
+
+	        // 6. If rangeStart is null:
+	        // 7. Otherwise:
+	        if (rangeStart === null) {
+	          // 1. Set rangeStart to fullLength − rangeEnd.
+	          rangeStart = fullLength - rangeEnd;
+
+	          // 2. Set rangeEnd to rangeStart + rangeEnd − 1.
+	          rangeEnd = rangeStart + rangeEnd - 1;
+	        } else {
+	          // 1. If rangeStart is greater than or equal to fullLength, then return a network error.
+	          if (rangeStart >= fullLength) {
+	            return Promise.resolve(makeNetworkError('Range start is greater than the blob\'s size.'))
+	          }
+
+	          // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set
+	          //    rangeEnd to fullLength − 1.
+	          if (rangeEnd === null || rangeEnd >= fullLength) {
+	            rangeEnd = fullLength - 1;
+	          }
+	        }
+
+	        // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart,
+	        //    rangeEnd + 1, and type.
+	        const slicedBlob = blob.slice(rangeStart, rangeEnd, type);
+
+	        // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob.
+	        // Note: same reason as mentioned above as to why we use extractBody
+	        const slicedBodyWithType = extractBody(slicedBlob);
+
+	        // 10. Set response’s body to slicedBodyWithType’s body.
+	        response.body = slicedBodyWithType[0];
+
+	        // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded.
+	        const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`);
+
+	        // 12. Let contentRange be the result of invoking build a content range given rangeStart,
+	        //     rangeEnd, and fullLength.
+	        const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength);
+
+	        // 13. Set response’s status to 206.
+	        response.status = 206;
+
+	        // 14. Set response’s status message to `Partial Content`.
+	        response.statusText = 'Partial Content';
+
+	        // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength),
+	        //     (`Content-Type`, type), (`Content-Range`, contentRange) ».
+	        response.headersList.set('content-length', serializedSlicedLength, true);
+	        response.headersList.set('content-type', type, true);
+	        response.headersList.set('content-range', contentRange, true);
+	      }
+
+	      // 10. Return response.
+	      return Promise.resolve(response)
+	    }
+	    case 'data:': {
+	      // 1. Let dataURLStruct be the result of running the
+	      //    data: URL processor on request’s current URL.
+	      const currentURL = requestCurrentURL(request);
+	      const dataURLStruct = dataURLProcessor(currentURL);
+
+	      // 2. If dataURLStruct is failure, then return a
+	      //    network error.
+	      if (dataURLStruct === 'failure') {
+	        return Promise.resolve(makeNetworkError('failed to fetch the data URL'))
+	      }
+
+	      // 3. Let mimeType be dataURLStruct’s MIME type, serialized.
+	      const mimeType = serializeAMimeType(dataURLStruct.mimeType);
+
+	      // 4. Return a response whose status message is `OK`,
+	      //    header list is « (`Content-Type`, mimeType) »,
+	      //    and body is dataURLStruct’s body as a body.
+	      return Promise.resolve(makeResponse({
+	        statusText: 'OK',
+	        headersList: [
+	          ['content-type', { name: 'Content-Type', value: mimeType }]
+	        ],
+	        body: safelyExtractBody(dataURLStruct.body)[0]
+	      }))
+	    }
+	    case 'file:': {
+	      // For now, unfortunate as it is, file URLs are left as an exercise for the reader.
+	      // When in doubt, return a network error.
+	      return Promise.resolve(makeNetworkError('not implemented... yet...'))
+	    }
+	    case 'http:':
+	    case 'https:': {
+	      // Return the result of running HTTP fetch given fetchParams.
+
+	      return httpFetch(fetchParams)
+	        .catch((err) => makeNetworkError(err))
+	    }
+	    default: {
+	      return Promise.resolve(makeNetworkError('unknown scheme'))
+	    }
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#finalize-response
+	function finalizeResponse (fetchParams, response) {
+	  // 1. Set fetchParams’s request’s done flag.
+	  fetchParams.request.done = true;
+
+	  // 2, If fetchParams’s process response done is not null, then queue a fetch
+	  // task to run fetchParams’s process response done given response, with
+	  // fetchParams’s task destination.
+	  if (fetchParams.processResponseDone != null) {
+	    queueMicrotask(() => fetchParams.processResponseDone(response));
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#fetch-finale
+	function fetchFinale (fetchParams, response) {
+	  // 1. Let timingInfo be fetchParams’s timing info.
+	  let timingInfo = fetchParams.timingInfo;
+
+	  // 2. If response is not a network error and fetchParams’s request’s client is a secure context,
+	  //    then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting
+	  //    `Server-Timing` from response’s internal response’s header list.
+	  // TODO
+
+	  // 3. Let processResponseEndOfBody be the following steps:
+	  const processResponseEndOfBody = () => {
+	    // 1. Let unsafeEndTime be the unsafe shared current time.
+	    const unsafeEndTime = Date.now(); // ?
+
+	    // 2. If fetchParams’s request’s destination is "document", then set fetchParams’s controller’s
+	    //    full timing info to fetchParams’s timing info.
+	    if (fetchParams.request.destination === 'document') {
+	      fetchParams.controller.fullTimingInfo = timingInfo;
+	    }
+
+	    // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global:
+	    fetchParams.controller.reportTimingSteps = () => {
+	      // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return.
+	      if (fetchParams.request.url.protocol !== 'https:') {
+	        return
+	      }
+
+	      // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global.
+	      timingInfo.endTime = unsafeEndTime;
+
+	      // 3. Let cacheState be response’s cache state.
+	      let cacheState = response.cacheState;
+
+	      // 4. Let bodyInfo be response’s body info.
+	      const bodyInfo = response.bodyInfo;
+
+	      // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an
+	      //    opaque timing info for timingInfo and set cacheState to the empty string.
+	      if (!response.timingAllowPassed) {
+	        timingInfo = createOpaqueTimingInfo(timingInfo);
+
+	        cacheState = '';
+	      }
+
+	      // 6. Let responseStatus be 0.
+	      let responseStatus = 0;
+
+	      // 7. If fetchParams’s request’s mode is not "navigate" or response’s has-cross-origin-redirects is false:
+	      if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) {
+	        // 1. Set responseStatus to response’s status.
+	        responseStatus = response.status;
+
+	        // 2. Let mimeType be the result of extracting a MIME type from response’s header list.
+	        const mimeType = extractMimeType(response.headersList);
+
+	        // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType.
+	        if (mimeType !== 'failure') {
+	          bodyInfo.contentType = minimizeSupportedMimeType(mimeType);
+	        }
+	      }
+
+	      // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo,
+	      //    fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo,
+	      //    and responseStatus.
+	      if (fetchParams.request.initiatorType != null) {
+	        // TODO: update markresourcetiming
+	        markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus);
+	      }
+	    };
+
+	    // 4. Let processResponseEndOfBodyTask be the following steps:
+	    const processResponseEndOfBodyTask = () => {
+	      // 1. Set fetchParams’s request’s done flag.
+	      fetchParams.request.done = true;
+
+	      // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process
+	      //    response end-of-body given response.
+	      if (fetchParams.processResponseEndOfBody != null) {
+	        queueMicrotask(() => fetchParams.processResponseEndOfBody(response));
+	      }
+
+	      // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s
+	      //    global object is fetchParams’s task destination, then run fetchParams’s controller’s report
+	      //    timing steps given fetchParams’s request’s client’s global object.
+	      if (fetchParams.request.initiatorType != null) {
+	        fetchParams.controller.reportTimingSteps();
+	      }
+	    };
+
+	    // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination
+	    queueMicrotask(() => processResponseEndOfBodyTask());
+	  };
+
+	  // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s
+	  //    process response given response, with fetchParams’s task destination.
+	  if (fetchParams.processResponse != null) {
+	    queueMicrotask(() => {
+	      fetchParams.processResponse(response);
+	      fetchParams.processResponse = null;
+	    });
+	  }
+
+	  // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response.
+	  const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response);
+
+	  // 6. If internalResponse’s body is null, then run processResponseEndOfBody.
+	  // 7. Otherwise:
+	  if (internalResponse.body == null) {
+	    processResponseEndOfBody();
+	  } else {
+	    // mcollina: all the following steps of the specs are skipped.
+	    // The internal transform stream is not needed.
+	    // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541
+
+	    // 1. Let transformStream be a new TransformStream.
+	    // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream.
+	    // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm
+	    //    set to processResponseEndOfBody.
+	    // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream.
+
+	    finished(internalResponse.body.stream, () => {
+	      processResponseEndOfBody();
+	    });
+	  }
+	}
+
+	// https://fetch.spec.whatwg.org/#http-fetch
+	async function httpFetch (fetchParams) {
+	  // 1. Let request be fetchParams’s request.
+	  const request = fetchParams.request;
+
+	  // 2. Let response be null.
+	  let response = null;
+
+	  // 3. Let actualResponse be null.
+	  let actualResponse = null;
+
+	  // 4. Let timingInfo be fetchParams’s timing info.
+	  const timingInfo = fetchParams.timingInfo;
+
+	  // 5. If request’s service-workers mode is "all", then:
+	  if (request.serviceWorkers === 'all') ;
+
+	  // 6. If response is null, then:
+	  if (response === null) {
+	    // 1. If makeCORSPreflight is true and one of these conditions is true:
+	    // TODO
+
+	    // 2. If request’s redirect mode is "follow", then set request’s
+	    // service-workers mode to "none".
+	    if (request.redirect === 'follow') {
+	      request.serviceWorkers = 'none';
+	    }
+
+	    // 3. Set response and actualResponse to the result of running
+	    // HTTP-network-or-cache fetch given fetchParams.
+	    actualResponse = response = await httpNetworkOrCacheFetch(fetchParams);
+
+	    // 4. If request’s response tainting is "cors" and a CORS check
+	    // for request and response returns failure, then return a network error.
+	    if (
+	      request.responseTainting === 'cors' &&
+	      corsCheck(request, response) === 'failure'
+	    ) {
+	      return makeNetworkError('cors failure')
+	    }
+
+	    // 5. If the TAO check for request and response returns failure, then set
+	    // request’s timing allow failed flag.
+	    if (TAOCheck(request, response) === 'failure') {
+	      request.timingAllowFailed = true;
+	    }
+	  }
+
+	  // 7. If either request’s response tainting or response’s type
+	  // is "opaque", and the cross-origin resource policy check with
+	  // request’s origin, request’s client, request’s destination,
+	  // and actualResponse returns blocked, then return a network error.
+	  if (
+	    (request.responseTainting === 'opaque' || response.type === 'opaque') &&
+	    crossOriginResourcePolicyCheck(
+	      request.origin,
+	      request.client,
+	      request.destination,
+	      actualResponse
+	    ) === 'blocked'
+	  ) {
+	    return makeNetworkError('blocked')
+	  }
+
+	  // 8. If actualResponse’s status is a redirect status, then:
+	  if (redirectStatusSet.has(actualResponse.status)) {
+	    // 1. If actualResponse’s status is not 303, request’s body is not null,
+	    // and the connection uses HTTP/2, then user agents may, and are even
+	    // encouraged to, transmit an RST_STREAM frame.
+	    // See, https://github.com/whatwg/fetch/issues/1288
+	    if (request.redirect !== 'manual') {
+	      fetchParams.controller.connection.destroy(undefined, false);
+	    }
+
+	    // 2. Switch on request’s redirect mode:
+	    if (request.redirect === 'error') {
+	      // Set response to a network error.
+	      response = makeNetworkError('unexpected redirect');
+	    } else if (request.redirect === 'manual') {
+	      // Set response to an opaque-redirect filtered response whose internal
+	      // response is actualResponse.
+	      // NOTE(spec): On the web this would return an `opaqueredirect` response,
+	      // but that doesn't make sense server side.
+	      // See https://github.com/nodejs/undici/issues/1193.
+	      response = actualResponse;
+	    } else if (request.redirect === 'follow') {
+	      // Set response to the result of running HTTP-redirect fetch given
+	      // fetchParams and response.
+	      response = await httpRedirectFetch(fetchParams, response);
+	    } else {
+	      assert(false);
+	    }
+	  }
+
+	  // 9. Set response’s timing info to timingInfo.
+	  response.timingInfo = timingInfo;
+
+	  // 10. Return response.
+	  return response
+	}
+
+	// https://fetch.spec.whatwg.org/#http-redirect-fetch
+	function httpRedirectFetch (fetchParams, response) {
+	  // 1. Let request be fetchParams’s request.
+	  const request = fetchParams.request;
+
+	  // 2. Let actualResponse be response, if response is not a filtered response,
+	  // and response’s internal response otherwise.
+	  const actualResponse = response.internalResponse
+	    ? response.internalResponse
+	    : response;
+
+	  // 3. Let locationURL be actualResponse’s location URL given request’s current
+	  // URL’s fragment.
+	  let locationURL;
+
+	  try {
+	    locationURL = responseLocationURL(
+	      actualResponse,
+	      requestCurrentURL(request).hash
+	    );
+
+	    // 4. If locationURL is null, then return response.
+	    if (locationURL == null) {
+	      return response
+	    }
+	  } catch (err) {
+	    // 5. If locationURL is failure, then return a network error.
+	    return Promise.resolve(makeNetworkError(err))
+	  }
+
+	  // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network
+	  // error.
+	  if (!urlIsHttpHttpsScheme(locationURL)) {
+	    return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))
+	  }
+
+	  // 7. If request’s redirect count is 20, then return a network error.
+	  if (request.redirectCount === 20) {
+	    return Promise.resolve(makeNetworkError('redirect count exceeded'))
+	  }
+
+	  // 8. Increase request’s redirect count by 1.
+	  request.redirectCount += 1;
+
+	  // 9. If request’s mode is "cors", locationURL includes credentials, and
+	  // request’s origin is not same origin with locationURL’s origin, then return
+	  //  a network error.
+	  if (
+	    request.mode === 'cors' &&
+	    (locationURL.username || locationURL.password) &&
+	    !sameOrigin(request, locationURL)
+	  ) {
+	    return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'))
+	  }
+
+	  // 10. If request’s response tainting is "cors" and locationURL includes
+	  // credentials, then return a network error.
+	  if (
+	    request.responseTainting === 'cors' &&
+	    (locationURL.username || locationURL.password)
+	  ) {
+	    return Promise.resolve(makeNetworkError(
+	      'URL cannot contain credentials for request mode "cors"'
+	    ))
+	  }
+
+	  // 11. If actualResponse’s status is not 303, request’s body is non-null,
+	  // and request’s body’s source is null, then return a network error.
+	  if (
+	    actualResponse.status !== 303 &&
+	    request.body != null &&
+	    request.body.source == null
+	  ) {
+	    return Promise.resolve(makeNetworkError())
+	  }
+
+	  // 12. If one of the following is true
+	  // - actualResponse’s status is 301 or 302 and request’s method is `POST`
+	  // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`
+	  if (
+	    ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||
+	    (actualResponse.status === 303 &&
+	      !GET_OR_HEAD.includes(request.method))
+	  ) {
+	    // then:
+	    // 1. Set request’s method to `GET` and request’s body to null.
+	    request.method = 'GET';
+	    request.body = null;
+
+	    // 2. For each headerName of request-body-header name, delete headerName from
+	    // request’s header list.
+	    for (const headerName of requestBodyHeader) {
+	      request.headersList.delete(headerName);
+	    }
+	  }
+
+	  // 13. If request’s current URL’s origin is not same origin with locationURL’s
+	  //     origin, then for each headerName of CORS non-wildcard request-header name,
+	  //     delete headerName from request’s header list.
+	  if (!sameOrigin(requestCurrentURL(request), locationURL)) {
+	    // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name
+	    request.headersList.delete('authorization', true);
+
+	    // https://fetch.spec.whatwg.org/#authentication-entries
+	    request.headersList.delete('proxy-authorization', true);
+
+	    // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement.
+	    request.headersList.delete('cookie', true);
+	    request.headersList.delete('host', true);
+	  }
+
+	  // 14. If request’s body is non-null, then set request’s body to the first return
+	  // value of safely extracting request’s body’s source.
+	  if (request.body != null) {
+	    assert(request.body.source != null);
+	    request.body = safelyExtractBody(request.body.source)[0];
+	  }
+
+	  // 15. Let timingInfo be fetchParams’s timing info.
+	  const timingInfo = fetchParams.timingInfo;
+
+	  // 16. Set timingInfo’s redirect end time and post-redirect start time to the
+	  // coarsened shared current time given fetchParams’s cross-origin isolated
+	  // capability.
+	  timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =
+	    coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability);
+
+	  // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s
+	  //  redirect start time to timingInfo’s start time.
+	  if (timingInfo.redirectStartTime === 0) {
+	    timingInfo.redirectStartTime = timingInfo.startTime;
+	  }
+
+	  // 18. Append locationURL to request’s URL list.
+	  request.urlList.push(locationURL);
+
+	  // 19. Invoke set request’s referrer policy on redirect on request and
+	  // actualResponse.
+	  setRequestReferrerPolicyOnRedirect(request, actualResponse);
+
+	  // 20. Return the result of running main fetch given fetchParams and true.
+	  return mainFetch(fetchParams, true)
+	}
+
+	// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch
+	async function httpNetworkOrCacheFetch (
+	  fetchParams,
+	  isAuthenticationFetch = false,
+	  isNewConnectionFetch = false
+	) {
+	  // 1. Let request be fetchParams’s request.
+	  const request = fetchParams.request;
+
+	  // 2. Let httpFetchParams be null.
+	  let httpFetchParams = null;
+
+	  // 3. Let httpRequest be null.
+	  let httpRequest = null;
+
+	  // 4. Let response be null.
+	  let response = null;
+
+	  // 8. Run these steps, but abort when the ongoing fetch is terminated:
+
+	  //    1. If request’s window is "no-window" and request’s redirect mode is
+	  //    "error", then set httpFetchParams to fetchParams and httpRequest to
+	  //    request.
+	  if (request.window === 'no-window' && request.redirect === 'error') {
+	    httpFetchParams = fetchParams;
+	    httpRequest = request;
+	  } else {
+	    // Otherwise:
+
+	    // 1. Set httpRequest to a clone of request.
+	    httpRequest = cloneRequest(request);
+
+	    // 2. Set httpFetchParams to a copy of fetchParams.
+	    httpFetchParams = { ...fetchParams };
+
+	    // 3. Set httpFetchParams’s request to httpRequest.
+	    httpFetchParams.request = httpRequest;
+	  }
+
+	  //    3. Let includeCredentials be true if one of
+	  const includeCredentials =
+	    request.credentials === 'include' ||
+	    (request.credentials === 'same-origin' &&
+	      request.responseTainting === 'basic');
+
+	  //    4. Let contentLength be httpRequest’s body’s length, if httpRequest’s
+	  //    body is non-null; otherwise null.
+	  const contentLength = httpRequest.body ? httpRequest.body.length : null;
+
+	  //    5. Let contentLengthHeaderValue be null.
+	  let contentLengthHeaderValue = null;
+
+	  //    6. If httpRequest’s body is null and httpRequest’s method is `POST` or
+	  //    `PUT`, then set contentLengthHeaderValue to `0`.
+	  if (
+	    httpRequest.body == null &&
+	    ['POST', 'PUT'].includes(httpRequest.method)
+	  ) {
+	    contentLengthHeaderValue = '0';
+	  }
+
+	  //    7. If contentLength is non-null, then set contentLengthHeaderValue to
+	  //    contentLength, serialized and isomorphic encoded.
+	  if (contentLength != null) {
+	    contentLengthHeaderValue = isomorphicEncode(`${contentLength}`);
+	  }
+
+	  //    8. If contentLengthHeaderValue is non-null, then append
+	  //    `Content-Length`/contentLengthHeaderValue to httpRequest’s header
+	  //    list.
+	  if (contentLengthHeaderValue != null) {
+	    httpRequest.headersList.append('content-length', contentLengthHeaderValue, true);
+	  }
+
+	  //    9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,
+	  //    contentLengthHeaderValue) to httpRequest’s header list.
+
+	  //    10. If contentLength is non-null and httpRequest’s keepalive is true,
+	  //    then:
+	  if (contentLength != null && httpRequest.keepalive) ;
+
+	  //    11. If httpRequest’s referrer is a URL, then append
+	  //    `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,
+	  //     to httpRequest’s header list.
+	  if (httpRequest.referrer instanceof URL) {
+	    httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true);
+	  }
+
+	  //    12. Append a request `Origin` header for httpRequest.
+	  appendRequestOriginHeader(httpRequest);
+
+	  //    13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]
+	  appendFetchMetadata(httpRequest);
+
+	  //    14. If httpRequest’s header list does not contain `User-Agent`, then
+	  //    user agents should append `User-Agent`/default `User-Agent` value to
+	  //    httpRequest’s header list.
+	  if (!httpRequest.headersList.contains('user-agent', true)) {
+	    httpRequest.headersList.append('user-agent', defaultUserAgent);
+	  }
+
+	  //    15. If httpRequest’s cache mode is "default" and httpRequest’s header
+	  //    list contains `If-Modified-Since`, `If-None-Match`,
+	  //    `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set
+	  //    httpRequest’s cache mode to "no-store".
+	  if (
+	    httpRequest.cache === 'default' &&
+	    (httpRequest.headersList.contains('if-modified-since', true) ||
+	      httpRequest.headersList.contains('if-none-match', true) ||
+	      httpRequest.headersList.contains('if-unmodified-since', true) ||
+	      httpRequest.headersList.contains('if-match', true) ||
+	      httpRequest.headersList.contains('if-range', true))
+	  ) {
+	    httpRequest.cache = 'no-store';
+	  }
+
+	  //    16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent
+	  //    no-cache cache-control header modification flag is unset, and
+	  //    httpRequest’s header list does not contain `Cache-Control`, then append
+	  //    `Cache-Control`/`max-age=0` to httpRequest’s header list.
+	  if (
+	    httpRequest.cache === 'no-cache' &&
+	    !httpRequest.preventNoCacheCacheControlHeaderModification &&
+	    !httpRequest.headersList.contains('cache-control', true)
+	  ) {
+	    httpRequest.headersList.append('cache-control', 'max-age=0', true);
+	  }
+
+	  //    17. If httpRequest’s cache mode is "no-store" or "reload", then:
+	  if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {
+	    // 1. If httpRequest’s header list does not contain `Pragma`, then append
+	    // `Pragma`/`no-cache` to httpRequest’s header list.
+	    if (!httpRequest.headersList.contains('pragma', true)) {
+	      httpRequest.headersList.append('pragma', 'no-cache', true);
+	    }
+
+	    // 2. If httpRequest’s header list does not contain `Cache-Control`,
+	    // then append `Cache-Control`/`no-cache` to httpRequest’s header list.
+	    if (!httpRequest.headersList.contains('cache-control', true)) {
+	      httpRequest.headersList.append('cache-control', 'no-cache', true);
+	    }
+	  }
+
+	  //    18. If httpRequest’s header list contains `Range`, then append
+	  //    `Accept-Encoding`/`identity` to httpRequest’s header list.
+	  if (httpRequest.headersList.contains('range', true)) {
+	    httpRequest.headersList.append('accept-encoding', 'identity', true);
+	  }
+
+	  //    19. Modify httpRequest’s header list per HTTP. Do not append a given
+	  //    header if httpRequest’s header list contains that header’s name.
+	  //    TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129
+	  if (!httpRequest.headersList.contains('accept-encoding', true)) {
+	    if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {
+	      httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true);
+	    } else {
+	      httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true);
+	    }
+	  }
+
+	  httpRequest.headersList.delete('host', true);
+
+	  //    21. If there’s a proxy-authentication entry, use it as appropriate.
+	  //    TODO: proxy-authentication
+
+	  //    22. Set httpCache to the result of determining the HTTP cache
+	  //    partition, given httpRequest.
+	  //    TODO: cache
+
+	  //    23. If httpCache is null, then set httpRequest’s cache mode to
+	  //    "no-store".
+	  {
+	    httpRequest.cache = 'no-store';
+	  }
+
+	  //    24. If httpRequest’s cache mode is neither "no-store" nor "reload",
+	  //    then:
+	  if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') ;
+
+	  // 9. If aborted, then return the appropriate network error for fetchParams.
+	  // TODO
+
+	  // 10. If response is null, then:
+	  if (response == null) {
+	    // 1. If httpRequest’s cache mode is "only-if-cached", then return a
+	    // network error.
+	    if (httpRequest.cache === 'only-if-cached') {
+	      return makeNetworkError('only if cached')
+	    }
+
+	    // 2. Let forwardResponse be the result of running HTTP-network fetch
+	    // given httpFetchParams, includeCredentials, and isNewConnectionFetch.
+	    const forwardResponse = await httpNetworkFetch(
+	      httpFetchParams,
+	      includeCredentials,
+	      isNewConnectionFetch
+	    );
+
+	    // 3. If httpRequest’s method is unsafe and forwardResponse’s status is
+	    // in the range 200 to 399, inclusive, invalidate appropriate stored
+	    // responses in httpCache, as per the "Invalidation" chapter of HTTP
+	    // Caching, and set storedResponse to null. [HTTP-CACHING]
+	    if (
+	      !safeMethodsSet.has(httpRequest.method) &&
+	      forwardResponse.status >= 200 &&
+	      forwardResponse.status <= 399
+	    ) ;
+
+	    // 5. If response is null, then:
+	    if (response == null) {
+	      // 1. Set response to forwardResponse.
+	      response = forwardResponse;
+
+	      // 2. Store httpRequest and forwardResponse in httpCache, as per the
+	      // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING]
+	      // TODO: cache
+	    }
+	  }
+
+	  // 11. Set response’s URL list to a clone of httpRequest’s URL list.
+	  response.urlList = [...httpRequest.urlList];
+
+	  // 12. If httpRequest’s header list contains `Range`, then set response’s
+	  // range-requested flag.
+	  if (httpRequest.headersList.contains('range', true)) {
+	    response.rangeRequested = true;
+	  }
+
+	  // 13. Set response’s request-includes-credentials to includeCredentials.
+	  response.requestIncludesCredentials = includeCredentials;
+
+	  // 14. If response’s status is 401, httpRequest’s response tainting is not
+	  // "cors", includeCredentials is true, and request’s window is an environment
+	  // settings object, then:
+	  // TODO
+
+	  // 15. If response’s status is 407, then:
+	  if (response.status === 407) {
+	    // 1. If request’s window is "no-window", then return a network error.
+	    if (request.window === 'no-window') {
+	      return makeNetworkError()
+	    }
+
+	    // 2. ???
+
+	    // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.
+	    if (isCancelled(fetchParams)) {
+	      return makeAppropriateNetworkError(fetchParams)
+	    }
+
+	    // 4. Prompt the end user as appropriate in request’s window and store
+	    // the result as a proxy-authentication entry. [HTTP-AUTH]
+	    // TODO: Invoke some kind of callback?
+
+	    // 5. Set response to the result of running HTTP-network-or-cache fetch given
+	    // fetchParams.
+	    // TODO
+	    return makeNetworkError('proxy authentication required')
+	  }
+
+	  // 16. If all of the following are true
+	  if (
+	    // response’s status is 421
+	    response.status === 421 &&
+	    // isNewConnectionFetch is false
+	    !isNewConnectionFetch &&
+	    // request’s body is null, or request’s body is non-null and request’s body’s source is non-null
+	    (request.body == null || request.body.source != null)
+	  ) {
+	    // then:
+
+	    // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.
+	    if (isCancelled(fetchParams)) {
+	      return makeAppropriateNetworkError(fetchParams)
+	    }
+
+	    // 2. Set response to the result of running HTTP-network-or-cache
+	    // fetch given fetchParams, isAuthenticationFetch, and true.
+
+	    // TODO (spec): The spec doesn't specify this but we need to cancel
+	    // the active response before we can start a new one.
+	    // https://github.com/whatwg/fetch/issues/1293
+	    fetchParams.controller.connection.destroy();
+
+	    response = await httpNetworkOrCacheFetch(
+	      fetchParams,
+	      isAuthenticationFetch,
+	      true
+	    );
+	  }
+
+	  // 18. Return response.
+	  return response
+	}
+
+	// https://fetch.spec.whatwg.org/#http-network-fetch
+	async function httpNetworkFetch (
+	  fetchParams,
+	  includeCredentials = false,
+	  forceNewConnection = false
+	) {
+	  assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed);
+
+	  fetchParams.controller.connection = {
+	    abort: null,
+	    destroyed: false,
+	    destroy (err, abort = true) {
+	      if (!this.destroyed) {
+	        this.destroyed = true;
+	        if (abort) {
+	          this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'));
+	        }
+	      }
+	    }
+	  };
+
+	  // 1. Let request be fetchParams’s request.
+	  const request = fetchParams.request;
+
+	  // 2. Let response be null.
+	  let response = null;
+
+	  // 3. Let timingInfo be fetchParams’s timing info.
+	  const timingInfo = fetchParams.timingInfo;
+
+	  // 5. If httpCache is null, then set request’s cache mode to "no-store".
+	  {
+	    request.cache = 'no-store';
+	  }
+
+	  // 8. Switch on request’s mode:
+	  if (request.mode === 'websocket') ;
+
+	  // 9. Run these steps, but abort when the ongoing fetch is terminated:
+
+	  //    1. If connection is failure, then return a network error.
+
+	  //    2. Set timingInfo’s final connection timing info to the result of
+	  //    calling clamp and coarsen connection timing info with connection’s
+	  //    timing info, timingInfo’s post-redirect start time, and fetchParams’s
+	  //    cross-origin isolated capability.
+
+	  //    3. If connection is not an HTTP/2 connection, request’s body is non-null,
+	  //    and request’s body’s source is null, then append (`Transfer-Encoding`,
+	  //    `chunked`) to request’s header list.
+
+	  //    4. Set timingInfo’s final network-request start time to the coarsened
+	  //    shared current time given fetchParams’s cross-origin isolated
+	  //    capability.
+
+	  //    5. Set response to the result of making an HTTP request over connection
+	  //    using request with the following caveats:
+
+	  //        - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]
+	  //        [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]
+
+	  //        - If request’s body is non-null, and request’s body’s source is null,
+	  //        then the user agent may have a buffer of up to 64 kibibytes and store
+	  //        a part of request’s body in that buffer. If the user agent reads from
+	  //        request’s body beyond that buffer’s size and the user agent needs to
+	  //        resend request, then instead return a network error.
+
+	  //        - Set timingInfo’s final network-response start time to the coarsened
+	  //        shared current time given fetchParams’s cross-origin isolated capability,
+	  //        immediately after the user agent’s HTTP parser receives the first byte
+	  //        of the response (e.g., frame header bytes for HTTP/2 or response status
+	  //        line for HTTP/1.x).
+
+	  //        - Wait until all the headers are transmitted.
+
+	  //        - Any responses whose status is in the range 100 to 199, inclusive,
+	  //        and is not 101, are to be ignored, except for the purposes of setting
+	  //        timingInfo’s final network-response start time above.
+
+	  //    - If request’s header list contains `Transfer-Encoding`/`chunked` and
+	  //    response is transferred via HTTP/1.0 or older, then return a network
+	  //    error.
+
+	  //    - If the HTTP request results in a TLS client certificate dialog, then:
+
+	  //        1. If request’s window is an environment settings object, make the
+	  //        dialog available in request’s window.
+
+	  //        2. Otherwise, return a network error.
+
+	  // To transmit request’s body body, run these steps:
+	  let requestBody = null;
+	  // 1. If body is null and fetchParams’s process request end-of-body is
+	  // non-null, then queue a fetch task given fetchParams’s process request
+	  // end-of-body and fetchParams’s task destination.
+	  if (request.body == null && fetchParams.processRequestEndOfBody) {
+	    queueMicrotask(() => fetchParams.processRequestEndOfBody());
+	  } else if (request.body != null) {
+	    // 2. Otherwise, if body is non-null:
+
+	    //    1. Let processBodyChunk given bytes be these steps:
+	    const processBodyChunk = async function * (bytes) {
+	      // 1. If the ongoing fetch is terminated, then abort these steps.
+	      if (isCancelled(fetchParams)) {
+	        return
+	      }
+
+	      // 2. Run this step in parallel: transmit bytes.
+	      yield bytes;
+
+	      // 3. If fetchParams’s process request body is non-null, then run
+	      // fetchParams’s process request body given bytes’s length.
+	      fetchParams.processRequestBodyChunkLength?.(bytes.byteLength);
+	    };
+
+	    // 2. Let processEndOfBody be these steps:
+	    const processEndOfBody = () => {
+	      // 1. If fetchParams is canceled, then abort these steps.
+	      if (isCancelled(fetchParams)) {
+	        return
+	      }
+
+	      // 2. If fetchParams’s process request end-of-body is non-null,
+	      // then run fetchParams’s process request end-of-body.
+	      if (fetchParams.processRequestEndOfBody) {
+	        fetchParams.processRequestEndOfBody();
+	      }
+	    };
+
+	    // 3. Let processBodyError given e be these steps:
+	    const processBodyError = (e) => {
+	      // 1. If fetchParams is canceled, then abort these steps.
+	      if (isCancelled(fetchParams)) {
+	        return
+	      }
+
+	      // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller.
+	      if (e.name === 'AbortError') {
+	        fetchParams.controller.abort();
+	      } else {
+	        fetchParams.controller.terminate(e);
+	      }
+	    };
+
+	    // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,
+	    // processBodyError, and fetchParams’s task destination.
+	    requestBody = (async function * () {
+	      try {
+	        for await (const bytes of request.body.stream) {
+	          yield * processBodyChunk(bytes);
+	        }
+	        processEndOfBody();
+	      } catch (err) {
+	        processBodyError(err);
+	      }
+	    })();
+	  }
+
+	  try {
+	    // socket is only provided for websockets
+	    const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody });
+
+	    if (socket) {
+	      response = makeResponse({ status, statusText, headersList, socket });
+	    } else {
+	      const iterator = body[Symbol.asyncIterator]();
+	      fetchParams.controller.next = () => iterator.next();
+
+	      response = makeResponse({ status, statusText, headersList });
+	    }
+	  } catch (err) {
+	    // 10. If aborted, then:
+	    if (err.name === 'AbortError') {
+	      // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.
+	      fetchParams.controller.connection.destroy();
+
+	      // 2. Return the appropriate network error for fetchParams.
+	      return makeAppropriateNetworkError(fetchParams, err)
+	    }
+
+	    return makeNetworkError(err)
+	  }
+
+	  // 11. Let pullAlgorithm be an action that resumes the ongoing fetch
+	  // if it is suspended.
+	  const pullAlgorithm = async () => {
+	    await fetchParams.controller.resume();
+	  };
+
+	  // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s
+	  // controller with reason, given reason.
+	  const cancelAlgorithm = (reason) => {
+	    // If the aborted fetch was already terminated, then we do not
+	    // need to do anything.
+	    if (!isCancelled(fetchParams)) {
+	      fetchParams.controller.abort(reason);
+	    }
+	  };
+
+	  // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by
+	  // the user agent.
+	  // TODO
+
+	  // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object
+	  // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.
+	  // TODO
+
+	  // 15. Let stream be a new ReadableStream.
+	  // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm,
+	  //     cancelAlgorithm set to cancelAlgorithm.
+	  const stream = new ReadableStream(
+	    {
+	      async start (controller) {
+	        fetchParams.controller.controller = controller;
+	      },
+	      async pull (controller) {
+	        await pullAlgorithm();
+	      },
+	      async cancel (reason) {
+	        await cancelAlgorithm(reason);
+	      },
+	      type: 'bytes'
+	    }
+	  );
+
+	  // 17. Run these steps, but abort when the ongoing fetch is terminated:
+
+	  //    1. Set response’s body to a new body whose stream is stream.
+	  response.body = { stream, source: null, length: null };
+
+	  //    2. If response is not a network error and request’s cache mode is
+	  //    not "no-store", then update response in httpCache for request.
+	  //    TODO
+
+	  //    3. If includeCredentials is true and the user agent is not configured
+	  //    to block cookies for request (see section 7 of [COOKIES]), then run the
+	  //    "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on
+	  //    the value of each header whose name is a byte-case-insensitive match for
+	  //    `Set-Cookie` in response’s header list, if any, and request’s current URL.
+	  //    TODO
+
+	  // 18. If aborted, then:
+	  // TODO
+
+	  // 19. Run these steps in parallel:
+
+	  //    1. Run these steps, but abort when fetchParams is canceled:
+	  fetchParams.controller.onAborted = onAborted;
+	  fetchParams.controller.on('terminated', onAborted);
+	  fetchParams.controller.resume = async () => {
+	    // 1. While true
+	    while (true) {
+	      // 1-3. See onData...
+
+	      // 4. Set bytes to the result of handling content codings given
+	      // codings and bytes.
+	      let bytes;
+	      let isFailure;
+	      try {
+	        const { done, value } = await fetchParams.controller.next();
+
+	        if (isAborted(fetchParams)) {
+	          break
+	        }
+
+	        bytes = done ? undefined : value;
+	      } catch (err) {
+	        if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {
+	          // zlib doesn't like empty streams.
+	          bytes = undefined;
+	        } else {
+	          bytes = err;
+
+	          // err may be propagated from the result of calling readablestream.cancel,
+	          // which might not be an error. https://github.com/nodejs/undici/issues/2009
+	          isFailure = true;
+	        }
+	      }
+
+	      if (bytes === undefined) {
+	        // 2. Otherwise, if the bytes transmission for response’s message
+	        // body is done normally and stream is readable, then close
+	        // stream, finalize response for fetchParams and response, and
+	        // abort these in-parallel steps.
+	        readableStreamClose(fetchParams.controller.controller);
+
+	        finalizeResponse(fetchParams, response);
+
+	        return
+	      }
+
+	      // 5. Increase timingInfo’s decoded body size by bytes’s length.
+	      timingInfo.decodedBodySize += bytes?.byteLength ?? 0;
+
+	      // 6. If bytes is failure, then terminate fetchParams’s controller.
+	      if (isFailure) {
+	        fetchParams.controller.terminate(bytes);
+	        return
+	      }
+
+	      // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes
+	      // into stream.
+	      const buffer = new Uint8Array(bytes);
+	      if (buffer.byteLength) {
+	        fetchParams.controller.controller.enqueue(buffer);
+	      }
+
+	      // 8. If stream is errored, then terminate the ongoing fetch.
+	      if (isErrored(stream)) {
+	        fetchParams.controller.terminate();
+	        return
+	      }
+
+	      // 9. If stream doesn’t need more data ask the user agent to suspend
+	      // the ongoing fetch.
+	      if (fetchParams.controller.controller.desiredSize <= 0) {
+	        return
+	      }
+	    }
+	  };
+
+	  //    2. If aborted, then:
+	  function onAborted (reason) {
+	    // 2. If fetchParams is aborted, then:
+	    if (isAborted(fetchParams)) {
+	      // 1. Set response’s aborted flag.
+	      response.aborted = true;
+
+	      // 2. If stream is readable, then error stream with the result of
+	      //    deserialize a serialized abort reason given fetchParams’s
+	      //    controller’s serialized abort reason and an
+	      //    implementation-defined realm.
+	      if (isReadable(stream)) {
+	        fetchParams.controller.controller.error(
+	          fetchParams.controller.serializedAbortReason
+	        );
+	      }
+	    } else {
+	      // 3. Otherwise, if stream is readable, error stream with a TypeError.
+	      if (isReadable(stream)) {
+	        fetchParams.controller.controller.error(new TypeError('terminated', {
+	          cause: isErrorLike(reason) ? reason : undefined
+	        }));
+	      }
+	    }
+
+	    // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.
+	    // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.
+	    fetchParams.controller.connection.destroy();
+	  }
+
+	  // 20. Return response.
+	  return response
+
+	  function dispatch ({ body }) {
+	    const url = requestCurrentURL(request);
+	    /** @type {import('../..').Agent} */
+	    const agent = fetchParams.controller.dispatcher;
+
+	    return new Promise((resolve, reject) => agent.dispatch(
+	      {
+	        path: url.pathname + url.search,
+	        origin: url.origin,
+	        method: request.method,
+	        body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
+	        headers: request.headersList.entries,
+	        maxRedirections: 0,
+	        upgrade: request.mode === 'websocket' ? 'websocket' : undefined
+	      },
+	      {
+	        body: null,
+	        abort: null,
+
+	        onConnect (abort) {
+	          // TODO (fix): Do we need connection here?
+	          const { connection } = fetchParams.controller;
+
+	          // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen
+	          // connection timing info with connection’s timing info, timingInfo’s post-redirect start
+	          // time, and fetchParams’s cross-origin isolated capability.
+	          // TODO: implement connection timing
+	          timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability);
+
+	          if (connection.destroyed) {
+	            abort(new DOMException('The operation was aborted.', 'AbortError'));
+	          } else {
+	            fetchParams.controller.on('terminated', abort);
+	            this.abort = connection.abort = abort;
+	          }
+
+	          // Set timingInfo’s final network-request start time to the coarsened shared current time given
+	          // fetchParams’s cross-origin isolated capability.
+	          timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability);
+	        },
+
+	        onResponseStarted () {
+	          // Set timingInfo’s final network-response start time to the coarsened shared current
+	          // time given fetchParams’s cross-origin isolated capability, immediately after the
+	          // user agent’s HTTP parser receives the first byte of the response (e.g., frame header
+	          // bytes for HTTP/2 or response status line for HTTP/1.x).
+	          timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability);
+	        },
+
+	        onHeaders (status, rawHeaders, resume, statusText) {
+	          if (status < 200) {
+	            return
+	          }
+
+	          let location = '';
+
+	          const headersList = new HeadersList();
+
+	          for (let i = 0; i < rawHeaders.length; i += 2) {
+	            headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true);
+	          }
+	          location = headersList.get('location', true);
+
+	          this.body = new Readable({ read: resume });
+
+	          const decoders = [];
+
+	          const willFollow = location && request.redirect === 'follow' &&
+	            redirectStatusSet.has(status);
+
+	          // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
+	          if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
+	            // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
+	            const contentEncoding = headersList.get('content-encoding', true);
+	            // "All content-coding values are case-insensitive..."
+	            /** @type {string[]} */
+	            const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : [];
+
+	            // Limit the number of content-encodings to prevent resource exhaustion.
+	            // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).
+	            const maxContentEncodings = 5;
+	            if (codings.length > maxContentEncodings) {
+	              reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`));
+	              return true
+	            }
+
+	            for (let i = codings.length - 1; i >= 0; --i) {
+	              const coding = codings[i].trim();
+	              // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
+	              if (coding === 'x-gzip' || coding === 'gzip') {
+	                decoders.push(zlib.createGunzip({
+	                  // Be less strict when decoding compressed responses, since sometimes
+	                  // servers send slightly invalid responses that are still accepted
+	                  // by common browsers.
+	                  // Always using Z_SYNC_FLUSH is what cURL does.
+	                  flush: zlib.constants.Z_SYNC_FLUSH,
+	                  finishFlush: zlib.constants.Z_SYNC_FLUSH
+	                }));
+	              } else if (coding === 'deflate') {
+	                decoders.push(createInflate({
+	                  flush: zlib.constants.Z_SYNC_FLUSH,
+	                  finishFlush: zlib.constants.Z_SYNC_FLUSH
+	                }));
+	              } else if (coding === 'br') {
+	                decoders.push(zlib.createBrotliDecompress({
+	                  flush: zlib.constants.BROTLI_OPERATION_FLUSH,
+	                  finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH
+	                }));
+	              } else {
+	                decoders.length = 0;
+	                break
+	              }
+	            }
+	          }
+
+	          const onError = this.onError.bind(this);
+
+	          resolve({
+	            status,
+	            statusText,
+	            headersList,
+	            body: decoders.length
+	              ? pipeline(this.body, ...decoders, (err) => {
+	                if (err) {
+	                  this.onError(err);
+	                }
+	              }).on('error', onError)
+	              : this.body.on('error', onError)
+	          });
+
+	          return true
+	        },
+
+	        onData (chunk) {
+	          if (fetchParams.controller.dump) {
+	            return
+	          }
+
+	          // 1. If one or more bytes have been transmitted from response’s
+	          // message body, then:
+
+	          //  1. Let bytes be the transmitted bytes.
+	          const bytes = chunk;
+
+	          //  2. Let codings be the result of extracting header list values
+	          //  given `Content-Encoding` and response’s header list.
+	          //  See pullAlgorithm.
+
+	          //  3. Increase timingInfo’s encoded body size by bytes’s length.
+	          timingInfo.encodedBodySize += bytes.byteLength;
+
+	          //  4. See pullAlgorithm...
+
+	          return this.body.push(bytes)
+	        },
+
+	        onComplete () {
+	          if (this.abort) {
+	            fetchParams.controller.off('terminated', this.abort);
+	          }
+
+	          if (fetchParams.controller.onAborted) {
+	            fetchParams.controller.off('terminated', fetchParams.controller.onAborted);
+	          }
+
+	          fetchParams.controller.ended = true;
+
+	          this.body.push(null);
+	        },
+
+	        onError (error) {
+	          if (this.abort) {
+	            fetchParams.controller.off('terminated', this.abort);
+	          }
+
+	          this.body?.destroy(error);
+
+	          fetchParams.controller.terminate(error);
+
+	          reject(error);
+	        },
+
+	        onUpgrade (status, rawHeaders, socket) {
+	          if (status !== 101) {
+	            return
+	          }
+
+	          const headersList = new HeadersList();
+
+	          for (let i = 0; i < rawHeaders.length; i += 2) {
+	            headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true);
+	          }
+
+	          resolve({
+	            status,
+	            statusText: STATUS_CODES[status],
+	            headersList,
+	            socket
+	          });
+
+	          return true
+	        }
+	      }
+	    ))
+	  }
+	}
+
+	fetch_1 = {
+	  fetch,
+	  Fetch,
+	  fetching,
+	  finalizeAndReportTiming
+	};
+	return fetch_1;
+}
+
+var symbols$2;
+var hasRequiredSymbols$2;
+
+function requireSymbols$2 () {
+	if (hasRequiredSymbols$2) return symbols$2;
+	hasRequiredSymbols$2 = 1;
+
+	symbols$2 = {
+	  kState: Symbol('FileReader state'),
+	  kResult: Symbol('FileReader result'),
+	  kError: Symbol('FileReader error'),
+	  kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'),
+	  kEvents: Symbol('FileReader events'),
+	  kAborted: Symbol('FileReader aborted')
+	};
+	return symbols$2;
+}
+
+var progressevent;
+var hasRequiredProgressevent;
+
+function requireProgressevent () {
+	if (hasRequiredProgressevent) return progressevent;
+	hasRequiredProgressevent = 1;
+
+	const { webidl } = requireWebidl();
+
+	const kState = Symbol('ProgressEvent state');
+
+	/**
+	 * @see https://xhr.spec.whatwg.org/#progressevent
+	 */
+	class ProgressEvent extends Event {
+	  constructor (type, eventInitDict = {}) {
+	    type = webidl.converters.DOMString(type, 'ProgressEvent constructor', 'type');
+	    eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {});
+
+	    super(type, eventInitDict);
+
+	    this[kState] = {
+	      lengthComputable: eventInitDict.lengthComputable,
+	      loaded: eventInitDict.loaded,
+	      total: eventInitDict.total
+	    };
+	  }
+
+	  get lengthComputable () {
+	    webidl.brandCheck(this, ProgressEvent);
+
+	    return this[kState].lengthComputable
+	  }
+
+	  get loaded () {
+	    webidl.brandCheck(this, ProgressEvent);
+
+	    return this[kState].loaded
+	  }
+
+	  get total () {
+	    webidl.brandCheck(this, ProgressEvent);
+
+	    return this[kState].total
+	  }
+	}
+
+	webidl.converters.ProgressEventInit = webidl.dictionaryConverter([
+	  {
+	    key: 'lengthComputable',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'loaded',
+	    converter: webidl.converters['unsigned long long'],
+	    defaultValue: () => 0
+	  },
+	  {
+	    key: 'total',
+	    converter: webidl.converters['unsigned long long'],
+	    defaultValue: () => 0
+	  },
+	  {
+	    key: 'bubbles',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'cancelable',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'composed',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  }
+	]);
+
+	progressevent = {
+	  ProgressEvent
+	};
+	return progressevent;
+}
+
+var encoding;
+var hasRequiredEncoding;
+
+function requireEncoding () {
+	if (hasRequiredEncoding) return encoding;
+	hasRequiredEncoding = 1;
+
+	/**
+	 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
+	 * @param {string|undefined} label
+	 */
+	function getEncoding (label) {
+	  if (!label) {
+	    return 'failure'
+	  }
+
+	  // 1. Remove any leading and trailing ASCII whitespace from label.
+	  // 2. If label is an ASCII case-insensitive match for any of the
+	  //    labels listed in the table below, then return the
+	  //    corresponding encoding; otherwise return failure.
+	  switch (label.trim().toLowerCase()) {
+	    case 'unicode-1-1-utf-8':
+	    case 'unicode11utf8':
+	    case 'unicode20utf8':
+	    case 'utf-8':
+	    case 'utf8':
+	    case 'x-unicode20utf8':
+	      return 'UTF-8'
+	    case '866':
+	    case 'cp866':
+	    case 'csibm866':
+	    case 'ibm866':
+	      return 'IBM866'
+	    case 'csisolatin2':
+	    case 'iso-8859-2':
+	    case 'iso-ir-101':
+	    case 'iso8859-2':
+	    case 'iso88592':
+	    case 'iso_8859-2':
+	    case 'iso_8859-2:1987':
+	    case 'l2':
+	    case 'latin2':
+	      return 'ISO-8859-2'
+	    case 'csisolatin3':
+	    case 'iso-8859-3':
+	    case 'iso-ir-109':
+	    case 'iso8859-3':
+	    case 'iso88593':
+	    case 'iso_8859-3':
+	    case 'iso_8859-3:1988':
+	    case 'l3':
+	    case 'latin3':
+	      return 'ISO-8859-3'
+	    case 'csisolatin4':
+	    case 'iso-8859-4':
+	    case 'iso-ir-110':
+	    case 'iso8859-4':
+	    case 'iso88594':
+	    case 'iso_8859-4':
+	    case 'iso_8859-4:1988':
+	    case 'l4':
+	    case 'latin4':
+	      return 'ISO-8859-4'
+	    case 'csisolatincyrillic':
+	    case 'cyrillic':
+	    case 'iso-8859-5':
+	    case 'iso-ir-144':
+	    case 'iso8859-5':
+	    case 'iso88595':
+	    case 'iso_8859-5':
+	    case 'iso_8859-5:1988':
+	      return 'ISO-8859-5'
+	    case 'arabic':
+	    case 'asmo-708':
+	    case 'csiso88596e':
+	    case 'csiso88596i':
+	    case 'csisolatinarabic':
+	    case 'ecma-114':
+	    case 'iso-8859-6':
+	    case 'iso-8859-6-e':
+	    case 'iso-8859-6-i':
+	    case 'iso-ir-127':
+	    case 'iso8859-6':
+	    case 'iso88596':
+	    case 'iso_8859-6':
+	    case 'iso_8859-6:1987':
+	      return 'ISO-8859-6'
+	    case 'csisolatingreek':
+	    case 'ecma-118':
+	    case 'elot_928':
+	    case 'greek':
+	    case 'greek8':
+	    case 'iso-8859-7':
+	    case 'iso-ir-126':
+	    case 'iso8859-7':
+	    case 'iso88597':
+	    case 'iso_8859-7':
+	    case 'iso_8859-7:1987':
+	    case 'sun_eu_greek':
+	      return 'ISO-8859-7'
+	    case 'csiso88598e':
+	    case 'csisolatinhebrew':
+	    case 'hebrew':
+	    case 'iso-8859-8':
+	    case 'iso-8859-8-e':
+	    case 'iso-ir-138':
+	    case 'iso8859-8':
+	    case 'iso88598':
+	    case 'iso_8859-8':
+	    case 'iso_8859-8:1988':
+	    case 'visual':
+	      return 'ISO-8859-8'
+	    case 'csiso88598i':
+	    case 'iso-8859-8-i':
+	    case 'logical':
+	      return 'ISO-8859-8-I'
+	    case 'csisolatin6':
+	    case 'iso-8859-10':
+	    case 'iso-ir-157':
+	    case 'iso8859-10':
+	    case 'iso885910':
+	    case 'l6':
+	    case 'latin6':
+	      return 'ISO-8859-10'
+	    case 'iso-8859-13':
+	    case 'iso8859-13':
+	    case 'iso885913':
+	      return 'ISO-8859-13'
+	    case 'iso-8859-14':
+	    case 'iso8859-14':
+	    case 'iso885914':
+	      return 'ISO-8859-14'
+	    case 'csisolatin9':
+	    case 'iso-8859-15':
+	    case 'iso8859-15':
+	    case 'iso885915':
+	    case 'iso_8859-15':
+	    case 'l9':
+	      return 'ISO-8859-15'
+	    case 'iso-8859-16':
+	      return 'ISO-8859-16'
+	    case 'cskoi8r':
+	    case 'koi':
+	    case 'koi8':
+	    case 'koi8-r':
+	    case 'koi8_r':
+	      return 'KOI8-R'
+	    case 'koi8-ru':
+	    case 'koi8-u':
+	      return 'KOI8-U'
+	    case 'csmacintosh':
+	    case 'mac':
+	    case 'macintosh':
+	    case 'x-mac-roman':
+	      return 'macintosh'
+	    case 'iso-8859-11':
+	    case 'iso8859-11':
+	    case 'iso885911':
+	    case 'tis-620':
+	    case 'windows-874':
+	      return 'windows-874'
+	    case 'cp1250':
+	    case 'windows-1250':
+	    case 'x-cp1250':
+	      return 'windows-1250'
+	    case 'cp1251':
+	    case 'windows-1251':
+	    case 'x-cp1251':
+	      return 'windows-1251'
+	    case 'ansi_x3.4-1968':
+	    case 'ascii':
+	    case 'cp1252':
+	    case 'cp819':
+	    case 'csisolatin1':
+	    case 'ibm819':
+	    case 'iso-8859-1':
+	    case 'iso-ir-100':
+	    case 'iso8859-1':
+	    case 'iso88591':
+	    case 'iso_8859-1':
+	    case 'iso_8859-1:1987':
+	    case 'l1':
+	    case 'latin1':
+	    case 'us-ascii':
+	    case 'windows-1252':
+	    case 'x-cp1252':
+	      return 'windows-1252'
+	    case 'cp1253':
+	    case 'windows-1253':
+	    case 'x-cp1253':
+	      return 'windows-1253'
+	    case 'cp1254':
+	    case 'csisolatin5':
+	    case 'iso-8859-9':
+	    case 'iso-ir-148':
+	    case 'iso8859-9':
+	    case 'iso88599':
+	    case 'iso_8859-9':
+	    case 'iso_8859-9:1989':
+	    case 'l5':
+	    case 'latin5':
+	    case 'windows-1254':
+	    case 'x-cp1254':
+	      return 'windows-1254'
+	    case 'cp1255':
+	    case 'windows-1255':
+	    case 'x-cp1255':
+	      return 'windows-1255'
+	    case 'cp1256':
+	    case 'windows-1256':
+	    case 'x-cp1256':
+	      return 'windows-1256'
+	    case 'cp1257':
+	    case 'windows-1257':
+	    case 'x-cp1257':
+	      return 'windows-1257'
+	    case 'cp1258':
+	    case 'windows-1258':
+	    case 'x-cp1258':
+	      return 'windows-1258'
+	    case 'x-mac-cyrillic':
+	    case 'x-mac-ukrainian':
+	      return 'x-mac-cyrillic'
+	    case 'chinese':
+	    case 'csgb2312':
+	    case 'csiso58gb231280':
+	    case 'gb2312':
+	    case 'gb_2312':
+	    case 'gb_2312-80':
+	    case 'gbk':
+	    case 'iso-ir-58':
+	    case 'x-gbk':
+	      return 'GBK'
+	    case 'gb18030':
+	      return 'gb18030'
+	    case 'big5':
+	    case 'big5-hkscs':
+	    case 'cn-big5':
+	    case 'csbig5':
+	    case 'x-x-big5':
+	      return 'Big5'
+	    case 'cseucpkdfmtjapanese':
+	    case 'euc-jp':
+	    case 'x-euc-jp':
+	      return 'EUC-JP'
+	    case 'csiso2022jp':
+	    case 'iso-2022-jp':
+	      return 'ISO-2022-JP'
+	    case 'csshiftjis':
+	    case 'ms932':
+	    case 'ms_kanji':
+	    case 'shift-jis':
+	    case 'shift_jis':
+	    case 'sjis':
+	    case 'windows-31j':
+	    case 'x-sjis':
+	      return 'Shift_JIS'
+	    case 'cseuckr':
+	    case 'csksc56011987':
+	    case 'euc-kr':
+	    case 'iso-ir-149':
+	    case 'korean':
+	    case 'ks_c_5601-1987':
+	    case 'ks_c_5601-1989':
+	    case 'ksc5601':
+	    case 'ksc_5601':
+	    case 'windows-949':
+	      return 'EUC-KR'
+	    case 'csiso2022kr':
+	    case 'hz-gb-2312':
+	    case 'iso-2022-cn':
+	    case 'iso-2022-cn-ext':
+	    case 'iso-2022-kr':
+	    case 'replacement':
+	      return 'replacement'
+	    case 'unicodefffe':
+	    case 'utf-16be':
+	      return 'UTF-16BE'
+	    case 'csunicode':
+	    case 'iso-10646-ucs-2':
+	    case 'ucs-2':
+	    case 'unicode':
+	    case 'unicodefeff':
+	    case 'utf-16':
+	    case 'utf-16le':
+	      return 'UTF-16LE'
+	    case 'x-user-defined':
+	      return 'x-user-defined'
+	    default: return 'failure'
+	  }
+	}
+
+	encoding = {
+	  getEncoding
+	};
+	return encoding;
+}
+
+var util$4;
+var hasRequiredUtil$4;
+
+function requireUtil$4 () {
+	if (hasRequiredUtil$4) return util$4;
+	hasRequiredUtil$4 = 1;
+
+	const {
+	  kState,
+	  kError,
+	  kResult,
+	  kAborted,
+	  kLastProgressEventFired
+	} = requireSymbols$2();
+	const { ProgressEvent } = requireProgressevent();
+	const { getEncoding } = requireEncoding();
+	const { serializeAMimeType, parseMIMEType } = requireDataUrl();
+	const { types } = require$$0$a;
+	const { StringDecoder } = require$$5$3;
+	const { btoa } = require$$0$6;
+
+	/** @type {PropertyDescriptor} */
+	const staticPropertyDescriptors = {
+	  enumerable: true,
+	  writable: false,
+	  configurable: false
+	};
+
+	/**
+	 * @see https://w3c.github.io/FileAPI/#readOperation
+	 * @param {import('./filereader').FileReader} fr
+	 * @param {import('buffer').Blob} blob
+	 * @param {string} type
+	 * @param {string?} encodingName
+	 */
+	function readOperation (fr, blob, type, encodingName) {
+	  // 1. If fr’s state is "loading", throw an InvalidStateError
+	  //    DOMException.
+	  if (fr[kState] === 'loading') {
+	    throw new DOMException('Invalid state', 'InvalidStateError')
+	  }
+
+	  // 2. Set fr’s state to "loading".
+	  fr[kState] = 'loading';
+
+	  // 3. Set fr’s result to null.
+	  fr[kResult] = null;
+
+	  // 4. Set fr’s error to null.
+	  fr[kError] = null;
+
+	  // 5. Let stream be the result of calling get stream on blob.
+	  /** @type {import('stream/web').ReadableStream} */
+	  const stream = blob.stream();
+
+	  // 6. Let reader be the result of getting a reader from stream.
+	  const reader = stream.getReader();
+
+	  // 7. Let bytes be an empty byte sequence.
+	  /** @type {Uint8Array[]} */
+	  const bytes = [];
+
+	  // 8. Let chunkPromise be the result of reading a chunk from
+	  //    stream with reader.
+	  let chunkPromise = reader.read();
+
+	  // 9. Let isFirstChunk be true.
+	  let isFirstChunk = true
+
+	  // 10. In parallel, while true:
+	  // Note: "In parallel" just means non-blocking
+	  // Note 2: readOperation itself cannot be async as double
+	  // reading the body would then reject the promise, instead
+	  // of throwing an error.
+	  ;(async () => {
+	    while (!fr[kAborted]) {
+	      // 1. Wait for chunkPromise to be fulfilled or rejected.
+	      try {
+	        const { done, value } = await chunkPromise;
+
+	        // 2. If chunkPromise is fulfilled, and isFirstChunk is
+	        //    true, queue a task to fire a progress event called
+	        //    loadstart at fr.
+	        if (isFirstChunk && !fr[kAborted]) {
+	          queueMicrotask(() => {
+	            fireAProgressEvent('loadstart', fr);
+	          });
+	        }
+
+	        // 3. Set isFirstChunk to false.
+	        isFirstChunk = false;
+
+	        // 4. If chunkPromise is fulfilled with an object whose
+	        //    done property is false and whose value property is
+	        //    a Uint8Array object, run these steps:
+	        if (!done && types.isUint8Array(value)) {
+	          // 1. Let bs be the byte sequence represented by the
+	          //    Uint8Array object.
+
+	          // 2. Append bs to bytes.
+	          bytes.push(value);
+
+	          // 3. If roughly 50ms have passed since these steps
+	          //    were last invoked, queue a task to fire a
+	          //    progress event called progress at fr.
+	          if (
+	            (
+	              fr[kLastProgressEventFired] === undefined ||
+	              Date.now() - fr[kLastProgressEventFired] >= 50
+	            ) &&
+	            !fr[kAborted]
+	          ) {
+	            fr[kLastProgressEventFired] = Date.now();
+	            queueMicrotask(() => {
+	              fireAProgressEvent('progress', fr);
+	            });
+	          }
+
+	          // 4. Set chunkPromise to the result of reading a
+	          //    chunk from stream with reader.
+	          chunkPromise = reader.read();
+	        } else if (done) {
+	          // 5. Otherwise, if chunkPromise is fulfilled with an
+	          //    object whose done property is true, queue a task
+	          //    to run the following steps and abort this algorithm:
+	          queueMicrotask(() => {
+	            // 1. Set fr’s state to "done".
+	            fr[kState] = 'done';
+
+	            // 2. Let result be the result of package data given
+	            //    bytes, type, blob’s type, and encodingName.
+	            try {
+	              const result = packageData(bytes, type, blob.type, encodingName);
+
+	              // 4. Else:
+
+	              if (fr[kAborted]) {
+	                return
+	              }
+
+	              // 1. Set fr’s result to result.
+	              fr[kResult] = result;
+
+	              // 2. Fire a progress event called load at the fr.
+	              fireAProgressEvent('load', fr);
+	            } catch (error) {
+	              // 3. If package data threw an exception error:
+
+	              // 1. Set fr’s error to error.
+	              fr[kError] = error;
+
+	              // 2. Fire a progress event called error at fr.
+	              fireAProgressEvent('error', fr);
+	            }
+
+	            // 5. If fr’s state is not "loading", fire a progress
+	            //    event called loadend at the fr.
+	            if (fr[kState] !== 'loading') {
+	              fireAProgressEvent('loadend', fr);
+	            }
+	          });
+
+	          break
+	        }
+	      } catch (error) {
+	        if (fr[kAborted]) {
+	          return
+	        }
+
+	        // 6. Otherwise, if chunkPromise is rejected with an
+	        //    error error, queue a task to run the following
+	        //    steps and abort this algorithm:
+	        queueMicrotask(() => {
+	          // 1. Set fr’s state to "done".
+	          fr[kState] = 'done';
+
+	          // 2. Set fr’s error to error.
+	          fr[kError] = error;
+
+	          // 3. Fire a progress event called error at fr.
+	          fireAProgressEvent('error', fr);
+
+	          // 4. If fr’s state is not "loading", fire a progress
+	          //    event called loadend at fr.
+	          if (fr[kState] !== 'loading') {
+	            fireAProgressEvent('loadend', fr);
+	          }
+	        });
+
+	        break
+	      }
+	    }
+	  })();
+	}
+
+	/**
+	 * @see https://w3c.github.io/FileAPI/#fire-a-progress-event
+	 * @see https://dom.spec.whatwg.org/#concept-event-fire
+	 * @param {string} e The name of the event
+	 * @param {import('./filereader').FileReader} reader
+	 */
+	function fireAProgressEvent (e, reader) {
+	  // The progress event e does not bubble. e.bubbles must be false
+	  // The progress event e is NOT cancelable. e.cancelable must be false
+	  const event = new ProgressEvent(e, {
+	    bubbles: false,
+	    cancelable: false
+	  });
+
+	  reader.dispatchEvent(event);
+	}
+
+	/**
+	 * @see https://w3c.github.io/FileAPI/#blob-package-data
+	 * @param {Uint8Array[]} bytes
+	 * @param {string} type
+	 * @param {string?} mimeType
+	 * @param {string?} encodingName
+	 */
+	function packageData (bytes, type, mimeType, encodingName) {
+	  // 1. A Blob has an associated package data algorithm, given
+	  //    bytes, a type, a optional mimeType, and a optional
+	  //    encodingName, which switches on type and runs the
+	  //    associated steps:
+
+	  switch (type) {
+	    case 'DataURL': {
+	      // 1. Return bytes as a DataURL [RFC2397] subject to
+	      //    the considerations below:
+	      //  * Use mimeType as part of the Data URL if it is
+	      //    available in keeping with the Data URL
+	      //    specification [RFC2397].
+	      //  * If mimeType is not available return a Data URL
+	      //    without a media-type. [RFC2397].
+
+	      // https://datatracker.ietf.org/doc/html/rfc2397#section-3
+	      // dataurl    := "data:" [ mediatype ] [ ";base64" ] "," data
+	      // mediatype  := [ type "/" subtype ] *( ";" parameter )
+	      // data       := *urlchar
+	      // parameter  := attribute "=" value
+	      let dataURL = 'data:';
+
+	      const parsed = parseMIMEType(mimeType || 'application/octet-stream');
+
+	      if (parsed !== 'failure') {
+	        dataURL += serializeAMimeType(parsed);
+	      }
+
+	      dataURL += ';base64,';
+
+	      const decoder = new StringDecoder('latin1');
+
+	      for (const chunk of bytes) {
+	        dataURL += btoa(decoder.write(chunk));
+	      }
+
+	      dataURL += btoa(decoder.end());
+
+	      return dataURL
+	    }
+	    case 'Text': {
+	      // 1. Let encoding be failure
+	      let encoding = 'failure';
+
+	      // 2. If the encodingName is present, set encoding to the
+	      //    result of getting an encoding from encodingName.
+	      if (encodingName) {
+	        encoding = getEncoding(encodingName);
+	      }
+
+	      // 3. If encoding is failure, and mimeType is present:
+	      if (encoding === 'failure' && mimeType) {
+	        // 1. Let type be the result of parse a MIME type
+	        //    given mimeType.
+	        const type = parseMIMEType(mimeType);
+
+	        // 2. If type is not failure, set encoding to the result
+	        //    of getting an encoding from type’s parameters["charset"].
+	        if (type !== 'failure') {
+	          encoding = getEncoding(type.parameters.get('charset'));
+	        }
+	      }
+
+	      // 4. If encoding is failure, then set encoding to UTF-8.
+	      if (encoding === 'failure') {
+	        encoding = 'UTF-8';
+	      }
+
+	      // 5. Decode bytes using fallback encoding encoding, and
+	      //    return the result.
+	      return decode(bytes, encoding)
+	    }
+	    case 'ArrayBuffer': {
+	      // Return a new ArrayBuffer whose contents are bytes.
+	      const sequence = combineByteSequences(bytes);
+
+	      return sequence.buffer
+	    }
+	    case 'BinaryString': {
+	      // Return bytes as a binary string, in which every byte
+	      //  is represented by a code unit of equal value [0..255].
+	      let binaryString = '';
+
+	      const decoder = new StringDecoder('latin1');
+
+	      for (const chunk of bytes) {
+	        binaryString += decoder.write(chunk);
+	      }
+
+	      binaryString += decoder.end();
+
+	      return binaryString
+	    }
+	  }
+	}
+
+	/**
+	 * @see https://encoding.spec.whatwg.org/#decode
+	 * @param {Uint8Array[]} ioQueue
+	 * @param {string} encoding
+	 */
+	function decode (ioQueue, encoding) {
+	  const bytes = combineByteSequences(ioQueue);
+
+	  // 1. Let BOMEncoding be the result of BOM sniffing ioQueue.
+	  const BOMEncoding = BOMSniffing(bytes);
+
+	  let slice = 0;
+
+	  // 2. If BOMEncoding is non-null:
+	  if (BOMEncoding !== null) {
+	    // 1. Set encoding to BOMEncoding.
+	    encoding = BOMEncoding;
+
+	    // 2. Read three bytes from ioQueue, if BOMEncoding is
+	    //    UTF-8; otherwise read two bytes.
+	    //    (Do nothing with those bytes.)
+	    slice = BOMEncoding === 'UTF-8' ? 3 : 2;
+	  }
+
+	  // 3. Process a queue with an instance of encoding’s
+	  //    decoder, ioQueue, output, and "replacement".
+
+	  // 4. Return output.
+
+	  const sliced = bytes.slice(slice);
+	  return new TextDecoder(encoding).decode(sliced)
+	}
+
+	/**
+	 * @see https://encoding.spec.whatwg.org/#bom-sniff
+	 * @param {Uint8Array} ioQueue
+	 */
+	function BOMSniffing (ioQueue) {
+	  // 1. Let BOM be the result of peeking 3 bytes from ioQueue,
+	  //    converted to a byte sequence.
+	  const [a, b, c] = ioQueue;
+
+	  // 2. For each of the rows in the table below, starting with
+	  //    the first one and going down, if BOM starts with the
+	  //    bytes given in the first column, then return the
+	  //    encoding given in the cell in the second column of that
+	  //    row. Otherwise, return null.
+	  if (a === 0xEF && b === 0xBB && c === 0xBF) {
+	    return 'UTF-8'
+	  } else if (a === 0xFE && b === 0xFF) {
+	    return 'UTF-16BE'
+	  } else if (a === 0xFF && b === 0xFE) {
+	    return 'UTF-16LE'
+	  }
+
+	  return null
+	}
+
+	/**
+	 * @param {Uint8Array[]} sequences
+	 */
+	function combineByteSequences (sequences) {
+	  const size = sequences.reduce((a, b) => {
+	    return a + b.byteLength
+	  }, 0);
+
+	  let offset = 0;
+
+	  return sequences.reduce((a, b) => {
+	    a.set(b, offset);
+	    offset += b.byteLength;
+	    return a
+	  }, new Uint8Array(size))
+	}
+
+	util$4 = {
+	  staticPropertyDescriptors,
+	  readOperation,
+	  fireAProgressEvent
+	};
+	return util$4;
+}
+
+var filereader;
+var hasRequiredFilereader;
+
+function requireFilereader () {
+	if (hasRequiredFilereader) return filereader;
+	hasRequiredFilereader = 1;
+
+	const {
+	  staticPropertyDescriptors,
+	  readOperation,
+	  fireAProgressEvent
+	} = requireUtil$4();
+	const {
+	  kState,
+	  kError,
+	  kResult,
+	  kEvents,
+	  kAborted
+	} = requireSymbols$2();
+	const { webidl } = requireWebidl();
+	const { kEnumerableProperty } = requireUtil$7();
+
+	class FileReader extends EventTarget {
+	  constructor () {
+	    super();
+
+	    this[kState] = 'empty';
+	    this[kResult] = null;
+	    this[kError] = null;
+	    this[kEvents] = {
+	      loadend: null,
+	      error: null,
+	      abort: null,
+	      load: null,
+	      progress: null,
+	      loadstart: null
+	    };
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer
+	   * @param {import('buffer').Blob} blob
+	   */
+	  readAsArrayBuffer (blob) {
+	    webidl.brandCheck(this, FileReader);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsArrayBuffer');
+
+	    blob = webidl.converters.Blob(blob, { strict: false });
+
+	    // The readAsArrayBuffer(blob) method, when invoked,
+	    // must initiate a read operation for blob with ArrayBuffer.
+	    readOperation(this, blob, 'ArrayBuffer');
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#readAsBinaryString
+	   * @param {import('buffer').Blob} blob
+	   */
+	  readAsBinaryString (blob) {
+	    webidl.brandCheck(this, FileReader);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsBinaryString');
+
+	    blob = webidl.converters.Blob(blob, { strict: false });
+
+	    // The readAsBinaryString(blob) method, when invoked,
+	    // must initiate a read operation for blob with BinaryString.
+	    readOperation(this, blob, 'BinaryString');
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#readAsDataText
+	   * @param {import('buffer').Blob} blob
+	   * @param {string?} encoding
+	   */
+	  readAsText (blob, encoding = undefined) {
+	    webidl.brandCheck(this, FileReader);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsText');
+
+	    blob = webidl.converters.Blob(blob, { strict: false });
+
+	    if (encoding !== undefined) {
+	      encoding = webidl.converters.DOMString(encoding, 'FileReader.readAsText', 'encoding');
+	    }
+
+	    // The readAsText(blob, encoding) method, when invoked,
+	    // must initiate a read operation for blob with Text and encoding.
+	    readOperation(this, blob, 'Text', encoding);
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL
+	   * @param {import('buffer').Blob} blob
+	   */
+	  readAsDataURL (blob) {
+	    webidl.brandCheck(this, FileReader);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsDataURL');
+
+	    blob = webidl.converters.Blob(blob, { strict: false });
+
+	    // The readAsDataURL(blob) method, when invoked, must
+	    // initiate a read operation for blob with DataURL.
+	    readOperation(this, blob, 'DataURL');
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#dfn-abort
+	   */
+	  abort () {
+	    // 1. If this's state is "empty" or if this's state is
+	    //    "done" set this's result to null and terminate
+	    //    this algorithm.
+	    if (this[kState] === 'empty' || this[kState] === 'done') {
+	      this[kResult] = null;
+	      return
+	    }
+
+	    // 2. If this's state is "loading" set this's state to
+	    //    "done" and set this's result to null.
+	    if (this[kState] === 'loading') {
+	      this[kState] = 'done';
+	      this[kResult] = null;
+	    }
+
+	    // 3. If there are any tasks from this on the file reading
+	    //    task source in an affiliated task queue, then remove
+	    //    those tasks from that task queue.
+	    this[kAborted] = true;
+
+	    // 4. Terminate the algorithm for the read method being processed.
+	    // TODO
+
+	    // 5. Fire a progress event called abort at this.
+	    fireAProgressEvent('abort', this);
+
+	    // 6. If this's state is not "loading", fire a progress
+	    //    event called loadend at this.
+	    if (this[kState] !== 'loading') {
+	      fireAProgressEvent('loadend', this);
+	    }
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate
+	   */
+	  get readyState () {
+	    webidl.brandCheck(this, FileReader);
+
+	    switch (this[kState]) {
+	      case 'empty': return this.EMPTY
+	      case 'loading': return this.LOADING
+	      case 'done': return this.DONE
+	    }
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#dom-filereader-result
+	   */
+	  get result () {
+	    webidl.brandCheck(this, FileReader);
+
+	    // The result attribute’s getter, when invoked, must return
+	    // this's result.
+	    return this[kResult]
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/FileAPI/#dom-filereader-error
+	   */
+	  get error () {
+	    webidl.brandCheck(this, FileReader);
+
+	    // The error attribute’s getter, when invoked, must return
+	    // this's error.
+	    return this[kError]
+	  }
+
+	  get onloadend () {
+	    webidl.brandCheck(this, FileReader);
+
+	    return this[kEvents].loadend
+	  }
+
+	  set onloadend (fn) {
+	    webidl.brandCheck(this, FileReader);
+
+	    if (this[kEvents].loadend) {
+	      this.removeEventListener('loadend', this[kEvents].loadend);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this[kEvents].loadend = fn;
+	      this.addEventListener('loadend', fn);
+	    } else {
+	      this[kEvents].loadend = null;
+	    }
+	  }
+
+	  get onerror () {
+	    webidl.brandCheck(this, FileReader);
+
+	    return this[kEvents].error
+	  }
+
+	  set onerror (fn) {
+	    webidl.brandCheck(this, FileReader);
+
+	    if (this[kEvents].error) {
+	      this.removeEventListener('error', this[kEvents].error);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this[kEvents].error = fn;
+	      this.addEventListener('error', fn);
+	    } else {
+	      this[kEvents].error = null;
+	    }
+	  }
+
+	  get onloadstart () {
+	    webidl.brandCheck(this, FileReader);
+
+	    return this[kEvents].loadstart
+	  }
+
+	  set onloadstart (fn) {
+	    webidl.brandCheck(this, FileReader);
+
+	    if (this[kEvents].loadstart) {
+	      this.removeEventListener('loadstart', this[kEvents].loadstart);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this[kEvents].loadstart = fn;
+	      this.addEventListener('loadstart', fn);
+	    } else {
+	      this[kEvents].loadstart = null;
+	    }
+	  }
+
+	  get onprogress () {
+	    webidl.brandCheck(this, FileReader);
+
+	    return this[kEvents].progress
+	  }
+
+	  set onprogress (fn) {
+	    webidl.brandCheck(this, FileReader);
+
+	    if (this[kEvents].progress) {
+	      this.removeEventListener('progress', this[kEvents].progress);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this[kEvents].progress = fn;
+	      this.addEventListener('progress', fn);
+	    } else {
+	      this[kEvents].progress = null;
+	    }
+	  }
+
+	  get onload () {
+	    webidl.brandCheck(this, FileReader);
+
+	    return this[kEvents].load
+	  }
+
+	  set onload (fn) {
+	    webidl.brandCheck(this, FileReader);
+
+	    if (this[kEvents].load) {
+	      this.removeEventListener('load', this[kEvents].load);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this[kEvents].load = fn;
+	      this.addEventListener('load', fn);
+	    } else {
+	      this[kEvents].load = null;
+	    }
+	  }
+
+	  get onabort () {
+	    webidl.brandCheck(this, FileReader);
+
+	    return this[kEvents].abort
+	  }
+
+	  set onabort (fn) {
+	    webidl.brandCheck(this, FileReader);
+
+	    if (this[kEvents].abort) {
+	      this.removeEventListener('abort', this[kEvents].abort);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this[kEvents].abort = fn;
+	      this.addEventListener('abort', fn);
+	    } else {
+	      this[kEvents].abort = null;
+	    }
+	  }
+	}
+
+	// https://w3c.github.io/FileAPI/#dom-filereader-empty
+	FileReader.EMPTY = FileReader.prototype.EMPTY = 0;
+	// https://w3c.github.io/FileAPI/#dom-filereader-loading
+	FileReader.LOADING = FileReader.prototype.LOADING = 1;
+	// https://w3c.github.io/FileAPI/#dom-filereader-done
+	FileReader.DONE = FileReader.prototype.DONE = 2;
+
+	Object.defineProperties(FileReader.prototype, {
+	  EMPTY: staticPropertyDescriptors,
+	  LOADING: staticPropertyDescriptors,
+	  DONE: staticPropertyDescriptors,
+	  readAsArrayBuffer: kEnumerableProperty,
+	  readAsBinaryString: kEnumerableProperty,
+	  readAsText: kEnumerableProperty,
+	  readAsDataURL: kEnumerableProperty,
+	  abort: kEnumerableProperty,
+	  readyState: kEnumerableProperty,
+	  result: kEnumerableProperty,
+	  error: kEnumerableProperty,
+	  onloadstart: kEnumerableProperty,
+	  onprogress: kEnumerableProperty,
+	  onload: kEnumerableProperty,
+	  onabort: kEnumerableProperty,
+	  onerror: kEnumerableProperty,
+	  onloadend: kEnumerableProperty,
+	  [Symbol.toStringTag]: {
+	    value: 'FileReader',
+	    writable: false,
+	    enumerable: false,
+	    configurable: true
+	  }
+	});
+
+	Object.defineProperties(FileReader, {
+	  EMPTY: staticPropertyDescriptors,
+	  LOADING: staticPropertyDescriptors,
+	  DONE: staticPropertyDescriptors
+	});
+
+	filereader = {
+	  FileReader
+	};
+	return filereader;
+}
+
+var symbols$1;
+var hasRequiredSymbols$1;
+
+function requireSymbols$1 () {
+	if (hasRequiredSymbols$1) return symbols$1;
+	hasRequiredSymbols$1 = 1;
+
+	symbols$1 = {
+	  kConstruct: requireSymbols$4().kConstruct
+	};
+	return symbols$1;
+}
+
+var util$3;
+var hasRequiredUtil$3;
+
+function requireUtil$3 () {
+	if (hasRequiredUtil$3) return util$3;
+	hasRequiredUtil$3 = 1;
+
+	const assert = require$$0$7;
+	const { URLSerializer } = requireDataUrl();
+	const { isValidHeaderName } = requireUtil$6();
+
+	/**
+	 * @see https://url.spec.whatwg.org/#concept-url-equals
+	 * @param {URL} A
+	 * @param {URL} B
+	 * @param {boolean | undefined} excludeFragment
+	 * @returns {boolean}
+	 */
+	function urlEquals (A, B, excludeFragment = false) {
+	  const serializedA = URLSerializer(A, excludeFragment);
+
+	  const serializedB = URLSerializer(B, excludeFragment);
+
+	  return serializedA === serializedB
+	}
+
+	/**
+	 * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262
+	 * @param {string} header
+	 */
+	function getFieldValues (header) {
+	  assert(header !== null);
+
+	  const values = [];
+
+	  for (let value of header.split(',')) {
+	    value = value.trim();
+
+	    if (isValidHeaderName(value)) {
+	      values.push(value);
+	    }
+	  }
+
+	  return values
+	}
+
+	util$3 = {
+	  urlEquals,
+	  getFieldValues
+	};
+	return util$3;
+}
+
+var cache;
+var hasRequiredCache;
+
+function requireCache () {
+	if (hasRequiredCache) return cache;
+	hasRequiredCache = 1;
+
+	const { kConstruct } = requireSymbols$1();
+	const { urlEquals, getFieldValues } = requireUtil$3();
+	const { kEnumerableProperty, isDisturbed } = requireUtil$7();
+	const { webidl } = requireWebidl();
+	const { Response, cloneResponse, fromInnerResponse } = requireResponse();
+	const { Request, fromInnerRequest } = requireRequest();
+	const { kState } = requireSymbols$3();
+	const { fetching } = requireFetch();
+	const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$6();
+	const assert = require$$0$7;
+
+	/**
+	 * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation
+	 * @typedef {Object} CacheBatchOperation
+	 * @property {'delete' | 'put'} type
+	 * @property {any} request
+	 * @property {any} response
+	 * @property {import('../../types/cache').CacheQueryOptions} options
+	 */
+
+	/**
+	 * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list
+	 * @typedef {[any, any][]} requestResponseList
+	 */
+
+	class Cache {
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list
+	   * @type {requestResponseList}
+	   */
+	  #relevantRequestResponseList
+
+	  constructor () {
+	    if (arguments[0] !== kConstruct) {
+	      webidl.illegalConstructor();
+	    }
+
+	    webidl.util.markAsUncloneable(this);
+	    this.#relevantRequestResponseList = arguments[1];
+	  }
+
+	  async match (request, options = {}) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.match';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    request = webidl.converters.RequestInfo(request, prefix, 'request');
+	    options = webidl.converters.CacheQueryOptions(options, prefix, 'options');
+
+	    const p = this.#internalMatchAll(request, options, 1);
+
+	    if (p.length === 0) {
+	      return
+	    }
+
+	    return p[0]
+	  }
+
+	  async matchAll (request = undefined, options = {}) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.matchAll';
+	    if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request');
+	    options = webidl.converters.CacheQueryOptions(options, prefix, 'options');
+
+	    return this.#internalMatchAll(request, options)
+	  }
+
+	  async add (request) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.add';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    request = webidl.converters.RequestInfo(request, prefix, 'request');
+
+	    // 1.
+	    const requests = [request];
+
+	    // 2.
+	    const responseArrayPromise = this.addAll(requests);
+
+	    // 3.
+	    return await responseArrayPromise
+	  }
+
+	  async addAll (requests) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.addAll';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    // 1.
+	    const responsePromises = [];
+
+	    // 2.
+	    const requestList = [];
+
+	    // 3.
+	    for (let request of requests) {
+	      if (request === undefined) {
+	        throw webidl.errors.conversionFailed({
+	          prefix,
+	          argument: 'Argument 1',
+	          types: ['undefined is not allowed']
+	        })
+	      }
+
+	      request = webidl.converters.RequestInfo(request);
+
+	      if (typeof request === 'string') {
+	        continue
+	      }
+
+	      // 3.1
+	      const r = request[kState];
+
+	      // 3.2
+	      if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') {
+	        throw webidl.errors.exception({
+	          header: prefix,
+	          message: 'Expected http/s scheme when method is not GET.'
+	        })
+	      }
+	    }
+
+	    // 4.
+	    /** @type {ReturnType[]} */
+	    const fetchControllers = [];
+
+	    // 5.
+	    for (const request of requests) {
+	      // 5.1
+	      const r = new Request(request)[kState];
+
+	      // 5.2
+	      if (!urlIsHttpHttpsScheme(r.url)) {
+	        throw webidl.errors.exception({
+	          header: prefix,
+	          message: 'Expected http/s scheme.'
+	        })
+	      }
+
+	      // 5.4
+	      r.initiator = 'fetch';
+	      r.destination = 'subresource';
+
+	      // 5.5
+	      requestList.push(r);
+
+	      // 5.6
+	      const responsePromise = createDeferredPromise();
+
+	      // 5.7
+	      fetchControllers.push(fetching({
+	        request: r,
+	        processResponse (response) {
+	          // 1.
+	          if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {
+	            responsePromise.reject(webidl.errors.exception({
+	              header: 'Cache.addAll',
+	              message: 'Received an invalid status code or the request failed.'
+	            }));
+	          } else if (response.headersList.contains('vary')) { // 2.
+	            // 2.1
+	            const fieldValues = getFieldValues(response.headersList.get('vary'));
+
+	            // 2.2
+	            for (const fieldValue of fieldValues) {
+	              // 2.2.1
+	              if (fieldValue === '*') {
+	                responsePromise.reject(webidl.errors.exception({
+	                  header: 'Cache.addAll',
+	                  message: 'invalid vary field value'
+	                }));
+
+	                for (const controller of fetchControllers) {
+	                  controller.abort();
+	                }
+
+	                return
+	              }
+	            }
+	          }
+	        },
+	        processResponseEndOfBody (response) {
+	          // 1.
+	          if (response.aborted) {
+	            responsePromise.reject(new DOMException('aborted', 'AbortError'));
+	            return
+	          }
+
+	          // 2.
+	          responsePromise.resolve(response);
+	        }
+	      }));
+
+	      // 5.8
+	      responsePromises.push(responsePromise.promise);
+	    }
+
+	    // 6.
+	    const p = Promise.all(responsePromises);
+
+	    // 7.
+	    const responses = await p;
+
+	    // 7.1
+	    const operations = [];
+
+	    // 7.2
+	    let index = 0;
+
+	    // 7.3
+	    for (const response of responses) {
+	      // 7.3.1
+	      /** @type {CacheBatchOperation} */
+	      const operation = {
+	        type: 'put', // 7.3.2
+	        request: requestList[index], // 7.3.3
+	        response // 7.3.4
+	      };
+
+	      operations.push(operation); // 7.3.5
+
+	      index++; // 7.3.6
+	    }
+
+	    // 7.5
+	    const cacheJobPromise = createDeferredPromise();
+
+	    // 7.6.1
+	    let errorData = null;
+
+	    // 7.6.2
+	    try {
+	      this.#batchCacheOperations(operations);
+	    } catch (e) {
+	      errorData = e;
+	    }
+
+	    // 7.6.3
+	    queueMicrotask(() => {
+	      // 7.6.3.1
+	      if (errorData === null) {
+	        cacheJobPromise.resolve(undefined);
+	      } else {
+	        // 7.6.3.2
+	        cacheJobPromise.reject(errorData);
+	      }
+	    });
+
+	    // 7.7
+	    return cacheJobPromise.promise
+	  }
+
+	  async put (request, response) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.put';
+	    webidl.argumentLengthCheck(arguments, 2, prefix);
+
+	    request = webidl.converters.RequestInfo(request, prefix, 'request');
+	    response = webidl.converters.Response(response, prefix, 'response');
+
+	    // 1.
+	    let innerRequest = null;
+
+	    // 2.
+	    if (request instanceof Request) {
+	      innerRequest = request[kState];
+	    } else { // 3.
+	      innerRequest = new Request(request)[kState];
+	    }
+
+	    // 4.
+	    if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: 'Expected an http/s scheme when method is not GET'
+	      })
+	    }
+
+	    // 5.
+	    const innerResponse = response[kState];
+
+	    // 6.
+	    if (innerResponse.status === 206) {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: 'Got 206 status'
+	      })
+	    }
+
+	    // 7.
+	    if (innerResponse.headersList.contains('vary')) {
+	      // 7.1.
+	      const fieldValues = getFieldValues(innerResponse.headersList.get('vary'));
+
+	      // 7.2.
+	      for (const fieldValue of fieldValues) {
+	        // 7.2.1
+	        if (fieldValue === '*') {
+	          throw webidl.errors.exception({
+	            header: prefix,
+	            message: 'Got * vary field value'
+	          })
+	        }
+	      }
+	    }
+
+	    // 8.
+	    if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) {
+	      throw webidl.errors.exception({
+	        header: prefix,
+	        message: 'Response body is locked or disturbed'
+	      })
+	    }
+
+	    // 9.
+	    const clonedResponse = cloneResponse(innerResponse);
+
+	    // 10.
+	    const bodyReadPromise = createDeferredPromise();
+
+	    // 11.
+	    if (innerResponse.body != null) {
+	      // 11.1
+	      const stream = innerResponse.body.stream;
+
+	      // 11.2
+	      const reader = stream.getReader();
+
+	      // 11.3
+	      readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject);
+	    } else {
+	      bodyReadPromise.resolve(undefined);
+	    }
+
+	    // 12.
+	    /** @type {CacheBatchOperation[]} */
+	    const operations = [];
+
+	    // 13.
+	    /** @type {CacheBatchOperation} */
+	    const operation = {
+	      type: 'put', // 14.
+	      request: innerRequest, // 15.
+	      response: clonedResponse // 16.
+	    };
+
+	    // 17.
+	    operations.push(operation);
+
+	    // 19.
+	    const bytes = await bodyReadPromise.promise;
+
+	    if (clonedResponse.body != null) {
+	      clonedResponse.body.source = bytes;
+	    }
+
+	    // 19.1
+	    const cacheJobPromise = createDeferredPromise();
+
+	    // 19.2.1
+	    let errorData = null;
+
+	    // 19.2.2
+	    try {
+	      this.#batchCacheOperations(operations);
+	    } catch (e) {
+	      errorData = e;
+	    }
+
+	    // 19.2.3
+	    queueMicrotask(() => {
+	      // 19.2.3.1
+	      if (errorData === null) {
+	        cacheJobPromise.resolve();
+	      } else { // 19.2.3.2
+	        cacheJobPromise.reject(errorData);
+	      }
+	    });
+
+	    return cacheJobPromise.promise
+	  }
+
+	  async delete (request, options = {}) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.delete';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    request = webidl.converters.RequestInfo(request, prefix, 'request');
+	    options = webidl.converters.CacheQueryOptions(options, prefix, 'options');
+
+	    /**
+	     * @type {Request}
+	     */
+	    let r = null;
+
+	    if (request instanceof Request) {
+	      r = request[kState];
+
+	      if (r.method !== 'GET' && !options.ignoreMethod) {
+	        return false
+	      }
+	    } else {
+	      assert(typeof request === 'string');
+
+	      r = new Request(request)[kState];
+	    }
+
+	    /** @type {CacheBatchOperation[]} */
+	    const operations = [];
+
+	    /** @type {CacheBatchOperation} */
+	    const operation = {
+	      type: 'delete',
+	      request: r,
+	      options
+	    };
+
+	    operations.push(operation);
+
+	    const cacheJobPromise = createDeferredPromise();
+
+	    let errorData = null;
+	    let requestResponses;
+
+	    try {
+	      requestResponses = this.#batchCacheOperations(operations);
+	    } catch (e) {
+	      errorData = e;
+	    }
+
+	    queueMicrotask(() => {
+	      if (errorData === null) {
+	        cacheJobPromise.resolve(!!requestResponses?.length);
+	      } else {
+	        cacheJobPromise.reject(errorData);
+	      }
+	    });
+
+	    return cacheJobPromise.promise
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys
+	   * @param {any} request
+	   * @param {import('../../types/cache').CacheQueryOptions} options
+	   * @returns {Promise}
+	   */
+	  async keys (request = undefined, options = {}) {
+	    webidl.brandCheck(this, Cache);
+
+	    const prefix = 'Cache.keys';
+
+	    if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request');
+	    options = webidl.converters.CacheQueryOptions(options, prefix, 'options');
+
+	    // 1.
+	    let r = null;
+
+	    // 2.
+	    if (request !== undefined) {
+	      // 2.1
+	      if (request instanceof Request) {
+	        // 2.1.1
+	        r = request[kState];
+
+	        // 2.1.2
+	        if (r.method !== 'GET' && !options.ignoreMethod) {
+	          return []
+	        }
+	      } else if (typeof request === 'string') { // 2.2
+	        r = new Request(request)[kState];
+	      }
+	    }
+
+	    // 4.
+	    const promise = createDeferredPromise();
+
+	    // 5.
+	    // 5.1
+	    const requests = [];
+
+	    // 5.2
+	    if (request === undefined) {
+	      // 5.2.1
+	      for (const requestResponse of this.#relevantRequestResponseList) {
+	        // 5.2.1.1
+	        requests.push(requestResponse[0]);
+	      }
+	    } else { // 5.3
+	      // 5.3.1
+	      const requestResponses = this.#queryCache(r, options);
+
+	      // 5.3.2
+	      for (const requestResponse of requestResponses) {
+	        // 5.3.2.1
+	        requests.push(requestResponse[0]);
+	      }
+	    }
+
+	    // 5.4
+	    queueMicrotask(() => {
+	      // 5.4.1
+	      const requestList = [];
+
+	      // 5.4.2
+	      for (const request of requests) {
+	        const requestObject = fromInnerRequest(
+	          request,
+	          new AbortController().signal,
+	          'immutable'
+	        );
+	        // 5.4.2.1
+	        requestList.push(requestObject);
+	      }
+
+	      // 5.4.3
+	      promise.resolve(Object.freeze(requestList));
+	    });
+
+	    return promise.promise
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm
+	   * @param {CacheBatchOperation[]} operations
+	   * @returns {requestResponseList}
+	   */
+	  #batchCacheOperations (operations) {
+	    // 1.
+	    const cache = this.#relevantRequestResponseList;
+
+	    // 2.
+	    const backupCache = [...cache];
+
+	    // 3.
+	    const addedItems = [];
+
+	    // 4.1
+	    const resultList = [];
+
+	    try {
+	      // 4.2
+	      for (const operation of operations) {
+	        // 4.2.1
+	        if (operation.type !== 'delete' && operation.type !== 'put') {
+	          throw webidl.errors.exception({
+	            header: 'Cache.#batchCacheOperations',
+	            message: 'operation type does not match "delete" or "put"'
+	          })
+	        }
+
+	        // 4.2.2
+	        if (operation.type === 'delete' && operation.response != null) {
+	          throw webidl.errors.exception({
+	            header: 'Cache.#batchCacheOperations',
+	            message: 'delete operation should not have an associated response'
+	          })
+	        }
+
+	        // 4.2.3
+	        if (this.#queryCache(operation.request, operation.options, addedItems).length) {
+	          throw new DOMException('???', 'InvalidStateError')
+	        }
+
+	        // 4.2.4
+	        let requestResponses;
+
+	        // 4.2.5
+	        if (operation.type === 'delete') {
+	          // 4.2.5.1
+	          requestResponses = this.#queryCache(operation.request, operation.options);
+
+	          // TODO: the spec is wrong, this is needed to pass WPTs
+	          if (requestResponses.length === 0) {
+	            return []
+	          }
+
+	          // 4.2.5.2
+	          for (const requestResponse of requestResponses) {
+	            const idx = cache.indexOf(requestResponse);
+	            assert(idx !== -1);
+
+	            // 4.2.5.2.1
+	            cache.splice(idx, 1);
+	          }
+	        } else if (operation.type === 'put') { // 4.2.6
+	          // 4.2.6.1
+	          if (operation.response == null) {
+	            throw webidl.errors.exception({
+	              header: 'Cache.#batchCacheOperations',
+	              message: 'put operation should have an associated response'
+	            })
+	          }
+
+	          // 4.2.6.2
+	          const r = operation.request;
+
+	          // 4.2.6.3
+	          if (!urlIsHttpHttpsScheme(r.url)) {
+	            throw webidl.errors.exception({
+	              header: 'Cache.#batchCacheOperations',
+	              message: 'expected http or https scheme'
+	            })
+	          }
+
+	          // 4.2.6.4
+	          if (r.method !== 'GET') {
+	            throw webidl.errors.exception({
+	              header: 'Cache.#batchCacheOperations',
+	              message: 'not get method'
+	            })
+	          }
+
+	          // 4.2.6.5
+	          if (operation.options != null) {
+	            throw webidl.errors.exception({
+	              header: 'Cache.#batchCacheOperations',
+	              message: 'options must not be defined'
+	            })
+	          }
+
+	          // 4.2.6.6
+	          requestResponses = this.#queryCache(operation.request);
+
+	          // 4.2.6.7
+	          for (const requestResponse of requestResponses) {
+	            const idx = cache.indexOf(requestResponse);
+	            assert(idx !== -1);
+
+	            // 4.2.6.7.1
+	            cache.splice(idx, 1);
+	          }
+
+	          // 4.2.6.8
+	          cache.push([operation.request, operation.response]);
+
+	          // 4.2.6.10
+	          addedItems.push([operation.request, operation.response]);
+	        }
+
+	        // 4.2.7
+	        resultList.push([operation.request, operation.response]);
+	      }
+
+	      // 4.3
+	      return resultList
+	    } catch (e) { // 5.
+	      // 5.1
+	      this.#relevantRequestResponseList.length = 0;
+
+	      // 5.2
+	      this.#relevantRequestResponseList = backupCache;
+
+	      // 5.3
+	      throw e
+	    }
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#query-cache
+	   * @param {any} requestQuery
+	   * @param {import('../../types/cache').CacheQueryOptions} options
+	   * @param {requestResponseList} targetStorage
+	   * @returns {requestResponseList}
+	   */
+	  #queryCache (requestQuery, options, targetStorage) {
+	    /** @type {requestResponseList} */
+	    const resultList = [];
+
+	    const storage = targetStorage ?? this.#relevantRequestResponseList;
+
+	    for (const requestResponse of storage) {
+	      const [cachedRequest, cachedResponse] = requestResponse;
+	      if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) {
+	        resultList.push(requestResponse);
+	      }
+	    }
+
+	    return resultList
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm
+	   * @param {any} requestQuery
+	   * @param {any} request
+	   * @param {any | null} response
+	   * @param {import('../../types/cache').CacheQueryOptions | undefined} options
+	   * @returns {boolean}
+	   */
+	  #requestMatchesCachedItem (requestQuery, request, response = null, options) {
+	    // if (options?.ignoreMethod === false && request.method === 'GET') {
+	    //   return false
+	    // }
+
+	    const queryURL = new URL(requestQuery.url);
+
+	    const cachedURL = new URL(request.url);
+
+	    if (options?.ignoreSearch) {
+	      cachedURL.search = '';
+
+	      queryURL.search = '';
+	    }
+
+	    if (!urlEquals(queryURL, cachedURL, true)) {
+	      return false
+	    }
+
+	    if (
+	      response == null ||
+	      options?.ignoreVary ||
+	      !response.headersList.contains('vary')
+	    ) {
+	      return true
+	    }
+
+	    const fieldValues = getFieldValues(response.headersList.get('vary'));
+
+	    for (const fieldValue of fieldValues) {
+	      if (fieldValue === '*') {
+	        return false
+	      }
+
+	      const requestValue = request.headersList.get(fieldValue);
+	      const queryValue = requestQuery.headersList.get(fieldValue);
+
+	      // If one has the header and the other doesn't, or one has
+	      // a different value than the other, return false
+	      if (requestValue !== queryValue) {
+	        return false
+	      }
+	    }
+
+	    return true
+	  }
+
+	  #internalMatchAll (request, options, maxResponses = Infinity) {
+	    // 1.
+	    let r = null;
+
+	    // 2.
+	    if (request !== undefined) {
+	      if (request instanceof Request) {
+	        // 2.1.1
+	        r = request[kState];
+
+	        // 2.1.2
+	        if (r.method !== 'GET' && !options.ignoreMethod) {
+	          return []
+	        }
+	      } else if (typeof request === 'string') {
+	        // 2.2.1
+	        r = new Request(request)[kState];
+	      }
+	    }
+
+	    // 5.
+	    // 5.1
+	    const responses = [];
+
+	    // 5.2
+	    if (request === undefined) {
+	      // 5.2.1
+	      for (const requestResponse of this.#relevantRequestResponseList) {
+	        responses.push(requestResponse[1]);
+	      }
+	    } else { // 5.3
+	      // 5.3.1
+	      const requestResponses = this.#queryCache(r, options);
+
+	      // 5.3.2
+	      for (const requestResponse of requestResponses) {
+	        responses.push(requestResponse[1]);
+	      }
+	    }
+
+	    // 5.4
+	    // We don't implement CORs so we don't need to loop over the responses, yay!
+
+	    // 5.5.1
+	    const responseList = [];
+
+	    // 5.5.2
+	    for (const response of responses) {
+	      // 5.5.2.1
+	      const responseObject = fromInnerResponse(response, 'immutable');
+
+	      responseList.push(responseObject.clone());
+
+	      if (responseList.length >= maxResponses) {
+	        break
+	      }
+	    }
+
+	    // 6.
+	    return Object.freeze(responseList)
+	  }
+	}
+
+	Object.defineProperties(Cache.prototype, {
+	  [Symbol.toStringTag]: {
+	    value: 'Cache',
+	    configurable: true
+	  },
+	  match: kEnumerableProperty,
+	  matchAll: kEnumerableProperty,
+	  add: kEnumerableProperty,
+	  addAll: kEnumerableProperty,
+	  put: kEnumerableProperty,
+	  delete: kEnumerableProperty,
+	  keys: kEnumerableProperty
+	});
+
+	const cacheQueryOptionConverters = [
+	  {
+	    key: 'ignoreSearch',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'ignoreMethod',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'ignoreVary',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  }
+	];
+
+	webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters);
+
+	webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([
+	  ...cacheQueryOptionConverters,
+	  {
+	    key: 'cacheName',
+	    converter: webidl.converters.DOMString
+	  }
+	]);
+
+	webidl.converters.Response = webidl.interfaceConverter(Response);
+
+	webidl.converters['sequence'] = webidl.sequenceConverter(
+	  webidl.converters.RequestInfo
+	);
+
+	cache = {
+	  Cache
+	};
+	return cache;
+}
+
+var cachestorage;
+var hasRequiredCachestorage;
+
+function requireCachestorage () {
+	if (hasRequiredCachestorage) return cachestorage;
+	hasRequiredCachestorage = 1;
+
+	const { kConstruct } = requireSymbols$1();
+	const { Cache } = requireCache();
+	const { webidl } = requireWebidl();
+	const { kEnumerableProperty } = requireUtil$7();
+
+	class CacheStorage {
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map
+	   * @type {Map}
+	   */
+	  async has (cacheName) {
+	    webidl.brandCheck(this, CacheStorage);
+
+	    const prefix = 'CacheStorage.has';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName');
+
+	    // 2.1.1
+	    // 2.2
+	    return this.#caches.has(cacheName)
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open
+	   * @param {string} cacheName
+	   * @returns {Promise}
+	   */
+	  async open (cacheName) {
+	    webidl.brandCheck(this, CacheStorage);
+
+	    const prefix = 'CacheStorage.open';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName');
+
+	    // 2.1
+	    if (this.#caches.has(cacheName)) {
+	      // await caches.open('v1') !== await caches.open('v1')
+
+	      // 2.1.1
+	      const cache = this.#caches.get(cacheName);
+
+	      // 2.1.1.1
+	      return new Cache(kConstruct, cache)
+	    }
+
+	    // 2.2
+	    const cache = [];
+
+	    // 2.3
+	    this.#caches.set(cacheName, cache);
+
+	    // 2.4
+	    return new Cache(kConstruct, cache)
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete
+	   * @param {string} cacheName
+	   * @returns {Promise}
+	   */
+	  async delete (cacheName) {
+	    webidl.brandCheck(this, CacheStorage);
+
+	    const prefix = 'CacheStorage.delete';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName');
+
+	    return this.#caches.delete(cacheName)
+	  }
+
+	  /**
+	   * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys
+	   * @returns {Promise}
+	   */
+	  async keys () {
+	    webidl.brandCheck(this, CacheStorage);
+
+	    // 2.1
+	    const keys = this.#caches.keys();
+
+	    // 2.2
+	    return [...keys]
+	  }
+	}
+
+	Object.defineProperties(CacheStorage.prototype, {
+	  [Symbol.toStringTag]: {
+	    value: 'CacheStorage',
+	    configurable: true
+	  },
+	  match: kEnumerableProperty,
+	  has: kEnumerableProperty,
+	  open: kEnumerableProperty,
+	  delete: kEnumerableProperty,
+	  keys: kEnumerableProperty
+	});
+
+	cachestorage = {
+	  CacheStorage
+	};
+	return cachestorage;
+}
+
+var constants$2;
+var hasRequiredConstants$2;
+
+function requireConstants$2 () {
+	if (hasRequiredConstants$2) return constants$2;
+	hasRequiredConstants$2 = 1;
+
+	// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size
+	const maxAttributeValueSize = 1024;
+
+	// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size
+	const maxNameValuePairSize = 4096;
+
+	constants$2 = {
+	  maxAttributeValueSize,
+	  maxNameValuePairSize
+	};
+	return constants$2;
+}
+
+var util$2;
+var hasRequiredUtil$2;
+
+function requireUtil$2 () {
+	if (hasRequiredUtil$2) return util$2;
+	hasRequiredUtil$2 = 1;
+
+	/**
+	 * @param {string} value
+	 * @returns {boolean}
+	 */
+	function isCTLExcludingHtab (value) {
+	  for (let i = 0; i < value.length; ++i) {
+	    const code = value.charCodeAt(i);
+
+	    if (
+	      (code >= 0x00 && code <= 0x08) ||
+	      (code >= 0x0A && code <= 0x1F) ||
+	      code === 0x7F
+	    ) {
+	      return true
+	    }
+	  }
+	  return false
+	}
+
+	/**
+	 CHAR           = 
+	 token          = 1*
+	 separators     = "(" | ")" | "<" | ">" | "@"
+	                | "," | ";" | ":" | "\" | <">
+	                | "/" | "[" | "]" | "?" | "="
+	                | "{" | "}" | SP | HT
+	 * @param {string} name
+	 */
+	function validateCookieName (name) {
+	  for (let i = 0; i < name.length; ++i) {
+	    const code = name.charCodeAt(i);
+
+	    if (
+	      code < 0x21 || // exclude CTLs (0-31), SP and HT
+	      code > 0x7E || // exclude non-ascii and DEL
+	      code === 0x22 || // "
+	      code === 0x28 || // (
+	      code === 0x29 || // )
+	      code === 0x3C || // <
+	      code === 0x3E || // >
+	      code === 0x40 || // @
+	      code === 0x2C || // ,
+	      code === 0x3B || // ;
+	      code === 0x3A || // :
+	      code === 0x5C || // \
+	      code === 0x2F || // /
+	      code === 0x5B || // [
+	      code === 0x5D || // ]
+	      code === 0x3F || // ?
+	      code === 0x3D || // =
+	      code === 0x7B || // {
+	      code === 0x7D // }
+	    ) {
+	      throw new Error('Invalid cookie name')
+	    }
+	  }
+	}
+
+	/**
+	 cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
+	 cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
+	                       ; US-ASCII characters excluding CTLs,
+	                       ; whitespace DQUOTE, comma, semicolon,
+	                       ; and backslash
+	 * @param {string} value
+	 */
+	function validateCookieValue (value) {
+	  let len = value.length;
+	  let i = 0;
+
+	  // if the value is wrapped in DQUOTE
+	  if (value[0] === '"') {
+	    if (len === 1 || value[len - 1] !== '"') {
+	      throw new Error('Invalid cookie value')
+	    }
+	    --len;
+	    ++i;
+	  }
+
+	  while (i < len) {
+	    const code = value.charCodeAt(i++);
+
+	    if (
+	      code < 0x21 || // exclude CTLs (0-31)
+	      code > 0x7E || // non-ascii and DEL (127)
+	      code === 0x22 || // "
+	      code === 0x2C || // ,
+	      code === 0x3B || // ;
+	      code === 0x5C // \
+	    ) {
+	      throw new Error('Invalid cookie value')
+	    }
+	  }
+	}
+
+	/**
+	 * path-value        = 
+	 * @param {string} path
+	 */
+	function validateCookiePath (path) {
+	  for (let i = 0; i < path.length; ++i) {
+	    const code = path.charCodeAt(i);
+
+	    if (
+	      code < 0x20 || // exclude CTLs (0-31)
+	      code === 0x7F || // DEL
+	      code === 0x3B // ;
+	    ) {
+	      throw new Error('Invalid cookie path')
+	    }
+	  }
+	}
+
+	/**
+	 * I have no idea why these values aren't allowed to be honest,
+	 * but Deno tests these. - Khafra
+	 * @param {string} domain
+	 */
+	function validateCookieDomain (domain) {
+	  if (
+	    domain.startsWith('-') ||
+	    domain.endsWith('.') ||
+	    domain.endsWith('-')
+	  ) {
+	    throw new Error('Invalid cookie domain')
+	  }
+	}
+
+	const IMFDays = [
+	  'Sun', 'Mon', 'Tue', 'Wed',
+	  'Thu', 'Fri', 'Sat'
+	];
+
+	const IMFMonths = [
+	  'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+	  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
+	];
+
+	const IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0'));
+
+	/**
+	 * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1
+	 * @param {number|Date} date
+	  IMF-fixdate  = day-name "," SP date1 SP time-of-day SP GMT
+	  ; fixed length/zone/capitalization subset of the format
+	  ; see Section 3.3 of [RFC5322]
+
+	  day-name     = %x4D.6F.6E ; "Mon", case-sensitive
+	              / %x54.75.65 ; "Tue", case-sensitive
+	              / %x57.65.64 ; "Wed", case-sensitive
+	              / %x54.68.75 ; "Thu", case-sensitive
+	              / %x46.72.69 ; "Fri", case-sensitive
+	              / %x53.61.74 ; "Sat", case-sensitive
+	              / %x53.75.6E ; "Sun", case-sensitive
+	  date1        = day SP month SP year
+	                  ; e.g., 02 Jun 1982
+
+	  day          = 2DIGIT
+	  month        = %x4A.61.6E ; "Jan", case-sensitive
+	              / %x46.65.62 ; "Feb", case-sensitive
+	              / %x4D.61.72 ; "Mar", case-sensitive
+	              / %x41.70.72 ; "Apr", case-sensitive
+	              / %x4D.61.79 ; "May", case-sensitive
+	              / %x4A.75.6E ; "Jun", case-sensitive
+	              / %x4A.75.6C ; "Jul", case-sensitive
+	              / %x41.75.67 ; "Aug", case-sensitive
+	              / %x53.65.70 ; "Sep", case-sensitive
+	              / %x4F.63.74 ; "Oct", case-sensitive
+	              / %x4E.6F.76 ; "Nov", case-sensitive
+	              / %x44.65.63 ; "Dec", case-sensitive
+	  year         = 4DIGIT
+
+	  GMT          = %x47.4D.54 ; "GMT", case-sensitive
+
+	  time-of-day  = hour ":" minute ":" second
+	              ; 00:00:00 - 23:59:60 (leap second)
+
+	  hour         = 2DIGIT
+	  minute       = 2DIGIT
+	  second       = 2DIGIT
+	 */
+	function toIMFDate (date) {
+	  if (typeof date === 'number') {
+	    date = new Date(date);
+	  }
+
+	  return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`
+	}
+
+	/**
+	 max-age-av        = "Max-Age=" non-zero-digit *DIGIT
+	                       ; In practice, both expires-av and max-age-av
+	                       ; are limited to dates representable by the
+	                       ; user agent.
+	 * @param {number} maxAge
+	 */
+	function validateCookieMaxAge (maxAge) {
+	  if (maxAge < 0) {
+	    throw new Error('Invalid cookie max-age')
+	  }
+	}
+
+	/**
+	 * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1
+	 * @param {import('./index').Cookie} cookie
+	 */
+	function stringify (cookie) {
+	  if (cookie.name.length === 0) {
+	    return null
+	  }
+
+	  validateCookieName(cookie.name);
+	  validateCookieValue(cookie.value);
+
+	  const out = [`${cookie.name}=${cookie.value}`];
+
+	  // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1
+	  // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2
+	  if (cookie.name.startsWith('__Secure-')) {
+	    cookie.secure = true;
+	  }
+
+	  if (cookie.name.startsWith('__Host-')) {
+	    cookie.secure = true;
+	    cookie.domain = null;
+	    cookie.path = '/';
+	  }
+
+	  if (cookie.secure) {
+	    out.push('Secure');
+	  }
+
+	  if (cookie.httpOnly) {
+	    out.push('HttpOnly');
+	  }
+
+	  if (typeof cookie.maxAge === 'number') {
+	    validateCookieMaxAge(cookie.maxAge);
+	    out.push(`Max-Age=${cookie.maxAge}`);
+	  }
+
+	  if (cookie.domain) {
+	    validateCookieDomain(cookie.domain);
+	    out.push(`Domain=${cookie.domain}`);
+	  }
+
+	  if (cookie.path) {
+	    validateCookiePath(cookie.path);
+	    out.push(`Path=${cookie.path}`);
+	  }
+
+	  if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {
+	    out.push(`Expires=${toIMFDate(cookie.expires)}`);
+	  }
+
+	  if (cookie.sameSite) {
+	    out.push(`SameSite=${cookie.sameSite}`);
+	  }
+
+	  for (const part of cookie.unparsed) {
+	    if (!part.includes('=')) {
+	      throw new Error('Invalid unparsed')
+	    }
+
+	    const [key, ...value] = part.split('=');
+
+	    out.push(`${key.trim()}=${value.join('=')}`);
+	  }
+
+	  return out.join('; ')
+	}
+
+	util$2 = {
+	  isCTLExcludingHtab,
+	  validateCookieName,
+	  validateCookiePath,
+	  validateCookieValue,
+	  toIMFDate,
+	  stringify
+	};
+	return util$2;
+}
+
+var parse$1;
+var hasRequiredParse$1;
+
+function requireParse$1 () {
+	if (hasRequiredParse$1) return parse$1;
+	hasRequiredParse$1 = 1;
+
+	const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$2();
+	const { isCTLExcludingHtab } = requireUtil$2();
+	const { collectASequenceOfCodePointsFast } = requireDataUrl();
+	const assert = require$$0$7;
+
+	/**
+	 * @description Parses the field-value attributes of a set-cookie header string.
+	 * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4
+	 * @param {string} header
+	 * @returns if the header is invalid, null will be returned
+	 */
+	function parseSetCookie (header) {
+	  // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F
+	  //    character (CTL characters excluding HTAB): Abort these steps and
+	  //    ignore the set-cookie-string entirely.
+	  if (isCTLExcludingHtab(header)) {
+	    return null
+	  }
+
+	  let nameValuePair = '';
+	  let unparsedAttributes = '';
+	  let name = '';
+	  let value = '';
+
+	  // 2. If the set-cookie-string contains a %x3B (";") character:
+	  if (header.includes(';')) {
+	    // 1. The name-value-pair string consists of the characters up to,
+	    //    but not including, the first %x3B (";"), and the unparsed-
+	    //    attributes consist of the remainder of the set-cookie-string
+	    //    (including the %x3B (";") in question).
+	    const position = { position: 0 };
+
+	    nameValuePair = collectASequenceOfCodePointsFast(';', header, position);
+	    unparsedAttributes = header.slice(position.position);
+	  } else {
+	    // Otherwise:
+
+	    // 1. The name-value-pair string consists of all the characters
+	    //    contained in the set-cookie-string, and the unparsed-
+	    //    attributes is the empty string.
+	    nameValuePair = header;
+	  }
+
+	  // 3. If the name-value-pair string lacks a %x3D ("=") character, then
+	  //    the name string is empty, and the value string is the value of
+	  //    name-value-pair.
+	  if (!nameValuePair.includes('=')) {
+	    value = nameValuePair;
+	  } else {
+	    //    Otherwise, the name string consists of the characters up to, but
+	    //    not including, the first %x3D ("=") character, and the (possibly
+	    //    empty) value string consists of the characters after the first
+	    //    %x3D ("=") character.
+	    const position = { position: 0 };
+	    name = collectASequenceOfCodePointsFast(
+	      '=',
+	      nameValuePair,
+	      position
+	    );
+	    value = nameValuePair.slice(position.position + 1);
+	  }
+
+	  // 4. Remove any leading or trailing WSP characters from the name
+	  //    string and the value string.
+	  name = name.trim();
+	  value = value.trim();
+
+	  // 5. If the sum of the lengths of the name string and the value string
+	  //    is more than 4096 octets, abort these steps and ignore the set-
+	  //    cookie-string entirely.
+	  if (name.length + value.length > maxNameValuePairSize) {
+	    return null
+	  }
+
+	  // 6. The cookie-name is the name string, and the cookie-value is the
+	  //    value string.
+	  return {
+	    name, value, ...parseUnparsedAttributes(unparsedAttributes)
+	  }
+	}
+
+	/**
+	 * Parses the remaining attributes of a set-cookie header
+	 * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4
+	 * @param {string} unparsedAttributes
+	 * @param {[Object.]={}} cookieAttributeList
+	 */
+	function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {
+	  // 1. If the unparsed-attributes string is empty, skip the rest of
+	  //    these steps.
+	  if (unparsedAttributes.length === 0) {
+	    return cookieAttributeList
+	  }
+
+	  // 2. Discard the first character of the unparsed-attributes (which
+	  //    will be a %x3B (";") character).
+	  assert(unparsedAttributes[0] === ';');
+	  unparsedAttributes = unparsedAttributes.slice(1);
+
+	  let cookieAv = '';
+
+	  // 3. If the remaining unparsed-attributes contains a %x3B (";")
+	  //    character:
+	  if (unparsedAttributes.includes(';')) {
+	    // 1. Consume the characters of the unparsed-attributes up to, but
+	    //    not including, the first %x3B (";") character.
+	    cookieAv = collectASequenceOfCodePointsFast(
+	      ';',
+	      unparsedAttributes,
+	      { position: 0 }
+	    );
+	    unparsedAttributes = unparsedAttributes.slice(cookieAv.length);
+	  } else {
+	    // Otherwise:
+
+	    // 1. Consume the remainder of the unparsed-attributes.
+	    cookieAv = unparsedAttributes;
+	    unparsedAttributes = '';
+	  }
+
+	  // Let the cookie-av string be the characters consumed in this step.
+
+	  let attributeName = '';
+	  let attributeValue = '';
+
+	  // 4. If the cookie-av string contains a %x3D ("=") character:
+	  if (cookieAv.includes('=')) {
+	    // 1. The (possibly empty) attribute-name string consists of the
+	    //    characters up to, but not including, the first %x3D ("=")
+	    //    character, and the (possibly empty) attribute-value string
+	    //    consists of the characters after the first %x3D ("=")
+	    //    character.
+	    const position = { position: 0 };
+
+	    attributeName = collectASequenceOfCodePointsFast(
+	      '=',
+	      cookieAv,
+	      position
+	    );
+	    attributeValue = cookieAv.slice(position.position + 1);
+	  } else {
+	    // Otherwise:
+
+	    // 1. The attribute-name string consists of the entire cookie-av
+	    //    string, and the attribute-value string is empty.
+	    attributeName = cookieAv;
+	  }
+
+	  // 5. Remove any leading or trailing WSP characters from the attribute-
+	  //    name string and the attribute-value string.
+	  attributeName = attributeName.trim();
+	  attributeValue = attributeValue.trim();
+
+	  // 6. If the attribute-value is longer than 1024 octets, ignore the
+	  //    cookie-av string and return to Step 1 of this algorithm.
+	  if (attributeValue.length > maxAttributeValueSize) {
+	    return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
+	  }
+
+	  // 7. Process the attribute-name and attribute-value according to the
+	  //    requirements in the following subsections.  (Notice that
+	  //    attributes with unrecognized attribute-names are ignored.)
+	  const attributeNameLowercase = attributeName.toLowerCase();
+
+	  // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1
+	  // If the attribute-name case-insensitively matches the string
+	  // "Expires", the user agent MUST process the cookie-av as follows.
+	  if (attributeNameLowercase === 'expires') {
+	    // 1. Let the expiry-time be the result of parsing the attribute-value
+	    //    as cookie-date (see Section 5.1.1).
+	    const expiryTime = new Date(attributeValue);
+
+	    // 2. If the attribute-value failed to parse as a cookie date, ignore
+	    //    the cookie-av.
+
+	    cookieAttributeList.expires = expiryTime;
+	  } else if (attributeNameLowercase === 'max-age') {
+	    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2
+	    // If the attribute-name case-insensitively matches the string "Max-
+	    // Age", the user agent MUST process the cookie-av as follows.
+
+	    // 1. If the first character of the attribute-value is not a DIGIT or a
+	    //    "-" character, ignore the cookie-av.
+	    const charCode = attributeValue.charCodeAt(0);
+
+	    if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {
+	      return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
+	    }
+
+	    // 2. If the remainder of attribute-value contains a non-DIGIT
+	    //    character, ignore the cookie-av.
+	    if (!/^\d+$/.test(attributeValue)) {
+	      return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
+	    }
+
+	    // 3. Let delta-seconds be the attribute-value converted to an integer.
+	    const deltaSeconds = Number(attributeValue);
+
+	    // 4. Let cookie-age-limit be the maximum age of the cookie (which
+	    //    SHOULD be 400 days or less, see Section 4.1.2.2).
+
+	    // 5. Set delta-seconds to the smaller of its present value and cookie-
+	    //    age-limit.
+	    // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)
+
+	    // 6. If delta-seconds is less than or equal to zero (0), let expiry-
+	    //    time be the earliest representable date and time.  Otherwise, let
+	    //    the expiry-time be the current date and time plus delta-seconds
+	    //    seconds.
+	    // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds
+
+	    // 7. Append an attribute to the cookie-attribute-list with an
+	    //    attribute-name of Max-Age and an attribute-value of expiry-time.
+	    cookieAttributeList.maxAge = deltaSeconds;
+	  } else if (attributeNameLowercase === 'domain') {
+	    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3
+	    // If the attribute-name case-insensitively matches the string "Domain",
+	    // the user agent MUST process the cookie-av as follows.
+
+	    // 1. Let cookie-domain be the attribute-value.
+	    let cookieDomain = attributeValue;
+
+	    // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be
+	    //    cookie-domain without its leading %x2E (".").
+	    if (cookieDomain[0] === '.') {
+	      cookieDomain = cookieDomain.slice(1);
+	    }
+
+	    // 3. Convert the cookie-domain to lower case.
+	    cookieDomain = cookieDomain.toLowerCase();
+
+	    // 4. Append an attribute to the cookie-attribute-list with an
+	    //    attribute-name of Domain and an attribute-value of cookie-domain.
+	    cookieAttributeList.domain = cookieDomain;
+	  } else if (attributeNameLowercase === 'path') {
+	    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4
+	    // If the attribute-name case-insensitively matches the string "Path",
+	    // the user agent MUST process the cookie-av as follows.
+
+	    // 1. If the attribute-value is empty or if the first character of the
+	    //    attribute-value is not %x2F ("/"):
+	    let cookiePath = '';
+	    if (attributeValue.length === 0 || attributeValue[0] !== '/') {
+	      // 1. Let cookie-path be the default-path.
+	      cookiePath = '/';
+	    } else {
+	      // Otherwise:
+
+	      // 1. Let cookie-path be the attribute-value.
+	      cookiePath = attributeValue;
+	    }
+
+	    // 2. Append an attribute to the cookie-attribute-list with an
+	    //    attribute-name of Path and an attribute-value of cookie-path.
+	    cookieAttributeList.path = cookiePath;
+	  } else if (attributeNameLowercase === 'secure') {
+	    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5
+	    // If the attribute-name case-insensitively matches the string "Secure",
+	    // the user agent MUST append an attribute to the cookie-attribute-list
+	    // with an attribute-name of Secure and an empty attribute-value.
+
+	    cookieAttributeList.secure = true;
+	  } else if (attributeNameLowercase === 'httponly') {
+	    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6
+	    // If the attribute-name case-insensitively matches the string
+	    // "HttpOnly", the user agent MUST append an attribute to the cookie-
+	    // attribute-list with an attribute-name of HttpOnly and an empty
+	    // attribute-value.
+
+	    cookieAttributeList.httpOnly = true;
+	  } else if (attributeNameLowercase === 'samesite') {
+	    // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7
+	    // If the attribute-name case-insensitively matches the string
+	    // "SameSite", the user agent MUST process the cookie-av as follows:
+
+	    // 1. Let enforcement be "Default".
+	    let enforcement = 'Default';
+
+	    const attributeValueLowercase = attributeValue.toLowerCase();
+	    // 2. If cookie-av's attribute-value is a case-insensitive match for
+	    //    "None", set enforcement to "None".
+	    if (attributeValueLowercase.includes('none')) {
+	      enforcement = 'None';
+	    }
+
+	    // 3. If cookie-av's attribute-value is a case-insensitive match for
+	    //    "Strict", set enforcement to "Strict".
+	    if (attributeValueLowercase.includes('strict')) {
+	      enforcement = 'Strict';
+	    }
+
+	    // 4. If cookie-av's attribute-value is a case-insensitive match for
+	    //    "Lax", set enforcement to "Lax".
+	    if (attributeValueLowercase.includes('lax')) {
+	      enforcement = 'Lax';
+	    }
+
+	    // 5. Append an attribute to the cookie-attribute-list with an
+	    //    attribute-name of "SameSite" and an attribute-value of
+	    //    enforcement.
+	    cookieAttributeList.sameSite = enforcement;
+	  } else {
+	    cookieAttributeList.unparsed ??= [];
+
+	    cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`);
+	  }
+
+	  // 8. Return to Step 1 of this algorithm.
+	  return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
+	}
+
+	parse$1 = {
+	  parseSetCookie,
+	  parseUnparsedAttributes
+	};
+	return parse$1;
+}
+
+var cookies;
+var hasRequiredCookies;
+
+function requireCookies () {
+	if (hasRequiredCookies) return cookies;
+	hasRequiredCookies = 1;
+
+	const { parseSetCookie } = requireParse$1();
+	const { stringify } = requireUtil$2();
+	const { webidl } = requireWebidl();
+	const { Headers } = requireHeaders();
+
+	/**
+	 * @typedef {Object} Cookie
+	 * @property {string} name
+	 * @property {string} value
+	 * @property {Date|number|undefined} expires
+	 * @property {number|undefined} maxAge
+	 * @property {string|undefined} domain
+	 * @property {string|undefined} path
+	 * @property {boolean|undefined} secure
+	 * @property {boolean|undefined} httpOnly
+	 * @property {'Strict'|'Lax'|'None'} sameSite
+	 * @property {string[]} unparsed
+	 */
+
+	/**
+	 * @param {Headers} headers
+	 * @returns {Record}
+	 */
+	function getCookies (headers) {
+	  webidl.argumentLengthCheck(arguments, 1, 'getCookies');
+
+	  webidl.brandCheck(headers, Headers, { strict: false });
+
+	  const cookie = headers.get('cookie');
+	  const out = {};
+
+	  if (!cookie) {
+	    return out
+	  }
+
+	  for (const piece of cookie.split(';')) {
+	    const [name, ...value] = piece.split('=');
+
+	    out[name.trim()] = value.join('=');
+	  }
+
+	  return out
+	}
+
+	/**
+	 * @param {Headers} headers
+	 * @param {string} name
+	 * @param {{ path?: string, domain?: string }|undefined} attributes
+	 * @returns {void}
+	 */
+	function deleteCookie (headers, name, attributes) {
+	  webidl.brandCheck(headers, Headers, { strict: false });
+
+	  const prefix = 'deleteCookie';
+	  webidl.argumentLengthCheck(arguments, 2, prefix);
+
+	  name = webidl.converters.DOMString(name, prefix, 'name');
+	  attributes = webidl.converters.DeleteCookieAttributes(attributes);
+
+	  // Matches behavior of
+	  // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278
+	  setCookie(headers, {
+	    name,
+	    value: '',
+	    expires: new Date(0),
+	    ...attributes
+	  });
+	}
+
+	/**
+	 * @param {Headers} headers
+	 * @returns {Cookie[]}
+	 */
+	function getSetCookies (headers) {
+	  webidl.argumentLengthCheck(arguments, 1, 'getSetCookies');
+
+	  webidl.brandCheck(headers, Headers, { strict: false });
+
+	  const cookies = headers.getSetCookie();
+
+	  if (!cookies) {
+	    return []
+	  }
+
+	  return cookies.map((pair) => parseSetCookie(pair))
+	}
+
+	/**
+	 * @param {Headers} headers
+	 * @param {Cookie} cookie
+	 * @returns {void}
+	 */
+	function setCookie (headers, cookie) {
+	  webidl.argumentLengthCheck(arguments, 2, 'setCookie');
+
+	  webidl.brandCheck(headers, Headers, { strict: false });
+
+	  cookie = webidl.converters.Cookie(cookie);
+
+	  const str = stringify(cookie);
+
+	  if (str) {
+	    headers.append('Set-Cookie', str);
+	  }
+	}
+
+	webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([
+	  {
+	    converter: webidl.nullableConverter(webidl.converters.DOMString),
+	    key: 'path',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.nullableConverter(webidl.converters.DOMString),
+	    key: 'domain',
+	    defaultValue: () => null
+	  }
+	]);
+
+	webidl.converters.Cookie = webidl.dictionaryConverter([
+	  {
+	    converter: webidl.converters.DOMString,
+	    key: 'name'
+	  },
+	  {
+	    converter: webidl.converters.DOMString,
+	    key: 'value'
+	  },
+	  {
+	    converter: webidl.nullableConverter((value) => {
+	      if (typeof value === 'number') {
+	        return webidl.converters['unsigned long long'](value)
+	      }
+
+	      return new Date(value)
+	    }),
+	    key: 'expires',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.nullableConverter(webidl.converters['long long']),
+	    key: 'maxAge',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.nullableConverter(webidl.converters.DOMString),
+	    key: 'domain',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.nullableConverter(webidl.converters.DOMString),
+	    key: 'path',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.nullableConverter(webidl.converters.boolean),
+	    key: 'secure',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.nullableConverter(webidl.converters.boolean),
+	    key: 'httpOnly',
+	    defaultValue: () => null
+	  },
+	  {
+	    converter: webidl.converters.USVString,
+	    key: 'sameSite',
+	    allowedValues: ['Strict', 'Lax', 'None']
+	  },
+	  {
+	    converter: webidl.sequenceConverter(webidl.converters.DOMString),
+	    key: 'unparsed',
+	    defaultValue: () => new Array(0)
+	  }
+	]);
+
+	cookies = {
+	  getCookies,
+	  deleteCookie,
+	  getSetCookies,
+	  setCookie
+	};
+	return cookies;
+}
+
+var events;
+var hasRequiredEvents;
+
+function requireEvents () {
+	if (hasRequiredEvents) return events;
+	hasRequiredEvents = 1;
+
+	const { webidl } = requireWebidl();
+	const { kEnumerableProperty } = requireUtil$7();
+	const { kConstruct } = requireSymbols$4();
+	const { MessagePort } = require$$1$3;
+
+	/**
+	 * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent
+	 */
+	class MessageEvent extends Event {
+	  #eventInit
+
+	  constructor (type, eventInitDict = {}) {
+	    if (type === kConstruct) {
+	      super(arguments[1], arguments[2]);
+	      webidl.util.markAsUncloneable(this);
+	      return
+	    }
+
+	    const prefix = 'MessageEvent constructor';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    type = webidl.converters.DOMString(type, prefix, 'type');
+	    eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict');
+
+	    super(type, eventInitDict);
+
+	    this.#eventInit = eventInitDict;
+	    webidl.util.markAsUncloneable(this);
+	  }
+
+	  get data () {
+	    webidl.brandCheck(this, MessageEvent);
+
+	    return this.#eventInit.data
+	  }
+
+	  get origin () {
+	    webidl.brandCheck(this, MessageEvent);
+
+	    return this.#eventInit.origin
+	  }
+
+	  get lastEventId () {
+	    webidl.brandCheck(this, MessageEvent);
+
+	    return this.#eventInit.lastEventId
+	  }
+
+	  get source () {
+	    webidl.brandCheck(this, MessageEvent);
+
+	    return this.#eventInit.source
+	  }
+
+	  get ports () {
+	    webidl.brandCheck(this, MessageEvent);
+
+	    if (!Object.isFrozen(this.#eventInit.ports)) {
+	      Object.freeze(this.#eventInit.ports);
+	    }
+
+	    return this.#eventInit.ports
+	  }
+
+	  initMessageEvent (
+	    type,
+	    bubbles = false,
+	    cancelable = false,
+	    data = null,
+	    origin = '',
+	    lastEventId = '',
+	    source = null,
+	    ports = []
+	  ) {
+	    webidl.brandCheck(this, MessageEvent);
+
+	    webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent');
+
+	    return new MessageEvent(type, {
+	      bubbles, cancelable, data, origin, lastEventId, source, ports
+	    })
+	  }
+
+	  static createFastMessageEvent (type, init) {
+	    const messageEvent = new MessageEvent(kConstruct, type, init);
+	    messageEvent.#eventInit = init;
+	    messageEvent.#eventInit.data ??= null;
+	    messageEvent.#eventInit.origin ??= '';
+	    messageEvent.#eventInit.lastEventId ??= '';
+	    messageEvent.#eventInit.source ??= null;
+	    messageEvent.#eventInit.ports ??= [];
+	    return messageEvent
+	  }
+	}
+
+	const { createFastMessageEvent } = MessageEvent;
+	delete MessageEvent.createFastMessageEvent;
+
+	/**
+	 * @see https://websockets.spec.whatwg.org/#the-closeevent-interface
+	 */
+	class CloseEvent extends Event {
+	  #eventInit
+
+	  constructor (type, eventInitDict = {}) {
+	    const prefix = 'CloseEvent constructor';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    type = webidl.converters.DOMString(type, prefix, 'type');
+	    eventInitDict = webidl.converters.CloseEventInit(eventInitDict);
+
+	    super(type, eventInitDict);
+
+	    this.#eventInit = eventInitDict;
+	    webidl.util.markAsUncloneable(this);
+	  }
+
+	  get wasClean () {
+	    webidl.brandCheck(this, CloseEvent);
+
+	    return this.#eventInit.wasClean
+	  }
+
+	  get code () {
+	    webidl.brandCheck(this, CloseEvent);
+
+	    return this.#eventInit.code
+	  }
+
+	  get reason () {
+	    webidl.brandCheck(this, CloseEvent);
+
+	    return this.#eventInit.reason
+	  }
+	}
+
+	// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface
+	class ErrorEvent extends Event {
+	  #eventInit
+
+	  constructor (type, eventInitDict) {
+	    const prefix = 'ErrorEvent constructor';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
+
+	    super(type, eventInitDict);
+	    webidl.util.markAsUncloneable(this);
+
+	    type = webidl.converters.DOMString(type, prefix, 'type');
+	    eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {});
+
+	    this.#eventInit = eventInitDict;
+	  }
+
+	  get message () {
+	    webidl.brandCheck(this, ErrorEvent);
+
+	    return this.#eventInit.message
+	  }
+
+	  get filename () {
+	    webidl.brandCheck(this, ErrorEvent);
+
+	    return this.#eventInit.filename
+	  }
+
+	  get lineno () {
+	    webidl.brandCheck(this, ErrorEvent);
+
+	    return this.#eventInit.lineno
+	  }
+
+	  get colno () {
+	    webidl.brandCheck(this, ErrorEvent);
+
+	    return this.#eventInit.colno
+	  }
+
+	  get error () {
+	    webidl.brandCheck(this, ErrorEvent);
+
+	    return this.#eventInit.error
+	  }
+	}
+
+	Object.defineProperties(MessageEvent.prototype, {
+	  [Symbol.toStringTag]: {
+	    value: 'MessageEvent',
+	    configurable: true
+	  },
+	  data: kEnumerableProperty,
+	  origin: kEnumerableProperty,
+	  lastEventId: kEnumerableProperty,
+	  source: kEnumerableProperty,
+	  ports: kEnumerableProperty,
+	  initMessageEvent: kEnumerableProperty
+	});
+
+	Object.defineProperties(CloseEvent.prototype, {
+	  [Symbol.toStringTag]: {
+	    value: 'CloseEvent',
+	    configurable: true
+	  },
+	  reason: kEnumerableProperty,
+	  code: kEnumerableProperty,
+	  wasClean: kEnumerableProperty
+	});
+
+	Object.defineProperties(ErrorEvent.prototype, {
+	  [Symbol.toStringTag]: {
+	    value: 'ErrorEvent',
+	    configurable: true
+	  },
+	  message: kEnumerableProperty,
+	  filename: kEnumerableProperty,
+	  lineno: kEnumerableProperty,
+	  colno: kEnumerableProperty,
+	  error: kEnumerableProperty
+	});
+
+	webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort);
+
+	webidl.converters['sequence'] = webidl.sequenceConverter(
+	  webidl.converters.MessagePort
+	);
+
+	const eventInit = [
+	  {
+	    key: 'bubbles',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'cancelable',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'composed',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  }
+	];
+
+	webidl.converters.MessageEventInit = webidl.dictionaryConverter([
+	  ...eventInit,
+	  {
+	    key: 'data',
+	    converter: webidl.converters.any,
+	    defaultValue: () => null
+	  },
+	  {
+	    key: 'origin',
+	    converter: webidl.converters.USVString,
+	    defaultValue: () => ''
+	  },
+	  {
+	    key: 'lastEventId',
+	    converter: webidl.converters.DOMString,
+	    defaultValue: () => ''
+	  },
+	  {
+	    key: 'source',
+	    // Node doesn't implement WindowProxy or ServiceWorker, so the only
+	    // valid value for source is a MessagePort.
+	    converter: webidl.nullableConverter(webidl.converters.MessagePort),
+	    defaultValue: () => null
+	  },
+	  {
+	    key: 'ports',
+	    converter: webidl.converters['sequence'],
+	    defaultValue: () => new Array(0)
+	  }
+	]);
+
+	webidl.converters.CloseEventInit = webidl.dictionaryConverter([
+	  ...eventInit,
+	  {
+	    key: 'wasClean',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'code',
+	    converter: webidl.converters['unsigned short'],
+	    defaultValue: () => 0
+	  },
+	  {
+	    key: 'reason',
+	    converter: webidl.converters.USVString,
+	    defaultValue: () => ''
+	  }
+	]);
+
+	webidl.converters.ErrorEventInit = webidl.dictionaryConverter([
+	  ...eventInit,
+	  {
+	    key: 'message',
+	    converter: webidl.converters.DOMString,
+	    defaultValue: () => ''
+	  },
+	  {
+	    key: 'filename',
+	    converter: webidl.converters.USVString,
+	    defaultValue: () => ''
+	  },
+	  {
+	    key: 'lineno',
+	    converter: webidl.converters['unsigned long'],
+	    defaultValue: () => 0
+	  },
+	  {
+	    key: 'colno',
+	    converter: webidl.converters['unsigned long'],
+	    defaultValue: () => 0
+	  },
+	  {
+	    key: 'error',
+	    converter: webidl.converters.any
+	  }
+	]);
+
+	events = {
+	  MessageEvent,
+	  CloseEvent,
+	  ErrorEvent,
+	  createFastMessageEvent
+	};
+	return events;
+}
+
+var constants$1;
+var hasRequiredConstants$1;
+
+function requireConstants$1 () {
+	if (hasRequiredConstants$1) return constants$1;
+	hasRequiredConstants$1 = 1;
+
+	// This is a Globally Unique Identifier unique used
+	// to validate that the endpoint accepts websocket
+	// connections.
+	// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3
+	const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
+
+	/** @type {PropertyDescriptor} */
+	const staticPropertyDescriptors = {
+	  enumerable: true,
+	  writable: false,
+	  configurable: false
+	};
+
+	const states = {
+	  CONNECTING: 0,
+	  OPEN: 1,
+	  CLOSING: 2,
+	  CLOSED: 3
+	};
+
+	const sentCloseFrameState = {
+	  NOT_SENT: 0,
+	  PROCESSING: 1,
+	  SENT: 2
+	};
+
+	const opcodes = {
+	  CONTINUATION: 0x0,
+	  TEXT: 0x1,
+	  BINARY: 0x2,
+	  CLOSE: 0x8,
+	  PING: 0x9,
+	  PONG: 0xA
+	};
+
+	const maxUnsigned16Bit = 2 ** 16 - 1; // 65535
+
+	const parserStates = {
+	  INFO: 0,
+	  PAYLOADLENGTH_16: 2,
+	  PAYLOADLENGTH_64: 3,
+	  READ_DATA: 4
+	};
+
+	const emptyBuffer = Buffer.allocUnsafe(0);
+
+	const sendHints = {
+	  string: 1,
+	  typedArray: 2,
+	  arrayBuffer: 3,
+	  blob: 4
+	};
+
+	constants$1 = {
+	  uid,
+	  sentCloseFrameState,
+	  staticPropertyDescriptors,
+	  states,
+	  opcodes,
+	  maxUnsigned16Bit,
+	  parserStates,
+	  emptyBuffer,
+	  sendHints
+	};
+	return constants$1;
+}
+
+var symbols;
+var hasRequiredSymbols;
+
+function requireSymbols () {
+	if (hasRequiredSymbols) return symbols;
+	hasRequiredSymbols = 1;
+
+	symbols = {
+	  kWebSocketURL: Symbol('url'),
+	  kReadyState: Symbol('ready state'),
+	  kController: Symbol('controller'),
+	  kResponse: Symbol('response'),
+	  kBinaryType: Symbol('binary type'),
+	  kSentClose: Symbol('sent close'),
+	  kReceivedClose: Symbol('received close'),
+	  kByteParser: Symbol('byte parser')
+	};
+	return symbols;
+}
+
+var util$1;
+var hasRequiredUtil$1;
+
+function requireUtil$1 () {
+	if (hasRequiredUtil$1) return util$1;
+	hasRequiredUtil$1 = 1;
+
+	const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols();
+	const { states, opcodes } = requireConstants$1();
+	const { ErrorEvent, createFastMessageEvent } = requireEvents();
+	const { isUtf8 } = require$$0$6;
+	const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = requireDataUrl();
+
+	/* globals Blob */
+
+	/**
+	 * @param {import('./websocket').WebSocket} ws
+	 * @returns {boolean}
+	 */
+	function isConnecting (ws) {
+	  // If the WebSocket connection is not yet established, and the connection
+	  // is not yet closed, then the WebSocket connection is in the CONNECTING state.
+	  return ws[kReadyState] === states.CONNECTING
+	}
+
+	/**
+	 * @param {import('./websocket').WebSocket} ws
+	 * @returns {boolean}
+	 */
+	function isEstablished (ws) {
+	  // If the server's response is validated as provided for above, it is
+	  // said that _The WebSocket Connection is Established_ and that the
+	  // WebSocket Connection is in the OPEN state.
+	  return ws[kReadyState] === states.OPEN
+	}
+
+	/**
+	 * @param {import('./websocket').WebSocket} ws
+	 * @returns {boolean}
+	 */
+	function isClosing (ws) {
+	  // Upon either sending or receiving a Close control frame, it is said
+	  // that _The WebSocket Closing Handshake is Started_ and that the
+	  // WebSocket connection is in the CLOSING state.
+	  return ws[kReadyState] === states.CLOSING
+	}
+
+	/**
+	 * @param {import('./websocket').WebSocket} ws
+	 * @returns {boolean}
+	 */
+	function isClosed (ws) {
+	  return ws[kReadyState] === states.CLOSED
+	}
+
+	/**
+	 * @see https://dom.spec.whatwg.org/#concept-event-fire
+	 * @param {string} e
+	 * @param {EventTarget} target
+	 * @param {(...args: ConstructorParameters) => Event} eventFactory
+	 * @param {EventInit | undefined} eventInitDict
+	 */
+	function fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) {
+	  // 1. If eventConstructor is not given, then let eventConstructor be Event.
+
+	  // 2. Let event be the result of creating an event given eventConstructor,
+	  //    in the relevant realm of target.
+	  // 3. Initialize event’s type attribute to e.
+	  const event = eventFactory(e, eventInitDict);
+
+	  // 4. Initialize any other IDL attributes of event as described in the
+	  //    invocation of this algorithm.
+
+	  // 5. Return the result of dispatching event at target, with legacy target
+	  //    override flag set if set.
+	  target.dispatchEvent(event);
+	}
+
+	/**
+	 * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
+	 * @param {import('./websocket').WebSocket} ws
+	 * @param {number} type Opcode
+	 * @param {Buffer} data application data
+	 */
+	function websocketMessageReceived (ws, type, data) {
+	  // 1. If ready state is not OPEN (1), then return.
+	  if (ws[kReadyState] !== states.OPEN) {
+	    return
+	  }
+
+	  // 2. Let dataForEvent be determined by switching on type and binary type:
+	  let dataForEvent;
+
+	  if (type === opcodes.TEXT) {
+	    // -> type indicates that the data is Text
+	    //      a new DOMString containing data
+	    try {
+	      dataForEvent = utf8Decode(data);
+	    } catch {
+	      failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.');
+	      return
+	    }
+	  } else if (type === opcodes.BINARY) {
+	    if (ws[kBinaryType] === 'blob') {
+	      // -> type indicates that the data is Binary and binary type is "blob"
+	      //      a new Blob object, created in the relevant Realm of the WebSocket
+	      //      object, that represents data as its raw data
+	      dataForEvent = new Blob([data]);
+	    } else {
+	      // -> type indicates that the data is Binary and binary type is "arraybuffer"
+	      //      a new ArrayBuffer object, created in the relevant Realm of the
+	      //      WebSocket object, whose contents are data
+	      dataForEvent = toArrayBuffer(data);
+	    }
+	  }
+
+	  // 3. Fire an event named message at the WebSocket object, using MessageEvent,
+	  //    with the origin attribute initialized to the serialization of the WebSocket
+	  //    object’s url's origin, and the data attribute initialized to dataForEvent.
+	  fireEvent('message', ws, createFastMessageEvent, {
+	    origin: ws[kWebSocketURL].origin,
+	    data: dataForEvent
+	  });
+	}
+
+	function toArrayBuffer (buffer) {
+	  if (buffer.byteLength === buffer.buffer.byteLength) {
+	    return buffer.buffer
+	  }
+	  return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength)
+	}
+
+	/**
+	 * @see https://datatracker.ietf.org/doc/html/rfc6455
+	 * @see https://datatracker.ietf.org/doc/html/rfc2616
+	 * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407
+	 * @param {string} protocol
+	 */
+	function isValidSubprotocol (protocol) {
+	  // If present, this value indicates one
+	  // or more comma-separated subprotocol the client wishes to speak,
+	  // ordered by preference.  The elements that comprise this value
+	  // MUST be non-empty strings with characters in the range U+0021 to
+	  // U+007E not including separator characters as defined in
+	  // [RFC2616] and MUST all be unique strings.
+	  if (protocol.length === 0) {
+	    return false
+	  }
+
+	  for (let i = 0; i < protocol.length; ++i) {
+	    const code = protocol.charCodeAt(i);
+
+	    if (
+	      code < 0x21 || // CTL, contains SP (0x20) and HT (0x09)
+	      code > 0x7E ||
+	      code === 0x22 || // "
+	      code === 0x28 || // (
+	      code === 0x29 || // )
+	      code === 0x2C || // ,
+	      code === 0x2F || // /
+	      code === 0x3A || // :
+	      code === 0x3B || // ;
+	      code === 0x3C || // <
+	      code === 0x3D || // =
+	      code === 0x3E || // >
+	      code === 0x3F || // ?
+	      code === 0x40 || // @
+	      code === 0x5B || // [
+	      code === 0x5C || // \
+	      code === 0x5D || // ]
+	      code === 0x7B || // {
+	      code === 0x7D // }
+	    ) {
+	      return false
+	    }
+	  }
+
+	  return true
+	}
+
+	/**
+	 * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4
+	 * @param {number} code
+	 */
+	function isValidStatusCode (code) {
+	  if (code >= 1000 && code < 1015) {
+	    return (
+	      code !== 1004 && // reserved
+	      code !== 1005 && // "MUST NOT be set as a status code"
+	      code !== 1006 // "MUST NOT be set as a status code"
+	    )
+	  }
+
+	  return code >= 3000 && code <= 4999
+	}
+
+	/**
+	 * @param {import('./websocket').WebSocket} ws
+	 * @param {string|undefined} reason
+	 */
+	function failWebsocketConnection (ws, reason) {
+	  const { [kController]: controller, [kResponse]: response } = ws;
+
+	  controller.abort();
+
+	  if (response?.socket && !response.socket.destroyed) {
+	    response.socket.destroy();
+	  }
+
+	  if (reason) {
+	    // TODO: process.nextTick
+	    fireEvent('error', ws, (type, init) => new ErrorEvent(type, init), {
+	      error: new Error(reason),
+	      message: reason
+	    });
+	  }
+	}
+
+	/**
+	 * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5
+	 * @param {number} opcode
+	 */
+	function isControlFrame (opcode) {
+	  return (
+	    opcode === opcodes.CLOSE ||
+	    opcode === opcodes.PING ||
+	    opcode === opcodes.PONG
+	  )
+	}
+
+	function isContinuationFrame (opcode) {
+	  return opcode === opcodes.CONTINUATION
+	}
+
+	function isTextBinaryFrame (opcode) {
+	  return opcode === opcodes.TEXT || opcode === opcodes.BINARY
+	}
+
+	function isValidOpcode (opcode) {
+	  return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode)
+	}
+
+	/**
+	 * Parses a Sec-WebSocket-Extensions header value.
+	 * @param {string} extensions
+	 * @returns {Map}
+	 */
+	// TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1
+	function parseExtensions (extensions) {
+	  const position = { position: 0 };
+	  const extensionList = new Map();
+
+	  while (position.position < extensions.length) {
+	    const pair = collectASequenceOfCodePointsFast(';', extensions, position);
+	    const [name, value = ''] = pair.split('=');
+
+	    extensionList.set(
+	      removeHTTPWhitespace(name, true, false),
+	      removeHTTPWhitespace(value, false, true)
+	    );
+
+	    position.position++;
+	  }
+
+	  return extensionList
+	}
+
+	/**
+	 * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2
+	 * @description "client-max-window-bits = 1*DIGIT"
+	 * @param {string} value
+	 */
+	function isValidClientWindowBits (value) {
+	  for (let i = 0; i < value.length; i++) {
+	    const byte = value.charCodeAt(i);
+
+	    if (byte < 0x30 || byte > 0x39) {
+	      return false
+	    }
+	  }
+
+	  return true
+	}
+
+	// https://nodejs.org/api/intl.html#detecting-internationalization-support
+	const hasIntl = typeof process.versions.icu === 'string';
+	const fatalDecoder = hasIntl ? new TextDecoder('utf-8', { fatal: true }) : undefined;
+
+	/**
+	 * Converts a Buffer to utf-8, even on platforms without icu.
+	 * @param {Buffer} buffer
+	 */
+	const utf8Decode = hasIntl
+	  ? fatalDecoder.decode.bind(fatalDecoder)
+	  : function (buffer) {
+	    if (isUtf8(buffer)) {
+	      return buffer.toString('utf-8')
+	    }
+	    throw new TypeError('Invalid utf-8 received.')
+	  };
+
+	util$1 = {
+	  isConnecting,
+	  isEstablished,
+	  isClosing,
+	  isClosed,
+	  fireEvent,
+	  isValidSubprotocol,
+	  isValidStatusCode,
+	  failWebsocketConnection,
+	  websocketMessageReceived,
+	  utf8Decode,
+	  isControlFrame,
+	  isContinuationFrame,
+	  isTextBinaryFrame,
+	  isValidOpcode,
+	  parseExtensions,
+	  isValidClientWindowBits
+	};
+	return util$1;
+}
+
+var frame;
+var hasRequiredFrame;
+
+function requireFrame () {
+	if (hasRequiredFrame) return frame;
+	hasRequiredFrame = 1;
+
+	const { maxUnsigned16Bit } = requireConstants$1();
+
+	const BUFFER_SIZE = 16386;
+
+	/** @type {import('crypto')} */
+	let crypto;
+	let buffer = null;
+	let bufIdx = BUFFER_SIZE;
+
+	try {
+	  crypto = require('node:crypto');
+	/* c8 ignore next 3 */
+	} catch {
+	  crypto = {
+	    // not full compatibility, but minimum.
+	    randomFillSync: function randomFillSync (buffer, _offset, _size) {
+	      for (let i = 0; i < buffer.length; ++i) {
+	        buffer[i] = Math.random() * 255 | 0;
+	      }
+	      return buffer
+	    }
+	  };
+	}
+
+	function generateMask () {
+	  if (bufIdx === BUFFER_SIZE) {
+	    bufIdx = 0;
+	    crypto.randomFillSync((buffer ??= Buffer.allocUnsafe(BUFFER_SIZE)), 0, BUFFER_SIZE);
+	  }
+	  return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]]
+	}
+
+	class WebsocketFrameSend {
+	  /**
+	   * @param {Buffer|undefined} data
+	   */
+	  constructor (data) {
+	    this.frameData = data;
+	  }
+
+	  createFrame (opcode) {
+	    const frameData = this.frameData;
+	    const maskKey = generateMask();
+	    const bodyLength = frameData?.byteLength ?? 0;
+
+	    /** @type {number} */
+	    let payloadLength = bodyLength; // 0-125
+	    let offset = 6;
+
+	    if (bodyLength > maxUnsigned16Bit) {
+	      offset += 8; // payload length is next 8 bytes
+	      payloadLength = 127;
+	    } else if (bodyLength > 125) {
+	      offset += 2; // payload length is next 2 bytes
+	      payloadLength = 126;
+	    }
+
+	    const buffer = Buffer.allocUnsafe(bodyLength + offset);
+
+	    // Clear first 2 bytes, everything else is overwritten
+	    buffer[0] = buffer[1] = 0;
+	    buffer[0] |= 0x80; // FIN
+	    buffer[0] = (buffer[0] & 0xF0) + opcode; // opcode
+
+	    /*! ws. MIT License. Einar Otto Stangvik  */
+	    buffer[offset - 4] = maskKey[0];
+	    buffer[offset - 3] = maskKey[1];
+	    buffer[offset - 2] = maskKey[2];
+	    buffer[offset - 1] = maskKey[3];
+
+	    buffer[1] = payloadLength;
+
+	    if (payloadLength === 126) {
+	      buffer.writeUInt16BE(bodyLength, 2);
+	    } else if (payloadLength === 127) {
+	      // Clear extended payload length
+	      buffer[2] = buffer[3] = 0;
+	      buffer.writeUIntBE(bodyLength, 4, 6);
+	    }
+
+	    buffer[1] |= 0x80; // MASK
+
+	    // mask body
+	    for (let i = 0; i < bodyLength; ++i) {
+	      buffer[offset + i] = frameData[i] ^ maskKey[i & 3];
+	    }
+
+	    return buffer
+	  }
+	}
+
+	frame = {
+	  WebsocketFrameSend
+	};
+	return frame;
+}
+
+var connection;
+var hasRequiredConnection;
+
+function requireConnection () {
+	if (hasRequiredConnection) return connection;
+	hasRequiredConnection = 1;
+
+	const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = requireConstants$1();
+	const {
+	  kReadyState,
+	  kSentClose,
+	  kByteParser,
+	  kReceivedClose,
+	  kResponse
+	} = requireSymbols();
+	const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = requireUtil$1();
+	const { channels } = requireDiagnostics();
+	const { CloseEvent } = requireEvents();
+	const { makeRequest } = requireRequest();
+	const { fetching } = requireFetch();
+	const { Headers, getHeadersList } = requireHeaders();
+	const { getDecodeSplit } = requireUtil$6();
+	const { WebsocketFrameSend } = requireFrame();
+
+	/** @type {import('crypto')} */
+	let crypto;
+	try {
+	  crypto = require('node:crypto');
+	/* c8 ignore next 3 */
+	} catch {
+
+	}
+
+	/**
+	 * @see https://websockets.spec.whatwg.org/#concept-websocket-establish
+	 * @param {URL} url
+	 * @param {string|string[]} protocols
+	 * @param {import('./websocket').WebSocket} ws
+	 * @param {(response: any, extensions: string[] | undefined) => void} onEstablish
+	 * @param {Partial} options
+	 */
+	function establishWebSocketConnection (url, protocols, client, ws, onEstablish, options) {
+	  // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s
+	  //    scheme is "ws", and to "https" otherwise.
+	  const requestURL = url;
+
+	  requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:';
+
+	  // 2. Let request be a new request, whose URL is requestURL, client is client,
+	  //    service-workers mode is "none", referrer is "no-referrer", mode is
+	  //    "websocket", credentials mode is "include", cache mode is "no-store" ,
+	  //    and redirect mode is "error".
+	  const request = makeRequest({
+	    urlList: [requestURL],
+	    client,
+	    serviceWorkers: 'none',
+	    referrer: 'no-referrer',
+	    mode: 'websocket',
+	    credentials: 'include',
+	    cache: 'no-store',
+	    redirect: 'error'
+	  });
+
+	  // Note: undici extension, allow setting custom headers.
+	  if (options.headers) {
+	    const headersList = getHeadersList(new Headers(options.headers));
+
+	    request.headersList = headersList;
+	  }
+
+	  // 3. Append (`Upgrade`, `websocket`) to request’s header list.
+	  // 4. Append (`Connection`, `Upgrade`) to request’s header list.
+	  // Note: both of these are handled by undici currently.
+	  // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397
+
+	  // 5. Let keyValue be a nonce consisting of a randomly selected
+	  //    16-byte value that has been forgiving-base64-encoded and
+	  //    isomorphic encoded.
+	  const keyValue = crypto.randomBytes(16).toString('base64');
+
+	  // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s
+	  //    header list.
+	  request.headersList.append('sec-websocket-key', keyValue);
+
+	  // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s
+	  //    header list.
+	  request.headersList.append('sec-websocket-version', '13');
+
+	  // 8. For each protocol in protocols, combine
+	  //    (`Sec-WebSocket-Protocol`, protocol) in request’s header
+	  //    list.
+	  for (const protocol of protocols) {
+	    request.headersList.append('sec-websocket-protocol', protocol);
+	  }
+
+	  // 9. Let permessageDeflate be a user-agent defined
+	  //    "permessage-deflate" extension header value.
+	  // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673
+	  const permessageDeflate = 'permessage-deflate; client_max_window_bits';
+
+	  // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to
+	  //     request’s header list.
+	  request.headersList.append('sec-websocket-extensions', permessageDeflate);
+
+	  // 11. Fetch request with useParallelQueue set to true, and
+	  //     processResponse given response being these steps:
+	  const controller = fetching({
+	    request,
+	    useParallelQueue: true,
+	    dispatcher: options.dispatcher,
+	    processResponse (response) {
+	      // 1. If response is a network error or its status is not 101,
+	      //    fail the WebSocket connection.
+	      if (response.type === 'error' || response.status !== 101) {
+	        failWebsocketConnection(ws, 'Received network error or non-101 status code.');
+	        return
+	      }
+
+	      // 2. If protocols is not the empty list and extracting header
+	      //    list values given `Sec-WebSocket-Protocol` and response’s
+	      //    header list results in null, failure, or the empty byte
+	      //    sequence, then fail the WebSocket connection.
+	      if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {
+	        failWebsocketConnection(ws, 'Server did not respond with sent protocols.');
+	        return
+	      }
+
+	      // 3. Follow the requirements stated step 2 to step 6, inclusive,
+	      //    of the last set of steps in section 4.1 of The WebSocket
+	      //    Protocol to validate response. This either results in fail
+	      //    the WebSocket connection or the WebSocket connection is
+	      //    established.
+
+	      // 2. If the response lacks an |Upgrade| header field or the |Upgrade|
+	      //    header field contains a value that is not an ASCII case-
+	      //    insensitive match for the value "websocket", the client MUST
+	      //    _Fail the WebSocket Connection_.
+	      if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {
+	        failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".');
+	        return
+	      }
+
+	      // 3. If the response lacks a |Connection| header field or the
+	      //    |Connection| header field doesn't contain a token that is an
+	      //    ASCII case-insensitive match for the value "Upgrade", the client
+	      //    MUST _Fail the WebSocket Connection_.
+	      if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {
+	        failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".');
+	        return
+	      }
+
+	      // 4. If the response lacks a |Sec-WebSocket-Accept| header field or
+	      //    the |Sec-WebSocket-Accept| contains a value other than the
+	      //    base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-
+	      //    Key| (as a string, not base64-decoded) with the string "258EAFA5-
+	      //    E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and
+	      //    trailing whitespace, the client MUST _Fail the WebSocket
+	      //    Connection_.
+	      const secWSAccept = response.headersList.get('Sec-WebSocket-Accept');
+	      const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64');
+	      if (secWSAccept !== digest) {
+	        failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.');
+	        return
+	      }
+
+	      // 5. If the response includes a |Sec-WebSocket-Extensions| header
+	      //    field and this header field indicates the use of an extension
+	      //    that was not present in the client's handshake (the server has
+	      //    indicated an extension not requested by the client), the client
+	      //    MUST _Fail the WebSocket Connection_.  (The parsing of this
+	      //    header field to determine which extensions are requested is
+	      //    discussed in Section 9.1.)
+	      const secExtension = response.headersList.get('Sec-WebSocket-Extensions');
+	      let extensions;
+
+	      if (secExtension !== null) {
+	        extensions = parseExtensions(secExtension);
+
+	        if (!extensions.has('permessage-deflate')) {
+	          failWebsocketConnection(ws, 'Sec-WebSocket-Extensions header does not match.');
+	          return
+	        }
+	      }
+
+	      // 6. If the response includes a |Sec-WebSocket-Protocol| header field
+	      //    and this header field indicates the use of a subprotocol that was
+	      //    not present in the client's handshake (the server has indicated a
+	      //    subprotocol not requested by the client), the client MUST _Fail
+	      //    the WebSocket Connection_.
+	      const secProtocol = response.headersList.get('Sec-WebSocket-Protocol');
+
+	      if (secProtocol !== null) {
+	        const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList);
+
+	        // The client can request that the server use a specific subprotocol by
+	        // including the |Sec-WebSocket-Protocol| field in its handshake.  If it
+	        // is specified, the server needs to include the same field and one of
+	        // the selected subprotocol values in its response for the connection to
+	        // be established.
+	        if (!requestProtocols.includes(secProtocol)) {
+	          failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.');
+	          return
+	        }
+	      }
+
+	      response.socket.on('data', onSocketData);
+	      response.socket.on('close', onSocketClose);
+	      response.socket.on('error', onSocketError);
+
+	      if (channels.open.hasSubscribers) {
+	        channels.open.publish({
+	          address: response.socket.address(),
+	          protocol: secProtocol,
+	          extensions: secExtension
+	        });
+	      }
+
+	      onEstablish(response, extensions);
+	    }
+	  });
+
+	  return controller
+	}
+
+	function closeWebSocketConnection (ws, code, reason, reasonByteLength) {
+	  if (isClosing(ws) || isClosed(ws)) ; else if (!isEstablished(ws)) {
+	    // If the WebSocket connection is not yet established
+	    // Fail the WebSocket connection and set this's ready state
+	    // to CLOSING (2).
+	    failWebsocketConnection(ws, 'Connection was closed before it was established.');
+	    ws[kReadyState] = states.CLOSING;
+	  } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) {
+	    // If the WebSocket closing handshake has not yet been started
+	    // Start the WebSocket closing handshake and set this's ready
+	    // state to CLOSING (2).
+	    // - If neither code nor reason is present, the WebSocket Close
+	    //   message must not have a body.
+	    // - If code is present, then the status code to use in the
+	    //   WebSocket Close message must be the integer given by code.
+	    // - If reason is also present, then reasonBytes must be
+	    //   provided in the Close message after the status code.
+
+	    ws[kSentClose] = sentCloseFrameState.PROCESSING;
+
+	    const frame = new WebsocketFrameSend();
+
+	    // If neither code nor reason is present, the WebSocket Close
+	    // message must not have a body.
+
+	    // If code is present, then the status code to use in the
+	    // WebSocket Close message must be the integer given by code.
+	    if (code !== undefined && reason === undefined) {
+	      frame.frameData = Buffer.allocUnsafe(2);
+	      frame.frameData.writeUInt16BE(code, 0);
+	    } else if (code !== undefined && reason !== undefined) {
+	      // If reason is also present, then reasonBytes must be
+	      // provided in the Close message after the status code.
+	      frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength);
+	      frame.frameData.writeUInt16BE(code, 0);
+	      // the body MAY contain UTF-8-encoded data with value /reason/
+	      frame.frameData.write(reason, 2, 'utf-8');
+	    } else {
+	      frame.frameData = emptyBuffer;
+	    }
+
+	    /** @type {import('stream').Duplex} */
+	    const socket = ws[kResponse].socket;
+
+	    socket.write(frame.createFrame(opcodes.CLOSE));
+
+	    ws[kSentClose] = sentCloseFrameState.SENT;
+
+	    // Upon either sending or receiving a Close control frame, it is said
+	    // that _The WebSocket Closing Handshake is Started_ and that the
+	    // WebSocket connection is in the CLOSING state.
+	    ws[kReadyState] = states.CLOSING;
+	  } else {
+	    // Otherwise
+	    // Set this's ready state to CLOSING (2).
+	    ws[kReadyState] = states.CLOSING;
+	  }
+	}
+
+	/**
+	 * @param {Buffer} chunk
+	 */
+	function onSocketData (chunk) {
+	  if (!this.ws[kByteParser].write(chunk)) {
+	    this.pause();
+	  }
+	}
+
+	/**
+	 * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
+	 * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4
+	 */
+	function onSocketClose () {
+	  const { ws } = this;
+	  const { [kResponse]: response } = ws;
+
+	  response.socket.off('data', onSocketData);
+	  response.socket.off('close', onSocketClose);
+	  response.socket.off('error', onSocketError);
+
+	  // If the TCP connection was closed after the
+	  // WebSocket closing handshake was completed, the WebSocket connection
+	  // is said to have been closed _cleanly_.
+	  const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose];
+
+	  let code = 1005;
+	  let reason = '';
+
+	  const result = ws[kByteParser].closingInfo;
+
+	  if (result && !result.error) {
+	    code = result.code ?? 1005;
+	    reason = result.reason;
+	  } else if (!ws[kReceivedClose]) {
+	    // If _The WebSocket
+	    // Connection is Closed_ and no Close control frame was received by the
+	    // endpoint (such as could occur if the underlying transport connection
+	    // is lost), _The WebSocket Connection Close Code_ is considered to be
+	    // 1006.
+	    code = 1006;
+	  }
+
+	  // 1. Change the ready state to CLOSED (3).
+	  ws[kReadyState] = states.CLOSED;
+
+	  // 2. If the user agent was required to fail the WebSocket
+	  //    connection, or if the WebSocket connection was closed
+	  //    after being flagged as full, fire an event named error
+	  //    at the WebSocket object.
+	  // TODO
+
+	  // 3. Fire an event named close at the WebSocket object,
+	  //    using CloseEvent, with the wasClean attribute
+	  //    initialized to true if the connection closed cleanly
+	  //    and false otherwise, the code attribute initialized to
+	  //    the WebSocket connection close code, and the reason
+	  //    attribute initialized to the result of applying UTF-8
+	  //    decode without BOM to the WebSocket connection close
+	  //    reason.
+	  // TODO: process.nextTick
+	  fireEvent('close', ws, (type, init) => new CloseEvent(type, init), {
+	    wasClean, code, reason
+	  });
+
+	  if (channels.close.hasSubscribers) {
+	    channels.close.publish({
+	      websocket: ws,
+	      code,
+	      reason
+	    });
+	  }
+	}
 
-const endpointMethodsMap = /* @__PURE__ */ new Map();
-for (const [scope, endpoints] of Object.entries(endpoints_default)) {
-  for (const [methodName, endpoint] of Object.entries(endpoints)) {
-    const [route, defaults, decorations] = endpoint;
-    const [method, url] = route.split(/ /);
-    const endpointDefaults = Object.assign(
-      {
-        method,
-        url
-      },
-      defaults
-    );
-    if (!endpointMethodsMap.has(scope)) {
-      endpointMethodsMap.set(scope, /* @__PURE__ */ new Map());
-    }
-    endpointMethodsMap.get(scope).set(methodName, {
-      scope,
-      methodName,
-      endpointDefaults,
-      decorations
-    });
-  }
-}
-const handler = {
-  has({ scope }, methodName) {
-    return endpointMethodsMap.get(scope).has(methodName);
-  },
-  getOwnPropertyDescriptor(target, methodName) {
-    return {
-      value: this.get(target, methodName),
-      // ensures method is in the cache
-      configurable: true,
-      writable: true,
-      enumerable: true
-    };
-  },
-  defineProperty(target, methodName, descriptor) {
-    Object.defineProperty(target.cache, methodName, descriptor);
-    return true;
-  },
-  deleteProperty(target, methodName) {
-    delete target.cache[methodName];
-    return true;
-  },
-  ownKeys({ scope }) {
-    return [...endpointMethodsMap.get(scope).keys()];
-  },
-  set(target, methodName, value) {
-    return target.cache[methodName] = value;
-  },
-  get({ octokit, scope, cache }, methodName) {
-    if (cache[methodName]) {
-      return cache[methodName];
-    }
-    const method = endpointMethodsMap.get(scope).get(methodName);
-    if (!method) {
-      return void 0;
-    }
-    const { endpointDefaults, decorations } = method;
-    if (decorations) {
-      cache[methodName] = decorate(
-        octokit,
-        scope,
-        methodName,
-        endpointDefaults,
-        decorations
-      );
-    } else {
-      cache[methodName] = octokit.request.defaults(endpointDefaults);
-    }
-    return cache[methodName];
-  }
-};
-function endpointsToMethods(octokit) {
-  const newMethods = {};
-  for (const scope of endpointMethodsMap.keys()) {
-    newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);
-  }
-  return newMethods;
-}
-function decorate(octokit, scope, methodName, defaults, decorations) {
-  const requestWithDefaults = octokit.request.defaults(defaults);
-  function withDecorations(...args) {
-    let options = requestWithDefaults.endpoint.merge(...args);
-    if (decorations.mapToData) {
-      options = Object.assign({}, options, {
-        data: options[decorations.mapToData],
-        [decorations.mapToData]: void 0
-      });
-      return requestWithDefaults(options);
-    }
-    if (decorations.renamed) {
-      const [newScope, newMethodName] = decorations.renamed;
-      octokit.log.warn(
-        `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`
-      );
-    }
-    if (decorations.deprecated) {
-      octokit.log.warn(decorations.deprecated);
-    }
-    if (decorations.renamedParameters) {
-      const options2 = requestWithDefaults.endpoint.merge(...args);
-      for (const [name, alias] of Object.entries(
-        decorations.renamedParameters
-      )) {
-        if (name in options2) {
-          octokit.log.warn(
-            `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`
-          );
-          if (!(alias in options2)) {
-            options2[alias] = options2[name];
-          }
-          delete options2[name];
-        }
-      }
-      return requestWithDefaults(options2);
-    }
-    return requestWithDefaults(...args);
-  }
-  return Object.assign(withDecorations, requestWithDefaults);
-}
+	function onSocketError (error) {
+	  const { ws } = this;
 
-function restEndpointMethods(octokit) {
-  const api = endpointsToMethods(octokit);
-  return {
-    rest: api
-  };
-}
-restEndpointMethods.VERSION = VERSION$1;
-function legacyRestEndpointMethods(octokit) {
-  const api = endpointsToMethods(octokit);
-  return {
-    ...api,
-    rest: api
-  };
+	  ws[kReadyState] = states.CLOSING;
+
+	  if (channels.socketError.hasSubscribers) {
+	    channels.socketError.publish(error);
+	  }
+
+	  this.destroy();
+	}
+
+	connection = {
+	  establishWebSocketConnection,
+	  closeWebSocketConnection
+	};
+	return connection;
 }
-legacyRestEndpointMethods.VERSION = VERSION$1;
 
-var distSrc = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	legacyRestEndpointMethods: legacyRestEndpointMethods,
-	restEndpointMethods: restEndpointMethods
-});
+var permessageDeflate;
+var hasRequiredPermessageDeflate;
 
-var require$$3 = /*@__PURE__*/getAugmentedNamespace(distSrc);
+function requirePermessageDeflate () {
+	if (hasRequiredPermessageDeflate) return permessageDeflate;
+	hasRequiredPermessageDeflate = 1;
 
-// pkg/dist-src/version.js
-var VERSION = "9.2.2";
+	const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$3;
+	const { isValidClientWindowBits } = requireUtil$1();
 
-// pkg/dist-src/normalize-paginated-list-response.js
-function normalizePaginatedListResponse(response) {
-  if (!response.data) {
-    return {
-      ...response,
-      data: []
-    };
-  }
-  const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data);
-  if (!responseNeedsNormalization)
-    return response;
-  const incompleteResults = response.data.incomplete_results;
-  const repositorySelection = response.data.repository_selection;
-  const totalCount = response.data.total_count;
-  delete response.data.incomplete_results;
-  delete response.data.repository_selection;
-  delete response.data.total_count;
-  const namespaceKey = Object.keys(response.data)[0];
-  const data = response.data[namespaceKey];
-  response.data = data;
-  if (typeof incompleteResults !== "undefined") {
-    response.data.incomplete_results = incompleteResults;
-  }
-  if (typeof repositorySelection !== "undefined") {
-    response.data.repository_selection = repositorySelection;
-  }
-  response.data.total_count = totalCount;
-  return response;
-}
+	const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]);
+	const kBuffer = Symbol('kBuffer');
+	const kLength = Symbol('kLength');
 
-// pkg/dist-src/iterator.js
-function iterator(octokit, route, parameters) {
-  const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);
-  const requestMethod = typeof route === "function" ? route : octokit.request;
-  const method = options.method;
-  const headers = options.headers;
-  let url = options.url;
-  return {
-    [Symbol.asyncIterator]: () => ({
-      async next() {
-        if (!url)
-          return { done: true };
-        try {
-          const response = await requestMethod({ method, url, headers });
-          const normalizedResponse = normalizePaginatedListResponse(response);
-          url = ((normalizedResponse.headers.link || "").match(
-            /<([^<>]+)>;\s*rel="next"/
-          ) || [])[1];
-          return { value: normalizedResponse };
-        } catch (error) {
-          if (error.status !== 409)
-            throw error;
-          url = "";
-          return {
-            value: {
-              status: 200,
-              headers: {},
-              data: []
-            }
-          };
-        }
-      }
-    })
-  };
-}
+	class PerMessageDeflate {
+	  /** @type {import('node:zlib').InflateRaw} */
+	  #inflate
 
-// pkg/dist-src/paginate.js
-function paginate(octokit, route, parameters, mapFn) {
-  if (typeof parameters === "function") {
-    mapFn = parameters;
-    parameters = void 0;
-  }
-  return gather(
-    octokit,
-    [],
-    iterator(octokit, route, parameters)[Symbol.asyncIterator](),
-    mapFn
-  );
-}
-function gather(octokit, results, iterator2, mapFn) {
-  return iterator2.next().then((result) => {
-    if (result.done) {
-      return results;
-    }
-    let earlyExit = false;
-    function done() {
-      earlyExit = true;
-    }
-    results = results.concat(
-      mapFn ? mapFn(result.value, done) : result.value.data
-    );
-    if (earlyExit) {
-      return results;
-    }
-    return gather(octokit, results, iterator2, mapFn);
-  });
+	  #options = {}
+
+	  constructor (extensions) {
+	    this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover');
+	    this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits');
+	  }
+
+	  decompress (chunk, fin, callback) {
+	    // An endpoint uses the following algorithm to decompress a message.
+	    // 1.  Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the
+	    //     payload of the message.
+	    // 2.  Decompress the resulting data using DEFLATE.
+
+	    if (!this.#inflate) {
+	      let windowBits = Z_DEFAULT_WINDOWBITS;
+
+	      if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS
+	        if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) {
+	          callback(new Error('Invalid server_max_window_bits'));
+	          return
+	        }
+
+	        windowBits = Number.parseInt(this.#options.serverMaxWindowBits);
+	      }
+
+	      this.#inflate = createInflateRaw({ windowBits });
+	      this.#inflate[kBuffer] = [];
+	      this.#inflate[kLength] = 0;
+
+	      this.#inflate.on('data', (data) => {
+	        this.#inflate[kBuffer].push(data);
+	        this.#inflate[kLength] += data.length;
+	      });
+
+	      this.#inflate.on('error', (err) => {
+	        this.#inflate = null;
+	        callback(err);
+	      });
+	    }
+
+	    this.#inflate.write(chunk);
+	    if (fin) {
+	      this.#inflate.write(tail);
+	    }
+
+	    this.#inflate.flush(() => {
+	      const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]);
+
+	      this.#inflate[kBuffer].length = 0;
+	      this.#inflate[kLength] = 0;
+
+	      callback(null, full);
+	    });
+	  }
+	}
+
+	permessageDeflate = { PerMessageDeflate };
+	return permessageDeflate;
 }
 
-// pkg/dist-src/compose-paginate.js
-var composePaginateRest = Object.assign(paginate, {
-  iterator
-});
+var receiver;
+var hasRequiredReceiver;
+
+function requireReceiver () {
+	if (hasRequiredReceiver) return receiver;
+	hasRequiredReceiver = 1;
+
+	const { Writable } = require$$0$8;
+	const assert = require$$0$7;
+	const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = requireConstants$1();
+	const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols();
+	const { channels } = requireDiagnostics();
+	const {
+	  isValidStatusCode,
+	  isValidOpcode,
+	  failWebsocketConnection,
+	  websocketMessageReceived,
+	  utf8Decode,
+	  isControlFrame,
+	  isTextBinaryFrame,
+	  isContinuationFrame
+	} = requireUtil$1();
+	const { WebsocketFrameSend } = requireFrame();
+	const { closeWebSocketConnection } = requireConnection();
+	const { PerMessageDeflate } = requirePermessageDeflate();
+
+	// This code was influenced by ws released under the MIT license.
+	// Copyright (c) 2011 Einar Otto Stangvik 
+	// Copyright (c) 2013 Arnout Kazemier and contributors
+	// Copyright (c) 2016 Luigi Pinca and contributors
+
+	class ByteParser extends Writable {
+	  #buffers = []
+	  #byteOffset = 0
+	  #loop = false
+
+	  #state = parserStates.INFO
+
+	  #info = {}
+	  #fragments = []
+
+	  /** @type {Map} */
+	  #extensions
+
+	  constructor (ws, extensions) {
+	    super();
+
+	    this.ws = ws;
+	    this.#extensions = extensions == null ? new Map() : extensions;
+
+	    if (this.#extensions.has('permessage-deflate')) {
+	      this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions));
+	    }
+	  }
+
+	  /**
+	   * @param {Buffer} chunk
+	   * @param {() => void} callback
+	   */
+	  _write (chunk, _, callback) {
+	    this.#buffers.push(chunk);
+	    this.#byteOffset += chunk.length;
+	    this.#loop = true;
+
+	    this.run(callback);
+	  }
+
+	  /**
+	   * Runs whenever a new chunk is received.
+	   * Callback is called whenever there are no more chunks buffering,
+	   * or not enough bytes are buffered to parse.
+	   */
+	  run (callback) {
+	    while (this.#loop) {
+	      if (this.#state === parserStates.INFO) {
+	        // If there aren't enough bytes to parse the payload length, etc.
+	        if (this.#byteOffset < 2) {
+	          return callback()
+	        }
+
+	        const buffer = this.consume(2);
+	        const fin = (buffer[0] & 0x80) !== 0;
+	        const opcode = buffer[0] & 0x0F;
+	        const masked = (buffer[1] & 0x80) === 0x80;
+
+	        const fragmented = !fin && opcode !== opcodes.CONTINUATION;
+	        const payloadLength = buffer[1] & 0x7F;
+
+	        const rsv1 = buffer[0] & 0x40;
+	        const rsv2 = buffer[0] & 0x20;
+	        const rsv3 = buffer[0] & 0x10;
+
+	        if (!isValidOpcode(opcode)) {
+	          failWebsocketConnection(this.ws, 'Invalid opcode received');
+	          return callback()
+	        }
+
+	        if (masked) {
+	          failWebsocketConnection(this.ws, 'Frame cannot be masked');
+	          return callback()
+	        }
+
+	        // MUST be 0 unless an extension is negotiated that defines meanings
+	        // for non-zero values.  If a nonzero value is received and none of
+	        // the negotiated extensions defines the meaning of such a nonzero
+	        // value, the receiving endpoint MUST _Fail the WebSocket
+	        // Connection_.
+	        // This document allocates the RSV1 bit of the WebSocket header for
+	        // PMCEs and calls the bit the "Per-Message Compressed" bit.  On a
+	        // WebSocket connection where a PMCE is in use, this bit indicates
+	        // whether a message is compressed or not.
+	        if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) {
+	          failWebsocketConnection(this.ws, 'Expected RSV1 to be clear.');
+	          return
+	        }
+
+	        if (rsv2 !== 0 || rsv3 !== 0) {
+	          failWebsocketConnection(this.ws, 'RSV1, RSV2, RSV3 must be clear');
+	          return
+	        }
+
+	        if (fragmented && !isTextBinaryFrame(opcode)) {
+	          // Only text and binary frames can be fragmented
+	          failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.');
+	          return
+	        }
+
+	        // If we are already parsing a text/binary frame and do not receive either
+	        // a continuation frame or close frame, fail the connection.
+	        if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) {
+	          failWebsocketConnection(this.ws, 'Expected continuation frame');
+	          return
+	        }
+
+	        if (this.#info.fragmented && fragmented) {
+	          // A fragmented frame can't be fragmented itself
+	          failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.');
+	          return
+	        }
+
+	        // "All control frames MUST have a payload length of 125 bytes or less
+	        // and MUST NOT be fragmented."
+	        if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) {
+	          failWebsocketConnection(this.ws, 'Control frame either too large or fragmented');
+	          return
+	        }
+
+	        if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) {
+	          failWebsocketConnection(this.ws, 'Unexpected continuation frame');
+	          return
+	        }
+
+	        if (payloadLength <= 125) {
+	          this.#info.payloadLength = payloadLength;
+	          this.#state = parserStates.READ_DATA;
+	        } else if (payloadLength === 126) {
+	          this.#state = parserStates.PAYLOADLENGTH_16;
+	        } else if (payloadLength === 127) {
+	          this.#state = parserStates.PAYLOADLENGTH_64;
+	        }
+
+	        if (isTextBinaryFrame(opcode)) {
+	          this.#info.binaryType = opcode;
+	          this.#info.compressed = rsv1 !== 0;
+	        }
+
+	        this.#info.opcode = opcode;
+	        this.#info.masked = masked;
+	        this.#info.fin = fin;
+	        this.#info.fragmented = fragmented;
+	      } else if (this.#state === parserStates.PAYLOADLENGTH_16) {
+	        if (this.#byteOffset < 2) {
+	          return callback()
+	        }
+
+	        const buffer = this.consume(2);
+
+	        this.#info.payloadLength = buffer.readUInt16BE(0);
+	        this.#state = parserStates.READ_DATA;
+	      } else if (this.#state === parserStates.PAYLOADLENGTH_64) {
+	        if (this.#byteOffset < 8) {
+	          return callback()
+	        }
+
+	        const buffer = this.consume(8);
+	        const upper = buffer.readUInt32BE(0);
+
+	        // 2^31 is the maximum bytes an arraybuffer can contain
+	        // on 32-bit systems. Although, on 64-bit systems, this is
+	        // 2^53-1 bytes.
+	        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length
+	        // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275
+	        // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e
+	        if (upper > 2 ** 31 - 1) {
+	          failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.');
+	          return
+	        }
+
+	        const lower = buffer.readUInt32BE(4);
+
+	        this.#info.payloadLength = (upper << 8) + lower;
+	        this.#state = parserStates.READ_DATA;
+	      } else if (this.#state === parserStates.READ_DATA) {
+	        if (this.#byteOffset < this.#info.payloadLength) {
+	          return callback()
+	        }
+
+	        const body = this.consume(this.#info.payloadLength);
+
+	        if (isControlFrame(this.#info.opcode)) {
+	          this.#loop = this.parseControlFrame(body);
+	          this.#state = parserStates.INFO;
+	        } else {
+	          if (!this.#info.compressed) {
+	            this.#fragments.push(body);
+
+	            // If the frame is not fragmented, a message has been received.
+	            // If the frame is fragmented, it will terminate with a fin bit set
+	            // and an opcode of 0 (continuation), therefore we handle that when
+	            // parsing continuation frames, not here.
+	            if (!this.#info.fragmented && this.#info.fin) {
+	              const fullMessage = Buffer.concat(this.#fragments);
+	              websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage);
+	              this.#fragments.length = 0;
+	            }
+
+	            this.#state = parserStates.INFO;
+	          } else {
+	            this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => {
+	              if (error) {
+	                closeWebSocketConnection(this.ws, 1007, error.message, error.message.length);
+	                return
+	              }
+
+	              this.#fragments.push(data);
+
+	              if (!this.#info.fin) {
+	                this.#state = parserStates.INFO;
+	                this.#loop = true;
+	                this.run(callback);
+	                return
+	              }
+
+	              websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments));
+
+	              this.#loop = true;
+	              this.#state = parserStates.INFO;
+	              this.#fragments.length = 0;
+	              this.run(callback);
+	            });
+
+	            this.#loop = false;
+	            break
+	          }
+	        }
+	      }
+	    }
+	  }
+
+	  /**
+	   * Take n bytes from the buffered Buffers
+	   * @param {number} n
+	   * @returns {Buffer}
+	   */
+	  consume (n) {
+	    if (n > this.#byteOffset) {
+	      throw new Error('Called consume() before buffers satiated.')
+	    } else if (n === 0) {
+	      return emptyBuffer
+	    }
+
+	    if (this.#buffers[0].length === n) {
+	      this.#byteOffset -= this.#buffers[0].length;
+	      return this.#buffers.shift()
+	    }
+
+	    const buffer = Buffer.allocUnsafe(n);
+	    let offset = 0;
+
+	    while (offset !== n) {
+	      const next = this.#buffers[0];
+	      const { length } = next;
+
+	      if (length + offset === n) {
+	        buffer.set(this.#buffers.shift(), offset);
+	        break
+	      } else if (length + offset > n) {
+	        buffer.set(next.subarray(0, n - offset), offset);
+	        this.#buffers[0] = next.subarray(n - offset);
+	        break
+	      } else {
+	        buffer.set(this.#buffers.shift(), offset);
+	        offset += next.length;
+	      }
+	    }
+
+	    this.#byteOffset -= n;
+
+	    return buffer
+	  }
+
+	  parseCloseBody (data) {
+	    assert(data.length !== 1);
+
+	    // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5
+	    /** @type {number|undefined} */
+	    let code;
+
+	    if (data.length >= 2) {
+	      // _The WebSocket Connection Close Code_ is
+	      // defined as the status code (Section 7.4) contained in the first Close
+	      // control frame received by the application
+	      code = data.readUInt16BE(0);
+	    }
+
+	    if (code !== undefined && !isValidStatusCode(code)) {
+	      return { code: 1002, reason: 'Invalid status code', error: true }
+	    }
+
+	    // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6
+	    /** @type {Buffer} */
+	    let reason = data.subarray(2);
+
+	    // Remove BOM
+	    if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {
+	      reason = reason.subarray(3);
+	    }
+
+	    try {
+	      reason = utf8Decode(reason);
+	    } catch {
+	      return { code: 1007, reason: 'Invalid UTF-8', error: true }
+	    }
+
+	    return { code, reason, error: false }
+	  }
+
+	  /**
+	   * Parses control frames.
+	   * @param {Buffer} body
+	   */
+	  parseControlFrame (body) {
+	    const { opcode, payloadLength } = this.#info;
+
+	    if (opcode === opcodes.CLOSE) {
+	      if (payloadLength === 1) {
+	        failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.');
+	        return false
+	      }
 
-// pkg/dist-src/generated/paginating-endpoints.js
-var paginatingEndpoints = [
-  "GET /advisories",
-  "GET /app/hook/deliveries",
-  "GET /app/installation-requests",
-  "GET /app/installations",
-  "GET /assignments/{assignment_id}/accepted_assignments",
-  "GET /classrooms",
-  "GET /classrooms/{classroom_id}/assignments",
-  "GET /enterprises/{enterprise}/dependabot/alerts",
-  "GET /enterprises/{enterprise}/secret-scanning/alerts",
-  "GET /events",
-  "GET /gists",
-  "GET /gists/public",
-  "GET /gists/starred",
-  "GET /gists/{gist_id}/comments",
-  "GET /gists/{gist_id}/commits",
-  "GET /gists/{gist_id}/forks",
-  "GET /installation/repositories",
-  "GET /issues",
-  "GET /licenses",
-  "GET /marketplace_listing/plans",
-  "GET /marketplace_listing/plans/{plan_id}/accounts",
-  "GET /marketplace_listing/stubbed/plans",
-  "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",
-  "GET /networks/{owner}/{repo}/events",
-  "GET /notifications",
-  "GET /organizations",
-  "GET /orgs/{org}/actions/cache/usage-by-repository",
-  "GET /orgs/{org}/actions/permissions/repositories",
-  "GET /orgs/{org}/actions/runners",
-  "GET /orgs/{org}/actions/secrets",
-  "GET /orgs/{org}/actions/secrets/{secret_name}/repositories",
-  "GET /orgs/{org}/actions/variables",
-  "GET /orgs/{org}/actions/variables/{name}/repositories",
-  "GET /orgs/{org}/blocks",
-  "GET /orgs/{org}/code-scanning/alerts",
-  "GET /orgs/{org}/codespaces",
-  "GET /orgs/{org}/codespaces/secrets",
-  "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories",
-  "GET /orgs/{org}/copilot/billing/seats",
-  "GET /orgs/{org}/dependabot/alerts",
-  "GET /orgs/{org}/dependabot/secrets",
-  "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",
-  "GET /orgs/{org}/events",
-  "GET /orgs/{org}/failed_invitations",
-  "GET /orgs/{org}/hooks",
-  "GET /orgs/{org}/hooks/{hook_id}/deliveries",
-  "GET /orgs/{org}/installations",
-  "GET /orgs/{org}/invitations",
-  "GET /orgs/{org}/invitations/{invitation_id}/teams",
-  "GET /orgs/{org}/issues",
-  "GET /orgs/{org}/members",
-  "GET /orgs/{org}/members/{username}/codespaces",
-  "GET /orgs/{org}/migrations",
-  "GET /orgs/{org}/migrations/{migration_id}/repositories",
-  "GET /orgs/{org}/organization-roles/{role_id}/teams",
-  "GET /orgs/{org}/organization-roles/{role_id}/users",
-  "GET /orgs/{org}/outside_collaborators",
-  "GET /orgs/{org}/packages",
-  "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",
-  "GET /orgs/{org}/personal-access-token-requests",
-  "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories",
-  "GET /orgs/{org}/personal-access-tokens",
-  "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories",
-  "GET /orgs/{org}/projects",
-  "GET /orgs/{org}/properties/values",
-  "GET /orgs/{org}/public_members",
-  "GET /orgs/{org}/repos",
-  "GET /orgs/{org}/rulesets",
-  "GET /orgs/{org}/rulesets/rule-suites",
-  "GET /orgs/{org}/secret-scanning/alerts",
-  "GET /orgs/{org}/security-advisories",
-  "GET /orgs/{org}/teams",
-  "GET /orgs/{org}/teams/{team_slug}/discussions",
-  "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",
-  "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",
-  "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",
-  "GET /orgs/{org}/teams/{team_slug}/invitations",
-  "GET /orgs/{org}/teams/{team_slug}/members",
-  "GET /orgs/{org}/teams/{team_slug}/projects",
-  "GET /orgs/{org}/teams/{team_slug}/repos",
-  "GET /orgs/{org}/teams/{team_slug}/teams",
-  "GET /projects/columns/{column_id}/cards",
-  "GET /projects/{project_id}/collaborators",
-  "GET /projects/{project_id}/columns",
-  "GET /repos/{owner}/{repo}/actions/artifacts",
-  "GET /repos/{owner}/{repo}/actions/caches",
-  "GET /repos/{owner}/{repo}/actions/organization-secrets",
-  "GET /repos/{owner}/{repo}/actions/organization-variables",
-  "GET /repos/{owner}/{repo}/actions/runners",
-  "GET /repos/{owner}/{repo}/actions/runs",
-  "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",
-  "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs",
-  "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",
-  "GET /repos/{owner}/{repo}/actions/secrets",
-  "GET /repos/{owner}/{repo}/actions/variables",
-  "GET /repos/{owner}/{repo}/actions/workflows",
-  "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",
-  "GET /repos/{owner}/{repo}/activity",
-  "GET /repos/{owner}/{repo}/assignees",
-  "GET /repos/{owner}/{repo}/branches",
-  "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",
-  "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",
-  "GET /repos/{owner}/{repo}/code-scanning/alerts",
-  "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",
-  "GET /repos/{owner}/{repo}/code-scanning/analyses",
-  "GET /repos/{owner}/{repo}/codespaces",
-  "GET /repos/{owner}/{repo}/codespaces/devcontainers",
-  "GET /repos/{owner}/{repo}/codespaces/secrets",
-  "GET /repos/{owner}/{repo}/collaborators",
-  "GET /repos/{owner}/{repo}/comments",
-  "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",
-  "GET /repos/{owner}/{repo}/commits",
-  "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",
-  "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",
-  "GET /repos/{owner}/{repo}/commits/{ref}/check-runs",
-  "GET /repos/{owner}/{repo}/commits/{ref}/check-suites",
-  "GET /repos/{owner}/{repo}/commits/{ref}/status",
-  "GET /repos/{owner}/{repo}/commits/{ref}/statuses",
-  "GET /repos/{owner}/{repo}/contributors",
-  "GET /repos/{owner}/{repo}/dependabot/alerts",
-  "GET /repos/{owner}/{repo}/dependabot/secrets",
-  "GET /repos/{owner}/{repo}/deployments",
-  "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",
-  "GET /repos/{owner}/{repo}/environments",
-  "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies",
-  "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps",
-  "GET /repos/{owner}/{repo}/events",
-  "GET /repos/{owner}/{repo}/forks",
-  "GET /repos/{owner}/{repo}/hooks",
-  "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries",
-  "GET /repos/{owner}/{repo}/invitations",
-  "GET /repos/{owner}/{repo}/issues",
-  "GET /repos/{owner}/{repo}/issues/comments",
-  "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",
-  "GET /repos/{owner}/{repo}/issues/events",
-  "GET /repos/{owner}/{repo}/issues/{issue_number}/comments",
-  "GET /repos/{owner}/{repo}/issues/{issue_number}/events",
-  "GET /repos/{owner}/{repo}/issues/{issue_number}/labels",
-  "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions",
-  "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",
-  "GET /repos/{owner}/{repo}/keys",
-  "GET /repos/{owner}/{repo}/labels",
-  "GET /repos/{owner}/{repo}/milestones",
-  "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",
-  "GET /repos/{owner}/{repo}/notifications",
-  "GET /repos/{owner}/{repo}/pages/builds",
-  "GET /repos/{owner}/{repo}/projects",
-  "GET /repos/{owner}/{repo}/pulls",
-  "GET /repos/{owner}/{repo}/pulls/comments",
-  "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",
-  "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",
-  "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",
-  "GET /repos/{owner}/{repo}/pulls/{pull_number}/files",
-  "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews",
-  "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",
-  "GET /repos/{owner}/{repo}/releases",
-  "GET /repos/{owner}/{repo}/releases/{release_id}/assets",
-  "GET /repos/{owner}/{repo}/releases/{release_id}/reactions",
-  "GET /repos/{owner}/{repo}/rules/branches/{branch}",
-  "GET /repos/{owner}/{repo}/rulesets",
-  "GET /repos/{owner}/{repo}/rulesets/rule-suites",
-  "GET /repos/{owner}/{repo}/secret-scanning/alerts",
-  "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",
-  "GET /repos/{owner}/{repo}/security-advisories",
-  "GET /repos/{owner}/{repo}/stargazers",
-  "GET /repos/{owner}/{repo}/subscribers",
-  "GET /repos/{owner}/{repo}/tags",
-  "GET /repos/{owner}/{repo}/teams",
-  "GET /repos/{owner}/{repo}/topics",
-  "GET /repositories",
-  "GET /repositories/{repository_id}/environments/{environment_name}/secrets",
-  "GET /repositories/{repository_id}/environments/{environment_name}/variables",
-  "GET /search/code",
-  "GET /search/commits",
-  "GET /search/issues",
-  "GET /search/labels",
-  "GET /search/repositories",
-  "GET /search/topics",
-  "GET /search/users",
-  "GET /teams/{team_id}/discussions",
-  "GET /teams/{team_id}/discussions/{discussion_number}/comments",
-  "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions",
-  "GET /teams/{team_id}/discussions/{discussion_number}/reactions",
-  "GET /teams/{team_id}/invitations",
-  "GET /teams/{team_id}/members",
-  "GET /teams/{team_id}/projects",
-  "GET /teams/{team_id}/repos",
-  "GET /teams/{team_id}/teams",
-  "GET /user/blocks",
-  "GET /user/codespaces",
-  "GET /user/codespaces/secrets",
-  "GET /user/emails",
-  "GET /user/followers",
-  "GET /user/following",
-  "GET /user/gpg_keys",
-  "GET /user/installations",
-  "GET /user/installations/{installation_id}/repositories",
-  "GET /user/issues",
-  "GET /user/keys",
-  "GET /user/marketplace_purchases",
-  "GET /user/marketplace_purchases/stubbed",
-  "GET /user/memberships/orgs",
-  "GET /user/migrations",
-  "GET /user/migrations/{migration_id}/repositories",
-  "GET /user/orgs",
-  "GET /user/packages",
-  "GET /user/packages/{package_type}/{package_name}/versions",
-  "GET /user/public_emails",
-  "GET /user/repos",
-  "GET /user/repository_invitations",
-  "GET /user/social_accounts",
-  "GET /user/ssh_signing_keys",
-  "GET /user/starred",
-  "GET /user/subscriptions",
-  "GET /user/teams",
-  "GET /users",
-  "GET /users/{username}/events",
-  "GET /users/{username}/events/orgs/{org}",
-  "GET /users/{username}/events/public",
-  "GET /users/{username}/followers",
-  "GET /users/{username}/following",
-  "GET /users/{username}/gists",
-  "GET /users/{username}/gpg_keys",
-  "GET /users/{username}/keys",
-  "GET /users/{username}/orgs",
-  "GET /users/{username}/packages",
-  "GET /users/{username}/projects",
-  "GET /users/{username}/received_events",
-  "GET /users/{username}/received_events/public",
-  "GET /users/{username}/repos",
-  "GET /users/{username}/social_accounts",
-  "GET /users/{username}/ssh_signing_keys",
-  "GET /users/{username}/starred",
-  "GET /users/{username}/subscriptions"
-];
+	      this.#info.closeInfo = this.parseCloseBody(body);
 
-// pkg/dist-src/paginating-endpoints.js
-function isPaginatingEndpoint(arg) {
-  if (typeof arg === "string") {
-    return paginatingEndpoints.includes(arg);
-  } else {
-    return false;
-  }
-}
+	      if (this.#info.closeInfo.error) {
+	        const { code, reason } = this.#info.closeInfo;
 
-// pkg/dist-src/index.js
-function paginateRest(octokit) {
-  return {
-    paginate: Object.assign(paginate.bind(null, octokit), {
-      iterator: iterator.bind(null, octokit)
-    })
-  };
-}
-paginateRest.VERSION = VERSION;
+	        closeWebSocketConnection(this.ws, code, reason, reason.length);
+	        failWebsocketConnection(this.ws, reason);
+	        return false
+	      }
 
-var distWeb = /*#__PURE__*/Object.freeze({
-	__proto__: null,
-	composePaginateRest: composePaginateRest,
-	isPaginatingEndpoint: isPaginatingEndpoint,
-	paginateRest: paginateRest,
-	paginatingEndpoints: paginatingEndpoints
-});
+	      if (this.ws[kSentClose] !== sentCloseFrameState.SENT) {
+	        // If an endpoint receives a Close frame and did not previously send a
+	        // Close frame, the endpoint MUST send a Close frame in response.  (When
+	        // sending a Close frame in response, the endpoint typically echos the
+	        // status code it received.)
+	        let body = emptyBuffer;
+	        if (this.#info.closeInfo.code) {
+	          body = Buffer.allocUnsafe(2);
+	          body.writeUInt16BE(this.#info.closeInfo.code, 0);
+	        }
+	        const closeFrame = new WebsocketFrameSend(body);
 
-var require$$4 = /*@__PURE__*/getAugmentedNamespace(distWeb);
+	        this.ws[kResponse].socket.write(
+	          closeFrame.createFrame(opcodes.CLOSE),
+	          (err) => {
+	            if (!err) {
+	              this.ws[kSentClose] = sentCloseFrameState.SENT;
+	            }
+	          }
+	        );
+	      }
 
-var hasRequiredUtils$1;
+	      // Upon either sending or receiving a Close control frame, it is said
+	      // that _The WebSocket Closing Handshake is Started_ and that the
+	      // WebSocket connection is in the CLOSING state.
+	      this.ws[kReadyState] = states.CLOSING;
+	      this.ws[kReceivedClose] = true;
 
-function requireUtils$1 () {
-	if (hasRequiredUtils$1) return utils$2;
-	hasRequiredUtils$1 = 1;
-	(function (exports$1) {
-		var __createBinding = (utils$2 && utils$2.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    var desc = Object.getOwnPropertyDescriptor(m, k);
-		    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-		      desc = { enumerable: true, get: function() { return m[k]; } };
-		    }
-		    Object.defineProperty(o, k2, desc);
-		}) : (function(o, m, k, k2) {
-		    if (k2 === undefined) k2 = k;
-		    o[k2] = m[k];
-		}));
-		var __setModuleDefault = (utils$2 && utils$2.__setModuleDefault) || (Object.create ? (function(o, v) {
-		    Object.defineProperty(o, "default", { enumerable: true, value: v });
-		}) : function(o, v) {
-		    o["default"] = v;
-		});
-		var __importStar = (utils$2 && utils$2.__importStar) || function (mod) {
-		    if (mod && mod.__esModule) return mod;
-		    var result = {};
-		    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-		    __setModuleDefault(result, mod);
-		    return result;
-		};
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.getOctokitOptions = exports$1.GitHub = exports$1.defaults = exports$1.context = void 0;
-		const Context = __importStar(requireContext());
-		const Utils = __importStar(requireUtils$2());
-		// octokit + plugins
-		const core_1 = require$$2;
-		const plugin_rest_endpoint_methods_1 = require$$3;
-		const plugin_paginate_rest_1 = require$$4;
-		exports$1.context = new Context.Context();
-		const baseUrl = Utils.getApiBaseUrl();
-		exports$1.defaults = {
-		    baseUrl,
-		    request: {
-		        agent: Utils.getProxyAgent(baseUrl),
-		        fetch: Utils.getProxyFetch(baseUrl)
-		    }
-		};
-		exports$1.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports$1.defaults);
-		/**
-		 * Convience function to correctly format Octokit Options to pass into the constructor.
-		 *
-		 * @param     token    the repo PAT or GITHUB_TOKEN
-		 * @param     options  other options to set
-		 */
-		function getOctokitOptions(token, options) {
-		    const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller
-		    // Auth
-		    const auth = Utils.getAuthString(token, opts);
-		    if (auth) {
-		        opts.auth = auth;
-		    }
-		    return opts;
-		}
-		exports$1.getOctokitOptions = getOctokitOptions;
-		
-	} (utils$2));
-	return utils$2;
-}
+	      return false
+	    } else if (opcode === opcodes.PING) {
+	      // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in
+	      // response, unless it already received a Close frame.
+	      // A Pong frame sent in response to a Ping frame must have identical
+	      // "Application data"
 
-var hasRequiredGithub;
+	      if (!this.ws[kReceivedClose]) {
+	        const frame = new WebsocketFrameSend(body);
 
-function requireGithub () {
-	if (hasRequiredGithub) return github;
-	hasRequiredGithub = 1;
-	var __createBinding = (github && github.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
+	        this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG));
+
+	        if (channels.ping.hasSubscribers) {
+	          channels.ping.publish({
+	            payload: body
+	          });
+	        }
+	      }
+	    } else if (opcode === opcodes.PONG) {
+	      // A Pong frame MAY be sent unsolicited.  This serves as a
+	      // unidirectional heartbeat.  A response to an unsolicited Pong frame is
+	      // not expected.
+
+	      if (channels.pong.hasSubscribers) {
+	        channels.pong.publish({
+	          payload: body
+	        });
+	      }
 	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (github && github.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (github && github.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	Object.defineProperty(github, "__esModule", { value: true });
-	github.getOctokit = github.context = void 0;
-	const Context = __importStar(requireContext());
-	const utils_1 = requireUtils$1();
-	github.context = new Context.Context();
-	/**
-	 * Returns a hydrated octokit ready to use for GitHub Actions
-	 *
-	 * @param     token    the repo PAT or GITHUB_TOKEN
-	 * @param     options  other options to set
-	 */
-	function getOctokit(token, options, ...additionalPlugins) {
-	    const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);
-	    return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options));
+
+	    return true
+	  }
+
+	  get closingInfo () {
+	    return this.#info.closeInfo
+	  }
 	}
-	github.getOctokit = getOctokit;
-	
-	return github;
+
+	receiver = {
+	  ByteParser
+	};
+	return receiver;
 }
 
-var githubExports = requireGithub();
+var sender;
+var hasRequiredSender;
 
-var re = {exports: {}};
+function requireSender () {
+	if (hasRequiredSender) return sender;
+	hasRequiredSender = 1;
 
-var constants;
-var hasRequiredConstants;
+	const { WebsocketFrameSend } = requireFrame();
+	const { opcodes, sendHints } = requireConstants$1();
+	const FixedQueue = requireFixedQueue();
 
-function requireConstants () {
-	if (hasRequiredConstants) return constants;
-	hasRequiredConstants = 1;
+	/** @type {typeof Uint8Array} */
+	const FastBuffer = Buffer[Symbol.species];
 
-	// Note: this is the semver.org version of the spec that it implements
-	// Not necessarily the package version of this code.
-	const SEMVER_SPEC_VERSION = '2.0.0';
+	/**
+	 * @typedef {object} SendQueueNode
+	 * @property {Promise | null} promise
+	 * @property {((...args: any[]) => any)} callback
+	 * @property {Buffer | null} frame
+	 */
 
-	const MAX_LENGTH = 256;
-	const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
-	/* istanbul ignore next */ 9007199254740991;
+	class SendQueue {
+	  /**
+	   * @type {FixedQueue}
+	   */
+	  #queue = new FixedQueue()
 
-	// Max safe segment length for coercion.
-	const MAX_SAFE_COMPONENT_LENGTH = 16;
+	  /**
+	   * @type {boolean}
+	   */
+	  #running = false
 
-	// Max safe length for a build identifier. The max length minus 6 characters for
-	// the shortest version with a build 0.0.0+BUILD.
-	const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
+	  /** @type {import('node:net').Socket} */
+	  #socket
 
-	const RELEASE_TYPES = [
-	  'major',
-	  'premajor',
-	  'minor',
-	  'preminor',
-	  'patch',
-	  'prepatch',
-	  'prerelease',
-	];
+	  constructor (socket) {
+	    this.#socket = socket;
+	  }
 
-	constants = {
-	  MAX_LENGTH,
-	  MAX_SAFE_COMPONENT_LENGTH,
-	  MAX_SAFE_BUILD_LENGTH,
-	  MAX_SAFE_INTEGER,
-	  RELEASE_TYPES,
-	  SEMVER_SPEC_VERSION,
-	  FLAG_INCLUDE_PRERELEASE: 0b001,
-	  FLAG_LOOSE: 0b010,
-	};
-	return constants;
-}
+	  add (item, cb, hint) {
+	    if (hint !== sendHints.blob) {
+	      const frame = createFrame(item, hint);
+	      if (!this.#running) {
+	        // fast-path
+	        this.#socket.write(frame, cb);
+	      } else {
+	        /** @type {SendQueueNode} */
+	        const node = {
+	          promise: null,
+	          callback: cb,
+	          frame
+	        };
+	        this.#queue.push(node);
+	      }
+	      return
+	    }
 
-var debug_1;
-var hasRequiredDebug;
+	    /** @type {SendQueueNode} */
+	    const node = {
+	      promise: item.arrayBuffer().then((ab) => {
+	        node.promise = null;
+	        node.frame = createFrame(ab, hint);
+	      }),
+	      callback: cb,
+	      frame: null
+	    };
 
-function requireDebug () {
-	if (hasRequiredDebug) return debug_1;
-	hasRequiredDebug = 1;
+	    this.#queue.push(node);
 
-	const debug = (
-	  typeof process === 'object' &&
-	  process.env &&
-	  process.env.NODE_DEBUG &&
-	  /\bsemver\b/i.test(process.env.NODE_DEBUG)
-	) ? (...args) => console.error('SEMVER', ...args)
-	  : () => {};
+	    if (!this.#running) {
+	      this.#run();
+	    }
+	  }
 
-	debug_1 = debug;
-	return debug_1;
-}
+	  async #run () {
+	    this.#running = true;
+	    const queue = this.#queue;
+	    while (!queue.isEmpty()) {
+	      const node = queue.shift();
+	      // wait pending promise
+	      if (node.promise !== null) {
+	        await node.promise;
+	      }
+	      // write
+	      this.#socket.write(node.frame, node.callback);
+	      // cleanup
+	      node.callback = node.frame = null;
+	    }
+	    this.#running = false;
+	  }
+	}
 
-var hasRequiredRe;
+	function createFrame (data, hint) {
+	  return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY)
+	}
 
-function requireRe () {
-	if (hasRequiredRe) return re.exports;
-	hasRequiredRe = 1;
-	(function (module, exports$1) {
+	function toBuffer (data, hint) {
+	  switch (hint) {
+	    case sendHints.string:
+	      return Buffer.from(data)
+	    case sendHints.arrayBuffer:
+	    case sendHints.blob:
+	      return new FastBuffer(data)
+	    case sendHints.typedArray:
+	      return new FastBuffer(data.buffer, data.byteOffset, data.byteLength)
+	  }
+	}
 
-		const {
-		  MAX_SAFE_COMPONENT_LENGTH,
-		  MAX_SAFE_BUILD_LENGTH,
-		  MAX_LENGTH,
-		} = requireConstants();
-		const debug = requireDebug();
-		exports$1 = module.exports = {};
+	sender = { SendQueue };
+	return sender;
+}
 
-		// The actual regexps go on exports.re
-		const re = exports$1.re = [];
-		const safeRe = exports$1.safeRe = [];
-		const src = exports$1.src = [];
-		const safeSrc = exports$1.safeSrc = [];
-		const t = exports$1.t = {};
-		let R = 0;
+var websocket;
+var hasRequiredWebsocket;
 
-		const LETTERDASHNUMBER = '[a-zA-Z0-9-]';
+function requireWebsocket () {
+	if (hasRequiredWebsocket) return websocket;
+	hasRequiredWebsocket = 1;
 
-		// Replace some greedy regex tokens to prevent regex dos issues. These regex are
-		// used internally via the safeRe object since all inputs in this library get
-		// normalized first to trim and collapse all extra whitespace. The original
-		// regexes are exported for userland consumption and lower level usage. A
-		// future breaking change could export the safer regex only with a note that
-		// all input should have extra whitespace removed.
-		const safeRegexReplacements = [
-		  ['\\s', 1],
-		  ['\\d', MAX_LENGTH],
-		  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
-		];
+	const { webidl } = requireWebidl();
+	const { URLSerializer } = requireDataUrl();
+	const { environmentSettingsObject } = requireUtil$6();
+	const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = requireConstants$1();
+	const {
+	  kWebSocketURL,
+	  kReadyState,
+	  kController,
+	  kBinaryType,
+	  kResponse,
+	  kSentClose,
+	  kByteParser
+	} = requireSymbols();
+	const {
+	  isConnecting,
+	  isEstablished,
+	  isClosing,
+	  isValidSubprotocol,
+	  fireEvent
+	} = requireUtil$1();
+	const { establishWebSocketConnection, closeWebSocketConnection } = requireConnection();
+	const { ByteParser } = requireReceiver();
+	const { kEnumerableProperty, isBlobLike } = requireUtil$7();
+	const { getGlobalDispatcher } = requireGlobal();
+	const { types } = require$$0$a;
+	const { ErrorEvent, CloseEvent } = requireEvents();
+	const { SendQueue } = requireSender();
 
-		const makeSafeRegex = (value) => {
-		  for (const [token, max] of safeRegexReplacements) {
-		    value = value
-		      .split(`${token}*`).join(`${token}{0,${max}}`)
-		      .split(`${token}+`).join(`${token}{1,${max}}`);
-		  }
-		  return value
-		};
+	// https://websockets.spec.whatwg.org/#interface-definition
+	class WebSocket extends EventTarget {
+	  #events = {
+	    open: null,
+	    error: null,
+	    close: null,
+	    message: null
+	  }
 
-		const createToken = (name, value, isGlobal) => {
-		  const safe = makeSafeRegex(value);
-		  const index = R++;
-		  debug(name, index, value);
-		  t[name] = index;
-		  src[index] = value;
-		  safeSrc[index] = safe;
-		  re[index] = new RegExp(value, isGlobal ? 'g' : undefined);
-		  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined);
-		};
+	  #bufferedAmount = 0
+	  #protocol = ''
+	  #extensions = ''
 
-		// The following Regular Expressions can be used for tokenizing,
-		// validating, and parsing SemVer version strings.
+	  /** @type {SendQueue} */
+	  #sendQueue
 
-		// ## Numeric Identifier
-		// A single `0`, or a non-zero digit followed by zero or more digits.
+	  /**
+	   * @param {string} url
+	   * @param {string|string[]} protocols
+	   */
+	  constructor (url, protocols = []) {
+	    super();
 
-		createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*');
-		createToken('NUMERICIDENTIFIERLOOSE', '\\d+');
+	    webidl.util.markAsUncloneable(this);
 
-		// ## Non-numeric Identifier
-		// Zero or more digits, followed by a letter or hyphen, and then zero or
-		// more letters, digits, or hyphens.
+	    const prefix = 'WebSocket constructor';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
 
-		createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
+	    const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options');
 
-		// ## Main Version
-		// Three dot-separated numeric identifiers.
+	    url = webidl.converters.USVString(url, prefix, 'url');
+	    protocols = options.protocols;
 
-		createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
-		                   `(${src[t.NUMERICIDENTIFIER]})\\.` +
-		                   `(${src[t.NUMERICIDENTIFIER]})`);
+	    // 1. Let baseURL be this's relevant settings object's API base URL.
+	    const baseURL = environmentSettingsObject.settingsObject.baseUrl;
 
-		createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
-		                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
-		                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
+	    // 1. Let urlRecord be the result of applying the URL parser to url with baseURL.
+	    let urlRecord;
 
-		// ## Pre-release Version Identifier
-		// A numeric identifier, or a non-numeric identifier.
-		// Non-numberic identifiers include numberic identifiers but can be longer.
-		// Therefore non-numberic identifiers must go first.
+	    try {
+	      urlRecord = new URL(url, baseURL);
+	    } catch (e) {
+	      // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException.
+	      throw new DOMException(e, 'SyntaxError')
+	    }
 
-		createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]
-		}|${src[t.NUMERICIDENTIFIER]})`);
+	    // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws".
+	    if (urlRecord.protocol === 'http:') {
+	      urlRecord.protocol = 'ws:';
+	    } else if (urlRecord.protocol === 'https:') {
+	      // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss".
+	      urlRecord.protocol = 'wss:';
+	    }
 
-		createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]
-		}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
+	    // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException.
+	    if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {
+	      throw new DOMException(
+	        `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,
+	        'SyntaxError'
+	      )
+	    }
 
-		// ## Pre-release Version
-		// Hyphen, followed by one or more dot-separated pre-release version
-		// identifiers.
+	    // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError"
+	    //    DOMException.
+	    if (urlRecord.hash || urlRecord.href.endsWith('#')) {
+	      throw new DOMException('Got fragment', 'SyntaxError')
+	    }
 
-		createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
-		}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
+	    // 8. If protocols is a string, set protocols to a sequence consisting
+	    //    of just that string.
+	    if (typeof protocols === 'string') {
+	      protocols = [protocols];
+	    }
 
-		createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
-		}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
+	    // 9. If any of the values in protocols occur more than once or otherwise
+	    //    fail to match the requirements for elements that comprise the value
+	    //    of `Sec-WebSocket-Protocol` fields as defined by The WebSocket
+	    //    protocol, then throw a "SyntaxError" DOMException.
+	    if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {
+	      throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')
+	    }
 
-		// ## Build Metadata Identifier
-		// Any combination of digits, letters, or hyphens.
+	    if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {
+	      throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')
+	    }
 
-		createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`);
+	    // 10. Set this's url to urlRecord.
+	    this[kWebSocketURL] = new URL(urlRecord.href);
 
-		// ## Build Metadata
-		// Plus sign, followed by one or more period-separated build metadata
-		// identifiers.
+	    // 11. Let client be this's relevant settings object.
+	    const client = environmentSettingsObject.settingsObject;
 
-		createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
-		}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
+	    // 12. Run this step in parallel:
 
-		// ## Full Version String
-		// A main version, followed optionally by a pre-release version and
-		// build metadata.
+	    //    1. Establish a WebSocket connection given urlRecord, protocols,
+	    //       and client.
+	    this[kController] = establishWebSocketConnection(
+	      urlRecord,
+	      protocols,
+	      client,
+	      this,
+	      (response, extensions) => this.#onConnectionEstablished(response, extensions),
+	      options
+	    );
 
-		// Note that the only major, minor, patch, and pre-release sections of
-		// the version string are capturing groups.  The build metadata is not a
-		// capturing group, because it should not ever be used in version
-		// comparison.
+	    // Each WebSocket object has an associated ready state, which is a
+	    // number representing the state of the connection. Initially it must
+	    // be CONNECTING (0).
+	    this[kReadyState] = WebSocket.CONNECTING;
 
-		createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
-		}${src[t.PRERELEASE]}?${
-		  src[t.BUILD]}?`);
+	    this[kSentClose] = sentCloseFrameState.NOT_SENT;
 
-		createToken('FULL', `^${src[t.FULLPLAIN]}$`);
+	    // The extensions attribute must initially return the empty string.
 
-		// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
-		// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
-		// common in the npm registry.
-		createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
-		}${src[t.PRERELEASELOOSE]}?${
-		  src[t.BUILD]}?`);
+	    // The protocol attribute must initially return the empty string.
 
-		createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`);
+	    // Each WebSocket object has an associated binary type, which is a
+	    // BinaryType. Initially it must be "blob".
+	    this[kBinaryType] = 'blob';
+	  }
 
-		createToken('GTLT', '((?:<|>)?=?)');
+	  /**
+	   * @see https://websockets.spec.whatwg.org/#dom-websocket-close
+	   * @param {number|undefined} code
+	   * @param {string|undefined} reason
+	   */
+	  close (code = undefined, reason = undefined) {
+	    webidl.brandCheck(this, WebSocket);
 
-		// Something like "2.*" or "1.2.x".
-		// Note that "x.x" is a valid xRange identifer, meaning "any version"
-		// Only the first item is strictly required.
-		createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
-		createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
+	    const prefix = 'WebSocket.close';
 
-		createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
-		                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
-		                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
-		                   `(?:${src[t.PRERELEASE]})?${
-		                     src[t.BUILD]}?` +
-		                   `)?)?`);
+	    if (code !== undefined) {
+	      code = webidl.converters['unsigned short'](code, prefix, 'code', { clamp: true });
+	    }
 
-		createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-		                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-		                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-		                        `(?:${src[t.PRERELEASELOOSE]})?${
-		                          src[t.BUILD]}?` +
-		                        `)?)?`);
+	    if (reason !== undefined) {
+	      reason = webidl.converters.USVString(reason, prefix, 'reason');
+	    }
 
-		createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
-		createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
+	    // 1. If code is present, but is neither an integer equal to 1000 nor an
+	    //    integer in the range 3000 to 4999, inclusive, throw an
+	    //    "InvalidAccessError" DOMException.
+	    if (code !== undefined) {
+	      if (code !== 1000 && (code < 3000 || code > 4999)) {
+	        throw new DOMException('invalid code', 'InvalidAccessError')
+	      }
+	    }
 
-		// Coercion.
-		// Extract anything that could conceivably be a part of a valid semver
-		createToken('COERCEPLAIN', `${'(^|[^\\d])' +
-		              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
-		              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
-		              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
-		createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
-		createToken('COERCEFULL', src[t.COERCEPLAIN] +
-		              `(?:${src[t.PRERELEASE]})?` +
-		              `(?:${src[t.BUILD]})?` +
-		              `(?:$|[^\\d])`);
-		createToken('COERCERTL', src[t.COERCE], true);
-		createToken('COERCERTLFULL', src[t.COERCEFULL], true);
+	    let reasonByteLength = 0;
 
-		// Tilde ranges.
-		// Meaning is "reasonably at or greater than"
-		createToken('LONETILDE', '(?:~>?)');
+	    // 2. If reason is present, then run these substeps:
+	    if (reason !== undefined) {
+	      // 1. Let reasonBytes be the result of encoding reason.
+	      // 2. If reasonBytes is longer than 123 bytes, then throw a
+	      //    "SyntaxError" DOMException.
+	      reasonByteLength = Buffer.byteLength(reason);
 
-		createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true);
-		exports$1.tildeTrimReplace = '$1~';
+	      if (reasonByteLength > 123) {
+	        throw new DOMException(
+	          `Reason must be less than 123 bytes; received ${reasonByteLength}`,
+	          'SyntaxError'
+	        )
+	      }
+	    }
 
-		createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
-		createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
+	    // 3. Run the first matching steps from the following list:
+	    closeWebSocketConnection(this, code, reason, reasonByteLength);
+	  }
 
-		// Caret ranges.
-		// Meaning is "at least and backwards compatible with"
-		createToken('LONECARET', '(?:\\^)');
+	  /**
+	   * @see https://websockets.spec.whatwg.org/#dom-websocket-send
+	   * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data
+	   */
+	  send (data) {
+	    webidl.brandCheck(this, WebSocket);
 
-		createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true);
-		exports$1.caretTrimReplace = '$1^';
+	    const prefix = 'WebSocket.send';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
 
-		createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
-		createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
+	    data = webidl.converters.WebSocketSendData(data, prefix, 'data');
 
-		// A simple gt/lt/eq thing, or just "" to indicate "any version"
-		createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
-		createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
+	    // 1. If this's ready state is CONNECTING, then throw an
+	    //    "InvalidStateError" DOMException.
+	    if (isConnecting(this)) {
+	      throw new DOMException('Sent before connected.', 'InvalidStateError')
+	    }
 
-		// An expression to strip any whitespace between the gtlt and the thing
-		// it modifies, so that `> 1.2.3` ==> `>1.2.3`
-		createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
-		}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
-		exports$1.comparatorTrimReplace = '$1$2$3';
+	    // 2. Run the appropriate set of steps from the following list:
+	    // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1
+	    // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
 
-		// Something like `1.2.3 - 1.2.4`
-		// Note that these all use the loose form, because they'll be
-		// checked against either the strict or loose comparator form
-		// later.
-		createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
-		                   `\\s+-\\s+` +
-		                   `(${src[t.XRANGEPLAIN]})` +
-		                   `\\s*$`);
+	    if (!isEstablished(this) || isClosing(this)) {
+	      return
+	    }
 
-		createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
-		                        `\\s+-\\s+` +
-		                        `(${src[t.XRANGEPLAINLOOSE]})` +
-		                        `\\s*$`);
+	    // If data is a string
+	    if (typeof data === 'string') {
+	      // If the WebSocket connection is established and the WebSocket
+	      // closing handshake has not yet started, then the user agent
+	      // must send a WebSocket Message comprised of the data argument
+	      // using a text frame opcode; if the data cannot be sent, e.g.
+	      // because it would need to be buffered but the buffer is full,
+	      // the user agent must flag the WebSocket as full and then close
+	      // the WebSocket connection. Any invocation of this method with a
+	      // string argument that does not throw an exception must increase
+	      // the bufferedAmount attribute by the number of bytes needed to
+	      // express the argument as UTF-8.
 
-		// Star ranges basically just allow anything at all.
-		createToken('STAR', '(<|>)?=?\\s*\\*');
-		// >=0.0.0 is like a star
-		createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$');
-		createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$'); 
-	} (re, re.exports));
-	return re.exports;
-}
+	      const length = Buffer.byteLength(data);
 
-var parseOptions_1;
-var hasRequiredParseOptions;
+	      this.#bufferedAmount += length;
+	      this.#sendQueue.add(data, () => {
+	        this.#bufferedAmount -= length;
+	      }, sendHints.string);
+	    } else if (types.isArrayBuffer(data)) {
+	      // If the WebSocket connection is established, and the WebSocket
+	      // closing handshake has not yet started, then the user agent must
+	      // send a WebSocket Message comprised of data using a binary frame
+	      // opcode; if the data cannot be sent, e.g. because it would need
+	      // to be buffered but the buffer is full, the user agent must flag
+	      // the WebSocket as full and then close the WebSocket connection.
+	      // The data to be sent is the data stored in the buffer described
+	      // by the ArrayBuffer object. Any invocation of this method with an
+	      // ArrayBuffer argument that does not throw an exception must
+	      // increase the bufferedAmount attribute by the length of the
+	      // ArrayBuffer in bytes.
 
-function requireParseOptions () {
-	if (hasRequiredParseOptions) return parseOptions_1;
-	hasRequiredParseOptions = 1;
+	      this.#bufferedAmount += data.byteLength;
+	      this.#sendQueue.add(data, () => {
+	        this.#bufferedAmount -= data.byteLength;
+	      }, sendHints.arrayBuffer);
+	    } else if (ArrayBuffer.isView(data)) {
+	      // If the WebSocket connection is established, and the WebSocket
+	      // closing handshake has not yet started, then the user agent must
+	      // send a WebSocket Message comprised of data using a binary frame
+	      // opcode; if the data cannot be sent, e.g. because it would need to
+	      // be buffered but the buffer is full, the user agent must flag the
+	      // WebSocket as full and then close the WebSocket connection. The
+	      // data to be sent is the data stored in the section of the buffer
+	      // described by the ArrayBuffer object that data references. Any
+	      // invocation of this method with this kind of argument that does
+	      // not throw an exception must increase the bufferedAmount attribute
+	      // by the length of data’s buffer in bytes.
 
-	// parse out just the options we care about
-	const looseOption = Object.freeze({ loose: true });
-	const emptyOpts = Object.freeze({ });
-	const parseOptions = options => {
-	  if (!options) {
-	    return emptyOpts
-	  }
+	      this.#bufferedAmount += data.byteLength;
+	      this.#sendQueue.add(data, () => {
+	        this.#bufferedAmount -= data.byteLength;
+	      }, sendHints.typedArray);
+	    } else if (isBlobLike(data)) {
+	      // If the WebSocket connection is established, and the WebSocket
+	      // closing handshake has not yet started, then the user agent must
+	      // send a WebSocket Message comprised of data using a binary frame
+	      // opcode; if the data cannot be sent, e.g. because it would need to
+	      // be buffered but the buffer is full, the user agent must flag the
+	      // WebSocket as full and then close the WebSocket connection. The data
+	      // to be sent is the raw data represented by the Blob object. Any
+	      // invocation of this method with a Blob argument that does not throw
+	      // an exception must increase the bufferedAmount attribute by the size
+	      // of the Blob object’s raw data, in bytes.
 
-	  if (typeof options !== 'object') {
-	    return looseOption
+	      this.#bufferedAmount += data.size;
+	      this.#sendQueue.add(data, () => {
+	        this.#bufferedAmount -= data.size;
+	      }, sendHints.blob);
+	    }
 	  }
 
-	  return options
-	};
-	parseOptions_1 = parseOptions;
-	return parseOptions_1;
-}
+	  get readyState () {
+	    webidl.brandCheck(this, WebSocket);
 
-var identifiers;
-var hasRequiredIdentifiers;
+	    // The readyState getter steps are to return this's ready state.
+	    return this[kReadyState]
+	  }
 
-function requireIdentifiers () {
-	if (hasRequiredIdentifiers) return identifiers;
-	hasRequiredIdentifiers = 1;
+	  get bufferedAmount () {
+	    webidl.brandCheck(this, WebSocket);
 
-	const numeric = /^[0-9]+$/;
-	const compareIdentifiers = (a, b) => {
-	  if (typeof a === 'number' && typeof b === 'number') {
-	    return a === b ? 0 : a < b ? -1 : 1
+	    return this.#bufferedAmount
 	  }
 
-	  const anum = numeric.test(a);
-	  const bnum = numeric.test(b);
+	  get url () {
+	    webidl.brandCheck(this, WebSocket);
 
-	  if (anum && bnum) {
-	    a = +a;
-	    b = +b;
+	    // The url getter steps are to return this's url, serialized.
+	    return URLSerializer(this[kWebSocketURL])
 	  }
 
-	  return a === b ? 0
-	    : (anum && !bnum) ? -1
-	    : (bnum && !anum) ? 1
-	    : a < b ? -1
-	    : 1
-	};
+	  get extensions () {
+	    webidl.brandCheck(this, WebSocket);
 
-	const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
+	    return this.#extensions
+	  }
 
-	identifiers = {
-	  compareIdentifiers,
-	  rcompareIdentifiers,
-	};
-	return identifiers;
-}
+	  get protocol () {
+	    webidl.brandCheck(this, WebSocket);
 
-var semver$2;
-var hasRequiredSemver$2;
+	    return this.#protocol
+	  }
 
-function requireSemver$2 () {
-	if (hasRequiredSemver$2) return semver$2;
-	hasRequiredSemver$2 = 1;
+	  get onopen () {
+	    webidl.brandCheck(this, WebSocket);
 
-	const debug = requireDebug();
-	const { MAX_LENGTH, MAX_SAFE_INTEGER } = requireConstants();
-	const { safeRe: re, t } = requireRe();
+	    return this.#events.open
+	  }
 
-	const parseOptions = requireParseOptions();
-	const { compareIdentifiers } = requireIdentifiers();
-	class SemVer {
-	  constructor (version, options) {
-	    options = parseOptions(options);
+	  set onopen (fn) {
+	    webidl.brandCheck(this, WebSocket);
 
-	    if (version instanceof SemVer) {
-	      if (version.loose === !!options.loose &&
-	        version.includePrerelease === !!options.includePrerelease) {
-	        return version
-	      } else {
-	        version = version.version;
-	      }
-	    } else if (typeof version !== 'string') {
-	      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
+	    if (this.#events.open) {
+	      this.removeEventListener('open', this.#events.open);
 	    }
 
-	    if (version.length > MAX_LENGTH) {
-	      throw new TypeError(
-	        `version is longer than ${MAX_LENGTH} characters`
-	      )
+	    if (typeof fn === 'function') {
+	      this.#events.open = fn;
+	      this.addEventListener('open', fn);
+	    } else {
+	      this.#events.open = null;
 	    }
+	  }
 
-	    debug('SemVer', version, options);
-	    this.options = options;
-	    this.loose = !!options.loose;
-	    // this isn't actually relevant for versions, but keep it so that we
-	    // don't run into trouble passing this.options around.
-	    this.includePrerelease = !!options.includePrerelease;
+	  get onerror () {
+	    webidl.brandCheck(this, WebSocket);
 
-	    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
+	    return this.#events.error
+	  }
 
-	    if (!m) {
-	      throw new TypeError(`Invalid Version: ${version}`)
+	  set onerror (fn) {
+	    webidl.brandCheck(this, WebSocket);
+
+	    if (this.#events.error) {
+	      this.removeEventListener('error', this.#events.error);
 	    }
 
-	    this.raw = version;
+	    if (typeof fn === 'function') {
+	      this.#events.error = fn;
+	      this.addEventListener('error', fn);
+	    } else {
+	      this.#events.error = null;
+	    }
+	  }
 
-	    // these are actually numbers
-	    this.major = +m[1];
-	    this.minor = +m[2];
-	    this.patch = +m[3];
+	  get onclose () {
+	    webidl.brandCheck(this, WebSocket);
 
-	    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
-	      throw new TypeError('Invalid major version')
-	    }
+	    return this.#events.close
+	  }
 
-	    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
-	      throw new TypeError('Invalid minor version')
-	    }
+	  set onclose (fn) {
+	    webidl.brandCheck(this, WebSocket);
 
-	    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
-	      throw new TypeError('Invalid patch version')
+	    if (this.#events.close) {
+	      this.removeEventListener('close', this.#events.close);
 	    }
 
-	    // numberify any prerelease numeric ids
-	    if (!m[4]) {
-	      this.prerelease = [];
+	    if (typeof fn === 'function') {
+	      this.#events.close = fn;
+	      this.addEventListener('close', fn);
 	    } else {
-	      this.prerelease = m[4].split('.').map((id) => {
-	        if (/^[0-9]+$/.test(id)) {
-	          const num = +id;
-	          if (num >= 0 && num < MAX_SAFE_INTEGER) {
-	            return num
-	          }
-	        }
-	        return id
-	      });
+	      this.#events.close = null;
 	    }
-
-	    this.build = m[5] ? m[5].split('.') : [];
-	    this.format();
 	  }
 
-	  format () {
-	    this.version = `${this.major}.${this.minor}.${this.patch}`;
-	    if (this.prerelease.length) {
-	      this.version += `-${this.prerelease.join('.')}`;
-	    }
-	    return this.version
-	  }
+	  get onmessage () {
+	    webidl.brandCheck(this, WebSocket);
 
-	  toString () {
-	    return this.version
+	    return this.#events.message
 	  }
 
-	  compare (other) {
-	    debug('SemVer.compare', this.version, this.options, other);
-	    if (!(other instanceof SemVer)) {
-	      if (typeof other === 'string' && other === this.version) {
-	        return 0
-	      }
-	      other = new SemVer(other, this.options);
-	    }
+	  set onmessage (fn) {
+	    webidl.brandCheck(this, WebSocket);
 
-	    if (other.version === this.version) {
-	      return 0
+	    if (this.#events.message) {
+	      this.removeEventListener('message', this.#events.message);
 	    }
 
-	    return this.compareMain(other) || this.comparePre(other)
+	    if (typeof fn === 'function') {
+	      this.#events.message = fn;
+	      this.addEventListener('message', fn);
+	    } else {
+	      this.#events.message = null;
+	    }
 	  }
 
-	  compareMain (other) {
-	    if (!(other instanceof SemVer)) {
-	      other = new SemVer(other, this.options);
-	    }
+	  get binaryType () {
+	    webidl.brandCheck(this, WebSocket);
 
-	    if (this.major < other.major) {
-	      return -1
-	    }
-	    if (this.major > other.major) {
-	      return 1
-	    }
-	    if (this.minor < other.minor) {
-	      return -1
-	    }
-	    if (this.minor > other.minor) {
-	      return 1
-	    }
-	    if (this.patch < other.patch) {
-	      return -1
-	    }
-	    if (this.patch > other.patch) {
-	      return 1
-	    }
-	    return 0
+	    return this[kBinaryType]
 	  }
 
-	  comparePre (other) {
-	    if (!(other instanceof SemVer)) {
-	      other = new SemVer(other, this.options);
-	    }
+	  set binaryType (type) {
+	    webidl.brandCheck(this, WebSocket);
 
-	    // NOT having a prerelease is > having one
-	    if (this.prerelease.length && !other.prerelease.length) {
-	      return -1
-	    } else if (!this.prerelease.length && other.prerelease.length) {
-	      return 1
-	    } else if (!this.prerelease.length && !other.prerelease.length) {
-	      return 0
+	    if (type !== 'blob' && type !== 'arraybuffer') {
+	      this[kBinaryType] = 'blob';
+	    } else {
+	      this[kBinaryType] = type;
 	    }
-
-	    let i = 0;
-	    do {
-	      const a = this.prerelease[i];
-	      const b = other.prerelease[i];
-	      debug('prerelease compare', i, a, b);
-	      if (a === undefined && b === undefined) {
-	        return 0
-	      } else if (b === undefined) {
-	        return 1
-	      } else if (a === undefined) {
-	        return -1
-	      } else if (a === b) {
-	        continue
-	      } else {
-	        return compareIdentifiers(a, b)
-	      }
-	    } while (++i)
 	  }
 
-	  compareBuild (other) {
-	    if (!(other instanceof SemVer)) {
-	      other = new SemVer(other, this.options);
-	    }
+	  /**
+	   * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
+	   */
+	  #onConnectionEstablished (response, parsedExtensions) {
+	    // processResponse is called when the "response’s header list has been received and initialized."
+	    // once this happens, the connection is open
+	    this[kResponse] = response;
 
-	    let i = 0;
-	    do {
-	      const a = this.build[i];
-	      const b = other.build[i];
-	      debug('build compare', i, a, b);
-	      if (a === undefined && b === undefined) {
-	        return 0
-	      } else if (b === undefined) {
-	        return 1
-	      } else if (a === undefined) {
-	        return -1
-	      } else if (a === b) {
-	        continue
-	      } else {
-	        return compareIdentifiers(a, b)
-	      }
-	    } while (++i)
-	  }
+	    const parser = new ByteParser(this, parsedExtensions);
+	    parser.on('drain', onParserDrain);
+	    parser.on('error', onParserError.bind(this));
 
-	  // preminor will bump the version up to the next minor release, and immediately
-	  // down to pre-release. premajor and prepatch work the same way.
-	  inc (release, identifier, identifierBase) {
-	    if (release.startsWith('pre')) {
-	      if (!identifier && identifierBase === false) {
-	        throw new Error('invalid increment argument: identifier is empty')
-	      }
-	      // Avoid an invalid semver results
-	      if (identifier) {
-	        const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
-	        if (!match || match[1] !== identifier) {
-	          throw new Error(`invalid identifier: ${identifier}`)
-	        }
-	      }
-	    }
+	    response.socket.ws = this;
+	    this[kByteParser] = parser;
 
-	    switch (release) {
-	      case 'premajor':
-	        this.prerelease.length = 0;
-	        this.patch = 0;
-	        this.minor = 0;
-	        this.major++;
-	        this.inc('pre', identifier, identifierBase);
-	        break
-	      case 'preminor':
-	        this.prerelease.length = 0;
-	        this.patch = 0;
-	        this.minor++;
-	        this.inc('pre', identifier, identifierBase);
-	        break
-	      case 'prepatch':
-	        // If this is already a prerelease, it will bump to the next version
-	        // drop any prereleases that might already exist, since they are not
-	        // relevant at this point.
-	        this.prerelease.length = 0;
-	        this.inc('patch', identifier, identifierBase);
-	        this.inc('pre', identifier, identifierBase);
-	        break
-	      // If the input is a non-prerelease version, this acts the same as
-	      // prepatch.
-	      case 'prerelease':
-	        if (this.prerelease.length === 0) {
-	          this.inc('patch', identifier, identifierBase);
-	        }
-	        this.inc('pre', identifier, identifierBase);
-	        break
-	      case 'release':
-	        if (this.prerelease.length === 0) {
-	          throw new Error(`version ${this.raw} is not a prerelease`)
-	        }
-	        this.prerelease.length = 0;
-	        break
+	    this.#sendQueue = new SendQueue(response.socket);
 
-	      case 'major':
-	        // If this is a pre-major version, bump up to the same major version.
-	        // Otherwise increment major.
-	        // 1.0.0-5 bumps to 1.0.0
-	        // 1.1.0 bumps to 2.0.0
-	        if (
-	          this.minor !== 0 ||
-	          this.patch !== 0 ||
-	          this.prerelease.length === 0
-	        ) {
-	          this.major++;
-	        }
-	        this.minor = 0;
-	        this.patch = 0;
-	        this.prerelease = [];
-	        break
-	      case 'minor':
-	        // If this is a pre-minor version, bump up to the same minor version.
-	        // Otherwise increment minor.
-	        // 1.2.0-5 bumps to 1.2.0
-	        // 1.2.1 bumps to 1.3.0
-	        if (this.patch !== 0 || this.prerelease.length === 0) {
-	          this.minor++;
-	        }
-	        this.patch = 0;
-	        this.prerelease = [];
-	        break
-	      case 'patch':
-	        // If this is not a pre-release version, it will increment the patch.
-	        // If it is a pre-release it will bump up to the same patch version.
-	        // 1.2.0-5 patches to 1.2.0
-	        // 1.2.0 patches to 1.2.1
-	        if (this.prerelease.length === 0) {
-	          this.patch++;
-	        }
-	        this.prerelease = [];
-	        break
-	      // This probably shouldn't be used publicly.
-	      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
-	      case 'pre': {
-	        const base = Number(identifierBase) ? 1 : 0;
+	    // 1. Change the ready state to OPEN (1).
+	    this[kReadyState] = states.OPEN;
 
-	        if (this.prerelease.length === 0) {
-	          this.prerelease = [base];
-	        } else {
-	          let i = this.prerelease.length;
-	          while (--i >= 0) {
-	            if (typeof this.prerelease[i] === 'number') {
-	              this.prerelease[i]++;
-	              i = -2;
-	            }
-	          }
-	          if (i === -1) {
-	            // didn't increment anything
-	            if (identifier === this.prerelease.join('.') && identifierBase === false) {
-	              throw new Error('invalid increment argument: identifier already exists')
-	            }
-	            this.prerelease.push(base);
-	          }
-	        }
-	        if (identifier) {
-	          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
-	          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
-	          let prerelease = [identifier, base];
-	          if (identifierBase === false) {
-	            prerelease = [identifier];
-	          }
-	          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
-	            if (isNaN(this.prerelease[1])) {
-	              this.prerelease = prerelease;
-	            }
-	          } else {
-	            this.prerelease = prerelease;
-	          }
-	        }
-	        break
-	      }
-	      default:
-	        throw new Error(`invalid increment argument: ${release}`)
+	    // 2. Change the extensions attribute’s value to the extensions in use, if
+	    //    it is not the null value.
+	    // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1
+	    const extensions = response.headersList.get('sec-websocket-extensions');
+
+	    if (extensions !== null) {
+	      this.#extensions = extensions;
 	    }
-	    this.raw = this.format();
-	    if (this.build.length) {
-	      this.raw += `+${this.build.join('.')}`;
+
+	    // 3. Change the protocol attribute’s value to the subprotocol in use, if
+	    //    it is not the null value.
+	    // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9
+	    const protocol = response.headersList.get('sec-websocket-protocol');
+
+	    if (protocol !== null) {
+	      this.#protocol = protocol;
 	    }
-	    return this
+
+	    // 4. Fire an event named open at the WebSocket object.
+	    fireEvent('open', this);
+	  }
+	}
+
+	// https://websockets.spec.whatwg.org/#dom-websocket-connecting
+	WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING;
+	// https://websockets.spec.whatwg.org/#dom-websocket-open
+	WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN;
+	// https://websockets.spec.whatwg.org/#dom-websocket-closing
+	WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING;
+	// https://websockets.spec.whatwg.org/#dom-websocket-closed
+	WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED;
+
+	Object.defineProperties(WebSocket.prototype, {
+	  CONNECTING: staticPropertyDescriptors,
+	  OPEN: staticPropertyDescriptors,
+	  CLOSING: staticPropertyDescriptors,
+	  CLOSED: staticPropertyDescriptors,
+	  url: kEnumerableProperty,
+	  readyState: kEnumerableProperty,
+	  bufferedAmount: kEnumerableProperty,
+	  onopen: kEnumerableProperty,
+	  onerror: kEnumerableProperty,
+	  onclose: kEnumerableProperty,
+	  close: kEnumerableProperty,
+	  onmessage: kEnumerableProperty,
+	  binaryType: kEnumerableProperty,
+	  send: kEnumerableProperty,
+	  extensions: kEnumerableProperty,
+	  protocol: kEnumerableProperty,
+	  [Symbol.toStringTag]: {
+	    value: 'WebSocket',
+	    writable: false,
+	    enumerable: false,
+	    configurable: true
 	  }
-	}
+	});
 
-	semver$2 = SemVer;
-	return semver$2;
-}
+	Object.defineProperties(WebSocket, {
+	  CONNECTING: staticPropertyDescriptors,
+	  OPEN: staticPropertyDescriptors,
+	  CLOSING: staticPropertyDescriptors,
+	  CLOSED: staticPropertyDescriptors
+	});
 
-var parse_1;
-var hasRequiredParse;
+	webidl.converters['sequence'] = webidl.sequenceConverter(
+	  webidl.converters.DOMString
+	);
 
-function requireParse () {
-	if (hasRequiredParse) return parse_1;
-	hasRequiredParse = 1;
+	webidl.converters['DOMString or sequence'] = function (V, prefix, argument) {
+	  if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) {
+	    return webidl.converters['sequence'](V)
+	  }
 
-	const SemVer = requireSemver$2();
-	const parse = (version, options, throwErrors = false) => {
-	  if (version instanceof SemVer) {
-	    return version
+	  return webidl.converters.DOMString(V, prefix, argument)
+	};
+
+	// This implements the proposal made in https://github.com/whatwg/websockets/issues/42
+	webidl.converters.WebSocketInit = webidl.dictionaryConverter([
+	  {
+	    key: 'protocols',
+	    converter: webidl.converters['DOMString or sequence'],
+	    defaultValue: () => new Array(0)
+	  },
+	  {
+	    key: 'dispatcher',
+	    converter: webidl.converters.any,
+	    defaultValue: () => getGlobalDispatcher()
+	  },
+	  {
+	    key: 'headers',
+	    converter: webidl.nullableConverter(webidl.converters.HeadersInit)
 	  }
-	  try {
-	    return new SemVer(version, options)
-	  } catch (er) {
-	    if (!throwErrors) {
-	      return null
-	    }
-	    throw er
+	]);
+
+	webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {
+	  if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) {
+	    return webidl.converters.WebSocketInit(V)
 	  }
-	};
 
-	parse_1 = parse;
-	return parse_1;
-}
+	  return { protocols: webidl.converters['DOMString or sequence'](V) }
+	};
 
-var valid_1;
-var hasRequiredValid$1;
+	webidl.converters.WebSocketSendData = function (V) {
+	  if (webidl.util.Type(V) === 'Object') {
+	    if (isBlobLike(V)) {
+	      return webidl.converters.Blob(V, { strict: false })
+	    }
 
-function requireValid$1 () {
-	if (hasRequiredValid$1) return valid_1;
-	hasRequiredValid$1 = 1;
+	    if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) {
+	      return webidl.converters.BufferSource(V)
+	    }
+	  }
 
-	const parse = requireParse();
-	const valid = (version, options) => {
-	  const v = parse(version, options);
-	  return v ? v.version : null
+	  return webidl.converters.USVString(V)
 	};
-	valid_1 = valid;
-	return valid_1;
-}
 
-var clean_1;
-var hasRequiredClean;
+	function onParserDrain () {
+	  this.ws[kResponse].socket.resume();
+	}
 
-function requireClean () {
-	if (hasRequiredClean) return clean_1;
-	hasRequiredClean = 1;
+	function onParserError (err) {
+	  let message;
+	  let code;
 
-	const parse = requireParse();
-	const clean = (version, options) => {
-	  const s = parse(version.trim().replace(/^[=v]+/, ''), options);
-	  return s ? s.version : null
+	  if (err instanceof CloseEvent) {
+	    message = err.reason;
+	    code = err.code;
+	  } else {
+	    message = err.message;
+	  }
+
+	  fireEvent('error', this, () => new ErrorEvent('error', { error: err, message }));
+
+	  closeWebSocketConnection(this, code);
+	}
+
+	websocket = {
+	  WebSocket
 	};
-	clean_1 = clean;
-	return clean_1;
+	return websocket;
 }
 
-var inc_1;
-var hasRequiredInc;
+var util;
+var hasRequiredUtil;
 
-function requireInc () {
-	if (hasRequiredInc) return inc_1;
-	hasRequiredInc = 1;
+function requireUtil () {
+	if (hasRequiredUtil) return util;
+	hasRequiredUtil = 1;
 
-	const SemVer = requireSemver$2();
+	/**
+	 * Checks if the given value is a valid LastEventId.
+	 * @param {string} value
+	 * @returns {boolean}
+	 */
+	function isValidLastEventId (value) {
+	  // LastEventId should not contain U+0000 NULL
+	  return value.indexOf('\u0000') === -1
+	}
 
-	const inc = (version, release, options, identifier, identifierBase) => {
-	  if (typeof (options) === 'string') {
-	    identifierBase = identifier;
-	    identifier = options;
-	    options = undefined;
+	/**
+	 * Checks if the given value is a base 10 digit.
+	 * @param {string} value
+	 * @returns {boolean}
+	 */
+	function isASCIINumber (value) {
+	  if (value.length === 0) return false
+	  for (let i = 0; i < value.length; i++) {
+	    if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false
 	  }
+	  return true
+	}
 
-	  try {
-	    return new SemVer(
-	      version instanceof SemVer ? version.version : version,
-	      options
-	    ).inc(release, identifier, identifierBase).version
-	  } catch (er) {
-	    return null
-	  }
+	// https://github.com/nodejs/undici/issues/2664
+	function delay (ms) {
+	  return new Promise((resolve) => {
+	    setTimeout(resolve, ms).unref();
+	  })
+	}
+
+	util = {
+	  isValidLastEventId,
+	  isASCIINumber,
+	  delay
 	};
-	inc_1 = inc;
-	return inc_1;
+	return util;
 }
 
-var diff_1;
-var hasRequiredDiff;
+var eventsourceStream;
+var hasRequiredEventsourceStream;
 
-function requireDiff () {
-	if (hasRequiredDiff) return diff_1;
-	hasRequiredDiff = 1;
+function requireEventsourceStream () {
+	if (hasRequiredEventsourceStream) return eventsourceStream;
+	hasRequiredEventsourceStream = 1;
+	const { Transform } = require$$0$8;
+	const { isASCIINumber, isValidLastEventId } = requireUtil();
 
-	const parse = requireParse();
+	/**
+	 * @type {number[]} BOM
+	 */
+	const BOM = [0xEF, 0xBB, 0xBF];
+	/**
+	 * @type {10} LF
+	 */
+	const LF = 0x0A;
+	/**
+	 * @type {13} CR
+	 */
+	const CR = 0x0D;
+	/**
+	 * @type {58} COLON
+	 */
+	const COLON = 0x3A;
+	/**
+	 * @type {32} SPACE
+	 */
+	const SPACE = 0x20;
 
-	const diff = (version1, version2) => {
-	  const v1 = parse(version1, null, true);
-	  const v2 = parse(version2, null, true);
-	  const comparison = v1.compare(v2);
+	/**
+	 * @typedef {object} EventSourceStreamEvent
+	 * @type {object}
+	 * @property {string} [event] The event type.
+	 * @property {string} [data] The data of the message.
+	 * @property {string} [id] A unique ID for the event.
+	 * @property {string} [retry] The reconnection time, in milliseconds.
+	 */
 
-	  if (comparison === 0) {
-	    return null
+	/**
+	 * @typedef eventSourceSettings
+	 * @type {object}
+	 * @property {string} lastEventId The last event ID received from the server.
+	 * @property {string} origin The origin of the event source.
+	 * @property {number} reconnectionTime The reconnection time, in milliseconds.
+	 */
+
+	class EventSourceStream extends Transform {
+	  /**
+	   * @type {eventSourceSettings}
+	   */
+	  state = null
+
+	  /**
+	   * Leading byte-order-mark check.
+	   * @type {boolean}
+	   */
+	  checkBOM = true
+
+	  /**
+	   * @type {boolean}
+	   */
+	  crlfCheck = false
+
+	  /**
+	   * @type {boolean}
+	   */
+	  eventEndCheck = false
+
+	  /**
+	   * @type {Buffer}
+	   */
+	  buffer = null
+
+	  pos = 0
+
+	  event = {
+	    data: undefined,
+	    event: undefined,
+	    id: undefined,
+	    retry: undefined
 	  }
 
-	  const v1Higher = comparison > 0;
-	  const highVersion = v1Higher ? v1 : v2;
-	  const lowVersion = v1Higher ? v2 : v1;
-	  const highHasPre = !!highVersion.prerelease.length;
-	  const lowHasPre = !!lowVersion.prerelease.length;
+	  /**
+	   * @param {object} options
+	   * @param {eventSourceSettings} options.eventSourceSettings
+	   * @param {Function} [options.push]
+	   */
+	  constructor (options = {}) {
+	    // Enable object mode as EventSourceStream emits objects of shape
+	    // EventSourceStreamEvent
+	    options.readableObjectMode = true;
 
-	  if (lowHasPre && !highHasPre) {
-	    // Going from prerelease -> no prerelease requires some special casing
+	    super(options);
 
-	    // If the low version has only a major, then it will always be a major
-	    // Some examples:
-	    // 1.0.0-1 -> 1.0.0
-	    // 1.0.0-1 -> 1.1.1
-	    // 1.0.0-1 -> 2.0.0
-	    if (!lowVersion.patch && !lowVersion.minor) {
-	      return 'major'
+	    this.state = options.eventSourceSettings || {};
+	    if (options.push) {
+	      this.push = options.push;
 	    }
+	  }
 
-	    // If the main part has no difference
-	    if (lowVersion.compareMain(highVersion) === 0) {
-	      if (lowVersion.minor && !lowVersion.patch) {
-	        return 'minor'
-	      }
-	      return 'patch'
+	  /**
+	   * @param {Buffer} chunk
+	   * @param {string} _encoding
+	   * @param {Function} callback
+	   * @returns {void}
+	   */
+	  _transform (chunk, _encoding, callback) {
+	    if (chunk.length === 0) {
+	      callback();
+	      return
 	    }
-	  }
 
-	  // add the `pre` prefix if we are going to a prerelease version
-	  const prefix = highHasPre ? 'pre' : '';
+	    // Cache the chunk in the buffer, as the data might not be complete while
+	    // processing it
+	    // TODO: Investigate if there is a more performant way to handle
+	    // incoming chunks
+	    // see: https://github.com/nodejs/undici/issues/2630
+	    if (this.buffer) {
+	      this.buffer = Buffer.concat([this.buffer, chunk]);
+	    } else {
+	      this.buffer = chunk;
+	    }
 
-	  if (v1.major !== v2.major) {
-	    return prefix + 'major'
-	  }
+	    // Strip leading byte-order-mark if we opened the stream and started
+	    // the processing of the incoming data
+	    if (this.checkBOM) {
+	      switch (this.buffer.length) {
+	        case 1:
+	          // Check if the first byte is the same as the first byte of the BOM
+	          if (this.buffer[0] === BOM[0]) {
+	            // If it is, we need to wait for more data
+	            callback();
+	            return
+	          }
+	          // Set the checkBOM flag to false as we don't need to check for the
+	          // BOM anymore
+	          this.checkBOM = false;
 
-	  if (v1.minor !== v2.minor) {
-	    return prefix + 'minor'
-	  }
+	          // The buffer only contains one byte so we need to wait for more data
+	          callback();
+	          return
+	        case 2:
+	          // Check if the first two bytes are the same as the first two bytes
+	          // of the BOM
+	          if (
+	            this.buffer[0] === BOM[0] &&
+	            this.buffer[1] === BOM[1]
+	          ) {
+	            // If it is, we need to wait for more data, because the third byte
+	            // is needed to determine if it is the BOM or not
+	            callback();
+	            return
+	          }
 
-	  if (v1.patch !== v2.patch) {
-	    return prefix + 'patch'
-	  }
+	          // Set the checkBOM flag to false as we don't need to check for the
+	          // BOM anymore
+	          this.checkBOM = false;
+	          break
+	        case 3:
+	          // Check if the first three bytes are the same as the first three
+	          // bytes of the BOM
+	          if (
+	            this.buffer[0] === BOM[0] &&
+	            this.buffer[1] === BOM[1] &&
+	            this.buffer[2] === BOM[2]
+	          ) {
+	            // If it is, we can drop the buffered data, as it is only the BOM
+	            this.buffer = Buffer.alloc(0);
+	            // Set the checkBOM flag to false as we don't need to check for the
+	            // BOM anymore
+	            this.checkBOM = false;
 
-	  // high and low are preleases
-	  return 'prerelease'
-	};
+	            // Await more data
+	            callback();
+	            return
+	          }
+	          // If it is not the BOM, we can start processing the data
+	          this.checkBOM = false;
+	          break
+	        default:
+	          // The buffer is longer than 3 bytes, so we can drop the BOM if it is
+	          // present
+	          if (
+	            this.buffer[0] === BOM[0] &&
+	            this.buffer[1] === BOM[1] &&
+	            this.buffer[2] === BOM[2]
+	          ) {
+	            // Remove the BOM from the buffer
+	            this.buffer = this.buffer.subarray(3);
+	          }
 
-	diff_1 = diff;
-	return diff_1;
-}
+	          // Set the checkBOM flag to false as we don't need to check for the
+	          this.checkBOM = false;
+	          break
+	      }
+	    }
 
-var major_1;
-var hasRequiredMajor;
+	    while (this.pos < this.buffer.length) {
+	      // If the previous line ended with an end-of-line, we need to check
+	      // if the next character is also an end-of-line.
+	      if (this.eventEndCheck) {
+	        // If the the current character is an end-of-line, then the event
+	        // is finished and we can process it
+
+	        // If the previous line ended with a carriage return, we need to
+	        // check if the current character is a line feed and remove it
+	        // from the buffer.
+	        if (this.crlfCheck) {
+	          // If the current character is a line feed, we can remove it
+	          // from the buffer and reset the crlfCheck flag
+	          if (this.buffer[this.pos] === LF) {
+	            this.buffer = this.buffer.subarray(this.pos + 1);
+	            this.pos = 0;
+	            this.crlfCheck = false;
+
+	            // It is possible that the line feed is not the end of the
+	            // event. We need to check if the next character is an
+	            // end-of-line character to determine if the event is
+	            // finished. We simply continue the loop to check the next
+	            // character.
+
+	            // As we removed the line feed from the buffer and set the
+	            // crlfCheck flag to false, we basically don't make any
+	            // distinction between a line feed and a carriage return.
+	            continue
+	          }
+	          this.crlfCheck = false;
+	        }
 
-function requireMajor () {
-	if (hasRequiredMajor) return major_1;
-	hasRequiredMajor = 1;
+	        if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {
+	          // If the current character is a carriage return, we need to
+	          // set the crlfCheck flag to true, as we need to check if the
+	          // next character is a line feed so we can remove it from the
+	          // buffer
+	          if (this.buffer[this.pos] === CR) {
+	            this.crlfCheck = true;
+	          }
 
-	const SemVer = requireSemver$2();
-	const major = (a, loose) => new SemVer(a, loose).major;
-	major_1 = major;
-	return major_1;
-}
+	          this.buffer = this.buffer.subarray(this.pos + 1);
+	          this.pos = 0;
+	          if (
+	            this.event.data !== undefined || this.event.event || this.event.id || this.event.retry) {
+	            this.processEvent(this.event);
+	          }
+	          this.clearEvent();
+	          continue
+	        }
+	        // If the current character is not an end-of-line, then the event
+	        // is not finished and we have to reset the eventEndCheck flag
+	        this.eventEndCheck = false;
+	        continue
+	      }
 
-var minor_1;
-var hasRequiredMinor;
+	      // If the current character is an end-of-line, we can process the
+	      // line
+	      if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) {
+	        // If the current character is a carriage return, we need to
+	        // set the crlfCheck flag to true, as we need to check if the
+	        // next character is a line feed
+	        if (this.buffer[this.pos] === CR) {
+	          this.crlfCheck = true;
+	        }
+
+	        // In any case, we can process the line as we reached an
+	        // end-of-line character
+	        this.parseLine(this.buffer.subarray(0, this.pos), this.event);
+
+	        // Remove the processed line from the buffer
+	        this.buffer = this.buffer.subarray(this.pos + 1);
+	        // Reset the position as we removed the processed line from the buffer
+	        this.pos = 0;
+	        // A line was processed and this could be the end of the event. We need
+	        // to check if the next line is empty to determine if the event is
+	        // finished.
+	        this.eventEndCheck = true;
+	        continue
+	      }
 
-function requireMinor () {
-	if (hasRequiredMinor) return minor_1;
-	hasRequiredMinor = 1;
+	      this.pos++;
+	    }
 
-	const SemVer = requireSemver$2();
-	const minor = (a, loose) => new SemVer(a, loose).minor;
-	minor_1 = minor;
-	return minor_1;
-}
+	    callback();
+	  }
 
-var patch_1;
-var hasRequiredPatch;
+	  /**
+	   * @param {Buffer} line
+	   * @param {EventStreamEvent} event
+	   */
+	  parseLine (line, event) {
+	    // If the line is empty (a blank line)
+	    // Dispatch the event, as defined below.
+	    // This will be handled in the _transform method
+	    if (line.length === 0) {
+	      return
+	    }
 
-function requirePatch () {
-	if (hasRequiredPatch) return patch_1;
-	hasRequiredPatch = 1;
+	    // If the line starts with a U+003A COLON character (:)
+	    // Ignore the line.
+	    const colonPosition = line.indexOf(COLON);
+	    if (colonPosition === 0) {
+	      return
+	    }
 
-	const SemVer = requireSemver$2();
-	const patch = (a, loose) => new SemVer(a, loose).patch;
-	patch_1 = patch;
-	return patch_1;
-}
+	    let field = '';
+	    let value = '';
+
+	    // If the line contains a U+003A COLON character (:)
+	    if (colonPosition !== -1) {
+	      // Collect the characters on the line before the first U+003A COLON
+	      // character (:), and let field be that string.
+	      // TODO: Investigate if there is a more performant way to extract the
+	      // field
+	      // see: https://github.com/nodejs/undici/issues/2630
+	      field = line.subarray(0, colonPosition).toString('utf8');
+
+	      // Collect the characters on the line after the first U+003A COLON
+	      // character (:), and let value be that string.
+	      // If value starts with a U+0020 SPACE character, remove it from value.
+	      let valueStart = colonPosition + 1;
+	      if (line[valueStart] === SPACE) {
+	        ++valueStart;
+	      }
+	      // TODO: Investigate if there is a more performant way to extract the
+	      // value
+	      // see: https://github.com/nodejs/undici/issues/2630
+	      value = line.subarray(valueStart).toString('utf8');
 
-var prerelease_1;
-var hasRequiredPrerelease;
+	      // Otherwise, the string is not empty but does not contain a U+003A COLON
+	      // character (:)
+	    } else {
+	      // Process the field using the steps described below, using the whole
+	      // line as the field name, and the empty string as the field value.
+	      field = line.toString('utf8');
+	      value = '';
+	    }
+
+	    // Modify the event with the field name and value. The value is also
+	    // decoded as UTF-8
+	    switch (field) {
+	      case 'data':
+	        if (event[field] === undefined) {
+	          event[field] = value;
+	        } else {
+	          event[field] += `\n${value}`;
+	        }
+	        break
+	      case 'retry':
+	        if (isASCIINumber(value)) {
+	          event[field] = value;
+	        }
+	        break
+	      case 'id':
+	        if (isValidLastEventId(value)) {
+	          event[field] = value;
+	        }
+	        break
+	      case 'event':
+	        if (value.length > 0) {
+	          event[field] = value;
+	        }
+	        break
+	    }
+	  }
 
-function requirePrerelease () {
-	if (hasRequiredPrerelease) return prerelease_1;
-	hasRequiredPrerelease = 1;
+	  /**
+	   * @param {EventSourceStreamEvent} event
+	   */
+	  processEvent (event) {
+	    if (event.retry && isASCIINumber(event.retry)) {
+	      this.state.reconnectionTime = parseInt(event.retry, 10);
+	    }
 
-	const parse = requireParse();
-	const prerelease = (version, options) => {
-	  const parsed = parse(version, options);
-	  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
+	    if (event.id && isValidLastEventId(event.id)) {
+	      this.state.lastEventId = event.id;
+	    }
+
+	    // only dispatch event, when data is provided
+	    if (event.data !== undefined) {
+	      this.push({
+	        type: event.event || 'message',
+	        options: {
+	          data: event.data,
+	          lastEventId: this.state.lastEventId,
+	          origin: this.state.origin
+	        }
+	      });
+	    }
+	  }
+
+	  clearEvent () {
+	    this.event = {
+	      data: undefined,
+	      event: undefined,
+	      id: undefined,
+	      retry: undefined
+	    };
+	  }
+	}
+
+	eventsourceStream = {
+	  EventSourceStream
 	};
-	prerelease_1 = prerelease;
-	return prerelease_1;
+	return eventsourceStream;
 }
 
-var compare_1;
-var hasRequiredCompare;
+var eventsource;
+var hasRequiredEventsource;
 
-function requireCompare () {
-	if (hasRequiredCompare) return compare_1;
-	hasRequiredCompare = 1;
+function requireEventsource () {
+	if (hasRequiredEventsource) return eventsource;
+	hasRequiredEventsource = 1;
 
-	const SemVer = requireSemver$2();
-	const compare = (a, b, loose) =>
-	  new SemVer(a, loose).compare(new SemVer(b, loose));
+	const { pipeline } = require$$0$8;
+	const { fetching } = requireFetch();
+	const { makeRequest } = requireRequest();
+	const { webidl } = requireWebidl();
+	const { EventSourceStream } = requireEventsourceStream();
+	const { parseMIMEType } = requireDataUrl();
+	const { createFastMessageEvent } = requireEvents();
+	const { isNetworkError } = requireResponse();
+	const { delay } = requireUtil();
+	const { kEnumerableProperty } = requireUtil$7();
+	const { environmentSettingsObject } = requireUtil$6();
 
-	compare_1 = compare;
-	return compare_1;
-}
+	let experimentalWarned = false;
 
-var rcompare_1;
-var hasRequiredRcompare;
+	/**
+	 * A reconnection time, in milliseconds. This must initially be an implementation-defined value,
+	 * probably in the region of a few seconds.
+	 *
+	 * In Comparison:
+	 * - Chrome uses 3000ms.
+	 * - Deno uses 5000ms.
+	 *
+	 * @type {3000}
+	 */
+	const defaultReconnectionTime = 3000;
 
-function requireRcompare () {
-	if (hasRequiredRcompare) return rcompare_1;
-	hasRequiredRcompare = 1;
+	/**
+	 * The readyState attribute represents the state of the connection.
+	 * @enum
+	 * @readonly
+	 * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev
+	 */
 
-	const compare = requireCompare();
-	const rcompare = (a, b, loose) => compare(b, a, loose);
-	rcompare_1 = rcompare;
-	return rcompare_1;
-}
+	/**
+	 * The connection has not yet been established, or it was closed and the user
+	 * agent is reconnecting.
+	 * @type {0}
+	 */
+	const CONNECTING = 0;
 
-var compareLoose_1;
-var hasRequiredCompareLoose;
+	/**
+	 * The user agent has an open connection and is dispatching events as it
+	 * receives them.
+	 * @type {1}
+	 */
+	const OPEN = 1;
 
-function requireCompareLoose () {
-	if (hasRequiredCompareLoose) return compareLoose_1;
-	hasRequiredCompareLoose = 1;
+	/**
+	 * The connection is not open, and the user agent is not trying to reconnect.
+	 * @type {2}
+	 */
+	const CLOSED = 2;
 
-	const compare = requireCompare();
-	const compareLoose = (a, b) => compare(a, b, true);
-	compareLoose_1 = compareLoose;
-	return compareLoose_1;
-}
+	/**
+	 * Requests for the element will have their mode set to "cors" and their credentials mode set to "same-origin".
+	 * @type {'anonymous'}
+	 */
+	const ANONYMOUS = 'anonymous';
 
-var compareBuild_1;
-var hasRequiredCompareBuild;
+	/**
+	 * Requests for the element will have their mode set to "cors" and their credentials mode set to "include".
+	 * @type {'use-credentials'}
+	 */
+	const USE_CREDENTIALS = 'use-credentials';
 
-function requireCompareBuild () {
-	if (hasRequiredCompareBuild) return compareBuild_1;
-	hasRequiredCompareBuild = 1;
+	/**
+	 * The EventSource interface is used to receive server-sent events. It
+	 * connects to a server over HTTP and receives events in text/event-stream
+	 * format without closing the connection.
+	 * @extends {EventTarget}
+	 * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events
+	 * @api public
+	 */
+	class EventSource extends EventTarget {
+	  #events = {
+	    open: null,
+	    error: null,
+	    message: null
+	  }
 
-	const SemVer = requireSemver$2();
-	const compareBuild = (a, b, loose) => {
-	  const versionA = new SemVer(a, loose);
-	  const versionB = new SemVer(b, loose);
-	  return versionA.compare(versionB) || versionA.compareBuild(versionB)
-	};
-	compareBuild_1 = compareBuild;
-	return compareBuild_1;
-}
+	  #url = null
+	  #withCredentials = false
 
-var sort_1;
-var hasRequiredSort;
+	  #readyState = CONNECTING
 
-function requireSort () {
-	if (hasRequiredSort) return sort_1;
-	hasRequiredSort = 1;
+	  #request = null
+	  #controller = null
 
-	const compareBuild = requireCompareBuild();
-	const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
-	sort_1 = sort;
-	return sort_1;
-}
+	  #dispatcher
 
-var rsort_1;
-var hasRequiredRsort;
+	  /**
+	   * @type {import('./eventsource-stream').eventSourceSettings}
+	   */
+	  #state
 
-function requireRsort () {
-	if (hasRequiredRsort) return rsort_1;
-	hasRequiredRsort = 1;
+	  /**
+	   * Creates a new EventSource object.
+	   * @param {string} url
+	   * @param {EventSourceInit} [eventSourceInitDict]
+	   * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface
+	   */
+	  constructor (url, eventSourceInitDict = {}) {
+	    // 1. Let ev be a new EventSource object.
+	    super();
 
-	const compareBuild = requireCompareBuild();
-	const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
-	rsort_1 = rsort;
-	return rsort_1;
-}
+	    webidl.util.markAsUncloneable(this);
 
-var gt_1;
-var hasRequiredGt;
+	    const prefix = 'EventSource constructor';
+	    webidl.argumentLengthCheck(arguments, 1, prefix);
 
-function requireGt () {
-	if (hasRequiredGt) return gt_1;
-	hasRequiredGt = 1;
+	    if (!experimentalWarned) {
+	      experimentalWarned = true;
+	      process.emitWarning('EventSource is experimental, expect them to change at any time.', {
+	        code: 'UNDICI-ES'
+	      });
+	    }
 
-	const compare = requireCompare();
-	const gt = (a, b, loose) => compare(a, b, loose) > 0;
-	gt_1 = gt;
-	return gt_1;
-}
+	    url = webidl.converters.USVString(url, prefix, 'url');
+	    eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict');
 
-var lt_1;
-var hasRequiredLt;
+	    this.#dispatcher = eventSourceInitDict.dispatcher;
+	    this.#state = {
+	      lastEventId: '',
+	      reconnectionTime: defaultReconnectionTime
+	    };
 
-function requireLt () {
-	if (hasRequiredLt) return lt_1;
-	hasRequiredLt = 1;
+	    // 2. Let settings be ev's relevant settings object.
+	    // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object
+	    const settings = environmentSettingsObject;
 
-	const compare = requireCompare();
-	const lt = (a, b, loose) => compare(a, b, loose) < 0;
-	lt_1 = lt;
-	return lt_1;
-}
+	    let urlRecord;
 
-var eq_1;
-var hasRequiredEq;
+	    try {
+	      // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings.
+	      urlRecord = new URL(url, settings.settingsObject.baseUrl);
+	      this.#state.origin = urlRecord.origin;
+	    } catch (e) {
+	      // 4. If urlRecord is failure, then throw a "SyntaxError" DOMException.
+	      throw new DOMException(e, 'SyntaxError')
+	    }
 
-function requireEq () {
-	if (hasRequiredEq) return eq_1;
-	hasRequiredEq = 1;
+	    // 5. Set ev's url to urlRecord.
+	    this.#url = urlRecord.href;
 
-	const compare = requireCompare();
-	const eq = (a, b, loose) => compare(a, b, loose) === 0;
-	eq_1 = eq;
-	return eq_1;
-}
+	    // 6. Let corsAttributeState be Anonymous.
+	    let corsAttributeState = ANONYMOUS;
+
+	    // 7. If the value of eventSourceInitDict's withCredentials member is true,
+	    // then set corsAttributeState to Use Credentials and set ev's
+	    // withCredentials attribute to true.
+	    if (eventSourceInitDict.withCredentials) {
+	      corsAttributeState = USE_CREDENTIALS;
+	      this.#withCredentials = true;
+	    }
+
+	    // 8. Let request be the result of creating a potential-CORS request given
+	    // urlRecord, the empty string, and corsAttributeState.
+	    const initRequest = {
+	      redirect: 'follow',
+	      keepalive: true,
+	      // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes
+	      mode: 'cors',
+	      credentials: corsAttributeState === 'anonymous'
+	        ? 'same-origin'
+	        : 'omit',
+	      referrer: 'no-referrer'
+	    };
 
-var neq_1;
-var hasRequiredNeq;
+	    // 9. Set request's client to settings.
+	    initRequest.client = environmentSettingsObject.settingsObject;
 
-function requireNeq () {
-	if (hasRequiredNeq) return neq_1;
-	hasRequiredNeq = 1;
+	    // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list.
+	    initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]];
 
-	const compare = requireCompare();
-	const neq = (a, b, loose) => compare(a, b, loose) !== 0;
-	neq_1 = neq;
-	return neq_1;
-}
+	    // 11. Set request's cache mode to "no-store".
+	    initRequest.cache = 'no-store';
 
-var gte_1;
-var hasRequiredGte;
+	    // 12. Set request's initiator type to "other".
+	    initRequest.initiator = 'other';
 
-function requireGte () {
-	if (hasRequiredGte) return gte_1;
-	hasRequiredGte = 1;
+	    initRequest.urlList = [new URL(this.#url)];
 
-	const compare = requireCompare();
-	const gte = (a, b, loose) => compare(a, b, loose) >= 0;
-	gte_1 = gte;
-	return gte_1;
-}
+	    // 13. Set ev's request to request.
+	    this.#request = makeRequest(initRequest);
 
-var lte_1;
-var hasRequiredLte;
+	    this.#connect();
+	  }
 
-function requireLte () {
-	if (hasRequiredLte) return lte_1;
-	hasRequiredLte = 1;
+	  /**
+	   * Returns the state of this EventSource object's connection. It can have the
+	   * values described below.
+	   * @returns {0|1|2}
+	   * @readonly
+	   */
+	  get readyState () {
+	    return this.#readyState
+	  }
 
-	const compare = requireCompare();
-	const lte = (a, b, loose) => compare(a, b, loose) <= 0;
-	lte_1 = lte;
-	return lte_1;
-}
+	  /**
+	   * Returns the URL providing the event stream.
+	   * @readonly
+	   * @returns {string}
+	   */
+	  get url () {
+	    return this.#url
+	  }
 
-var cmp_1;
-var hasRequiredCmp;
+	  /**
+	   * Returns a boolean indicating whether the EventSource object was
+	   * instantiated with CORS credentials set (true), or not (false, the default).
+	   */
+	  get withCredentials () {
+	    return this.#withCredentials
+	  }
 
-function requireCmp () {
-	if (hasRequiredCmp) return cmp_1;
-	hasRequiredCmp = 1;
+	  #connect () {
+	    if (this.#readyState === CLOSED) return
 
-	const eq = requireEq();
-	const neq = requireNeq();
-	const gt = requireGt();
-	const gte = requireGte();
-	const lt = requireLt();
-	const lte = requireLte();
+	    this.#readyState = CONNECTING;
 
-	const cmp = (a, op, b, loose) => {
-	  switch (op) {
-	    case '===':
-	      if (typeof a === 'object') {
-	        a = a.version;
-	      }
-	      if (typeof b === 'object') {
-	        b = b.version;
-	      }
-	      return a === b
+	    const fetchParams = {
+	      request: this.#request,
+	      dispatcher: this.#dispatcher
+	    };
 
-	    case '!==':
-	      if (typeof a === 'object') {
-	        a = a.version;
+	    // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.
+	    const processEventSourceEndOfBody = (response) => {
+	      if (isNetworkError(response)) {
+	        this.dispatchEvent(new Event('error'));
+	        this.close();
 	      }
-	      if (typeof b === 'object') {
-	        b = b.version;
+
+	      this.#reconnect();
+	    };
+
+	    // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody...
+	    fetchParams.processResponseEndOfBody = processEventSourceEndOfBody;
+
+	    // and processResponse set to the following steps given response res:
+	    fetchParams.processResponse = (response) => {
+	      // 1. If res is an aborted network error, then fail the connection.
+
+	      if (isNetworkError(response)) {
+	        // 1. When a user agent is to fail the connection, the user agent
+	        // must queue a task which, if the readyState attribute is set to a
+	        // value other than CLOSED, sets the readyState attribute to CLOSED
+	        // and fires an event named error at the EventSource object. Once the
+	        // user agent has failed the connection, it does not attempt to
+	        // reconnect.
+	        if (response.aborted) {
+	          this.close();
+	          this.dispatchEvent(new Event('error'));
+	          return
+	          // 2. Otherwise, if res is a network error, then reestablish the
+	          // connection, unless the user agent knows that to be futile, in
+	          // which case the user agent may fail the connection.
+	        } else {
+	          this.#reconnect();
+	          return
+	        }
 	      }
-	      return a !== b
 
-	    case '':
-	    case '=':
-	    case '==':
-	      return eq(a, b, loose)
+	      // 3. Otherwise, if res's status is not 200, or if res's `Content-Type`
+	      // is not `text/event-stream`, then fail the connection.
+	      const contentType = response.headersList.get('content-type', true);
+	      const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure';
+	      const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream';
+	      if (
+	        response.status !== 200 ||
+	        contentTypeValid === false
+	      ) {
+	        this.close();
+	        this.dispatchEvent(new Event('error'));
+	        return
+	      }
 
-	    case '!=':
-	      return neq(a, b, loose)
+	      // 4. Otherwise, announce the connection and interpret res's body
+	      // line by line.
 
-	    case '>':
-	      return gt(a, b, loose)
+	      // When a user agent is to announce the connection, the user agent
+	      // must queue a task which, if the readyState attribute is set to a
+	      // value other than CLOSED, sets the readyState attribute to OPEN
+	      // and fires an event named open at the EventSource object.
+	      // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model
+	      this.#readyState = OPEN;
+	      this.dispatchEvent(new Event('open'));
 
-	    case '>=':
-	      return gte(a, b, loose)
+	      // If redirected to a different origin, set the origin to the new origin.
+	      this.#state.origin = response.urlList[response.urlList.length - 1].origin;
 
-	    case '<':
-	      return lt(a, b, loose)
+	      const eventSourceStream = new EventSourceStream({
+	        eventSourceSettings: this.#state,
+	        push: (event) => {
+	          this.dispatchEvent(createFastMessageEvent(
+	            event.type,
+	            event.options
+	          ));
+	        }
+	      });
 
-	    case '<=':
-	      return lte(a, b, loose)
+	      pipeline(response.body.stream,
+	        eventSourceStream,
+	        (error) => {
+	          if (
+	            error?.aborted === false
+	          ) {
+	            this.close();
+	            this.dispatchEvent(new Event('error'));
+	          }
+	        });
+	    };
 
-	    default:
-	      throw new TypeError(`Invalid operator: ${op}`)
+	    this.#controller = fetching(fetchParams);
 	  }
-	};
-	cmp_1 = cmp;
-	return cmp_1;
-}
 
-var coerce_1;
-var hasRequiredCoerce;
+	  /**
+	   * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model
+	   * @returns {Promise}
+	   */
+	  async #reconnect () {
+	    // When a user agent is to reestablish the connection, the user agent must
+	    // run the following steps. These steps are run in parallel, not as part of
+	    // a task. (The tasks that it queues, of course, are run like normal tasks
+	    // and not themselves in parallel.)
 
-function requireCoerce () {
-	if (hasRequiredCoerce) return coerce_1;
-	hasRequiredCoerce = 1;
+	    // 1. Queue a task to run the following steps:
 
-	const SemVer = requireSemver$2();
-	const parse = requireParse();
-	const { safeRe: re, t } = requireRe();
+	    //   1. If the readyState attribute is set to CLOSED, abort the task.
+	    if (this.#readyState === CLOSED) return
 
-	const coerce = (version, options) => {
-	  if (version instanceof SemVer) {
-	    return version
+	    //   2. Set the readyState attribute to CONNECTING.
+	    this.#readyState = CONNECTING;
+
+	    //   3. Fire an event named error at the EventSource object.
+	    this.dispatchEvent(new Event('error'));
+
+	    // 2. Wait a delay equal to the reconnection time of the event source.
+	    await delay(this.#state.reconnectionTime);
+
+	    // 5. Queue a task to run the following steps:
+
+	    //   1. If the EventSource object's readyState attribute is not set to
+	    //      CONNECTING, then return.
+	    if (this.#readyState !== CONNECTING) return
+
+	    //   2. Let request be the EventSource object's request.
+	    //   3. If the EventSource object's last event ID string is not the empty
+	    //      string, then:
+	    //      1. Let lastEventIDValue be the EventSource object's last event ID
+	    //         string, encoded as UTF-8.
+	    //      2. Set (`Last-Event-ID`, lastEventIDValue) in request's header
+	    //         list.
+	    if (this.#state.lastEventId.length) {
+	      this.#request.headersList.set('last-event-id', this.#state.lastEventId, true);
+	    }
+
+	    //   4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
+	    this.#connect();
 	  }
 
-	  if (typeof version === 'number') {
-	    version = String(version);
+	  /**
+	   * Closes the connection, if any, and sets the readyState attribute to
+	   * CLOSED.
+	   */
+	  close () {
+	    webidl.brandCheck(this, EventSource);
+
+	    if (this.#readyState === CLOSED) return
+	    this.#readyState = CLOSED;
+	    this.#controller.abort();
+	    this.#request = null;
 	  }
 
-	  if (typeof version !== 'string') {
-	    return null
+	  get onopen () {
+	    return this.#events.open
 	  }
 
-	  options = options || {};
+	  set onopen (fn) {
+	    if (this.#events.open) {
+	      this.removeEventListener('open', this.#events.open);
+	    }
 
-	  let match = null;
-	  if (!options.rtl) {
-	    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
-	  } else {
-	    // Find the right-most coercible string that does not share
-	    // a terminus with a more left-ward coercible string.
-	    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
-	    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
-	    //
-	    // Walk through the string checking with a /g regexp
-	    // Manually set the index so as to pick up overlapping matches.
-	    // Stop when we get a match that ends at the string end, since no
-	    // coercible string can be more right-ward without the same terminus.
-	    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
-	    let next;
-	    while ((next = coerceRtlRegex.exec(version)) &&
-	        (!match || match.index + match[0].length !== version.length)
-	    ) {
-	      if (!match ||
-	            next.index + next[0].length !== match.index + match[0].length) {
-	        match = next;
-	      }
-	      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
+	    if (typeof fn === 'function') {
+	      this.#events.open = fn;
+	      this.addEventListener('open', fn);
+	    } else {
+	      this.#events.open = null;
 	    }
-	    // leave it in a clean state
-	    coerceRtlRegex.lastIndex = -1;
 	  }
 
-	  if (match === null) {
-	    return null
+	  get onmessage () {
+	    return this.#events.message
 	  }
 
-	  const major = match[2];
-	  const minor = match[3] || '0';
-	  const patch = match[4] || '0';
-	  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '';
-	  const build = options.includePrerelease && match[6] ? `+${match[6]}` : '';
-
-	  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
-	};
-	coerce_1 = coerce;
-	return coerce_1;
-}
-
-var lrucache;
-var hasRequiredLrucache;
+	  set onmessage (fn) {
+	    if (this.#events.message) {
+	      this.removeEventListener('message', this.#events.message);
+	    }
 
-function requireLrucache () {
-	if (hasRequiredLrucache) return lrucache;
-	hasRequiredLrucache = 1;
+	    if (typeof fn === 'function') {
+	      this.#events.message = fn;
+	      this.addEventListener('message', fn);
+	    } else {
+	      this.#events.message = null;
+	    }
+	  }
 
-	class LRUCache {
-	  constructor () {
-	    this.max = 1000;
-	    this.map = new Map();
+	  get onerror () {
+	    return this.#events.error
 	  }
 
-	  get (key) {
-	    const value = this.map.get(key);
-	    if (value === undefined) {
-	      return undefined
+	  set onerror (fn) {
+	    if (this.#events.error) {
+	      this.removeEventListener('error', this.#events.error);
+	    }
+
+	    if (typeof fn === 'function') {
+	      this.#events.error = fn;
+	      this.addEventListener('error', fn);
 	    } else {
-	      // Remove the key from the map and add it to the end
-	      this.map.delete(key);
-	      this.map.set(key, value);
-	      return value
+	      this.#events.error = null;
 	    }
 	  }
+	}
 
-	  delete (key) {
-	    return this.map.delete(key)
+	const constantsPropertyDescriptors = {
+	  CONNECTING: {
+	    __proto__: null,
+	    configurable: false,
+	    enumerable: true,
+	    value: CONNECTING,
+	    writable: false
+	  },
+	  OPEN: {
+	    __proto__: null,
+	    configurable: false,
+	    enumerable: true,
+	    value: OPEN,
+	    writable: false
+	  },
+	  CLOSED: {
+	    __proto__: null,
+	    configurable: false,
+	    enumerable: true,
+	    value: CLOSED,
+	    writable: false
 	  }
+	};
 
-	  set (key, value) {
-	    const deleted = this.delete(key);
-
-	    if (!deleted && value !== undefined) {
-	      // If cache is full, delete the least recently used item
-	      if (this.map.size >= this.max) {
-	        const firstKey = this.map.keys().next().value;
-	        this.delete(firstKey);
-	      }
+	Object.defineProperties(EventSource, constantsPropertyDescriptors);
+	Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors);
 
-	      this.map.set(key, value);
-	    }
+	Object.defineProperties(EventSource.prototype, {
+	  close: kEnumerableProperty,
+	  onerror: kEnumerableProperty,
+	  onmessage: kEnumerableProperty,
+	  onopen: kEnumerableProperty,
+	  readyState: kEnumerableProperty,
+	  url: kEnumerableProperty,
+	  withCredentials: kEnumerableProperty
+	});
 
-	    return this
+	webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([
+	  {
+	    key: 'withCredentials',
+	    converter: webidl.converters.boolean,
+	    defaultValue: () => false
+	  },
+	  {
+	    key: 'dispatcher', // undici only
+	    converter: webidl.converters.any
 	  }
-	}
+	]);
 
-	lrucache = LRUCache;
-	return lrucache;
+	eventsource = {
+	  EventSource,
+	  defaultReconnectionTime
+	};
+	return eventsource;
 }
 
-var range;
-var hasRequiredRange;
+var hasRequiredUndici;
 
-function requireRange () {
-	if (hasRequiredRange) return range;
-	hasRequiredRange = 1;
+function requireUndici () {
+	if (hasRequiredUndici) return undici;
+	hasRequiredUndici = 1;
 
-	const SPACE_CHARACTERS = /\s+/g;
+	const Client = requireClient();
+	const Dispatcher = requireDispatcher();
+	const Pool = requirePool();
+	const BalancedPool = requireBalancedPool();
+	const Agent = requireAgent();
+	const ProxyAgent = requireProxyAgent();
+	const EnvHttpProxyAgent = requireEnvHttpProxyAgent();
+	const RetryAgent = requireRetryAgent();
+	const errors = requireErrors();
+	const util = requireUtil$7();
+	const { InvalidArgumentError } = errors;
+	const api = requireApi();
+	const buildConnector = requireConnect();
+	const MockClient = requireMockClient();
+	const MockAgent = requireMockAgent();
+	const MockPool = requireMockPool();
+	const mockErrors = requireMockErrors();
+	const RetryHandler = requireRetryHandler();
+	const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal();
+	const DecoratorHandler = requireDecoratorHandler();
+	const RedirectHandler = requireRedirectHandler();
+	const createRedirectInterceptor = requireRedirectInterceptor();
 
-	// hoisted class for cyclic dependency
-	class Range {
-	  constructor (range, options) {
-	    options = parseOptions(options);
+	Object.assign(Dispatcher.prototype, api);
 
-	    if (range instanceof Range) {
-	      if (
-	        range.loose === !!options.loose &&
-	        range.includePrerelease === !!options.includePrerelease
-	      ) {
-	        return range
-	      } else {
-	        return new Range(range.raw, options)
-	      }
+	undici.Dispatcher = Dispatcher;
+	undici.Client = Client;
+	undici.Pool = Pool;
+	undici.BalancedPool = BalancedPool;
+	undici.Agent = Agent;
+	undici.ProxyAgent = ProxyAgent;
+	undici.EnvHttpProxyAgent = EnvHttpProxyAgent;
+	undici.RetryAgent = RetryAgent;
+	undici.RetryHandler = RetryHandler;
+
+	undici.DecoratorHandler = DecoratorHandler;
+	undici.RedirectHandler = RedirectHandler;
+	undici.createRedirectInterceptor = createRedirectInterceptor;
+	undici.interceptors = {
+	  redirect: requireRedirect(),
+	  retry: requireRetry(),
+	  dump: requireDump(),
+	  dns: requireDns()
+	};
+
+	undici.buildConnector = buildConnector;
+	undici.errors = errors;
+	undici.util = {
+	  parseHeaders: util.parseHeaders,
+	  headerNameToString: util.headerNameToString
+	};
+
+	function makeDispatcher (fn) {
+	  return (url, opts, handler) => {
+	    if (typeof opts === 'function') {
+	      handler = opts;
+	      opts = null;
 	    }
 
-	    if (range instanceof Comparator) {
-	      // just put it in the set and return
-	      this.raw = range.value;
-	      this.set = [[range]];
-	      this.formatted = undefined;
-	      return this
+	    if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) {
+	      throw new InvalidArgumentError('invalid url')
 	    }
 
-	    this.options = options;
-	    this.loose = !!options.loose;
-	    this.includePrerelease = !!options.includePrerelease;
+	    if (opts != null && typeof opts !== 'object') {
+	      throw new InvalidArgumentError('invalid opts')
+	    }
 
-	    // First reduce all whitespace as much as possible so we do not have to rely
-	    // on potentially slow regexes like \s*. This is then stored and used for
-	    // future error messages as well.
-	    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ');
+	    if (opts && opts.path != null) {
+	      if (typeof opts.path !== 'string') {
+	        throw new InvalidArgumentError('invalid opts.path')
+	      }
 
-	    // First, split on ||
-	    this.set = this.raw
-	      .split('||')
-	      // map the range to a 2d array of comparators
-	      .map(r => this.parseRange(r.trim()))
-	      // throw out any comparator lists that are empty
-	      // this generally means that it was not a valid range, which is allowed
-	      // in loose mode, but will still throw if the WHOLE range is invalid.
-	      .filter(c => c.length);
+	      let path = opts.path;
+	      if (!opts.path.startsWith('/')) {
+	        path = `/${path}`;
+	      }
 
-	    if (!this.set.length) {
-	      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
+	      url = new URL(util.parseOrigin(url).origin + path);
+	    } else {
+	      if (!opts) {
+	        opts = typeof url === 'object' ? url : {};
+	      }
+
+	      url = util.parseURL(url);
 	    }
 
-	    // if we have any that are not the null set, throw out null sets.
-	    if (this.set.length > 1) {
-	      // keep the first one, in case they're all null sets
-	      const first = this.set[0];
-	      this.set = this.set.filter(c => !isNullSet(c[0]));
-	      if (this.set.length === 0) {
-	        this.set = [first];
-	      } else if (this.set.length > 1) {
-	        // if we have any that are *, then the range is just *
-	        for (const c of this.set) {
-	          if (c.length === 1 && isAny(c[0])) {
-	            this.set = [c];
-	            break
-	          }
-	        }
-	      }
+	    const { agent, dispatcher = getGlobalDispatcher() } = opts;
+
+	    if (agent) {
+	      throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?')
 	    }
 
-	    this.formatted = undefined;
+	    return fn.call(dispatcher, {
+	      ...opts,
+	      origin: url.origin,
+	      path: url.search ? `${url.pathname}${url.search}` : url.pathname,
+	      method: opts.method || (opts.body ? 'PUT' : 'GET')
+	    }, handler)
 	  }
+	}
 
-	  get range () {
-	    if (this.formatted === undefined) {
-	      this.formatted = '';
-	      for (let i = 0; i < this.set.length; i++) {
-	        if (i > 0) {
-	          this.formatted += '||';
-	        }
-	        const comps = this.set[i];
-	        for (let k = 0; k < comps.length; k++) {
-	          if (k > 0) {
-	            this.formatted += ' ';
-	          }
-	          this.formatted += comps[k].toString().trim();
-	        }
-	      }
+	undici.setGlobalDispatcher = setGlobalDispatcher;
+	undici.getGlobalDispatcher = getGlobalDispatcher;
+
+	const fetchImpl = requireFetch().fetch;
+	undici.fetch = async function fetch (init, options = undefined) {
+	  try {
+	    return await fetchImpl(init, options)
+	  } catch (err) {
+	    if (err && typeof err === 'object') {
+	      Error.captureStackTrace(err);
 	    }
-	    return this.formatted
-	  }
 
-	  format () {
-	    return this.range
+	    throw err
 	  }
+	};
+	undici.Headers = requireHeaders().Headers;
+	undici.Response = requireResponse().Response;
+	undici.Request = requireRequest().Request;
+	undici.FormData = requireFormdata().FormData;
+	undici.File = globalThis.File ?? require$$0$6.File;
+	undici.FileReader = requireFilereader().FileReader;
 
-	  toString () {
-	    return this.range
-	  }
+	const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$1();
 
-	  parseRange (range) {
-	    // memoize range parsing for performance.
-	    // this is a very hot path, and fully deterministic.
-	    const memoOpts =
-	      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
-	      (this.options.loose && FLAG_LOOSE);
-	    const memoKey = memoOpts + ':' + range;
-	    const cached = cache.get(memoKey);
-	    if (cached) {
-	      return cached
-	    }
+	undici.setGlobalOrigin = setGlobalOrigin;
+	undici.getGlobalOrigin = getGlobalOrigin;
 
-	    const loose = this.options.loose;
-	    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
-	    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
-	    range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
-	    debug('hyphen replace', range);
+	const { CacheStorage } = requireCachestorage();
+	const { kConstruct } = requireSymbols$1();
 
-	    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
-	    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
-	    debug('comparator trim', range);
+	// Cache & CacheStorage are tightly coupled with fetch. Even if it may run
+	// in an older version of Node, it doesn't have any use without fetch.
+	undici.caches = new CacheStorage(kConstruct);
 
-	    // `~ 1.2.3` => `~1.2.3`
-	    range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
-	    debug('tilde trim', range);
+	const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies();
+
+	undici.deleteCookie = deleteCookie;
+	undici.getCookies = getCookies;
+	undici.getSetCookies = getSetCookies;
+	undici.setCookie = setCookie;
+
+	const { parseMIMEType, serializeAMimeType } = requireDataUrl();
+
+	undici.parseMIMEType = parseMIMEType;
+	undici.serializeAMimeType = serializeAMimeType;
+
+	const { CloseEvent, ErrorEvent, MessageEvent } = requireEvents();
+	undici.WebSocket = requireWebsocket().WebSocket;
+	undici.CloseEvent = CloseEvent;
+	undici.ErrorEvent = ErrorEvent;
+	undici.MessageEvent = MessageEvent;
+
+	undici.request = makeDispatcher(api.request);
+	undici.stream = makeDispatcher(api.stream);
+	undici.pipeline = makeDispatcher(api.pipeline);
+	undici.connect = makeDispatcher(api.connect);
+	undici.upgrade = makeDispatcher(api.upgrade);
+
+	undici.MockClient = MockClient;
+	undici.MockPool = MockPool;
+	undici.MockAgent = MockAgent;
+	undici.mockErrors = mockErrors;
+
+	const { EventSource } = requireEventsource();
+
+	undici.EventSource = EventSource;
+	return undici;
+}
+
+var undiciExports = requireUndici();
+
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+function getAuthString(token, options) {
+    if (!token && !options.auth) {
+        throw new Error('Parameter token or opts.auth is required');
+    }
+    else if (token && options.auth) {
+        throw new Error('Parameters token and opts.auth may not both be specified');
+    }
+    return typeof options.auth === 'string' ? options.auth : `token ${token}`;
+}
+function getProxyAgent(destinationUrl) {
+    const hc = new libExports.HttpClient();
+    return hc.getAgent(destinationUrl);
+}
+function getProxyAgentDispatcher(destinationUrl) {
+    const hc = new libExports.HttpClient();
+    return hc.getAgentDispatcher(destinationUrl);
+}
+function getProxyFetch(destinationUrl) {
+    const httpDispatcher = getProxyAgentDispatcher(destinationUrl);
+    const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () {
+        return undiciExports.fetch(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher }));
+    });
+    return proxyFetch;
+}
+function getApiBaseUrl() {
+    return process.env['GITHUB_API_URL'] || 'https://api.github.com';
+}
+
+function getUserAgent() {
+  if (typeof navigator === "object" && "userAgent" in navigator) {
+    return navigator.userAgent;
+  }
+
+  if (typeof process === "object" && process.version !== undefined) {
+    return `Node.js/${process.version.substr(1)} (${process.platform}; ${
+      process.arch
+    })`;
+  }
+
+  return "";
+}
+
+// @ts-check
+
+function register(state, name, method, options) {
+  if (typeof method !== "function") {
+    throw new Error("method for before hook must be a function");
+  }
+
+  if (!options) {
+    options = {};
+  }
+
+  if (Array.isArray(name)) {
+    return name.reverse().reduce((callback, name) => {
+      return register.bind(null, state, name, callback, options);
+    }, method)();
+  }
+
+  return Promise.resolve().then(() => {
+    if (!state.registry[name]) {
+      return method(options);
+    }
+
+    return state.registry[name].reduce((method, registered) => {
+      return registered.hook.bind(null, method, options);
+    }, method)();
+  });
+}
+
+// @ts-check
+
+function addHook(state, kind, name, hook) {
+  const orig = hook;
+  if (!state.registry[name]) {
+    state.registry[name] = [];
+  }
+
+  if (kind === "before") {
+    hook = (method, options) => {
+      return Promise.resolve()
+        .then(orig.bind(null, options))
+        .then(method.bind(null, options));
+    };
+  }
 
-	    // `^ 1.2.3` => `^1.2.3`
-	    range = range.replace(re[t.CARETTRIM], caretTrimReplace);
-	    debug('caret trim', range);
+  if (kind === "after") {
+    hook = (method, options) => {
+      let result;
+      return Promise.resolve()
+        .then(method.bind(null, options))
+        .then((result_) => {
+          result = result_;
+          return orig(result, options);
+        })
+        .then(() => {
+          return result;
+        });
+    };
+  }
 
-	    // At this point, the range is completely trimmed and
-	    // ready to be split into comparators.
+  if (kind === "error") {
+    hook = (method, options) => {
+      return Promise.resolve()
+        .then(method.bind(null, options))
+        .catch((error) => {
+          return orig(error, options);
+        });
+    };
+  }
 
-	    let rangeList = range
-	      .split(' ')
-	      .map(comp => parseComparator(comp, this.options))
-	      .join(' ')
-	      .split(/\s+/)
-	      // >=0.0.0 is equivalent to *
-	      .map(comp => replaceGTE0(comp, this.options));
+  state.registry[name].push({
+    hook: hook,
+    orig: orig,
+  });
+}
 
-	    if (loose) {
-	      // in loose mode, throw out any that are not valid comparators
-	      rangeList = rangeList.filter(comp => {
-	        debug('loose invalid filter', comp, this.options);
-	        return !!comp.match(re[t.COMPARATORLOOSE])
-	      });
-	    }
-	    debug('range list', rangeList);
+// @ts-check
 
-	    // if any comparators are the null set, then replace with JUST null set
-	    // if more than one comparator, remove any * comparators
-	    // also, don't include the same comparator more than once
-	    const rangeMap = new Map();
-	    const comparators = rangeList.map(comp => new Comparator(comp, this.options));
-	    for (const comp of comparators) {
-	      if (isNullSet(comp)) {
-	        return [comp]
-	      }
-	      rangeMap.set(comp.value, comp);
-	    }
-	    if (rangeMap.size > 1 && rangeMap.has('')) {
-	      rangeMap.delete('');
-	    }
+function removeHook(state, name, method) {
+  if (!state.registry[name]) {
+    return;
+  }
 
-	    const result = [...rangeMap.values()];
-	    cache.set(memoKey, result);
-	    return result
-	  }
+  const index = state.registry[name]
+    .map((registered) => {
+      return registered.orig;
+    })
+    .indexOf(method);
 
-	  intersects (range, options) {
-	    if (!(range instanceof Range)) {
-	      throw new TypeError('a Range is required')
-	    }
+  if (index === -1) {
+    return;
+  }
 
-	    return this.set.some((thisComparators) => {
-	      return (
-	        isSatisfiable(thisComparators, options) &&
-	        range.set.some((rangeComparators) => {
-	          return (
-	            isSatisfiable(rangeComparators, options) &&
-	            thisComparators.every((thisComparator) => {
-	              return rangeComparators.every((rangeComparator) => {
-	                return thisComparator.intersects(rangeComparator, options)
-	              })
-	            })
-	          )
-	        })
-	      )
-	    })
-	  }
+  state.registry[name].splice(index, 1);
+}
 
-	  // if ANY of the sets match ALL of its comparators, then pass
-	  test (version) {
-	    if (!version) {
-	      return false
-	    }
+// @ts-check
 
-	    if (typeof version === 'string') {
-	      try {
-	        version = new SemVer(version, this.options);
-	      } catch (er) {
-	        return false
-	      }
-	    }
 
-	    for (let i = 0; i < this.set.length; i++) {
-	      if (testSet(this.set[i], version, this.options)) {
-	        return true
-	      }
-	    }
-	    return false
-	  }
-	}
+// bind with array of arguments: https://stackoverflow.com/a/21792913
+const bind = Function.bind;
+const bindable = bind.bind(bind);
 
-	range = Range;
+function bindApi(hook, state, name) {
+  const removeHookRef = bindable(removeHook, null).apply(
+    null,
+    [state]
+  );
+  hook.api = { remove: removeHookRef };
+  hook.remove = removeHookRef;
+  ["before", "error", "after", "wrap"].forEach((kind) => {
+    const args = [state, kind];
+    hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);
+  });
+}
 
-	const LRU = requireLrucache();
-	const cache = new LRU();
+function Collection() {
+  const state = {
+    registry: {},
+  };
 
-	const parseOptions = requireParseOptions();
-	const Comparator = requireComparator();
-	const debug = requireDebug();
-	const SemVer = requireSemver$2();
-	const {
-	  safeRe: re,
-	  t,
-	  comparatorTrimReplace,
-	  tildeTrimReplace,
-	  caretTrimReplace,
-	} = requireRe();
-	const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants();
+  const hook = register.bind(null, state);
+  bindApi(hook, state);
 
-	const isNullSet = c => c.value === '<0.0.0-0';
-	const isAny = c => c.value === '';
+  return hook;
+}
 
-	// take a set of comparators and determine whether there
-	// exists a version which can satisfy it
-	const isSatisfiable = (comparators, options) => {
-	  let result = true;
-	  const remainingComparators = comparators.slice();
-	  let testComparator = remainingComparators.pop();
+var Hook = { Collection };
 
-	  while (result && remainingComparators.length) {
-	    result = remainingComparators.every((otherComparator) => {
-	      return testComparator.intersects(otherComparator, options)
-	    });
+// pkg/dist-src/defaults.js
 
-	    testComparator = remainingComparators.pop();
-	  }
+// pkg/dist-src/version.js
+var VERSION$5 = "0.0.0-development";
 
-	  return result
-	};
+// pkg/dist-src/defaults.js
+var userAgent = `octokit-endpoint.js/${VERSION$5} ${getUserAgent()}`;
+var DEFAULTS = {
+  method: "GET",
+  baseUrl: "https://api.github.com",
+  headers: {
+    accept: "application/vnd.github.v3+json",
+    "user-agent": userAgent
+  },
+  mediaType: {
+    format: ""
+  }
+};
 
-	// comprised of xranges, tildes, stars, and gtlt's at this point.
-	// already replaced the hyphen ranges
-	// turn into a set of JUST comparators.
-	const parseComparator = (comp, options) => {
-	  comp = comp.replace(re[t.BUILD], '');
-	  debug('comp', comp, options);
-	  comp = replaceCarets(comp, options);
-	  debug('caret', comp);
-	  comp = replaceTildes(comp, options);
-	  debug('tildes', comp);
-	  comp = replaceXRanges(comp, options);
-	  debug('xrange', comp);
-	  comp = replaceStars(comp, options);
-	  debug('stars', comp);
-	  return comp
-	};
+// pkg/dist-src/util/lowercase-keys.js
+function lowercaseKeys(object) {
+  if (!object) {
+    return {};
+  }
+  return Object.keys(object).reduce((newObj, key) => {
+    newObj[key.toLowerCase()] = object[key];
+    return newObj;
+  }, {});
+}
 
-	const isX = id => !id || id.toLowerCase() === 'x' || id === '*';
+// pkg/dist-src/util/is-plain-object.js
+function isPlainObject$1(value) {
+  if (typeof value !== "object" || value === null) return false;
+  if (Object.prototype.toString.call(value) !== "[object Object]") return false;
+  const proto = Object.getPrototypeOf(value);
+  if (proto === null) return true;
+  const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;
+  return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);
+}
 
-	// ~, ~> --> * (any, kinda silly)
-	// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
-	// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
-	// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
-	// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
-	// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
-	// ~0.0.1 --> >=0.0.1 <0.1.0-0
-	const replaceTildes = (comp, options) => {
-	  return comp
-	    .trim()
-	    .split(/\s+/)
-	    .map((c) => replaceTilde(c, options))
-	    .join(' ')
-	};
+// pkg/dist-src/util/merge-deep.js
+function mergeDeep(defaults, options) {
+  const result = Object.assign({}, defaults);
+  Object.keys(options).forEach((key) => {
+    if (isPlainObject$1(options[key])) {
+      if (!(key in defaults)) Object.assign(result, { [key]: options[key] });
+      else result[key] = mergeDeep(defaults[key], options[key]);
+    } else {
+      Object.assign(result, { [key]: options[key] });
+    }
+  });
+  return result;
+}
 
-	const replaceTilde = (comp, options) => {
-	  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
-	  return comp.replace(r, (_, M, m, p, pr) => {
-	    debug('tilde', comp, _, M, m, p, pr);
-	    let ret;
+// pkg/dist-src/util/remove-undefined-properties.js
+function removeUndefinedProperties(obj) {
+  for (const key in obj) {
+    if (obj[key] === void 0) {
+      delete obj[key];
+    }
+  }
+  return obj;
+}
 
-	    if (isX(M)) {
-	      ret = '';
-	    } else if (isX(m)) {
-	      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
-	    } else if (isX(p)) {
-	      // ~1.2 == >=1.2.0 <1.3.0-0
-	      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
-	    } else if (pr) {
-	      debug('replaceTilde pr', pr);
-	      ret = `>=${M}.${m}.${p}-${pr
-	      } <${M}.${+m + 1}.0-0`;
-	    } else {
-	      // ~1.2.3 == >=1.2.3 <1.3.0-0
-	      ret = `>=${M}.${m}.${p
-	      } <${M}.${+m + 1}.0-0`;
-	    }
+// pkg/dist-src/merge.js
+function merge(defaults, route, options) {
+  if (typeof route === "string") {
+    let [method, url] = route.split(" ");
+    options = Object.assign(url ? { method, url } : { url: method }, options);
+  } else {
+    options = Object.assign({}, route);
+  }
+  options.headers = lowercaseKeys(options.headers);
+  removeUndefinedProperties(options);
+  removeUndefinedProperties(options.headers);
+  const mergedOptions = mergeDeep(defaults || {}, options);
+  if (options.url === "/graphql") {
+    if (defaults && defaults.mediaType.previews?.length) {
+      mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(
+        (preview) => !mergedOptions.mediaType.previews.includes(preview)
+      ).concat(mergedOptions.mediaType.previews);
+    }
+    mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, ""));
+  }
+  return mergedOptions;
+}
 
-	    debug('tilde return', ret);
-	    return ret
-	  })
-	};
+// pkg/dist-src/util/add-query-parameters.js
+function addQueryParameters(url, parameters) {
+  const separator = /\?/.test(url) ? "&" : "?";
+  const names = Object.keys(parameters);
+  if (names.length === 0) {
+    return url;
+  }
+  return url + separator + names.map((name) => {
+    if (name === "q") {
+      return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");
+    }
+    return `${name}=${encodeURIComponent(parameters[name])}`;
+  }).join("&");
+}
 
-	// ^ --> * (any, kinda silly)
-	// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
-	// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
-	// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
-	// ^1.2.3 --> >=1.2.3 <2.0.0-0
-	// ^1.2.0 --> >=1.2.0 <2.0.0-0
-	// ^0.0.1 --> >=0.0.1 <0.0.2-0
-	// ^0.1.0 --> >=0.1.0 <0.2.0-0
-	const replaceCarets = (comp, options) => {
-	  return comp
-	    .trim()
-	    .split(/\s+/)
-	    .map((c) => replaceCaret(c, options))
-	    .join(' ')
-	};
+// pkg/dist-src/util/extract-url-variable-names.js
+var urlVariableRegex = /\{[^{}}]+\}/g;
+function removeNonChars(variableName) {
+  return variableName.replace(/(?:^\W+)|(?:(? a.concat(b), []);
+}
 
-	const replaceCaret = (comp, options) => {
-	  debug('caret', comp, options);
-	  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
-	  const z = options.includePrerelease ? '-0' : '';
-	  return comp.replace(r, (_, M, m, p, pr) => {
-	    debug('caret', comp, _, M, m, p, pr);
-	    let ret;
+// pkg/dist-src/util/omit.js
+function omit(object, keysToOmit) {
+  const result = { __proto__: null };
+  for (const key of Object.keys(object)) {
+    if (keysToOmit.indexOf(key) === -1) {
+      result[key] = object[key];
+    }
+  }
+  return result;
+}
 
-	    if (isX(M)) {
-	      ret = '';
-	    } else if (isX(m)) {
-	      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
-	    } else if (isX(p)) {
-	      if (M === '0') {
-	        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
-	      } else {
-	        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
-	      }
-	    } else if (pr) {
-	      debug('replaceCaret pr', pr);
-	      if (M === '0') {
-	        if (m === '0') {
-	          ret = `>=${M}.${m}.${p}-${pr
-	          } <${M}.${m}.${+p + 1}-0`;
-	        } else {
-	          ret = `>=${M}.${m}.${p}-${pr
-	          } <${M}.${+m + 1}.0-0`;
-	        }
-	      } else {
-	        ret = `>=${M}.${m}.${p}-${pr
-	        } <${+M + 1}.0.0-0`;
-	      }
-	    } else {
-	      debug('no pr');
-	      if (M === '0') {
-	        if (m === '0') {
-	          ret = `>=${M}.${m}.${p
-	          }${z} <${M}.${m}.${+p + 1}-0`;
-	        } else {
-	          ret = `>=${M}.${m}.${p
-	          }${z} <${M}.${+m + 1}.0-0`;
-	        }
-	      } else {
-	        ret = `>=${M}.${m}.${p
-	        } <${+M + 1}.0.0-0`;
-	      }
-	    }
+// pkg/dist-src/util/url-template.js
+function encodeReserved(str) {
+  return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {
+    if (!/%[0-9A-Fa-f]/.test(part)) {
+      part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
+    }
+    return part;
+  }).join("");
+}
+function encodeUnreserved(str) {
+  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
+    return "%" + c.charCodeAt(0).toString(16).toUpperCase();
+  });
+}
+function encodeValue(operator, value, key) {
+  value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
+  if (key) {
+    return encodeUnreserved(key) + "=" + value;
+  } else {
+    return value;
+  }
+}
+function isDefined(value) {
+  return value !== void 0 && value !== null;
+}
+function isKeyOperator(operator) {
+  return operator === ";" || operator === "&" || operator === "?";
+}
+function getValues(context, operator, key, modifier) {
+  var value = context[key], result = [];
+  if (isDefined(value) && value !== "") {
+    if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
+      value = value.toString();
+      if (modifier && modifier !== "*") {
+        value = value.substring(0, parseInt(modifier, 10));
+      }
+      result.push(
+        encodeValue(operator, value, isKeyOperator(operator) ? key : "")
+      );
+    } else {
+      if (modifier === "*") {
+        if (Array.isArray(value)) {
+          value.filter(isDefined).forEach(function(value2) {
+            result.push(
+              encodeValue(operator, value2, isKeyOperator(operator) ? key : "")
+            );
+          });
+        } else {
+          Object.keys(value).forEach(function(k) {
+            if (isDefined(value[k])) {
+              result.push(encodeValue(operator, value[k], k));
+            }
+          });
+        }
+      } else {
+        const tmp = [];
+        if (Array.isArray(value)) {
+          value.filter(isDefined).forEach(function(value2) {
+            tmp.push(encodeValue(operator, value2));
+          });
+        } else {
+          Object.keys(value).forEach(function(k) {
+            if (isDefined(value[k])) {
+              tmp.push(encodeUnreserved(k));
+              tmp.push(encodeValue(operator, value[k].toString()));
+            }
+          });
+        }
+        if (isKeyOperator(operator)) {
+          result.push(encodeUnreserved(key) + "=" + tmp.join(","));
+        } else if (tmp.length !== 0) {
+          result.push(tmp.join(","));
+        }
+      }
+    }
+  } else {
+    if (operator === ";") {
+      if (isDefined(value)) {
+        result.push(encodeUnreserved(key));
+      }
+    } else if (value === "" && (operator === "&" || operator === "?")) {
+      result.push(encodeUnreserved(key) + "=");
+    } else if (value === "") {
+      result.push("");
+    }
+  }
+  return result;
+}
+function parseUrl(template) {
+  return {
+    expand: expand.bind(null, template)
+  };
+}
+function expand(template, context) {
+  var operators = ["+", "#", ".", "/", ";", "?", "&"];
+  template = template.replace(
+    /\{([^\{\}]+)\}|([^\{\}]+)/g,
+    function(_, expression, literal) {
+      if (expression) {
+        let operator = "";
+        const values = [];
+        if (operators.indexOf(expression.charAt(0)) !== -1) {
+          operator = expression.charAt(0);
+          expression = expression.substr(1);
+        }
+        expression.split(/,/g).forEach(function(variable) {
+          var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
+          values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+        });
+        if (operator && operator !== "+") {
+          var separator = ",";
+          if (operator === "?") {
+            separator = "&";
+          } else if (operator !== "#") {
+            separator = operator;
+          }
+          return (values.length !== 0 ? operator : "") + values.join(separator);
+        } else {
+          return values.join(",");
+        }
+      } else {
+        return encodeReserved(literal);
+      }
+    }
+  );
+  if (template === "/") {
+    return template;
+  } else {
+    return template.replace(/\/$/, "");
+  }
+}
 
-	    debug('caret return', ret);
-	    return ret
-	  })
-	};
+// pkg/dist-src/parse.js
+function parse(options) {
+  let method = options.method.toUpperCase();
+  let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}");
+  let headers = Object.assign({}, options.headers);
+  let body;
+  let parameters = omit(options, [
+    "method",
+    "baseUrl",
+    "url",
+    "headers",
+    "request",
+    "mediaType"
+  ]);
+  const urlVariableNames = extractUrlVariableNames(url);
+  url = parseUrl(url).expand(parameters);
+  if (!/^http/.test(url)) {
+    url = options.baseUrl + url;
+  }
+  const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl");
+  const remainingParameters = omit(parameters, omittedParameters);
+  const isBinaryRequest = /application\/octet-stream/i.test(headers.accept);
+  if (!isBinaryRequest) {
+    if (options.mediaType.format) {
+      headers.accept = headers.accept.split(/,/).map(
+        (format) => format.replace(
+          /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/,
+          `application/vnd$1$2.${options.mediaType.format}`
+        )
+      ).join(",");
+    }
+    if (url.endsWith("/graphql")) {
+      if (options.mediaType.previews?.length) {
+        const previewsFromAcceptHeader = headers.accept.match(/(? {
+          const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";
+          return `application/vnd.github.${preview}-preview${format}`;
+        }).join(",");
+      }
+    }
+  }
+  if (["GET", "HEAD"].includes(method)) {
+    url = addQueryParameters(url, remainingParameters);
+  } else {
+    if ("data" in remainingParameters) {
+      body = remainingParameters.data;
+    } else {
+      if (Object.keys(remainingParameters).length) {
+        body = remainingParameters;
+      }
+    }
+  }
+  if (!headers["content-type"] && typeof body !== "undefined") {
+    headers["content-type"] = "application/json; charset=utf-8";
+  }
+  if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
+    body = "";
+  }
+  return Object.assign(
+    { method, url, headers },
+    typeof body !== "undefined" ? { body } : null,
+    options.request ? { request: options.request } : null
+  );
+}
 
-	const replaceXRanges = (comp, options) => {
-	  debug('replaceXRanges', comp, options);
-	  return comp
-	    .split(/\s+/)
-	    .map((c) => replaceXRange(c, options))
-	    .join(' ')
-	};
+// pkg/dist-src/endpoint-with-defaults.js
+function endpointWithDefaults(defaults, route, options) {
+  return parse(merge(defaults, route, options));
+}
 
-	const replaceXRange = (comp, options) => {
-	  comp = comp.trim();
-	  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
-	  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
-	    debug('xRange', comp, ret, gtlt, M, m, p, pr);
-	    const xM = isX(M);
-	    const xm = xM || isX(m);
-	    const xp = xm || isX(p);
-	    const anyX = xp;
+// pkg/dist-src/with-defaults.js
+function withDefaults$2(oldDefaults, newDefaults) {
+  const DEFAULTS2 = merge(oldDefaults, newDefaults);
+  const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);
+  return Object.assign(endpoint2, {
+    DEFAULTS: DEFAULTS2,
+    defaults: withDefaults$2.bind(null, DEFAULTS2),
+    merge: merge.bind(null, DEFAULTS2),
+    parse
+  });
+}
 
-	    if (gtlt === '=' && anyX) {
-	      gtlt = '';
-	    }
+// pkg/dist-src/index.js
+var endpoint = withDefaults$2(null, DEFAULTS);
 
-	    // if we're including prereleases in the match, then we need
-	    // to fix this to -0, the lowest possible prerelease value
-	    pr = options.includePrerelease ? '-0' : '';
+var fastContentTypeParse = {};
 
-	    if (xM) {
-	      if (gtlt === '>' || gtlt === '<') {
-	        // nothing is allowed
-	        ret = '<0.0.0-0';
-	      } else {
-	        // nothing is forbidden
-	        ret = '*';
-	      }
-	    } else if (gtlt && anyX) {
-	      // we know patch is an x, because we have any x at all.
-	      // replace X with 0
-	      if (xm) {
-	        m = 0;
-	      }
-	      p = 0;
+var hasRequiredFastContentTypeParse;
 
-	      if (gtlt === '>') {
-	        // >1 => >=2.0.0
-	        // >1.2 => >=1.3.0
-	        gtlt = '>=';
-	        if (xm) {
-	          M = +M + 1;
-	          m = 0;
-	          p = 0;
-	        } else {
-	          m = +m + 1;
-	          p = 0;
-	        }
-	      } else if (gtlt === '<=') {
-	        // <=0.7.x is actually <0.8.0, since any 0.7.x should
-	        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
-	        gtlt = '<';
-	        if (xm) {
-	          M = +M + 1;
-	        } else {
-	          m = +m + 1;
-	        }
-	      }
+function requireFastContentTypeParse () {
+	if (hasRequiredFastContentTypeParse) return fastContentTypeParse;
+	hasRequiredFastContentTypeParse = 1;
 
-	      if (gtlt === '<') {
-	        pr = '-0';
-	      }
+	const NullObject = function NullObject () { };
+	NullObject.prototype = Object.create(null);
 
-	      ret = `${gtlt + M}.${m}.${p}${pr}`;
-	    } else if (xm) {
-	      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
-	    } else if (xp) {
-	      ret = `>=${M}.${m}.0${pr
-	      } <${M}.${+m + 1}.0-0`;
-	    }
+	/**
+	 * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
+	 *
+	 * parameter     = token "=" ( token / quoted-string )
+	 * token         = 1*tchar
+	 * tchar         = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+	 *               / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+	 *               / DIGIT / ALPHA
+	 *               ; any VCHAR, except delimiters
+	 * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+	 * qdtext        = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
+	 * obs-text      = %x80-FF
+	 * quoted-pair   = "\" ( HTAB / SP / VCHAR / obs-text )
+	 */
+	const paramRE = /; *([!#$%&'*+.^\w`|~-]+)=("(?:[\v\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\v\u0020-\u00ff])*"|[!#$%&'*+.^\w`|~-]+) */gu;
 
-	    debug('xRange return', ret);
+	/**
+	 * RegExp to match quoted-pair in RFC 7230 sec 3.2.6
+	 *
+	 * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
+	 * obs-text    = %x80-FF
+	 */
+	const quotedPairRE = /\\([\v\u0020-\u00ff])/gu;
 
-	    return ret
-	  })
-	};
+	/**
+	 * RegExp to match type in RFC 7231 sec 3.1.1.1
+	 *
+	 * media-type = type "/" subtype
+	 * type       = token
+	 * subtype    = token
+	 */
+	const mediaTypeRE = /^[!#$%&'*+.^\w|~-]+\/[!#$%&'*+.^\w|~-]+$/u;
 
-	// Because * is AND-ed with everything else in the comparator,
-	// and '' means "any version", just remove the *s entirely.
-	const replaceStars = (comp, options) => {
-	  debug('replaceStars', comp, options);
-	  // Looseness is ignored here.  star is always as loose as it gets!
-	  return comp
-	    .trim()
-	    .replace(re[t.STAR], '')
-	};
+	// default ContentType to prevent repeated object creation
+	const defaultContentType = { type: '', parameters: new NullObject() };
+	Object.freeze(defaultContentType.parameters);
+	Object.freeze(defaultContentType);
 
-	const replaceGTE0 = (comp, options) => {
-	  debug('replaceGTE0', comp, options);
-	  return comp
-	    .trim()
-	    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
-	};
+	/**
+	 * Parse media type to object.
+	 *
+	 * @param {string|object} header
+	 * @return {Object}
+	 * @public
+	 */
 
-	// This function is passed to string.replace(re[t.HYPHENRANGE])
-	// M, m, patch, prerelease, build
-	// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
-	// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
-	// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
-	// TODO build?
-	const hyphenReplace = incPr => ($0,
-	  from, fM, fm, fp, fpr, fb,
-	  to, tM, tm, tp, tpr) => {
-	  if (isX(fM)) {
-	    from = '';
-	  } else if (isX(fm)) {
-	    from = `>=${fM}.0.0${incPr ? '-0' : ''}`;
-	  } else if (isX(fp)) {
-	    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`;
-	  } else if (fpr) {
-	    from = `>=${from}`;
-	  } else {
-	    from = `>=${from}${incPr ? '-0' : ''}`;
+	function parse (header) {
+	  if (typeof header !== 'string') {
+	    throw new TypeError('argument header is required and must be a string')
 	  }
 
-	  if (isX(tM)) {
-	    to = '';
-	  } else if (isX(tm)) {
-	    to = `<${+tM + 1}.0.0-0`;
-	  } else if (isX(tp)) {
-	    to = `<${tM}.${+tm + 1}.0-0`;
-	  } else if (tpr) {
-	    to = `<=${tM}.${tm}.${tp}-${tpr}`;
-	  } else if (incPr) {
-	    to = `<${tM}.${tm}.${+tp + 1}-0`;
-	  } else {
-	    to = `<=${to}`;
+	  let index = header.indexOf(';');
+	  const type = index !== -1
+	    ? header.slice(0, index).trim()
+	    : header.trim();
+
+	  if (mediaTypeRE.test(type) === false) {
+	    throw new TypeError('invalid media type')
 	  }
 
-	  return `${from} ${to}`.trim()
-	};
+	  const result = {
+	    type: type.toLowerCase(),
+	    parameters: new NullObject()
+	  };
 
-	const testSet = (set, version, options) => {
-	  for (let i = 0; i < set.length; i++) {
-	    if (!set[i].test(version)) {
-	      return false
-	    }
+	  // parse parameters
+	  if (index === -1) {
+	    return result
 	  }
 
-	  if (version.prerelease.length && !options.includePrerelease) {
-	    // Find the set of versions that are allowed to have prereleases
-	    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
-	    // That should allow `1.2.3-pr.2` to pass.
-	    // However, `1.2.4-alpha.notready` should NOT be allowed,
-	    // even though it's within the range set by the comparators.
-	    for (let i = 0; i < set.length; i++) {
-	      debug(set[i].semver);
-	      if (set[i].semver === Comparator.ANY) {
-	        continue
-	      }
+	  let key;
+	  let match;
+	  let value;
 
-	      if (set[i].semver.prerelease.length > 0) {
-	        const allowed = set[i].semver;
-	        if (allowed.major === version.major &&
-	            allowed.minor === version.minor &&
-	            allowed.patch === version.patch) {
-	          return true
-	        }
-	      }
+	  paramRE.lastIndex = index;
+
+	  while ((match = paramRE.exec(header))) {
+	    if (match.index !== index) {
+	      throw new TypeError('invalid parameter format')
 	    }
 
-	    // Version has a -pre, but it's not one of the ones we like.
-	    return false
-	  }
+	    index += match[0].length;
+	    key = match[1].toLowerCase();
+	    value = match[2];
 
-	  return true
-	};
-	return range;
-}
+	    if (value[0] === '"') {
+	      // remove quotes and escapes
+	      value = value
+	        .slice(1, value.length - 1);
 
-var comparator;
-var hasRequiredComparator;
+	      quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'));
+	    }
 
-function requireComparator () {
-	if (hasRequiredComparator) return comparator;
-	hasRequiredComparator = 1;
+	    result.parameters[key] = value;
+	  }
 
-	const ANY = Symbol('SemVer ANY');
-	// hoisted class for cyclic dependency
-	class Comparator {
-	  static get ANY () {
-	    return ANY
+	  if (index !== header.length) {
+	    throw new TypeError('invalid parameter format')
 	  }
 
-	  constructor (comp, options) {
-	    options = parseOptions(options);
+	  return result
+	}
 
-	    if (comp instanceof Comparator) {
-	      if (comp.loose === !!options.loose) {
-	        return comp
-	      } else {
-	        comp = comp.value;
-	      }
-	    }
+	function safeParse (header) {
+	  if (typeof header !== 'string') {
+	    return defaultContentType
+	  }
 
-	    comp = comp.trim().split(/\s+/).join(' ');
-	    debug('comparator', comp, options);
-	    this.options = options;
-	    this.loose = !!options.loose;
-	    this.parse(comp);
+	  let index = header.indexOf(';');
+	  const type = index !== -1
+	    ? header.slice(0, index).trim()
+	    : header.trim();
 
-	    if (this.semver === ANY) {
-	      this.value = '';
-	    } else {
-	      this.value = this.operator + this.semver.version;
-	    }
+	  if (mediaTypeRE.test(type) === false) {
+	    return defaultContentType
+	  }
 
-	    debug('comp', this);
+	  const result = {
+	    type: type.toLowerCase(),
+	    parameters: new NullObject()
+	  };
+
+	  // parse parameters
+	  if (index === -1) {
+	    return result
 	  }
 
-	  parse (comp) {
-	    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
-	    const m = comp.match(r);
+	  let key;
+	  let match;
+	  let value;
 
-	    if (!m) {
-	      throw new TypeError(`Invalid comparator: ${comp}`)
-	    }
+	  paramRE.lastIndex = index;
 
-	    this.operator = m[1] !== undefined ? m[1] : '';
-	    if (this.operator === '=') {
-	      this.operator = '';
+	  while ((match = paramRE.exec(header))) {
+	    if (match.index !== index) {
+	      return defaultContentType
 	    }
 
-	    // if it literally is just '>' or '' then allow anything.
-	    if (!m[2]) {
-	      this.semver = ANY;
-	    } else {
-	      this.semver = new SemVer(m[2], this.options.loose);
+	    index += match[0].length;
+	    key = match[1].toLowerCase();
+	    value = match[2];
+
+	    if (value[0] === '"') {
+	      // remove quotes and escapes
+	      value = value
+	        .slice(1, value.length - 1);
+
+	      quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'));
 	    }
+
+	    result.parameters[key] = value;
 	  }
 
-	  toString () {
-	    return this.value
+	  if (index !== header.length) {
+	    return defaultContentType
 	  }
 
-	  test (version) {
-	    debug('Comparator.test', version, this.options.loose);
+	  return result
+	}
 
-	    if (this.semver === ANY || version === ANY) {
-	      return true
-	    }
+	fastContentTypeParse.default = { parse, safeParse };
+	fastContentTypeParse.parse = parse;
+	fastContentTypeParse.safeParse = safeParse;
+	fastContentTypeParse.defaultContentType = defaultContentType;
+	return fastContentTypeParse;
+}
 
-	    if (typeof version === 'string') {
-	      try {
-	        version = new SemVer(version, this.options);
-	      } catch (er) {
-	        return false
-	      }
-	    }
+var fastContentTypeParseExports = requireFastContentTypeParse();
 
-	    return cmp(version, this.operator, this.semver, this.options)
-	  }
+class RequestError extends Error {
+  name;
+  /**
+   * http status code
+   */
+  status;
+  /**
+   * Request options that lead to the error.
+   */
+  request;
+  /**
+   * Response object if a response was received
+   */
+  response;
+  constructor(message, statusCode, options) {
+    super(message, { cause: options.cause });
+    this.name = "HttpError";
+    this.status = Number.parseInt(statusCode);
+    if (Number.isNaN(this.status)) {
+      this.status = 0;
+    }
+    /* v8 ignore else -- @preserve -- Bug with vitest coverage where it sees an else branch that doesn't exist */
+    if ("response" in options) {
+      this.response = options.response;
+    }
+    const requestCopy = Object.assign({}, options.request);
+    if (options.request.headers.authorization) {
+      requestCopy.headers = Object.assign({}, options.request.headers, {
+        authorization: options.request.headers.authorization.replace(
+          /(? "";
+async function fetchWrapper(requestOptions) {
+  const fetch = requestOptions.request?.fetch || globalThis.fetch;
+  if (!fetch) {
+    throw new Error(
+      "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing"
+    );
+  }
+  const log = requestOptions.request?.log || console;
+  const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;
+  const body = isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body) ? JSON.stringify(requestOptions.body) : requestOptions.body;
+  const requestHeaders = Object.fromEntries(
+    Object.entries(requestOptions.headers).map(([name, value]) => [
+      name,
+      String(value)
+    ])
+  );
+  let fetchResponse;
+  try {
+    fetchResponse = await fetch(requestOptions.url, {
+      method: requestOptions.method,
+      body,
+      redirect: requestOptions.request?.redirect,
+      headers: requestHeaders,
+      signal: requestOptions.request?.signal,
+      // duplex must be set if request.body is ReadableStream or Async Iterables.
+      // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.
+      ...requestOptions.body && { duplex: "half" }
+    });
+  } catch (error) {
+    let message = "Unknown Error";
+    if (error instanceof Error) {
+      if (error.name === "AbortError") {
+        error.status = 500;
+        throw error;
+      }
+      message = error.message;
+      if (error.name === "TypeError" && "cause" in error) {
+        if (error.cause instanceof Error) {
+          message = error.cause.message;
+        } else if (typeof error.cause === "string") {
+          message = error.cause;
+        }
+      }
+    }
+    const requestError = new RequestError(message, 500, {
+      request: requestOptions
+    });
+    requestError.cause = error;
+    throw requestError;
+  }
+  const status = fetchResponse.status;
+  const url = fetchResponse.url;
+  const responseHeaders = {};
+  for (const [key, value] of fetchResponse.headers) {
+    responseHeaders[key] = value;
+  }
+  const octokitResponse = {
+    url,
+    status,
+    headers: responseHeaders,
+    data: ""
+  };
+  if ("deprecation" in responseHeaders) {
+    const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/);
+    const deprecationLink = matches && matches.pop();
+    log.warn(
+      `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`
+    );
+  }
+  if (status === 204 || status === 205) {
+    return octokitResponse;
+  }
+  if (requestOptions.method === "HEAD") {
+    if (status < 400) {
+      return octokitResponse;
+    }
+    throw new RequestError(fetchResponse.statusText, status, {
+      response: octokitResponse,
+      request: requestOptions
+    });
+  }
+  if (status === 304) {
+    octokitResponse.data = await getResponseData(fetchResponse);
+    throw new RequestError("Not modified", status, {
+      response: octokitResponse,
+      request: requestOptions
+    });
+  }
+  if (status >= 400) {
+    octokitResponse.data = await getResponseData(fetchResponse);
+    throw new RequestError(toErrorMessage(octokitResponse.data), status, {
+      response: octokitResponse,
+      request: requestOptions
+    });
+  }
+  octokitResponse.data = parseSuccessResponseBody ? await getResponseData(fetchResponse) : fetchResponse.body;
+  return octokitResponse;
+}
+async function getResponseData(response) {
+  const contentType = response.headers.get("content-type");
+  if (!contentType) {
+    return response.text().catch(noop$1);
+  }
+  const mimetype = fastContentTypeParseExports.safeParse(contentType);
+  if (isJSONResponse(mimetype)) {
+    let text = "";
+    try {
+      text = await response.text();
+      return JSON.parse(text);
+    } catch (err) {
+      return text;
+    }
+  } else if (mimetype.type.startsWith("text/") || mimetype.parameters.charset?.toLowerCase() === "utf-8") {
+    return response.text().catch(noop$1);
+  } else {
+    return response.arrayBuffer().catch(
+      /* v8 ignore next -- @preserve */
+      () => new ArrayBuffer(0)
+    );
+  }
+}
+function isJSONResponse(mimetype) {
+  return mimetype.type === "application/json" || mimetype.type === "application/scim+json";
+}
+function toErrorMessage(data) {
+  if (typeof data === "string") {
+    return data;
+  }
+  if (data instanceof ArrayBuffer) {
+    return "Unknown error";
+  }
+  if ("message" in data) {
+    const suffix = "documentation_url" in data ? ` - ${data.documentation_url}` : "";
+    return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` : `${data.message}${suffix}`;
+  }
+  return `Unknown error: ${JSON.stringify(data)}`;
+}
+
+// pkg/dist-src/with-defaults.js
+function withDefaults$1(oldEndpoint, newDefaults) {
+  const endpoint2 = oldEndpoint.defaults(newDefaults);
+  const newApi = function(route, parameters) {
+    const endpointOptions = endpoint2.merge(route, parameters);
+    if (!endpointOptions.request || !endpointOptions.request.hook) {
+      return fetchWrapper(endpoint2.parse(endpointOptions));
+    }
+    const request2 = (route2, parameters2) => {
+      return fetchWrapper(
+        endpoint2.parse(endpoint2.merge(route2, parameters2))
+      );
+    };
+    Object.assign(request2, {
+      endpoint: endpoint2,
+      defaults: withDefaults$1.bind(null, endpoint2)
+    });
+    return endpointOptions.request.hook(request2, endpointOptions);
+  };
+  return Object.assign(newApi, {
+    endpoint: endpoint2,
+    defaults: withDefaults$1.bind(null, endpoint2)
+  });
+}
+
+// pkg/dist-src/index.js
+var request = withDefaults$1(endpoint, defaults_default);
+/* v8 ignore next -- @preserve */
+/* v8 ignore else -- @preserve */
+
+// pkg/dist-src/index.js
+
+// pkg/dist-src/version.js
+var VERSION$3 = "0.0.0-development";
+
+// pkg/dist-src/error.js
+function _buildMessageForResponseErrors(data) {
+  return `Request failed due to following response errors:
+` + data.errors.map((e) => ` - ${e.message}`).join("\n");
+}
+var GraphqlResponseError = class extends Error {
+  constructor(request2, headers, response) {
+    super(_buildMessageForResponseErrors(response));
+    this.request = request2;
+    this.headers = headers;
+    this.response = response;
+    this.errors = response.errors;
+    this.data = response.data;
+    if (Error.captureStackTrace) {
+      Error.captureStackTrace(this, this.constructor);
+    }
+  }
+  name = "GraphqlResponseError";
+  errors;
+  data;
+};
+
+// pkg/dist-src/graphql.js
+var NON_VARIABLE_OPTIONS = [
+  "method",
+  "baseUrl",
+  "url",
+  "headers",
+  "request",
+  "query",
+  "mediaType",
+  "operationName"
+];
+var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];
+var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/;
+function graphql(request2, query, options) {
+  if (options) {
+    if (typeof query === "string" && "query" in options) {
+      return Promise.reject(
+        new Error(`[@octokit/graphql] "query" cannot be used as variable name`)
+      );
+    }
+    for (const key in options) {
+      if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;
+      return Promise.reject(
+        new Error(
+          `[@octokit/graphql] "${key}" cannot be used as variable name`
+        )
+      );
+    }
+  }
+  const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;
+  const requestOptions = Object.keys(
+    parsedOptions
+  ).reduce((result, key) => {
+    if (NON_VARIABLE_OPTIONS.includes(key)) {
+      result[key] = parsedOptions[key];
+      return result;
+    }
+    if (!result.variables) {
+      result.variables = {};
+    }
+    result.variables[key] = parsedOptions[key];
+    return result;
+  }, {});
+  const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;
+  if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {
+    requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");
+  }
+  return request2(requestOptions).then((response) => {
+    if (response.data.errors) {
+      const headers = {};
+      for (const key of Object.keys(response.headers)) {
+        headers[key] = response.headers[key];
+      }
+      throw new GraphqlResponseError(
+        requestOptions,
+        headers,
+        response.data
+      );
+    }
+    return response.data.data;
+  });
+}
+
+// pkg/dist-src/with-defaults.js
+function withDefaults(request2, newDefaults) {
+  const newRequest = request2.defaults(newDefaults);
+  const newApi = (query, options) => {
+    return graphql(newRequest, query, options);
+  };
+  return Object.assign(newApi, {
+    defaults: withDefaults.bind(null, newRequest),
+    endpoint: newRequest.endpoint
+  });
+}
+
+// pkg/dist-src/index.js
+withDefaults(request, {
+  headers: {
+    "user-agent": `octokit-graphql.js/${VERSION$3} ${getUserAgent()}`
+  },
+  method: "POST",
+  url: "/graphql"
+});
+function withCustomRequest(customRequest) {
+  return withDefaults(customRequest, {
+    method: "POST",
+    url: "/graphql"
+  });
+}
+
+// pkg/dist-src/is-jwt.js
+var b64url = "(?:[a-zA-Z0-9_-]+)";
+var sep = "\\.";
+var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`);
+var isJWT = jwtRE.test.bind(jwtRE);
+
+// pkg/dist-src/auth.js
+async function auth(token) {
+  const isApp = isJWT(token);
+  const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_");
+  const isUserToServer = token.startsWith("ghu_");
+  const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth";
+  return {
+    type: "token",
+    token,
+    tokenType
+  };
+}
+
+// pkg/dist-src/with-authorization-prefix.js
+function withAuthorizationPrefix(token) {
+  if (token.split(/\./).length === 3) {
+    return `bearer ${token}`;
+  }
+  return `token ${token}`;
+}
 
-	  intersects (comp, options) {
-	    if (!(comp instanceof Comparator)) {
-	      throw new TypeError('a Comparator is required')
-	    }
+// pkg/dist-src/hook.js
+async function hook(token, request, route, parameters) {
+  const endpoint = request.endpoint.merge(
+    route,
+    parameters
+  );
+  endpoint.headers.authorization = withAuthorizationPrefix(token);
+  return request(endpoint);
+}
 
-	    if (this.operator === '') {
-	      if (this.value === '') {
-	        return true
-	      }
-	      return new Range(comp.value, options).test(this.value)
-	    } else if (comp.operator === '') {
-	      if (comp.value === '') {
-	        return true
-	      }
-	      return new Range(this.value, options).test(comp.semver)
-	    }
+// pkg/dist-src/index.js
+var createTokenAuth = function createTokenAuth2(token) {
+  if (!token) {
+    throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");
+  }
+  if (typeof token !== "string") {
+    throw new Error(
+      "[@octokit/auth-token] Token passed to createTokenAuth is not a string"
+    );
+  }
+  token = token.replace(/^(token|bearer) +/i, "");
+  return Object.assign(auth.bind(null, token), {
+    hook: hook.bind(null, token)
+  });
+};
 
-	    options = parseOptions(options);
+const VERSION$2 = "7.0.6";
 
-	    // Special cases where nothing can possibly be lower
-	    if (options.includePrerelease &&
-	      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
-	      return false
-	    }
-	    if (!options.includePrerelease &&
-	      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
-	      return false
-	    }
+const noop = () => {
+};
+const consoleWarn = console.warn.bind(console);
+const consoleError = console.error.bind(console);
+function createLogger(logger = {}) {
+  if (typeof logger.debug !== "function") {
+    logger.debug = noop;
+  }
+  if (typeof logger.info !== "function") {
+    logger.info = noop;
+  }
+  if (typeof logger.warn !== "function") {
+    logger.warn = consoleWarn;
+  }
+  if (typeof logger.error !== "function") {
+    logger.error = consoleError;
+  }
+  return logger;
+}
+const userAgentTrail = `octokit-core.js/${VERSION$2} ${getUserAgent()}`;
+class Octokit {
+  static VERSION = VERSION$2;
+  static defaults(defaults) {
+    const OctokitWithDefaults = class extends this {
+      constructor(...args) {
+        const options = args[0] || {};
+        if (typeof defaults === "function") {
+          super(defaults(options));
+          return;
+        }
+        super(
+          Object.assign(
+            {},
+            defaults,
+            options,
+            options.userAgent && defaults.userAgent ? {
+              userAgent: `${options.userAgent} ${defaults.userAgent}`
+            } : null
+          )
+        );
+      }
+    };
+    return OctokitWithDefaults;
+  }
+  static plugins = [];
+  /**
+   * Attach a plugin (or many) to your Octokit instance.
+   *
+   * @example
+   * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)
+   */
+  static plugin(...newPlugins) {
+    const currentPlugins = this.plugins;
+    const NewOctokit = class extends this {
+      static plugins = currentPlugins.concat(
+        newPlugins.filter((plugin) => !currentPlugins.includes(plugin))
+      );
+    };
+    return NewOctokit;
+  }
+  constructor(options = {}) {
+    const hook = new Hook.Collection();
+    const requestDefaults = {
+      baseUrl: request.endpoint.DEFAULTS.baseUrl,
+      headers: {},
+      request: Object.assign({}, options.request, {
+        // @ts-ignore internal usage only, no need to type
+        hook: hook.bind(null, "request")
+      }),
+      mediaType: {
+        previews: [],
+        format: ""
+      }
+    };
+    requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;
+    if (options.baseUrl) {
+      requestDefaults.baseUrl = options.baseUrl;
+    }
+    if (options.previews) {
+      requestDefaults.mediaType.previews = options.previews;
+    }
+    if (options.timeZone) {
+      requestDefaults.headers["time-zone"] = options.timeZone;
+    }
+    this.request = request.defaults(requestDefaults);
+    this.graphql = withCustomRequest(this.request).defaults(requestDefaults);
+    this.log = createLogger(options.log);
+    this.hook = hook;
+    if (!options.authStrategy) {
+      if (!options.auth) {
+        this.auth = async () => ({
+          type: "unauthenticated"
+        });
+      } else {
+        const auth = createTokenAuth(options.auth);
+        hook.wrap("request", auth.hook);
+        this.auth = auth;
+      }
+    } else {
+      const { authStrategy, ...otherOptions } = options;
+      const auth = authStrategy(
+        Object.assign(
+          {
+            request: this.request,
+            log: this.log,
+            // we pass the current octokit instance as well as its constructor options
+            // to allow for authentication strategies that return a new octokit instance
+            // that shares the same internal state as the current one. The original
+            // requirement for this was the "event-octokit" authentication strategy
+            // of https://github.com/probot/octokit-auth-probot.
+            octokit: this,
+            octokitOptions: otherOptions
+          },
+          options.auth
+        )
+      );
+      hook.wrap("request", auth.hook);
+      this.auth = auth;
+    }
+    const classConstructor = this.constructor;
+    for (let i = 0; i < classConstructor.plugins.length; ++i) {
+      Object.assign(this, classConstructor.plugins[i](this, options));
+    }
+  }
+  // assigned during constructor
+  request;
+  graphql;
+  log;
+  hook;
+  // TODO: type `octokit.auth` based on passed options.authStrategy
+  auth;
+}
 
-	    // Same direction increasing (> or >=)
-	    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
-	      return true
-	    }
-	    // Same direction decreasing (< or <=)
-	    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
-	      return true
-	    }
-	    // same SemVer and both sides are inclusive (<= or >=)
-	    if (
-	      (this.semver.version === comp.semver.version) &&
-	      this.operator.includes('=') && comp.operator.includes('=')) {
-	      return true
-	    }
-	    // opposite directions less than
-	    if (cmp(this.semver, '<', comp.semver, options) &&
-	      this.operator.startsWith('>') && comp.operator.startsWith('<')) {
-	      return true
-	    }
-	    // opposite directions greater than
-	    if (cmp(this.semver, '>', comp.semver, options) &&
-	      this.operator.startsWith('<') && comp.operator.startsWith('>')) {
-	      return true
-	    }
-	    return false
-	  }
-	}
+const VERSION$1 = "17.0.0";
 
-	comparator = Comparator;
+const Endpoints = {
+  actions: {
+    addCustomLabelsToSelfHostedRunnerForOrg: [
+      "POST /orgs/{org}/actions/runners/{runner_id}/labels"
+    ],
+    addCustomLabelsToSelfHostedRunnerForRepo: [
+      "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
+    ],
+    addRepoAccessToSelfHostedRunnerGroupInOrg: [
+      "PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}"
+    ],
+    addSelectedRepoToOrgSecret: [
+      "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    addSelectedRepoToOrgVariable: [
+      "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"
+    ],
+    approveWorkflowRun: [
+      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"
+    ],
+    cancelWorkflowRun: [
+      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"
+    ],
+    createEnvironmentVariable: [
+      "POST /repos/{owner}/{repo}/environments/{environment_name}/variables"
+    ],
+    createHostedRunnerForOrg: ["POST /orgs/{org}/actions/hosted-runners"],
+    createOrUpdateEnvironmentSecret: [
+      "PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"
+    ],
+    createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"],
+    createOrUpdateRepoSecret: [
+      "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"
+    ],
+    createOrgVariable: ["POST /orgs/{org}/actions/variables"],
+    createRegistrationTokenForOrg: [
+      "POST /orgs/{org}/actions/runners/registration-token"
+    ],
+    createRegistrationTokenForRepo: [
+      "POST /repos/{owner}/{repo}/actions/runners/registration-token"
+    ],
+    createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"],
+    createRemoveTokenForRepo: [
+      "POST /repos/{owner}/{repo}/actions/runners/remove-token"
+    ],
+    createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"],
+    createWorkflowDispatch: [
+      "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"
+    ],
+    deleteActionsCacheById: [
+      "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"
+    ],
+    deleteActionsCacheByKey: [
+      "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"
+    ],
+    deleteArtifact: [
+      "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"
+    ],
+    deleteCustomImageFromOrg: [
+      "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}"
+    ],
+    deleteCustomImageVersionFromOrg: [
+      "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}"
+    ],
+    deleteEnvironmentSecret: [
+      "DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"
+    ],
+    deleteEnvironmentVariable: [
+      "DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"
+    ],
+    deleteHostedRunnerForOrg: [
+      "DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"
+    ],
+    deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],
+    deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"],
+    deleteRepoSecret: [
+      "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"
+    ],
+    deleteRepoVariable: [
+      "DELETE /repos/{owner}/{repo}/actions/variables/{name}"
+    ],
+    deleteSelfHostedRunnerFromOrg: [
+      "DELETE /orgs/{org}/actions/runners/{runner_id}"
+    ],
+    deleteSelfHostedRunnerFromRepo: [
+      "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"
+    ],
+    deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],
+    deleteWorkflowRunLogs: [
+      "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"
+    ],
+    disableSelectedRepositoryGithubActionsOrganization: [
+      "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"
+    ],
+    disableWorkflow: [
+      "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"
+    ],
+    downloadArtifact: [
+      "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"
+    ],
+    downloadJobLogsForWorkflowRun: [
+      "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"
+    ],
+    downloadWorkflowRunAttemptLogs: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"
+    ],
+    downloadWorkflowRunLogs: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"
+    ],
+    enableSelectedRepositoryGithubActionsOrganization: [
+      "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"
+    ],
+    enableWorkflow: [
+      "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"
+    ],
+    forceCancelWorkflowRun: [
+      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"
+    ],
+    generateRunnerJitconfigForOrg: [
+      "POST /orgs/{org}/actions/runners/generate-jitconfig"
+    ],
+    generateRunnerJitconfigForRepo: [
+      "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"
+    ],
+    getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],
+    getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],
+    getActionsCacheUsageByRepoForOrg: [
+      "GET /orgs/{org}/actions/cache/usage-by-repository"
+    ],
+    getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],
+    getAllowedActionsOrganization: [
+      "GET /orgs/{org}/actions/permissions/selected-actions"
+    ],
+    getAllowedActionsRepository: [
+      "GET /repos/{owner}/{repo}/actions/permissions/selected-actions"
+    ],
+    getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],
+    getCustomImageForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}"
+    ],
+    getCustomImageVersionForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}"
+    ],
+    getCustomOidcSubClaimForRepo: [
+      "GET /repos/{owner}/{repo}/actions/oidc/customization/sub"
+    ],
+    getEnvironmentPublicKey: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key"
+    ],
+    getEnvironmentSecret: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"
+    ],
+    getEnvironmentVariable: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"
+    ],
+    getGithubActionsDefaultWorkflowPermissionsOrganization: [
+      "GET /orgs/{org}/actions/permissions/workflow"
+    ],
+    getGithubActionsDefaultWorkflowPermissionsRepository: [
+      "GET /repos/{owner}/{repo}/actions/permissions/workflow"
+    ],
+    getGithubActionsPermissionsOrganization: [
+      "GET /orgs/{org}/actions/permissions"
+    ],
+    getGithubActionsPermissionsRepository: [
+      "GET /repos/{owner}/{repo}/actions/permissions"
+    ],
+    getHostedRunnerForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"
+    ],
+    getHostedRunnersGithubOwnedImagesForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/images/github-owned"
+    ],
+    getHostedRunnersLimitsForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/limits"
+    ],
+    getHostedRunnersMachineSpecsForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/machine-sizes"
+    ],
+    getHostedRunnersPartnerImagesForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/images/partner"
+    ],
+    getHostedRunnersPlatformsForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/platforms"
+    ],
+    getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],
+    getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],
+    getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],
+    getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"],
+    getPendingDeploymentsForRun: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"
+    ],
+    getRepoPermissions: [
+      "GET /repos/{owner}/{repo}/actions/permissions",
+      {},
+      { renamed: ["actions", "getGithubActionsPermissionsRepository"] }
+    ],
+    getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"],
+    getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],
+    getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"],
+    getReviewsForRun: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"
+    ],
+    getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"],
+    getSelfHostedRunnerForRepo: [
+      "GET /repos/{owner}/{repo}/actions/runners/{runner_id}"
+    ],
+    getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],
+    getWorkflowAccessToRepository: [
+      "GET /repos/{owner}/{repo}/actions/permissions/access"
+    ],
+    getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],
+    getWorkflowRunAttempt: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"
+    ],
+    getWorkflowRunUsage: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"
+    ],
+    getWorkflowUsage: [
+      "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"
+    ],
+    listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"],
+    listCustomImageVersionsForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions"
+    ],
+    listCustomImagesForOrg: [
+      "GET /orgs/{org}/actions/hosted-runners/images/custom"
+    ],
+    listEnvironmentSecrets: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets"
+    ],
+    listEnvironmentVariables: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/variables"
+    ],
+    listGithubHostedRunnersInGroupForOrg: [
+      "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners"
+    ],
+    listHostedRunnersForOrg: ["GET /orgs/{org}/actions/hosted-runners"],
+    listJobsForWorkflowRun: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"
+    ],
+    listJobsForWorkflowRunAttempt: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"
+    ],
+    listLabelsForSelfHostedRunnerForOrg: [
+      "GET /orgs/{org}/actions/runners/{runner_id}/labels"
+    ],
+    listLabelsForSelfHostedRunnerForRepo: [
+      "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
+    ],
+    listOrgSecrets: ["GET /orgs/{org}/actions/secrets"],
+    listOrgVariables: ["GET /orgs/{org}/actions/variables"],
+    listRepoOrganizationSecrets: [
+      "GET /repos/{owner}/{repo}/actions/organization-secrets"
+    ],
+    listRepoOrganizationVariables: [
+      "GET /repos/{owner}/{repo}/actions/organization-variables"
+    ],
+    listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"],
+    listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"],
+    listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"],
+    listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"],
+    listRunnerApplicationsForRepo: [
+      "GET /repos/{owner}/{repo}/actions/runners/downloads"
+    ],
+    listSelectedReposForOrgSecret: [
+      "GET /orgs/{org}/actions/secrets/{secret_name}/repositories"
+    ],
+    listSelectedReposForOrgVariable: [
+      "GET /orgs/{org}/actions/variables/{name}/repositories"
+    ],
+    listSelectedRepositoriesEnabledGithubActionsOrganization: [
+      "GET /orgs/{org}/actions/permissions/repositories"
+    ],
+    listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"],
+    listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"],
+    listWorkflowRunArtifacts: [
+      "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"
+    ],
+    listWorkflowRuns: [
+      "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"
+    ],
+    listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"],
+    reRunJobForWorkflowRun: [
+      "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"
+    ],
+    reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],
+    reRunWorkflowFailedJobs: [
+      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"
+    ],
+    removeAllCustomLabelsFromSelfHostedRunnerForOrg: [
+      "DELETE /orgs/{org}/actions/runners/{runner_id}/labels"
+    ],
+    removeAllCustomLabelsFromSelfHostedRunnerForRepo: [
+      "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
+    ],
+    removeCustomLabelFromSelfHostedRunnerForOrg: [
+      "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"
+    ],
+    removeCustomLabelFromSelfHostedRunnerForRepo: [
+      "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"
+    ],
+    removeSelectedRepoFromOrgSecret: [
+      "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    removeSelectedRepoFromOrgVariable: [
+      "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"
+    ],
+    reviewCustomGatesForRun: [
+      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"
+    ],
+    reviewPendingDeploymentsForRun: [
+      "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"
+    ],
+    setAllowedActionsOrganization: [
+      "PUT /orgs/{org}/actions/permissions/selected-actions"
+    ],
+    setAllowedActionsRepository: [
+      "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"
+    ],
+    setCustomLabelsForSelfHostedRunnerForOrg: [
+      "PUT /orgs/{org}/actions/runners/{runner_id}/labels"
+    ],
+    setCustomLabelsForSelfHostedRunnerForRepo: [
+      "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"
+    ],
+    setCustomOidcSubClaimForRepo: [
+      "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"
+    ],
+    setGithubActionsDefaultWorkflowPermissionsOrganization: [
+      "PUT /orgs/{org}/actions/permissions/workflow"
+    ],
+    setGithubActionsDefaultWorkflowPermissionsRepository: [
+      "PUT /repos/{owner}/{repo}/actions/permissions/workflow"
+    ],
+    setGithubActionsPermissionsOrganization: [
+      "PUT /orgs/{org}/actions/permissions"
+    ],
+    setGithubActionsPermissionsRepository: [
+      "PUT /repos/{owner}/{repo}/actions/permissions"
+    ],
+    setSelectedReposForOrgSecret: [
+      "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"
+    ],
+    setSelectedReposForOrgVariable: [
+      "PUT /orgs/{org}/actions/variables/{name}/repositories"
+    ],
+    setSelectedRepositoriesEnabledGithubActionsOrganization: [
+      "PUT /orgs/{org}/actions/permissions/repositories"
+    ],
+    setWorkflowAccessToRepository: [
+      "PUT /repos/{owner}/{repo}/actions/permissions/access"
+    ],
+    updateEnvironmentVariable: [
+      "PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"
+    ],
+    updateHostedRunnerForOrg: [
+      "PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"
+    ],
+    updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"],
+    updateRepoVariable: [
+      "PATCH /repos/{owner}/{repo}/actions/variables/{name}"
+    ]
+  },
+  activity: {
+    checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"],
+    deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"],
+    deleteThreadSubscription: [
+      "DELETE /notifications/threads/{thread_id}/subscription"
+    ],
+    getFeeds: ["GET /feeds"],
+    getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"],
+    getThread: ["GET /notifications/threads/{thread_id}"],
+    getThreadSubscriptionForAuthenticatedUser: [
+      "GET /notifications/threads/{thread_id}/subscription"
+    ],
+    listEventsForAuthenticatedUser: ["GET /users/{username}/events"],
+    listNotificationsForAuthenticatedUser: ["GET /notifications"],
+    listOrgEventsForAuthenticatedUser: [
+      "GET /users/{username}/events/orgs/{org}"
+    ],
+    listPublicEvents: ["GET /events"],
+    listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"],
+    listPublicEventsForUser: ["GET /users/{username}/events/public"],
+    listPublicOrgEvents: ["GET /orgs/{org}/events"],
+    listReceivedEventsForUser: ["GET /users/{username}/received_events"],
+    listReceivedPublicEventsForUser: [
+      "GET /users/{username}/received_events/public"
+    ],
+    listRepoEvents: ["GET /repos/{owner}/{repo}/events"],
+    listRepoNotificationsForAuthenticatedUser: [
+      "GET /repos/{owner}/{repo}/notifications"
+    ],
+    listReposStarredByAuthenticatedUser: ["GET /user/starred"],
+    listReposStarredByUser: ["GET /users/{username}/starred"],
+    listReposWatchedByUser: ["GET /users/{username}/subscriptions"],
+    listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"],
+    listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"],
+    listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"],
+    markNotificationsAsRead: ["PUT /notifications"],
+    markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"],
+    markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"],
+    markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"],
+    setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"],
+    setThreadSubscription: [
+      "PUT /notifications/threads/{thread_id}/subscription"
+    ],
+    starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"],
+    unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"]
+  },
+  apps: {
+    addRepoToInstallation: [
+      "PUT /user/installations/{installation_id}/repositories/{repository_id}",
+      {},
+      { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] }
+    ],
+    addRepoToInstallationForAuthenticatedUser: [
+      "PUT /user/installations/{installation_id}/repositories/{repository_id}"
+    ],
+    checkToken: ["POST /applications/{client_id}/token"],
+    createFromManifest: ["POST /app-manifests/{code}/conversions"],
+    createInstallationAccessToken: [
+      "POST /app/installations/{installation_id}/access_tokens"
+    ],
+    deleteAuthorization: ["DELETE /applications/{client_id}/grant"],
+    deleteInstallation: ["DELETE /app/installations/{installation_id}"],
+    deleteToken: ["DELETE /applications/{client_id}/token"],
+    getAuthenticated: ["GET /app"],
+    getBySlug: ["GET /apps/{app_slug}"],
+    getInstallation: ["GET /app/installations/{installation_id}"],
+    getOrgInstallation: ["GET /orgs/{org}/installation"],
+    getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"],
+    getSubscriptionPlanForAccount: [
+      "GET /marketplace_listing/accounts/{account_id}"
+    ],
+    getSubscriptionPlanForAccountStubbed: [
+      "GET /marketplace_listing/stubbed/accounts/{account_id}"
+    ],
+    getUserInstallation: ["GET /users/{username}/installation"],
+    getWebhookConfigForApp: ["GET /app/hook/config"],
+    getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],
+    listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"],
+    listAccountsForPlanStubbed: [
+      "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"
+    ],
+    listInstallationReposForAuthenticatedUser: [
+      "GET /user/installations/{installation_id}/repositories"
+    ],
+    listInstallationRequestsForAuthenticatedApp: [
+      "GET /app/installation-requests"
+    ],
+    listInstallations: ["GET /app/installations"],
+    listInstallationsForAuthenticatedUser: ["GET /user/installations"],
+    listPlans: ["GET /marketplace_listing/plans"],
+    listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"],
+    listReposAccessibleToInstallation: ["GET /installation/repositories"],
+    listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"],
+    listSubscriptionsForAuthenticatedUserStubbed: [
+      "GET /user/marketplace_purchases/stubbed"
+    ],
+    listWebhookDeliveries: ["GET /app/hook/deliveries"],
+    redeliverWebhookDelivery: [
+      "POST /app/hook/deliveries/{delivery_id}/attempts"
+    ],
+    removeRepoFromInstallation: [
+      "DELETE /user/installations/{installation_id}/repositories/{repository_id}",
+      {},
+      { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] }
+    ],
+    removeRepoFromInstallationForAuthenticatedUser: [
+      "DELETE /user/installations/{installation_id}/repositories/{repository_id}"
+    ],
+    resetToken: ["PATCH /applications/{client_id}/token"],
+    revokeInstallationAccessToken: ["DELETE /installation/token"],
+    scopeToken: ["POST /applications/{client_id}/token/scoped"],
+    suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"],
+    unsuspendInstallation: [
+      "DELETE /app/installations/{installation_id}/suspended"
+    ],
+    updateWebhookConfigForApp: ["PATCH /app/hook/config"]
+  },
+  billing: {
+    getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"],
+    getGithubActionsBillingUser: [
+      "GET /users/{username}/settings/billing/actions"
+    ],
+    getGithubBillingPremiumRequestUsageReportOrg: [
+      "GET /organizations/{org}/settings/billing/premium_request/usage"
+    ],
+    getGithubBillingPremiumRequestUsageReportUser: [
+      "GET /users/{username}/settings/billing/premium_request/usage"
+    ],
+    getGithubBillingUsageReportOrg: [
+      "GET /organizations/{org}/settings/billing/usage"
+    ],
+    getGithubBillingUsageReportUser: [
+      "GET /users/{username}/settings/billing/usage"
+    ],
+    getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],
+    getGithubPackagesBillingUser: [
+      "GET /users/{username}/settings/billing/packages"
+    ],
+    getSharedStorageBillingOrg: [
+      "GET /orgs/{org}/settings/billing/shared-storage"
+    ],
+    getSharedStorageBillingUser: [
+      "GET /users/{username}/settings/billing/shared-storage"
+    ]
+  },
+  campaigns: {
+    createCampaign: ["POST /orgs/{org}/campaigns"],
+    deleteCampaign: ["DELETE /orgs/{org}/campaigns/{campaign_number}"],
+    getCampaignSummary: ["GET /orgs/{org}/campaigns/{campaign_number}"],
+    listOrgCampaigns: ["GET /orgs/{org}/campaigns"],
+    updateCampaign: ["PATCH /orgs/{org}/campaigns/{campaign_number}"]
+  },
+  checks: {
+    create: ["POST /repos/{owner}/{repo}/check-runs"],
+    createSuite: ["POST /repos/{owner}/{repo}/check-suites"],
+    get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],
+    getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],
+    listAnnotations: [
+      "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"
+    ],
+    listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],
+    listForSuite: [
+      "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"
+    ],
+    listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],
+    rerequestRun: [
+      "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"
+    ],
+    rerequestSuite: [
+      "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"
+    ],
+    setSuitesPreferences: [
+      "PATCH /repos/{owner}/{repo}/check-suites/preferences"
+    ],
+    update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]
+  },
+  codeScanning: {
+    commitAutofix: [
+      "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits"
+    ],
+    createAutofix: [
+      "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"
+    ],
+    createVariantAnalysis: [
+      "POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses"
+    ],
+    deleteAnalysis: [
+      "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"
+    ],
+    deleteCodeqlDatabase: [
+      "DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"
+    ],
+    getAlert: [
+      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",
+      {},
+      { renamedParameters: { alert_id: "alert_number" } }
+    ],
+    getAnalysis: [
+      "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"
+    ],
+    getAutofix: [
+      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"
+    ],
+    getCodeqlDatabase: [
+      "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"
+    ],
+    getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"],
+    getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],
+    getVariantAnalysis: [
+      "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}"
+    ],
+    getVariantAnalysisRepoTask: [
+      "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}"
+    ],
+    listAlertInstances: [
+      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"
+    ],
+    listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],
+    listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],
+    listAlertsInstances: [
+      "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",
+      {},
+      { renamed: ["codeScanning", "listAlertInstances"] }
+    ],
+    listCodeqlDatabases: [
+      "GET /repos/{owner}/{repo}/code-scanning/codeql/databases"
+    ],
+    listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"],
+    updateAlert: [
+      "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"
+    ],
+    updateDefaultSetup: [
+      "PATCH /repos/{owner}/{repo}/code-scanning/default-setup"
+    ],
+    uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"]
+  },
+  codeSecurity: {
+    attachConfiguration: [
+      "POST /orgs/{org}/code-security/configurations/{configuration_id}/attach"
+    ],
+    attachEnterpriseConfiguration: [
+      "POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach"
+    ],
+    createConfiguration: ["POST /orgs/{org}/code-security/configurations"],
+    createConfigurationForEnterprise: [
+      "POST /enterprises/{enterprise}/code-security/configurations"
+    ],
+    deleteConfiguration: [
+      "DELETE /orgs/{org}/code-security/configurations/{configuration_id}"
+    ],
+    deleteConfigurationForEnterprise: [
+      "DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}"
+    ],
+    detachConfiguration: [
+      "DELETE /orgs/{org}/code-security/configurations/detach"
+    ],
+    getConfiguration: [
+      "GET /orgs/{org}/code-security/configurations/{configuration_id}"
+    ],
+    getConfigurationForRepository: [
+      "GET /repos/{owner}/{repo}/code-security-configuration"
+    ],
+    getConfigurationsForEnterprise: [
+      "GET /enterprises/{enterprise}/code-security/configurations"
+    ],
+    getConfigurationsForOrg: ["GET /orgs/{org}/code-security/configurations"],
+    getDefaultConfigurations: [
+      "GET /orgs/{org}/code-security/configurations/defaults"
+    ],
+    getDefaultConfigurationsForEnterprise: [
+      "GET /enterprises/{enterprise}/code-security/configurations/defaults"
+    ],
+    getRepositoriesForConfiguration: [
+      "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories"
+    ],
+    getRepositoriesForEnterpriseConfiguration: [
+      "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories"
+    ],
+    getSingleConfigurationForEnterprise: [
+      "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}"
+    ],
+    setConfigurationAsDefault: [
+      "PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults"
+    ],
+    setConfigurationAsDefaultForEnterprise: [
+      "PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults"
+    ],
+    updateConfiguration: [
+      "PATCH /orgs/{org}/code-security/configurations/{configuration_id}"
+    ],
+    updateEnterpriseConfiguration: [
+      "PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}"
+    ]
+  },
+  codesOfConduct: {
+    getAllCodesOfConduct: ["GET /codes_of_conduct"],
+    getConductCode: ["GET /codes_of_conduct/{key}"]
+  },
+  codespaces: {
+    addRepositoryForSecretForAuthenticatedUser: [
+      "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    addSelectedRepoToOrgSecret: [
+      "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    checkPermissionsForDevcontainer: [
+      "GET /repos/{owner}/{repo}/codespaces/permissions_check"
+    ],
+    codespaceMachinesForAuthenticatedUser: [
+      "GET /user/codespaces/{codespace_name}/machines"
+    ],
+    createForAuthenticatedUser: ["POST /user/codespaces"],
+    createOrUpdateOrgSecret: [
+      "PUT /orgs/{org}/codespaces/secrets/{secret_name}"
+    ],
+    createOrUpdateRepoSecret: [
+      "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"
+    ],
+    createOrUpdateSecretForAuthenticatedUser: [
+      "PUT /user/codespaces/secrets/{secret_name}"
+    ],
+    createWithPrForAuthenticatedUser: [
+      "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"
+    ],
+    createWithRepoForAuthenticatedUser: [
+      "POST /repos/{owner}/{repo}/codespaces"
+    ],
+    deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],
+    deleteFromOrganization: [
+      "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"
+    ],
+    deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],
+    deleteRepoSecret: [
+      "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"
+    ],
+    deleteSecretForAuthenticatedUser: [
+      "DELETE /user/codespaces/secrets/{secret_name}"
+    ],
+    exportForAuthenticatedUser: [
+      "POST /user/codespaces/{codespace_name}/exports"
+    ],
+    getCodespacesForUserInOrg: [
+      "GET /orgs/{org}/members/{username}/codespaces"
+    ],
+    getExportDetailsForAuthenticatedUser: [
+      "GET /user/codespaces/{codespace_name}/exports/{export_id}"
+    ],
+    getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],
+    getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"],
+    getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"],
+    getPublicKeyForAuthenticatedUser: [
+      "GET /user/codespaces/secrets/public-key"
+    ],
+    getRepoPublicKey: [
+      "GET /repos/{owner}/{repo}/codespaces/secrets/public-key"
+    ],
+    getRepoSecret: [
+      "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"
+    ],
+    getSecretForAuthenticatedUser: [
+      "GET /user/codespaces/secrets/{secret_name}"
+    ],
+    listDevcontainersInRepositoryForAuthenticatedUser: [
+      "GET /repos/{owner}/{repo}/codespaces/devcontainers"
+    ],
+    listForAuthenticatedUser: ["GET /user/codespaces"],
+    listInOrganization: [
+      "GET /orgs/{org}/codespaces",
+      {},
+      { renamedParameters: { org_id: "org" } }
+    ],
+    listInRepositoryForAuthenticatedUser: [
+      "GET /repos/{owner}/{repo}/codespaces"
+    ],
+    listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"],
+    listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],
+    listRepositoriesForSecretForAuthenticatedUser: [
+      "GET /user/codespaces/secrets/{secret_name}/repositories"
+    ],
+    listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],
+    listSelectedReposForOrgSecret: [
+      "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"
+    ],
+    preFlightWithRepoForAuthenticatedUser: [
+      "GET /repos/{owner}/{repo}/codespaces/new"
+    ],
+    publishForAuthenticatedUser: [
+      "POST /user/codespaces/{codespace_name}/publish"
+    ],
+    removeRepositoryForSecretForAuthenticatedUser: [
+      "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    removeSelectedRepoFromOrgSecret: [
+      "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    repoMachinesForAuthenticatedUser: [
+      "GET /repos/{owner}/{repo}/codespaces/machines"
+    ],
+    setRepositoriesForSecretForAuthenticatedUser: [
+      "PUT /user/codespaces/secrets/{secret_name}/repositories"
+    ],
+    setSelectedReposForOrgSecret: [
+      "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"
+    ],
+    startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],
+    stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],
+    stopInOrganization: [
+      "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"
+    ],
+    updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
+  },
+  copilot: {
+    addCopilotSeatsForTeams: [
+      "POST /orgs/{org}/copilot/billing/selected_teams"
+    ],
+    addCopilotSeatsForUsers: [
+      "POST /orgs/{org}/copilot/billing/selected_users"
+    ],
+    cancelCopilotSeatAssignmentForTeams: [
+      "DELETE /orgs/{org}/copilot/billing/selected_teams"
+    ],
+    cancelCopilotSeatAssignmentForUsers: [
+      "DELETE /orgs/{org}/copilot/billing/selected_users"
+    ],
+    copilotMetricsForOrganization: ["GET /orgs/{org}/copilot/metrics"],
+    copilotMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/metrics"],
+    getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"],
+    getCopilotSeatDetailsForUser: [
+      "GET /orgs/{org}/members/{username}/copilot"
+    ],
+    listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"]
+  },
+  credentials: { revoke: ["POST /credentials/revoke"] },
+  dependabot: {
+    addSelectedRepoToOrgSecret: [
+      "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    createOrUpdateOrgSecret: [
+      "PUT /orgs/{org}/dependabot/secrets/{secret_name}"
+    ],
+    createOrUpdateRepoSecret: [
+      "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"
+    ],
+    deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],
+    deleteRepoSecret: [
+      "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"
+    ],
+    getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],
+    getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],
+    getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],
+    getRepoPublicKey: [
+      "GET /repos/{owner}/{repo}/dependabot/secrets/public-key"
+    ],
+    getRepoSecret: [
+      "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"
+    ],
+    listAlertsForEnterprise: [
+      "GET /enterprises/{enterprise}/dependabot/alerts"
+    ],
+    listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"],
+    listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"],
+    listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],
+    listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],
+    listSelectedReposForOrgSecret: [
+      "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"
+    ],
+    removeSelectedRepoFromOrgSecret: [
+      "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
+    ],
+    repositoryAccessForOrg: [
+      "GET /organizations/{org}/dependabot/repository-access"
+    ],
+    setRepositoryAccessDefaultLevel: [
+      "PUT /organizations/{org}/dependabot/repository-access/default-level"
+    ],
+    setSelectedReposForOrgSecret: [
+      "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"
+    ],
+    updateAlert: [
+      "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"
+    ],
+    updateRepositoryAccessForOrg: [
+      "PATCH /organizations/{org}/dependabot/repository-access"
+    ]
+  },
+  dependencyGraph: {
+    createRepositorySnapshot: [
+      "POST /repos/{owner}/{repo}/dependency-graph/snapshots"
+    ],
+    diffRange: [
+      "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"
+    ],
+    exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"]
+  },
+  emojis: { get: ["GET /emojis"] },
+  enterpriseTeamMemberships: {
+    add: [
+      "PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"
+    ],
+    bulkAdd: [
+      "POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add"
+    ],
+    bulkRemove: [
+      "POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove"
+    ],
+    get: [
+      "GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"
+    ],
+    list: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships"],
+    remove: [
+      "DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"
+    ]
+  },
+  enterpriseTeamOrganizations: {
+    add: [
+      "PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"
+    ],
+    bulkAdd: [
+      "POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add"
+    ],
+    bulkRemove: [
+      "POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove"
+    ],
+    delete: [
+      "DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"
+    ],
+    getAssignment: [
+      "GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"
+    ],
+    getAssignments: [
+      "GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations"
+    ]
+  },
+  enterpriseTeams: {
+    create: ["POST /enterprises/{enterprise}/teams"],
+    delete: ["DELETE /enterprises/{enterprise}/teams/{team_slug}"],
+    get: ["GET /enterprises/{enterprise}/teams/{team_slug}"],
+    list: ["GET /enterprises/{enterprise}/teams"],
+    update: ["PATCH /enterprises/{enterprise}/teams/{team_slug}"]
+  },
+  gists: {
+    checkIsStarred: ["GET /gists/{gist_id}/star"],
+    create: ["POST /gists"],
+    createComment: ["POST /gists/{gist_id}/comments"],
+    delete: ["DELETE /gists/{gist_id}"],
+    deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"],
+    fork: ["POST /gists/{gist_id}/forks"],
+    get: ["GET /gists/{gist_id}"],
+    getComment: ["GET /gists/{gist_id}/comments/{comment_id}"],
+    getRevision: ["GET /gists/{gist_id}/{sha}"],
+    list: ["GET /gists"],
+    listComments: ["GET /gists/{gist_id}/comments"],
+    listCommits: ["GET /gists/{gist_id}/commits"],
+    listForUser: ["GET /users/{username}/gists"],
+    listForks: ["GET /gists/{gist_id}/forks"],
+    listPublic: ["GET /gists/public"],
+    listStarred: ["GET /gists/starred"],
+    star: ["PUT /gists/{gist_id}/star"],
+    unstar: ["DELETE /gists/{gist_id}/star"],
+    update: ["PATCH /gists/{gist_id}"],
+    updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"]
+  },
+  git: {
+    createBlob: ["POST /repos/{owner}/{repo}/git/blobs"],
+    createCommit: ["POST /repos/{owner}/{repo}/git/commits"],
+    createRef: ["POST /repos/{owner}/{repo}/git/refs"],
+    createTag: ["POST /repos/{owner}/{repo}/git/tags"],
+    createTree: ["POST /repos/{owner}/{repo}/git/trees"],
+    deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],
+    getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],
+    getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],
+    getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"],
+    getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],
+    getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],
+    listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],
+    updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]
+  },
+  gitignore: {
+    getAllTemplates: ["GET /gitignore/templates"],
+    getTemplate: ["GET /gitignore/templates/{name}"]
+  },
+  hostedCompute: {
+    createNetworkConfigurationForOrg: [
+      "POST /orgs/{org}/settings/network-configurations"
+    ],
+    deleteNetworkConfigurationFromOrg: [
+      "DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}"
+    ],
+    getNetworkConfigurationForOrg: [
+      "GET /orgs/{org}/settings/network-configurations/{network_configuration_id}"
+    ],
+    getNetworkSettingsForOrg: [
+      "GET /orgs/{org}/settings/network-settings/{network_settings_id}"
+    ],
+    listNetworkConfigurationsForOrg: [
+      "GET /orgs/{org}/settings/network-configurations"
+    ],
+    updateNetworkConfigurationForOrg: [
+      "PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}"
+    ]
+  },
+  interactions: {
+    getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],
+    getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],
+    getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"],
+    getRestrictionsForYourPublicRepos: [
+      "GET /user/interaction-limits",
+      {},
+      { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] }
+    ],
+    removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"],
+    removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"],
+    removeRestrictionsForRepo: [
+      "DELETE /repos/{owner}/{repo}/interaction-limits"
+    ],
+    removeRestrictionsForYourPublicRepos: [
+      "DELETE /user/interaction-limits",
+      {},
+      { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] }
+    ],
+    setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"],
+    setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"],
+    setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"],
+    setRestrictionsForYourPublicRepos: [
+      "PUT /user/interaction-limits",
+      {},
+      { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] }
+    ]
+  },
+  issues: {
+    addAssignees: [
+      "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"
+    ],
+    addBlockedByDependency: [
+      "POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"
+    ],
+    addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],
+    addSubIssue: [
+      "POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"
+    ],
+    checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"],
+    checkUserCanBeAssignedToIssue: [
+      "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"
+    ],
+    create: ["POST /repos/{owner}/{repo}/issues"],
+    createComment: [
+      "POST /repos/{owner}/{repo}/issues/{issue_number}/comments"
+    ],
+    createLabel: ["POST /repos/{owner}/{repo}/labels"],
+    createMilestone: ["POST /repos/{owner}/{repo}/milestones"],
+    deleteComment: [
+      "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"
+    ],
+    deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"],
+    deleteMilestone: [
+      "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"
+    ],
+    get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"],
+    getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],
+    getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],
+    getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],
+    getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],
+    getParent: ["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"],
+    list: ["GET /issues"],
+    listAssignees: ["GET /repos/{owner}/{repo}/assignees"],
+    listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],
+    listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],
+    listDependenciesBlockedBy: [
+      "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"
+    ],
+    listDependenciesBlocking: [
+      "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking"
+    ],
+    listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],
+    listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],
+    listEventsForTimeline: [
+      "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"
+    ],
+    listForAuthenticatedUser: ["GET /user/issues"],
+    listForOrg: ["GET /orgs/{org}/issues"],
+    listForRepo: ["GET /repos/{owner}/{repo}/issues"],
+    listLabelsForMilestone: [
+      "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"
+    ],
+    listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"],
+    listLabelsOnIssue: [
+      "GET /repos/{owner}/{repo}/issues/{issue_number}/labels"
+    ],
+    listMilestones: ["GET /repos/{owner}/{repo}/milestones"],
+    listSubIssues: [
+      "GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"
+    ],
+    lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],
+    removeAllLabels: [
+      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"
+    ],
+    removeAssignees: [
+      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"
+    ],
+    removeDependencyBlockedBy: [
+      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}"
+    ],
+    removeLabel: [
+      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"
+    ],
+    removeSubIssue: [
+      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue"
+    ],
+    reprioritizeSubIssue: [
+      "PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority"
+    ],
+    setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],
+    unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],
+    update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],
+    updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],
+    updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"],
+    updateMilestone: [
+      "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"
+    ]
+  },
+  licenses: {
+    get: ["GET /licenses/{license}"],
+    getAllCommonlyUsed: ["GET /licenses"],
+    getForRepo: ["GET /repos/{owner}/{repo}/license"]
+  },
+  markdown: {
+    render: ["POST /markdown"],
+    renderRaw: [
+      "POST /markdown/raw",
+      { headers: { "content-type": "text/plain; charset=utf-8" } }
+    ]
+  },
+  meta: {
+    get: ["GET /meta"],
+    getAllVersions: ["GET /versions"],
+    getOctocat: ["GET /octocat"],
+    getZen: ["GET /zen"],
+    root: ["GET /"]
+  },
+  migrations: {
+    deleteArchiveForAuthenticatedUser: [
+      "DELETE /user/migrations/{migration_id}/archive"
+    ],
+    deleteArchiveForOrg: [
+      "DELETE /orgs/{org}/migrations/{migration_id}/archive"
+    ],
+    downloadArchiveForOrg: [
+      "GET /orgs/{org}/migrations/{migration_id}/archive"
+    ],
+    getArchiveForAuthenticatedUser: [
+      "GET /user/migrations/{migration_id}/archive"
+    ],
+    getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"],
+    getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],
+    listForAuthenticatedUser: ["GET /user/migrations"],
+    listForOrg: ["GET /orgs/{org}/migrations"],
+    listReposForAuthenticatedUser: [
+      "GET /user/migrations/{migration_id}/repositories"
+    ],
+    listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],
+    listReposForUser: [
+      "GET /user/migrations/{migration_id}/repositories",
+      {},
+      { renamed: ["migrations", "listReposForAuthenticatedUser"] }
+    ],
+    startForAuthenticatedUser: ["POST /user/migrations"],
+    startForOrg: ["POST /orgs/{org}/migrations"],
+    unlockRepoForAuthenticatedUser: [
+      "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"
+    ],
+    unlockRepoForOrg: [
+      "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"
+    ]
+  },
+  oidc: {
+    getOidcCustomSubTemplateForOrg: [
+      "GET /orgs/{org}/actions/oidc/customization/sub"
+    ],
+    updateOidcCustomSubTemplateForOrg: [
+      "PUT /orgs/{org}/actions/oidc/customization/sub"
+    ]
+  },
+  orgs: {
+    addSecurityManagerTeam: [
+      "PUT /orgs/{org}/security-managers/teams/{team_slug}",
+      {},
+      {
+        deprecated: "octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team"
+      }
+    ],
+    assignTeamToOrgRole: [
+      "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"
+    ],
+    assignUserToOrgRole: [
+      "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"
+    ],
+    blockUser: ["PUT /orgs/{org}/blocks/{username}"],
+    cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"],
+    checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"],
+    checkMembershipForUser: ["GET /orgs/{org}/members/{username}"],
+    checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"],
+    convertMemberToOutsideCollaborator: [
+      "PUT /orgs/{org}/outside_collaborators/{username}"
+    ],
+    createArtifactStorageRecord: [
+      "POST /orgs/{org}/artifacts/metadata/storage-record"
+    ],
+    createInvitation: ["POST /orgs/{org}/invitations"],
+    createIssueType: ["POST /orgs/{org}/issue-types"],
+    createWebhook: ["POST /orgs/{org}/hooks"],
+    customPropertiesForOrgsCreateOrUpdateOrganizationValues: [
+      "PATCH /organizations/{org}/org-properties/values"
+    ],
+    customPropertiesForOrgsGetOrganizationValues: [
+      "GET /organizations/{org}/org-properties/values"
+    ],
+    customPropertiesForReposCreateOrUpdateOrganizationDefinition: [
+      "PUT /orgs/{org}/properties/schema/{custom_property_name}"
+    ],
+    customPropertiesForReposCreateOrUpdateOrganizationDefinitions: [
+      "PATCH /orgs/{org}/properties/schema"
+    ],
+    customPropertiesForReposCreateOrUpdateOrganizationValues: [
+      "PATCH /orgs/{org}/properties/values"
+    ],
+    customPropertiesForReposDeleteOrganizationDefinition: [
+      "DELETE /orgs/{org}/properties/schema/{custom_property_name}"
+    ],
+    customPropertiesForReposGetOrganizationDefinition: [
+      "GET /orgs/{org}/properties/schema/{custom_property_name}"
+    ],
+    customPropertiesForReposGetOrganizationDefinitions: [
+      "GET /orgs/{org}/properties/schema"
+    ],
+    customPropertiesForReposGetOrganizationValues: [
+      "GET /orgs/{org}/properties/values"
+    ],
+    delete: ["DELETE /orgs/{org}"],
+    deleteAttestationsBulk: ["POST /orgs/{org}/attestations/delete-request"],
+    deleteAttestationsById: [
+      "DELETE /orgs/{org}/attestations/{attestation_id}"
+    ],
+    deleteAttestationsBySubjectDigest: [
+      "DELETE /orgs/{org}/attestations/digest/{subject_digest}"
+    ],
+    deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"],
+    deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
+    disableSelectedRepositoryImmutableReleasesOrganization: [
+      "DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}"
+    ],
+    enableSelectedRepositoryImmutableReleasesOrganization: [
+      "PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}"
+    ],
+    get: ["GET /orgs/{org}"],
+    getImmutableReleasesSettings: [
+      "GET /orgs/{org}/settings/immutable-releases"
+    ],
+    getImmutableReleasesSettingsRepositories: [
+      "GET /orgs/{org}/settings/immutable-releases/repositories"
+    ],
+    getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],
+    getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],
+    getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"],
+    getOrgRulesetHistory: ["GET /orgs/{org}/rulesets/{ruleset_id}/history"],
+    getOrgRulesetVersion: [
+      "GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}"
+    ],
+    getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],
+    getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],
+    getWebhookDelivery: [
+      "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"
+    ],
+    list: ["GET /organizations"],
+    listAppInstallations: ["GET /orgs/{org}/installations"],
+    listArtifactStorageRecords: [
+      "GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records"
+    ],
+    listAttestationRepositories: ["GET /orgs/{org}/attestations/repositories"],
+    listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"],
+    listAttestationsBulk: [
+      "POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"
+    ],
+    listBlockedUsers: ["GET /orgs/{org}/blocks"],
+    listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],
+    listForAuthenticatedUser: ["GET /user/orgs"],
+    listForUser: ["GET /users/{username}/orgs"],
+    listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],
+    listIssueTypes: ["GET /orgs/{org}/issue-types"],
+    listMembers: ["GET /orgs/{org}/members"],
+    listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],
+    listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"],
+    listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"],
+    listOrgRoles: ["GET /orgs/{org}/organization-roles"],
+    listOrganizationFineGrainedPermissions: [
+      "GET /orgs/{org}/organization-fine-grained-permissions"
+    ],
+    listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"],
+    listPatGrantRepositories: [
+      "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"
+    ],
+    listPatGrantRequestRepositories: [
+      "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"
+    ],
+    listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"],
+    listPatGrants: ["GET /orgs/{org}/personal-access-tokens"],
+    listPendingInvitations: ["GET /orgs/{org}/invitations"],
+    listPublicMembers: ["GET /orgs/{org}/public_members"],
+    listSecurityManagerTeams: [
+      "GET /orgs/{org}/security-managers",
+      {},
+      {
+        deprecated: "octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams"
+      }
+    ],
+    listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
+    listWebhooks: ["GET /orgs/{org}/hooks"],
+    pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
+    redeliverWebhookDelivery: [
+      "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"
+    ],
+    removeMember: ["DELETE /orgs/{org}/members/{username}"],
+    removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"],
+    removeOutsideCollaborator: [
+      "DELETE /orgs/{org}/outside_collaborators/{username}"
+    ],
+    removePublicMembershipForAuthenticatedUser: [
+      "DELETE /orgs/{org}/public_members/{username}"
+    ],
+    removeSecurityManagerTeam: [
+      "DELETE /orgs/{org}/security-managers/teams/{team_slug}",
+      {},
+      {
+        deprecated: "octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team"
+      }
+    ],
+    reviewPatGrantRequest: [
+      "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"
+    ],
+    reviewPatGrantRequestsInBulk: [
+      "POST /orgs/{org}/personal-access-token-requests"
+    ],
+    revokeAllOrgRolesTeam: [
+      "DELETE /orgs/{org}/organization-roles/teams/{team_slug}"
+    ],
+    revokeAllOrgRolesUser: [
+      "DELETE /orgs/{org}/organization-roles/users/{username}"
+    ],
+    revokeOrgRoleTeam: [
+      "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"
+    ],
+    revokeOrgRoleUser: [
+      "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"
+    ],
+    setImmutableReleasesSettings: [
+      "PUT /orgs/{org}/settings/immutable-releases"
+    ],
+    setImmutableReleasesSettingsRepositories: [
+      "PUT /orgs/{org}/settings/immutable-releases/repositories"
+    ],
+    setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],
+    setPublicMembershipForAuthenticatedUser: [
+      "PUT /orgs/{org}/public_members/{username}"
+    ],
+    unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],
+    update: ["PATCH /orgs/{org}"],
+    updateIssueType: ["PUT /orgs/{org}/issue-types/{issue_type_id}"],
+    updateMembershipForAuthenticatedUser: [
+      "PATCH /user/memberships/orgs/{org}"
+    ],
+    updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"],
+    updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"],
+    updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"],
+    updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"]
+  },
+  packages: {
+    deletePackageForAuthenticatedUser: [
+      "DELETE /user/packages/{package_type}/{package_name}"
+    ],
+    deletePackageForOrg: [
+      "DELETE /orgs/{org}/packages/{package_type}/{package_name}"
+    ],
+    deletePackageForUser: [
+      "DELETE /users/{username}/packages/{package_type}/{package_name}"
+    ],
+    deletePackageVersionForAuthenticatedUser: [
+      "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"
+    ],
+    deletePackageVersionForOrg: [
+      "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"
+    ],
+    deletePackageVersionForUser: [
+      "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"
+    ],
+    getAllPackageVersionsForAPackageOwnedByAnOrg: [
+      "GET /orgs/{org}/packages/{package_type}/{package_name}/versions",
+      {},
+      { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] }
+    ],
+    getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [
+      "GET /user/packages/{package_type}/{package_name}/versions",
+      {},
+      {
+        renamed: [
+          "packages",
+          "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"
+        ]
+      }
+    ],
+    getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [
+      "GET /user/packages/{package_type}/{package_name}/versions"
+    ],
+    getAllPackageVersionsForPackageOwnedByOrg: [
+      "GET /orgs/{org}/packages/{package_type}/{package_name}/versions"
+    ],
+    getAllPackageVersionsForPackageOwnedByUser: [
+      "GET /users/{username}/packages/{package_type}/{package_name}/versions"
+    ],
+    getPackageForAuthenticatedUser: [
+      "GET /user/packages/{package_type}/{package_name}"
+    ],
+    getPackageForOrganization: [
+      "GET /orgs/{org}/packages/{package_type}/{package_name}"
+    ],
+    getPackageForUser: [
+      "GET /users/{username}/packages/{package_type}/{package_name}"
+    ],
+    getPackageVersionForAuthenticatedUser: [
+      "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"
+    ],
+    getPackageVersionForOrganization: [
+      "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"
+    ],
+    getPackageVersionForUser: [
+      "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"
+    ],
+    listDockerMigrationConflictingPackagesForAuthenticatedUser: [
+      "GET /user/docker/conflicts"
+    ],
+    listDockerMigrationConflictingPackagesForOrganization: [
+      "GET /orgs/{org}/docker/conflicts"
+    ],
+    listDockerMigrationConflictingPackagesForUser: [
+      "GET /users/{username}/docker/conflicts"
+    ],
+    listPackagesForAuthenticatedUser: ["GET /user/packages"],
+    listPackagesForOrganization: ["GET /orgs/{org}/packages"],
+    listPackagesForUser: ["GET /users/{username}/packages"],
+    restorePackageForAuthenticatedUser: [
+      "POST /user/packages/{package_type}/{package_name}/restore{?token}"
+    ],
+    restorePackageForOrg: [
+      "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"
+    ],
+    restorePackageForUser: [
+      "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"
+    ],
+    restorePackageVersionForAuthenticatedUser: [
+      "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"
+    ],
+    restorePackageVersionForOrg: [
+      "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"
+    ],
+    restorePackageVersionForUser: [
+      "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"
+    ]
+  },
+  privateRegistries: {
+    createOrgPrivateRegistry: ["POST /orgs/{org}/private-registries"],
+    deleteOrgPrivateRegistry: [
+      "DELETE /orgs/{org}/private-registries/{secret_name}"
+    ],
+    getOrgPrivateRegistry: ["GET /orgs/{org}/private-registries/{secret_name}"],
+    getOrgPublicKey: ["GET /orgs/{org}/private-registries/public-key"],
+    listOrgPrivateRegistries: ["GET /orgs/{org}/private-registries"],
+    updateOrgPrivateRegistry: [
+      "PATCH /orgs/{org}/private-registries/{secret_name}"
+    ]
+  },
+  projects: {
+    addItemForOrg: ["POST /orgs/{org}/projectsV2/{project_number}/items"],
+    addItemForUser: [
+      "POST /users/{username}/projectsV2/{project_number}/items"
+    ],
+    deleteItemForOrg: [
+      "DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"
+    ],
+    deleteItemForUser: [
+      "DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}"
+    ],
+    getFieldForOrg: [
+      "GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"
+    ],
+    getFieldForUser: [
+      "GET /users/{username}/projectsV2/{project_number}/fields/{field_id}"
+    ],
+    getForOrg: ["GET /orgs/{org}/projectsV2/{project_number}"],
+    getForUser: ["GET /users/{username}/projectsV2/{project_number}"],
+    getOrgItem: ["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],
+    getUserItem: [
+      "GET /users/{username}/projectsV2/{project_number}/items/{item_id}"
+    ],
+    listFieldsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields"],
+    listFieldsForUser: [
+      "GET /users/{username}/projectsV2/{project_number}/fields"
+    ],
+    listForOrg: ["GET /orgs/{org}/projectsV2"],
+    listForUser: ["GET /users/{username}/projectsV2"],
+    listItemsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/items"],
+    listItemsForUser: [
+      "GET /users/{username}/projectsV2/{project_number}/items"
+    ],
+    updateItemForOrg: [
+      "PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"
+    ],
+    updateItemForUser: [
+      "PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}"
+    ]
+  },
+  pulls: {
+    checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
+    create: ["POST /repos/{owner}/{repo}/pulls"],
+    createReplyForReviewComment: [
+      "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"
+    ],
+    createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],
+    createReviewComment: [
+      "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"
+    ],
+    deletePendingReview: [
+      "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"
+    ],
+    deleteReviewComment: [
+      "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"
+    ],
+    dismissReview: [
+      "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"
+    ],
+    get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"],
+    getReview: [
+      "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"
+    ],
+    getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],
+    list: ["GET /repos/{owner}/{repo}/pulls"],
+    listCommentsForReview: [
+      "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"
+    ],
+    listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],
+    listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],
+    listRequestedReviewers: [
+      "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"
+    ],
+    listReviewComments: [
+      "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"
+    ],
+    listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"],
+    listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],
+    merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
+    removeRequestedReviewers: [
+      "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"
+    ],
+    requestReviewers: [
+      "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"
+    ],
+    submitReview: [
+      "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"
+    ],
+    update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],
+    updateBranch: [
+      "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"
+    ],
+    updateReview: [
+      "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"
+    ],
+    updateReviewComment: [
+      "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"
+    ]
+  },
+  rateLimit: { get: ["GET /rate_limit"] },
+  reactions: {
+    createForCommitComment: [
+      "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"
+    ],
+    createForIssue: [
+      "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"
+    ],
+    createForIssueComment: [
+      "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"
+    ],
+    createForPullRequestReviewComment: [
+      "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"
+    ],
+    createForRelease: [
+      "POST /repos/{owner}/{repo}/releases/{release_id}/reactions"
+    ],
+    createForTeamDiscussionCommentInOrg: [
+      "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"
+    ],
+    createForTeamDiscussionInOrg: [
+      "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"
+    ],
+    deleteForCommitComment: [
+      "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"
+    ],
+    deleteForIssue: [
+      "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"
+    ],
+    deleteForIssueComment: [
+      "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"
+    ],
+    deleteForPullRequestComment: [
+      "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"
+    ],
+    deleteForRelease: [
+      "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"
+    ],
+    deleteForTeamDiscussion: [
+      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"
+    ],
+    deleteForTeamDiscussionComment: [
+      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"
+    ],
+    listForCommitComment: [
+      "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"
+    ],
+    listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
+    listForIssueComment: [
+      "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"
+    ],
+    listForPullRequestReviewComment: [
+      "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"
+    ],
+    listForRelease: [
+      "GET /repos/{owner}/{repo}/releases/{release_id}/reactions"
+    ],
+    listForTeamDiscussionCommentInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"
+    ],
+    listForTeamDiscussionInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"
+    ]
+  },
+  repos: {
+    acceptInvitation: [
+      "PATCH /user/repository_invitations/{invitation_id}",
+      {},
+      { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] }
+    ],
+    acceptInvitationForAuthenticatedUser: [
+      "PATCH /user/repository_invitations/{invitation_id}"
+    ],
+    addAppAccessRestrictions: [
+      "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",
+      {},
+      { mapToData: "apps" }
+    ],
+    addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"],
+    addStatusCheckContexts: [
+      "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",
+      {},
+      { mapToData: "contexts" }
+    ],
+    addTeamAccessRestrictions: [
+      "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",
+      {},
+      { mapToData: "teams" }
+    ],
+    addUserAccessRestrictions: [
+      "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",
+      {},
+      { mapToData: "users" }
+    ],
+    cancelPagesDeployment: [
+      "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel"
+    ],
+    checkAutomatedSecurityFixes: [
+      "GET /repos/{owner}/{repo}/automated-security-fixes"
+    ],
+    checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"],
+    checkImmutableReleases: ["GET /repos/{owner}/{repo}/immutable-releases"],
+    checkPrivateVulnerabilityReporting: [
+      "GET /repos/{owner}/{repo}/private-vulnerability-reporting"
+    ],
+    checkVulnerabilityAlerts: [
+      "GET /repos/{owner}/{repo}/vulnerability-alerts"
+    ],
+    codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],
+    compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],
+    compareCommitsWithBasehead: [
+      "GET /repos/{owner}/{repo}/compare/{basehead}"
+    ],
+    createAttestation: ["POST /repos/{owner}/{repo}/attestations"],
+    createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],
+    createCommitComment: [
+      "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"
+    ],
+    createCommitSignatureProtection: [
+      "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"
+    ],
+    createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],
+    createDeployKey: ["POST /repos/{owner}/{repo}/keys"],
+    createDeployment: ["POST /repos/{owner}/{repo}/deployments"],
+    createDeploymentBranchPolicy: [
+      "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"
+    ],
+    createDeploymentProtectionRule: [
+      "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"
+    ],
+    createDeploymentStatus: [
+      "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"
+    ],
+    createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"],
+    createForAuthenticatedUser: ["POST /user/repos"],
+    createFork: ["POST /repos/{owner}/{repo}/forks"],
+    createInOrg: ["POST /orgs/{org}/repos"],
+    createOrUpdateEnvironment: [
+      "PUT /repos/{owner}/{repo}/environments/{environment_name}"
+    ],
+    createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"],
+    createOrgRuleset: ["POST /orgs/{org}/rulesets"],
+    createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"],
+    createPagesSite: ["POST /repos/{owner}/{repo}/pages"],
+    createRelease: ["POST /repos/{owner}/{repo}/releases"],
+    createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"],
+    createUsingTemplate: [
+      "POST /repos/{template_owner}/{template_repo}/generate"
+    ],
+    createWebhook: ["POST /repos/{owner}/{repo}/hooks"],
+    customPropertiesForReposCreateOrUpdateRepositoryValues: [
+      "PATCH /repos/{owner}/{repo}/properties/values"
+    ],
+    customPropertiesForReposGetRepositoryValues: [
+      "GET /repos/{owner}/{repo}/properties/values"
+    ],
+    declineInvitation: [
+      "DELETE /user/repository_invitations/{invitation_id}",
+      {},
+      { renamed: ["repos", "declineInvitationForAuthenticatedUser"] }
+    ],
+    declineInvitationForAuthenticatedUser: [
+      "DELETE /user/repository_invitations/{invitation_id}"
+    ],
+    delete: ["DELETE /repos/{owner}/{repo}"],
+    deleteAccessRestrictions: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"
+    ],
+    deleteAdminBranchProtection: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"
+    ],
+    deleteAnEnvironment: [
+      "DELETE /repos/{owner}/{repo}/environments/{environment_name}"
+    ],
+    deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],
+    deleteBranchProtection: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection"
+    ],
+    deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],
+    deleteCommitSignatureProtection: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"
+    ],
+    deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],
+    deleteDeployment: [
+      "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"
+    ],
+    deleteDeploymentBranchPolicy: [
+      "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"
+    ],
+    deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],
+    deleteInvitation: [
+      "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"
+    ],
+    deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"],
+    deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],
+    deletePullRequestReviewProtection: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"
+    ],
+    deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"],
+    deleteReleaseAsset: [
+      "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"
+    ],
+    deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
+    deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],
+    disableAutomatedSecurityFixes: [
+      "DELETE /repos/{owner}/{repo}/automated-security-fixes"
+    ],
+    disableDeploymentProtectionRule: [
+      "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"
+    ],
+    disableImmutableReleases: [
+      "DELETE /repos/{owner}/{repo}/immutable-releases"
+    ],
+    disablePrivateVulnerabilityReporting: [
+      "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"
+    ],
+    disableVulnerabilityAlerts: [
+      "DELETE /repos/{owner}/{repo}/vulnerability-alerts"
+    ],
+    downloadArchive: [
+      "GET /repos/{owner}/{repo}/zipball/{ref}",
+      {},
+      { renamed: ["repos", "downloadZipballArchive"] }
+    ],
+    downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"],
+    downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"],
+    enableAutomatedSecurityFixes: [
+      "PUT /repos/{owner}/{repo}/automated-security-fixes"
+    ],
+    enableImmutableReleases: ["PUT /repos/{owner}/{repo}/immutable-releases"],
+    enablePrivateVulnerabilityReporting: [
+      "PUT /repos/{owner}/{repo}/private-vulnerability-reporting"
+    ],
+    enableVulnerabilityAlerts: [
+      "PUT /repos/{owner}/{repo}/vulnerability-alerts"
+    ],
+    generateReleaseNotes: [
+      "POST /repos/{owner}/{repo}/releases/generate-notes"
+    ],
+    get: ["GET /repos/{owner}/{repo}"],
+    getAccessRestrictions: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"
+    ],
+    getAdminBranchProtection: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"
+    ],
+    getAllDeploymentProtectionRules: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"
+    ],
+    getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"],
+    getAllStatusCheckContexts: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"
+    ],
+    getAllTopics: ["GET /repos/{owner}/{repo}/topics"],
+    getAppsWithAccessToProtectedBranch: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"
+    ],
+    getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],
+    getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"],
+    getBranchProtection: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection"
+    ],
+    getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"],
+    getClones: ["GET /repos/{owner}/{repo}/traffic/clones"],
+    getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"],
+    getCollaboratorPermissionLevel: [
+      "GET /repos/{owner}/{repo}/collaborators/{username}/permission"
+    ],
+    getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"],
+    getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"],
+    getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"],
+    getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"],
+    getCommitSignatureProtection: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"
+    ],
+    getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"],
+    getContent: ["GET /repos/{owner}/{repo}/contents/{path}"],
+    getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"],
+    getCustomDeploymentProtectionRule: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"
+    ],
+    getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"],
+    getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],
+    getDeploymentBranchPolicy: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"
+    ],
+    getDeploymentStatus: [
+      "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"
+    ],
+    getEnvironment: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}"
+    ],
+    getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"],
+    getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"],
+    getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],
+    getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"],
+    getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"],
+    getOrgRulesets: ["GET /orgs/{org}/rulesets"],
+    getPages: ["GET /repos/{owner}/{repo}/pages"],
+    getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],
+    getPagesDeployment: [
+      "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"
+    ],
+    getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"],
+    getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"],
+    getPullRequestReviewProtection: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"
+    ],
+    getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"],
+    getReadme: ["GET /repos/{owner}/{repo}/readme"],
+    getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"],
+    getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"],
+    getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],
+    getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"],
+    getRepoRuleSuite: [
+      "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"
+    ],
+    getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"],
+    getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
+    getRepoRulesetHistory: [
+      "GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history"
+    ],
+    getRepoRulesetVersion: [
+      "GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}"
+    ],
+    getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"],
+    getStatusChecksProtection: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
+    ],
+    getTeamsWithAccessToProtectedBranch: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"
+    ],
+    getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"],
+    getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"],
+    getUsersWithAccessToProtectedBranch: [
+      "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"
+    ],
+    getViews: ["GET /repos/{owner}/{repo}/traffic/views"],
+    getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"],
+    getWebhookConfigForRepo: [
+      "GET /repos/{owner}/{repo}/hooks/{hook_id}/config"
+    ],
+    getWebhookDelivery: [
+      "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"
+    ],
+    listActivities: ["GET /repos/{owner}/{repo}/activity"],
+    listAttestations: [
+      "GET /repos/{owner}/{repo}/attestations/{subject_digest}"
+    ],
+    listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],
+    listBranches: ["GET /repos/{owner}/{repo}/branches"],
+    listBranchesForHeadCommit: [
+      "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"
+    ],
+    listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"],
+    listCommentsForCommit: [
+      "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"
+    ],
+    listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"],
+    listCommitStatusesForRef: [
+      "GET /repos/{owner}/{repo}/commits/{ref}/statuses"
+    ],
+    listCommits: ["GET /repos/{owner}/{repo}/commits"],
+    listContributors: ["GET /repos/{owner}/{repo}/contributors"],
+    listCustomDeploymentRuleIntegrations: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"
+    ],
+    listDeployKeys: ["GET /repos/{owner}/{repo}/keys"],
+    listDeploymentBranchPolicies: [
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"
+    ],
+    listDeploymentStatuses: [
+      "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"
+    ],
+    listDeployments: ["GET /repos/{owner}/{repo}/deployments"],
+    listForAuthenticatedUser: ["GET /user/repos"],
+    listForOrg: ["GET /orgs/{org}/repos"],
+    listForUser: ["GET /users/{username}/repos"],
+    listForks: ["GET /repos/{owner}/{repo}/forks"],
+    listInvitations: ["GET /repos/{owner}/{repo}/invitations"],
+    listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"],
+    listLanguages: ["GET /repos/{owner}/{repo}/languages"],
+    listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"],
+    listPublic: ["GET /repositories"],
+    listPullRequestsAssociatedWithCommit: [
+      "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"
+    ],
+    listReleaseAssets: [
+      "GET /repos/{owner}/{repo}/releases/{release_id}/assets"
+    ],
+    listReleases: ["GET /repos/{owner}/{repo}/releases"],
+    listTags: ["GET /repos/{owner}/{repo}/tags"],
+    listTeams: ["GET /repos/{owner}/{repo}/teams"],
+    listWebhookDeliveries: [
+      "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"
+    ],
+    listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],
+    merge: ["POST /repos/{owner}/{repo}/merges"],
+    mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],
+    pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],
+    redeliverWebhookDelivery: [
+      "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"
+    ],
+    removeAppAccessRestrictions: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",
+      {},
+      { mapToData: "apps" }
+    ],
+    removeCollaborator: [
+      "DELETE /repos/{owner}/{repo}/collaborators/{username}"
+    ],
+    removeStatusCheckContexts: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",
+      {},
+      { mapToData: "contexts" }
+    ],
+    removeStatusCheckProtection: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
+    ],
+    removeTeamAccessRestrictions: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",
+      {},
+      { mapToData: "teams" }
+    ],
+    removeUserAccessRestrictions: [
+      "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",
+      {},
+      { mapToData: "users" }
+    ],
+    renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"],
+    replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"],
+    requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"],
+    setAdminBranchProtection: [
+      "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"
+    ],
+    setAppAccessRestrictions: [
+      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",
+      {},
+      { mapToData: "apps" }
+    ],
+    setStatusCheckContexts: [
+      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",
+      {},
+      { mapToData: "contexts" }
+    ],
+    setTeamAccessRestrictions: [
+      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",
+      {},
+      { mapToData: "teams" }
+    ],
+    setUserAccessRestrictions: [
+      "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",
+      {},
+      { mapToData: "users" }
+    ],
+    testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],
+    transfer: ["POST /repos/{owner}/{repo}/transfer"],
+    update: ["PATCH /repos/{owner}/{repo}"],
+    updateBranchProtection: [
+      "PUT /repos/{owner}/{repo}/branches/{branch}/protection"
+    ],
+    updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],
+    updateDeploymentBranchPolicy: [
+      "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"
+    ],
+    updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"],
+    updateInvitation: [
+      "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"
+    ],
+    updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"],
+    updatePullRequestReviewProtection: [
+      "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"
+    ],
+    updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"],
+    updateReleaseAsset: [
+      "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"
+    ],
+    updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
+    updateStatusCheckPotection: [
+      "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",
+      {},
+      { renamed: ["repos", "updateStatusCheckProtection"] }
+    ],
+    updateStatusCheckProtection: [
+      "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
+    ],
+    updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],
+    updateWebhookConfigForRepo: [
+      "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"
+    ],
+    uploadReleaseAsset: [
+      "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",
+      { baseUrl: "https://uploads.github.com" }
+    ]
+  },
+  search: {
+    code: ["GET /search/code"],
+    commits: ["GET /search/commits"],
+    issuesAndPullRequests: ["GET /search/issues"],
+    labels: ["GET /search/labels"],
+    repos: ["GET /search/repositories"],
+    topics: ["GET /search/topics"],
+    users: ["GET /search/users"]
+  },
+  secretScanning: {
+    createPushProtectionBypass: [
+      "POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses"
+    ],
+    getAlert: [
+      "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"
+    ],
+    getScanHistory: ["GET /repos/{owner}/{repo}/secret-scanning/scan-history"],
+    listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],
+    listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],
+    listLocationsForAlert: [
+      "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"
+    ],
+    listOrgPatternConfigs: [
+      "GET /orgs/{org}/secret-scanning/pattern-configurations"
+    ],
+    updateAlert: [
+      "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"
+    ],
+    updateOrgPatternConfigs: [
+      "PATCH /orgs/{org}/secret-scanning/pattern-configurations"
+    ]
+  },
+  securityAdvisories: {
+    createFork: [
+      "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"
+    ],
+    createPrivateVulnerabilityReport: [
+      "POST /repos/{owner}/{repo}/security-advisories/reports"
+    ],
+    createRepositoryAdvisory: [
+      "POST /repos/{owner}/{repo}/security-advisories"
+    ],
+    createRepositoryAdvisoryCveRequest: [
+      "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"
+    ],
+    getGlobalAdvisory: ["GET /advisories/{ghsa_id}"],
+    getRepositoryAdvisory: [
+      "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"
+    ],
+    listGlobalAdvisories: ["GET /advisories"],
+    listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"],
+    listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"],
+    updateRepositoryAdvisory: [
+      "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"
+    ]
+  },
+  teams: {
+    addOrUpdateMembershipForUserInOrg: [
+      "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"
+    ],
+    addOrUpdateRepoPermissionsInOrg: [
+      "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
+    ],
+    checkPermissionsForRepoInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
+    ],
+    create: ["POST /orgs/{org}/teams"],
+    createDiscussionCommentInOrg: [
+      "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"
+    ],
+    createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"],
+    deleteDiscussionCommentInOrg: [
+      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"
+    ],
+    deleteDiscussionInOrg: [
+      "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"
+    ],
+    deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"],
+    getByName: ["GET /orgs/{org}/teams/{team_slug}"],
+    getDiscussionCommentInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"
+    ],
+    getDiscussionInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"
+    ],
+    getMembershipForUserInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/memberships/{username}"
+    ],
+    list: ["GET /orgs/{org}/teams"],
+    listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"],
+    listDiscussionCommentsInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"
+    ],
+    listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"],
+    listForAuthenticatedUser: ["GET /user/teams"],
+    listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"],
+    listPendingInvitationsInOrg: [
+      "GET /orgs/{org}/teams/{team_slug}/invitations"
+    ],
+    listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],
+    removeMembershipForUserInOrg: [
+      "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"
+    ],
+    removeRepoInOrg: [
+      "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
+    ],
+    updateDiscussionCommentInOrg: [
+      "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"
+    ],
+    updateDiscussionInOrg: [
+      "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"
+    ],
+    updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"]
+  },
+  users: {
+    addEmailForAuthenticated: [
+      "POST /user/emails",
+      {},
+      { renamed: ["users", "addEmailForAuthenticatedUser"] }
+    ],
+    addEmailForAuthenticatedUser: ["POST /user/emails"],
+    addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"],
+    block: ["PUT /user/blocks/{username}"],
+    checkBlocked: ["GET /user/blocks/{username}"],
+    checkFollowingForUser: ["GET /users/{username}/following/{target_user}"],
+    checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"],
+    createGpgKeyForAuthenticated: [
+      "POST /user/gpg_keys",
+      {},
+      { renamed: ["users", "createGpgKeyForAuthenticatedUser"] }
+    ],
+    createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],
+    createPublicSshKeyForAuthenticated: [
+      "POST /user/keys",
+      {},
+      { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] }
+    ],
+    createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
+    createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],
+    deleteAttestationsBulk: [
+      "POST /users/{username}/attestations/delete-request"
+    ],
+    deleteAttestationsById: [
+      "DELETE /users/{username}/attestations/{attestation_id}"
+    ],
+    deleteAttestationsBySubjectDigest: [
+      "DELETE /users/{username}/attestations/digest/{subject_digest}"
+    ],
+    deleteEmailForAuthenticated: [
+      "DELETE /user/emails",
+      {},
+      { renamed: ["users", "deleteEmailForAuthenticatedUser"] }
+    ],
+    deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],
+    deleteGpgKeyForAuthenticated: [
+      "DELETE /user/gpg_keys/{gpg_key_id}",
+      {},
+      { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] }
+    ],
+    deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],
+    deletePublicSshKeyForAuthenticated: [
+      "DELETE /user/keys/{key_id}",
+      {},
+      { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] }
+    ],
+    deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],
+    deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"],
+    deleteSshSigningKeyForAuthenticatedUser: [
+      "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"
+    ],
+    follow: ["PUT /user/following/{username}"],
+    getAuthenticated: ["GET /user"],
+    getById: ["GET /user/{account_id}"],
+    getByUsername: ["GET /users/{username}"],
+    getContextForUser: ["GET /users/{username}/hovercard"],
+    getGpgKeyForAuthenticated: [
+      "GET /user/gpg_keys/{gpg_key_id}",
+      {},
+      { renamed: ["users", "getGpgKeyForAuthenticatedUser"] }
+    ],
+    getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],
+    getPublicSshKeyForAuthenticated: [
+      "GET /user/keys/{key_id}",
+      {},
+      { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] }
+    ],
+    getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],
+    getSshSigningKeyForAuthenticatedUser: [
+      "GET /user/ssh_signing_keys/{ssh_signing_key_id}"
+    ],
+    list: ["GET /users"],
+    listAttestations: ["GET /users/{username}/attestations/{subject_digest}"],
+    listAttestationsBulk: [
+      "POST /users/{username}/attestations/bulk-list{?per_page,before,after}"
+    ],
+    listBlockedByAuthenticated: [
+      "GET /user/blocks",
+      {},
+      { renamed: ["users", "listBlockedByAuthenticatedUser"] }
+    ],
+    listBlockedByAuthenticatedUser: ["GET /user/blocks"],
+    listEmailsForAuthenticated: [
+      "GET /user/emails",
+      {},
+      { renamed: ["users", "listEmailsForAuthenticatedUser"] }
+    ],
+    listEmailsForAuthenticatedUser: ["GET /user/emails"],
+    listFollowedByAuthenticated: [
+      "GET /user/following",
+      {},
+      { renamed: ["users", "listFollowedByAuthenticatedUser"] }
+    ],
+    listFollowedByAuthenticatedUser: ["GET /user/following"],
+    listFollowersForAuthenticatedUser: ["GET /user/followers"],
+    listFollowersForUser: ["GET /users/{username}/followers"],
+    listFollowingForUser: ["GET /users/{username}/following"],
+    listGpgKeysForAuthenticated: [
+      "GET /user/gpg_keys",
+      {},
+      { renamed: ["users", "listGpgKeysForAuthenticatedUser"] }
+    ],
+    listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],
+    listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],
+    listPublicEmailsForAuthenticated: [
+      "GET /user/public_emails",
+      {},
+      { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] }
+    ],
+    listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],
+    listPublicKeysForUser: ["GET /users/{username}/keys"],
+    listPublicSshKeysForAuthenticated: [
+      "GET /user/keys",
+      {},
+      { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] }
+    ],
+    listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],
+    listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"],
+    listSocialAccountsForUser: ["GET /users/{username}/social_accounts"],
+    listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"],
+    listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"],
+    setPrimaryEmailVisibilityForAuthenticated: [
+      "PATCH /user/email/visibility",
+      {},
+      { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] }
+    ],
+    setPrimaryEmailVisibilityForAuthenticatedUser: [
+      "PATCH /user/email/visibility"
+    ],
+    unblock: ["DELETE /user/blocks/{username}"],
+    unfollow: ["DELETE /user/following/{username}"],
+    updateAuthenticated: ["PATCH /user"]
+  }
+};
+var endpoints_default = Endpoints;
 
-	const parseOptions = requireParseOptions();
-	const { safeRe: re, t } = requireRe();
-	const cmp = requireCmp();
-	const debug = requireDebug();
-	const SemVer = requireSemver$2();
-	const Range = requireRange();
-	return comparator;
+const endpointMethodsMap = /* @__PURE__ */ new Map();
+for (const [scope, endpoints] of Object.entries(endpoints_default)) {
+  for (const [methodName, endpoint] of Object.entries(endpoints)) {
+    const [route, defaults, decorations] = endpoint;
+    const [method, url] = route.split(/ /);
+    const endpointDefaults = Object.assign(
+      {
+        method,
+        url
+      },
+      defaults
+    );
+    if (!endpointMethodsMap.has(scope)) {
+      endpointMethodsMap.set(scope, /* @__PURE__ */ new Map());
+    }
+    endpointMethodsMap.get(scope).set(methodName, {
+      scope,
+      methodName,
+      endpointDefaults,
+      decorations
+    });
+  }
 }
-
-var satisfies_1;
-var hasRequiredSatisfies;
-
-function requireSatisfies () {
-	if (hasRequiredSatisfies) return satisfies_1;
-	hasRequiredSatisfies = 1;
-
-	const Range = requireRange();
-	const satisfies = (version, range, options) => {
-	  try {
-	    range = new Range(range, options);
-	  } catch (er) {
-	    return false
-	  }
-	  return range.test(version)
-	};
-	satisfies_1 = satisfies;
-	return satisfies_1;
+const handler = {
+  has({ scope }, methodName) {
+    return endpointMethodsMap.get(scope).has(methodName);
+  },
+  getOwnPropertyDescriptor(target, methodName) {
+    return {
+      value: this.get(target, methodName),
+      // ensures method is in the cache
+      configurable: true,
+      writable: true,
+      enumerable: true
+    };
+  },
+  defineProperty(target, methodName, descriptor) {
+    Object.defineProperty(target.cache, methodName, descriptor);
+    return true;
+  },
+  deleteProperty(target, methodName) {
+    delete target.cache[methodName];
+    return true;
+  },
+  ownKeys({ scope }) {
+    return [...endpointMethodsMap.get(scope).keys()];
+  },
+  set(target, methodName, value) {
+    return target.cache[methodName] = value;
+  },
+  get({ octokit, scope, cache }, methodName) {
+    if (cache[methodName]) {
+      return cache[methodName];
+    }
+    const method = endpointMethodsMap.get(scope).get(methodName);
+    if (!method) {
+      return void 0;
+    }
+    const { endpointDefaults, decorations } = method;
+    if (decorations) {
+      cache[methodName] = decorate(
+        octokit,
+        scope,
+        methodName,
+        endpointDefaults,
+        decorations
+      );
+    } else {
+      cache[methodName] = octokit.request.defaults(endpointDefaults);
+    }
+    return cache[methodName];
+  }
+};
+function endpointsToMethods(octokit) {
+  const newMethods = {};
+  for (const scope of endpointMethodsMap.keys()) {
+    newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);
+  }
+  return newMethods;
 }
-
-var toComparators_1;
-var hasRequiredToComparators;
-
-function requireToComparators () {
-	if (hasRequiredToComparators) return toComparators_1;
-	hasRequiredToComparators = 1;
-
-	const Range = requireRange();
-
-	// Mostly just for testing and legacy API reasons
-	const toComparators = (range, options) =>
-	  new Range(range, options).set
-	    .map(comp => comp.map(c => c.value).join(' ').trim().split(' '));
-
-	toComparators_1 = toComparators;
-	return toComparators_1;
+function decorate(octokit, scope, methodName, defaults, decorations) {
+  const requestWithDefaults = octokit.request.defaults(defaults);
+  function withDecorations(...args) {
+    let options = requestWithDefaults.endpoint.merge(...args);
+    if (decorations.mapToData) {
+      options = Object.assign({}, options, {
+        data: options[decorations.mapToData],
+        [decorations.mapToData]: void 0
+      });
+      return requestWithDefaults(options);
+    }
+    if (decorations.renamed) {
+      const [newScope, newMethodName] = decorations.renamed;
+      octokit.log.warn(
+        `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`
+      );
+    }
+    if (decorations.deprecated) {
+      octokit.log.warn(decorations.deprecated);
+    }
+    if (decorations.renamedParameters) {
+      const options2 = requestWithDefaults.endpoint.merge(...args);
+      for (const [name, alias] of Object.entries(
+        decorations.renamedParameters
+      )) {
+        if (name in options2) {
+          octokit.log.warn(
+            `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`
+          );
+          if (!(alias in options2)) {
+            options2[alias] = options2[name];
+          }
+          delete options2[name];
+        }
+      }
+      return requestWithDefaults(options2);
+    }
+    return requestWithDefaults(...args);
+  }
+  return Object.assign(withDecorations, requestWithDefaults);
 }
 
-var maxSatisfying_1;
-var hasRequiredMaxSatisfying;
-
-function requireMaxSatisfying () {
-	if (hasRequiredMaxSatisfying) return maxSatisfying_1;
-	hasRequiredMaxSatisfying = 1;
-
-	const SemVer = requireSemver$2();
-	const Range = requireRange();
-
-	const maxSatisfying = (versions, range, options) => {
-	  let max = null;
-	  let maxSV = null;
-	  let rangeObj = null;
-	  try {
-	    rangeObj = new Range(range, options);
-	  } catch (er) {
-	    return null
-	  }
-	  versions.forEach((v) => {
-	    if (rangeObj.test(v)) {
-	      // satisfies(v, range, options)
-	      if (!max || maxSV.compare(v) === -1) {
-	        // compare(max, v, true)
-	        max = v;
-	        maxSV = new SemVer(max, options);
-	      }
-	    }
-	  });
-	  return max
-	};
-	maxSatisfying_1 = maxSatisfying;
-	return maxSatisfying_1;
+function restEndpointMethods(octokit) {
+  const api = endpointsToMethods(octokit);
+  return {
+    rest: api
+  };
 }
+restEndpointMethods.VERSION = VERSION$1;
 
-var minSatisfying_1;
-var hasRequiredMinSatisfying;
-
-function requireMinSatisfying () {
-	if (hasRequiredMinSatisfying) return minSatisfying_1;
-	hasRequiredMinSatisfying = 1;
+// pkg/dist-src/version.js
+var VERSION = "0.0.0-development";
 
-	const SemVer = requireSemver$2();
-	const Range = requireRange();
-	const minSatisfying = (versions, range, options) => {
-	  let min = null;
-	  let minSV = null;
-	  let rangeObj = null;
-	  try {
-	    rangeObj = new Range(range, options);
-	  } catch (er) {
-	    return null
-	  }
-	  versions.forEach((v) => {
-	    if (rangeObj.test(v)) {
-	      // satisfies(v, range, options)
-	      if (!min || minSV.compare(v) === 1) {
-	        // compare(min, v, true)
-	        min = v;
-	        minSV = new SemVer(min, options);
-	      }
-	    }
-	  });
-	  return min
-	};
-	minSatisfying_1 = minSatisfying;
-	return minSatisfying_1;
+// pkg/dist-src/normalize-paginated-list-response.js
+function normalizePaginatedListResponse(response) {
+  if (!response.data) {
+    return {
+      ...response,
+      data: []
+    };
+  }
+  const responseNeedsNormalization = ("total_count" in response.data || "total_commits" in response.data) && !("url" in response.data);
+  if (!responseNeedsNormalization) return response;
+  const incompleteResults = response.data.incomplete_results;
+  const repositorySelection = response.data.repository_selection;
+  const totalCount = response.data.total_count;
+  const totalCommits = response.data.total_commits;
+  delete response.data.incomplete_results;
+  delete response.data.repository_selection;
+  delete response.data.total_count;
+  delete response.data.total_commits;
+  const namespaceKey = Object.keys(response.data)[0];
+  const data = response.data[namespaceKey];
+  response.data = data;
+  if (typeof incompleteResults !== "undefined") {
+    response.data.incomplete_results = incompleteResults;
+  }
+  if (typeof repositorySelection !== "undefined") {
+    response.data.repository_selection = repositorySelection;
+  }
+  response.data.total_count = totalCount;
+  response.data.total_commits = totalCommits;
+  return response;
 }
 
-var minVersion_1;
-var hasRequiredMinVersion;
-
-function requireMinVersion () {
-	if (hasRequiredMinVersion) return minVersion_1;
-	hasRequiredMinVersion = 1;
-
-	const SemVer = requireSemver$2();
-	const Range = requireRange();
-	const gt = requireGt();
-
-	const minVersion = (range, loose) => {
-	  range = new Range(range, loose);
-
-	  let minver = new SemVer('0.0.0');
-	  if (range.test(minver)) {
-	    return minver
-	  }
-
-	  minver = new SemVer('0.0.0-0');
-	  if (range.test(minver)) {
-	    return minver
-	  }
+// pkg/dist-src/iterator.js
+function iterator(octokit, route, parameters) {
+  const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);
+  const requestMethod = typeof route === "function" ? route : octokit.request;
+  const method = options.method;
+  const headers = options.headers;
+  let url = options.url;
+  return {
+    [Symbol.asyncIterator]: () => ({
+      async next() {
+        if (!url) return { done: true };
+        try {
+          const response = await requestMethod({ method, url, headers });
+          const normalizedResponse = normalizePaginatedListResponse(response);
+          url = ((normalizedResponse.headers.link || "").match(
+            /<([^<>]+)>;\s*rel="next"/
+          ) || [])[1];
+          if (!url && "total_commits" in normalizedResponse.data) {
+            const parsedUrl = new URL(normalizedResponse.url);
+            const params = parsedUrl.searchParams;
+            const page = parseInt(params.get("page") || "1", 10);
+            const per_page = parseInt(params.get("per_page") || "250", 10);
+            if (page * per_page < normalizedResponse.data.total_commits) {
+              params.set("page", String(page + 1));
+              url = parsedUrl.toString();
+            }
+          }
+          return { value: normalizedResponse };
+        } catch (error) {
+          if (error.status !== 409) throw error;
+          url = "";
+          return {
+            value: {
+              status: 200,
+              headers: {},
+              data: []
+            }
+          };
+        }
+      }
+    })
+  };
+}
 
-	  minver = null;
-	  for (let i = 0; i < range.set.length; ++i) {
-	    const comparators = range.set[i];
+// pkg/dist-src/paginate.js
+function paginate(octokit, route, parameters, mapFn) {
+  if (typeof parameters === "function") {
+    mapFn = parameters;
+    parameters = void 0;
+  }
+  return gather(
+    octokit,
+    [],
+    iterator(octokit, route, parameters)[Symbol.asyncIterator](),
+    mapFn
+  );
+}
+function gather(octokit, results, iterator2, mapFn) {
+  return iterator2.next().then((result) => {
+    if (result.done) {
+      return results;
+    }
+    let earlyExit = false;
+    function done() {
+      earlyExit = true;
+    }
+    results = results.concat(
+      mapFn ? mapFn(result.value, done) : result.value.data
+    );
+    if (earlyExit) {
+      return results;
+    }
+    return gather(octokit, results, iterator2, mapFn);
+  });
+}
 
-	    let setMin = null;
-	    comparators.forEach((comparator) => {
-	      // Clone to avoid manipulating the comparator's semver object.
-	      const compver = new SemVer(comparator.semver.version);
-	      switch (comparator.operator) {
-	        case '>':
-	          if (compver.prerelease.length === 0) {
-	            compver.patch++;
-	          } else {
-	            compver.prerelease.push(0);
-	          }
-	          compver.raw = compver.format();
-	          /* fallthrough */
-	        case '':
-	        case '>=':
-	          if (!setMin || gt(compver, setMin)) {
-	            setMin = compver;
-	          }
-	          break
-	        case '<':
-	        case '<=':
-	          /* Ignore maximum versions */
-	          break
-	        /* istanbul ignore next */
-	        default:
-	          throw new Error(`Unexpected operation: ${comparator.operator}`)
-	      }
-	    });
-	    if (setMin && (!minver || gt(minver, setMin))) {
-	      minver = setMin;
-	    }
-	  }
+// pkg/dist-src/compose-paginate.js
+Object.assign(paginate, {
+  iterator
+});
 
-	  if (minver && range.test(minver)) {
-	    return minver
-	  }
+// pkg/dist-src/index.js
+function paginateRest(octokit) {
+  return {
+    paginate: Object.assign(paginate.bind(null, octokit), {
+      iterator: iterator.bind(null, octokit)
+    })
+  };
+}
+paginateRest.VERSION = VERSION;
 
-	  return null
-	};
-	minVersion_1 = minVersion;
-	return minVersion_1;
+new Context();
+const baseUrl = getApiBaseUrl();
+const defaults = {
+    baseUrl,
+    request: {
+        agent: getProxyAgent(baseUrl),
+        fetch: getProxyFetch(baseUrl)
+    }
+};
+const GitHub = Octokit.plugin(restEndpointMethods, paginateRest).defaults(defaults);
+/**
+ * Convience function to correctly format Octokit Options to pass into the constructor.
+ *
+ * @param     token    the repo PAT or GITHUB_TOKEN
+ * @param     options  other options to set
+ */
+function getOctokitOptions(token, options) {
+    const opts = Object.assign({}, {}); // Shallow clone - don't mutate the object provided by the caller
+    // Auth
+    const auth = getAuthString(token, opts);
+    if (auth) {
+        opts.auth = auth;
+    }
+    return opts;
 }
 
-var valid;
-var hasRequiredValid;
+const context = new Context();
+/**
+ * Returns a hydrated octokit ready to use for GitHub Actions
+ *
+ * @param     token    the repo PAT or GITHUB_TOKEN
+ * @param     options  other options to set
+ */
+function getOctokit$1(token, options, ...additionalPlugins) {
+    const GitHubWithPlugins = GitHub.plugin(...additionalPlugins);
+    return new GitHubWithPlugins(getOctokitOptions(token));
+}
 
-function requireValid () {
-	if (hasRequiredValid) return valid;
-	hasRequiredValid = 1;
+var re = {exports: {}};
 
-	const Range = requireRange();
-	const validRange = (range, options) => {
-	  try {
-	    // Return '*' instead of '' so that truthiness works.
-	    // This will throw if it's invalid anyway
-	    return new Range(range, options).range || '*'
-	  } catch (er) {
-	    return null
-	  }
+var constants;
+var hasRequiredConstants;
+
+function requireConstants () {
+	if (hasRequiredConstants) return constants;
+	hasRequiredConstants = 1;
+
+	// Note: this is the semver.org version of the spec that it implements
+	// Not necessarily the package version of this code.
+	const SEMVER_SPEC_VERSION = '2.0.0';
+
+	const MAX_LENGTH = 256;
+	const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
+	/* istanbul ignore next */ 9007199254740991;
+
+	// Max safe segment length for coercion.
+	const MAX_SAFE_COMPONENT_LENGTH = 16;
+
+	// Max safe length for a build identifier. The max length minus 6 characters for
+	// the shortest version with a build 0.0.0+BUILD.
+	const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
+
+	const RELEASE_TYPES = [
+	  'major',
+	  'premajor',
+	  'minor',
+	  'preminor',
+	  'patch',
+	  'prepatch',
+	  'prerelease',
+	];
+
+	constants = {
+	  MAX_LENGTH,
+	  MAX_SAFE_COMPONENT_LENGTH,
+	  MAX_SAFE_BUILD_LENGTH,
+	  MAX_SAFE_INTEGER,
+	  RELEASE_TYPES,
+	  SEMVER_SPEC_VERSION,
+	  FLAG_INCLUDE_PRERELEASE: 0b001,
+	  FLAG_LOOSE: 0b010,
 	};
-	valid = validRange;
-	return valid;
+	return constants;
 }
 
-var outside_1;
-var hasRequiredOutside;
+var debug_1;
+var hasRequiredDebug;
 
-function requireOutside () {
-	if (hasRequiredOutside) return outside_1;
-	hasRequiredOutside = 1;
+function requireDebug () {
+	if (hasRequiredDebug) return debug_1;
+	hasRequiredDebug = 1;
 
-	const SemVer = requireSemver$2();
-	const Comparator = requireComparator();
-	const { ANY } = Comparator;
-	const Range = requireRange();
-	const satisfies = requireSatisfies();
-	const gt = requireGt();
-	const lt = requireLt();
-	const lte = requireLte();
-	const gte = requireGte();
+	const debug = (
+	  typeof process === 'object' &&
+	  process.env &&
+	  process.env.NODE_DEBUG &&
+	  /\bsemver\b/i.test(process.env.NODE_DEBUG)
+	) ? (...args) => console.error('SEMVER', ...args)
+	  : () => {};
 
-	const outside = (version, range, hilo, options) => {
-	  version = new SemVer(version, options);
-	  range = new Range(range, options);
+	debug_1 = debug;
+	return debug_1;
+}
 
-	  let gtfn, ltefn, ltfn, comp, ecomp;
-	  switch (hilo) {
-	    case '>':
-	      gtfn = gt;
-	      ltefn = lte;
-	      ltfn = lt;
-	      comp = '>';
-	      ecomp = '>=';
-	      break
-	    case '<':
-	      gtfn = lt;
-	      ltefn = gte;
-	      ltfn = gt;
-	      comp = '<';
-	      ecomp = '<=';
-	      break
-	    default:
-	      throw new TypeError('Must provide a hilo val of "<" or ">"')
-	  }
+var hasRequiredRe;
 
-	  // If it satisfies the range it is not outside
-	  if (satisfies(version, range, options)) {
-	    return false
-	  }
+function requireRe () {
+	if (hasRequiredRe) return re.exports;
+	hasRequiredRe = 1;
+	(function (module, exports$1) {
 
-	  // From now on, variable terms are as if we're in "gtr" mode.
-	  // but note that everything is flipped for the "ltr" function.
+		const {
+		  MAX_SAFE_COMPONENT_LENGTH,
+		  MAX_SAFE_BUILD_LENGTH,
+		  MAX_LENGTH,
+		} = requireConstants();
+		const debug = requireDebug();
+		exports$1 = module.exports = {};
 
-	  for (let i = 0; i < range.set.length; ++i) {
-	    const comparators = range.set[i];
+		// The actual regexps go on exports.re
+		const re = exports$1.re = [];
+		const safeRe = exports$1.safeRe = [];
+		const src = exports$1.src = [];
+		const safeSrc = exports$1.safeSrc = [];
+		const t = exports$1.t = {};
+		let R = 0;
 
-	    let high = null;
-	    let low = null;
+		const LETTERDASHNUMBER = '[a-zA-Z0-9-]';
 
-	    comparators.forEach((comparator) => {
-	      if (comparator.semver === ANY) {
-	        comparator = new Comparator('>=0.0.0');
-	      }
-	      high = high || comparator;
-	      low = low || comparator;
-	      if (gtfn(comparator.semver, high.semver, options)) {
-	        high = comparator;
-	      } else if (ltfn(comparator.semver, low.semver, options)) {
-	        low = comparator;
-	      }
-	    });
+		// Replace some greedy regex tokens to prevent regex dos issues. These regex are
+		// used internally via the safeRe object since all inputs in this library get
+		// normalized first to trim and collapse all extra whitespace. The original
+		// regexes are exported for userland consumption and lower level usage. A
+		// future breaking change could export the safer regex only with a note that
+		// all input should have extra whitespace removed.
+		const safeRegexReplacements = [
+		  ['\\s', 1],
+		  ['\\d', MAX_LENGTH],
+		  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
+		];
 
-	    // If the edge version comparator has a operator then our version
-	    // isn't outside it
-	    if (high.operator === comp || high.operator === ecomp) {
-	      return false
-	    }
+		const makeSafeRegex = (value) => {
+		  for (const [token, max] of safeRegexReplacements) {
+		    value = value
+		      .split(`${token}*`).join(`${token}{0,${max}}`)
+		      .split(`${token}+`).join(`${token}{1,${max}}`);
+		  }
+		  return value
+		};
 
-	    // If the lowest version comparator has an operator and our version
-	    // is less than it then it isn't higher than the range
-	    if ((!low.operator || low.operator === comp) &&
-	        ltefn(version, low.semver)) {
-	      return false
-	    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
-	      return false
-	    }
-	  }
-	  return true
-	};
+		const createToken = (name, value, isGlobal) => {
+		  const safe = makeSafeRegex(value);
+		  const index = R++;
+		  debug(name, index, value);
+		  t[name] = index;
+		  src[index] = value;
+		  safeSrc[index] = safe;
+		  re[index] = new RegExp(value, isGlobal ? 'g' : undefined);
+		  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined);
+		};
 
-	outside_1 = outside;
-	return outside_1;
-}
+		// The following Regular Expressions can be used for tokenizing,
+		// validating, and parsing SemVer version strings.
 
-var gtr_1;
-var hasRequiredGtr;
+		// ## Numeric Identifier
+		// A single `0`, or a non-zero digit followed by zero or more digits.
 
-function requireGtr () {
-	if (hasRequiredGtr) return gtr_1;
-	hasRequiredGtr = 1;
+		createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*');
+		createToken('NUMERICIDENTIFIERLOOSE', '\\d+');
 
-	// Determine if version is greater than all the versions possible in the range.
-	const outside = requireOutside();
-	const gtr = (version, range, options) => outside(version, range, '>', options);
-	gtr_1 = gtr;
-	return gtr_1;
-}
+		// ## Non-numeric Identifier
+		// Zero or more digits, followed by a letter or hyphen, and then zero or
+		// more letters, digits, or hyphens.
 
-var ltr_1;
-var hasRequiredLtr;
+		createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
 
-function requireLtr () {
-	if (hasRequiredLtr) return ltr_1;
-	hasRequiredLtr = 1;
+		// ## Main Version
+		// Three dot-separated numeric identifiers.
 
-	const outside = requireOutside();
-	// Determine if version is less than all the versions possible in the range
-	const ltr = (version, range, options) => outside(version, range, '<', options);
-	ltr_1 = ltr;
-	return ltr_1;
-}
+		createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
+		                   `(${src[t.NUMERICIDENTIFIER]})\\.` +
+		                   `(${src[t.NUMERICIDENTIFIER]})`);
 
-var intersects_1;
-var hasRequiredIntersects;
+		createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
+		                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
+		                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
 
-function requireIntersects () {
-	if (hasRequiredIntersects) return intersects_1;
-	hasRequiredIntersects = 1;
+		// ## Pre-release Version Identifier
+		// A numeric identifier, or a non-numeric identifier.
+		// Non-numberic identifiers include numberic identifiers but can be longer.
+		// Therefore non-numberic identifiers must go first.
 
-	const Range = requireRange();
-	const intersects = (r1, r2, options) => {
-	  r1 = new Range(r1, options);
-	  r2 = new Range(r2, options);
-	  return r1.intersects(r2, options)
-	};
-	intersects_1 = intersects;
-	return intersects_1;
-}
+		createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]
+		}|${src[t.NUMERICIDENTIFIER]})`);
 
-var simplify;
-var hasRequiredSimplify;
+		createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]
+		}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
 
-function requireSimplify () {
-	if (hasRequiredSimplify) return simplify;
-	hasRequiredSimplify = 1;
+		// ## Pre-release Version
+		// Hyphen, followed by one or more dot-separated pre-release version
+		// identifiers.
 
-	// given a set of versions and a range, create a "simplified" range
-	// that includes the same versions that the original range does
-	// If the original range is shorter than the simplified one, return that.
-	const satisfies = requireSatisfies();
-	const compare = requireCompare();
-	simplify = (versions, range, options) => {
-	  const set = [];
-	  let first = null;
-	  let prev = null;
-	  const v = versions.sort((a, b) => compare(a, b, options));
-	  for (const version of v) {
-	    const included = satisfies(version, range, options);
-	    if (included) {
-	      prev = version;
-	      if (!first) {
-	        first = version;
-	      }
-	    } else {
-	      if (prev) {
-	        set.push([first, prev]);
-	      }
-	      prev = null;
-	      first = null;
-	    }
-	  }
-	  if (first) {
-	    set.push([first, null]);
-	  }
+		createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
+		}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
 
-	  const ranges = [];
-	  for (const [min, max] of set) {
-	    if (min === max) {
-	      ranges.push(min);
-	    } else if (!max && min === v[0]) {
-	      ranges.push('*');
-	    } else if (!max) {
-	      ranges.push(`>=${min}`);
-	    } else if (min === v[0]) {
-	      ranges.push(`<=${max}`);
-	    } else {
-	      ranges.push(`${min} - ${max}`);
-	    }
-	  }
-	  const simplified = ranges.join(' || ');
-	  const original = typeof range.raw === 'string' ? range.raw : String(range);
-	  return simplified.length < original.length ? simplified : range
-	};
-	return simplify;
-}
+		createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
+		}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
 
-var subset_1;
-var hasRequiredSubset;
+		// ## Build Metadata Identifier
+		// Any combination of digits, letters, or hyphens.
 
-function requireSubset () {
-	if (hasRequiredSubset) return subset_1;
-	hasRequiredSubset = 1;
+		createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`);
 
-	const Range = requireRange();
-	const Comparator = requireComparator();
-	const { ANY } = Comparator;
-	const satisfies = requireSatisfies();
-	const compare = requireCompare();
+		// ## Build Metadata
+		// Plus sign, followed by one or more period-separated build metadata
+		// identifiers.
 
-	// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
-	// - Every simple range `r1, r2, ...` is a null set, OR
-	// - Every simple range `r1, r2, ...` which is not a null set is a subset of
-	//   some `R1, R2, ...`
-	//
-	// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
-	// - If c is only the ANY comparator
-	//   - If C is only the ANY comparator, return true
-	//   - Else if in prerelease mode, return false
-	//   - else replace c with `[>=0.0.0]`
-	// - If C is only the ANY comparator
-	//   - if in prerelease mode, return true
-	//   - else replace C with `[>=0.0.0]`
-	// - Let EQ be the set of = comparators in c
-	// - If EQ is more than one, return true (null set)
-	// - Let GT be the highest > or >= comparator in c
-	// - Let LT be the lowest < or <= comparator in c
-	// - If GT and LT, and GT.semver > LT.semver, return true (null set)
-	// - If any C is a = range, and GT or LT are set, return false
-	// - If EQ
-	//   - If GT, and EQ does not satisfy GT, return true (null set)
-	//   - If LT, and EQ does not satisfy LT, return true (null set)
-	//   - If EQ satisfies every C, return true
-	//   - Else return false
-	// - If GT
-	//   - If GT.semver is lower than any > or >= comp in C, return false
-	//   - If GT is >=, and GT.semver does not satisfy every C, return false
-	//   - If GT.semver has a prerelease, and not in prerelease mode
-	//     - If no C has a prerelease and the GT.semver tuple, return false
-	// - If LT
-	//   - If LT.semver is greater than any < or <= comp in C, return false
-	//   - If LT is <=, and LT.semver does not satisfy every C, return false
-	//   - If GT.semver has a prerelease, and not in prerelease mode
-	//     - If no C has a prerelease and the LT.semver tuple, return false
-	// - Else return true
+		createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
+		}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
 
-	const subset = (sub, dom, options = {}) => {
-	  if (sub === dom) {
-	    return true
-	  }
+		// ## Full Version String
+		// A main version, followed optionally by a pre-release version and
+		// build metadata.
 
-	  sub = new Range(sub, options);
-	  dom = new Range(dom, options);
-	  let sawNonNull = false;
+		// Note that the only major, minor, patch, and pre-release sections of
+		// the version string are capturing groups.  The build metadata is not a
+		// capturing group, because it should not ever be used in version
+		// comparison.
 
-	  OUTER: for (const simpleSub of sub.set) {
-	    for (const simpleDom of dom.set) {
-	      const isSub = simpleSubset(simpleSub, simpleDom, options);
-	      sawNonNull = sawNonNull || isSub !== null;
-	      if (isSub) {
-	        continue OUTER
-	      }
-	    }
-	    // the null set is a subset of everything, but null simple ranges in
-	    // a complex range should be ignored.  so if we saw a non-null range,
-	    // then we know this isn't a subset, but if EVERY simple range was null,
-	    // then it is a subset.
-	    if (sawNonNull) {
-	      return false
-	    }
-	  }
-	  return true
-	};
+		createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
+		}${src[t.PRERELEASE]}?${
+		  src[t.BUILD]}?`);
 
-	const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')];
-	const minimumVersion = [new Comparator('>=0.0.0')];
+		createToken('FULL', `^${src[t.FULLPLAIN]}$`);
 
-	const simpleSubset = (sub, dom, options) => {
-	  if (sub === dom) {
-	    return true
-	  }
+		// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
+		// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
+		// common in the npm registry.
+		createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
+		}${src[t.PRERELEASELOOSE]}?${
+		  src[t.BUILD]}?`);
 
-	  if (sub.length === 1 && sub[0].semver === ANY) {
-	    if (dom.length === 1 && dom[0].semver === ANY) {
-	      return true
-	    } else if (options.includePrerelease) {
-	      sub = minimumVersionWithPreRelease;
-	    } else {
-	      sub = minimumVersion;
-	    }
-	  }
+		createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`);
 
-	  if (dom.length === 1 && dom[0].semver === ANY) {
-	    if (options.includePrerelease) {
-	      return true
-	    } else {
-	      dom = minimumVersion;
-	    }
-	  }
+		createToken('GTLT', '((?:<|>)?=?)');
 
-	  const eqSet = new Set();
-	  let gt, lt;
-	  for (const c of sub) {
-	    if (c.operator === '>' || c.operator === '>=') {
-	      gt = higherGT(gt, c, options);
-	    } else if (c.operator === '<' || c.operator === '<=') {
-	      lt = lowerLT(lt, c, options);
-	    } else {
-	      eqSet.add(c.semver);
-	    }
-	  }
+		// Something like "2.*" or "1.2.x".
+		// Note that "x.x" is a valid xRange identifer, meaning "any version"
+		// Only the first item is strictly required.
+		createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
+		createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
 
-	  if (eqSet.size > 1) {
-	    return null
-	  }
+		createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
+		                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
+		                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
+		                   `(?:${src[t.PRERELEASE]})?${
+		                     src[t.BUILD]}?` +
+		                   `)?)?`);
 
-	  let gtltComp;
-	  if (gt && lt) {
-	    gtltComp = compare(gt.semver, lt.semver, options);
-	    if (gtltComp > 0) {
-	      return null
-	    } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {
-	      return null
-	    }
-	  }
+		createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
+		                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
+		                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
+		                        `(?:${src[t.PRERELEASELOOSE]})?${
+		                          src[t.BUILD]}?` +
+		                        `)?)?`);
 
-	  // will iterate one or zero times
-	  for (const eq of eqSet) {
-	    if (gt && !satisfies(eq, String(gt), options)) {
-	      return null
-	    }
+		createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
+		createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
 
-	    if (lt && !satisfies(eq, String(lt), options)) {
-	      return null
-	    }
+		// Coercion.
+		// Extract anything that could conceivably be a part of a valid semver
+		createToken('COERCEPLAIN', `${'(^|[^\\d])' +
+		              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
+		              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
+		              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
+		createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
+		createToken('COERCEFULL', src[t.COERCEPLAIN] +
+		              `(?:${src[t.PRERELEASE]})?` +
+		              `(?:${src[t.BUILD]})?` +
+		              `(?:$|[^\\d])`);
+		createToken('COERCERTL', src[t.COERCE], true);
+		createToken('COERCERTLFULL', src[t.COERCEFULL], true);
 
-	    for (const c of dom) {
-	      if (!satisfies(eq, String(c), options)) {
-	        return false
-	      }
-	    }
+		// Tilde ranges.
+		// Meaning is "reasonably at or greater than"
+		createToken('LONETILDE', '(?:~>?)');
 
-	    return true
-	  }
+		createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true);
+		exports$1.tildeTrimReplace = '$1~';
 
-	  let higher, lower;
-	  let hasDomLT, hasDomGT;
-	  // if the subset has a prerelease, we need a comparator in the superset
-	  // with the same tuple and a prerelease, or it's not a subset
-	  let needDomLTPre = lt &&
-	    !options.includePrerelease &&
-	    lt.semver.prerelease.length ? lt.semver : false;
-	  let needDomGTPre = gt &&
-	    !options.includePrerelease &&
-	    gt.semver.prerelease.length ? gt.semver : false;
-	  // exception: <1.2.3-0 is the same as <1.2.3
-	  if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
-	      lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
-	    needDomLTPre = false;
-	  }
+		createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
+		createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
 
-	  for (const c of dom) {
-	    hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=';
-	    hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=';
-	    if (gt) {
-	      if (needDomGTPre) {
-	        if (c.semver.prerelease && c.semver.prerelease.length &&
-	            c.semver.major === needDomGTPre.major &&
-	            c.semver.minor === needDomGTPre.minor &&
-	            c.semver.patch === needDomGTPre.patch) {
-	          needDomGTPre = false;
-	        }
-	      }
-	      if (c.operator === '>' || c.operator === '>=') {
-	        higher = higherGT(gt, c, options);
-	        if (higher === c && higher !== gt) {
-	          return false
-	        }
-	      } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
-	        return false
-	      }
-	    }
-	    if (lt) {
-	      if (needDomLTPre) {
-	        if (c.semver.prerelease && c.semver.prerelease.length &&
-	            c.semver.major === needDomLTPre.major &&
-	            c.semver.minor === needDomLTPre.minor &&
-	            c.semver.patch === needDomLTPre.patch) {
-	          needDomLTPre = false;
-	        }
-	      }
-	      if (c.operator === '<' || c.operator === '<=') {
-	        lower = lowerLT(lt, c, options);
-	        if (lower === c && lower !== lt) {
-	          return false
-	        }
-	      } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
-	        return false
-	      }
-	    }
-	    if (!c.operator && (lt || gt) && gtltComp !== 0) {
-	      return false
-	    }
-	  }
+		// Caret ranges.
+		// Meaning is "at least and backwards compatible with"
+		createToken('LONECARET', '(?:\\^)');
 
-	  // if there was a < or >, and nothing in the dom, then must be false
-	  // UNLESS it was limited by another range in the other direction.
-	  // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
-	  if (gt && hasDomLT && !lt && gtltComp !== 0) {
-	    return false
-	  }
+		createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true);
+		exports$1.caretTrimReplace = '$1^';
 
-	  if (lt && hasDomGT && !gt && gtltComp !== 0) {
-	    return false
-	  }
+		createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
+		createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
 
-	  // we needed a prerelease range in a specific tuple, but didn't get one
-	  // then this isn't a subset.  eg >=1.2.3-pre is not a subset of >=1.0.0,
-	  // because it includes prereleases in the 1.2.3 tuple
-	  if (needDomGTPre || needDomLTPre) {
-	    return false
-	  }
+		// A simple gt/lt/eq thing, or just "" to indicate "any version"
+		createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
+		createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
 
-	  return true
-	};
+		// An expression to strip any whitespace between the gtlt and the thing
+		// it modifies, so that `> 1.2.3` ==> `>1.2.3`
+		createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
+		}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
+		exports$1.comparatorTrimReplace = '$1$2$3';
 
-	// >=1.2.3 is lower than >1.2.3
-	const higherGT = (a, b, options) => {
-	  if (!a) {
-	    return b
-	  }
-	  const comp = compare(a.semver, b.semver, options);
-	  return comp > 0 ? a
-	    : comp < 0 ? b
-	    : b.operator === '>' && a.operator === '>=' ? b
-	    : a
-	};
+		// Something like `1.2.3 - 1.2.4`
+		// Note that these all use the loose form, because they'll be
+		// checked against either the strict or loose comparator form
+		// later.
+		createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
+		                   `\\s+-\\s+` +
+		                   `(${src[t.XRANGEPLAIN]})` +
+		                   `\\s*$`);
 
-	// <=1.2.3 is higher than <1.2.3
-	const lowerLT = (a, b, options) => {
-	  if (!a) {
-	    return b
-	  }
-	  const comp = compare(a.semver, b.semver, options);
-	  return comp < 0 ? a
-	    : comp > 0 ? b
-	    : b.operator === '<' && a.operator === '<=' ? b
-	    : a
-	};
+		createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
+		                        `\\s+-\\s+` +
+		                        `(${src[t.XRANGEPLAINLOOSE]})` +
+		                        `\\s*$`);
 
-	subset_1 = subset;
-	return subset_1;
+		// Star ranges basically just allow anything at all.
+		createToken('STAR', '(<|>)?=?\\s*\\*');
+		// >=0.0.0 is like a star
+		createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$');
+		createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$'); 
+	} (re, re.exports));
+	return re.exports;
 }
 
-var semver$1;
-var hasRequiredSemver$1;
+var parseOptions_1;
+var hasRequiredParseOptions;
 
-function requireSemver$1 () {
-	if (hasRequiredSemver$1) return semver$1;
-	hasRequiredSemver$1 = 1;
+function requireParseOptions () {
+	if (hasRequiredParseOptions) return parseOptions_1;
+	hasRequiredParseOptions = 1;
 
-	// just pre-load all the stuff that index.js lazily exports
-	const internalRe = requireRe();
-	const constants = requireConstants();
-	const SemVer = requireSemver$2();
-	const identifiers = requireIdentifiers();
-	const parse = requireParse();
-	const valid = requireValid$1();
-	const clean = requireClean();
-	const inc = requireInc();
-	const diff = requireDiff();
-	const major = requireMajor();
-	const minor = requireMinor();
-	const patch = requirePatch();
-	const prerelease = requirePrerelease();
-	const compare = requireCompare();
-	const rcompare = requireRcompare();
-	const compareLoose = requireCompareLoose();
-	const compareBuild = requireCompareBuild();
-	const sort = requireSort();
-	const rsort = requireRsort();
-	const gt = requireGt();
-	const lt = requireLt();
-	const eq = requireEq();
-	const neq = requireNeq();
-	const gte = requireGte();
-	const lte = requireLte();
-	const cmp = requireCmp();
-	const coerce = requireCoerce();
-	const Comparator = requireComparator();
-	const Range = requireRange();
-	const satisfies = requireSatisfies();
-	const toComparators = requireToComparators();
-	const maxSatisfying = requireMaxSatisfying();
-	const minSatisfying = requireMinSatisfying();
-	const minVersion = requireMinVersion();
-	const validRange = requireValid();
-	const outside = requireOutside();
-	const gtr = requireGtr();
-	const ltr = requireLtr();
-	const intersects = requireIntersects();
-	const simplifyRange = requireSimplify();
-	const subset = requireSubset();
-	semver$1 = {
-	  parse,
-	  valid,
-	  clean,
-	  inc,
-	  diff,
-	  major,
-	  minor,
-	  patch,
-	  prerelease,
-	  compare,
-	  rcompare,
-	  compareLoose,
-	  compareBuild,
-	  sort,
-	  rsort,
-	  gt,
-	  lt,
-	  eq,
-	  neq,
-	  gte,
-	  lte,
-	  cmp,
-	  coerce,
-	  Comparator,
-	  Range,
-	  satisfies,
-	  toComparators,
-	  maxSatisfying,
-	  minSatisfying,
-	  minVersion,
-	  validRange,
-	  outside,
-	  gtr,
-	  ltr,
-	  intersects,
-	  simplifyRange,
-	  subset,
-	  SemVer,
-	  re: internalRe.re,
-	  src: internalRe.src,
-	  tokens: internalRe.t,
-	  SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
-	  RELEASE_TYPES: constants.RELEASE_TYPES,
-	  compareIdentifiers: identifiers.compareIdentifiers,
-	  rcompareIdentifiers: identifiers.rcompareIdentifiers,
+	// parse out just the options we care about
+	const looseOption = Object.freeze({ loose: true });
+	const emptyOpts = Object.freeze({ });
+	const parseOptions = options => {
+	  if (!options) {
+	    return emptyOpts
+	  }
+
+	  if (typeof options !== 'object') {
+	    return looseOption
+	  }
+
+	  return options
 	};
-	return semver$1;
+	parseOptions_1 = parseOptions;
+	return parseOptions_1;
 }
 
-requireSemver$1();
-
-var toolCache = {};
+var identifiers;
+var hasRequiredIdentifiers;
 
-var core = {};
+function requireIdentifiers () {
+	if (hasRequiredIdentifiers) return identifiers;
+	hasRequiredIdentifiers = 1;
 
-var command = {};
+	const numeric = /^[0-9]+$/;
+	const compareIdentifiers = (a, b) => {
+	  if (typeof a === 'number' && typeof b === 'number') {
+	    return a === b ? 0 : a < b ? -1 : 1
+	  }
 
-var utils = {};
+	  const anum = numeric.test(a);
+	  const bnum = numeric.test(b);
 
-var hasRequiredUtils;
+	  if (anum && bnum) {
+	    a = +a;
+	    b = +b;
+	  }
 
-function requireUtils () {
-	if (hasRequiredUtils) return utils;
-	hasRequiredUtils = 1;
-	// We use any as a valid input type
-	/* eslint-disable @typescript-eslint/no-explicit-any */
-	Object.defineProperty(utils, "__esModule", { value: true });
-	utils.toCommandProperties = utils.toCommandValue = void 0;
-	/**
-	 * Sanitizes an input into a string so it can be passed into issueCommand safely
-	 * @param input input to sanitize into a string
-	 */
-	function toCommandValue(input) {
-	    if (input === null || input === undefined) {
-	        return '';
-	    }
-	    else if (typeof input === 'string' || input instanceof String) {
-	        return input;
-	    }
-	    return JSON.stringify(input);
-	}
-	utils.toCommandValue = toCommandValue;
-	/**
-	 *
-	 * @param annotationProperties
-	 * @returns The command properties to send with the actual annotation command
-	 * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646
-	 */
-	function toCommandProperties(annotationProperties) {
-	    if (!Object.keys(annotationProperties).length) {
-	        return {};
-	    }
-	    return {
-	        title: annotationProperties.title,
-	        file: annotationProperties.file,
-	        line: annotationProperties.startLine,
-	        endLine: annotationProperties.endLine,
-	        col: annotationProperties.startColumn,
-	        endColumn: annotationProperties.endColumn
-	    };
-	}
-	utils.toCommandProperties = toCommandProperties;
-	
-	return utils;
-}
+	  return a === b ? 0
+	    : (anum && !bnum) ? -1
+	    : (bnum && !anum) ? 1
+	    : a < b ? -1
+	    : 1
+	};
 
-var hasRequiredCommand;
+	const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
 
-function requireCommand () {
-	if (hasRequiredCommand) return command;
-	hasRequiredCommand = 1;
-	var __createBinding = (command && command.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (command && command.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (command && command.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
+	identifiers = {
+	  compareIdentifiers,
+	  rcompareIdentifiers,
 	};
-	Object.defineProperty(command, "__esModule", { value: true });
-	command.issue = command.issueCommand = void 0;
-	const os = __importStar(require$$0$3);
-	const utils_1 = requireUtils();
-	/**
-	 * Commands
-	 *
-	 * Command Format:
-	 *   ::name key=value,key=value::message
-	 *
-	 * Examples:
-	 *   ::warning::This is the message
-	 *   ::set-env name=MY_VAR::some value
-	 */
-	function issueCommand(command, properties, message) {
-	    const cmd = new Command(command, properties, message);
-	    process.stdout.write(cmd.toString() + os.EOL);
-	}
-	command.issueCommand = issueCommand;
-	function issue(name, message = '') {
-	    issueCommand(name, {}, message);
-	}
-	command.issue = issue;
-	const CMD_STRING = '::';
-	class Command {
-	    constructor(command, properties, message) {
-	        if (!command) {
-	            command = 'missing.command';
-	        }
-	        this.command = command;
-	        this.properties = properties;
-	        this.message = message;
-	    }
-	    toString() {
-	        let cmdStr = CMD_STRING + this.command;
-	        if (this.properties && Object.keys(this.properties).length > 0) {
-	            cmdStr += ' ';
-	            let first = true;
-	            for (const key in this.properties) {
-	                if (this.properties.hasOwnProperty(key)) {
-	                    const val = this.properties[key];
-	                    if (val) {
-	                        if (first) {
-	                            first = false;
-	                        }
-	                        else {
-	                            cmdStr += ',';
-	                        }
-	                        cmdStr += `${key}=${escapeProperty(val)}`;
-	                    }
-	                }
-	            }
-	        }
-	        cmdStr += `${CMD_STRING}${escapeData(this.message)}`;
-	        return cmdStr;
-	    }
-	}
-	function escapeData(s) {
-	    return (0, utils_1.toCommandValue)(s)
-	        .replace(/%/g, '%25')
-	        .replace(/\r/g, '%0D')
-	        .replace(/\n/g, '%0A');
-	}
-	function escapeProperty(s) {
-	    return (0, utils_1.toCommandValue)(s)
-	        .replace(/%/g, '%25')
-	        .replace(/\r/g, '%0D')
-	        .replace(/\n/g, '%0A')
-	        .replace(/:/g, '%3A')
-	        .replace(/,/g, '%2C');
-	}
-	
-	return command;
+	return identifiers;
 }
 
-var fileCommand = {};
+var semver$2;
+var hasRequiredSemver$2;
 
-var hasRequiredFileCommand;
+function requireSemver$2 () {
+	if (hasRequiredSemver$2) return semver$2;
+	hasRequiredSemver$2 = 1;
 
-function requireFileCommand () {
-	if (hasRequiredFileCommand) return fileCommand;
-	hasRequiredFileCommand = 1;
-	// For internal use, subject to change.
-	var __createBinding = (fileCommand && fileCommand.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (fileCommand && fileCommand.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (fileCommand && fileCommand.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	Object.defineProperty(fileCommand, "__esModule", { value: true });
-	fileCommand.prepareKeyValueMessage = fileCommand.issueFileCommand = void 0;
-	// We use any as a valid input type
-	/* eslint-disable @typescript-eslint/no-explicit-any */
-	const crypto = __importStar(require$$0$4);
-	const fs = __importStar(require$$1__default);
-	const os = __importStar(require$$0$3);
-	const utils_1 = requireUtils();
-	function issueFileCommand(command, message) {
-	    const filePath = process.env[`GITHUB_${command}`];
-	    if (!filePath) {
-	        throw new Error(`Unable to find environment variable for file command ${command}`);
-	    }
-	    if (!fs.existsSync(filePath)) {
-	        throw new Error(`Missing file at path: ${filePath}`);
-	    }
-	    fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, {
-	        encoding: 'utf8'
-	    });
-	}
-	fileCommand.issueFileCommand = issueFileCommand;
-	function prepareKeyValueMessage(key, value) {
-	    const delimiter = `ghadelimiter_${crypto.randomUUID()}`;
-	    const convertedValue = (0, utils_1.toCommandValue)(value);
-	    // These should realistically never happen, but just in case someone finds a
-	    // way to exploit uuid generation let's not allow keys or values that contain
-	    // the delimiter.
-	    if (key.includes(delimiter)) {
-	        throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
+	const debug = requireDebug();
+	const { MAX_LENGTH, MAX_SAFE_INTEGER } = requireConstants();
+	const { safeRe: re, t } = requireRe();
+
+	const parseOptions = requireParseOptions();
+	const { compareIdentifiers } = requireIdentifiers();
+	class SemVer {
+	  constructor (version, options) {
+	    options = parseOptions(options);
+
+	    if (version instanceof SemVer) {
+	      if (version.loose === !!options.loose &&
+	        version.includePrerelease === !!options.includePrerelease) {
+	        return version
+	      } else {
+	        version = version.version;
+	      }
+	    } else if (typeof version !== 'string') {
+	      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
 	    }
-	    if (convertedValue.includes(delimiter)) {
-	        throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
+
+	    if (version.length > MAX_LENGTH) {
+	      throw new TypeError(
+	        `version is longer than ${MAX_LENGTH} characters`
+	      )
 	    }
-	    return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
-	}
-	fileCommand.prepareKeyValueMessage = prepareKeyValueMessage;
-	
-	return fileCommand;
-}
 
-var oidcUtils = {};
+	    debug('SemVer', version, options);
+	    this.options = options;
+	    this.loose = !!options.loose;
+	    // this isn't actually relevant for versions, but keep it so that we
+	    // don't run into trouble passing this.options around.
+	    this.includePrerelease = !!options.includePrerelease;
 
-var lib = {};
+	    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
 
-var proxy = {};
+	    if (!m) {
+	      throw new TypeError(`Invalid Version: ${version}`)
+	    }
 
-var hasRequiredProxy;
+	    this.raw = version;
 
-function requireProxy () {
-	if (hasRequiredProxy) return proxy;
-	hasRequiredProxy = 1;
-	Object.defineProperty(proxy, "__esModule", { value: true });
-	proxy.checkBypass = proxy.getProxyUrl = void 0;
-	function getProxyUrl(reqUrl) {
-	    const usingSsl = reqUrl.protocol === 'https:';
-	    if (checkBypass(reqUrl)) {
-	        return undefined;
-	    }
-	    const proxyVar = (() => {
-	        if (usingSsl) {
-	            return process.env['https_proxy'] || process.env['HTTPS_PROXY'];
-	        }
-	        else {
-	            return process.env['http_proxy'] || process.env['HTTP_PROXY'];
-	        }
-	    })();
-	    if (proxyVar) {
-	        try {
-	            return new DecodedURL(proxyVar);
-	        }
-	        catch (_a) {
-	            if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))
-	                return new DecodedURL(`http://${proxyVar}`);
-	        }
-	    }
-	    else {
-	        return undefined;
-	    }
-	}
-	proxy.getProxyUrl = getProxyUrl;
-	function checkBypass(reqUrl) {
-	    if (!reqUrl.hostname) {
-	        return false;
-	    }
-	    const reqHost = reqUrl.hostname;
-	    if (isLoopbackAddress(reqHost)) {
-	        return true;
-	    }
-	    const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';
-	    if (!noProxy) {
-	        return false;
-	    }
-	    // Determine the request port
-	    let reqPort;
-	    if (reqUrl.port) {
-	        reqPort = Number(reqUrl.port);
-	    }
-	    else if (reqUrl.protocol === 'http:') {
-	        reqPort = 80;
+	    // these are actually numbers
+	    this.major = +m[1];
+	    this.minor = +m[2];
+	    this.patch = +m[3];
+
+	    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
+	      throw new TypeError('Invalid major version')
 	    }
-	    else if (reqUrl.protocol === 'https:') {
-	        reqPort = 443;
+
+	    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
+	      throw new TypeError('Invalid minor version')
 	    }
-	    // Format the request hostname and hostname with port
-	    const upperReqHosts = [reqUrl.hostname.toUpperCase()];
-	    if (typeof reqPort === 'number') {
-	        upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);
+
+	    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
+	      throw new TypeError('Invalid patch version')
 	    }
-	    // Compare request host against noproxy
-	    for (const upperNoProxyItem of noProxy
-	        .split(',')
-	        .map(x => x.trim().toUpperCase())
-	        .filter(x => x)) {
-	        if (upperNoProxyItem === '*' ||
-	            upperReqHosts.some(x => x === upperNoProxyItem ||
-	                x.endsWith(`.${upperNoProxyItem}`) ||
-	                (upperNoProxyItem.startsWith('.') &&
-	                    x.endsWith(`${upperNoProxyItem}`)))) {
-	            return true;
+
+	    // numberify any prerelease numeric ids
+	    if (!m[4]) {
+	      this.prerelease = [];
+	    } else {
+	      this.prerelease = m[4].split('.').map((id) => {
+	        if (/^[0-9]+$/.test(id)) {
+	          const num = +id;
+	          if (num >= 0 && num < MAX_SAFE_INTEGER) {
+	            return num
+	          }
 	        }
+	        return id
+	      });
 	    }
-	    return false;
-	}
-	proxy.checkBypass = checkBypass;
-	function isLoopbackAddress(host) {
-	    const hostLower = host.toLowerCase();
-	    return (hostLower === 'localhost' ||
-	        hostLower.startsWith('127.') ||
-	        hostLower.startsWith('[::1]') ||
-	        hostLower.startsWith('[0:0:0:0:0:0:0:1]'));
-	}
-	class DecodedURL extends URL {
-	    constructor(url, base) {
-	        super(url, base);
-	        this._decodedUsername = decodeURIComponent(super.username);
-	        this._decodedPassword = decodeURIComponent(super.password);
-	    }
-	    get username() {
-	        return this._decodedUsername;
-	    }
-	    get password() {
-	        return this._decodedPassword;
-	    }
-	}
-	
-	return proxy;
-}
 
-var hasRequiredLib;
+	    this.build = m[5] ? m[5].split('.') : [];
+	    this.format();
+	  }
 
-function requireLib () {
-	if (hasRequiredLib) return lib;
-	hasRequiredLib = 1;
-	/* eslint-disable @typescript-eslint/no-explicit-any */
-	var __createBinding = (lib && lib.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    var desc = Object.getOwnPropertyDescriptor(m, k);
-	    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-	      desc = { enumerable: true, get: function() { return m[k]; } };
-	    }
-	    Object.defineProperty(o, k2, desc);
-	}) : (function(o, m, k, k2) {
-	    if (k2 === undefined) k2 = k;
-	    o[k2] = m[k];
-	}));
-	var __setModuleDefault = (lib && lib.__setModuleDefault) || (Object.create ? (function(o, v) {
-	    Object.defineProperty(o, "default", { enumerable: true, value: v });
-	}) : function(o, v) {
-	    o["default"] = v;
-	});
-	var __importStar = (lib && lib.__importStar) || function (mod) {
-	    if (mod && mod.__esModule) return mod;
-	    var result = {};
-	    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-	    __setModuleDefault(result, mod);
-	    return result;
-	};
-	var __awaiter = (lib && lib.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(lib, "__esModule", { value: true });
-	lib.HttpClient = lib.isHttps = lib.HttpClientResponse = lib.HttpClientError = lib.getProxyUrl = lib.MediaTypes = lib.Headers = lib.HttpCodes = void 0;
-	const http = __importStar(require$$0$5);
-	const https = __importStar(require$$1$2);
-	const pm = __importStar(requireProxy());
-	const tunnel = __importStar(requireTunnel());
-	const undici_1 = requireUndici();
-	var HttpCodes;
-	(function (HttpCodes) {
-	    HttpCodes[HttpCodes["OK"] = 200] = "OK";
-	    HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";
-	    HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";
-	    HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";
-	    HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";
-	    HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";
-	    HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";
-	    HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";
-	    HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";
-	    HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";
-	    HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";
-	    HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";
-	    HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";
-	    HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";
-	    HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";
-	    HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";
-	    HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";
-	    HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
-	    HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
-	    HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
-	    HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
-	    HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";
-	    HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
-	    HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
-	    HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
-	    HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";
-	    HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";
-	})(HttpCodes || (lib.HttpCodes = HttpCodes = {}));
-	var Headers;
-	(function (Headers) {
-	    Headers["Accept"] = "accept";
-	    Headers["ContentType"] = "content-type";
-	})(Headers || (lib.Headers = Headers = {}));
-	var MediaTypes;
-	(function (MediaTypes) {
-	    MediaTypes["ApplicationJson"] = "application/json";
-	})(MediaTypes || (lib.MediaTypes = MediaTypes = {}));
-	/**
-	 * Returns the proxy URL, depending upon the supplied url and proxy environment variables.
-	 * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
-	 */
-	function getProxyUrl(serverUrl) {
-	    const proxyUrl = pm.getProxyUrl(new URL(serverUrl));
-	    return proxyUrl ? proxyUrl.href : '';
-	}
-	lib.getProxyUrl = getProxyUrl;
-	const HttpRedirectCodes = [
-	    HttpCodes.MovedPermanently,
-	    HttpCodes.ResourceMoved,
-	    HttpCodes.SeeOther,
-	    HttpCodes.TemporaryRedirect,
-	    HttpCodes.PermanentRedirect
-	];
-	const HttpResponseRetryCodes = [
-	    HttpCodes.BadGateway,
-	    HttpCodes.ServiceUnavailable,
-	    HttpCodes.GatewayTimeout
-	];
-	const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
-	const ExponentialBackoffCeiling = 10;
-	const ExponentialBackoffTimeSlice = 5;
-	class HttpClientError extends Error {
-	    constructor(message, statusCode) {
-	        super(message);
-	        this.name = 'HttpClientError';
-	        this.statusCode = statusCode;
-	        Object.setPrototypeOf(this, HttpClientError.prototype);
-	    }
-	}
-	lib.HttpClientError = HttpClientError;
-	class HttpClientResponse {
-	    constructor(message) {
-	        this.message = message;
-	    }
-	    readBody() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
-	                let output = Buffer.alloc(0);
-	                this.message.on('data', (chunk) => {
-	                    output = Buffer.concat([output, chunk]);
-	                });
-	                this.message.on('end', () => {
-	                    resolve(output.toString());
-	                });
-	            }));
-	        });
-	    }
-	    readBodyBuffer() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
-	                const chunks = [];
-	                this.message.on('data', (chunk) => {
-	                    chunks.push(chunk);
-	                });
-	                this.message.on('end', () => {
-	                    resolve(Buffer.concat(chunks));
-	                });
-	            }));
-	        });
-	    }
-	}
-	lib.HttpClientResponse = HttpClientResponse;
-	function isHttps(requestUrl) {
-	    const parsedUrl = new URL(requestUrl);
-	    return parsedUrl.protocol === 'https:';
-	}
-	lib.isHttps = isHttps;
-	class HttpClient {
-	    constructor(userAgent, handlers, requestOptions) {
-	        this._ignoreSslError = false;
-	        this._allowRedirects = true;
-	        this._allowRedirectDowngrade = false;
-	        this._maxRedirects = 50;
-	        this._allowRetries = false;
-	        this._maxRetries = 1;
-	        this._keepAlive = false;
-	        this._disposed = false;
-	        this.userAgent = userAgent;
-	        this.handlers = handlers || [];
-	        this.requestOptions = requestOptions;
-	        if (requestOptions) {
-	            if (requestOptions.ignoreSslError != null) {
-	                this._ignoreSslError = requestOptions.ignoreSslError;
-	            }
-	            this._socketTimeout = requestOptions.socketTimeout;
-	            if (requestOptions.allowRedirects != null) {
-	                this._allowRedirects = requestOptions.allowRedirects;
-	            }
-	            if (requestOptions.allowRedirectDowngrade != null) {
-	                this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;
-	            }
-	            if (requestOptions.maxRedirects != null) {
-	                this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);
-	            }
-	            if (requestOptions.keepAlive != null) {
-	                this._keepAlive = requestOptions.keepAlive;
-	            }
-	            if (requestOptions.allowRetries != null) {
-	                this._allowRetries = requestOptions.allowRetries;
-	            }
-	            if (requestOptions.maxRetries != null) {
-	                this._maxRetries = requestOptions.maxRetries;
-	            }
-	        }
-	    }
-	    options(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    get(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('GET', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    del(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('DELETE', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    post(requestUrl, data, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('POST', requestUrl, data, additionalHeaders || {});
-	        });
-	    }
-	    patch(requestUrl, data, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('PATCH', requestUrl, data, additionalHeaders || {});
-	        });
-	    }
-	    put(requestUrl, data, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('PUT', requestUrl, data, additionalHeaders || {});
-	        });
-	    }
-	    head(requestUrl, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request('HEAD', requestUrl, null, additionalHeaders || {});
-	        });
-	    }
-	    sendStream(verb, requestUrl, stream, additionalHeaders) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return this.request(verb, requestUrl, stream, additionalHeaders);
-	        });
-	    }
-	    /**
-	     * Gets a typed object from an endpoint
-	     * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise
-	     */
-	    getJson(requestUrl, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            const res = yield this.get(requestUrl, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
+	  format () {
+	    this.version = `${this.major}.${this.minor}.${this.patch}`;
+	    if (this.prerelease.length) {
+	      this.version += `-${this.prerelease.join('.')}`;
 	    }
-	    postJson(requestUrl, obj, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const data = JSON.stringify(obj, null, 2);
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
-	            const res = yield this.post(requestUrl, data, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
+	    return this.version
+	  }
+
+	  toString () {
+	    return this.version
+	  }
+
+	  compare (other) {
+	    debug('SemVer.compare', this.version, this.options, other);
+	    if (!(other instanceof SemVer)) {
+	      if (typeof other === 'string' && other === this.version) {
+	        return 0
+	      }
+	      other = new SemVer(other, this.options);
 	    }
-	    putJson(requestUrl, obj, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const data = JSON.stringify(obj, null, 2);
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
-	            const res = yield this.put(requestUrl, data, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
+
+	    if (other.version === this.version) {
+	      return 0
 	    }
-	    patchJson(requestUrl, obj, additionalHeaders = {}) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const data = JSON.stringify(obj, null, 2);
-	            additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
-	            additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
-	            const res = yield this.patch(requestUrl, data, additionalHeaders);
-	            return this._processResponse(res, this.requestOptions);
-	        });
+
+	    return this.compareMain(other) || this.comparePre(other)
+	  }
+
+	  compareMain (other) {
+	    if (!(other instanceof SemVer)) {
+	      other = new SemVer(other, this.options);
 	    }
-	    /**
-	     * Makes a raw http request.
-	     * All other methods such as get, post, patch, and request ultimately call this.
-	     * Prefer get, del, post and patch
-	     */
-	    request(verb, requestUrl, data, headers) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            if (this._disposed) {
-	                throw new Error('Client has already been disposed.');
-	            }
-	            const parsedUrl = new URL(requestUrl);
-	            let info = this._prepareRequest(verb, parsedUrl, headers);
-	            // Only perform retries on reads since writes may not be idempotent.
-	            const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)
-	                ? this._maxRetries + 1
-	                : 1;
-	            let numTries = 0;
-	            let response;
-	            do {
-	                response = yield this.requestRaw(info, data);
-	                // Check if it's an authentication challenge
-	                if (response &&
-	                    response.message &&
-	                    response.message.statusCode === HttpCodes.Unauthorized) {
-	                    let authenticationHandler;
-	                    for (const handler of this.handlers) {
-	                        if (handler.canHandleAuthentication(response)) {
-	                            authenticationHandler = handler;
-	                            break;
-	                        }
-	                    }
-	                    if (authenticationHandler) {
-	                        return authenticationHandler.handleAuthentication(this, info, data);
-	                    }
-	                    else {
-	                        // We have received an unauthorized response but have no handlers to handle it.
-	                        // Let the response return to the caller.
-	                        return response;
-	                    }
-	                }
-	                let redirectsRemaining = this._maxRedirects;
-	                while (response.message.statusCode &&
-	                    HttpRedirectCodes.includes(response.message.statusCode) &&
-	                    this._allowRedirects &&
-	                    redirectsRemaining > 0) {
-	                    const redirectUrl = response.message.headers['location'];
-	                    if (!redirectUrl) {
-	                        // if there's no location to redirect to, we won't
-	                        break;
-	                    }
-	                    const parsedRedirectUrl = new URL(redirectUrl);
-	                    if (parsedUrl.protocol === 'https:' &&
-	                        parsedUrl.protocol !== parsedRedirectUrl.protocol &&
-	                        !this._allowRedirectDowngrade) {
-	                        throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');
-	                    }
-	                    // we need to finish reading the response before reassigning response
-	                    // which will leak the open socket.
-	                    yield response.readBody();
-	                    // strip authorization header if redirected to a different hostname
-	                    if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {
-	                        for (const header in headers) {
-	                            // header names are case insensitive
-	                            if (header.toLowerCase() === 'authorization') {
-	                                delete headers[header];
-	                            }
-	                        }
-	                    }
-	                    // let's make the request with the new redirectUrl
-	                    info = this._prepareRequest(verb, parsedRedirectUrl, headers);
-	                    response = yield this.requestRaw(info, data);
-	                    redirectsRemaining--;
-	                }
-	                if (!response.message.statusCode ||
-	                    !HttpResponseRetryCodes.includes(response.message.statusCode)) {
-	                    // If not a retry code, return immediately instead of retrying
-	                    return response;
-	                }
-	                numTries += 1;
-	                if (numTries < maxTries) {
-	                    yield response.readBody();
-	                    yield this._performExponentialBackoff(numTries);
-	                }
-	            } while (numTries < maxTries);
-	            return response;
-	        });
+
+	    if (this.major < other.major) {
+	      return -1
 	    }
-	    /**
-	     * Needs to be called if keepAlive is set to true in request options.
-	     */
-	    dispose() {
-	        if (this._agent) {
-	            this._agent.destroy();
-	        }
-	        this._disposed = true;
+	    if (this.major > other.major) {
+	      return 1
 	    }
-	    /**
-	     * Raw request.
-	     * @param info
-	     * @param data
-	     */
-	    requestRaw(info, data) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve, reject) => {
-	                function callbackForResult(err, res) {
-	                    if (err) {
-	                        reject(err);
-	                    }
-	                    else if (!res) {
-	                        // If `err` is not passed, then `res` must be passed.
-	                        reject(new Error('Unknown error'));
-	                    }
-	                    else {
-	                        resolve(res);
-	                    }
-	                }
-	                this.requestRawWithCallback(info, data, callbackForResult);
-	            });
-	        });
+	    if (this.minor < other.minor) {
+	      return -1
 	    }
-	    /**
-	     * Raw request with callback.
-	     * @param info
-	     * @param data
-	     * @param onResult
-	     */
-	    requestRawWithCallback(info, data, onResult) {
-	        if (typeof data === 'string') {
-	            if (!info.options.headers) {
-	                info.options.headers = {};
-	            }
-	            info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
-	        }
-	        let callbackCalled = false;
-	        function handleResult(err, res) {
-	            if (!callbackCalled) {
-	                callbackCalled = true;
-	                onResult(err, res);
-	            }
-	        }
-	        const req = info.httpModule.request(info.options, (msg) => {
-	            const res = new HttpClientResponse(msg);
-	            handleResult(undefined, res);
-	        });
-	        let socket;
-	        req.on('socket', sock => {
-	            socket = sock;
-	        });
-	        // If we ever get disconnected, we want the socket to timeout eventually
-	        req.setTimeout(this._socketTimeout || 3 * 60000, () => {
-	            if (socket) {
-	                socket.end();
-	            }
-	            handleResult(new Error(`Request timeout: ${info.options.path}`));
-	        });
-	        req.on('error', function (err) {
-	            // err has statusCode property
-	            // res should have headers
-	            handleResult(err);
-	        });
-	        if (data && typeof data === 'string') {
-	            req.write(data, 'utf8');
-	        }
-	        if (data && typeof data !== 'string') {
-	            data.on('close', function () {
-	                req.end();
-	            });
-	            data.pipe(req);
-	        }
-	        else {
-	            req.end();
-	        }
+	    if (this.minor > other.minor) {
+	      return 1
 	    }
-	    /**
-	     * Gets an http agent. This function is useful when you need an http agent that handles
-	     * routing through a proxy server - depending upon the url and proxy environment variables.
-	     * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
-	     */
-	    getAgent(serverUrl) {
-	        const parsedUrl = new URL(serverUrl);
-	        return this._getAgent(parsedUrl);
+	    if (this.patch < other.patch) {
+	      return -1
 	    }
-	    getAgentDispatcher(serverUrl) {
-	        const parsedUrl = new URL(serverUrl);
-	        const proxyUrl = pm.getProxyUrl(parsedUrl);
-	        const useProxy = proxyUrl && proxyUrl.hostname;
-	        if (!useProxy) {
-	            return;
-	        }
-	        return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);
+	    if (this.patch > other.patch) {
+	      return 1
 	    }
-	    _prepareRequest(method, requestUrl, headers) {
-	        const info = {};
-	        info.parsedUrl = requestUrl;
-	        const usingSsl = info.parsedUrl.protocol === 'https:';
-	        info.httpModule = usingSsl ? https : http;
-	        const defaultPort = usingSsl ? 443 : 80;
-	        info.options = {};
-	        info.options.host = info.parsedUrl.hostname;
-	        info.options.port = info.parsedUrl.port
-	            ? parseInt(info.parsedUrl.port)
-	            : defaultPort;
-	        info.options.path =
-	            (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
-	        info.options.method = method;
-	        info.options.headers = this._mergeHeaders(headers);
-	        if (this.userAgent != null) {
-	            info.options.headers['user-agent'] = this.userAgent;
-	        }
-	        info.options.agent = this._getAgent(info.parsedUrl);
-	        // gives handlers an opportunity to participate
-	        if (this.handlers) {
-	            for (const handler of this.handlers) {
-	                handler.prepareRequest(info.options);
-	            }
-	        }
-	        return info;
+	    return 0
+	  }
+
+	  comparePre (other) {
+	    if (!(other instanceof SemVer)) {
+	      other = new SemVer(other, this.options);
 	    }
-	    _mergeHeaders(headers) {
-	        if (this.requestOptions && this.requestOptions.headers) {
-	            return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));
-	        }
-	        return lowercaseKeys(headers || {});
+
+	    // NOT having a prerelease is > having one
+	    if (this.prerelease.length && !other.prerelease.length) {
+	      return -1
+	    } else if (!this.prerelease.length && other.prerelease.length) {
+	      return 1
+	    } else if (!this.prerelease.length && !other.prerelease.length) {
+	      return 0
 	    }
-	    _getExistingOrDefaultHeader(additionalHeaders, header, _default) {
-	        let clientHeader;
-	        if (this.requestOptions && this.requestOptions.headers) {
-	            clientHeader = lowercaseKeys(this.requestOptions.headers)[header];
+
+	    let i = 0;
+	    do {
+	      const a = this.prerelease[i];
+	      const b = other.prerelease[i];
+	      debug('prerelease compare', i, a, b);
+	      if (a === undefined && b === undefined) {
+	        return 0
+	      } else if (b === undefined) {
+	        return 1
+	      } else if (a === undefined) {
+	        return -1
+	      } else if (a === b) {
+	        continue
+	      } else {
+	        return compareIdentifiers(a, b)
+	      }
+	    } while (++i)
+	  }
+
+	  compareBuild (other) {
+	    if (!(other instanceof SemVer)) {
+	      other = new SemVer(other, this.options);
+	    }
+
+	    let i = 0;
+	    do {
+	      const a = this.build[i];
+	      const b = other.build[i];
+	      debug('build compare', i, a, b);
+	      if (a === undefined && b === undefined) {
+	        return 0
+	      } else if (b === undefined) {
+	        return 1
+	      } else if (a === undefined) {
+	        return -1
+	      } else if (a === b) {
+	        continue
+	      } else {
+	        return compareIdentifiers(a, b)
+	      }
+	    } while (++i)
+	  }
+
+	  // preminor will bump the version up to the next minor release, and immediately
+	  // down to pre-release. premajor and prepatch work the same way.
+	  inc (release, identifier, identifierBase) {
+	    if (release.startsWith('pre')) {
+	      if (!identifier && identifierBase === false) {
+	        throw new Error('invalid increment argument: identifier is empty')
+	      }
+	      // Avoid an invalid semver results
+	      if (identifier) {
+	        const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
+	        if (!match || match[1] !== identifier) {
+	          throw new Error(`invalid identifier: ${identifier}`)
 	        }
-	        return additionalHeaders[header] || clientHeader || _default;
+	      }
 	    }
-	    _getAgent(parsedUrl) {
-	        let agent;
-	        const proxyUrl = pm.getProxyUrl(parsedUrl);
-	        const useProxy = proxyUrl && proxyUrl.hostname;
-	        if (this._keepAlive && useProxy) {
-	            agent = this._proxyAgent;
+
+	    switch (release) {
+	      case 'premajor':
+	        this.prerelease.length = 0;
+	        this.patch = 0;
+	        this.minor = 0;
+	        this.major++;
+	        this.inc('pre', identifier, identifierBase);
+	        break
+	      case 'preminor':
+	        this.prerelease.length = 0;
+	        this.patch = 0;
+	        this.minor++;
+	        this.inc('pre', identifier, identifierBase);
+	        break
+	      case 'prepatch':
+	        // If this is already a prerelease, it will bump to the next version
+	        // drop any prereleases that might already exist, since they are not
+	        // relevant at this point.
+	        this.prerelease.length = 0;
+	        this.inc('patch', identifier, identifierBase);
+	        this.inc('pre', identifier, identifierBase);
+	        break
+	      // If the input is a non-prerelease version, this acts the same as
+	      // prepatch.
+	      case 'prerelease':
+	        if (this.prerelease.length === 0) {
+	          this.inc('patch', identifier, identifierBase);
 	        }
-	        if (!useProxy) {
-	            agent = this._agent;
+	        this.inc('pre', identifier, identifierBase);
+	        break
+	      case 'release':
+	        if (this.prerelease.length === 0) {
+	          throw new Error(`version ${this.raw} is not a prerelease`)
 	        }
-	        // if agent is already assigned use that agent.
-	        if (agent) {
-	            return agent;
+	        this.prerelease.length = 0;
+	        break
+
+	      case 'major':
+	        // If this is a pre-major version, bump up to the same major version.
+	        // Otherwise increment major.
+	        // 1.0.0-5 bumps to 1.0.0
+	        // 1.1.0 bumps to 2.0.0
+	        if (
+	          this.minor !== 0 ||
+	          this.patch !== 0 ||
+	          this.prerelease.length === 0
+	        ) {
+	          this.major++;
 	        }
-	        const usingSsl = parsedUrl.protocol === 'https:';
-	        let maxSockets = 100;
-	        if (this.requestOptions) {
-	            maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;
+	        this.minor = 0;
+	        this.patch = 0;
+	        this.prerelease = [];
+	        break
+	      case 'minor':
+	        // If this is a pre-minor version, bump up to the same minor version.
+	        // Otherwise increment minor.
+	        // 1.2.0-5 bumps to 1.2.0
+	        // 1.2.1 bumps to 1.3.0
+	        if (this.patch !== 0 || this.prerelease.length === 0) {
+	          this.minor++;
 	        }
-	        // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.
-	        if (proxyUrl && proxyUrl.hostname) {
-	            const agentOptions = {
-	                maxSockets,
-	                keepAlive: this._keepAlive,
-	                proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {
-	                    proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`
-	                })), { host: proxyUrl.hostname, port: proxyUrl.port })
-	            };
-	            let tunnelAgent;
-	            const overHttps = proxyUrl.protocol === 'https:';
-	            if (usingSsl) {
-	                tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;
+	        this.patch = 0;
+	        this.prerelease = [];
+	        break
+	      case 'patch':
+	        // If this is not a pre-release version, it will increment the patch.
+	        // If it is a pre-release it will bump up to the same patch version.
+	        // 1.2.0-5 patches to 1.2.0
+	        // 1.2.0 patches to 1.2.1
+	        if (this.prerelease.length === 0) {
+	          this.patch++;
+	        }
+	        this.prerelease = [];
+	        break
+	      // This probably shouldn't be used publicly.
+	      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
+	      case 'pre': {
+	        const base = Number(identifierBase) ? 1 : 0;
+
+	        if (this.prerelease.length === 0) {
+	          this.prerelease = [base];
+	        } else {
+	          let i = this.prerelease.length;
+	          while (--i >= 0) {
+	            if (typeof this.prerelease[i] === 'number') {
+	              this.prerelease[i]++;
+	              i = -2;
 	            }
-	            else {
-	                tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;
+	          }
+	          if (i === -1) {
+	            // didn't increment anything
+	            if (identifier === this.prerelease.join('.') && identifierBase === false) {
+	              throw new Error('invalid increment argument: identifier already exists')
 	            }
-	            agent = tunnelAgent(agentOptions);
-	            this._proxyAgent = agent;
-	        }
-	        // if tunneling agent isn't assigned create a new agent
-	        if (!agent) {
-	            const options = { keepAlive: this._keepAlive, maxSockets };
-	            agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
-	            this._agent = agent;
+	            this.prerelease.push(base);
+	          }
 	        }
-	        if (usingSsl && this._ignoreSslError) {
-	            // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
-	            // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
-	            // we have to cast it to any and change it directly
-	            agent.options = Object.assign(agent.options || {}, {
-	                rejectUnauthorized: false
-	            });
+	        if (identifier) {
+	          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
+	          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
+	          let prerelease = [identifier, base];
+	          if (identifierBase === false) {
+	            prerelease = [identifier];
+	          }
+	          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
+	            if (isNaN(this.prerelease[1])) {
+	              this.prerelease = prerelease;
+	            }
+	          } else {
+	            this.prerelease = prerelease;
+	          }
 	        }
-	        return agent;
+	        break
+	      }
+	      default:
+	        throw new Error(`invalid increment argument: ${release}`)
+	    }
+	    this.raw = this.format();
+	    if (this.build.length) {
+	      this.raw += `+${this.build.join('.')}`;
+	    }
+	    return this
+	  }
+	}
+
+	semver$2 = SemVer;
+	return semver$2;
+}
+
+var parse_1;
+var hasRequiredParse;
+
+function requireParse () {
+	if (hasRequiredParse) return parse_1;
+	hasRequiredParse = 1;
+
+	const SemVer = requireSemver$2();
+	const parse = (version, options, throwErrors = false) => {
+	  if (version instanceof SemVer) {
+	    return version
+	  }
+	  try {
+	    return new SemVer(version, options)
+	  } catch (er) {
+	    if (!throwErrors) {
+	      return null
+	    }
+	    throw er
+	  }
+	};
+
+	parse_1 = parse;
+	return parse_1;
+}
+
+var valid_1;
+var hasRequiredValid$1;
+
+function requireValid$1 () {
+	if (hasRequiredValid$1) return valid_1;
+	hasRequiredValid$1 = 1;
+
+	const parse = requireParse();
+	const valid = (version, options) => {
+	  const v = parse(version, options);
+	  return v ? v.version : null
+	};
+	valid_1 = valid;
+	return valid_1;
+}
+
+var clean_1;
+var hasRequiredClean;
+
+function requireClean () {
+	if (hasRequiredClean) return clean_1;
+	hasRequiredClean = 1;
+
+	const parse = requireParse();
+	const clean = (version, options) => {
+	  const s = parse(version.trim().replace(/^[=v]+/, ''), options);
+	  return s ? s.version : null
+	};
+	clean_1 = clean;
+	return clean_1;
+}
+
+var inc_1;
+var hasRequiredInc;
+
+function requireInc () {
+	if (hasRequiredInc) return inc_1;
+	hasRequiredInc = 1;
+
+	const SemVer = requireSemver$2();
+
+	const inc = (version, release, options, identifier, identifierBase) => {
+	  if (typeof (options) === 'string') {
+	    identifierBase = identifier;
+	    identifier = options;
+	    options = undefined;
+	  }
+
+	  try {
+	    return new SemVer(
+	      version instanceof SemVer ? version.version : version,
+	      options
+	    ).inc(release, identifier, identifierBase).version
+	  } catch (er) {
+	    return null
+	  }
+	};
+	inc_1 = inc;
+	return inc_1;
+}
+
+var diff_1;
+var hasRequiredDiff;
+
+function requireDiff () {
+	if (hasRequiredDiff) return diff_1;
+	hasRequiredDiff = 1;
+
+	const parse = requireParse();
+
+	const diff = (version1, version2) => {
+	  const v1 = parse(version1, null, true);
+	  const v2 = parse(version2, null, true);
+	  const comparison = v1.compare(v2);
+
+	  if (comparison === 0) {
+	    return null
+	  }
+
+	  const v1Higher = comparison > 0;
+	  const highVersion = v1Higher ? v1 : v2;
+	  const lowVersion = v1Higher ? v2 : v1;
+	  const highHasPre = !!highVersion.prerelease.length;
+	  const lowHasPre = !!lowVersion.prerelease.length;
+
+	  if (lowHasPre && !highHasPre) {
+	    // Going from prerelease -> no prerelease requires some special casing
+
+	    // If the low version has only a major, then it will always be a major
+	    // Some examples:
+	    // 1.0.0-1 -> 1.0.0
+	    // 1.0.0-1 -> 1.1.1
+	    // 1.0.0-1 -> 2.0.0
+	    if (!lowVersion.patch && !lowVersion.minor) {
+	      return 'major'
+	    }
+
+	    // If the main part has no difference
+	    if (lowVersion.compareMain(highVersion) === 0) {
+	      if (lowVersion.minor && !lowVersion.patch) {
+	        return 'minor'
+	      }
+	      return 'patch'
 	    }
-	    _getProxyAgentDispatcher(parsedUrl, proxyUrl) {
-	        let proxyAgent;
-	        if (this._keepAlive) {
-	            proxyAgent = this._proxyAgentDispatcher;
-	        }
-	        // if agent is already assigned use that agent.
-	        if (proxyAgent) {
-	            return proxyAgent;
-	        }
-	        const usingSsl = parsedUrl.protocol === 'https:';
-	        proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {
-	            token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}`
-	        })));
-	        this._proxyAgentDispatcher = proxyAgent;
-	        if (usingSsl && this._ignoreSslError) {
-	            // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
-	            // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
-	            // we have to cast it to any and change it directly
-	            proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {
-	                rejectUnauthorized: false
-	            });
-	        }
-	        return proxyAgent;
+	  }
+
+	  // add the `pre` prefix if we are going to a prerelease version
+	  const prefix = highHasPre ? 'pre' : '';
+
+	  if (v1.major !== v2.major) {
+	    return prefix + 'major'
+	  }
+
+	  if (v1.minor !== v2.minor) {
+	    return prefix + 'minor'
+	  }
+
+	  if (v1.patch !== v2.patch) {
+	    return prefix + 'patch'
+	  }
+
+	  // high and low are preleases
+	  return 'prerelease'
+	};
+
+	diff_1 = diff;
+	return diff_1;
+}
+
+var major_1;
+var hasRequiredMajor;
+
+function requireMajor () {
+	if (hasRequiredMajor) return major_1;
+	hasRequiredMajor = 1;
+
+	const SemVer = requireSemver$2();
+	const major = (a, loose) => new SemVer(a, loose).major;
+	major_1 = major;
+	return major_1;
+}
+
+var minor_1;
+var hasRequiredMinor;
+
+function requireMinor () {
+	if (hasRequiredMinor) return minor_1;
+	hasRequiredMinor = 1;
+
+	const SemVer = requireSemver$2();
+	const minor = (a, loose) => new SemVer(a, loose).minor;
+	minor_1 = minor;
+	return minor_1;
+}
+
+var patch_1;
+var hasRequiredPatch;
+
+function requirePatch () {
+	if (hasRequiredPatch) return patch_1;
+	hasRequiredPatch = 1;
+
+	const SemVer = requireSemver$2();
+	const patch = (a, loose) => new SemVer(a, loose).patch;
+	patch_1 = patch;
+	return patch_1;
+}
+
+var prerelease_1;
+var hasRequiredPrerelease;
+
+function requirePrerelease () {
+	if (hasRequiredPrerelease) return prerelease_1;
+	hasRequiredPrerelease = 1;
+
+	const parse = requireParse();
+	const prerelease = (version, options) => {
+	  const parsed = parse(version, options);
+	  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
+	};
+	prerelease_1 = prerelease;
+	return prerelease_1;
+}
+
+var compare_1;
+var hasRequiredCompare;
+
+function requireCompare () {
+	if (hasRequiredCompare) return compare_1;
+	hasRequiredCompare = 1;
+
+	const SemVer = requireSemver$2();
+	const compare = (a, b, loose) =>
+	  new SemVer(a, loose).compare(new SemVer(b, loose));
+
+	compare_1 = compare;
+	return compare_1;
+}
+
+var rcompare_1;
+var hasRequiredRcompare;
+
+function requireRcompare () {
+	if (hasRequiredRcompare) return rcompare_1;
+	hasRequiredRcompare = 1;
+
+	const compare = requireCompare();
+	const rcompare = (a, b, loose) => compare(b, a, loose);
+	rcompare_1 = rcompare;
+	return rcompare_1;
+}
+
+var compareLoose_1;
+var hasRequiredCompareLoose;
+
+function requireCompareLoose () {
+	if (hasRequiredCompareLoose) return compareLoose_1;
+	hasRequiredCompareLoose = 1;
+
+	const compare = requireCompare();
+	const compareLoose = (a, b) => compare(a, b, true);
+	compareLoose_1 = compareLoose;
+	return compareLoose_1;
+}
+
+var compareBuild_1;
+var hasRequiredCompareBuild;
+
+function requireCompareBuild () {
+	if (hasRequiredCompareBuild) return compareBuild_1;
+	hasRequiredCompareBuild = 1;
+
+	const SemVer = requireSemver$2();
+	const compareBuild = (a, b, loose) => {
+	  const versionA = new SemVer(a, loose);
+	  const versionB = new SemVer(b, loose);
+	  return versionA.compare(versionB) || versionA.compareBuild(versionB)
+	};
+	compareBuild_1 = compareBuild;
+	return compareBuild_1;
+}
+
+var sort_1;
+var hasRequiredSort;
+
+function requireSort () {
+	if (hasRequiredSort) return sort_1;
+	hasRequiredSort = 1;
+
+	const compareBuild = requireCompareBuild();
+	const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
+	sort_1 = sort;
+	return sort_1;
+}
+
+var rsort_1;
+var hasRequiredRsort;
+
+function requireRsort () {
+	if (hasRequiredRsort) return rsort_1;
+	hasRequiredRsort = 1;
+
+	const compareBuild = requireCompareBuild();
+	const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
+	rsort_1 = rsort;
+	return rsort_1;
+}
+
+var gt_1;
+var hasRequiredGt;
+
+function requireGt () {
+	if (hasRequiredGt) return gt_1;
+	hasRequiredGt = 1;
+
+	const compare = requireCompare();
+	const gt = (a, b, loose) => compare(a, b, loose) > 0;
+	gt_1 = gt;
+	return gt_1;
+}
+
+var lt_1;
+var hasRequiredLt;
+
+function requireLt () {
+	if (hasRequiredLt) return lt_1;
+	hasRequiredLt = 1;
+
+	const compare = requireCompare();
+	const lt = (a, b, loose) => compare(a, b, loose) < 0;
+	lt_1 = lt;
+	return lt_1;
+}
+
+var eq_1;
+var hasRequiredEq;
+
+function requireEq () {
+	if (hasRequiredEq) return eq_1;
+	hasRequiredEq = 1;
+
+	const compare = requireCompare();
+	const eq = (a, b, loose) => compare(a, b, loose) === 0;
+	eq_1 = eq;
+	return eq_1;
+}
+
+var neq_1;
+var hasRequiredNeq;
+
+function requireNeq () {
+	if (hasRequiredNeq) return neq_1;
+	hasRequiredNeq = 1;
+
+	const compare = requireCompare();
+	const neq = (a, b, loose) => compare(a, b, loose) !== 0;
+	neq_1 = neq;
+	return neq_1;
+}
+
+var gte_1;
+var hasRequiredGte;
+
+function requireGte () {
+	if (hasRequiredGte) return gte_1;
+	hasRequiredGte = 1;
+
+	const compare = requireCompare();
+	const gte = (a, b, loose) => compare(a, b, loose) >= 0;
+	gte_1 = gte;
+	return gte_1;
+}
+
+var lte_1;
+var hasRequiredLte;
+
+function requireLte () {
+	if (hasRequiredLte) return lte_1;
+	hasRequiredLte = 1;
+
+	const compare = requireCompare();
+	const lte = (a, b, loose) => compare(a, b, loose) <= 0;
+	lte_1 = lte;
+	return lte_1;
+}
+
+var cmp_1;
+var hasRequiredCmp;
+
+function requireCmp () {
+	if (hasRequiredCmp) return cmp_1;
+	hasRequiredCmp = 1;
+
+	const eq = requireEq();
+	const neq = requireNeq();
+	const gt = requireGt();
+	const gte = requireGte();
+	const lt = requireLt();
+	const lte = requireLte();
+
+	const cmp = (a, op, b, loose) => {
+	  switch (op) {
+	    case '===':
+	      if (typeof a === 'object') {
+	        a = a.version;
+	      }
+	      if (typeof b === 'object') {
+	        b = b.version;
+	      }
+	      return a === b
+
+	    case '!==':
+	      if (typeof a === 'object') {
+	        a = a.version;
+	      }
+	      if (typeof b === 'object') {
+	        b = b.version;
+	      }
+	      return a !== b
+
+	    case '':
+	    case '=':
+	    case '==':
+	      return eq(a, b, loose)
+
+	    case '!=':
+	      return neq(a, b, loose)
+
+	    case '>':
+	      return gt(a, b, loose)
+
+	    case '>=':
+	      return gte(a, b, loose)
+
+	    case '<':
+	      return lt(a, b, loose)
+
+	    case '<=':
+	      return lte(a, b, loose)
+
+	    default:
+	      throw new TypeError(`Invalid operator: ${op}`)
+	  }
+	};
+	cmp_1 = cmp;
+	return cmp_1;
+}
+
+var coerce_1;
+var hasRequiredCoerce;
+
+function requireCoerce () {
+	if (hasRequiredCoerce) return coerce_1;
+	hasRequiredCoerce = 1;
+
+	const SemVer = requireSemver$2();
+	const parse = requireParse();
+	const { safeRe: re, t } = requireRe();
+
+	const coerce = (version, options) => {
+	  if (version instanceof SemVer) {
+	    return version
+	  }
+
+	  if (typeof version === 'number') {
+	    version = String(version);
+	  }
+
+	  if (typeof version !== 'string') {
+	    return null
+	  }
+
+	  options = options || {};
+
+	  let match = null;
+	  if (!options.rtl) {
+	    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
+	  } else {
+	    // Find the right-most coercible string that does not share
+	    // a terminus with a more left-ward coercible string.
+	    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
+	    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
+	    //
+	    // Walk through the string checking with a /g regexp
+	    // Manually set the index so as to pick up overlapping matches.
+	    // Stop when we get a match that ends at the string end, since no
+	    // coercible string can be more right-ward without the same terminus.
+	    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
+	    let next;
+	    while ((next = coerceRtlRegex.exec(version)) &&
+	        (!match || match.index + match[0].length !== version.length)
+	    ) {
+	      if (!match ||
+	            next.index + next[0].length !== match.index + match[0].length) {
+	        match = next;
+	      }
+	      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
 	    }
-	    _performExponentialBackoff(retryNumber) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);
-	            const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);
-	            return new Promise(resolve => setTimeout(() => resolve(), ms));
-	        });
+	    // leave it in a clean state
+	    coerceRtlRegex.lastIndex = -1;
+	  }
+
+	  if (match === null) {
+	    return null
+	  }
+
+	  const major = match[2];
+	  const minor = match[3] || '0';
+	  const patch = match[4] || '0';
+	  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '';
+	  const build = options.includePrerelease && match[6] ? `+${match[6]}` : '';
+
+	  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
+	};
+	coerce_1 = coerce;
+	return coerce_1;
+}
+
+var lrucache;
+var hasRequiredLrucache;
+
+function requireLrucache () {
+	if (hasRequiredLrucache) return lrucache;
+	hasRequiredLrucache = 1;
+
+	class LRUCache {
+	  constructor () {
+	    this.max = 1000;
+	    this.map = new Map();
+	  }
+
+	  get (key) {
+	    const value = this.map.get(key);
+	    if (value === undefined) {
+	      return undefined
+	    } else {
+	      // Remove the key from the map and add it to the end
+	      this.map.delete(key);
+	      this.map.set(key, value);
+	      return value
 	    }
-	    _processResponse(res, options) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
-	                const statusCode = res.message.statusCode || 0;
-	                const response = {
-	                    statusCode,
-	                    result: null,
-	                    headers: {}
-	                };
-	                // not found leads to null obj returned
-	                if (statusCode === HttpCodes.NotFound) {
-	                    resolve(response);
-	                }
-	                // get the result from the body
-	                function dateTimeDeserializer(key, value) {
-	                    if (typeof value === 'string') {
-	                        const a = new Date(value);
-	                        if (!isNaN(a.valueOf())) {
-	                            return a;
-	                        }
-	                    }
-	                    return value;
-	                }
-	                let obj;
-	                let contents;
-	                try {
-	                    contents = yield res.readBody();
-	                    if (contents && contents.length > 0) {
-	                        if (options && options.deserializeDates) {
-	                            obj = JSON.parse(contents, dateTimeDeserializer);
-	                        }
-	                        else {
-	                            obj = JSON.parse(contents);
-	                        }
-	                        response.result = obj;
-	                    }
-	                    response.headers = res.message.headers;
-	                }
-	                catch (err) {
-	                    // Invalid resource (contents not json);  leaving result obj null
-	                }
-	                // note that 3xx redirects are handled by the http layer.
-	                if (statusCode > 299) {
-	                    let msg;
-	                    // if exception/error in body, attempt to get better error
-	                    if (obj && obj.message) {
-	                        msg = obj.message;
-	                    }
-	                    else if (contents && contents.length > 0) {
-	                        // it may be the case that the exception is in the body message as string
-	                        msg = contents;
-	                    }
-	                    else {
-	                        msg = `Failed request: (${statusCode})`;
-	                    }
-	                    const err = new HttpClientError(msg, statusCode);
-	                    err.result = response.result;
-	                    reject(err);
-	                }
-	                else {
-	                    resolve(response);
-	                }
-	            }));
-	        });
+	  }
+
+	  delete (key) {
+	    return this.map.delete(key)
+	  }
+
+	  set (key, value) {
+	    const deleted = this.delete(key);
+
+	    if (!deleted && value !== undefined) {
+	      // If cache is full, delete the least recently used item
+	      if (this.map.size >= this.max) {
+	        const firstKey = this.map.keys().next().value;
+	        this.delete(firstKey);
+	      }
+
+	      this.map.set(key, value);
 	    }
+
+	    return this
+	  }
 	}
-	lib.HttpClient = HttpClient;
-	const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
-	
-	return lib;
+
+	lrucache = LRUCache;
+	return lrucache;
 }
 
-var auth = {};
+var range;
+var hasRequiredRange;
 
-var hasRequiredAuth;
+function requireRange () {
+	if (hasRequiredRange) return range;
+	hasRequiredRange = 1;
 
-function requireAuth () {
-	if (hasRequiredAuth) return auth;
-	hasRequiredAuth = 1;
-	var __awaiter = (auth && auth.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
-	    });
-	};
-	Object.defineProperty(auth, "__esModule", { value: true });
-	auth.PersonalAccessTokenCredentialHandler = auth.BearerCredentialHandler = auth.BasicCredentialHandler = void 0;
-	class BasicCredentialHandler {
-	    constructor(username, password) {
-	        this.username = username;
-	        this.password = password;
-	    }
-	    prepareRequest(options) {
-	        if (!options.headers) {
-	            throw Error('The request has no headers');
-	        }
-	        options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;
+	const SPACE_CHARACTERS = /\s+/g;
+
+	// hoisted class for cyclic dependency
+	class Range {
+	  constructor (range, options) {
+	    options = parseOptions(options);
+
+	    if (range instanceof Range) {
+	      if (
+	        range.loose === !!options.loose &&
+	        range.includePrerelease === !!options.includePrerelease
+	      ) {
+	        return range
+	      } else {
+	        return new Range(range.raw, options)
+	      }
 	    }
-	    // This handler cannot handle 401
-	    canHandleAuthentication() {
-	        return false;
+
+	    if (range instanceof Comparator) {
+	      // just put it in the set and return
+	      this.raw = range.value;
+	      this.set = [[range]];
+	      this.formatted = undefined;
+	      return this
 	    }
-	    handleAuthentication() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            throw new Error('not implemented');
-	        });
+
+	    this.options = options;
+	    this.loose = !!options.loose;
+	    this.includePrerelease = !!options.includePrerelease;
+
+	    // First reduce all whitespace as much as possible so we do not have to rely
+	    // on potentially slow regexes like \s*. This is then stored and used for
+	    // future error messages as well.
+	    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ');
+
+	    // First, split on ||
+	    this.set = this.raw
+	      .split('||')
+	      // map the range to a 2d array of comparators
+	      .map(r => this.parseRange(r.trim()))
+	      // throw out any comparator lists that are empty
+	      // this generally means that it was not a valid range, which is allowed
+	      // in loose mode, but will still throw if the WHOLE range is invalid.
+	      .filter(c => c.length);
+
+	    if (!this.set.length) {
+	      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
 	    }
-	}
-	auth.BasicCredentialHandler = BasicCredentialHandler;
-	class BearerCredentialHandler {
-	    constructor(token) {
-	        this.token = token;
+
+	    // if we have any that are not the null set, throw out null sets.
+	    if (this.set.length > 1) {
+	      // keep the first one, in case they're all null sets
+	      const first = this.set[0];
+	      this.set = this.set.filter(c => !isNullSet(c[0]));
+	      if (this.set.length === 0) {
+	        this.set = [first];
+	      } else if (this.set.length > 1) {
+	        // if we have any that are *, then the range is just *
+	        for (const c of this.set) {
+	          if (c.length === 1 && isAny(c[0])) {
+	            this.set = [c];
+	            break
+	          }
+	        }
+	      }
 	    }
-	    // currently implements pre-authorization
-	    // TODO: support preAuth = false where it hooks on 401
-	    prepareRequest(options) {
-	        if (!options.headers) {
-	            throw Error('The request has no headers');
+
+	    this.formatted = undefined;
+	  }
+
+	  get range () {
+	    if (this.formatted === undefined) {
+	      this.formatted = '';
+	      for (let i = 0; i < this.set.length; i++) {
+	        if (i > 0) {
+	          this.formatted += '||';
 	        }
-	        options.headers['Authorization'] = `Bearer ${this.token}`;
+	        const comps = this.set[i];
+	        for (let k = 0; k < comps.length; k++) {
+	          if (k > 0) {
+	            this.formatted += ' ';
+	          }
+	          this.formatted += comps[k].toString().trim();
+	        }
+	      }
 	    }
-	    // This handler cannot handle 401
-	    canHandleAuthentication() {
-	        return false;
+	    return this.formatted
+	  }
+
+	  format () {
+	    return this.range
+	  }
+
+	  toString () {
+	    return this.range
+	  }
+
+	  parseRange (range) {
+	    // memoize range parsing for performance.
+	    // this is a very hot path, and fully deterministic.
+	    const memoOpts =
+	      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
+	      (this.options.loose && FLAG_LOOSE);
+	    const memoKey = memoOpts + ':' + range;
+	    const cached = cache.get(memoKey);
+	    if (cached) {
+	      return cached
 	    }
-	    handleAuthentication() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            throw new Error('not implemented');
-	        });
+
+	    const loose = this.options.loose;
+	    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
+	    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
+	    range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
+	    debug('hyphen replace', range);
+
+	    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
+	    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
+	    debug('comparator trim', range);
+
+	    // `~ 1.2.3` => `~1.2.3`
+	    range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
+	    debug('tilde trim', range);
+
+	    // `^ 1.2.3` => `^1.2.3`
+	    range = range.replace(re[t.CARETTRIM], caretTrimReplace);
+	    debug('caret trim', range);
+
+	    // At this point, the range is completely trimmed and
+	    // ready to be split into comparators.
+
+	    let rangeList = range
+	      .split(' ')
+	      .map(comp => parseComparator(comp, this.options))
+	      .join(' ')
+	      .split(/\s+/)
+	      // >=0.0.0 is equivalent to *
+	      .map(comp => replaceGTE0(comp, this.options));
+
+	    if (loose) {
+	      // in loose mode, throw out any that are not valid comparators
+	      rangeList = rangeList.filter(comp => {
+	        debug('loose invalid filter', comp, this.options);
+	        return !!comp.match(re[t.COMPARATORLOOSE])
+	      });
 	    }
-	}
-	auth.BearerCredentialHandler = BearerCredentialHandler;
-	class PersonalAccessTokenCredentialHandler {
-	    constructor(token) {
-	        this.token = token;
+	    debug('range list', rangeList);
+
+	    // if any comparators are the null set, then replace with JUST null set
+	    // if more than one comparator, remove any * comparators
+	    // also, don't include the same comparator more than once
+	    const rangeMap = new Map();
+	    const comparators = rangeList.map(comp => new Comparator(comp, this.options));
+	    for (const comp of comparators) {
+	      if (isNullSet(comp)) {
+	        return [comp]
+	      }
+	      rangeMap.set(comp.value, comp);
 	    }
-	    // currently implements pre-authorization
-	    // TODO: support preAuth = false where it hooks on 401
-	    prepareRequest(options) {
-	        if (!options.headers) {
-	            throw Error('The request has no headers');
-	        }
-	        options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;
+	    if (rangeMap.size > 1 && rangeMap.has('')) {
+	      rangeMap.delete('');
 	    }
-	    // This handler cannot handle 401
-	    canHandleAuthentication() {
-	        return false;
+
+	    const result = [...rangeMap.values()];
+	    cache.set(memoKey, result);
+	    return result
+	  }
+
+	  intersects (range, options) {
+	    if (!(range instanceof Range)) {
+	      throw new TypeError('a Range is required')
 	    }
-	    handleAuthentication() {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            throw new Error('not implemented');
-	        });
+
+	    return this.set.some((thisComparators) => {
+	      return (
+	        isSatisfiable(thisComparators, options) &&
+	        range.set.some((rangeComparators) => {
+	          return (
+	            isSatisfiable(rangeComparators, options) &&
+	            thisComparators.every((thisComparator) => {
+	              return rangeComparators.every((rangeComparator) => {
+	                return thisComparator.intersects(rangeComparator, options)
+	              })
+	            })
+	          )
+	        })
+	      )
+	    })
+	  }
+
+	  // if ANY of the sets match ALL of its comparators, then pass
+	  test (version) {
+	    if (!version) {
+	      return false
+	    }
+
+	    if (typeof version === 'string') {
+	      try {
+	        version = new SemVer(version, this.options);
+	      } catch (er) {
+	        return false
+	      }
+	    }
+
+	    for (let i = 0; i < this.set.length; i++) {
+	      if (testSet(this.set[i], version, this.options)) {
+	        return true
+	      }
 	    }
+	    return false
+	  }
 	}
-	auth.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;
-	
-	return auth;
-}
 
-var hasRequiredOidcUtils;
+	range = Range;
 
-function requireOidcUtils () {
-	if (hasRequiredOidcUtils) return oidcUtils;
-	hasRequiredOidcUtils = 1;
-	var __awaiter = (oidcUtils && oidcUtils.__awaiter) || function (thisArg, _arguments, P, generator) {
-	    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-	    return new (P || (P = Promise))(function (resolve, reject) {
-	        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-	        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-	        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-	        step((generator = generator.apply(thisArg, _arguments || [])).next());
+	const LRU = requireLrucache();
+	const cache = new LRU();
+
+	const parseOptions = requireParseOptions();
+	const Comparator = requireComparator();
+	const debug = requireDebug();
+	const SemVer = requireSemver$2();
+	const {
+	  safeRe: re,
+	  t,
+	  comparatorTrimReplace,
+	  tildeTrimReplace,
+	  caretTrimReplace,
+	} = requireRe();
+	const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants();
+
+	const isNullSet = c => c.value === '<0.0.0-0';
+	const isAny = c => c.value === '';
+
+	// take a set of comparators and determine whether there
+	// exists a version which can satisfy it
+	const isSatisfiable = (comparators, options) => {
+	  let result = true;
+	  const remainingComparators = comparators.slice();
+	  let testComparator = remainingComparators.pop();
+
+	  while (result && remainingComparators.length) {
+	    result = remainingComparators.every((otherComparator) => {
+	      return testComparator.intersects(otherComparator, options)
 	    });
+
+	    testComparator = remainingComparators.pop();
+	  }
+
+	  return result
 	};
-	Object.defineProperty(oidcUtils, "__esModule", { value: true });
-	oidcUtils.OidcClient = void 0;
-	const http_client_1 = requireLib();
-	const auth_1 = requireAuth();
-	const core_1 = requireCore();
-	class OidcClient {
-	    static createHttpClient(allowRetry = true, maxRetry = 10) {
-	        const requestOptions = {
-	            allowRetries: allowRetry,
-	            maxRetries: maxRetry
-	        };
-	        return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);
+
+	// comprised of xranges, tildes, stars, and gtlt's at this point.
+	// already replaced the hyphen ranges
+	// turn into a set of JUST comparators.
+	const parseComparator = (comp, options) => {
+	  comp = comp.replace(re[t.BUILD], '');
+	  debug('comp', comp, options);
+	  comp = replaceCarets(comp, options);
+	  debug('caret', comp);
+	  comp = replaceTildes(comp, options);
+	  debug('tildes', comp);
+	  comp = replaceXRanges(comp, options);
+	  debug('xrange', comp);
+	  comp = replaceStars(comp, options);
+	  debug('stars', comp);
+	  return comp
+	};
+
+	const isX = id => !id || id.toLowerCase() === 'x' || id === '*';
+
+	// ~, ~> --> * (any, kinda silly)
+	// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
+	// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
+	// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
+	// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
+	// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
+	// ~0.0.1 --> >=0.0.1 <0.1.0-0
+	const replaceTildes = (comp, options) => {
+	  return comp
+	    .trim()
+	    .split(/\s+/)
+	    .map((c) => replaceTilde(c, options))
+	    .join(' ')
+	};
+
+	const replaceTilde = (comp, options) => {
+	  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
+	  return comp.replace(r, (_, M, m, p, pr) => {
+	    debug('tilde', comp, _, M, m, p, pr);
+	    let ret;
+
+	    if (isX(M)) {
+	      ret = '';
+	    } else if (isX(m)) {
+	      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
+	    } else if (isX(p)) {
+	      // ~1.2 == >=1.2.0 <1.3.0-0
+	      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
+	    } else if (pr) {
+	      debug('replaceTilde pr', pr);
+	      ret = `>=${M}.${m}.${p}-${pr
+	      } <${M}.${+m + 1}.0-0`;
+	    } else {
+	      // ~1.2.3 == >=1.2.3 <1.3.0-0
+	      ret = `>=${M}.${m}.${p
+	      } <${M}.${+m + 1}.0-0`;
 	    }
-	    static getRequestToken() {
-	        const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];
-	        if (!token) {
-	            throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');
+
+	    debug('tilde return', ret);
+	    return ret
+	  })
+	};
+
+	// ^ --> * (any, kinda silly)
+	// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
+	// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
+	// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
+	// ^1.2.3 --> >=1.2.3 <2.0.0-0
+	// ^1.2.0 --> >=1.2.0 <2.0.0-0
+	// ^0.0.1 --> >=0.0.1 <0.0.2-0
+	// ^0.1.0 --> >=0.1.0 <0.2.0-0
+	const replaceCarets = (comp, options) => {
+	  return comp
+	    .trim()
+	    .split(/\s+/)
+	    .map((c) => replaceCaret(c, options))
+	    .join(' ')
+	};
+
+	const replaceCaret = (comp, options) => {
+	  debug('caret', comp, options);
+	  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
+	  const z = options.includePrerelease ? '-0' : '';
+	  return comp.replace(r, (_, M, m, p, pr) => {
+	    debug('caret', comp, _, M, m, p, pr);
+	    let ret;
+
+	    if (isX(M)) {
+	      ret = '';
+	    } else if (isX(m)) {
+	      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
+	    } else if (isX(p)) {
+	      if (M === '0') {
+	        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
+	      } else {
+	        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
+	      }
+	    } else if (pr) {
+	      debug('replaceCaret pr', pr);
+	      if (M === '0') {
+	        if (m === '0') {
+	          ret = `>=${M}.${m}.${p}-${pr
+	          } <${M}.${m}.${+p + 1}-0`;
+	        } else {
+	          ret = `>=${M}.${m}.${p}-${pr
+	          } <${M}.${+m + 1}.0-0`;
+	        }
+	      } else {
+	        ret = `>=${M}.${m}.${p}-${pr
+	        } <${+M + 1}.0.0-0`;
+	      }
+	    } else {
+	      debug('no pr');
+	      if (M === '0') {
+	        if (m === '0') {
+	          ret = `>=${M}.${m}.${p
+	          }${z} <${M}.${m}.${+p + 1}-0`;
+	        } else {
+	          ret = `>=${M}.${m}.${p
+	          }${z} <${M}.${+m + 1}.0-0`;
+	        }
+	      } else {
+	        ret = `>=${M}.${m}.${p
+	        } <${+M + 1}.0.0-0`;
+	      }
+	    }
+
+	    debug('caret return', ret);
+	    return ret
+	  })
+	};
+
+	const replaceXRanges = (comp, options) => {
+	  debug('replaceXRanges', comp, options);
+	  return comp
+	    .split(/\s+/)
+	    .map((c) => replaceXRange(c, options))
+	    .join(' ')
+	};
+
+	const replaceXRange = (comp, options) => {
+	  comp = comp.trim();
+	  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
+	  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
+	    debug('xRange', comp, ret, gtlt, M, m, p, pr);
+	    const xM = isX(M);
+	    const xm = xM || isX(m);
+	    const xp = xm || isX(p);
+	    const anyX = xp;
+
+	    if (gtlt === '=' && anyX) {
+	      gtlt = '';
+	    }
+
+	    // if we're including prereleases in the match, then we need
+	    // to fix this to -0, the lowest possible prerelease value
+	    pr = options.includePrerelease ? '-0' : '';
+
+	    if (xM) {
+	      if (gtlt === '>' || gtlt === '<') {
+	        // nothing is allowed
+	        ret = '<0.0.0-0';
+	      } else {
+	        // nothing is forbidden
+	        ret = '*';
+	      }
+	    } else if (gtlt && anyX) {
+	      // we know patch is an x, because we have any x at all.
+	      // replace X with 0
+	      if (xm) {
+	        m = 0;
+	      }
+	      p = 0;
+
+	      if (gtlt === '>') {
+	        // >1 => >=2.0.0
+	        // >1.2 => >=1.3.0
+	        gtlt = '>=';
+	        if (xm) {
+	          M = +M + 1;
+	          m = 0;
+	          p = 0;
+	        } else {
+	          m = +m + 1;
+	          p = 0;
 	        }
-	        return token;
-	    }
-	    static getIDTokenUrl() {
-	        const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];
-	        if (!runtimeUrl) {
-	            throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');
+	      } else if (gtlt === '<=') {
+	        // <=0.7.x is actually <0.8.0, since any 0.7.x should
+	        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
+	        gtlt = '<';
+	        if (xm) {
+	          M = +M + 1;
+	        } else {
+	          m = +m + 1;
 	        }
-	        return runtimeUrl;
-	    }
-	    static getCall(id_token_url) {
-	        var _a;
-	        return __awaiter(this, void 0, void 0, function* () {
-	            const httpclient = OidcClient.createHttpClient();
-	            const res = yield httpclient
-	                .getJson(id_token_url)
-	                .catch(error => {
-	                throw new Error(`Failed to get ID Token. \n 
-        Error Code : ${error.statusCode}\n 
-        Error Message: ${error.message}`);
-	            });
-	            const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;
-	            if (!id_token) {
-	                throw new Error('Response json body do not have ID Token field');
-	            }
-	            return id_token;
-	        });
-	    }
-	    static getIDToken(audience) {
-	        return __awaiter(this, void 0, void 0, function* () {
-	            try {
-	                // New ID Token is requested from action service
-	                let id_token_url = OidcClient.getIDTokenUrl();
-	                if (audience) {
-	                    const encodedAudience = encodeURIComponent(audience);
-	                    id_token_url = `${id_token_url}&audience=${encodedAudience}`;
-	                }
-	                (0, core_1.debug)(`ID token url is ${id_token_url}`);
-	                const id_token = yield OidcClient.getCall(id_token_url);
-	                (0, core_1.setSecret)(id_token);
-	                return id_token;
-	            }
-	            catch (error) {
-	                throw new Error(`Error message: ${error.message}`);
-	            }
-	        });
+	      }
+
+	      if (gtlt === '<') {
+	        pr = '-0';
+	      }
+
+	      ret = `${gtlt + M}.${m}.${p}${pr}`;
+	    } else if (xm) {
+	      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
+	    } else if (xp) {
+	      ret = `>=${M}.${m}.0${pr
+	      } <${M}.${+m + 1}.0-0`;
 	    }
-	}
-	oidcUtils.OidcClient = OidcClient;
-	
-	return oidcUtils;
-}
 
-var summary = {};
+	    debug('xRange return', ret);
 
-var hasRequiredSummary;
+	    return ret
+	  })
+	};
 
-function requireSummary () {
-	if (hasRequiredSummary) return summary;
-	hasRequiredSummary = 1;
-	(function (exports$1) {
-		var __awaiter = (summary && summary.__awaiter) || function (thisArg, _arguments, P, generator) {
-		    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-		    return new (P || (P = Promise))(function (resolve, reject) {
-		        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-		        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-		        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-		        step((generator = generator.apply(thisArg, _arguments || [])).next());
-		    });
-		};
-		Object.defineProperty(exports$1, "__esModule", { value: true });
-		exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0;
-		const os_1 = require$$0$3;
-		const fs_1 = require$$1__default;
-		const { access, appendFile, writeFile } = fs_1.promises;
-		exports$1.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';
-		exports$1.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';
-		class Summary {
-		    constructor() {
-		        this._buffer = '';
-		    }
-		    /**
-		     * Finds the summary file path from the environment, rejects if env var is not found or file does not exist
-		     * Also checks r/w permissions.
-		     *
-		     * @returns step summary file path
-		     */
-		    filePath() {
-		        return __awaiter(this, void 0, void 0, function* () {
-		            if (this._filePath) {
-		                return this._filePath;
-		            }
-		            const pathFromEnv = process.env[exports$1.SUMMARY_ENV_VAR];
-		            if (!pathFromEnv) {
-		                throw new Error(`Unable to find environment variable for $${exports$1.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);
-		            }
-		            try {
-		                yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);
-		            }
-		            catch (_a) {
-		                throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);
-		            }
-		            this._filePath = pathFromEnv;
-		            return this._filePath;
-		        });
-		    }
-		    /**
-		     * Wraps content in an HTML tag, adding any HTML attributes
-		     *
-		     * @param {string} tag HTML tag to wrap
-		     * @param {string | null} content content within the tag
-		     * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add
-		     *
-		     * @returns {string} content wrapped in HTML element
-		     */
-		    wrap(tag, content, attrs = {}) {
-		        const htmlAttrs = Object.entries(attrs)
-		            .map(([key, value]) => ` ${key}="${value}"`)
-		            .join('');
-		        if (!content) {
-		            return `<${tag}${htmlAttrs}>`;
-		        }
-		        return `<${tag}${htmlAttrs}>${content}`;
-		    }
-		    /**
-		     * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.
-		     *
-		     * @param {SummaryWriteOptions} [options] (optional) options for write operation
-		     *
-		     * @returns {Promise} summary instance
-		     */
-		    write(options) {
-		        return __awaiter(this, void 0, void 0, function* () {
-		            const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);
-		            const filePath = yield this.filePath();
-		            const writeFunc = overwrite ? writeFile : appendFile;
-		            yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });
-		            return this.emptyBuffer();
-		        });
-		    }
-		    /**
-		     * Clears the summary buffer and wipes the summary file
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    clear() {
-		        return __awaiter(this, void 0, void 0, function* () {
-		            return this.emptyBuffer().write({ overwrite: true });
-		        });
-		    }
-		    /**
-		     * Returns the current summary buffer as a string
-		     *
-		     * @returns {string} string of summary buffer
-		     */
-		    stringify() {
-		        return this._buffer;
-		    }
-		    /**
-		     * If the summary buffer is empty
-		     *
-		     * @returns {boolen} true if the buffer is empty
-		     */
-		    isEmptyBuffer() {
-		        return this._buffer.length === 0;
-		    }
-		    /**
-		     * Resets the summary buffer without writing to summary file
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    emptyBuffer() {
-		        this._buffer = '';
-		        return this;
-		    }
-		    /**
-		     * Adds raw text to the summary buffer
-		     *
-		     * @param {string} text content to add
-		     * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addRaw(text, addEOL = false) {
-		        this._buffer += text;
-		        return addEOL ? this.addEOL() : this;
-		    }
-		    /**
-		     * Adds the operating system-specific end-of-line marker to the buffer
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addEOL() {
-		        return this.addRaw(os_1.EOL);
-		    }
-		    /**
-		     * Adds an HTML codeblock to the summary buffer
-		     *
-		     * @param {string} code content to render within fenced code block
-		     * @param {string} lang (optional) language to syntax highlight code
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addCodeBlock(code, lang) {
-		        const attrs = Object.assign({}, (lang && { lang }));
-		        const element = this.wrap('pre', this.wrap('code', code), attrs);
-		        return this.addRaw(element).addEOL();
-		    }
-		    /**
-		     * Adds an HTML list to the summary buffer
-		     *
-		     * @param {string[]} items list of items to render
-		     * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addList(items, ordered = false) {
-		        const tag = ordered ? 'ol' : 'ul';
-		        const listItems = items.map(item => this.wrap('li', item)).join('');
-		        const element = this.wrap(tag, listItems);
-		        return this.addRaw(element).addEOL();
-		    }
-		    /**
-		     * Adds an HTML table to the summary buffer
-		     *
-		     * @param {SummaryTableCell[]} rows table rows
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addTable(rows) {
-		        const tableBody = rows
-		            .map(row => {
-		            const cells = row
-		                .map(cell => {
-		                if (typeof cell === 'string') {
-		                    return this.wrap('td', cell);
-		                }
-		                const { header, data, colspan, rowspan } = cell;
-		                const tag = header ? 'th' : 'td';
-		                const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));
-		                return this.wrap(tag, data, attrs);
-		            })
-		                .join('');
-		            return this.wrap('tr', cells);
-		        })
-		            .join('');
-		        const element = this.wrap('table', tableBody);
-		        return this.addRaw(element).addEOL();
-		    }
-		    /**
-		     * Adds a collapsable HTML details element to the summary buffer
-		     *
-		     * @param {string} label text for the closed state
-		     * @param {string} content collapsable content
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addDetails(label, content) {
-		        const element = this.wrap('details', this.wrap('summary', label) + content);
-		        return this.addRaw(element).addEOL();
-		    }
-		    /**
-		     * Adds an HTML image tag to the summary buffer
-		     *
-		     * @param {string} src path to the image you to embed
-		     * @param {string} alt text description of the image
-		     * @param {SummaryImageOptions} options (optional) addition image attributes
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addImage(src, alt, options) {
-		        const { width, height } = options || {};
-		        const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));
-		        const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));
-		        return this.addRaw(element).addEOL();
-		    }
-		    /**
-		     * Adds an HTML section heading element
-		     *
-		     * @param {string} text heading text
-		     * @param {number | string} [level=1] (optional) the heading level, default: 1
-		     *
-		     * @returns {Summary} summary instance
-		     */
-		    addHeading(text, level) {
-		        const tag = `h${level}`;
-		        const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)
-		            ? tag
-		            : 'h1';
-		        const element = this.wrap(allowedTag, text);
-		        return this.addRaw(element).addEOL();
-		    }
-		    /**
-		     * Adds an HTML thematic break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap('hr', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML line break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap('br', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, (cite && { cite })); - const element = this.wrap('blockquote', text, attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap('a', text, { href }); - return this.addRaw(element).addEOL(); - } - } - const _summary = new Summary(); - /** - * @deprecated use `core.summary` - */ - exports$1.markdownSummary = _summary; - exports$1.summary = _summary; - - } (summary)); - return summary; -} + // Because * is AND-ed with everything else in the comparator, + // and '' means "any version", just remove the *s entirely. + const replaceStars = (comp, options) => { + debug('replaceStars', comp, options); + // Looseness is ignored here. star is always as loose as it gets! + return comp + .trim() + .replace(re[t.STAR], '') + }; -var pathUtils = {}; + const replaceGTE0 = (comp, options) => { + debug('replaceGTE0', comp, options); + return comp + .trim() + .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') + }; -var hasRequiredPathUtils; + // This function is passed to string.replace(re[t.HYPHENRANGE]) + // M, m, patch, prerelease, build + // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 + // 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do + // 1.2 - 3.4 => >=1.2.0 <3.5.0-0 + // TODO build? + const hyphenReplace = incPr => ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr) => { + if (isX(fM)) { + from = ''; + } else if (isX(fm)) { + from = `>=${fM}.0.0${incPr ? '-0' : ''}`; + } else if (isX(fp)) { + from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`; + } else if (fpr) { + from = `>=${from}`; + } else { + from = `>=${from}${incPr ? '-0' : ''}`; + } -function requirePathUtils () { - if (hasRequiredPathUtils) return pathUtils; - hasRequiredPathUtils = 1; - var __createBinding = (pathUtils && pathUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (pathUtils && pathUtils.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (pathUtils && pathUtils.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; + if (isX(tM)) { + to = ''; + } else if (isX(tm)) { + to = `<${+tM + 1}.0.0-0`; + } else if (isX(tp)) { + to = `<${tM}.${+tm + 1}.0-0`; + } else if (tpr) { + to = `<=${tM}.${tm}.${tp}-${tpr}`; + } else if (incPr) { + to = `<${tM}.${tm}.${+tp + 1}-0`; + } else { + to = `<=${to}`; + } + + return `${from} ${to}`.trim() }; - Object.defineProperty(pathUtils, "__esModule", { value: true }); - pathUtils.toPlatformPath = pathUtils.toWin32Path = pathUtils.toPosixPath = void 0; - const path = __importStar(require$$1$6); - /** - * toPosixPath converts the given path to the posix form. On Windows, \\ will be - * replaced with /. - * - * @param pth. Path to transform. - * @return string Posix path. - */ - function toPosixPath(pth) { - return pth.replace(/[\\]/g, '/'); - } - pathUtils.toPosixPath = toPosixPath; - /** - * toWin32Path converts the given path to the win32 form. On Linux, / will be - * replaced with \\. - * - * @param pth. Path to transform. - * @return string Win32 path. - */ - function toWin32Path(pth) { - return pth.replace(/[/]/g, '\\'); - } - pathUtils.toWin32Path = toWin32Path; - /** - * toPlatformPath converts the given path to a platform-specific path. It does - * this by replacing instances of / and \ with the platform-specific path - * separator. - * - * @param pth The path to platformize. - * @return string The platform-specific path. - */ - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - pathUtils.toPlatformPath = toPlatformPath; - - return pathUtils; -} -var platform = {}; + const testSet = (set, version, options) => { + for (let i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (let i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === Comparator.ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + const allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true + }; + return range; +} -var exec = {}; +var comparator; +var hasRequiredComparator; -var toolrunner = {}; +function requireComparator () { + if (hasRequiredComparator) return comparator; + hasRequiredComparator = 1; -var io = {}; + const ANY = Symbol('SemVer ANY'); + // hoisted class for cyclic dependency + class Comparator { + static get ANY () { + return ANY + } -var ioUtil = {}; + constructor (comp, options) { + options = parseOptions(options); -var hasRequiredIoUtil; + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value; + } + } -function requireIoUtil () { - if (hasRequiredIoUtil) return ioUtil; - hasRequiredIoUtil = 1; - (function (exports$1) { - var __createBinding = (ioUtil && ioUtil.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (ioUtil && ioUtil.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (ioUtil && ioUtil.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (ioUtil && ioUtil.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getCmdPath = exports$1.tryGetExecutablePath = exports$1.isRooted = exports$1.isDirectory = exports$1.exists = exports$1.READONLY = exports$1.UV_FS_O_EXLOCK = exports$1.IS_WINDOWS = exports$1.unlink = exports$1.symlink = exports$1.stat = exports$1.rmdir = exports$1.rm = exports$1.rename = exports$1.readlink = exports$1.readdir = exports$1.open = exports$1.mkdir = exports$1.lstat = exports$1.copyFile = exports$1.chmod = void 0; - const fs = __importStar(require$$1__default); - const path = __importStar(require$$1$6); - _a = fs.promises - // export const {open} = 'fs' - , exports$1.chmod = _a.chmod, exports$1.copyFile = _a.copyFile, exports$1.lstat = _a.lstat, exports$1.mkdir = _a.mkdir, exports$1.open = _a.open, exports$1.readdir = _a.readdir, exports$1.readlink = _a.readlink, exports$1.rename = _a.rename, exports$1.rm = _a.rm, exports$1.rmdir = _a.rmdir, exports$1.stat = _a.stat, exports$1.symlink = _a.symlink, exports$1.unlink = _a.unlink; - // export const {open} = 'fs' - exports$1.IS_WINDOWS = process.platform === 'win32'; - // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 - exports$1.UV_FS_O_EXLOCK = 0x10000000; - exports$1.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - try { - yield exports$1.stat(fsPath); - } - catch (err) { - if (err.code === 'ENOENT') { - return false; - } - throw err; - } - return true; - }); - } - exports$1.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports$1.stat(fsPath) : yield exports$1.lstat(fsPath); - return stats.isDirectory(); - }); - } - exports$1.isDirectory = isDirectory; - /** - * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: - * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). - */ - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports$1.IS_WINDOWS) { - return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello - ); // e.g. C: or C:\hello - } - return p.startsWith('/'); - } - exports$1.isRooted = isRooted; - /** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = undefined; - try { - // test file exists - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // on Windows, test for valid extension - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - // try each extension - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // preserve the case of the actual file (since an extension was appended) - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports$1.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } - catch (err) { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ''; - }); - } - exports$1.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ''; - if (exports$1.IS_WINDOWS) { - // convert slashes on Windows - p = p.replace(/\//g, '\\'); - // remove redundant slashes - return p.replace(/\\\\+/g, '\\'); - } - // remove redundant slashes - return p.replace(/\/\/+/g, '/'); - } - // on Mac/Linux, test the execute bit - // R W X R W X R W X - // 256 128 64 32 16 8 4 2 1 - function isUnixExecutable(stats) { - return ((stats.mode & 1) > 0 || - ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || - ((stats.mode & 64) > 0 && stats.uid === process.getuid())); - } - // Get the path of cmd.exe in windows - function getCmdPath() { - var _a; - return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; - } - exports$1.getCmdPath = getCmdPath; - - } (ioUtil)); - return ioUtil; -} + comp = comp.trim().split(/\s+/).join(' '); + debug('comparator', comp, options); + this.options = options; + this.loose = !!options.loose; + this.parse(comp); -var hasRequiredIo; + if (this.semver === ANY) { + this.value = ''; + } else { + this.value = this.operator + this.semver.version; + } -function requireIo () { - if (hasRequiredIo) return io; - hasRequiredIo = 1; - var __createBinding = (io && io.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (io && io.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (io && io.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (io && io.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(io, "__esModule", { value: true }); - io.findInPath = io.which = io.mkdirP = io.rmRF = io.mv = io.cp = void 0; - const assert_1 = require$$0$8; - const path = __importStar(require$$1$6); - const ioUtil = __importStar(requireIoUtil()); - /** - * Copies a file or folder. - * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ - function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; - // Dest is an existing file, but not forcing - if (destStat && destStat.isFile() && !force) { - return; - } - // If dest is an existing directory, should copy inside. - const newDest = destStat && destStat.isDirectory() && copySourceDirectory - ? path.join(dest, path.basename(source)) - : dest; - if (!(yield ioUtil.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } - else { - yield cpDirRecursive(source, newDest, 0, force); - } - } - else { - if (path.relative(source, newDest) === '') { - // a file cannot be copied to itself - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); - } - io.cp = cp; - /** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See MoveOptions. - */ - function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - if (yield ioUtil.exists(dest)) { - let destExists = true; - if (yield ioUtil.isDirectory(dest)) { - // If dest is directory copy src into dest - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } - else { - throw new Error('Destination already exists'); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil.rename(source, dest); - }); - } - io.mv = mv; - /** - * Remove a path recursively with force - * - * @param inputPath path to remove - */ - function rmRF(inputPath) { - return __awaiter(this, void 0, void 0, function* () { - if (ioUtil.IS_WINDOWS) { - // Check for invalid characters - // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - // note if path does not exist, error is silent - yield ioUtil.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } - catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); - } - io.rmRF = rmRF; - /** - * Make a directory. Creates the full path with folders in between - * Will throw if it fails - * - * @param fsPath path to create - * @returns Promise - */ - function mkdirP(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, 'a path argument must be provided'); - yield ioUtil.mkdir(fsPath, { recursive: true }); - }); - } - io.mkdirP = mkdirP; - /** - * Returns path of a tool had the tool actually been invoked. Resolves via paths. - * If you check and the tool does not exist, it will throw. - * - * @param tool name of the tool - * @param check whether to check if tool exists - * @returns Promise path to tool - */ - function which(tool, check) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // recursive when check=true - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } - else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; - } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; - } - return ''; - }); - } - io.which = which; - /** - * Returns a list of all occurrences of the given tool on the system path. - * - * @returns Promise the paths of the tool - */ - function findInPath(tool) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // build the list of extensions to try - const extensions = []; - if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) { - for (const extension of process.env['PATHEXT'].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - // if it's rooted, return it if exists. otherwise return empty. - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - // if any path separators, return empty - if (tool.includes(path.sep)) { - return []; - } - // build the list of directories - // - // Note, technically "where" checks the current directory on Windows. From a toolkit perspective, - // it feels like we should not do this. Checking the current directory seems like more of a use - // case of a shell, and the which() function exposed by the toolkit should strive for consistency - // across platforms. - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - // find all matches - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } - } - return matches; - }); - } - io.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null - ? true - : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; - } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, void 0, void 0, function* () { - // Ensure there is not a run away recursive copy - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil.lstat(srcFile); - if (srcFileStat.isDirectory()) { - // Recurse - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } - else { - yield copyFile(srcFile, destFile, force); - } - } - // Change the mode for the newly created directory - yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); - }); - } - // Buffered file copy - function copyFile(srcFile, destFile, force) { - return __awaiter(this, void 0, void 0, function* () { - if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { - // unlink/re-link it - try { - yield ioUtil.lstat(destFile); - yield ioUtil.unlink(destFile); - } - catch (e) { - // Try to override file permission - if (e.code === 'EPERM') { - yield ioUtil.chmod(destFile, '0666'); - yield ioUtil.unlink(destFile); - } - // other errors = it doesn't exist, no work to do - } - // Copy over symlink - const symlinkFull = yield ioUtil.readlink(srcFile); - yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); - } - else if (!(yield ioUtil.exists(destFile)) || force) { - yield ioUtil.copyFile(srcFile, destFile); - } - }); - } - - return io; -} + debug('comp', this); + } -var hasRequiredToolrunner; + parse (comp) { + const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]; + const m = comp.match(r); -function requireToolrunner () { - if (hasRequiredToolrunner) return toolrunner; - hasRequiredToolrunner = 1; - var __createBinding = (toolrunner && toolrunner.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (toolrunner && toolrunner.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (toolrunner && toolrunner.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (toolrunner && toolrunner.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(toolrunner, "__esModule", { value: true }); - toolrunner.argStringToArray = toolrunner.ToolRunner = void 0; - const os = __importStar(require$$0$3); - const events = __importStar(require$$0$7); - const child = __importStar(require$$2$2); - const path = __importStar(require$$1$6); - const io = __importStar(requireIo()); - const ioUtil = __importStar(requireIoUtil()); - const timers_1 = require$$6; - /* eslint-disable @typescript-eslint/unbound-method */ - const IS_WINDOWS = process.platform === 'win32'; - /* - * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. - */ - class ToolRunner extends events.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; + if (!m) { + throw new TypeError(`Invalid comparator: ${comp}`) } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } + + this.operator = m[1] !== undefined ? m[1] : ''; + if (this.operator === '=') { + this.operator = ''; } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool - if (IS_WINDOWS) { - // Windows + cmd file - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows + verbatim - else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows (regular) - else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; - } - } - } - else { - // OSX/Linux - this can likely be improved with some form of quoting. - // creating processes on Unix is fundamentally different than Windows. - // on Unix, execvp() takes an arg array. - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - return cmd; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY; + } else { + this.semver = new SemVer(m[2], this.options.loose); } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - // the rest of the string ... - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); - } - return s; - } - catch (err) { - // streaming lines to console is best effort. Don't fail a build. - this._debug(`error processing line. Failed with error ${err}`); - return ''; - } + } + + toString () { + return this.value + } + + test (version) { + debug('Comparator.test', version, this.options.loose); + + if (this.semver === ANY || version === ANY) { + return true } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env['COMSPEC'] || 'cmd.exe'; - } - } - return this.toolPath; + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options); + } catch (er) { + return false + } } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += ' '; - argline += options.windowsVerbatimArguments - ? a - : this._windowsQuoteCmdArg(a); - } - argline += '"'; - return [argline]; - } - } - return this.args; + + return cmp(version, this.operator, this.semver, this.options) + } + + intersects (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') } - _endsWith(str, end) { - return str.endsWith(end); + + if (this.operator === '') { + if (this.value === '') { + return true + } + return new Range(comp.value, options).test(this.value) + } else if (comp.operator === '') { + if (comp.value === '') { + return true + } + return new Range(this.value, options).test(comp.semver) } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return (this._endsWith(upperToolPath, '.CMD') || - this._endsWith(upperToolPath, '.BAT')); + + options = parseOptions(options); + + // Special cases where nothing can possibly be lower + if (options.includePrerelease && + (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) { + return false } - _windowsQuoteCmdArg(arg) { - // for .exe, apply the normal quoting rules that libuv applies - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - // otherwise apply quoting rules specific to the cmd.exe command line parser. - // the libuv rules are generic and are not designed specifically for cmd.exe - // command line parser. - // - // for a detailed description of the cmd.exe command line parser, refer to - // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 - // need quotes for empty arg - if (!arg) { - return '""'; - } - // determine whether the arg needs to be quoted - const cmdSpecialChars = [ - ' ', - '\t', - '&', - '(', - ')', - '[', - ']', - '{', - '}', - '^', - '=', - ';', - '!', - "'", - '+', - ',', - '`', - '~', - '|', - '<', - '>', - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some(x => x === char)) { - needsQuotes = true; - break; - } - } - // short-circuit if quotes not needed - if (!needsQuotes) { - return arg; - } - // the following quoting rules are very similar to the rules that by libuv applies. - // - // 1) wrap the string in quotes - // - // 2) double-up quotes - i.e. " => "" - // - // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately - // doesn't work well with a cmd.exe command line. - // - // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. - // for example, the command line: - // foo.exe "myarg:""my val""" - // is parsed by a .NET console app into an arg array: - // [ "myarg:\"my val\"" ] - // which is the same end result when applying libuv quoting rules. although the actual - // command line from libuv quoting rules would look like: - // foo.exe "myarg:\"my val\"" - // - // 3) double-up slashes that precede a quote, - // e.g. hello \world => "hello \world" - // hello\"world => "hello\\""world" - // hello\\"world => "hello\\\\""world" - // hello world\ => "hello world\\" - // - // technically this is not required for a cmd.exe command line, or the batch argument parser. - // the reasons for including this as a .cmd quoting rule are: - // - // a) this is optimized for the scenario where the argument is passed from the .cmd file to an - // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. - // - // b) it's what we've been doing previously (by deferring to node default behavior) and we - // haven't heard any complaints about that aspect. - // - // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be - // escaped when used on the command line directly - even though within a .cmd file % can be escaped - // by using %%. - // - // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts - // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. - // - // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would - // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the - // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args - // to an external program. - // - // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. - // % can be escaped within a .cmd file. - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; // double the slash - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; // double the quote - } - else { - quoteHit = false; - } - } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); + if (!options.includePrerelease && + (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) { + return false + } + + // Same direction increasing (> or >=) + if (this.operator.startsWith('>') && comp.operator.startsWith('>')) { + return true + } + // Same direction decreasing (< or <=) + if (this.operator.startsWith('<') && comp.operator.startsWith('<')) { + return true + } + // same SemVer and both sides are inclusive (<= or >=) + if ( + (this.semver.version === comp.semver.version) && + this.operator.includes('=') && comp.operator.includes('=')) { + return true + } + // opposite directions less than + if (cmp(this.semver, '<', comp.semver, options) && + this.operator.startsWith('>') && comp.operator.startsWith('<')) { + return true + } + // opposite directions greater than + if (cmp(this.semver, '>', comp.semver, options) && + this.operator.startsWith('<') && comp.operator.startsWith('>')) { + return true + } + return false + } + } + + comparator = Comparator; + + const parseOptions = requireParseOptions(); + const { safeRe: re, t } = requireRe(); + const cmp = requireCmp(); + const debug = requireDebug(); + const SemVer = requireSemver$2(); + const Range = requireRange(); + return comparator; +} + +var satisfies_1; +var hasRequiredSatisfies; + +function requireSatisfies () { + if (hasRequiredSatisfies) return satisfies_1; + hasRequiredSatisfies = 1; + + const Range = requireRange(); + const satisfies = (version, range, options) => { + try { + range = new Range(range, options); + } catch (er) { + return false + } + return range.test(version) + }; + satisfies_1 = satisfies; + return satisfies_1; +} + +var toComparators_1; +var hasRequiredToComparators; + +function requireToComparators () { + if (hasRequiredToComparators) return toComparators_1; + hasRequiredToComparators = 1; + + const Range = requireRange(); + + // Mostly just for testing and legacy API reasons + const toComparators = (range, options) => + new Range(range, options).set + .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')); + + toComparators_1 = toComparators; + return toComparators_1; +} + +var maxSatisfying_1; +var hasRequiredMaxSatisfying; + +function requireMaxSatisfying () { + if (hasRequiredMaxSatisfying) return maxSatisfying_1; + hasRequiredMaxSatisfying = 1; + + const SemVer = requireSemver$2(); + const Range = requireRange(); + + const maxSatisfying = (versions, range, options) => { + let max = null; + let maxSV = null; + let rangeObj = null; + try { + rangeObj = new Range(range, options); + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v; + maxSV = new SemVer(max, options); + } + } + }); + return max + }; + maxSatisfying_1 = maxSatisfying; + return maxSatisfying_1; +} + +var minSatisfying_1; +var hasRequiredMinSatisfying; + +function requireMinSatisfying () { + if (hasRequiredMinSatisfying) return minSatisfying_1; + hasRequiredMinSatisfying = 1; + + const SemVer = requireSemver$2(); + const Range = requireRange(); + const minSatisfying = (versions, range, options) => { + let min = null; + let minSV = null; + let rangeObj = null; + try { + rangeObj = new Range(range, options); + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v; + minSV = new SemVer(min, options); + } + } + }); + return min + }; + minSatisfying_1 = minSatisfying; + return minSatisfying_1; +} + +var minVersion_1; +var hasRequiredMinVersion; + +function requireMinVersion () { + if (hasRequiredMinVersion) return minVersion_1; + hasRequiredMinVersion = 1; + + const SemVer = requireSemver$2(); + const Range = requireRange(); + const gt = requireGt(); + + const minVersion = (range, loose) => { + range = new Range(range, loose); + + let minver = new SemVer('0.0.0'); + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0'); + if (range.test(minver)) { + return minver + } + + minver = null; + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i]; + + let setMin = null; + comparators.forEach((comparator) => { + // Clone to avoid manipulating the comparator's semver object. + const compver = new SemVer(comparator.semver.version); + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++; + } else { + compver.prerelease.push(0); + } + compver.raw = compver.format(); + /* fallthrough */ + case '': + case '>=': + if (!setMin || gt(compver, setMin)) { + setMin = compver; + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error(`Unexpected operation: ${comparator.operator}`) + } + }); + if (setMin && (!minver || gt(minver, setMin))) { + minver = setMin; } - _uvQuoteCmdArg(arg) { - // Tool runner wraps child_process.spawn() and needs to apply the same quoting as - // Node in certain cases where the undocumented spawn option windowsVerbatimArguments - // is used. - // - // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, - // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), - // pasting copyright notice from Node within this function: - // - // Copyright Joyent, Inc. and other Node contributors. All rights reserved. - // - // Permission is hereby granted, free of charge, to any person obtaining a copy - // of this software and associated documentation files (the "Software"), to - // deal in the Software without restriction, including without limitation the - // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - // sell copies of the Software, and to permit persons to whom the Software is - // furnished to do so, subject to the following conditions: - // - // The above copyright notice and this permission notice shall be included in - // all copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - // IN THE SOFTWARE. - if (!arg) { - // Need double quotation for empty argument - return '""'; - } - if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { - // No quotation needed - return arg; - } - if (!arg.includes('"') && !arg.includes('\\')) { - // No embedded double quotes or backslashes, so I can just wrap - // quote marks around the whole thing. - return `"${arg}"`; - } - // Expected input/output: - // input : hello"world - // output: "hello\"world" - // input : hello""world - // output: "hello\"\"world" - // input : hello\world - // output: hello\world - // input : hello\\world - // output: hello\\world - // input : hello\"world - // output: "hello\\\"world" - // input : hello\\"world - // output: "hello\\\\\"world" - // input : hello world\ - // output: "hello world\\" - note the comment in libuv actually reads "hello world\" - // but it appears the comment is wrong, it should be "hello world\\" - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '\\'; - } - else { - quoteHit = false; - } - } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); + } + + if (minver && range.test(minver)) { + return minver + } + + return null + }; + minVersion_1 = minVersion; + return minVersion_1; +} + +var valid; +var hasRequiredValid; + +function requireValid () { + if (hasRequiredValid) return valid; + hasRequiredValid = 1; + + const Range = requireRange(); + const validRange = (range, options) => { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } + }; + valid = validRange; + return valid; +} + +var outside_1; +var hasRequiredOutside; + +function requireOutside () { + if (hasRequiredOutside) return outside_1; + hasRequiredOutside = 1; + + const SemVer = requireSemver$2(); + const Comparator = requireComparator(); + const { ANY } = Comparator; + const Range = requireRange(); + const satisfies = requireSatisfies(); + const gt = requireGt(); + const lt = requireLt(); + const lte = requireLte(); + const gte = requireGte(); + + const outside = (version, range, hilo, options) => { + version = new SemVer(version, options); + range = new Range(range, options); + + let gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisfies the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i]; + + let high = null; + let low = null; + + comparators.forEach((comparator) => { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0'); + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 10000 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result['windowsVerbatimArguments'] = - options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; - } - return result; + } + return true + }; + + outside_1 = outside; + return outside_1; +} + +var gtr_1; +var hasRequiredGtr; + +function requireGtr () { + if (hasRequiredGtr) return gtr_1; + hasRequiredGtr = 1; + + // Determine if version is greater than all the versions possible in the range. + const outside = requireOutside(); + const gtr = (version, range, options) => outside(version, range, '>', options); + gtr_1 = gtr; + return gtr_1; +} + +var ltr_1; +var hasRequiredLtr; + +function requireLtr () { + if (hasRequiredLtr) return ltr_1; + hasRequiredLtr = 1; + + const outside = requireOutside(); + // Determine if version is less than all the versions possible in the range + const ltr = (version, range, options) => outside(version, range, '<', options); + ltr_1 = ltr; + return ltr_1; +} + +var intersects_1; +var hasRequiredIntersects; + +function requireIntersects () { + if (hasRequiredIntersects) return intersects_1; + hasRequiredIntersects = 1; + + const Range = requireRange(); + const intersects = (r1, r2, options) => { + r1 = new Range(r1, options); + r2 = new Range(r2, options); + return r1.intersects(r2, options) + }; + intersects_1 = intersects; + return intersects_1; +} + +var simplify; +var hasRequiredSimplify; + +function requireSimplify () { + if (hasRequiredSimplify) return simplify; + hasRequiredSimplify = 1; + + // given a set of versions and a range, create a "simplified" range + // that includes the same versions that the original range does + // If the original range is shorter than the simplified one, return that. + const satisfies = requireSatisfies(); + const compare = requireCompare(); + simplify = (versions, range, options) => { + const set = []; + let first = null; + let prev = null; + const v = versions.sort((a, b) => compare(a, b, options)); + for (const version of v) { + const included = satisfies(version, range, options); + if (included) { + prev = version; + if (!first) { + first = version; + } + } else { + if (prev) { + set.push([first, prev]); + } + prev = null; + first = null; } - /** - * Exec a tool. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param tool path to tool to exec - * @param options optional exec options. See ExecOptions - * @returns number - */ - exec() { - return __awaiter(this, void 0, void 0, function* () { - // root the tool path if it is unrooted and contains relative pathing - if (!ioUtil.isRooted(this.toolPath) && - (this.toolPath.includes('/') || - (IS_WINDOWS && this.toolPath.includes('\\')))) { - // prefer options.cwd if it is specified, however options.cwd may also need to be rooted - this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); - } - // if the tool is only a file name, then resolve it from the PATH - // otherwise verify it exists (add extension on Windows if necessary) - this.toolPath = yield io.which(this.toolPath, true); - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - this._debug(`exec tool: ${this.toolPath}`); - this._debug('arguments:'); - for (const arg of this.args) { - this._debug(` ${arg}`); - } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); - } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on('debug', (message) => { - this._debug(message); - }); - if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) { - return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); - } - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - let stdbuffer = ''; - if (cp.stdout) { - cp.stdout.on('data', (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); - } - }); - }); - } - let errbuffer = ''; - if (cp.stderr) { - cp.stderr.on('data', (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && - optionsNonNull.errStream && - optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr - ? optionsNonNull.errStream - : optionsNonNull.outStream; - s.write(data); - } - errbuffer = this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on('error', (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on('exit', (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on('close', (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on('done', (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit('stdline', stdbuffer); - } - if (errbuffer.length > 0) { - this.emit('errline', errbuffer); - } - cp.removeAllListeners(); - if (error) { - reject(error); - } - else { - resolve(exitCode); - } - }); - if (this.options.input) { - if (!cp.stdin) { - throw new Error('child process missing stdin'); - } - cp.stdin.end(this.options.input); - } - })); - }); + } + if (first) { + set.push([first, null]); + } + + const ranges = []; + for (const [min, max] of set) { + if (min === max) { + ranges.push(min); + } else if (!max && min === v[0]) { + ranges.push('*'); + } else if (!max) { + ranges.push(`>=${min}`); + } else if (min === v[0]) { + ranges.push(`<=${max}`); + } else { + ranges.push(`${min} - ${max}`); + } + } + const simplified = ranges.join(' || '); + const original = typeof range.raw === 'string' ? range.raw : String(range); + return simplified.length < original.length ? simplified : range + }; + return simplify; +} + +var subset_1; +var hasRequiredSubset; + +function requireSubset () { + if (hasRequiredSubset) return subset_1; + hasRequiredSubset = 1; + + const Range = requireRange(); + const Comparator = requireComparator(); + const { ANY } = Comparator; + const satisfies = requireSatisfies(); + const compare = requireCompare(); + + // Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff: + // - Every simple range `r1, r2, ...` is a null set, OR + // - Every simple range `r1, r2, ...` which is not a null set is a subset of + // some `R1, R2, ...` + // + // Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff: + // - If c is only the ANY comparator + // - If C is only the ANY comparator, return true + // - Else if in prerelease mode, return false + // - else replace c with `[>=0.0.0]` + // - If C is only the ANY comparator + // - if in prerelease mode, return true + // - else replace C with `[>=0.0.0]` + // - Let EQ be the set of = comparators in c + // - If EQ is more than one, return true (null set) + // - Let GT be the highest > or >= comparator in c + // - Let LT be the lowest < or <= comparator in c + // - If GT and LT, and GT.semver > LT.semver, return true (null set) + // - If any C is a = range, and GT or LT are set, return false + // - If EQ + // - If GT, and EQ does not satisfy GT, return true (null set) + // - If LT, and EQ does not satisfy LT, return true (null set) + // - If EQ satisfies every C, return true + // - Else return false + // - If GT + // - If GT.semver is lower than any > or >= comp in C, return false + // - If GT is >=, and GT.semver does not satisfy every C, return false + // - If GT.semver has a prerelease, and not in prerelease mode + // - If no C has a prerelease and the GT.semver tuple, return false + // - If LT + // - If LT.semver is greater than any < or <= comp in C, return false + // - If LT is <=, and LT.semver does not satisfy every C, return false + // - If GT.semver has a prerelease, and not in prerelease mode + // - If no C has a prerelease and the LT.semver tuple, return false + // - Else return true + + const subset = (sub, dom, options = {}) => { + if (sub === dom) { + return true + } + + sub = new Range(sub, options); + dom = new Range(dom, options); + let sawNonNull = false; + + OUTER: for (const simpleSub of sub.set) { + for (const simpleDom of dom.set) { + const isSub = simpleSubset(simpleSub, simpleDom, options); + sawNonNull = sawNonNull || isSub !== null; + if (isSub) { + continue OUTER + } + } + // the null set is a subset of everything, but null simple ranges in + // a complex range should be ignored. so if we saw a non-null range, + // then we know this isn't a subset, but if EVERY simple range was null, + // then it is a subset. + if (sawNonNull) { + return false } - } - toolrunner.ToolRunner = ToolRunner; - /** - * Convert an arg string to an array of args. Handles escaping - * - * @param argString string of arguments - * @returns string[] array of arguments - */ - function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ''; - function append(c) { - // we only escape double quotes. - if (escaped && c !== '"') { - arg += '\\'; - } - arg += c; - escaped = false; + } + return true + }; + + const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]; + const minimumVersion = [new Comparator('>=0.0.0')]; + + const simpleSubset = (sub, dom, options) => { + if (sub === dom) { + return true + } + + if (sub.length === 1 && sub[0].semver === ANY) { + if (dom.length === 1 && dom[0].semver === ANY) { + return true + } else if (options.includePrerelease) { + sub = minimumVersionWithPreRelease; + } else { + sub = minimumVersion; } - for (let i = 0; i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } - else { - append(c); - } - continue; - } - if (c === '\\' && escaped) { - append(c); - continue; - } - if (c === '\\' && inQuotes) { - escaped = true; - continue; - } - if (c === ' ' && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ''; - } - continue; - } - append(c); + } + + if (dom.length === 1 && dom[0].semver === ANY) { + if (options.includePrerelease) { + return true + } else { + dom = minimumVersion; } - if (arg.length > 0) { - args.push(arg.trim()); + } + + const eqSet = new Set(); + let gt, lt; + for (const c of sub) { + if (c.operator === '>' || c.operator === '>=') { + gt = higherGT(gt, c, options); + } else if (c.operator === '<' || c.operator === '<=') { + lt = lowerLT(lt, c, options); + } else { + eqSet.add(c.semver); } - return args; - } - toolrunner.argStringToArray = argStringToArray; - class ExecState extends events.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; // tracks whether the process has exited and stdio is closed - this.processError = ''; - this.processExitCode = 0; - this.processExited = false; // tracks whether the process has exited - this.processStderr = false; // tracks whether stderr was written to - this.delay = 10000; // 10 seconds - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error('toolPath must not be empty'); - } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; - } + } + + if (eqSet.size > 1) { + return null + } + + let gtltComp; + if (gt && lt) { + gtltComp = compare(gt.semver, lt.semver, options); + if (gtltComp > 0) { + return null + } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) { + return null } - CheckComplete() { - if (this.done) { - return; - } - if (this.processClosed) { - this._setResult(); - } - else if (this.processExited) { - this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); - } + } + + // will iterate one or zero times + for (const eq of eqSet) { + if (gt && !satisfies(eq, String(gt), options)) { + return null } - _debug(message) { - this.emit('debug', message); + + if (lt && !satisfies(eq, String(lt), options)) { + return null } - _setResult() { - // determine whether there is an error - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); - } - else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); - } - else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); - } + + for (const c of dom) { + if (!satisfies(eq, String(c), options)) { + return false + } + } + + return true + } + + let higher, lower; + let hasDomLT, hasDomGT; + // if the subset has a prerelease, we need a comparator in the superset + // with the same tuple and a prerelease, or it's not a subset + let needDomLTPre = lt && + !options.includePrerelease && + lt.semver.prerelease.length ? lt.semver : false; + let needDomGTPre = gt && + !options.includePrerelease && + gt.semver.prerelease.length ? gt.semver : false; + // exception: <1.2.3-0 is the same as <1.2.3 + if (needDomLTPre && needDomLTPre.prerelease.length === 1 && + lt.operator === '<' && needDomLTPre.prerelease[0] === 0) { + needDomLTPre = false; + } + + for (const c of dom) { + hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='; + hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='; + if (gt) { + if (needDomGTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomGTPre.major && + c.semver.minor === needDomGTPre.minor && + c.semver.patch === needDomGTPre.patch) { + needDomGTPre = false; } - // clear the timeout - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; + } + if (c.operator === '>' || c.operator === '>=') { + higher = higherGT(gt, c, options); + if (higher === c && higher !== gt) { + return false } - this.done = true; - this.emit('done', error, this.processExitCode); + } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) { + return false + } } - static HandleTimeout(state) { - if (state.done) { - return; + if (lt) { + if (needDomLTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomLTPre.major && + c.semver.minor === needDomLTPre.minor && + c.semver.patch === needDomLTPre.patch) { + needDomLTPre = false; } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / - 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); + } + if (c.operator === '<' || c.operator === '<=') { + lower = lowerLT(lt, c, options); + if (lower === c && lower !== lt) { + return false } - state._setResult(); + } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) { + return false + } } - } - - return toolrunner; -} + if (!c.operator && (lt || gt) && gtltComp !== 0) { + return false + } + } -var hasRequiredExec; + // if there was a < or >, and nothing in the dom, then must be false + // UNLESS it was limited by another range in the other direction. + // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0 + if (gt && hasDomLT && !lt && gtltComp !== 0) { + return false + } -function requireExec () { - if (hasRequiredExec) return exec; - hasRequiredExec = 1; - var __createBinding = (exec && exec.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (exec && exec.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (exec && exec.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; + if (lt && hasDomGT && !gt && gtltComp !== 0) { + return false + } + + // we needed a prerelease range in a specific tuple, but didn't get one + // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0, + // because it includes prereleases in the 1.2.3 tuple + if (needDomGTPre || needDomLTPre) { + return false + } + + return true }; - var __awaiter = (exec && exec.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + + // >=1.2.3 is lower than >1.2.3 + const higherGT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options); + return comp > 0 ? a + : comp < 0 ? b + : b.operator === '>' && a.operator === '>=' ? b + : a }; - Object.defineProperty(exec, "__esModule", { value: true }); - exec.getExecOutput = exec.exec = void 0; - const string_decoder_1 = require$$0$e; - const tr = __importStar(requireToolrunner()); - /** - * Exec a command. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param commandLine command to execute (can include additional args). Must be correctly escaped. - * @param args optional arguments for tool. Escaping is handled by the lib. - * @param options optional exec options. See ExecOptions - * @returns Promise exit code - */ - function exec$1(commandLine, args, options) { - return __awaiter(this, void 0, void 0, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); - } - // Path to tool to execute should be first arg - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); - } - exec.exec = exec$1; - /** - * Exec a command and get the output. - * Output will be streamed to the live console. - * Returns promise with the exit code and collected stdout and stderr - * - * @param commandLine command to execute (can include additional args). Must be correctly escaped. - * @param args optional arguments for tool. Escaping is handled by the lib. - * @param options optional exec options. See ExecOptions - * @returns Promise exit code, stdout, and stderr - */ - function getExecOutput(commandLine, args, options) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - let stdout = ''; - let stderr = ''; - //Using string decoder covers the case where a mult-byte character is split - const stdoutDecoder = new string_decoder_1.StringDecoder('utf8'); - const stderrDecoder = new string_decoder_1.StringDecoder('utf8'); - const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout; - const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr; - const stdErrListener = (data) => { - stderr += stderrDecoder.write(data); - if (originalStdErrListener) { - originalStdErrListener(data); - } - }; - const stdOutListener = (data) => { - stdout += stdoutDecoder.write(data); - if (originalStdoutListener) { - originalStdoutListener(data); - } - }; - const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec$1(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); - //flush any remaining characters - stdout += stdoutDecoder.end(); - stderr += stderrDecoder.end(); - return { - exitCode, - stdout, - stderr - }; - }); - } - exec.getExecOutput = getExecOutput; - - return exec; + + // <=1.2.3 is higher than <1.2.3 + const lowerLT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options); + return comp < 0 ? a + : comp > 0 ? b + : b.operator === '<' && a.operator === '<=' ? b + : a + }; + + subset_1 = subset; + return subset_1; } -var hasRequiredPlatform; +var semver$1; +var hasRequiredSemver$1; -function requirePlatform () { - if (hasRequiredPlatform) return platform; - hasRequiredPlatform = 1; - (function (exports$1) { - var __createBinding = (platform && platform.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (platform && platform.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (platform && platform.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (platform && platform.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __importDefault = (platform && platform.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getDetails = exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0; - const os_1 = __importDefault(require$$0$3); - const exec = __importStar(requireExec()); - const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { - silent: true - }); - const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, { - silent: true - }); - return { - name: name.trim(), - version: version.trim() - }; - }); - const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - var _a, _b, _c, _d; - const { stdout } = yield exec.getExecOutput('sw_vers', undefined, { - silent: true - }); - const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : ''; - const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : ''; - return { - name, - version - }; - }); - const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], { - silent: true - }); - const [name, version] = stdout.trim().split('\n'); - return { - name, - version - }; - }); - exports$1.platform = os_1.default.platform(); - exports$1.arch = os_1.default.arch(); - exports$1.isWindows = exports$1.platform === 'win32'; - exports$1.isMacOS = exports$1.platform === 'darwin'; - exports$1.isLinux = exports$1.platform === 'linux'; - function getDetails() { - return __awaiter(this, void 0, void 0, function* () { - return Object.assign(Object.assign({}, (yield (exports$1.isWindows - ? getWindowsInfo() - : exports$1.isMacOS - ? getMacOsInfo() - : getLinuxInfo()))), { platform: exports$1.platform, - arch: exports$1.arch, - isWindows: exports$1.isWindows, - isMacOS: exports$1.isMacOS, - isLinux: exports$1.isLinux }); - }); - } - exports$1.getDetails = getDetails; - - } (platform)); - return platform; +function requireSemver$1 () { + if (hasRequiredSemver$1) return semver$1; + hasRequiredSemver$1 = 1; + + // just pre-load all the stuff that index.js lazily exports + const internalRe = requireRe(); + const constants = requireConstants(); + const SemVer = requireSemver$2(); + const identifiers = requireIdentifiers(); + const parse = requireParse(); + const valid = requireValid$1(); + const clean = requireClean(); + const inc = requireInc(); + const diff = requireDiff(); + const major = requireMajor(); + const minor = requireMinor(); + const patch = requirePatch(); + const prerelease = requirePrerelease(); + const compare = requireCompare(); + const rcompare = requireRcompare(); + const compareLoose = requireCompareLoose(); + const compareBuild = requireCompareBuild(); + const sort = requireSort(); + const rsort = requireRsort(); + const gt = requireGt(); + const lt = requireLt(); + const eq = requireEq(); + const neq = requireNeq(); + const gte = requireGte(); + const lte = requireLte(); + const cmp = requireCmp(); + const coerce = requireCoerce(); + const Comparator = requireComparator(); + const Range = requireRange(); + const satisfies = requireSatisfies(); + const toComparators = requireToComparators(); + const maxSatisfying = requireMaxSatisfying(); + const minSatisfying = requireMinSatisfying(); + const minVersion = requireMinVersion(); + const validRange = requireValid(); + const outside = requireOutside(); + const gtr = requireGtr(); + const ltr = requireLtr(); + const intersects = requireIntersects(); + const simplifyRange = requireSimplify(); + const subset = requireSubset(); + semver$1 = { + parse, + valid, + clean, + inc, + diff, + major, + minor, + patch, + prerelease, + compare, + rcompare, + compareLoose, + compareBuild, + sort, + rsort, + gt, + lt, + eq, + neq, + gte, + lte, + cmp, + coerce, + Comparator, + Range, + satisfies, + toComparators, + maxSatisfying, + minSatisfying, + minVersion, + validRange, + outside, + gtr, + ltr, + intersects, + simplifyRange, + subset, + SemVer, + re: internalRe.re, + src: internalRe.src, + tokens: internalRe.t, + SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, + RELEASE_TYPES: constants.RELEASE_TYPES, + compareIdentifiers: identifiers.compareIdentifiers, + rcompareIdentifiers: identifiers.rcompareIdentifiers, + }; + return semver$1; } -var hasRequiredCore; +requireSemver$1(); -function requireCore () { - if (hasRequiredCore) return core; - hasRequiredCore = 1; - (function (exports$1) { - var __createBinding = (core && core.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (core && core.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (core && core.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (core && core.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.platform = exports$1.toPlatformPath = exports$1.toWin32Path = exports$1.toPosixPath = exports$1.markdownSummary = exports$1.summary = exports$1.getIDToken = exports$1.getState = exports$1.saveState = exports$1.group = exports$1.endGroup = exports$1.startGroup = exports$1.info = exports$1.notice = exports$1.warning = exports$1.error = exports$1.debug = exports$1.isDebug = exports$1.setFailed = exports$1.setCommandEcho = exports$1.setOutput = exports$1.getBooleanInput = exports$1.getMultilineInput = exports$1.getInput = exports$1.addPath = exports$1.setSecret = exports$1.exportVariable = exports$1.ExitCode = void 0; - const command_1 = requireCommand(); - const file_command_1 = requireFileCommand(); - const utils_1 = requireUtils(); - const os = __importStar(require$$0$3); - const path = __importStar(require$$1$6); - const oidc_utils_1 = requireOidcUtils(); - /** - * The code to exit an action - */ - var ExitCode; - (function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; - })(ExitCode || (exports$1.ExitCode = ExitCode = {})); - //----------------------------------------------------------------------- - // Variables - //----------------------------------------------------------------------- - /** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function exportVariable(name, val) { - const convertedVal = (0, utils_1.toCommandValue)(val); - process.env[name] = convertedVal; - const filePath = process.env['GITHUB_ENV'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val)); - } - (0, command_1.issueCommand)('set-env', { name }, convertedVal); - } - exports$1.exportVariable = exportVariable; - /** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ - function setSecret(secret) { - (0, command_1.issueCommand)('add-mask', {}, secret); - } - exports$1.setSecret = setSecret; - /** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ - function addPath(inputPath) { - const filePath = process.env['GITHUB_PATH'] || ''; - if (filePath) { - (0, file_command_1.issueFileCommand)('PATH', inputPath); - } - else { - (0, command_1.issueCommand)('add-path', {}, inputPath); - } - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; - } - exports$1.addPath = addPath; - /** - * Gets the value of an input. - * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. - * Returns an empty string if the value is not defined. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); - } - exports$1.getInput = getInput; - /** - * Gets the values of an multiline input. Each value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string[] - * - */ - function getMultilineInput(name, options) { - const inputs = getInput(name, options) - .split('\n') - .filter(x => x !== ''); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map(input => input.trim()); - } - exports$1.getMultilineInput = getMultilineInput; - /** - * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. - * Support boolean input list: `true | True | TRUE | false | False | FALSE` . - * The return value is also in boolean type. - * ref: https://yaml.org/spec/1.2/spec.html#id2804923 - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns boolean - */ - function getBooleanInput(name, options) { - const trueValue = ['true', 'True', 'TRUE']; - const falseValue = ['false', 'False', 'FALSE']; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + - `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports$1.getBooleanInput = getBooleanInput; - /** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function setOutput(name, value) { - const filePath = process.env['GITHUB_OUTPUT'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - process.stdout.write(os.EOL); - (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value)); - } - exports$1.setOutput = setOutput; - /** - * Enables or disables the echoing of commands into stdout for the rest of the step. - * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. - * - */ - function setCommandEcho(enabled) { - (0, command_1.issue)('echo', enabled ? 'on' : 'off'); - } - exports$1.setCommandEcho = setCommandEcho; - //----------------------------------------------------------------------- - // Results - //----------------------------------------------------------------------- - /** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); - } - exports$1.setFailed = setFailed; - //----------------------------------------------------------------------- - // Logging Commands - //----------------------------------------------------------------------- - /** - * Gets whether Actions Step Debug is on or not - */ - function isDebug() { - return process.env['RUNNER_DEBUG'] === '1'; - } - exports$1.isDebug = isDebug; - /** - * Writes debug message to user log - * @param message debug message - */ - function debug(message) { - (0, command_1.issueCommand)('debug', {}, message); - } - exports$1.debug = debug; - /** - * Adds an error issue - * @param message error issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function error(message, properties = {}) { - (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.error = error; - /** - * Adds a warning issue - * @param message warning issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function warning(message, properties = {}) { - (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.warning = warning; - /** - * Adds a notice issue - * @param message notice issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function notice(message, properties = {}) { - (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.notice = notice; - /** - * Writes info to log with console.log. - * @param message info message - */ - function info(message) { - process.stdout.write(message + os.EOL); - } - exports$1.info = info; - /** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ - function startGroup(name) { - (0, command_1.issue)('group', name); - } - exports$1.startGroup = startGroup; - /** - * End an output group. - */ - function endGroup() { - (0, command_1.issue)('endgroup'); - } - exports$1.endGroup = endGroup; - /** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ - function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); - } - exports$1.group = group; - //----------------------------------------------------------------------- - // Wrapper action state - //----------------------------------------------------------------------- - /** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function saveState(name, value) { - const filePath = process.env['GITHUB_STATE'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value)); - } - exports$1.saveState = saveState; - /** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ - function getState(name) { - return process.env[`STATE_${name}`] || ''; - } - exports$1.getState = getState; - function getIDToken(aud) { - return __awaiter(this, void 0, void 0, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); - } - exports$1.getIDToken = getIDToken; - /** - * Summary exports - */ - var summary_1 = requireSummary(); - Object.defineProperty(exports$1, "summary", { enumerable: true, get: function () { return summary_1.summary; } }); - /** - * @deprecated use core.summary - */ - var summary_2 = requireSummary(); - Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } }); - /** - * Path exports - */ - var path_utils_1 = requirePathUtils(); - Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } }); - Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } }); - Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }); - /** - * Platform utilities exports - */ - exports$1.platform = __importStar(requirePlatform()); - - } (core)); - return core; -} +var toolCache = {}; var manifest$1 = {exports: {}}; @@ -100351,13 +124053,23 @@ function requireManifest () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (manifest && manifest.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (manifest && manifest.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = (manifest && manifest.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -100368,17 +124080,19 @@ function requireManifest () { }); }; Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1._readLinuxVersionFile = exports$1._getOsVersion = exports$1._findMatch = void 0; + exports$1._findMatch = _findMatch; + exports$1._getOsVersion = _getOsVersion; + exports$1._readLinuxVersionFile = _readLinuxVersionFile; const semver = __importStar(requireSemver()); const core_1 = requireCore(); // needs to be require for core node modules to be mocked /* eslint @typescript-eslint/no-require-imports: 0 */ - const os = require$$0$3; + const os$1 = os; const cp = require$$2$2; - const fs = require$$1__default; + const fs = fs__default; function _findMatch(versionSpec, stable, candidates, archFilter) { return __awaiter(this, void 0, void 0, function* () { - const platFilter = os.platform(); + const platFilter = os$1.platform(); let result; let match; let file; @@ -100416,11 +124130,10 @@ function requireManifest () { return result; }); } - exports$1._findMatch = _findMatch; function _getOsVersion() { // TODO: add windows and other linux, arm variants // right now filtering on version is only an ubuntu and macos scenario for tools we build for hosted (python) - const plat = os.platform(); + const plat = os$1.platform(); let version = ''; if (plat === 'darwin') { version = cp.execSync('sw_vers -productVersion').toString(); @@ -100448,7 +124161,6 @@ function requireManifest () { } return version; } - exports$1._getOsVersion = _getOsVersion; function _readLinuxVersionFile() { const lsbReleaseFile = '/etc/lsb-release'; const osReleaseFile = '/etc/os-release'; @@ -100461,7 +124173,6 @@ function requireManifest () { } return contents; } - exports$1._readLinuxVersionFile = _readLinuxVersionFile; } (manifest$1, manifest$1.exports)); return manifest$1.exports; @@ -100490,13 +124201,23 @@ function requireRetryHelper () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (retryHelper && retryHelper.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (retryHelper && retryHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = (retryHelper && retryHelper.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -100584,13 +124305,23 @@ function requireToolCache () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (toolCache && toolCache.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (toolCache && toolCache.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = (toolCache && toolCache.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -100601,19 +124332,32 @@ function requireToolCache () { }); }; Object.defineProperty(toolCache, "__esModule", { value: true }); - toolCache.evaluateVersions = toolCache.isExplicitVersion = toolCache.findFromManifest = toolCache.getManifestFromRepo = toolCache.findAllVersions = toolCache.find = toolCache.cacheFile = toolCache.cacheDir = toolCache.extractZip = toolCache.extractXar = toolCache.extractTar = toolCache.extract7z = toolCache.downloadTool = toolCache.HTTPError = void 0; + toolCache.HTTPError = void 0; + toolCache.downloadTool = downloadTool; + toolCache.extract7z = extract7z; + toolCache.extractTar = extractTar; + toolCache.extractXar = extractXar; + toolCache.extractZip = extractZip; + toolCache.cacheDir = cacheDir; + toolCache.cacheFile = cacheFile; + toolCache.find = find; + toolCache.findAllVersions = findAllVersions; + toolCache.getManifestFromRepo = getManifestFromRepo; + toolCache.findFromManifest = findFromManifest; + toolCache.isExplicitVersion = isExplicitVersion; + toolCache.evaluateVersions = evaluateVersions; const core = __importStar(requireCore()); const io = __importStar(requireIo()); - const crypto = __importStar(require$$0$4); - const fs = __importStar(require$$1__default); + const crypto = __importStar(require$$0$3); + const fs = __importStar(fs__default); const mm = __importStar(requireManifest()); - const os = __importStar(require$$0$3); - const path = __importStar(require$$1$6); + const os$1 = __importStar(os); + const path = __importStar(require$$1$7); const httpm = __importStar(requireLib()); const semver = __importStar(requireSemver()); - const stream = __importStar(require$$0$a); - const util = __importStar(require$$0$6); - const assert_1 = require$$0$8; + const stream = __importStar(require$$3$1); + const util = __importStar(require$$6); + const assert_1 = require$$2$1; const exec_1 = requireExec(); const retry_helper_1 = requireRetryHelper(); class HTTPError extends Error { @@ -100662,7 +124406,6 @@ function requireToolCache () { }); }); } - toolCache.downloadTool = downloadTool; function downloadToolAttempt(url, dest, auth, headers) { return __awaiter(this, void 0, void 0, function* () { if (fs.existsSync(dest)) { @@ -100736,10 +124479,10 @@ function requireToolCache () { try { const logLevel = core.isDebug() ? '-bb1' : '-bb0'; const args = [ - 'x', - logLevel, - '-bd', - '-sccUTF-8', + 'x', // eXtract files with full paths + logLevel, // -bb[0-3] : set output log level + '-bd', // disable progress indicator + '-sccUTF-8', // set charset for for console input/output file ]; const options = { @@ -100783,7 +124526,6 @@ function requireToolCache () { return dest; }); } - toolCache.extract7z = extract7z; /** * Extract a compressed tar archive * @@ -100792,8 +124534,8 @@ function requireToolCache () { * @param flags flags for the tar command to use for extraction. Defaults to 'xz' (extracting gzipped tars). Optional. * @returns path to the destination directory */ - function extractTar(file, dest, flags = 'xz') { - return __awaiter(this, void 0, void 0, function* () { + function extractTar(file_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (file, dest, flags = 'xz') { if (!file) { throw new Error("parameter 'file' is required"); } @@ -100842,7 +124584,6 @@ function requireToolCache () { return dest; }); } - toolCache.extractTar = extractTar; /** * Extract a xar compatible archive * @@ -100851,8 +124592,8 @@ function requireToolCache () { * @param flags flags for the xar. Optional. * @returns path to the destination directory */ - function extractXar(file, dest, flags = []) { - return __awaiter(this, void 0, void 0, function* () { + function extractXar(file_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (file, dest, flags = []) { (0, assert_1.ok)(IS_MAC, 'extractXar() not supported on current OS'); (0, assert_1.ok)(file, 'parameter "file" is required'); dest = yield _createExtractFolder(dest); @@ -100872,7 +124613,6 @@ function requireToolCache () { return dest; }); } - toolCache.extractXar = extractXar; /** * Extract a zip * @@ -100895,7 +124635,6 @@ function requireToolCache () { return dest; }); } - toolCache.extractZip = extractZip; function extractZipWin(file, dest) { return __awaiter(this, void 0, void 0, function* () { // build the powershell command @@ -100969,7 +124708,7 @@ function requireToolCache () { function cacheDir(sourceDir, tool, version, arch) { return __awaiter(this, void 0, void 0, function* () { version = semver.clean(version) || version; - arch = arch || os.arch(); + arch = arch || os$1.arch(); core.debug(`Caching tool ${tool} ${version} ${arch}`); core.debug(`source dir: ${sourceDir}`); if (!fs.statSync(sourceDir).isDirectory()) { @@ -100988,7 +124727,6 @@ function requireToolCache () { return destPath; }); } - toolCache.cacheDir = cacheDir; /** * Caches a downloaded file (GUID) and installs it * into the tool cache with a given targetName @@ -101002,7 +124740,7 @@ function requireToolCache () { function cacheFile(sourceFile, targetFile, tool, version, arch) { return __awaiter(this, void 0, void 0, function* () { version = semver.clean(version) || version; - arch = arch || os.arch(); + arch = arch || os$1.arch(); core.debug(`Caching tool ${tool} ${version} ${arch}`); core.debug(`source file: ${sourceFile}`); if (!fs.statSync(sourceFile).isFile()) { @@ -101020,7 +124758,6 @@ function requireToolCache () { return destFolder; }); } - toolCache.cacheFile = cacheFile; /** * Finds the path to a tool version in the local installed tool cache * @@ -101035,7 +124772,7 @@ function requireToolCache () { if (!versionSpec) { throw new Error('versionSpec parameter is required'); } - arch = arch || os.arch(); + arch = arch || os$1.arch(); // attempt to resolve an explicit version if (!isExplicitVersion(versionSpec)) { const localVersions = findAllVersions(toolName, arch); @@ -101058,7 +124795,6 @@ function requireToolCache () { } return toolPath; } - toolCache.find = find; /** * Finds the paths to all versions of a tool that are installed in the local tool cache * @@ -101067,7 +124803,7 @@ function requireToolCache () { */ function findAllVersions(toolName, arch) { const versions = []; - arch = arch || os.arch(); + arch = arch || os$1.arch(); const toolPath = path.join(_getCacheDirectory(), toolName); if (fs.existsSync(toolPath)) { const children = fs.readdirSync(toolPath); @@ -101082,9 +124818,8 @@ function requireToolCache () { } return versions; } - toolCache.findAllVersions = findAllVersions; - function getManifestFromRepo(owner, repo, auth, branch = 'master') { - return __awaiter(this, void 0, void 0, function* () { + function getManifestFromRepo(owner_1, repo_1, auth_1) { + return __awaiter(this, arguments, void 0, function* (owner, repo, auth, branch = 'master') { let releases = []; const treeUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/${branch}`; const http = new httpm.HttpClient('tool-cache'); @@ -101119,15 +124854,13 @@ function requireToolCache () { return releases; }); } - toolCache.getManifestFromRepo = getManifestFromRepo; - function findFromManifest(versionSpec, stable, manifest, archFilter = os.arch()) { - return __awaiter(this, void 0, void 0, function* () { + function findFromManifest(versionSpec_1, stable_1, manifest_1) { + return __awaiter(this, arguments, void 0, function* (versionSpec, stable, manifest, archFilter = os$1.arch()) { // wrap the internal impl const match = yield mm._findMatch(versionSpec, stable, manifest, archFilter); return match; }); } - toolCache.findFromManifest = findFromManifest; function _createExtractFolder(dest) { return __awaiter(this, void 0, void 0, function* () { if (!dest) { @@ -101167,7 +124900,6 @@ function requireToolCache () { core.debug(`explicit? ${valid}`); return valid; } - toolCache.isExplicitVersion = isExplicitVersion; /** * Get the highest satisfiying semantic version in `versions` which satisfies `versionSpec` * @@ -101199,7 +124931,6 @@ function requireToolCache () { } return version; } - toolCache.evaluateVersions = evaluateVersions; /** * Gets RUNNER_TOOL_CACHE */ @@ -101238,16 +124969,14 @@ function requireToolCache () { requireToolCache(); -requireExec$2(); - -var utilsExports = requireUtils$1(); +requireExec(); function isPREvent() { return process.env[ENV_GITHUB_EVENT_NAME] === EVENT_NAME_PULL_REQUEST; } function getOctokit() { /* Set up GitHub instance manually because @actions/github does not allow unauthenticated access */ - const GitHubWithPlugins = utilsExports.GitHub.plugin(); + const GitHubWithPlugins = GitHub.plugin(); const token = coreExports.getInput(INPUT_GITHUB_TOKEN); if (token) { return new GitHubWithPlugins({ auth: `token ${token}` }); @@ -101260,12 +124989,12 @@ async function findExistingPRCommentId(bodyStartsWith) { if (!isPREvent()) { throw new Error('Not a PR event.'); } - const context = githubExports.context; + const context$1 = context; const octokit = getOctokit(); try { const comments = await octokit.paginate(octokit.rest.issues.listComments, { - ...context.repo, - issue_number: context.payload.pull_request?.number + ...context$1.repo, + issue_number: context$1.payload.pull_request?.number }); const matchingComment = comments.reverse().find((comment) => { return comment.body && comment.body.startsWith(bodyStartsWith); @@ -101282,7 +125011,7 @@ async function updatePRComment(content, commentId) { } try { await getOctokit().rest.issues.updateComment({ - ...githubExports.context.repo, + ...context.repo, comment_id: commentId, body: content }); @@ -101295,11 +125024,11 @@ async function createPRComment(content) { if (!isPREvent()) { throw new Error('Not a PR event.'); } - const context = githubExports.context; + const context$1 = context; try { await getOctokit().rest.issues.createComment({ - ...context.repo, - issue_number: context.payload.pull_request?.number, + ...context$1.repo, + issue_number: context$1.payload.pull_request?.number, body: content }); } @@ -101323,11 +125052,11 @@ const INPUT_NI_PR_REPORTS_UPDATE = 'native-image-pr-reports-update-existing'; const PR_COMMENT_TITLE = '## GraalVM Native Image Build Report'; async function generateReports() { if (areJobReportsEnabled() || arePRReportsEnabled()) { - if (!require$$1$1.existsSync(BUILD_OUTPUT_JSON_PATH)) { + if (!fs.existsSync(BUILD_OUTPUT_JSON_PATH)) { coreExports.warning('Unable to find build output data to create a report. Are you sure this build job has used GraalVM Native Image?'); return; } - const buildOutput = JSON.parse(require$$1$1.readFileSync(BUILD_OUTPUT_JSON_PATH, 'utf8')); + const buildOutput = JSON.parse(fs.readFileSync(BUILD_OUTPUT_JSON_PATH, 'utf8')); const report = createReport(buildOutput); if (areJobReportsEnabled()) { coreExports.summary.addRaw(report); @@ -101357,7 +125086,7 @@ function arePRReportsUpdateEnabled() { return isPREvent() && coreExports.getInput(INPUT_NI_PR_REPORTS_UPDATE) === 'true'; } function createReport(data) { - const context = githubExports.context; + const context$1 = context; const info = data.general_info; const analysis = data.analysis_results; const analysisTypes = analysis.types ? analysis.types : analysis.classes; @@ -101424,7 +125153,7 @@ function createReport(data) { } return `${PR_COMMENT_TITLE} -\`${info.name}\` generated${totalTime} as part of the '${context.job}' job in run #${context.runNumber}. +\`${info.name}\` generated${totalTime} as part of the '${context$1.job}' job in run #${context$1.runNumber}. #### Environment @@ -101592,7 +125321,7 @@ async function processSBOM() { } const sbomPath = await findSBOMFilePath(); try { - const sbomContent = require$$1$1.readFileSync(sbomPath, 'utf8'); + const sbomContent = fs.readFileSync(sbomPath, 'utf8'); const sbomData = parseSBOM(sbomContent); const components = mapToComponentsWithDependencies(sbomData); printSBOMContent(components); @@ -101654,19 +125383,19 @@ function printSBOMContent(components) { coreExports.info('=================='); } function convertSBOMToSnapshot(javaVersion, sbomPath, components) { - const context = githubExports.context; - const sbomFileName = basename$1(sbomPath); + const context$1 = context; + const sbomFileName = basename(sbomPath); if (!sbomFileName.endsWith(SBOM_FILE_SUFFIX)) { throw new Error(`Invalid SBOM file name: ${sbomFileName}. Expected a file ending with ${SBOM_FILE_SUFFIX}.`); } return { version: 0, - sha: context.sha, - ref: context.ref, + sha: context$1.sha, + ref: context$1.ref, job: { - correlator: `${context.workflow}_${context.job}`, - id: context.runId.toString(), - html_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` + correlator: `${context$1.workflow}_${context$1.job}`, + id: context$1.runId.toString(), + html_url: `https://github.com/${context$1.repo.owner}/${context$1.repo.repo}/actions/runs/${context$1.runId}` }, detector: { name: 'Oracle GraalVM', @@ -101704,12 +125433,12 @@ function mapComponentsToGithubAPIFormat(components) { } async function submitDependencySnapshot(snapshotData) { const token = coreExports.getInput(INPUT_GITHUB_TOKEN, { required: true }); - const octokit = githubExports.getOctokit(token); - const context = githubExports.context; + const octokit = getOctokit$1(token); + const context$1 = context; try { await octokit.request('POST /repos/{owner}/{repo}/dependency-graph/snapshots', { - owner: context.repo.owner, - repo: context.repo.repo, + owner: context$1.repo.owner, + repo: context$1.repo.repo, version: snapshotData.version, sha: snapshotData.sha, ref: snapshotData.ref, diff --git a/dist/main.js b/dist/main.js index d092086..6376eee 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,44 +1,47 @@ -import require$$0$5, { tmpdir } from 'os'; -import require$$0$6, { createHash } from 'crypto'; +import os, { EOL, tmpdir } from 'os'; +import require$$0$3, { createHash } from 'crypto'; import * as fs from 'fs'; -import fs__default, { readdirSync, readFileSync, existsSync } from 'fs'; +import fs__default, { existsSync, readFileSync, readdirSync } from 'fs'; import * as require$$1$1 from 'path'; -import require$$1__default, { join, extname, basename as basename$1 } from 'path'; -import require$$0$7 from 'http'; +import require$$1__default, { join, extname, basename } from 'path'; +import require$$0$4 from 'http'; import require$$1$2 from 'https'; -import require$$0$9 from 'net'; -import require$$1$4 from 'tls'; -import require$$1$3 from 'events'; -import require$$0$8, { ok } from 'assert'; -import * as require$$0$3 from 'util'; -import require$$0__default from 'util'; -import * as require$$0$4 from 'stream'; -import require$$0__default$1 from 'stream'; -import require$$7 from 'buffer'; -import require$$8 from 'querystring'; -import require$$14 from 'stream/web'; -import require$$0$b from 'node:stream'; -import require$$1$5 from 'node:util'; -import require$$0$a from 'node:events'; -import require$$0$c from 'worker_threads'; -import require$$2$1 from 'perf_hooks'; -import require$$5 from 'util/types'; -import require$$4$1 from 'async_hooks'; -import require$$1$6 from 'console'; -import require$$5$1 from 'url'; -import require$$3$1 from 'zlib'; -import require$$0$d from 'string_decoder'; -import require$$0$e from 'diagnostics_channel'; +import require$$0$c from 'net'; +import require$$1$3 from 'tls'; +import require$$0$5 from 'events'; +import require$$2$1, { ok } from 'assert'; +import * as require$$6 from 'util'; +import require$$6__default from 'util'; +import require$$0$7 from 'node:assert'; +import require$$0$9 from 'node:net'; +import require$$2 from 'node:http'; +import require$$0$8 from 'node:stream'; +import require$$0$6 from 'node:buffer'; +import require$$0$a from 'node:util'; +import require$$7 from 'node:querystring'; +import require$$8 from 'node:events'; +import require$$0$b from 'node:diagnostics_channel'; +import require$$5 from 'node:tls'; +import require$$3 from 'node:zlib'; +import require$$5$1 from 'node:perf_hooks'; +import require$$8$1 from 'node:util/types'; +import require$$1$4 from 'node:worker_threads'; +import require$$1$5 from 'node:url'; +import require$$5$2 from 'node:async_hooks'; +import require$$1$6 from 'node:console'; +import require$$1$7 from 'node:dns'; +import require$$5$3 from 'string_decoder'; import require$$2$2, { spawnSync, execSync } from 'child_process'; -import require$$6 from 'timers'; -import require$$1$7 from 'node:os'; +import require$$6$1 from 'timers'; +import * as require$$9 from 'stream'; +import require$$9__default from 'stream'; +import require$$5$4 from 'url'; +import require$$1$8 from 'node:os'; import require$$2$3 from 'node:process'; -import require$$1$8 from 'node:http'; import require$$2$4 from 'node:https'; -import require$$3$2 from 'node:zlib'; import require$$1$9 from 'tty'; -import require$$0$f from 'node:crypto'; -import require$$2$5 from 'node:buffer'; +import require$$0$d from 'node:crypto'; +import require$$2$5 from 'buffer'; import require$$1$a from 'node:fs'; const ACTION_VERSION = '1.4.5'; @@ -124,10 +127,6 @@ function determineGraalVMArchitecture() { var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - function getAugmentedNamespace(n) { if (Object.prototype.hasOwnProperty.call(n, '__esModule')) return n; var f = n.default; @@ -157,22 +156,22 @@ function getAugmentedNamespace(n) { return a; } -var core$2 = {}; +var core = {}; -var command$2 = {}; +var command = {}; -var utils$7 = {}; +var utils$4 = {}; -var hasRequiredUtils$7; +var hasRequiredUtils$4; -function requireUtils$7 () { - if (hasRequiredUtils$7) return utils$7; - hasRequiredUtils$7 = 1; +function requireUtils$4 () { + if (hasRequiredUtils$4) return utils$4; + hasRequiredUtils$4 = 1; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ - Object.defineProperty(utils$7, "__esModule", { value: true }); - utils$7.toCommandValue = toCommandValue; - utils$7.toCommandProperties = toCommandProperties; + Object.defineProperty(utils$4, "__esModule", { value: true }); + utils$4.toCommandValue = toCommandValue; + utils$4.toCommandProperties = toCommandProperties; /** * Sanitizes an input into a string so it can be passed into issueCommand safely * @param input input to sanitize into a string @@ -206,15 +205,15 @@ function requireUtils$7 () { }; } - return utils$7; + return utils$4; } -var hasRequiredCommand$2; +var hasRequiredCommand; -function requireCommand$2 () { - if (hasRequiredCommand$2) return command$2; - hasRequiredCommand$2 = 1; - var __createBinding = (command$2 && command$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireCommand () { + if (hasRequiredCommand) return command; + hasRequiredCommand = 1; + var __createBinding = (command && command.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -225,12 +224,12 @@ function requireCommand$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (command$2 && command$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (command && command.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (command$2 && command$2.__importStar) || (function () { + var __importStar = (command && command.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -247,11 +246,11 @@ function requireCommand$2 () { return result; }; })(); - Object.defineProperty(command$2, "__esModule", { value: true }); - command$2.issueCommand = issueCommand; - command$2.issue = issue; - const os = __importStar(require$$0$5); - const utils_1 = requireUtils$7(); + Object.defineProperty(command, "__esModule", { value: true }); + command.issueCommand = issueCommand; + command.issue = issue; + const os$1 = __importStar(os); + const utils_1 = requireUtils$4(); /** * Issues a command to the GitHub Actions runner * @@ -287,7 +286,7 @@ function requireCommand$2 () { */ function issueCommand(command, properties, message) { const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); + process.stdout.write(cmd.toString() + os$1.EOL); } function issue(name, message = '') { issueCommand(name, {}, message); @@ -341,18 +340,18 @@ function requireCommand$2 () { .replace(/,/g, '%2C'); } - return command$2; + return command; } -var fileCommand$2 = {}; +var fileCommand = {}; -var hasRequiredFileCommand$2; +var hasRequiredFileCommand; -function requireFileCommand$2 () { - if (hasRequiredFileCommand$2) return fileCommand$2; - hasRequiredFileCommand$2 = 1; +function requireFileCommand () { + if (hasRequiredFileCommand) return fileCommand; + hasRequiredFileCommand = 1; // For internal use, subject to change. - var __createBinding = (fileCommand$2 && fileCommand$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (fileCommand && fileCommand.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -363,12 +362,12 @@ function requireFileCommand$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (fileCommand$2 && fileCommand$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (fileCommand && fileCommand.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (fileCommand$2 && fileCommand$2.__importStar) || (function () { + var __importStar = (fileCommand && fileCommand.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -385,15 +384,15 @@ function requireFileCommand$2 () { return result; }; })(); - Object.defineProperty(fileCommand$2, "__esModule", { value: true }); - fileCommand$2.issueFileCommand = issueFileCommand; - fileCommand$2.prepareKeyValueMessage = prepareKeyValueMessage; + Object.defineProperty(fileCommand, "__esModule", { value: true }); + fileCommand.issueFileCommand = issueFileCommand; + fileCommand.prepareKeyValueMessage = prepareKeyValueMessage; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ - const crypto = __importStar(require$$0$6); + const crypto = __importStar(require$$0$3); const fs = __importStar(fs__default); - const os = __importStar(require$$0$5); - const utils_1 = requireUtils$7(); + const os$1 = __importStar(os); + const utils_1 = requireUtils$4(); function issueFileCommand(command, message) { const filePath = process.env[`GITHUB_${command}`]; if (!filePath) { @@ -402,7 +401,7 @@ function requireFileCommand$2 () { if (!fs.existsSync(filePath)) { throw new Error(`Missing file at path: ${filePath}`); } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { + fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os$1.EOL}`, { encoding: 'utf8' }); } @@ -418,26 +417,26 @@ function requireFileCommand$2 () { if (convertedValue.includes(delimiter)) { throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; + return `${key}<<${delimiter}${os$1.EOL}${convertedValue}${os$1.EOL}${delimiter}`; } - return fileCommand$2; + return fileCommand; } -var oidcUtils$2 = {}; +var oidcUtils = {}; -var lib$3 = {}; +var lib = {}; -var proxy$3 = {}; +var proxy = {}; -var hasRequiredProxy$3; +var hasRequiredProxy; -function requireProxy$3 () { - if (hasRequiredProxy$3) return proxy$3; - hasRequiredProxy$3 = 1; - Object.defineProperty(proxy$3, "__esModule", { value: true }); - proxy$3.getProxyUrl = getProxyUrl; - proxy$3.checkBypass = checkBypass; +function requireProxy () { + if (hasRequiredProxy) return proxy; + hasRequiredProxy = 1; + Object.defineProperty(proxy, "__esModule", { value: true }); + proxy.getProxyUrl = getProxyUrl; + proxy.checkBypass = checkBypass; function getProxyUrl(reqUrl) { const usingSsl = reqUrl.protocol === 'https:'; if (checkBypass(reqUrl)) { @@ -528,7 +527,7 @@ function requireProxy$3 () { } } - return proxy$3; + return proxy; } var tunnel$1 = {}; @@ -538,11 +537,11 @@ var hasRequiredTunnel$1; function requireTunnel$1 () { if (hasRequiredTunnel$1) return tunnel$1; hasRequiredTunnel$1 = 1; - var tls = require$$1$4; - var http = require$$0$7; + var tls = require$$1$3; + var http = require$$0$4; var https = require$$1$2; - var events = require$$1$3; - var util = require$$0__default; + var events = require$$0$5; + var util = require$$6__default; tunnel$1.httpOverHttp = httpOverHttp; @@ -811,15 +810,15 @@ function requireTunnel () { return tunnel; } -var undici = {}; +var undici$1 = {}; -var symbols$4; -var hasRequiredSymbols$4; +var symbols$9; +var hasRequiredSymbols$9; -function requireSymbols$4 () { - if (hasRequiredSymbols$4) return symbols$4; - hasRequiredSymbols$4 = 1; - symbols$4 = { +function requireSymbols$9 () { + if (hasRequiredSymbols$9) return symbols$9; + hasRequiredSymbols$9 = 1; + symbols$9 = { kClose: Symbol('close'), kDestroy: Symbol('destroy'), kDispatch: Symbol('dispatch'), @@ -829,7 +828,6 @@ function requireSymbols$4 () { kQueue: Symbol('queue'), kConnect: Symbol('connect'), kConnecting: Symbol('connecting'), - kHeadersList: Symbol('headers list'), kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), @@ -842,6 +840,7 @@ function requireSymbols$4 () { kHost: Symbol('host'), kNoRef: Symbol('no ref'), kBodyUsed: Symbol('used'), + kBody: Symbol('abstracted request body'), kRunning: Symbol('running'), kBlocking: Symbol('blocking'), kPending: Symbol('pending'), @@ -854,6 +853,8 @@ function requireSymbols$4 () { kNeedDrain: Symbol('need drain'), kReset: Symbol('reset'), kDestroyed: Symbol.for('nodejs.stream.destroyed'), + kResume: Symbol('resume'), + kOnError: Symbol('on error'), kMaxHeadersSize: Symbol('max headers size'), kRunningIdx: Symbol('running index'), kPendingIdx: Symbol('pending index'), @@ -875,75 +876,108 @@ function requireSymbols$4 () { kMaxResponseSize: Symbol('max response size'), kHTTP2Session: Symbol('http2Session'), kHTTP2SessionState: Symbol('http2Session state'), - kHTTP2BuildRequest: Symbol('http2 build request'), - kHTTP1BuildRequest: Symbol('http1 build request'), - kHTTP2CopyHeaders: Symbol('http2 copy headers'), - kHTTPConnVersion: Symbol('http connection version'), kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), - kConstruct: Symbol('constructable') + kConstruct: Symbol('constructable'), + kListeners: Symbol('listeners'), + kHTTPContext: Symbol('http context'), + kMaxConcurrentStreams: Symbol('max concurrent streams'), + kNoProxyAgent: Symbol('no proxy agent'), + kHttpProxyAgent: Symbol('http proxy agent'), + kHttpsProxyAgent: Symbol('https proxy agent') }; - return symbols$4; + return symbols$9; } -var errors$1; -var hasRequiredErrors$1; +var errors$2; +var hasRequiredErrors$2; -function requireErrors$1 () { - if (hasRequiredErrors$1) return errors$1; - hasRequiredErrors$1 = 1; +function requireErrors$2 () { + if (hasRequiredErrors$2) return errors$2; + hasRequiredErrors$2 = 1; + const kUndiciError = Symbol.for('undici.error.UND_ERR'); class UndiciError extends Error { constructor (message) { super(message); this.name = 'UndiciError'; this.code = 'UND_ERR'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kUndiciError] === true + } + + [kUndiciError] = true } + const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT'); class ConnectTimeoutError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ConnectTimeoutError); this.name = 'ConnectTimeoutError'; this.message = message || 'Connect Timeout Error'; this.code = 'UND_ERR_CONNECT_TIMEOUT'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kConnectTimeoutError] === true + } + + [kConnectTimeoutError] = true } + const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT'); class HeadersTimeoutError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, HeadersTimeoutError); this.name = 'HeadersTimeoutError'; this.message = message || 'Headers Timeout Error'; this.code = 'UND_ERR_HEADERS_TIMEOUT'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersTimeoutError] === true + } + + [kHeadersTimeoutError] = true } + const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW'); class HeadersOverflowError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, HeadersOverflowError); this.name = 'HeadersOverflowError'; this.message = message || 'Headers Overflow Error'; this.code = 'UND_ERR_HEADERS_OVERFLOW'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersOverflowError] === true + } + + [kHeadersOverflowError] = true } + const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT'); class BodyTimeoutError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, BodyTimeoutError); this.name = 'BodyTimeoutError'; this.message = message || 'Body Timeout Error'; this.code = 'UND_ERR_BODY_TIMEOUT'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kBodyTimeoutError] === true + } + + [kBodyTimeoutError] = true } + const kResponseStatusCodeError = Symbol.for('undici.error.UND_ERR_RESPONSE_STATUS_CODE'); class ResponseStatusCodeError extends UndiciError { constructor (message, statusCode, headers, body) { super(message); - Error.captureStackTrace(this, ResponseStatusCodeError); this.name = 'ResponseStatusCodeError'; this.message = message || 'Response Status Code Error'; this.code = 'UND_ERR_RESPONSE_STATUS_CODE'; @@ -952,143 +986,243 @@ function requireErrors$1 () { this.statusCode = statusCode; this.headers = headers; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseStatusCodeError] === true + } + + [kResponseStatusCodeError] = true } + const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG'); class InvalidArgumentError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, InvalidArgumentError); this.name = 'InvalidArgumentError'; this.message = message || 'Invalid Argument Error'; this.code = 'UND_ERR_INVALID_ARG'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidArgumentError] === true + } + + [kInvalidArgumentError] = true } + const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE'); class InvalidReturnValueError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, InvalidReturnValueError); this.name = 'InvalidReturnValueError'; this.message = message || 'Invalid Return Value Error'; this.code = 'UND_ERR_INVALID_RETURN_VALUE'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidReturnValueError] === true + } + + [kInvalidReturnValueError] = true } - class RequestAbortedError extends UndiciError { + const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT'); + class AbortError extends UndiciError { + constructor (message) { + super(message); + this.name = 'AbortError'; + this.message = message || 'The operation was aborted'; + this.code = 'UND_ERR_ABORT'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kAbortError] === true + } + + [kAbortError] = true + } + + const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED'); + class RequestAbortedError extends AbortError { constructor (message) { super(message); - Error.captureStackTrace(this, RequestAbortedError); this.name = 'AbortError'; this.message = message || 'Request aborted'; this.code = 'UND_ERR_ABORTED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestAbortedError] === true + } + + [kRequestAbortedError] = true } + const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO'); class InformationalError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, InformationalError); this.name = 'InformationalError'; this.message = message || 'Request information'; this.code = 'UND_ERR_INFO'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInformationalError] === true + } + + [kInformationalError] = true } + const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'); class RequestContentLengthMismatchError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, RequestContentLengthMismatchError); this.name = 'RequestContentLengthMismatchError'; this.message = message || 'Request body length does not match content-length header'; this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestContentLengthMismatchError] === true + } + + [kRequestContentLengthMismatchError] = true } + const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH'); class ResponseContentLengthMismatchError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ResponseContentLengthMismatchError); this.name = 'ResponseContentLengthMismatchError'; this.message = message || 'Response body length does not match content-length header'; this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseContentLengthMismatchError] === true + } + + [kResponseContentLengthMismatchError] = true } + const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED'); class ClientDestroyedError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ClientDestroyedError); this.name = 'ClientDestroyedError'; this.message = message || 'The client is destroyed'; this.code = 'UND_ERR_DESTROYED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientDestroyedError] === true + } + + [kClientDestroyedError] = true } + const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED'); class ClientClosedError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ClientClosedError); this.name = 'ClientClosedError'; this.message = message || 'The client is closed'; this.code = 'UND_ERR_CLOSED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientClosedError] === true + } + + [kClientClosedError] = true } + const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET'); class SocketError extends UndiciError { constructor (message, socket) { super(message); - Error.captureStackTrace(this, SocketError); this.name = 'SocketError'; this.message = message || 'Socket error'; this.code = 'UND_ERR_SOCKET'; this.socket = socket; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kSocketError] === true + } + + [kSocketError] = true } + const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED'); class NotSupportedError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, NotSupportedError); this.name = 'NotSupportedError'; this.message = message || 'Not supported error'; this.code = 'UND_ERR_NOT_SUPPORTED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kNotSupportedError] === true + } + + [kNotSupportedError] = true } + const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM'); class BalancedPoolMissingUpstreamError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, NotSupportedError); this.name = 'MissingUpstreamError'; this.message = message || 'No upstream has been added to the BalancedPool'; this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true + } + + [kBalancedPoolMissingUpstreamError] = true } + const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER'); class HTTPParserError extends Error { constructor (message, code, data) { super(message); - Error.captureStackTrace(this, HTTPParserError); this.name = 'HTTPParserError'; this.code = code ? `HPE_${code}` : undefined; this.data = data ? data.toString() : undefined; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHTTPParserError] === true + } + + [kHTTPParserError] = true } + const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE'); class ResponseExceededMaxSizeError extends UndiciError { constructor (message) { super(message); - Error.captureStackTrace(this, ResponseExceededMaxSizeError); this.name = 'ResponseExceededMaxSizeError'; this.message = message || 'Response content exceeded max size'; this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseExceededMaxSizeError] === true + } + + [kResponseExceededMaxSizeError] = true } + const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY'); class RequestRetryError extends UndiciError { constructor (message, code, { headers, data }) { super(message); - Error.captureStackTrace(this, RequestRetryError); this.name = 'RequestRetryError'; this.message = message || 'Request retry error'; this.code = 'UND_ERR_REQ_RETRY'; @@ -1096,9 +1230,52 @@ function requireErrors$1 () { this.data = data; this.headers = headers; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestRetryError] === true + } + + [kRequestRetryError] = true } - errors$1 = { + const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE'); + class ResponseError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message); + this.name = 'ResponseError'; + this.message = message || 'Response error'; + this.code = 'UND_ERR_RESPONSE'; + this.statusCode = code; + this.data = data; + this.headers = headers; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseError] === true + } + + [kResponseError] = true + } + + const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS'); + class SecureProxyConnectionError extends UndiciError { + constructor (cause, message, options) { + super(message, { cause, ...(options ?? {}) }); + this.name = 'SecureProxyConnectionError'; + this.message = message || 'Secure Proxy Connection failed'; + this.code = 'UND_ERR_PRX_TLS'; + this.cause = cause; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kSecureProxyConnectionError] === true + } + + [kSecureProxyConnectionError] = true + } + + errors$2 = { + AbortError, HTTPParserError, UndiciError, HeadersTimeoutError, @@ -1118,17 +1295,19 @@ function requireErrors$1 () { ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError, ResponseExceededMaxSizeError, - RequestRetryError + RequestRetryError, + ResponseError, + SecureProxyConnectionError }; - return errors$1; + return errors$2; } -var constants$b; -var hasRequiredConstants$b; +var constants$g; +var hasRequiredConstants$g; -function requireConstants$b () { - if (hasRequiredConstants$b) return constants$b; - hasRequiredConstants$b = 1; +function requireConstants$g () { + if (hasRequiredConstants$g) return constants$g; + hasRequiredConstants$g = 1; /** @type {Record} */ const headerNameLowerCasedRecord = {}; @@ -1242,33 +1421,247 @@ function requireConstants$b () { // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. Object.setPrototypeOf(headerNameLowerCasedRecord, null); - constants$b = { + constants$g = { wellknownHeaderNames, headerNameLowerCasedRecord }; - return constants$b; + return constants$g; } -var util$8; -var hasRequiredUtil$8; +var tree_1$1; +var hasRequiredTree$1; -function requireUtil$8 () { - if (hasRequiredUtil$8) return util$8; - hasRequiredUtil$8 = 1; +function requireTree$1 () { + if (hasRequiredTree$1) return tree_1$1; + hasRequiredTree$1 = 1; + + const { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = requireConstants$g(); + + class TstNode { + /** @type {any} */ + value = null + /** @type {null | TstNode} */ + left = null + /** @type {null | TstNode} */ + middle = null + /** @type {null | TstNode} */ + right = null + /** @type {number} */ + code + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor (key, value, index) { + if (index === undefined || index >= key.length) { + throw new TypeError('Unreachable') + } + const code = this.code = key.charCodeAt(index); + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (key.length !== ++index) { + this.middle = new TstNode(key, value, index); + } else { + this.value = value; + } + } + + /** + * @param {string} key + * @param {any} value + */ + add (key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError('Unreachable') + } + let index = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index); + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (node.code === code) { + if (length === ++index) { + node.value = value; + break + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new TstNode(key, value, index); + break + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new TstNode(key, value, index); + break + } + } else if (node.right !== null) { + node = node.right; + } else { + node.right = new TstNode(key, value, index); + break + } + } + } - const assert = require$$0$8; - const { kDestroyed, kBodyUsed } = requireSymbols$4(); - const { IncomingMessage } = require$$0$7; - const stream = require$$0__default$1; + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search (key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code = key[index]; + // A-Z + // First check if it is bigger than 0x5a. + // Lowercase letters have higher char codes than uppercase ones. + // Also we assume that headers will mostly contain lowercase characters. + if (code <= 0x5a && code >= 0x41) { + // Lowercase for uppercase. + code |= 32; + } + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + // Returns Node since it is the last key. + return node + } + node = node.middle; + break + } + node = node.code < code ? node.left : node.right; + } + } + return null + } + } + + class TernarySearchTree { + /** @type {TstNode | null} */ + node = null + + /** + * @param {string} key + * @param {any} value + * */ + insert (key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); + } + } + + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup (key) { + return this.node?.search(key)?.value ?? null + } + } + + const tree = new TernarySearchTree(); + + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + + tree_1$1 = { + TernarySearchTree, + tree + }; + return tree_1$1; +} + +var util$h; +var hasRequiredUtil$h; + +function requireUtil$h () { + if (hasRequiredUtil$h) return util$h; + hasRequiredUtil$h = 1; + + const assert = require$$0$7; + const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols$9(); + const { IncomingMessage } = require$$2; + const stream = require$$0$8; const net = require$$0$9; - const { InvalidArgumentError } = requireErrors$1(); - const { Blob } = require$$7; - const nodeUtil = require$$0__default; - const { stringify } = require$$8; - const { headerNameLowerCasedRecord } = requireConstants$b(); + const { Blob } = require$$0$6; + const nodeUtil = require$$0$a; + const { stringify } = require$$7; + const { EventEmitter: EE } = require$$8; + const { InvalidArgumentError } = requireErrors$2(); + const { headerNameLowerCasedRecord } = requireConstants$g(); + const { tree } = requireTree$1(); const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)); + class BodyAsyncIterable { + constructor (body) { + this[kBody] = body; + this[kBodyUsed] = false; + } + + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed'); + this[kBodyUsed] = true; + yield * this[kBody]; + } + } + + function wrapRequestBody (body) { + if (isStream(body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (bodyLength(body) === 0) { + body + .on('data', function () { + assert(false); + }); + } + + if (typeof body.readableDidRead !== 'boolean') { + body[kBodyUsed] = false; + EE.prototype.on.call(body, 'data', function () { + this[kBodyUsed] = true; + }); + } + + return body + } else if (body && typeof body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + return new BodyAsyncIterable(body) + } else if ( + body && + typeof body !== 'string' && + !ArrayBuffer.isView(body) && + isIterable(body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + return new BodyAsyncIterable(body) + } else { + return body + } + } + function nop () {} function isStream (obj) { @@ -1277,13 +1670,20 @@ function requireUtil$8 () { // based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) function isBlobLike (object) { - return (Blob && object instanceof Blob) || ( - object && - typeof object === 'object' && - (typeof object.stream === 'function' || - typeof object.arrayBuffer === 'function') && - /^(Blob|File)$/.test(object[Symbol.toStringTag]) - ) + if (object === null) { + return false + } else if (object instanceof Blob) { + return true + } else if (typeof object !== 'object') { + return false + } else { + const sTag = object[Symbol.toStringTag]; + + return (sTag === 'Blob' || sTag === 'File') && ( + ('stream' in object && typeof object.stream === 'function') || + ('arrayBuffer' in object && typeof object.arrayBuffer === 'function') + ) + } } function buildURL (url, queryParams) { @@ -1300,11 +1700,37 @@ function requireUtil$8 () { return url } + function isValidPort (port) { + const value = parseInt(port, 10); + return ( + value === Number(port) && + value >= 0 && + value <= 65535 + ) + } + + function isHttpOrHttpsPrefixed (value) { + return ( + value != null && + value[0] === 'h' && + value[1] === 't' && + value[2] === 't' && + value[3] === 'p' && + ( + value[4] === ':' || + ( + value[4] === 's' && + value[5] === ':' + ) + ) + ) + } + function parseURL (url) { if (typeof url === 'string') { url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } @@ -1315,12 +1741,8 @@ function requireUtil$8 () { throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { + if (url.port != null && url.port !== '' && isValidPort(url.port) === false) { throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') } @@ -1340,28 +1762,36 @@ function requireUtil$8 () { throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } + const port = url.port != null ? url.port : (url.protocol === 'https:' ? 443 : 80); let origin = url.origin != null ? url.origin - : `${url.protocol}//${url.hostname}:${port}`; + : `${url.protocol || ''}//${url.hostname || ''}:${port}`; let path = url.path != null ? url.path : `${url.pathname || ''}${url.search || ''}`; - if (origin.endsWith('/')) { - origin = origin.substring(0, origin.length - 1); + if (origin[origin.length - 1] === '/') { + origin = origin.slice(0, origin.length - 1); } - if (path && !path.startsWith('/')) { + if (path && path[0] !== '/') { path = `/${path}`; } // new URL(path, origin) is unsafe when `path` contains an absolute URL // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: // If first parameter is a relative URL, second param is required, and will be used as the base URL. // If first parameter is an absolute URL, a given second param will be ignored. - url = new URL(origin + path); + return new URL(`${origin}${path}`) + } + + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } return url @@ -1398,7 +1828,7 @@ function requireUtil$8 () { return null } - assert.strictEqual(typeof host, 'string'); + assert(typeof host === 'string'); const servername = getHostname(host); if (net.isIP(servername)) { @@ -1437,13 +1867,8 @@ function requireUtil$8 () { return null } - function isDestroyed (stream) { - return !stream || !!(stream.destroyed || stream[kDestroyed]) - } - - function isReadableAborted (stream) { - const state = stream && stream._readableState; - return isDestroyed(stream) && state && !state.endEmitted + function isDestroyed (body) { + return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body))) } function destroy (stream, err) { @@ -1459,9 +1884,9 @@ function requireUtil$8 () { stream.destroy(err); } else if (err) { - process.nextTick((stream, err) => { + queueMicrotask(() => { stream.emit('error', err); - }, stream, err); + }); } if (stream.destroyed !== true) { @@ -1481,29 +1906,44 @@ function requireUtil$8 () { * @returns {string} */ function headerNameToString (value) { - return headerNameLowerCasedRecord[value] || value.toLowerCase() + return typeof value === 'string' + ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() + : tree.lookup(value) ?? value.toString('latin1').toLowerCase() } - function parseHeaders (headers, obj = {}) { - // For H2 support - if (!Array.isArray(headers)) return headers + /** + * Receive the buffer as a string and return its lowercase value. + * @param {Buffer} value Header name + * @returns {string} + */ + function bufferToLowerCasedHeaderName (value) { + return tree.lookup(value) ?? value.toString('latin1').toLowerCase() + } + /** + * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers + * @param {Record} [obj] + * @returns {Record} + */ + function parseHeaders (headers, obj) { + if (obj === undefined) obj = {}; for (let i = 0; i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase(); + const key = headerNameToString(headers[i]); let val = obj[key]; - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1].map(x => x.toString('utf8')); - } else { - obj[key] = headers[i + 1].toString('utf8'); - } - } else { - if (!Array.isArray(val)) { + if (val) { + if (typeof val === 'string') { val = [val]; obj[key] = val; } val.push(headers[i + 1].toString('utf8')); + } else { + const headersValue = headers[i + 1]; + if (typeof headersValue === 'string') { + obj[key] = headersValue; + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8'); + } } } @@ -1516,22 +1956,30 @@ function requireUtil$8 () { } function parseRawHeaders (headers) { - const ret = []; + const len = headers.length; + const ret = new Array(len); + let hasContentLength = false; let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString('utf8'); + key = headers[n]; + val = headers[n + 1]; - if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) { - ret.push(key, val); + typeof key !== 'string' && (key = key.toString()); + typeof val !== 'string' && (val = val.toString('utf8')); + + kLen = key.length; + if (kLen === 14 && key[7] === '-' && (key === 'content-length' || key.toLowerCase() === 'content-length')) { hasContentLength = true; - } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); + } else if (kLen === 19 && key[7] === '-' && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { + contentDispositionIdx = n + 1; } + ret[n] = key; + ret[n + 1] = val; } // See https://github.com/nodejs/node/pull/46528 @@ -1586,30 +2034,16 @@ function requireUtil$8 () { // A body is disturbed if it has been read from and it cannot // be re-used without losing state or data. function isDisturbed (body) { - return !!(body && ( - stream.isDisturbed - ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? - : body[kBodyUsed] || - body.readableDidRead || - (body._readableState && body._readableState.dataEmitted) || - isReadableAborted(body) - )) + // TODO (fix): Why is body[kBodyUsed] needed? + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])) } function isErrored (body) { - return !!(body && ( - stream.isErrored - ? stream.isErrored(body) - : /state: 'errored'/.test(nodeUtil.inspect(body) - ))) + return !!(body && stream.isErrored(body)) } function isReadable (body) { - return !!(body && ( - stream.isReadable - ? stream.isReadable(body) - : /state: 'readable'/.test(nodeUtil.inspect(body) - ))) + return !!(body && stream.isReadable(body)) } function getSocketInfo (socket) { @@ -1625,21 +2059,9 @@ function requireUtil$8 () { } } - async function * convertIterableToBuffer (iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); - } - } - - let ReadableStream; + /** @type {globalThis['ReadableStream']} */ function ReadableStreamFrom (iterable) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)) - } + // We cannot use ReadableStream.from here because it does not return a byte stream. let iterator; return new ReadableStream( @@ -1652,18 +2074,21 @@ function requireUtil$8 () { if (done) { queueMicrotask(() => { controller.close(); + controller.byobRequest?.respond(0); }); } else { const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - controller.enqueue(new Uint8Array(buf)); + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)); + } } return controller.desiredSize > 0 }, async cancel (reason) { await iterator.return(); - } - }, - 0 + }, + type: 'bytes' + } ) } @@ -1683,20 +2108,6 @@ function requireUtil$8 () { ) } - function throwIfAborted (signal) { - if (!signal) { return } - if (typeof signal.throwIfAborted === 'function') { - signal.throwIfAborted(); - } else { - if (signal.aborted) { - // DOMException not available < v17.0.0 - const err = new Error('The operation was aborted'); - err.name = 'AbortError'; - throw err - } - } - } - function addAbortListener (signal, listener) { if ('addEventListener' in signal) { signal.addEventListener('abort', listener, { once: true }); @@ -1706,19 +2117,86 @@ function requireUtil$8 () { return () => signal.removeListener('abort', listener) } - const hasToWellFormed = !!String.prototype.toWellFormed; + const hasToWellFormed = typeof String.prototype.toWellFormed === 'function'; + const hasIsWellFormed = typeof String.prototype.isWellFormed === 'function'; /** * @param {string} val */ function toUSVString (val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed() - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val) + return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val) + } + + /** + * @param {string} val + */ + // TODO: move this to webidl + function isUSVString (val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}` + } + + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 + * @param {number} c + */ + function isTokenCharCode (c) { + switch (c) { + case 0x22: + case 0x28: + case 0x29: + case 0x2c: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x40: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x7b: + case 0x7d: + // DQUOTE and "(),/:;<=>?@[\]{}" + return false + default: + // VCHAR %x21-7E + return c >= 0x21 && c <= 0x7e + } + } + + /** + * @param {string} characters + */ + function isValidHTTPToken (characters) { + if (characters.length === 0) { + return false + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false + } } + return true + } + + // headerCharRegex have been lifted from + // https://github.com/nodejs/node/blob/main/lib/_http_common.js + + /** + * Matches if val contains an invalid field-vchar + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + */ + const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - return `${val}` + /** + * @param {string} characters + */ + function isValidHeaderValue (characters) { + return !headerCharRegex.test(characters) } // Parsed accordingly to RFC 9110 @@ -1736,17 +2214,65 @@ function requireUtil$8 () { : null } + function addListener (obj, name, listener) { + const listeners = (obj[kListeners] ??= []); + listeners.push([name, listener]); + obj.on(name, listener); + return obj + } + + function removeAllListeners (obj) { + for (const [name, listener] of obj[kListeners] ?? []) { + obj.removeListener(name, listener); + } + obj[kListeners] = null; + } + + function errorRequest (client, request, err) { + try { + request.onError(err); + assert(request.aborted); + } catch (err) { + client.emit('error', err); + } + } + const kEnumerableProperty = Object.create(null); kEnumerableProperty.enumerable = true; - util$8 = { + const normalizedMethodRecordsBase = { + delete: 'DELETE', + DELETE: 'DELETE', + get: 'GET', + GET: 'GET', + head: 'HEAD', + HEAD: 'HEAD', + options: 'OPTIONS', + OPTIONS: 'OPTIONS', + post: 'POST', + POST: 'POST', + put: 'PUT', + PUT: 'PUT' + }; + + const normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: 'patch', + PATCH: 'PATCH' + }; + + // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); + + util$h = { kEnumerableProperty, nop, isDisturbed, isErrored, isReadable, toUSVString, - isReadableAborted, + isUSVString, isBlobLike, parseOrigin, parseURL, @@ -1756,6 +2282,10 @@ function requireUtil$8 () { isAsyncIterable, isDestroyed, headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -1768,1780 +2298,1951 @@ function requireUtil$8 () { getSocketInfo, isFormDataLike, buildURL, - throwIfAborted, addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, nodeMajor, nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13), - safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'] - }; - return util$8; -} - -var timers; -var hasRequiredTimers; - -function requireTimers () { - if (hasRequiredTimers) return timers; - hasRequiredTimers = 1; - - let fastNow = Date.now(); - let fastNowTimeout; - - const fastTimers = []; - - function onTimeout () { - fastNow = Date.now(); - - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - - if (fastTimers.length > 0) { - refreshTimeout(); - } - } + safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'], + wrapRequestBody + }; + return util$h; +} + +var diagnostics$1; +var hasRequiredDiagnostics$1; + +function requireDiagnostics$1 () { + if (hasRequiredDiagnostics$1) return diagnostics$1; + hasRequiredDiagnostics$1 = 1; + const diagnosticsChannel = require$$0$b; + const util = require$$0$a; + + const undiciDebugLog = util.debuglog('undici'); + const fetchDebuglog = util.debuglog('fetch'); + const websocketDebuglog = util.debuglog('websocket'); + let isClientSet = false; + const channels = { + // Client + beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), + connected: diagnosticsChannel.channel('undici:client:connected'), + connectError: diagnosticsChannel.channel('undici:client:connectError'), + sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'), + // Request + create: diagnosticsChannel.channel('undici:request:create'), + bodySent: diagnosticsChannel.channel('undici:request:bodySent'), + headers: diagnosticsChannel.channel('undici:request:headers'), + trailers: diagnosticsChannel.channel('undici:request:trailers'), + error: diagnosticsChannel.channel('undici:request:error'), + // WebSocket + open: diagnosticsChannel.channel('undici:websocket:open'), + close: diagnosticsChannel.channel('undici:websocket:close'), + socketError: diagnosticsChannel.channel('undici:websocket:socket_error'), + ping: diagnosticsChannel.channel('undici:websocket:ping'), + pong: diagnosticsChannel.channel('undici:websocket:pong') + }; + + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; + + // Track all Client events + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connecting to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ); + }); - function refreshTimeout () { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1e3); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connected to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ); + }); - class Timeout { - constructor (callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + 'connection to %s using %s%s errored - %s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version, + error.message + ); + }); - // -2 not in timer list - // -1 in timer list but inactive - // 0 in timer list waiting for time - // > 0 in timer list waiting for time to expire - this.state = -2; + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('sending request to %s %s/%s', method, origin, path); + }); - this.refresh(); - } + // Track Request events + diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt; + debuglog( + 'received response to %s %s/%s - HTTP %d', + method, + origin, + path, + statusCode + ); + }); - refresh () { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } + diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('trailers received from %s %s/%s', method, origin, path); + }); - this.state = 0; - } + diagnosticsChannel.channel('undici:request:error').subscribe(evt => { + const { + request: { method, path, origin }, + error + } = evt; + debuglog( + 'request to %s %s/%s errored - %s', + method, + origin, + path, + error.message + ); + }); - clear () { - this.state = -1; - } + isClientSet = true; } - timers = { - setTimeout (callback, delay, opaque) { - return delay < 1e3 - ? setTimeout(callback, delay, opaque) - : new Timeout(callback, delay, opaque) - }, - clearTimeout (timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } - }; - return timers; -} - -var main = {exports: {}}; - -var sbmh; -var hasRequiredSbmh; - -function requireSbmh () { - if (hasRequiredSbmh) return sbmh; - hasRequiredSbmh = 1; - - /** - * Copyright Brian White. All rights reserved. - * - * @see https://github.com/mscdex/streamsearch - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation - * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool - */ - const EventEmitter = require$$0$a.EventEmitter; - const inherits = require$$1$5.inherits; - - function SBMH (needle) { - if (typeof needle === 'string') { - needle = Buffer.from(needle); - } + if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connecting to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ); + }); - if (!Buffer.isBuffer(needle)) { - throw new TypeError('The needle has to be a String or a Buffer.') - } + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connected to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ); + }); - const needleLength = needle.length; + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + 'connection to %s%s using %s%s errored - %s', + host, + port ? `:${port}` : '', + protocol, + version, + error.message + ); + }); - if (needleLength === 0) { - throw new Error('The needle cannot be an empty String/Buffer.') + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('sending request to %s %s/%s', method, origin, path); + }); } - if (needleLength > 256) { - throw new Error('The needle cannot have a length bigger than 256.') - } + // Track all WebSocket events + diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { + const { + address: { address, port } + } = evt; + websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : ''); + }); - this.maxMatches = Infinity; - this.matches = 0; + diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { + const { websocket, code, reason } = evt; + websocketDebuglog( + 'closed connection to %s - %s %s', + websocket.url, + code, + reason + ); + }); - this._occ = new Array(256) - .fill(needleLength); // Initialize occurrence table. - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; + diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { + websocketDebuglog('connection errored - %s', err.message); + }); - this._lookbehind = Buffer.alloc(needleLength); + diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { + websocketDebuglog('ping received'); + }); - // Populate occurrence table with analysis of the needle, - // ignoring last letter. - for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var - this._occ[needle[i]] = needleLength - 1 - i; - } + diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { + websocketDebuglog('pong received'); + }); } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function () { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; + diagnostics$1 = { + channels }; + return diagnostics$1; +} - SBMH.prototype.push = function (chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, 'binary'); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk); } - return r - }; +var request$4; +var hasRequiredRequest$3; - SBMH.prototype._sbmh_feed = function (data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; +function requireRequest$3 () { + if (hasRequiredRequest$3) return request$4; + hasRequiredRequest$3 = 1; - // Positive: points to a position in `data` - // pos == 3 points to data[3] - // Negative: points to a position in the lookbehind buffer - // pos == -2 points to lookbehind[lookbehind_size - 2] - let pos = -this._lookbehind_size; - let ch; + const { + InvalidArgumentError, + NotSupportedError + } = requireErrors$2(); + const assert = require$$0$7; + const { + isValidHTTPToken, + isValidHeaderValue, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName, + normalizedMethodRecords + } = requireUtil$h(); + const { channels } = requireDiagnostics$1(); + const { headerNameLowerCasedRecord } = requireConstants$g(); - if (pos < 0) { - // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool - // search with character lookup code that considers both the - // lookbehind buffer and the current round's haystack data. - // - // Loop until - // there is a match. - // or until - // we've moved past the position that requires the - // lookbehind buffer. In this case we switch to the - // optimized loop. - // or until - // the character to look at lies outside the haystack. - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); + // Verifies that a given path is valid does not contain control chars \x00 to \x20 + const invalidPathRegex = /[^\u0021-\u00ff]/; - if ( - ch === lastNeedleChar && - this._sbmh_memcmp(data, pos, needleLength - 1) - ) { - this._lookbehind_size = 0; - ++this.matches; - this.emit('info', true); + const kHandler = Symbol('handler'); - return (this._bufpos = pos + needleLength) - } - pos += this._occ[ch]; + class Request { + constructor (origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler) { + if (typeof path !== 'string') { + throw new InvalidArgumentError('path must be a string') + } else if ( + path[0] !== '/' && + !(path.startsWith('http://') || path.startsWith('https://')) && + method !== 'CONNECT' + ) { + throw new InvalidArgumentError('path must be an absolute URL or start with a slash') + } else if (invalidPathRegex.test(path)) { + throw new InvalidArgumentError('invalid request path') } - // No match. - - if (pos < 0) { - // There's too few data for Boyer-Moore-Horspool to run, - // so let's use a different algorithm to skip as much as - // we can. - // Forward pos until - // the trailing part of lookbehind + data - // looks like the beginning of the needle - // or until - // pos == 0 - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos; } + if (typeof method !== 'string') { + throw new InvalidArgumentError('method must be a string') + } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) { + throw new InvalidArgumentError('invalid request method') } - if (pos >= 0) { - // Discard lookbehind buffer. - this.emit('info', false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; - } else { - // Cut off part of the lookbehind buffer that has - // been processed and append the entire haystack - // into it. - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - // The cut off data is guaranteed not to contain the needle. - this.emit('info', false, this._lookbehind, 0, bytesToCutOff); - } - - this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, - this._lookbehind_size - bytesToCutOff); - this._lookbehind_size -= bytesToCutOff; - - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - - this._bufpos = len; - return len + if (upgrade && typeof upgrade !== 'string') { + throw new InvalidArgumentError('upgrade must be a string') } - } - - pos += (pos >= 0) * this._bufpos; - - // Lookbehind buffer is now empty. We only need to check if the - // needle is in the haystack. - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { this.emit('info', true, data, this._bufpos, pos); } else { this.emit('info', true); } - return (this._bufpos = pos + needleLength) - } else { - pos = len - needleLength; - } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('invalid headersTimeout') + } - // There was no match. If there's trailing haystack data that we cannot - // match yet using the Boyer-Moore-Horspool algorithm (because the trailing - // data is less than the needle size) then match using a modified - // algorithm that starts matching from the beginning instead of the end. - // Whatever trailing data is left after running this algorithm is added to - // the lookbehind buffer. - while ( - pos < len && - ( - data[pos] !== needle[0] || - ( - (Buffer.compare( - data.subarray(pos, pos + len - pos), - needle.subarray(0, len - pos) - ) !== 0) - ) - ) - ) { - ++pos; - } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; - } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('invalid bodyTimeout') + } - // Everything until pos is guaranteed not to contain needle data. - if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len); } + if (reset != null && typeof reset !== 'boolean') { + throw new InvalidArgumentError('invalid reset') + } - this._bufpos = len; - return len - }; + if (expectContinue != null && typeof expectContinue !== 'boolean') { + throw new InvalidArgumentError('invalid expectContinue') + } - SBMH.prototype._sbmh_lookup_char = function (data, pos) { - return (pos < 0) - ? this._lookbehind[this._lookbehind_size + pos] - : data[pos] - }; + this.headersTimeout = headersTimeout; - SBMH.prototype._sbmh_memcmp = function (data, pos, len) { - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false } - } - return true - }; + this.bodyTimeout = bodyTimeout; - sbmh = SBMH; - return sbmh; -} + this.throwOnError = throwOnError === true; -var PartStream_1; -var hasRequiredPartStream; + this.method = method; -function requirePartStream () { - if (hasRequiredPartStream) return PartStream_1; - hasRequiredPartStream = 1; + this.abort = null; - const inherits = require$$1$5.inherits; - const ReadableStream = require$$0$b.Readable; + if (body == null) { + this.body = null; + } else if (isStream(body)) { + this.body = body; - function PartStream (opts) { - ReadableStream.call(this, opts); - } - inherits(PartStream, ReadableStream); + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy () { + destroy(this); + }; + this.body.on('end', this.endHandler); + } - PartStream.prototype._read = function (n) {}; + this.errorHandler = err => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on('error', this.errorHandler); + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === 'string') { + this.body = body.length ? Buffer.from(body) : null; + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + } - PartStream_1 = PartStream; - return PartStream_1; -} + this.completed = false; -var getLimit; -var hasRequiredGetLimit; + this.aborted = false; -function requireGetLimit () { - if (hasRequiredGetLimit) return getLimit; - hasRequiredGetLimit = 1; + this.upgrade = upgrade || null; - getLimit = function getLimit (limits, name, defaultLimit) { - if ( - !limits || - limits[name] === undefined || - limits[name] === null - ) { return defaultLimit } + this.path = query ? buildURL(path, query) : path; - if ( - typeof limits[name] !== 'number' || - isNaN(limits[name]) - ) { throw new TypeError('Limit ' + name + ' is not a valid number') } + this.origin = origin; - return limits[name] - }; - return getLimit; -} + this.idempotent = idempotent == null + ? method === 'HEAD' || method === 'GET' + : idempotent; -var HeaderParser_1; -var hasRequiredHeaderParser; + this.blocking = blocking == null ? false : blocking; -function requireHeaderParser () { - if (hasRequiredHeaderParser) return HeaderParser_1; - hasRequiredHeaderParser = 1; + this.reset = reset == null ? null : reset; - const EventEmitter = require$$0$a.EventEmitter; - const inherits = require$$1$5.inherits; - const getLimit = requireGetLimit(); + this.host = null; - const StreamSearch = requireSbmh(); + this.contentLength = null; - const B_DCRLF = Buffer.from('\r\n\r\n'); - const RE_CRLF = /\r\n/g; - const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; // eslint-disable-line no-control-regex + this.contentType = null; - function HeaderParser (cfg) { - EventEmitter.call(this); + this.headers = []; - cfg = cfg || {}; - const self = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000); - this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024); - this.buffer = ''; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on('info', function (isMatch, data, start, end) { - if (data && !self.maxed) { - if (self.nread + end - start >= self.maxHeaderSize) { - end = self.maxHeaderSize - self.nread + start; - self.nread = self.maxHeaderSize; - self.maxed = true; - } else { self.nread += (end - start); } + // Only for H2 + this.expectContinue = expectContinue != null ? expectContinue : false; - self.buffer += data.toString('binary', start, end); + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === 'object') { + if (headers[Symbol.iterator]) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError('headers must be in key-value pair format') + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]); + } + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') } - if (isMatch) { self._finish(); } - }); - } - inherits(HeaderParser, EventEmitter); - - HeaderParser.prototype.push = function (data) { - const r = this.ss.push(data); - if (this.finished) { return r } - }; - HeaderParser.prototype.reset = function () { - this.finished = false; - this.buffer = ''; - this.header = {}; - this.ss.reset(); - }; + validateHandler(handler, method, upgrade); - HeaderParser.prototype._finish = function () { - if (this.buffer) { this._parseHeader(); } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ''; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit('header', header); - }; + this.servername = servername || getServerName(this.host); - HeaderParser.prototype._parseHeader = function () { - if (this.npairs === this.maxHeaderPairs) { return } + this[kHandler] = handler; - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } + } - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - if (lines[i].length === 0) { continue } - if (lines[i][0] === '\t' || lines[i][0] === ' ') { - // folded header content - // RFC2822 says to just remove the CRLF and not the whitespace following - // it, so we follow the RFC and include the leading whitespace ... - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue + onBodySent (chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk) + } catch (err) { + this.abort(err); } } + } - const posColon = lines[i].indexOf(':'); - if ( - posColon === -1 || - posColon === 0 - ) { - return + onRequestSent () { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent() + } catch (err) { + this.abort(err); + } } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push((m[2] || '')); - if (++this.npairs === this.maxHeaderPairs) { break } } - }; - HeaderParser_1 = HeaderParser; - return HeaderParser_1; -} + onConnect (abort) { + assert(!this.aborted); + assert(!this.completed); -var Dicer_1; -var hasRequiredDicer; + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort) + } + } -function requireDicer () { - if (hasRequiredDicer) return Dicer_1; - hasRequiredDicer = 1; + onResponseStarted () { + return this[kHandler].onResponseStarted?.() + } - const WritableStream = require$$0$b.Writable; - const inherits = require$$1$5.inherits; + onHeaders (statusCode, headers, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); - const StreamSearch = requireSbmh(); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } - const PartStream = requirePartStream(); - const HeaderParser = requireHeaderParser(); + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + } catch (err) { + this.abort(err); + } + } - const DASH = 45; - const B_ONEDASH = Buffer.from('-'); - const B_CRLF = Buffer.from('\r\n'); - const EMPTY_FN = function () {}; + onData (chunk) { + assert(!this.aborted); + assert(!this.completed); - function Dicer (cfg) { - if (!(this instanceof Dicer)) { return new Dicer(cfg) } - WritableStream.call(this, cfg); + try { + return this[kHandler].onData(chunk) + } catch (err) { + this.abort(err); + return false + } + } - if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') } + onUpgrade (statusCode, headers, socket) { + assert(!this.aborted); + assert(!this.completed); - if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary); } else { this._bparser = undefined; } + return this[kHandler].onUpgrade(statusCode, headers, socket) + } - this._headerFirst = cfg.headerFirst; + onComplete (trailers) { + this.onFinally(); - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = undefined; - this._cb = undefined; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; + assert(!this.aborted); - const self = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on('header', function (header) { - self._inHeader = false; - self._part.emit('header', header); - }); - } - inherits(Dicer, WritableStream); - - Dicer.prototype.emit = function (ev) { - if (ev === 'finish' && !this._realFinish) { - if (!this._finished) { - const self = this; - process.nextTick(function () { - self.emit('error', new Error('Unexpected end of multipart data')); - if (self._part && !self._ignoreData) { - const type = (self._isPreamble ? 'Preamble' : 'Part'); - self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data')); - self._part.push(null); - process.nextTick(function () { - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - }); - return - } - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - }); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); } - } else { WritableStream.prototype.emit.apply(this, arguments); } - }; - Dicer.prototype._write = function (data, encoding, cb) { - // ignore unexpected data (e.g. extra trailer data after finished) - if (!this._hparser && !this._bparser) { return cb() } - - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part); } else { this._ignore(); } + try { + return this[kHandler].onComplete(trailers) + } catch (err) { + // TODO (fix): This might be a bad idea? + this.onError(err); } - const r = this._hparser.push(data); - if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r); } else { return cb() } } - // allows for "easier" testing - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; - } - - this._bparser.push(data); + onError (error) { + this.onFinally(); - if (this._pause) { this._cb = cb; } else { cb(); } - }; - - Dicer.prototype.reset = function () { - this._part = undefined; - this._bparser = undefined; - this._hparser = undefined; - }; + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); + } - Dicer.prototype.setBoundary = function (boundary) { - const self = this; - this._bparser = new StreamSearch('\r\n--' + boundary); - this._bparser.on('info', function (isMatch, data, start, end) { - self._oninfo(isMatch, data, start, end); - }); - }; + if (this.aborted) { + return + } + this.aborted = true; - Dicer.prototype._ignore = function () { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on('error', EMPTY_FN); - // we must perform some kind of read on the stream even though we are - // ignoring the data, otherwise node's Readable stream will not emit 'end' - // after pushing null to the stream - this._part.resume(); + return this[kHandler].onError(error) } - }; - Dicer.prototype._oninfo = function (isMatch, data, start, end) { - let buf; const self = this; let i = 0; let r; let shouldWriteMore = true; - - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && (start + i) < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; - } else { - if (this._dashes) { buf = B_ONEDASH; } - this._dashes = 0; - break - } - } - if (this._dashes === 2) { - if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)); } - this.reset(); - this._finished = true; - // no more parts will be added - if (self._parts === 0) { - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - } + onFinally () { + if (this.errorHandler) { + this.body.off('error', this.errorHandler); + this.errorHandler = null; } - if (this._dashes) { return } - } - if (this._justMatched) { this._justMatched = false; } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function (n) { - self._unpause(); - }; - if (this._isPreamble && this.listenerCount('preamble') !== 0) { - this.emit('preamble', this._part); - } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) { - this.emit('part', this._part); - } else { - this._ignore(); - } - if (!this._isPreamble) { this._inHeader = true; } - } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { shouldWriteMore = this._part.push(buf); } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { this._pause = true; } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { this._hparser.push(buf); } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end); } - } - } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { this._isPreamble = false; } else { - if (start !== end) { - ++this._parts; - this._part.on('end', function () { - if (--self._parts === 0) { - if (self._finished) { - self._realFinish = true; - self.emit('finish'); - self._realFinish = false; - } else { - self._unpause(); - } - } - }); - } + + if (this.endHandler) { + this.body.off('end', this.endHandler); + this.endHandler = null; } - this._part.push(null); - this._part = undefined; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; } - }; - Dicer.prototype._unpause = function () { - if (!this._pause) { return } - - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = undefined; - cb(); + addHeader (key, value) { + processHeader(this, key, value); + return this } - }; - - Dicer_1 = Dicer; - return Dicer_1; -} - -var decodeText_1; -var hasRequiredDecodeText; + } -function requireDecodeText () { - if (hasRequiredDecodeText) return decodeText_1; - hasRequiredDecodeText = 1; + function processHeader (request, key, val) { + if (val && (typeof val === 'object' && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`) + } else if (val === undefined) { + return + } - // Node has always utf-8 - const utf8Decoder = new TextDecoder('utf-8'); - const textDecoders = new Map([ - ['utf-8', utf8Decoder], - ['utf8', utf8Decoder] - ]); + let headerName = headerNameLowerCasedRecord[key]; - function getDecoder (charset) { - let lc; - while (true) { - switch (charset) { - case 'utf-8': - case 'utf8': - return decoders.utf8 - case 'latin1': - case 'ascii': // TODO: Make these a separate, strict decoder? - case 'us-ascii': - case 'iso-8859-1': - case 'iso8859-1': - case 'iso88591': - case 'iso_8859-1': - case 'windows-1252': - case 'iso_8859-1:1987': - case 'cp1252': - case 'x-cp1252': - return decoders.latin1 - case 'utf16le': - case 'utf-16le': - case 'ucs2': - case 'ucs-2': - return decoders.utf16le - case 'base64': - return decoders.base64 - default: - if (lc === undefined) { - lc = true; - charset = charset.toLowerCase(); - continue - } - return decoders.other.bind(charset) + if (headerName === undefined) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError('invalid header key') } } - } - const decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return '' + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === 'string') { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(''); + } else if (typeof val[i] === 'object') { + throw new InvalidArgumentError(`invalid ${key} header`) + } else { + arr.push(`${val[i]}`); + } } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); + val = arr; + } else if (typeof val === 'string') { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`) } - return data.utf8Slice(0, data.length) - }, + } else if (val === null) { + val = ''; + } else { + val = `${val}`; + } - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return '' - } - if (typeof data === 'string') { - return data + if (request.host === null && headerName === 'host') { + if (typeof val !== 'string') { + throw new InvalidArgumentError('invalid host header') } - return data.latin1Slice(0, data.length) - }, - - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return '' + // Consumed by Client + request.host = val; + } else if (request.contentLength === null && headerName === 'content-length') { + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError('invalid content-length header') } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); + } else if (request.contentType === null && headerName === 'content-type') { + request.contentType = val; + request.headers.push(key, val); + } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') { + throw new InvalidArgumentError(`invalid ${headerName} header`) + } else if (headerName === 'connection') { + const value = typeof val === 'string' ? val.toLowerCase() : null; + if (value !== 'close' && value !== 'keep-alive') { + throw new InvalidArgumentError('invalid connection header') } - return data.ucs2Slice(0, data.length) - }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return '' - } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); + if (value === 'close') { + request.reset = true; } - return data.base64Slice(0, data.length) - }, + } else if (headerName === 'expect') { + throw new NotSupportedError('expect header not supported') + } else { + request.headers.push(key, val); + } + } - other: (data, sourceEncoding) => { - if (data.length === 0) { - return '' - } - if (typeof data === 'string') { - data = Buffer.from(data, sourceEncoding); - } + request$4 = Request; + return request$4; +} - if (textDecoders.has(this.toString())) { - try { - return textDecoders.get(this).decode(data) - } catch {} - } - return typeof data === 'string' - ? data - : data.toString() - } - }; - - function decodeText (text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding) - } - return text - } - - decodeText_1 = decodeText; - return decodeText_1; -} - -/* eslint-disable object-property-newline */ - -var parseParams_1; -var hasRequiredParseParams; - -function requireParseParams () { - if (hasRequiredParseParams) return parseParams_1; - hasRequiredParseParams = 1; - - const decodeText = requireDecodeText(); - - const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - - const EncodedLookup = { - '%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04', - '%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09', - '%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c', - '%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e', - '%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12', - '%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17', - '%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b', - '%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d', - '%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20', - '%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25', - '%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a', - '%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c', - '%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f', - '%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33', - '%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38', - '%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b', - '%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e', - '%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41', - '%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46', - '%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a', - '%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d', - '%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f', - '%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54', - '%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59', - '%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c', - '%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e', - '%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62', - '%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67', - '%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b', - '%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d', - '%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70', - '%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75', - '%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a', - '%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c', - '%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f', - '%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83', - '%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88', - '%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b', - '%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e', - '%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91', - '%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96', - '%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a', - '%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d', - '%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f', - '%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2', - '%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4', - '%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7', - '%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9', - '%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab', - '%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac', - '%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad', - '%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae', - '%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0', - '%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2', - '%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5', - '%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7', - '%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba', - '%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb', - '%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc', - '%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd', - '%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf', - '%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0', - '%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3', - '%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5', - '%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8', - '%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca', - '%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb', - '%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc', - '%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce', - '%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf', - '%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1', - '%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3', - '%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6', - '%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8', - '%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda', - '%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb', - '%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd', - '%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde', - '%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf', - '%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1', - '%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4', - '%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6', - '%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9', - '%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea', - '%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec', - '%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed', - '%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee', - '%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef', - '%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2', - '%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4', - '%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7', - '%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9', - '%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb', - '%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc', - '%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd', - '%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe', - '%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff' - }; - - function encodedReplacer (match) { - return EncodedLookup[match] - } - - const STATE_KEY = 0; - const STATE_VALUE = 1; - const STATE_CHARSET = 2; - const STATE_LANG = 3; - - function parseParams (str) { - const res = []; - let state = STATE_KEY; - let charset = ''; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ''; - const len = str.length; - - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - const char = str[i]; - if (char === '\\' && inquote) { - if (escaping) { escaping = false; } else { - escaping = true; - continue - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { inquote = true; } - continue - } else { escaping = false; } - } else { - if (escaping && inquote) { tmp += '\\'; } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { state = STATE_VALUE; } - tmp = ''; - continue - } else if (state === STATE_KEY && - (char === '*' || char === '=') && - res.length) { - state = char === '*' - ? STATE_CHARSET - : STATE_VALUE; - res[p] = [tmp, undefined]; - tmp = ''; - continue - } else if (!inquote && char === ';') { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), - 'binary', - charset); - } - charset = ''; - } else if (tmp.length) { - tmp = decodeText(tmp, 'binary', 'utf8'); - } - if (res[p] === undefined) { res[p] = tmp; } else { res[p][1] = tmp; } - tmp = ''; - ++p; - continue - } else if (!inquote && (char === ' ' || char === '\t')) { continue } - } - tmp += char; +var dispatcher$1; +var hasRequiredDispatcher$1; + +function requireDispatcher$1 () { + if (hasRequiredDispatcher$1) return dispatcher$1; + hasRequiredDispatcher$1 = 1; + const EventEmitter = require$$8; + + class Dispatcher extends EventEmitter { + dispatch () { + throw new Error('not implemented') } - if (charset && tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), - 'binary', - charset); - } else if (tmp) { - tmp = decodeText(tmp, 'binary', 'utf8'); + + close () { + throw new Error('not implemented') } - if (res[p] === undefined) { - if (tmp) { res[p] = tmp; } - } else { res[p][1] = tmp; } + destroy () { + throw new Error('not implemented') + } - return res - } + compose (...args) { + // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ... + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); - parseParams_1 = parseParams; - return parseParams_1; -} + for (const interceptor of interceptors) { + if (interceptor == null) { + continue + } -var basename; -var hasRequiredBasename; + if (typeof interceptor !== 'function') { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`) + } -function requireBasename () { - if (hasRequiredBasename) return basename; - hasRequiredBasename = 1; + dispatch = interceptor(dispatch); - basename = function basename (path) { - if (typeof path !== 'string') { return '' } - for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var - switch (path.charCodeAt(i)) { - case 0x2F: // '/' - case 0x5C: // '\' - path = path.slice(i + 1); - return (path === '..' || path === '.' ? '' : path) + if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) { + throw new TypeError('invalid interceptor') + } } + + return new ComposedDispatcher(this, dispatch) } - return (path === '..' || path === '.' ? '' : path) - }; - return basename; -} + } -var multipart$1; -var hasRequiredMultipart$1; + class ComposedDispatcher extends Dispatcher { + #dispatcher = null + #dispatch = null -function requireMultipart$1 () { - if (hasRequiredMultipart$1) return multipart$1; - hasRequiredMultipart$1 = 1; + constructor (dispatcher, dispatch) { + super(); + this.#dispatcher = dispatcher; + this.#dispatch = dispatch; + } - // TODO: - // * support 1 nested multipart level - // (see second multipart example here: - // http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data) - // * support limits.fieldNameSize - // -- this will require modifications to utils.parseParams + dispatch (...args) { + this.#dispatch(...args); + } - const { Readable } = require$$0$b; - const { inherits } = require$$1$5; + close (...args) { + return this.#dispatcher.close(...args) + } - const Dicer = requireDicer(); + destroy (...args) { + return this.#dispatcher.destroy(...args) + } + } - const parseParams = requireParseParams(); - const decodeText = requireDecodeText(); - const basename = requireBasename(); - const getLimit = requireGetLimit(); + dispatcher$1 = Dispatcher; + return dispatcher$1; +} - const RE_BOUNDARY = /^boundary$/i; - const RE_FIELD = /^form-data$/i; - const RE_CHARSET = /^charset$/i; - const RE_FILENAME = /^filename$/i; - const RE_NAME = /^name$/i; +var dispatcherBase$1; +var hasRequiredDispatcherBase$1; - Multipart.detect = /^multipart\/form-data/i; - function Multipart (boy, cfg) { - let i; - let len; - const self = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined)); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || 'utf8'; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; +function requireDispatcherBase$1 () { + if (hasRequiredDispatcherBase$1) return dispatcherBase$1; + hasRequiredDispatcherBase$1 = 1; - for (i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && - RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break - } + const Dispatcher = requireDispatcher$1(); + const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = requireErrors$2(); + const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = requireSymbols$9(); + + const kOnDestroyed = Symbol('onDestroyed'); + const kOnClosed = Symbol('onClosed'); + const kInterceptedDispatch = Symbol('Intercepted Dispatch'); + + class DispatcherBase extends Dispatcher { + constructor () { + super(); + + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; } - function checkFinished () { - if (nends === 0 && finished && !boy._done) { - finished = false; - self.end(); - } + get destroyed () { + return this[kDestroyed] } - if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') } + get closed () { + return this[kClosed] + } - const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024); - const fileSizeLimit = getLimit(limits, 'fileSize', Infinity); - const filesLimit = getLimit(limits, 'files', Infinity); - const fieldsLimit = getLimit(limits, 'fields', Infinity); - const partsLimit = getLimit(limits, 'parts', Infinity); - const headerPairsLimit = getLimit(limits, 'headerPairs', 2000); - const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024); + get interceptors () { + return this[kInterceptors] + } - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; + set interceptors (newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== 'function') { + throw new InvalidArgumentError('interceptor must be an function') + } + } + } - this._needDrain = false; - this._pause = false; - this._cb = undefined; - this._nparts = 0; - this._boy = boy; - - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; + this[kInterceptors] = newInterceptors; + } - this.parser = new Dicer(parserCfg); - this.parser.on('drain', function () { - self._needDrain = false; - if (self._cb && !self._pause) { - const cb = self._cb; - self._cb = undefined; - cb(); + close (callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data) + }); + }) } - }).on('part', function onPart (part) { - if (++self._nparts > partsLimit) { - self.parser.removeListener('part', onPart); - self.parser.on('part', skipPart); - boy.hitPartsLimit = true; - boy.emit('partsLimit'); - return skipPart(part) - } - - // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let - // us emit 'end' early since we know the part has ended if we are already - // seeing the next part - if (curField) { - const field = curField; - field.emit('end'); - field.removeAllListeners('end'); - } - - part.on('header', function (header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding; - let filename; - let nsize = 0; - - if (header['content-type']) { - parsed = parseParams(header['content-type'][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break - } - } - } - } - if (contype === undefined) { contype = 'text/plain'; } - if (charset === undefined) { charset = defCharset; } + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - if (header['content-disposition']) { - parsed = parseParams(header['content-disposition'][0]); - if (!RE_FIELD.test(parsed[0])) { return skipPart(part) } - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { filename = basename(filename); } - } - } - } else { return skipPart(part) } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return + } - if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase(); } else { encoding = '7bit'; } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return + } - let onData, - onEnd; + this[kClosed] = true; + this[kOnClosed].push(callback); - if (isPartAFile(fieldname, contype, filename)) { - // file/binary field - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit('filesLimit'); - } - return skipPart(part) - } + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; - ++nfiles; + // Should not error. + this[kClose]() + .then(() => this.destroy()) + .then(() => { + queueMicrotask(onClosed); + }); + } - if (boy.listenerCount('file') === 0) { - self.parser._ignore(); - return - } + destroy (err, callback) { + if (typeof err === 'function') { + callback = err; + err = null; + } - ++nends; - const file = new FileStream(fileOpts); - curFile = file; - file.on('end', function () { - --nends; - self._pause = false; - checkFinished(); - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err, data) => { + return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) }); - file._read = function (n) { - if (!self._pause) { return } - self._pause = false; - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }; - boy.emit('file', fieldname, file, filename, encoding, contype); - - onData = function (data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { file.push(data.slice(0, extralen)); } - file.truncated = true; - file.bytesRead = fileSizeLimit; - part.removeAllListeners('data'); - file.emit('limit'); - return - } else if (!file.push(data)) { self._pause = true; } + }) + } - file.bytesRead = nsize; - }; + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - onEnd = function () { - curFile = undefined; - file.push(null); - }; + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); } else { - // non-file field - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit('fieldsLimit'); - } - return skipPart(part) - } - - ++nfields; - ++nends; - let buffer = ''; - let truncated = false; - curField = part; - - onData = function (data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = (fieldSizeLimit - (nsize - data.length)); - buffer += data.toString('binary', 0, extralen); - truncated = true; - part.removeAllListeners('data'); - } else { buffer += data.toString('binary'); } - }; - - onEnd = function () { - curField = undefined; - if (buffer.length) { buffer = decodeText(buffer, 'binary', charset); } - boy.emit('field', fieldname, buffer, false, truncated, encoding, contype); - --nends; - checkFinished(); - }; + queueMicrotask(() => callback(null, null)); } + return + } - /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become - broken. Streams2/streams3 is a huge black box of confusion, but - somehow overriding the sync state seems to fix things again (and still - seems to work for previous node versions). - */ - part._readableState.sync = false; + if (!err) { + err = new ClientDestroyedError(); + } - part.on('data', onData); - part.on('end', onEnd); - }).on('error', function (err) { - if (curFile) { curFile.emit('error', err); } - }); - }).on('error', function (err) { - boy.emit('error', err); - }).on('finish', function () { - finished = true; - checkFinished(); - }); - } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); - Multipart.prototype.write = function (chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + + // Should not error. + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); } - }; - Multipart.prototype.end = function () { - const self = this; + [kInterceptedDispatch] (opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler) + } - if (self.parser.writable) { - self.parser.end(); - } else if (!self._boy._done) { - process.nextTick(function () { - self._boy._done = true; - self._boy.emit('finish'); - }); + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler) } - }; - function skipPart (part) { - part.resume(); - } + dispatch (opts, handler) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } + + try { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object.') + } - function FileStream (opts) { - Readable.call(this, opts); + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError() + } - this.bytesRead = 0; + if (this[kClosed]) { + throw new ClientClosedError() + } - this.truncated = false; - } + return this[kInterceptedDispatch](opts, handler) + } catch (err) { + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } - inherits(FileStream, Readable); + handler.onError(err); - FileStream.prototype._read = function (n) {}; + return false + } + } + } - multipart$1 = Multipart; - return multipart$1; + dispatcherBase$1 = DispatcherBase; + return dispatcherBase$1; } -var Decoder_1; -var hasRequiredDecoder; +var timers$1; +var hasRequiredTimers$1; -function requireDecoder () { - if (hasRequiredDecoder) return Decoder_1; - hasRequiredDecoder = 1; +function requireTimers$1 () { + if (hasRequiredTimers$1) return timers$1; + hasRequiredTimers$1 = 1; - const RE_PLUS = /\+/g; + /** + * This module offers an optimized timer implementation designed for scenarios + * where high precision is not critical. + * + * The timer achieves faster performance by using a low-resolution approach, + * with an accuracy target of within 500ms. This makes it particularly useful + * for timers with delays of 1 second or more, where exact timing is less + * crucial. + * + * It's important to note that Node.js timers are inherently imprecise, as + * delays can occur due to the event loop being blocked by other operations. + * Consequently, timers may trigger later than their scheduled time. + */ - const HEX = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ]; + /** + * The fastNow variable contains the internal fast timer clock value. + * + * @type {number} + */ + let fastNow = 0; - function Decoder () { - this.buffer = undefined; - } - Decoder.prototype.write = function (str) { - // Replace '+' with ' ' before decoding - str = str.replace(RE_PLUS, ' '); - let res = ''; - let i = 0; let p = 0; const len = str.length; - for (; i < len; ++i) { - if (this.buffer !== undefined) { - if (!HEX[str.charCodeAt(i)]) { - res += '%' + this.buffer; - this.buffer = undefined; - --i; // retry character - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = undefined; - } - } - } else if (str[i] === '%') { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ''; - ++p; - } - } - if (p < len && this.buffer === undefined) { res += str.substring(p); } - return res - }; - Decoder.prototype.reset = function () { - this.buffer = undefined; - }; + /** + * RESOLUTION_MS represents the target resolution time in milliseconds. + * + * @type {number} + * @default 1000 + */ + const RESOLUTION_MS = 1e3; - Decoder_1 = Decoder; - return Decoder_1; -} + /** + * TICK_MS defines the desired interval in milliseconds between each tick. + * The target value is set to half the resolution time, minus 1 ms, to account + * for potential event loop overhead. + * + * @type {number} + * @default 499 + */ + const TICK_MS = (RESOLUTION_MS >> 1) - 1; + + /** + * fastNowTimeout is a Node.js timer used to manage and process + * the FastTimers stored in the `fastTimers` array. + * + * @type {NodeJS.Timeout} + */ + let fastNowTimeout; -var urlencoded; -var hasRequiredUrlencoded; + /** + * The kFastTimer symbol is used to identify FastTimer instances. + * + * @type {Symbol} + */ + const kFastTimer = Symbol('kFastTimer'); -function requireUrlencoded () { - if (hasRequiredUrlencoded) return urlencoded; - hasRequiredUrlencoded = 1; + /** + * The fastTimers array contains all active FastTimers. + * + * @type {FastTimer[]} + */ + const fastTimers = []; - const Decoder = requireDecoder(); - const decodeText = requireDecodeText(); - const getLimit = requireGetLimit(); + /** + * These constants represent the various states of a FastTimer. + */ - const RE_CHARSET = /^charset$/i; + /** + * The `NOT_IN_LIST` constant indicates that the FastTimer is not included + * in the `fastTimers` array. Timers with this status will not be processed + * during the next tick by the `onTick` function. + * + * A FastTimer can be re-added to the `fastTimers` array by invoking the + * `refresh` method on the FastTimer instance. + * + * @type {-2} + */ + const NOT_IN_LIST = -2; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded (boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; + /** + * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled + * for removal from the `fastTimers` array. A FastTimer in this state will + * be removed in the next tick by the `onTick` function and will no longer + * be processed. + * + * This status is also set when the `clear` method is called on the FastTimer instance. + * + * @type {-1} + */ + const TO_BE_CLEARED = -1; - this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100); - this.fieldsLimit = getLimit(limits, 'fields', Infinity); + /** + * The `PENDING` constant signifies that the FastTimer is awaiting processing + * in the next tick by the `onTick` function. Timers with this status will have + * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick. + * + * @type {0} + */ + const PENDING = 0; - let charset; - for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var - if (Array.isArray(parsedConType[i]) && - RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break - } - } + /** + * The `ACTIVE` constant indicates that the FastTimer is active and waiting + * for its timer to expire. During the next tick, the `onTick` function will + * check if the timer has expired, and if so, it will execute the associated callback. + * + * @type {1} + */ + const ACTIVE = 1; - if (charset === undefined) { charset = cfg.defCharset || 'utf8'; } + /** + * The onTick function processes the fastTimers array. + * + * @returns {void} + */ + function onTick () { + /** + * Increment the fastNow value by the TICK_MS value, despite the actual time + * that has passed since the last tick. This approach ensures independence + * from the system clock and delays caused by a blocked event loop. + * + * @type {number} + */ + fastNow += TICK_MS; - this.decoder = new Decoder(); - this.charset = charset; - this._fields = 0; - this._state = 'key'; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ''; - this._val = ''; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } + /** + * The `idx` variable is used to iterate over the `fastTimers` array. + * Expired timers are removed by replacing them with the last element in the array. + * Consequently, `idx` is only incremented when the current element is not removed. + * + * @type {number} + */ + let idx = 0; + + /** + * The len variable will contain the length of the fastTimers array + * and will be decremented when a FastTimer should be removed from the + * fastTimers array. + * + * @type {number} + */ + let len = fastTimers.length; + + while (idx < len) { + /** + * @type {FastTimer} + */ + const timer = fastTimers[idx]; - UrlEncoded.prototype.write = function (data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit('fieldsLimit'); + // If the timer is in the ACTIVE state and the timer has expired, it will + // be processed in the next tick. + if (timer._state === PENDING) { + // Set the _idleStart value to the fastNow value minus the TICK_MS value + // to account for the time the timer was in the PENDING state. + timer._idleStart = fastNow - TICK_MS; + timer._state = ACTIVE; + } else if ( + timer._state === ACTIVE && + fastNow >= timer._idleStart + timer._idleTimeout + ) { + timer._state = TO_BE_CLEARED; + timer._idleStart = -1; + timer._onTimeout(timer._timerArg); } - return cb() - } - let idxeq; let idxamp; let i; let p = 0; const len = data.length; + if (timer._state === TO_BE_CLEARED) { + timer._state = NOT_IN_LIST; - while (p < len) { - if (this._state === 'key') { - idxeq = idxamp = undefined; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { ++p; } - if (data[i] === 0x3D/* = */) { - idxeq = i; - break - } else if (data[i] === 0x26/* & */) { - idxamp = i; - break - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; - break - } else if (this._checkingBytes) { ++this._bytesKey; } - } - - if (idxeq !== undefined) { - // key with assignment - if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)); } - this._state = 'val'; - - this._hitLimit = false; - this._checkingBytes = true; - this._val = ''; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - - p = idxeq + 1; - } else if (idxamp !== undefined) { - // key with no assignment - ++this._fields; - let key; const keyTrunc = this._keyTrunc; - if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))); } else { key = this._key; } - - this._hitLimit = false; - this._checkingBytes = true; - this._key = ''; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - - if (key.length) { - this.boy.emit('field', decodeText(key, 'binary', this.charset), - '', - keyTrunc, - false); - } - - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { return cb() } - } else if (this._hitLimit) { - // we may not have hit the actual limit if there are encoded bytes... - if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)); } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - // yep, we actually did hit the limit - this._checkingBytes = false; - this._keyTrunc = true; - } - } else { - if (p < len) { this._key += this.decoder.write(data.toString('binary', p)); } - p = len; + // Move the last element to the current index and decrement len if it is + // not the only element in the array. + if (--len !== 0) { + fastTimers[idx] = fastTimers[len]; } } else { - idxamp = undefined; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { ++p; } - if (data[i] === 0x26/* & */) { - idxamp = i; - break - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break - } else if (this._checkingBytes) { ++this._bytesVal; } - } - - if (idxamp !== undefined) { - ++this._fields; - if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)); } - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - decodeText(this._val, 'binary', this.charset), - this._keyTrunc, - this._valTrunc); - this._state = 'key'; - - this._hitLimit = false; - this._checkingBytes = true; - this._key = ''; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { return cb() } - } else if (this._hitLimit) { - // we may not have hit the actual limit if there are encoded bytes... - if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)); } - p = i; - if ((this._val === '' && this.fieldSizeLimit === 0) || - (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - // yep, we actually did hit the limit - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { this._val += this.decoder.write(data.toString('binary', p)); } - p = len; - } + ++idx; } } - cb(); - }; - UrlEncoded.prototype.end = function () { - if (this.boy._done) { return } + // Set the length of the fastTimers array to the new length and thus + // removing the excess FastTimers elements from the array. + fastTimers.length = len; - if (this._state === 'key' && this._key.length > 0) { - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - '', - this._keyTrunc, - false); - } else if (this._state === 'val') { - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - decodeText(this._val, 'binary', this.charset), - this._keyTrunc, - this._valTrunc); + // If there are still active FastTimers in the array, refresh the Timer. + // If there are no active FastTimers, the timer will be refreshed again + // when a new FastTimer is instantiated. + if (fastTimers.length !== 0) { + refreshTimeout(); } - this.boy._done = true; - this.boy.emit('finish'); - }; - - urlencoded = UrlEncoded; - return urlencoded; -} + } -var hasRequiredMain; + function refreshTimeout () { + // If the fastNowTimeout is already set, refresh it. + if (fastNowTimeout) { + fastNowTimeout.refresh(); + // fastNowTimeout is not instantiated yet, create a new Timer. + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTick, TICK_MS); -function requireMain () { - if (hasRequiredMain) return main.exports; - hasRequiredMain = 1; + // If the Timer has an unref method, call it to allow the process to exit if + // there are no other active handles. + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } + } + } - const WritableStream = require$$0$b.Writable; - const { inherits } = require$$1$5; - const Dicer = requireDicer(); + /** + * The `FastTimer` class is a data structure designed to store and manage + * timer information. + */ + class FastTimer { + [kFastTimer] = true - const MultipartParser = requireMultipart$1(); - const UrlencodedParser = requireUrlencoded(); - const parseParams = requireParseParams(); + /** + * The state of the timer, which can be one of the following: + * - NOT_IN_LIST (-2) + * - TO_BE_CLEARED (-1) + * - PENDING (0) + * - ACTIVE (1) + * + * @type {-2|-1|0|1} + * @private + */ + _state = NOT_IN_LIST - function Busboy (opts) { - if (!(this instanceof Busboy)) { return new Busboy(opts) } + /** + * The number of milliseconds to wait before calling the callback. + * + * @type {number} + * @private + */ + _idleTimeout = -1 - if (typeof opts !== 'object') { - throw new TypeError('Busboy expected an options-Object.') - } - if (typeof opts.headers !== 'object') { - throw new TypeError('Busboy expected an options-Object with headers-attribute.') - } - if (typeof opts.headers['content-type'] !== 'string') { - throw new TypeError('Missing Content-Type-header.') - } + /** + * The time in milliseconds when the timer was started. This value is used to + * calculate when the timer should expire. + * + * @type {number} + * @default -1 + * @private + */ + _idleStart = -1 - const { - headers, - ...streamOptions - } = opts; + /** + * The function to be executed when the timer expires. + * @type {Function} + * @private + */ + _onTimeout - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); + /** + * The argument to be passed to the callback when the timer expires. + * + * @type {*} + * @private + */ + _timerArg - this._done = false; - this._parser = this.getParserByHeaders(headers); - this._finished = false; - } - inherits(Busboy, WritableStream); + /** + * @constructor + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should wait + * before the specified function or code is executed. + * @param {*} arg + */ + constructor (callback, delay, arg) { + this._onTimeout = callback; + this._idleTimeout = delay; + this._timerArg = arg; - Busboy.prototype.emit = function (ev) { - if (ev === 'finish') { - if (!this._done) { - this._parser?.end(); - return - } else if (this._finished) { - return - } - this._finished = true; + this.refresh(); } - WritableStream.prototype.emit.apply(this, arguments); - }; - Busboy.prototype.getParserByHeaders = function (headers) { - const parsed = parseParams(headers['content-type']); + /** + * Sets the timer's start time to the current time, and reschedules the timer + * to call its callback at the previously specified duration adjusted to the + * current time. + * Using this on a timer that has already called its callback will reactivate + * the timer. + * + * @returns {void} + */ + refresh () { + // In the special case that the timer is not in the list of active timers, + // add it back to the array to be processed in the next tick by the onTick + // function. + if (this._state === NOT_IN_LIST) { + fastTimers.push(this); + } - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; + // If the timer is the only active timer, refresh the fastNowTimeout for + // better resolution. + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg) + // Setting the state to PENDING will cause the timer to be reset in the + // next tick by the onTick function. + this._state = PENDING; } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg) + + /** + * The `clear` method cancels the timer, preventing it from executing. + * + * @returns {void} + * @private + */ + clear () { + // Set the state to TO_BE_CLEARED to mark the timer for removal in the next + // tick by the onTick function. + this._state = TO_BE_CLEARED; + + // Reset the _idleStart value to -1 to indicate that the timer is no longer + // active. + this._idleStart = -1; } - throw new Error('Unsupported Content-Type.') - }; + } - Busboy.prototype._write = function (chunk, encoding, cb) { - this._parser.write(chunk, cb); + /** + * This module exports a setTimeout and clearTimeout function that can be + * used as a drop-in replacement for the native functions. + */ + timers$1 = { + /** + * The setTimeout() method sets a timer which executes a function once the + * timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {NodeJS.Timeout|FastTimer} + */ + setTimeout (callback, delay, arg) { + // If the delay is less than or equal to the RESOLUTION_MS value return a + // native Node.js Timer instance. + return delay <= RESOLUTION_MS + ? setTimeout(callback, delay, arg) + : new FastTimer(callback, delay, arg) + }, + /** + * The clearTimeout method cancels an instantiated Timer previously created + * by calling setTimeout. + * + * @param {NodeJS.Timeout|FastTimer} timeout + */ + clearTimeout (timeout) { + // If the timeout is a FastTimer, call its own clear method. + if (timeout[kFastTimer]) { + /** + * @type {FastTimer} + */ + timeout.clear(); + // Otherwise it is an instance of a native NodeJS.Timeout, so call the + // Node.js native clearTimeout function. + } else { + clearTimeout(timeout); + } + }, + /** + * The setFastTimeout() method sets a fastTimer which executes a function once + * the timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {FastTimer} + */ + setFastTimeout (callback, delay, arg) { + return new FastTimer(callback, delay, arg) + }, + /** + * The clearTimeout method cancels an instantiated FastTimer previously + * created by calling setFastTimeout. + * + * @param {FastTimer} timeout + */ + clearFastTimeout (timeout) { + timeout.clear(); + }, + /** + * The now method returns the value of the internal fast timer clock. + * + * @returns {number} + */ + now () { + return fastNow + }, + /** + * Trigger the onTick function to process the fastTimers array. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + * @param {number} [delay=0] The delay in milliseconds to add to the now value. + */ + tick (delay = 0) { + fastNow += delay - RESOLUTION_MS + 1; + onTick(); + onTick(); + }, + /** + * Reset FastTimers. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + reset () { + fastNow = 0; + fastTimers.length = 0; + clearTimeout(fastNowTimeout); + fastNowTimeout = null; + }, + /** + * Exporting for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + kFastTimer }; + return timers$1; +} - main.exports = Busboy; - main.exports.default = Busboy; - main.exports.Busboy = Busboy; +var connect$1; +var hasRequiredConnect$1; - main.exports.Dicer = Dicer; - return main.exports; -} +function requireConnect$1 () { + if (hasRequiredConnect$1) return connect$1; + hasRequiredConnect$1 = 1; -var constants$a; -var hasRequiredConstants$a; + const net = require$$0$9; + const assert = require$$0$7; + const util = requireUtil$h(); + const { InvalidArgumentError, ConnectTimeoutError } = requireErrors$2(); + const timers = requireTimers$1(); -function requireConstants$a () { - if (hasRequiredConstants$a) return constants$a; - hasRequiredConstants$a = 1; + function noop () {} + + let tls; // include tls conditionally since it is not always available + + // TODO: session re-use does not wait for the first + // connection to resolve the session and might therefore + // resolve the same servername multiple times even when + // re-use is enabled. + + let SessionCache; + // FIXME: remove workaround when the Node bug is fixed + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (commonjsGlobal.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map(); + this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return + } + + const ref = this._sessionCache.get(key); + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key); + } + }); + } + + get (sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); + } + }; + } else { + SessionCache = class SimpleSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map(); + } + + get (sessionKey) { + return this._sessionCache.get(sessionKey) + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + if (this._sessionCache.size >= this._maxCachedSessions) { + // remove the oldest session + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + + this._sessionCache.set(sessionKey, session); + } + }; + } + + function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + } + + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 10e3 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === 'https:') { + if (!tls) { + tls = require$$5; + } + servername = servername || options.servername || util.getServerName(host) || null; + + const sessionKey = servername || hostname; + assert(sessionKey); + + const session = customSession || sessionCache.get(sessionKey) || null; + + port = port || 443; + + socket = tls.connect({ + highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], + socket: httpSocket, // upgrade socket connection + port, + host: hostname + }); + + socket + .on('session', function (session) { + // TODO (fix): Can a session become invalid once established? Don't think so? + sessionCache.set(sessionKey, session); + }); + } else { + assert(!httpSocket, 'httpSocket can only be sent on TLS update'); + + port = port || 80; + + socket = net.connect({ + highWaterMark: 64 * 1024, // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }); + } + + // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + + const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); + + socket + .setNoDelay(true) + .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { + queueMicrotask(clearConnectTimeout); + + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }) + .on('error', function (err) { + queueMicrotask(clearConnectTimeout); + + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + + return socket + } + } + + /** + * @param {WeakRef} socketWeakRef + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + * @returns {() => void} + */ + const setupConnectTimeout = process.platform === 'win32' + ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } + + let s1 = null; + let s2 = null; + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + // Windows needs an extra setImmediate probably due to implementation differences in the socket logic + s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + clearImmediate(s2); + } + } + : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } + + let s1 = null; + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + } + }; + + /** + * @param {net.Socket} socket + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + */ + function onConnectTimeout (socket, opts) { + // The socket could be already garbage collected + if (socket == null) { + return + } + + let message = 'Connect Timeout Error'; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`; + } else { + message += ` (attempted address: ${opts.hostname}:${opts.port},`; + } + + message += ` timeout: ${opts.timeout}ms)`; + + util.destroy(socket, new ConnectTimeoutError(message)); + } + + connect$1 = buildConnector; + return connect$1; +} + +var constants$f = {}; + +var utils$3 = {}; + +var hasRequiredUtils$3; + +function requireUtils$3 () { + if (hasRequiredUtils$3) return utils$3; + hasRequiredUtils$3 = 1; + Object.defineProperty(utils$3, "__esModule", { value: true }); + utils$3.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === 'number') { + res[key] = value; + } + }); + return res; + } + utils$3.enumToMap = enumToMap; + + return utils$3; +} + +var hasRequiredConstants$f; + +function requireConstants$f () { + if (hasRequiredConstants$f) return constants$f; + hasRequiredConstants$f = 1; + (function (exports$1) { + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; + const utils_1 = requireUtils$3(); + (function (ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; + })(exports$1.ERROR || (exports$1.ERROR = {})); + (function (TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; + })(exports$1.TYPE || (exports$1.TYPE = {})); + (function (FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + // 1 << 8 is unused + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(exports$1.FLAGS || (exports$1.FLAGS = {})); + (function (LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); + var METHODS; + (function (METHODS) { + METHODS[METHODS["DELETE"] = 0] = "DELETE"; + METHODS[METHODS["GET"] = 1] = "GET"; + METHODS[METHODS["HEAD"] = 2] = "HEAD"; + METHODS[METHODS["POST"] = 3] = "POST"; + METHODS[METHODS["PUT"] = 4] = "PUT"; + /* pathological */ + METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; + METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; + METHODS[METHODS["TRACE"] = 7] = "TRACE"; + /* WebDAV */ + METHODS[METHODS["COPY"] = 8] = "COPY"; + METHODS[METHODS["LOCK"] = 9] = "LOCK"; + METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; + METHODS[METHODS["MOVE"] = 11] = "MOVE"; + METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; + METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; + METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; + METHODS[METHODS["BIND"] = 16] = "BIND"; + METHODS[METHODS["REBIND"] = 17] = "REBIND"; + METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; + METHODS[METHODS["ACL"] = 19] = "ACL"; + /* subversion */ + METHODS[METHODS["REPORT"] = 20] = "REPORT"; + METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS[METHODS["MERGE"] = 23] = "MERGE"; + /* upnp */ + METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; + METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + /* RFC-5789 */ + METHODS[METHODS["PATCH"] = 28] = "PATCH"; + METHODS[METHODS["PURGE"] = 29] = "PURGE"; + /* CalDAV */ + METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; + /* RFC-2068, section 19.6.1.2 */ + METHODS[METHODS["LINK"] = 31] = "LINK"; + METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; + /* icecast */ + METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; + /* RFC-7540, section 11.6 */ + METHODS[METHODS["PRI"] = 34] = "PRI"; + /* RFC-2326 RTSP */ + METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS[METHODS["SETUP"] = 37] = "SETUP"; + METHODS[METHODS["PLAY"] = 38] = "PLAY"; + METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; + METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; + METHODS[METHODS["RECORD"] = 44] = "RECORD"; + /* RAOP */ + METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); + exports$1.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS['M-SEARCH'], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE, + ]; + exports$1.METHODS_ICE = [ + METHODS.SOURCE, + ]; + exports$1.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST, + ]; + exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); + exports$1.H_METHOD_MAP = {}; + Object.keys(exports$1.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; + } + }); + (function (FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; + })(exports$1.FINISH || (exports$1.FINISH = {})); + exports$1.ALPHA = []; + for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { + // Upper case + exports$1.ALPHA.push(String.fromCharCode(i)); + // Lower case + exports$1.ALPHA.push(String.fromCharCode(i + 0x20)); + } + exports$1.NUM_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + }; + exports$1.HEX_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, + a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, + }; + exports$1.NUM = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + ]; + exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); + exports$1.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; + exports$1.USERINFO_CHARS = exports$1.ALPHANUM + .concat(exports$1.MARK) + .concat(['%', ';', ':', '&', '=', '+', '$', ',']); + // TODO(indutny): use RFC + exports$1.STRICT_URL_CHAR = [ + '!', '"', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + ':', ';', '<', '=', '>', + '@', '[', '\\', ']', '^', '_', + '`', + '{', '|', '}', '~', + ].concat(exports$1.ALPHANUM); + exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR + .concat(['\t', '\f']); + // All characters with 0x80 bit set to 1 + for (let i = 0x80; i <= 0xff; i++) { + exports$1.URL_CHAR.push(i); + } + exports$1.HEX = exports$1.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); + /* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ + exports$1.STRICT_TOKEN = [ + '!', '#', '$', '%', '&', '\'', + '*', '+', '-', '.', + '^', '_', '`', + '|', '~', + ].concat(exports$1.ALPHANUM); + exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([' ']); + /* + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + */ + exports$1.HEADER_CHARS = ['\t']; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports$1.HEADER_CHARS.push(i); + } + } + // ',' = \x44 + exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); + exports$1.MAJOR = exports$1.NUM_MAP; + exports$1.MINOR = exports$1.MAJOR; + var HEADER_STATE; + (function (HEADER_STATE) { + HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); + exports$1.SPECIAL_HEADERS = { + 'connection': HEADER_STATE.CONNECTION, + 'content-length': HEADER_STATE.CONTENT_LENGTH, + 'proxy-connection': HEADER_STATE.CONNECTION, + 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, + 'upgrade': HEADER_STATE.UPGRADE, + }; + + } (constants$f)); + return constants$f; +} + +var llhttpWasm$1; +var hasRequiredLlhttpWasm$1; + +function requireLlhttpWasm$1 () { + if (hasRequiredLlhttpWasm$1) return llhttpWasm$1; + hasRequiredLlhttpWasm$1 = 1; + + const { Buffer } = require$$0$6; + + llhttpWasm$1 = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv', 'base64'); + return llhttpWasm$1; +} + +var llhttp_simdWasm$1; +var hasRequiredLlhttp_simdWasm$1; + +function requireLlhttp_simdWasm$1 () { + if (hasRequiredLlhttp_simdWasm$1) return llhttp_simdWasm$1; + hasRequiredLlhttp_simdWasm$1 = 1; + + const { Buffer } = require$$0$6; - const { MessageChannel, receiveMessageOnPort } = require$$0$c; + llhttp_simdWasm$1 = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==', 'base64'); + return llhttp_simdWasm$1; +} + +var constants$e; +var hasRequiredConstants$e; - const corsSafeListedMethods = ['GET', 'HEAD', 'POST']; +function requireConstants$e () { + if (hasRequiredConstants$e) return constants$e; + hasRequiredConstants$e = 1; + + const corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST']); const corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - const nullBodyStatus = [101, 204, 205, 304]; + const nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304]); - const redirectStatus = [301, 302, 303, 307, 308]; + const redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308]); const redirectStatusSet = new Set(redirectStatus); - // https://fetch.spec.whatwg.org/#block-bad-port - const badPorts = [ + /** + * @see https://fetch.spec.whatwg.org/#block-bad-port + */ + const badPorts = /** @type {const} */ ([ '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', - '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', - '10080' - ]; - + '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679', + '6697', '10080' + ]); const badPortsSet = new Set(badPorts); - // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies - const referrerPolicy = [ + /** + * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies + */ + const referrerPolicy = /** @type {const} */ ([ '', 'no-referrer', 'no-referrer-when-downgrade', @@ -3551,29 +4252,31 @@ function requireConstants$a () { 'origin-when-cross-origin', 'strict-origin-when-cross-origin', 'unsafe-url' - ]; + ]); const referrerPolicySet = new Set(referrerPolicy); - const requestRedirect = ['follow', 'manual', 'error']; + const requestRedirect = /** @type {const} */ (['follow', 'manual', 'error']); - const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']; + const safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE']); const safeMethodsSet = new Set(safeMethods); - const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']; + const requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors']); - const requestCredentials = ['omit', 'same-origin', 'include']; + const requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include']); - const requestCache = [ + const requestCache = /** @type {const} */ ([ 'default', 'no-store', 'reload', 'no-cache', 'force-cache', 'only-if-cached' - ]; + ]); - // https://fetch.spec.whatwg.org/#request-body-header-name - const requestBodyHeader = [ + /** + * @see https://fetch.spec.whatwg.org/#request-body-header-name + */ + const requestBodyHeader = /** @type {const} */ ([ 'content-encoding', 'content-language', 'content-location', @@ -3583,18 +4286,22 @@ function requireConstants$a () { // removed in the Headers implementation. However, undici doesn't // filter out headers, so we add it here. 'content-length' - ]; + ]); - // https://fetch.spec.whatwg.org/#enumdef-requestduplex - const requestDuplex = [ + /** + * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex + */ + const requestDuplex = /** @type {const} */ ([ 'half' - ]; + ]); - // http://fetch.spec.whatwg.org/#forbidden-method - const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']; + /** + * @see http://fetch.spec.whatwg.org/#forbidden-method + */ + const forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK']); const forbiddenMethodsSet = new Set(forbiddenMethods); - const subresource = [ + const subresource = /** @type {const} */ ([ 'audio', 'audioworklet', 'font', @@ -3607,44 +4314,10 @@ function requireConstants$a () { 'video', 'xslt', '' - ]; + ]); const subresourceSet = new Set(subresource); - /** @type {globalThis['DOMException']} */ - const DOMException = globalThis.DOMException ?? (() => { - // DOMException was only made a global in Node v17.0.0, - // but fetch supports >= v16.8. - try { - atob('~'); - } catch (err) { - return Object.getPrototypeOf(err).constructor - } - })(); - - let channel; - - /** @type {globalThis['structuredClone']} */ - const structuredClone = - globalThis.structuredClone ?? - // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js - // structuredClone was added in v17.0.0, but fetch supports v16.8 - function structuredClone (value, options = undefined) { - if (arguments.length === 0) { - throw new TypeError('missing argument') - } - - if (!channel) { - channel = new MessageChannel(); - } - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options?.transfer); - return receiveMessageOnPort(channel.port2).message - }; - - constants$a = { - DOMException, - structuredClone, + constants$e = { subresource, forbiddenMethods, requestBodyHeader, @@ -3667,15 +4340,15 @@ function requireConstants$a () { forbiddenMethodsSet, referrerPolicySet }; - return constants$a; + return constants$e; } -var global$2; -var hasRequiredGlobal$1; +var global$4; +var hasRequiredGlobal$3; -function requireGlobal$1 () { - if (hasRequiredGlobal$1) return global$2; - hasRequiredGlobal$1 = 1; +function requireGlobal$3 () { + if (hasRequiredGlobal$3) return global$4; + hasRequiredGlobal$3 = 1; // In case of breaking changes, increase the version // number to avoid conflicts. @@ -3711,1193 +4384,777 @@ function requireGlobal$1 () { }); } - global$2 = { + global$4 = { getGlobalOrigin, setGlobalOrigin }; - return global$2; + return global$4; } -var util$7; -var hasRequiredUtil$7; +var dataUrl$1; +var hasRequiredDataUrl$1; -function requireUtil$7 () { - if (hasRequiredUtil$7) return util$7; - hasRequiredUtil$7 = 1; +function requireDataUrl$1 () { + if (hasRequiredDataUrl$1) return dataUrl$1; + hasRequiredDataUrl$1 = 1; - const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$a(); - const { getGlobalOrigin } = requireGlobal$1(); - const { performance } = require$$2$1; - const { isBlobLike, toUSVString, ReadableStreamFrom } = requireUtil$8(); - const assert = require$$0$8; - const { isUint8Array } = require$$5; + const assert = require$$0$7; - let supportedHashes = []; + const encoder = new TextEncoder(); - // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable - /** @type {import('crypto')|undefined} */ - let crypto; + /** + * @see https://mimesniff.spec.whatwg.org/#http-token-code-point + */ + const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+\-.^_|~A-Za-z0-9]+$/; + const HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; // eslint-disable-line + const ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; // eslint-disable-line + /** + * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point + */ + const HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/; // eslint-disable-line - try { - crypto = require('crypto'); - const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']; - supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); - /* c8 ignore next 3 */ - } catch { - } + // https://fetch.spec.whatwg.org/#data-url-processor + /** @param {URL} dataURL */ + function dataURLProcessor (dataURL) { + // 1. Assert: dataURL’s scheme is "data". + assert(dataURL.protocol === 'data:'); - function responseURL (response) { - // https://fetch.spec.whatwg.org/#responses - // A response has an associated URL. It is a pointer to the last URL - // in response’s URL list and null if response’s URL list is empty. - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString() - } + // 2. Let input be the result of running the URL + // serializer on dataURL with exclude fragment + // set to true. + let input = URLSerializer(dataURL, true); - // https://fetch.spec.whatwg.org/#concept-response-location-url - function responseLocationURL (response, requestFragment) { - // 1. If response’s status is not a redirect status, then return null. - if (!redirectStatusSet.has(response.status)) { - return null - } + // 3. Remove the leading "data:" string from input. + input = input.slice(5); - // 2. Let location be the result of extracting header list values given - // `Location` and response’s header list. - let location = response.headersList.get('location'); + // 4. Let position point at the start of input. + const position = { position: 0 }; - // 3. If location is a header value, then set location to the result of - // parsing location with response’s URL. - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); - } + // 5. Let mimeType be the result of collecting a + // sequence of code points that are not equal + // to U+002C (,), given position. + let mimeType = collectASequenceOfCodePointsFast( + ',', + input, + position + ); - // 4. If location is a URL whose fragment is null, then set location’s - // fragment to requestFragment. - if (location && !location.hash) { - location.hash = requestFragment; - } + // 6. Strip leading and trailing ASCII whitespace + // from mimeType. + // Undici implementation note: we need to store the + // length because if the mimetype has spaces removed, + // the wrong amount will be sliced from the input in + // step #9 + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); - // 5. Return location. - return location - } + // 7. If position is past the end of input, then + // return failure + if (position.position >= input.length) { + return 'failure' + } - /** @returns {URL} */ - function requestCurrentURL (request) { - return request.urlList[request.urlList.length - 1] - } + // 8. Advance position by 1. + position.position++; - function requestBadPort (request) { - // 1. Let url be request’s current URL. - const url = requestCurrentURL(request); + // 9. Let encodedBody be the remainder of input. + const encodedBody = input.slice(mimeTypeLength + 1); - // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, - // then return blocked. - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return 'blocked' - } + // 10. Let body be the percent-decoding of encodedBody. + let body = stringPercentDecode(encodedBody); - // 3. Return allowed. - return 'allowed' - } + // 11. If mimeType ends with U+003B (;), followed by + // zero or more U+0020 SPACE, followed by an ASCII + // case-insensitive match for "base64", then: + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + // 1. Let stringBody be the isomorphic decode of body. + const stringBody = isomorphicDecode(body); - function isErrorLike (object) { - return object instanceof Error || ( - object?.constructor?.name === 'Error' || - object?.constructor?.name === 'DOMException' - ) - } + // 2. Set body to the forgiving-base64 decode of + // stringBody. + body = forgivingBase64(stringBody); - // Check whether |statusText| is a ByteString and - // matches the Reason-Phrase token production. - // RFC 2616: https://tools.ietf.org/html/rfc2616 - // RFC 7230: https://tools.ietf.org/html/rfc7230 - // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" - // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 - function isValidReasonPhrase (statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if ( - !( - ( - c === 0x09 || // HTAB - (c >= 0x20 && c <= 0x7e) || // SP / VCHAR - (c >= 0x80 && c <= 0xff) - ) // obs-text - ) - ) { - return false + // 3. If body is failure, then return failure. + if (body === 'failure') { + return 'failure' } + + // 4. Remove the last 6 code points from mimeType. + mimeType = mimeType.slice(0, -6); + + // 5. Remove trailing U+0020 SPACE code points from mimeType, + // if any. + mimeType = mimeType.replace(/(\u0020)+$/, ''); + + // 6. Remove the last U+003B (;) code point from mimeType. + mimeType = mimeType.slice(0, -1); } - return true - } - /** - * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 - * @param {number} c - */ - function isTokenCharCode (c) { - switch (c) { - case 0x22: - case 0x28: - case 0x29: - case 0x2c: - case 0x2f: - case 0x3a: - case 0x3b: - case 0x3c: - case 0x3d: - case 0x3e: - case 0x3f: - case 0x40: - case 0x5b: - case 0x5c: - case 0x5d: - case 0x7b: - case 0x7d: - // DQUOTE and "(),/:;<=>?@[\]{}" - return false - default: - // VCHAR %x21-7E - return c >= 0x21 && c <= 0x7e + // 12. If mimeType starts with U+003B (;), then prepend + // "text/plain" to mimeType. + if (mimeType.startsWith(';')) { + mimeType = 'text/plain' + mimeType; + } + + // 13. Let mimeTypeRecord be the result of parsing + // mimeType. + let mimeTypeRecord = parseMIMEType(mimeType); + + // 14. If mimeTypeRecord is failure, then set + // mimeTypeRecord to text/plain;charset=US-ASCII. + if (mimeTypeRecord === 'failure') { + mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII'); } + + // 15. Return a new data: URL struct whose MIME + // type is mimeTypeRecord and body is body. + // https://fetch.spec.whatwg.org/#data-url-struct + return { mimeType: mimeTypeRecord, body } } + // https://url.spec.whatwg.org/#concept-url-serializer /** - * @param {string} characters + * @param {URL} url + * @param {boolean} excludeFragment */ - function isValidHTTPToken (characters) { - if (characters.length === 0) { - return false + function URLSerializer (url, excludeFragment = false) { + if (!excludeFragment) { + return url.href } - for (let i = 0; i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false - } + + const href = url.href; + const hashLength = url.hash.length; + + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + + if (!hashLength && href.endsWith('#')) { + return serialized.slice(0, -1) } - return true - } - /** - * @see https://fetch.spec.whatwg.org/#header-name - * @param {string} potentialValue - */ - function isValidHeaderName (potentialValue) { - return isValidHTTPToken(potentialValue) + return serialized } + // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points /** - * @see https://fetch.spec.whatwg.org/#header-value - * @param {string} potentialValue + * @param {(char: string) => boolean} condition + * @param {string} input + * @param {{ position: number }} position */ - function isValidHeaderValue (potentialValue) { - // - Has no leading or trailing HTTP tab or space bytes. - // - Contains no 0x00 (NUL) or HTTP newline bytes. - if ( - potentialValue.startsWith('\t') || - potentialValue.startsWith(' ') || - potentialValue.endsWith('\t') || - potentialValue.endsWith(' ') - ) { - return false - } + function collectASequenceOfCodePoints (condition, input, position) { + // 1. Let result be the empty string. + let result = ''; - if ( - potentialValue.includes('\0') || - potentialValue.includes('\r') || - potentialValue.includes('\n') - ) { - return false + // 2. While position doesn’t point past the end of input and the + // code point at position within input meets the condition condition: + while (position.position < input.length && condition(input[position.position])) { + // 1. Append that code point to the end of result. + result += input[position.position]; + + // 2. Advance position by 1. + position.position++; } - return true + // 3. Return result. + return result } - // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect - function setRequestReferrerPolicyOnRedirect (request, actualResponse) { - // Given a request request and a response actualResponse, this algorithm - // updates request’s referrer policy according to the Referrer-Policy - // header (if any) in actualResponse. - - // 1. Let policy be the result of executing § 8.1 Parse a referrer policy - // from a Referrer-Policy header on actualResponse. - - // 8.1 Parse a referrer policy from a Referrer-Policy header - // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. - const { headersList } = actualResponse; - // 2. Let policy be the empty string. - // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. - // 4. Return policy. - const policyHeader = (headersList.get('referrer-policy') ?? '').split(','); + /** + * A faster collectASequenceOfCodePoints that only works when comparing a single character. + * @param {string} char + * @param {string} input + * @param {{ position: number }} position + */ + function collectASequenceOfCodePointsFast (char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; - // Note: As the referrer-policy can contain multiple policies - // separated by comma, we need to loop through all of them - // and pick the first valid one. - // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy - let policy = ''; - if (policyHeader.length > 0) { - // The right-most policy takes precedence. - // The left-most policy is the fallback. - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break - } - } + if (idx === -1) { + position.position = input.length; + return input.slice(start) } - // 2. If policy is not the empty string, then set request’s referrer policy to policy. - if (policy !== '') { - request.referrerPolicy = policy; - } + position.position = idx; + return input.slice(start, position.position) } - // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check - function crossOriginResourcePolicyCheck () { - // TODO - return 'allowed' - } + // https://url.spec.whatwg.org/#string-percent-decode + /** @param {string} input */ + function stringPercentDecode (input) { + // 1. Let bytes be the UTF-8 encoding of input. + const bytes = encoder.encode(input); - // https://fetch.spec.whatwg.org/#concept-cors-check - function corsCheck () { - // TODO - return 'success' + // 2. Return the percent-decoding of bytes. + return percentDecode(bytes) } - // https://fetch.spec.whatwg.org/#concept-tao-check - function TAOCheck () { - // TODO - return 'success' + /** + * @param {number} byte + */ + function isHexCharByte (byte) { + // 0-9 A-F a-f + return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66) } - function appendFetchMetadata (httpRequest) { - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header - // TODO - - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header + /** + * @param {number} byte + */ + function hexByteToNumber (byte) { + return ( + // 0-9 + byte >= 0x30 && byte <= 0x39 + ? (byte - 48) + // Convert to uppercase + // ((byte & 0xDF) - 65) + 10 + : ((byte & 0xDF) - 55) + ) + } - // 1. Assert: r’s url is a potentially trustworthy URL. - // TODO + // https://url.spec.whatwg.org/#percent-decode + /** @param {Uint8Array} input */ + function percentDecode (input) { + const length = input.length; + // 1. Let output be an empty byte sequence. + /** @type {Uint8Array} */ + const output = new Uint8Array(length); + let j = 0; + // 2. For each byte byte in input: + for (let i = 0; i < length; ++i) { + const byte = input[i]; - // 2. Let header be a Structured Header whose value is a token. - let header = null; + // 1. If byte is not 0x25 (%), then append byte to output. + if (byte !== 0x25) { + output[j++] = byte; - // 3. Set header’s value to r’s mode. - header = httpRequest.mode; + // 2. Otherwise, if byte is 0x25 (%) and the next two bytes + // after byte in input are not in the ranges + // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), + // and 0x61 (a) to 0x66 (f), all inclusive, append byte + // to output. + } else if ( + byte === 0x25 && + !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2])) + ) { + output[j++] = 0x25; - // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. - httpRequest.headersList.set('sec-fetch-mode', header); + // 3. Otherwise: + } else { + // 1. Let bytePoint be the two bytes after byte in input, + // decoded, and then interpreted as hexadecimal number. + // 2. Append a byte whose value is bytePoint to output. + output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2]); - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header - // TODO + // 3. Skip the next two bytes in input. + i += 2; + } + } - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header - // TODO + // 3. Return output. + return length === j ? output : output.subarray(0, j) } - // https://fetch.spec.whatwg.org/#append-a-request-origin-header - function appendRequestOriginHeader (request) { - // 1. Let serializedOrigin be the result of byte-serializing a request origin with request. - let serializedOrigin = request.origin; - - // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list. - if (request.responseTainting === 'cors' || request.mode === 'websocket') { - if (serializedOrigin) { - request.headersList.append('origin', serializedOrigin); - } - - // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: - } else if (request.method !== 'GET' && request.method !== 'HEAD') { - // 1. Switch on request’s referrer policy: - switch (request.referrerPolicy) { - case 'no-referrer': - // Set serializedOrigin to `null`. - serializedOrigin = null; - break - case 'no-referrer-when-downgrade': - case 'strict-origin': - case 'strict-origin-when-cross-origin': - // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`. - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break - case 'same-origin': - // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`. - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break - // Do nothing. - } + // https://mimesniff.spec.whatwg.org/#parse-a-mime-type + /** @param {string} input */ + function parseMIMEType (input) { + // 1. Remove any leading and trailing HTTP whitespace + // from input. + input = removeHTTPWhitespace(input, true, true); - if (serializedOrigin) { - // 2. Append (`Origin`, serializedOrigin) to request’s header list. - request.headersList.append('origin', serializedOrigin); - } - } - } + // 2. Let position be a position variable for input, + // initially pointing at the start of input. + const position = { position: 0 }; - function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { - // TODO - return performance.now() - } + // 3. Let type be the result of collecting a sequence + // of code points that are not U+002F (/) from + // input, given position. + const type = collectASequenceOfCodePointsFast( + '/', + input, + position + ); - // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info - function createOpaqueTimingInfo (timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null + // 4. If type is the empty string or does not solely + // contain HTTP token code points, then return failure. + // https://mimesniff.spec.whatwg.org/#http-token-code-point + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return 'failure' } - } - // https://html.spec.whatwg.org/multipage/origin.html#policy-container - function makePolicyContainer () { - // Note: the fetch spec doesn't make use of embedder policy or CSP list - return { - referrerPolicy: 'strict-origin-when-cross-origin' + // 5. If position is past the end of input, then return + // failure + if (position.position > input.length) { + return 'failure' } - } - // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container - function clonePolicyContainer (policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - } - } + // 6. Advance position by 1. (This skips past U+002F (/).) + position.position++; - // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer - function determineRequestsReferrer (request) { - // 1. Let policy be request's referrer policy. - const policy = request.referrerPolicy; + // 7. Let subtype be the result of collecting a sequence of + // code points that are not U+003B (;) from input, given + // position. + let subtype = collectASequenceOfCodePointsFast( + ';', + input, + position + ); - // Note: policy cannot (shouldn't) be null or an empty string. - assert(policy); + // 8. Remove any trailing HTTP whitespace from subtype. + subtype = removeHTTPWhitespace(subtype, false, true); - // 2. Let environment be request’s client. + // 9. If subtype is the empty string or does not solely + // contain HTTP token code points, then return failure. + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return 'failure' + } - let referrerSource = null; + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); - // 3. Switch on request’s referrer: - if (request.referrer === 'client') { - // Note: node isn't a browser and doesn't implement document/iframes, - // so we bypass this step and replace it with our own. + // 10. Let mimeType be a new MIME type record whose type + // is type, in ASCII lowercase, and subtype is subtype, + // in ASCII lowercase. + // https://mimesniff.spec.whatwg.org/#mime-type + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; - const globalOrigin = getGlobalOrigin(); + // 11. While position is not past the end of input: + while (position.position < input.length) { + // 1. Advance position by 1. (This skips past U+003B (;).) + position.position++; - if (!globalOrigin || globalOrigin.origin === 'null') { - return 'no-referrer' - } + // 2. Collect a sequence of code points that are HTTP + // whitespace from input given position. + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + char => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); - // note: we need to clone it as it's mutated - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - // Let referrerSource be request’s referrer. - referrerSource = request.referrer; - } + // 3. Let parameterName be the result of collecting a + // sequence of code points that are not U+003B (;) + // or U+003D (=) from input, given position. + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ';' && char !== '=', + input, + position + ); - // 4. Let request’s referrerURL be the result of stripping referrerSource for - // use as a referrer. - let referrerURL = stripURLForReferrer(referrerSource); + // 4. Set parameterName to parameterName, in ASCII + // lowercase. + parameterName = parameterName.toLowerCase(); - // 5. Let referrerOrigin be the result of stripping referrerSource for use as - // a referrer, with the origin-only flag set to true. - const referrerOrigin = stripURLForReferrer(referrerSource, true); + // 5. If position is not past the end of input, then: + if (position.position < input.length) { + // 1. If the code point at position within input is + // U+003B (;), then continue. + if (input[position.position] === ';') { + continue + } - // 6. If the result of serializing referrerURL is a string whose length is - // greater than 4096, set referrerURL to referrerOrigin. - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } + // 2. Advance position by 1. (This skips past U+003D (=).) + position.position++; + } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && - !isURLPotentiallyTrustworthy(request.url); + // 6. If position is past the end of input, then break. + if (position.position > input.length) { + break + } - // 8. Execute the switch statements corresponding to the value of policy: - switch (policy) { - case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) - case 'unsafe-url': return referrerURL - case 'same-origin': - return areSameOrigin ? referrerOrigin : 'no-referrer' - case 'origin-when-cross-origin': - return areSameOrigin ? referrerURL : referrerOrigin - case 'strict-origin-when-cross-origin': { - const currentURL = requestCurrentURL(request); + // 7. Let parameterValue be null. + let parameterValue = null; - // 1. If the origin of referrerURL and the origin of request’s current - // URL are the same, then return referrerURL. - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL - } + // 8. If the code point at position within input is + // U+0022 ("), then: + if (input[position.position] === '"') { + // 1. Set parameterValue to the result of collecting + // an HTTP quoted string from input, given position + // and the extract-value flag. + parameterValue = collectAnHTTPQuotedString(input, position, true); - // 2. If referrerURL is a potentially trustworthy URL and request’s - // current URL is not a potentially trustworthy URL, then return no - // referrer. - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return 'no-referrer' - } + // 2. Collect a sequence of code points that are not + // U+003B (;) from input, given position. + collectASequenceOfCodePointsFast( + ';', + input, + position + ); - // 3. Return referrerOrigin. - return referrerOrigin + // 9. Otherwise: + } else { + // 1. Set parameterValue to the result of collecting + // a sequence of code points that are not U+003B (;) + // from input, given position. + parameterValue = collectASequenceOfCodePointsFast( + ';', + input, + position + ); + + // 2. Remove any trailing HTTP whitespace from parameterValue. + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + + // 3. If parameterValue is the empty string, then continue. + if (parameterValue.length === 0) { + continue + } } - case 'strict-origin': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - case 'no-referrer-when-downgrade': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - default: // eslint-disable-line - return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + // 10. If all of the following are true + // - parameterName is not the empty string + // - parameterName solely contains HTTP token code points + // - parameterValue solely contains HTTP quoted-string token code points + // - mimeType’s parameters[parameterName] does not exist + // then set mimeType’s parameters[parameterName] to parameterValue. + if ( + parameterName.length !== 0 && + HTTP_TOKEN_CODEPOINTS.test(parameterName) && + (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && + !mimeType.parameters.has(parameterName) + ) { + mimeType.parameters.set(parameterName, parameterValue); + } } + + // 12. Return mimeType. + return mimeType } - /** - * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url - * @param {URL} url - * @param {boolean|undefined} originOnly - */ - function stripURLForReferrer (url, originOnly) { - // 1. Assert: url is a URL. - assert(url instanceof URL); + // https://infra.spec.whatwg.org/#forgiving-base64-decode + /** @param {string} data */ + function forgivingBase64 (data) { + // 1. Remove all ASCII whitespace from data. + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ''); // eslint-disable-line - // 2. If url’s scheme is a local scheme, then return no referrer. - if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { - return 'no-referrer' + let dataLength = data.length; + // 2. If data’s code point length divides by 4 leaving + // no remainder, then: + if (dataLength % 4 === 0) { + // 1. If data ends with one or two U+003D (=) code points, + // then remove them from data. + if (data.charCodeAt(dataLength - 1) === 0x003D) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 0x003D) { + --dataLength; + } + } } - // 3. Set url’s username to the empty string. - url.username = ''; + // 3. If data’s code point length divides by 4 leaving + // a remainder of 1, then return failure. + if (dataLength % 4 === 1) { + return 'failure' + } - // 4. Set url’s password to the empty string. - url.password = ''; + // 4. If data contains a code point that is not one of + // U+002B (+) + // U+002F (/) + // ASCII alphanumeric + // then return failure. + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { + return 'failure' + } - // 5. Set url’s fragment to null. - url.hash = ''; + const buffer = Buffer.from(data, 'base64'); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) + } - // 6. If the origin-only flag is true, then: - if (originOnly) { - // 1. Set url’s path to « the empty string ». - url.pathname = ''; + // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string + // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string + /** + * @param {string} input + * @param {{ position: number }} position + * @param {boolean?} extractValue + */ + function collectAnHTTPQuotedString (input, position, extractValue) { + // 1. Let positionStart be position. + const positionStart = position.position; - // 2. Set url’s query to null. - url.search = ''; - } + // 2. Let value be the empty string. + let value = ''; - // 7. Return url. - return url - } + // 3. Assert: the code point at position within input + // is U+0022 ("). + assert(input[position.position] === '"'); - function isURLPotentiallyTrustworthy (url) { - if (!(url instanceof URL)) { - return false - } + // 4. Advance position by 1. + position.position++; - // If child of about, return true - if (url.href === 'about:blank' || url.href === 'about:srcdoc') { - return true - } + // 5. While true: + while (true) { + // 1. Append the result of collecting a sequence of code points + // that are not U+0022 (") or U+005C (\) from input, given + // position, to value. + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== '\\', + input, + position + ); - // If scheme is data, return true - if (url.protocol === 'data:') return true + // 2. If position is past the end of input, then break. + if (position.position >= input.length) { + break + } - // If file, return true - if (url.protocol === 'file:') return true + // 3. Let quoteOrBackslash be the code point at position within + // input. + const quoteOrBackslash = input[position.position]; - return isOriginPotentiallyTrustworthy(url.origin) + // 4. Advance position by 1. + position.position++; - function isOriginPotentiallyTrustworthy (origin) { - // If origin is explicitly null, return false - if (origin == null || origin === 'null') return false + // 5. If quoteOrBackslash is U+005C (\), then: + if (quoteOrBackslash === '\\') { + // 1. If position is past the end of input, then append + // U+005C (\) to value and break. + if (position.position >= input.length) { + value += '\\'; + break + } - const originAsURL = new URL(origin); + // 2. Append the code point at position within input to value. + value += input[position.position]; - // If secure, return true - if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { - return true - } + // 3. Advance position by 1. + position.position++; - // If localhost or variants, return true - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || - (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || - (originAsURL.hostname.endsWith('.localhost'))) { - return true + // 6. Otherwise: + } else { + // 1. Assert: quoteOrBackslash is U+0022 ("). + assert(quoteOrBackslash === '"'); + + // 2. Break. + break } + } - // If any other, return false - return false + // 6. If the extract-value flag is set, then return value. + if (extractValue) { + return value } + + // 7. Return the code points from positionStart to position, + // inclusive, within input. + return input.slice(positionStart, position.position) } /** - * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist - * @param {Uint8Array} bytes - * @param {string} metadataList + * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type */ - function bytesMatch (bytes, metadataList) { - // If node is not built with OpenSSL support, we cannot check - // a request's integrity, so allow it by default (the spec will - // allow requests if an invalid hash is given, as precedence). - /* istanbul ignore if: only if node is built with --without-ssl */ - if (crypto === undefined) { - return true - } - - // 1. Let parsedMetadata be the result of parsing metadataList. - const parsedMetadata = parseMetadata(metadataList); - - // 2. If parsedMetadata is no metadata, return true. - if (parsedMetadata === 'no metadata') { - return true - } - - // 3. If response is not eligible for integrity validation, return false. - // TODO + function serializeAMimeType (mimeType) { + assert(mimeType !== 'failure'); + const { parameters, essence } = mimeType; - // 4. If parsedMetadata is the empty set, return true. - if (parsedMetadata.length === 0) { - return true - } + // 1. Let serialization be the concatenation of mimeType’s + // type, U+002F (/), and mimeType’s subtype. + let serialization = essence; - // 5. Let metadata be the result of getting the strongest - // metadata from parsedMetadata. - const strongest = getStrongestMetadata(parsedMetadata); - const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + // 2. For each name → value of mimeType’s parameters: + for (let [name, value] of parameters.entries()) { + // 1. Append U+003B (;) to serialization. + serialization += ';'; - // 6. For each item in metadata: - for (const item of metadata) { - // 1. Let algorithm be the alg component of item. - const algorithm = item.algo; + // 2. Append name to serialization. + serialization += name; - // 2. Let expectedValue be the val component of item. - const expectedValue = item.hash; + // 3. Append U+003D (=) to serialization. + serialization += '='; - // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e - // "be liberal with padding". This is annoying, and it's not even in the spec. + // 4. If value does not solely contain HTTP token code + // points or value is the empty string, then: + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + // 1. Precede each occurrence of U+0022 (") or + // U+005C (\) in value with U+005C (\). + value = value.replace(/(\\|")/g, '\\$1'); - // 3. Let actualValue be the result of applying algorithm to bytes. - let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64'); + // 2. Prepend U+0022 (") to value. + value = '"' + value; - if (actualValue[actualValue.length - 1] === '=') { - if (actualValue[actualValue.length - 2] === '=') { - actualValue = actualValue.slice(0, -2); - } else { - actualValue = actualValue.slice(0, -1); - } + // 3. Append U+0022 (") to value. + value += '"'; } - // 4. If actualValue is a case-sensitive match for expectedValue, - // return true. - if (compareBase64Mixed(actualValue, expectedValue)) { - return true - } + // 5. Append value to serialization. + serialization += value; } - // 7. Return false. - return false + // 3. Return serialization. + return serialization } - // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options - // https://www.w3.org/TR/CSP2/#source-list-syntax - // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 - const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; - /** - * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata - * @param {string} metadata + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {number} char */ - function parseMetadata (metadata) { - // 1. Let result be the empty set. - /** @type {{ algo: string, hash: string }[]} */ - const result = []; - - // 2. Let empty be equal to true. - let empty = true; + function isHTTPWhiteSpace (char) { + // "\r\n\t " + return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020 + } - // 3. For each token returned by splitting metadata on spaces: - for (const token of metadata.split(' ')) { - // 1. Set empty to false. - empty = false; + /** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} str + * @param {boolean} [leading=true] + * @param {boolean} [trailing=true] + */ + function removeHTTPWhitespace (str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isHTTPWhiteSpace) + } - // 2. Parse token as a hash-with-options. - const parsedToken = parseHashWithOptions.exec(token); + /** + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * @param {number} char + */ + function isASCIIWhitespace (char) { + // "\r\n\t\f " + return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x00c || char === 0x020 + } - // 3. If token does not parse, continue to the next token. - if ( - parsedToken === null || - parsedToken.groups === undefined || - parsedToken.groups.algo === undefined - ) { - // Note: Chromium blocks the request at this point, but Firefox - // gives a warning that an invalid integrity was given. The - // correct behavior is to ignore these, and subsequently not - // check the integrity of the resource. - continue - } + /** + * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + * @param {string} str + * @param {boolean} [leading=true] + * @param {boolean} [trailing=true] + */ + function removeASCIIWhitespace (str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace) + } - // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo.toLowerCase(); + /** + * @param {string} str + * @param {boolean} leading + * @param {boolean} trailing + * @param {(charCode: number) => boolean} predicate + * @returns + */ + function removeChars (str, leading, trailing, predicate) { + let lead = 0; + let trail = str.length - 1; - // 5. If algorithm is a hash function recognized by the user - // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm)) { - result.push(parsedToken.groups); - } + if (leading) { + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; } - // 4. Return no metadata if empty is true, otherwise return result. - if (empty === true) { - return 'no metadata' + if (trailing) { + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; } - return result + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1) } /** - * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + * @see https://infra.spec.whatwg.org/#isomorphic-decode + * @param {Uint8Array} input + * @returns {string} */ - function getStrongestMetadata (metadataList) { - // Let algorithm be the algo component of the first item in metadataList. - // Can be sha256 - let algorithm = metadataList[0].algo; - // If the algorithm is sha512, then it is the strongest - // and we can return immediately - if (algorithm[3] === '5') { - return algorithm + function isomorphicDecode (input) { + // 1. To isomorphic decode a byte sequence input, return a string whose code point + // length is equal to input’s length and whose code points have the same values + // as the values of input’s bytes, in the same order. + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input) } - - for (let i = 1; i < metadataList.length; ++i) { - const metadata = metadataList[i]; - // If the algorithm is sha512, then it is the strongest - // and we can break the loop immediately - if (metadata.algo[3] === '5') { - algorithm = 'sha512'; - break - // If the algorithm is sha384, then a potential sha256 or sha384 is ignored - } else if (algorithm[3] === '3') { - continue - // algorithm is sha256, check if algorithm is sha384 and if so, set it as - // the strongest - } else if (metadata.algo[3] === '3') { - algorithm = 'sha384'; + let result = ''; let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); } - return algorithm + return result } - function filterMetadataListByAlgorithm (metadataList, algorithm) { - if (metadataList.length === 1) { - return metadataList - } + /** + * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type + * @param {Exclude, 'failure'>} mimeType + */ + function minimizeSupportedMimeType (mimeType) { + switch (mimeType.essence) { + case 'application/ecmascript': + case 'application/javascript': + case 'application/x-ecmascript': + case 'application/x-javascript': + case 'text/ecmascript': + case 'text/javascript': + case 'text/javascript1.0': + case 'text/javascript1.1': + case 'text/javascript1.2': + case 'text/javascript1.3': + case 'text/javascript1.4': + case 'text/javascript1.5': + case 'text/jscript': + case 'text/livescript': + case 'text/x-ecmascript': + case 'text/x-javascript': + // 1. If mimeType is a JavaScript MIME type, then return "text/javascript". + return 'text/javascript' + case 'application/json': + case 'text/json': + // 2. If mimeType is a JSON MIME type, then return "application/json". + return 'application/json' + case 'image/svg+xml': + // 3. If mimeType’s essence is "image/svg+xml", then return "image/svg+xml". + return 'image/svg+xml' + case 'text/xml': + case 'application/xml': + // 4. If mimeType is an XML MIME type, then return "application/xml". + return 'application/xml' + } + + // 2. If mimeType is a JSON MIME type, then return "application/json". + if (mimeType.subtype.endsWith('+json')) { + return 'application/json' + } + + // 4. If mimeType is an XML MIME type, then return "application/xml". + if (mimeType.subtype.endsWith('+xml')) { + return 'application/xml' + } + + // 5. If mimeType is supported by the user agent, then return mimeType’s essence. + // Technically, node doesn't support any mimetypes. + + // 6. Return the empty string. + return '' + } + + dataUrl$1 = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType, + removeChars, + removeHTTPWhitespace, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS, + isomorphicDecode + }; + return dataUrl$1; +} - let pos = 0; - for (let i = 0; i < metadataList.length; ++i) { - if (metadataList[i].algo === algorithm) { - metadataList[pos++] = metadataList[i]; - } - } +var webidl_1$1; +var hasRequiredWebidl$1; - metadataList.length = pos; +function requireWebidl$1 () { + if (hasRequiredWebidl$1) return webidl_1$1; + hasRequiredWebidl$1 = 1; - return metadataList - } + const { types, inspect } = require$$0$a; + const { markAsUncloneable } = require$$1$4; + const { toUSVString } = requireUtil$h(); - /** - * Compares two base64 strings, allowing for base64url - * in the second string. - * - * @param {string} actualValue always base64 - * @param {string} expectedValue base64 or base64url - * @returns {boolean} - */ - function compareBase64Mixed (actualValue, expectedValue) { - if (actualValue.length !== expectedValue.length) { - return false - } - for (let i = 0; i < actualValue.length; ++i) { - if (actualValue[i] !== expectedValue[i]) { - if ( - (actualValue[i] === '+' && expectedValue[i] === '-') || - (actualValue[i] === '/' && expectedValue[i] === '_') - ) { - continue - } - return false - } - } - - return true - } - - // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request - function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { - // TODO - } - - /** - * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} - * @param {URL} A - * @param {URL} B - */ - function sameOrigin (A, B) { - // 1. If A and B are the same opaque origin, then return true. - if (A.origin === B.origin && A.origin === 'null') { - return true - } - - // 2. If A and B are both tuple origins and their schemes, - // hosts, and port are identical, then return true. - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true - } - - // 3. Return false. - return false - } - - function createDeferredPromise () { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - - return { promise, resolve: res, reject: rej } - } - - function isAborted (fetchParams) { - return fetchParams.controller.state === 'aborted' - } - - function isCancelled (fetchParams) { - return fetchParams.controller.state === 'aborted' || - fetchParams.controller.state === 'terminated' - } - - const normalizeMethodRecord = { - delete: 'DELETE', - DELETE: 'DELETE', - get: 'GET', - GET: 'GET', - head: 'HEAD', - HEAD: 'HEAD', - options: 'OPTIONS', - OPTIONS: 'OPTIONS', - post: 'POST', - POST: 'POST', - put: 'PUT', - PUT: 'PUT' - }; - - // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. - Object.setPrototypeOf(normalizeMethodRecord, null); - - /** - * @see https://fetch.spec.whatwg.org/#concept-method-normalize - * @param {string} method - */ - function normalizeMethod (method) { - return normalizeMethodRecord[method.toLowerCase()] ?? method - } - - // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string - function serializeJavascriptValueToJSONString (value) { - // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). - const result = JSON.stringify(value); - - // 2. If result is undefined, then throw a TypeError. - if (result === undefined) { - throw new TypeError('Value is not JSON serializable') - } - - // 3. Assert: result is a string. - assert(typeof result === 'string'); - - // 4. Return result. - return result - } - - // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object - const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - - /** - * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object - * @param {() => unknown[]} iterator - * @param {string} name name of the instance - * @param {'key'|'value'|'key+value'} kind - */ - function makeIterator (iterator, name, kind) { - const object = { - index: 0, - kind, - target: iterator - }; - - const i = { - next () { - // 1. Let interface be the interface for which the iterator prototype object exists. - - // 2. Let thisValue be the this value. - - // 3. Let object be ? ToObject(thisValue). - - // 4. If object is a platform object, then perform a security - // check, passing: - - // 5. If object is not a default iterator object for interface, - // then throw a TypeError. - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ) - } - - // 6. Let index be object’s index. - // 7. Let kind be object’s kind. - // 8. Let values be object’s target's value pairs to iterate over. - const { index, kind, target } = object; - const values = target(); - - // 9. Let len be the length of values. - const len = values.length; - - // 10. If index is greater than or equal to len, then return - // CreateIterResultObject(undefined, true). - if (index >= len) { - return { value: undefined, done: true } - } - - // 11. Let pair be the entry in values at index index. - const pair = values[index]; - - // 12. Set object’s index to index + 1. - object.index = index + 1; - - // 13. Return the iterator result for pair and kind. - return iteratorResult(pair, kind) - }, - // The class string of an iterator prototype object for a given interface is the - // result of concatenating the identifier of the interface and the string " Iterator". - [Symbol.toStringTag]: `${name} Iterator` - }; - - // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%. - Object.setPrototypeOf(i, esIteratorPrototype); - // esIteratorPrototype needs to be the prototype of i - // which is the prototype of an empty object. Yes, it's confusing. - return Object.setPrototypeOf({}, i) - } - - // https://webidl.spec.whatwg.org/#iterator-result - function iteratorResult (pair, kind) { - let result; - - // 1. Let result be a value determined by the value of kind: - switch (kind) { - case 'key': { - // 1. Let idlKey be pair’s key. - // 2. Let key be the result of converting idlKey to an - // ECMAScript value. - // 3. result is key. - result = pair[0]; - break - } - case 'value': { - // 1. Let idlValue be pair’s value. - // 2. Let value be the result of converting idlValue to - // an ECMAScript value. - // 3. result is value. - result = pair[1]; - break - } - case 'key+value': { - // 1. Let idlKey be pair’s key. - // 2. Let idlValue be pair’s value. - // 3. Let key be the result of converting idlKey to an - // ECMAScript value. - // 4. Let value be the result of converting idlValue to - // an ECMAScript value. - // 5. Let array be ! ArrayCreate(2). - // 6. Call ! CreateDataProperty(array, "0", key). - // 7. Call ! CreateDataProperty(array, "1", value). - // 8. result is array. - result = pair; - break - } - } - - // 2. Return CreateIterResultObject(result, false). - return { value: result, done: false } - } - - /** - * @see https://fetch.spec.whatwg.org/#body-fully-read - */ - async function fullyReadBody (body, processBody, processBodyError) { - // 1. If taskDestination is null, then set taskDestination to - // the result of starting a new parallel queue. - - // 2. Let successSteps given a byte sequence bytes be to queue a - // fetch task to run processBody given bytes, with taskDestination. - const successSteps = processBody; - - // 3. Let errorSteps be to queue a fetch task to run processBodyError, - // with taskDestination. - const errorSteps = processBodyError; - - // 4. Let reader be the result of getting a reader for body’s stream. - // If that threw an exception, then run errorSteps with that - // exception and return. - let reader; - - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return - } - - // 5. Read all bytes from reader, given successSteps and errorSteps. - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - - /** @type {ReadableStream} */ - let ReadableStream = globalThis.ReadableStream; - - function isReadableStreamLike (stream) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - - return stream instanceof ReadableStream || ( - stream[Symbol.toStringTag] === 'ReadableStream' && - typeof stream.tee === 'function' - ) - } - - const MAXIMUM_ARGUMENT_LENGTH = 65535; - - /** - * @see https://infra.spec.whatwg.org/#isomorphic-decode - * @param {number[]|Uint8Array} input - */ - function isomorphicDecode (input) { - // 1. To isomorphic decode a byte sequence input, return a string whose code point - // length is equal to input’s length and whose code points have the same values - // as the values of input’s bytes, in the same order. - - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input) - } - - return input.reduce((previous, current) => previous + String.fromCharCode(current), '') - } - - /** - * @param {ReadableStreamController} controller - */ - function readableStreamClose (controller) { - try { - controller.close(); - } catch (err) { - // TODO: add comment explaining why this error occurs. - if (!err.message.includes('Controller is already closed')) { - throw err - } - } - } - - /** - * @see https://infra.spec.whatwg.org/#isomorphic-encode - * @param {string} input - */ - function isomorphicEncode (input) { - // 1. Assert: input contains no code points greater than U+00FF. - for (let i = 0; i < input.length; i++) { - assert(input.charCodeAt(i) <= 0xFF); - } - - // 2. Return a byte sequence whose length is equal to input’s code - // point length and whose bytes have the same values as the - // values of input’s code points, in the same order - return input - } - - /** - * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes - * @see https://streams.spec.whatwg.org/#read-loop - * @param {ReadableStreamDefaultReader} reader - */ - async function readAllBytes (reader) { - const bytes = []; - let byteLength = 0; - - while (true) { - const { done, value: chunk } = await reader.read(); - - if (done) { - // 1. Call successSteps with bytes. - return Buffer.concat(bytes, byteLength) - } - - // 1. If chunk is not a Uint8Array object, call failureSteps - // with a TypeError and abort these steps. - if (!isUint8Array(chunk)) { - throw new TypeError('Received non-Uint8Array chunk') - } - - // 2. Append the bytes represented by chunk to bytes. - bytes.push(chunk); - byteLength += chunk.length; - - // 3. Read-loop given reader, bytes, successSteps, and failureSteps. - } - } - - /** - * @see https://fetch.spec.whatwg.org/#is-local - * @param {URL} url - */ - function urlIsLocal (url) { - assert('protocol' in url); // ensure it's a url object - - const protocol = url.protocol; - - return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' - } - - /** - * @param {string|URL} url - */ - function urlHasHttpsScheme (url) { - if (typeof url === 'string') { - return url.startsWith('https:') - } - - return url.protocol === 'https:' - } - - /** - * @see https://fetch.spec.whatwg.org/#http-scheme - * @param {URL} url - */ - function urlIsHttpHttpsScheme (url) { - assert('protocol' in url); // ensure it's a url object - - const protocol = url.protocol; - - return protocol === 'http:' || protocol === 'https:' - } - - /** - * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. - */ - const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); - - util$7 = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - parseMetadata - }; - return util$7; -} - -var symbols$3; -var hasRequiredSymbols$3; - -function requireSymbols$3 () { - if (hasRequiredSymbols$3) return symbols$3; - hasRequiredSymbols$3 = 1; - - symbols$3 = { - kUrl: Symbol('url'), - kHeaders: Symbol('headers'), - kSignal: Symbol('signal'), - kState: Symbol('state'), - kGuard: Symbol('guard'), - kRealm: Symbol('realm') - }; - return symbols$3; -} - -var webidl_1; -var hasRequiredWebidl; - -function requireWebidl () { - if (hasRequiredWebidl) return webidl_1; - hasRequiredWebidl = 1; - - const { types } = require$$0__default; - const { hasOwn, toUSVString } = requireUtil$7(); - - /** @type {import('../../types/webidl').Webidl} */ + /** @type {import('../../../types/webidl').Webidl} */ const webidl = {}; webidl.converters = {}; webidl.util = {}; @@ -4927,11 +5184,19 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#implements - webidl.brandCheck = function (V, I, opts = undefined) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError('Illegal invocation') + webidl.brandCheck = function (V, I, opts) { + if (opts?.strict !== false) { + if (!(V instanceof I)) { + const err = new TypeError('Illegal invocation'); + err.code = 'ERR_INVALID_THIS'; // node compat. + throw err + } } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag] + if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + const err = new TypeError('Illegal invocation'); + err.code = 'ERR_INVALID_THIS'; // node compat. + throw err + } } }; @@ -4940,7 +5205,7 @@ function requireWebidl () { throw webidl.errors.exception({ message: `${min} argument${min !== 1 ? 's' : ''} required, ` + `but${length ? ' only' : ''} ${length} found.`, - ...ctx + header: ctx }) } }; @@ -4972,8 +5237,9 @@ function requireWebidl () { } }; + webidl.util.markAsUncloneable = markAsUncloneable || (() => {}); // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint - webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { + webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) { let upperBound; let lowerBound; @@ -5017,7 +5283,7 @@ function requireWebidl () { // 6. If the conversion is to an IDL type associated // with the [EnforceRange] extended attribute, then: - if (opts.enforceRange === true) { + if (opts?.enforceRange === true) { // 1. If x is NaN, +∞, or −∞, then throw a TypeError. if ( Number.isNaN(x) || @@ -5026,7 +5292,7 @@ function requireWebidl () { ) { throw webidl.errors.exception({ header: 'Integer conversion', - message: `Could not convert ${V} to an integer.` + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` }) } @@ -5049,7 +5315,7 @@ function requireWebidl () { // 7. If x is not NaN and the conversion is to an IDL // type associated with the [Clamp] extended // attribute, then: - if (!Number.isNaN(x) && opts.clamp === true) { + if (!Number.isNaN(x) && opts?.clamp === true) { // 1. Set x to min(max(x, lowerBound), upperBound). x = Math.min(Math.max(x, lowerBound), upperBound); @@ -5106,21 +5372,37 @@ function requireWebidl () { return r }; + webidl.util.Stringify = function (V) { + const type = webidl.util.Type(V); + + switch (type) { + case 'Symbol': + return `Symbol(${V.description})` + case 'Object': + return inspect(V) + case 'String': + return `"${V}"` + default: + return `${V}` + } + }; + // https://webidl.spec.whatwg.org/#es-sequence webidl.sequenceConverter = function (converter) { - return (V) => { + return (V, prefix, argument, Iterable) => { // 1. If Type(V) is not Object, throw a TypeError. if (webidl.util.Type(V) !== 'Object') { throw webidl.errors.exception({ - header: 'Sequence', - message: `Value of type ${webidl.util.Type(V)} is not an Object.` + header: prefix, + message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` }) } // 2. Let method be ? GetMethod(V, @@iterator). /** @type {Generator} */ - const method = V?.[Symbol.iterator]?.(); + const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.(); const seq = []; + let index = 0; // 3. If method is undefined, throw a TypeError. if ( @@ -5128,8 +5410,8 @@ function requireWebidl () { typeof method.next !== 'function' ) { throw webidl.errors.exception({ - header: 'Sequence', - message: 'Object is not an iterator.' + header: prefix, + message: `${argument} is not iterable.` }) } @@ -5141,7 +5423,7 @@ function requireWebidl () { break } - seq.push(converter(value)); + seq.push(converter(value, prefix, `${argument}[${index++}]`)); } return seq @@ -5150,12 +5432,12 @@ function requireWebidl () { // https://webidl.spec.whatwg.org/#es-to-record webidl.recordConverter = function (keyConverter, valueConverter) { - return (O) => { + return (O, prefix, argument) => { // 1. If Type(O) is not Object, throw a TypeError. if (webidl.util.Type(O) !== 'Object') { throw webidl.errors.exception({ - header: 'Record', - message: `Value of type ${webidl.util.Type(O)} is not an Object.` + header: prefix, + message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` }) } @@ -5163,16 +5445,16 @@ function requireWebidl () { const result = {}; if (!types.isProxy(O)) { - // Object.keys only returns enumerable properties - const keys = Object.keys(O); + // 1. Let desc be ? O.[[GetOwnProperty]](key). + const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; for (const key of keys) { // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key); + const typedKey = keyConverter(key, prefix, argument); // 2. Let value be ? Get(O, key). // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key]); + const typedValue = valueConverter(O[key], prefix, argument); // 4. Set result[typedKey] to typedValue. result[typedKey] = typedValue; @@ -5193,11 +5475,11 @@ function requireWebidl () { // 2. If desc is not undefined and desc.[[Enumerable]] is true: if (desc?.enumerable) { // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key); + const typedKey = keyConverter(key, prefix, argument); // 2. Let value be ? Get(O, key). // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key]); + const typedValue = valueConverter(O[key], prefix, argument); // 4. Set result[typedKey] to typedValue. result[typedKey] = typedValue; @@ -5210,11 +5492,11 @@ function requireWebidl () { }; webidl.interfaceConverter = function (i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { + return (V, prefix, argument, opts) => { + if (opts?.strict !== false && !(V instanceof i)) { throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` + header: prefix, + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` }) } @@ -5223,7 +5505,7 @@ function requireWebidl () { }; webidl.dictionaryConverter = function (converters) { - return (dictionary) => { + return (dictionary, prefix, argument) => { const type = webidl.util.Type(dictionary); const dict = {}; @@ -5231,7 +5513,7 @@ function requireWebidl () { return dict } else if (type !== 'Object') { throw webidl.errors.exception({ - header: 'Dictionary', + header: prefix, message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` }) } @@ -5240,35 +5522,35 @@ function requireWebidl () { const { key, defaultValue, required, converter } = options; if (required === true) { - if (!hasOwn(dictionary, key)) { + if (!Object.hasOwn(dictionary, key)) { throw webidl.errors.exception({ - header: 'Dictionary', + header: prefix, message: `Missing required key "${key}".` }) } } let value = dictionary[key]; - const hasDefault = hasOwn(options, 'defaultValue'); + const hasDefault = Object.hasOwn(options, 'defaultValue'); // Only use defaultValue if value is undefined and // a defaultValue options was provided. if (hasDefault && value !== null) { - value = value ?? defaultValue; + value ??= defaultValue(); } // A key can be optional and have no default value. // When this happens, do not perform a conversion, // and do not assign the key a value. if (required || hasDefault || value !== undefined) { - value = converter(value); + value = converter(value, prefix, `${argument}.${key}`); if ( options.allowedValues && !options.allowedValues.includes(value) ) { throw webidl.errors.exception({ - header: 'Dictionary', + header: prefix, message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` }) } @@ -5282,28 +5564,31 @@ function requireWebidl () { }; webidl.nullableConverter = function (converter) { - return (V) => { + return (V, prefix, argument) => { if (V === null) { return V } - return converter(V) + return converter(V, prefix, argument) } }; // https://webidl.spec.whatwg.org/#es-DOMString - webidl.converters.DOMString = function (V, opts = {}) { + webidl.converters.DOMString = function (V, prefix, argument, opts) { // 1. If V is null and the conversion is to an IDL type // associated with the [LegacyNullToEmptyString] // extended attribute, then return the DOMString value // that represents the empty string. - if (V === null && opts.legacyNullToEmptyString) { + if (V === null && opts?.legacyNullToEmptyString) { return '' } // 2. Let x be ? ToString(V). if (typeof V === 'symbol') { - throw new TypeError('Could not convert argument of type symbol to string.') + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a DOMString.` + }) } // 3. Return the IDL DOMString value that represents the @@ -5313,10 +5598,10 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-ByteString - webidl.converters.ByteString = function (V) { + webidl.converters.ByteString = function (V, prefix, argument) { // 1. Let x be ? ToString(V). // Note: DOMString converter perform ? ToString(V) - const x = webidl.converters.DOMString(V); + const x = webidl.converters.DOMString(V, prefix, argument); // 2. If the value of any element of x is greater than // 255, then throw a TypeError. @@ -5336,6 +5621,7 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-USVString + // TODO: rewrite this so we can control the errors thrown webidl.converters.USVString = toUSVString; // https://webidl.spec.whatwg.org/#es-boolean @@ -5354,9 +5640,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-long-long - webidl.converters['long long'] = function (V) { + webidl.converters['long long'] = function (V, prefix, argument) { // 1. Let x be ? ConvertToInt(V, 64, "signed"). - const x = webidl.util.ConvertToInt(V, 64, 'signed'); + const x = webidl.util.ConvertToInt(V, 64, 'signed', undefined, prefix, argument); // 2. Return the IDL long long value that represents // the same numeric value as x. @@ -5364,9 +5650,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-unsigned-long-long - webidl.converters['unsigned long long'] = function (V) { + webidl.converters['unsigned long long'] = function (V, prefix, argument) { // 1. Let x be ? ConvertToInt(V, 64, "unsigned"). - const x = webidl.util.ConvertToInt(V, 64, 'unsigned'); + const x = webidl.util.ConvertToInt(V, 64, 'unsigned', undefined, prefix, argument); // 2. Return the IDL unsigned long long value that // represents the same numeric value as x. @@ -5374,9 +5660,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-unsigned-long - webidl.converters['unsigned long'] = function (V) { + webidl.converters['unsigned long'] = function (V, prefix, argument) { // 1. Let x be ? ConvertToInt(V, 32, "unsigned"). - const x = webidl.util.ConvertToInt(V, 32, 'unsigned'); + const x = webidl.util.ConvertToInt(V, 32, 'unsigned', undefined, prefix, argument); // 2. Return the IDL unsigned long value that // represents the same numeric value as x. @@ -5384,9 +5670,9 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#es-unsigned-short - webidl.converters['unsigned short'] = function (V, opts) { + webidl.converters['unsigned short'] = function (V, prefix, argument, opts) { // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). - const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts); + const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts, prefix, argument); // 2. Return the IDL unsigned short value that represents // the same numeric value as x. @@ -5394,7 +5680,7 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#idl-ArrayBuffer - webidl.converters.ArrayBuffer = function (V, opts = {}) { + webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) { // 1. If Type(V) is not Object, or V does not have an // [[ArrayBufferData]] internal slot, then throw a // TypeError. @@ -5405,8 +5691,8 @@ function requireWebidl () { !types.isAnyArrayBuffer(V) ) { throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, types: ['ArrayBuffer'] }) } @@ -5415,7 +5701,7 @@ function requireWebidl () { // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V) is true, then throw a // TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) { throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' @@ -5426,14 +5712,19 @@ function requireWebidl () { // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V) is true, then throw a // TypeError. - // Note: resizable ArrayBuffers are currently a proposal. + if (V.resizable || V.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } // 4. Return the IDL ArrayBuffer value that is a // reference to the same object as V. return V }; - webidl.converters.TypedArray = function (V, T, opts = {}) { + webidl.converters.TypedArray = function (V, T, prefix, name, opts) { // 1. Let T be the IDL type V is being converted to. // 2. If Type(V) is not Object, or V does not have a @@ -5445,8 +5736,8 @@ function requireWebidl () { V.constructor.name !== T.name ) { throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, types: [T.name] }) } @@ -5455,7 +5746,7 @@ function requireWebidl () { // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' @@ -5466,20 +5757,25 @@ function requireWebidl () { // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. - // Note: resizable array buffers are currently a proposal + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } // 5. Return the IDL value of type T that is a reference // to the same object as V. return V }; - webidl.converters.DataView = function (V, opts = {}) { + webidl.converters.DataView = function (V, prefix, name, opts) { // 1. If Type(V) is not Object, or V does not have a // [[DataView]] internal slot, then throw a TypeError. if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { throw webidl.errors.exception({ - header: 'DataView', - message: 'Object is not a DataView.' + header: prefix, + message: `${name} is not a DataView.` }) } @@ -5487,7 +5783,7 @@ function requireWebidl () { // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, // then throw a TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' @@ -5498,7 +5794,12 @@ function requireWebidl () { // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. - // Note: resizable ArrayBuffers are currently a proposal + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } // 4. Return the IDL DataView value that is a reference // to the same object as V. @@ -5506,20 +5807,24 @@ function requireWebidl () { }; // https://webidl.spec.whatwg.org/#BufferSource - webidl.converters.BufferSource = function (V, opts = {}) { + webidl.converters.BufferSource = function (V, prefix, name, opts) { if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts) + return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false }) } if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor) + return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false }) } if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts) + return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false }) } - throw new TypeError(`Could not convert ${V} to a BufferSource.`) + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, + types: ['BufferSource'] + }) }; webidl.converters['sequence'] = webidl.sequenceConverter( @@ -5535,753 +5840,1685 @@ function requireWebidl () { webidl.converters.ByteString ); - webidl_1 = { + webidl_1$1 = { webidl }; - return webidl_1; + return webidl_1$1; } -var dataURL; -var hasRequiredDataURL; +var util$g; +var hasRequiredUtil$g; -function requireDataURL () { - if (hasRequiredDataURL) return dataURL; - hasRequiredDataURL = 1; - const assert = require$$0$8; - const { atob } = require$$7; - const { isomorphicDecode } = requireUtil$7(); +function requireUtil$g () { + if (hasRequiredUtil$g) return util$g; + hasRequiredUtil$g = 1; - const encoder = new TextEncoder(); + const { Transform } = require$$0$8; + const zlib = require$$3; + const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$e(); + const { getGlobalOrigin } = requireGlobal$3(); + const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = requireDataUrl$1(); + const { performance } = require$$5$1; + const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = requireUtil$h(); + const assert = require$$0$7; + const { isUint8Array } = require$$8$1; + const { webidl } = requireWebidl$1(); - /** - * @see https://mimesniff.spec.whatwg.org/#http-token-code-point - */ - const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; // eslint-disable-line - /** - * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point - */ - const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; // eslint-disable-line + let supportedHashes = []; - // https://fetch.spec.whatwg.org/#data-url-processor - /** @param {URL} dataURL */ - function dataURLProcessor (dataURL) { - // 1. Assert: dataURL’s scheme is "data". - assert(dataURL.protocol === 'data:'); + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable + /** @type {import('crypto')} */ + let crypto; + try { + crypto = require('node:crypto'); + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + /* c8 ignore next 3 */ + } catch { - // 2. Let input be the result of running the URL - // serializer on dataURL with exclude fragment - // set to true. - let input = URLSerializer(dataURL, true); + } - // 3. Remove the leading "data:" string from input. - input = input.slice(5); + function responseURL (response) { + // https://fetch.spec.whatwg.org/#responses + // A response has an associated URL. It is a pointer to the last URL + // in response’s URL list and null if response’s URL list is empty. + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString() + } - // 4. Let position point at the start of input. - const position = { position: 0 }; + // https://fetch.spec.whatwg.org/#concept-response-location-url + function responseLocationURL (response, requestFragment) { + // 1. If response’s status is not a redirect status, then return null. + if (!redirectStatusSet.has(response.status)) { + return null + } - // 5. Let mimeType be the result of collecting a - // sequence of code points that are not equal - // to U+002C (,), given position. - let mimeType = collectASequenceOfCodePointsFast( - ',', - input, - position - ); + // 2. Let location be the result of extracting header list values given + // `Location` and response’s header list. + let location = response.headersList.get('location', true); - // 6. Strip leading and trailing ASCII whitespace - // from mimeType. - // Undici implementation note: we need to store the - // length because if the mimetype has spaces removed, - // the wrong amount will be sliced from the input in - // step #9 - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); + // 3. If location is a header value, then set location to the result of + // parsing location with response’s URL. + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + // Some websites respond location header in UTF-8 form without encoding them as ASCII + // and major browsers redirect them to correctly UTF-8 encoded addresses. + // Here, we handle that behavior in the same way. + location = normalizeBinaryStringToUtf8(location); + } + location = new URL(location, responseURL(response)); + } - // 7. If position is past the end of input, then - // return failure - if (position.position >= input.length) { - return 'failure' + // 4. If location is a URL whose fragment is null, then set location’s + // fragment to requestFragment. + if (location && !location.hash) { + location.hash = requestFragment; } - // 8. Advance position by 1. - position.position++; + // 5. Return location. + return location + } - // 9. Let encodedBody be the remainder of input. - const encodedBody = input.slice(mimeTypeLength + 1); + /** + * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2 + * @param {string} url + * @returns {boolean} + */ + function isValidEncodedURL (url) { + for (let i = 0; i < url.length; ++i) { + const code = url.charCodeAt(i); - // 10. Let body be the percent-decoding of encodedBody. - let body = stringPercentDecode(encodedBody); + if ( + code > 0x7E || // Non-US-ASCII + DEL + code < 0x20 // Control characters NUL - US + ) { + return false + } + } + return true + } - // 11. If mimeType ends with U+003B (;), followed by - // zero or more U+0020 SPACE, followed by an ASCII - // case-insensitive match for "base64", then: - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - // 1. Let stringBody be the isomorphic decode of body. - const stringBody = isomorphicDecode(body); - - // 2. Set body to the forgiving-base64 decode of - // stringBody. - body = forgivingBase64(stringBody); - - // 3. If body is failure, then return failure. - if (body === 'failure') { - return 'failure' - } + /** + * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it. + * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well. + * @param {string} value + * @returns {string} + */ + function normalizeBinaryStringToUtf8 (value) { + return Buffer.from(value, 'binary').toString('utf8') + } - // 4. Remove the last 6 code points from mimeType. - mimeType = mimeType.slice(0, -6); + /** @returns {URL} */ + function requestCurrentURL (request) { + return request.urlList[request.urlList.length - 1] + } - // 5. Remove trailing U+0020 SPACE code points from mimeType, - // if any. - mimeType = mimeType.replace(/(\u0020)+$/, ''); + function requestBadPort (request) { + // 1. Let url be request’s current URL. + const url = requestCurrentURL(request); - // 6. Remove the last U+003B (;) code point from mimeType. - mimeType = mimeType.slice(0, -1); + // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, + // then return blocked. + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return 'blocked' } - // 12. If mimeType starts with U+003B (;), then prepend - // "text/plain" to mimeType. - if (mimeType.startsWith(';')) { - mimeType = 'text/plain' + mimeType; - } + // 3. Return allowed. + return 'allowed' + } - // 13. Let mimeTypeRecord be the result of parsing - // mimeType. - let mimeTypeRecord = parseMIMEType(mimeType); + function isErrorLike (object) { + return object instanceof Error || ( + object?.constructor?.name === 'Error' || + object?.constructor?.name === 'DOMException' + ) + } - // 14. If mimeTypeRecord is failure, then set - // mimeTypeRecord to text/plain;charset=US-ASCII. - if (mimeTypeRecord === 'failure') { - mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII'); + // Check whether |statusText| is a ByteString and + // matches the Reason-Phrase token production. + // RFC 2616: https://tools.ietf.org/html/rfc2616 + // RFC 7230: https://tools.ietf.org/html/rfc7230 + // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" + // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 + function isValidReasonPhrase (statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if ( + !( + ( + c === 0x09 || // HTAB + (c >= 0x20 && c <= 0x7e) || // SP / VCHAR + (c >= 0x80 && c <= 0xff) + ) // obs-text + ) + ) { + return false + } } - - // 15. Return a new data: URL struct whose MIME - // type is mimeTypeRecord and body is body. - // https://fetch.spec.whatwg.org/#data-url-struct - return { mimeType: mimeTypeRecord, body } + return true } - // https://url.spec.whatwg.org/#concept-url-serializer /** - * @param {URL} url - * @param {boolean} excludeFragment + * @see https://fetch.spec.whatwg.org/#header-name + * @param {string} potentialValue */ - function URLSerializer (url, excludeFragment = false) { - if (!excludeFragment) { - return url.href - } - - const href = url.href; - const hashLength = url.hash.length; - - return hashLength === 0 ? href : href.substring(0, href.length - hashLength) - } + const isValidHeaderName = isValidHTTPToken; - // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points /** - * @param {(char: string) => boolean} condition - * @param {string} input - * @param {{ position: number }} position + * @see https://fetch.spec.whatwg.org/#header-value + * @param {string} potentialValue */ - function collectASequenceOfCodePoints (condition, input, position) { - // 1. Let result be the empty string. - let result = ''; + function isValidHeaderValue (potentialValue) { + // - Has no leading or trailing HTTP tab or space bytes. + // - Contains no 0x00 (NUL) or HTTP newline bytes. + return ( + potentialValue[0] === '\t' || + potentialValue[0] === ' ' || + potentialValue[potentialValue.length - 1] === '\t' || + potentialValue[potentialValue.length - 1] === ' ' || + potentialValue.includes('\n') || + potentialValue.includes('\r') || + potentialValue.includes('\0') + ) === false + } - // 2. While position doesn’t point past the end of input and the - // code point at position within input meets the condition condition: - while (position.position < input.length && condition(input[position.position])) { - // 1. Append that code point to the end of result. - result += input[position.position]; + // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect + function setRequestReferrerPolicyOnRedirect (request, actualResponse) { + // Given a request request and a response actualResponse, this algorithm + // updates request’s referrer policy according to the Referrer-Policy + // header (if any) in actualResponse. - // 2. Advance position by 1. - position.position++; - } + // 1. Let policy be the result of executing § 8.1 Parse a referrer policy + // from a Referrer-Policy header on actualResponse. - // 3. Return result. - return result - } + // 8.1 Parse a referrer policy from a Referrer-Policy header + // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. + const { headersList } = actualResponse; + // 2. Let policy be the empty string. + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. + // 4. Return policy. + const policyHeader = (headersList.get('referrer-policy', true) ?? '').split(','); - /** - * A faster collectASequenceOfCodePoints that only works when comparing a single character. - * @param {string} char - * @param {string} input - * @param {{ position: number }} position - */ - function collectASequenceOfCodePointsFast (char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; + // Note: As the referrer-policy can contain multiple policies + // separated by comma, we need to loop through all of them + // and pick the first valid one. + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy + let policy = ''; + if (policyHeader.length > 0) { + // The right-most policy takes precedence. + // The left-most policy is the fallback. + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break + } + } + } - if (idx === -1) { - position.position = input.length; - return input.slice(start) + // 2. If policy is not the empty string, then set request’s referrer policy to policy. + if (policy !== '') { + request.referrerPolicy = policy; } + } - position.position = idx; - return input.slice(start, position.position) + // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check + function crossOriginResourcePolicyCheck () { + // TODO + return 'allowed' } - // https://url.spec.whatwg.org/#string-percent-decode - /** @param {string} input */ - function stringPercentDecode (input) { - // 1. Let bytes be the UTF-8 encoding of input. - const bytes = encoder.encode(input); + // https://fetch.spec.whatwg.org/#concept-cors-check + function corsCheck () { + // TODO + return 'success' + } - // 2. Return the percent-decoding of bytes. - return percentDecode(bytes) + // https://fetch.spec.whatwg.org/#concept-tao-check + function TAOCheck () { + // TODO + return 'success' } - // https://url.spec.whatwg.org/#percent-decode - /** @param {Uint8Array} input */ - function percentDecode (input) { - // 1. Let output be an empty byte sequence. - /** @type {number[]} */ - const output = []; + function appendFetchMetadata (httpRequest) { + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header + // TODO - // 2. For each byte byte in input: - for (let i = 0; i < input.length; i++) { - const byte = input[i]; + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header - // 1. If byte is not 0x25 (%), then append byte to output. - if (byte !== 0x25) { - output.push(byte); + // 1. Assert: r’s url is a potentially trustworthy URL. + // TODO - // 2. Otherwise, if byte is 0x25 (%) and the next two bytes - // after byte in input are not in the ranges - // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), - // and 0x61 (a) to 0x66 (f), all inclusive, append byte - // to output. - } else if ( - byte === 0x25 && - !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2])) - ) { - output.push(0x25); + // 2. Let header be a Structured Header whose value is a token. + let header = null; - // 3. Otherwise: - } else { - // 1. Let bytePoint be the two bytes after byte in input, - // decoded, and then interpreted as hexadecimal number. - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); - const bytePoint = Number.parseInt(nextTwoBytes, 16); + // 3. Set header’s value to r’s mode. + header = httpRequest.mode; - // 2. Append a byte whose value is bytePoint to output. - output.push(bytePoint); + // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. + httpRequest.headersList.set('sec-fetch-mode', header, true); - // 3. Skip the next two bytes in input. - i += 2; - } - } + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header + // TODO - // 3. Return output. - return Uint8Array.from(output) + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header + // TODO } - // https://mimesniff.spec.whatwg.org/#parse-a-mime-type - /** @param {string} input */ - function parseMIMEType (input) { - // 1. Remove any leading and trailing HTTP whitespace - // from input. - input = removeHTTPWhitespace(input, true, true); + // https://fetch.spec.whatwg.org/#append-a-request-origin-header + function appendRequestOriginHeader (request) { + // 1. Let serializedOrigin be the result of byte-serializing a request origin + // with request. + // TODO: implement "byte-serializing a request origin" + let serializedOrigin = request.origin; - // 2. Let position be a position variable for input, - // initially pointing at the start of input. - const position = { position: 0 }; + // - "'client' is changed to an origin during fetching." + // This doesn't happen in undici (in most cases) because undici, by default, + // has no concept of origin. + // - request.origin can also be set to request.client.origin (client being + // an environment settings object), which is undefined without using + // setGlobalOrigin. + if (serializedOrigin === 'client' || serializedOrigin === undefined) { + return + } - // 3. Let type be the result of collecting a sequence - // of code points that are not U+002F (/) from - // input, given position. - const type = collectASequenceOfCodePointsFast( - '/', - input, - position - ); + // 2. If request’s response tainting is "cors" or request’s mode is "websocket", + // then append (`Origin`, serializedOrigin) to request’s header list. + // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: + if (request.responseTainting === 'cors' || request.mode === 'websocket') { + request.headersList.append('origin', serializedOrigin, true); + } else if (request.method !== 'GET' && request.method !== 'HEAD') { + // 1. Switch on request’s referrer policy: + switch (request.referrerPolicy) { + case 'no-referrer': + // Set serializedOrigin to `null`. + serializedOrigin = null; + break + case 'no-referrer-when-downgrade': + case 'strict-origin': + case 'strict-origin-when-cross-origin': + // If request’s origin is a tuple origin, its scheme is "https", and + // request’s current URL’s scheme is not "https", then set + // serializedOrigin to `null`. + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break + case 'same-origin': + // If request’s origin is not same origin with request’s current URL’s + // origin, then set serializedOrigin to `null`. + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break + // Do nothing. + } - // 4. If type is the empty string or does not solely - // contain HTTP token code points, then return failure. - // https://mimesniff.spec.whatwg.org/#http-token-code-point - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return 'failure' + // 2. Append (`Origin`, serializedOrigin) to request’s header list. + request.headersList.append('origin', serializedOrigin, true); } + } - // 5. If position is past the end of input, then return - // failure - if (position.position > input.length) { - return 'failure' + // https://w3c.github.io/hr-time/#dfn-coarsen-time + function coarsenTime (timestamp, crossOriginIsolatedCapability) { + // TODO + return timestamp + } + + // https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info + function clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + } } - // 6. Advance position by 1. (This skips past U+002F (/).) - position.position++; + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + } + } - // 7. Let subtype be the result of collecting a sequence of - // code points that are not U+003B (;) from input, given - // position. - let subtype = collectASequenceOfCodePointsFast( - ';', - input, - position - ); + // https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time + function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { + return coarsenTime(performance.now()) + } - // 8. Remove any trailing HTTP whitespace from subtype. - subtype = removeHTTPWhitespace(subtype, false, true); + // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info + function createOpaqueTimingInfo (timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + } + } - // 9. If subtype is the empty string or does not solely - // contain HTTP token code points, then return failure. - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return 'failure' + // https://html.spec.whatwg.org/multipage/origin.html#policy-container + function makePolicyContainer () { + // Note: the fetch spec doesn't make use of embedder policy or CSP list + return { + referrerPolicy: 'strict-origin-when-cross-origin' } + } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); + // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container + function clonePolicyContainer (policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + } + } - // 10. Let mimeType be a new MIME type record whose type - // is type, in ASCII lowercase, and subtype is subtype, - // in ASCII lowercase. - // https://mimesniff.spec.whatwg.org/#mime-type - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map} */ - parameters: new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - }; + // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer + function determineRequestsReferrer (request) { + // 1. Let policy be request's referrer policy. + const policy = request.referrerPolicy; - // 11. While position is not past the end of input: - while (position.position < input.length) { - // 1. Advance position by 1. (This skips past U+003B (;).) - position.position++; + // Note: policy cannot (shouldn't) be null or an empty string. + assert(policy); - // 2. Collect a sequence of code points that are HTTP - // whitespace from input given position. - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - char => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ); + // 2. Let environment be request’s client. - // 3. Let parameterName be the result of collecting a - // sequence of code points that are not U+003B (;) - // or U+003D (=) from input, given position. - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ';' && char !== '=', - input, - position - ); + let referrerSource = null; - // 4. Set parameterName to parameterName, in ASCII - // lowercase. - parameterName = parameterName.toLowerCase(); + // 3. Switch on request’s referrer: + if (request.referrer === 'client') { + // Note: node isn't a browser and doesn't implement document/iframes, + // so we bypass this step and replace it with our own. - // 5. If position is not past the end of input, then: - if (position.position < input.length) { - // 1. If the code point at position within input is - // U+003B (;), then continue. - if (input[position.position] === ';') { - continue - } + const globalOrigin = getGlobalOrigin(); - // 2. Advance position by 1. (This skips past U+003D (=).) - position.position++; + if (!globalOrigin || globalOrigin.origin === 'null') { + return 'no-referrer' } - // 6. If position is past the end of input, then break. - if (position.position > input.length) { - break - } + // note: we need to clone it as it's mutated + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + // Let referrerSource be request’s referrer. + referrerSource = request.referrer; + } - // 7. Let parameterValue be null. - let parameterValue = null; + // 4. Let request’s referrerURL be the result of stripping referrerSource for + // use as a referrer. + let referrerURL = stripURLForReferrer(referrerSource); - // 8. If the code point at position within input is - // U+0022 ("), then: - if (input[position.position] === '"') { - // 1. Set parameterValue to the result of collecting - // an HTTP quoted string from input, given position - // and the extract-value flag. - parameterValue = collectAnHTTPQuotedString(input, position, true); + // 5. Let referrerOrigin be the result of stripping referrerSource for use as + // a referrer, with the origin-only flag set to true. + const referrerOrigin = stripURLForReferrer(referrerSource, true); - // 2. Collect a sequence of code points that are not - // U+003B (;) from input, given position. - collectASequenceOfCodePointsFast( - ';', - input, - position - ); + // 6. If the result of serializing referrerURL is a string whose length is + // greater than 4096, set referrerURL to referrerOrigin. + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } - // 9. Otherwise: - } else { - // 1. Set parameterValue to the result of collecting - // a sequence of code points that are not U+003B (;) - // from input, given position. - parameterValue = collectASequenceOfCodePointsFast( - ';', - input, - position - ); + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && + !isURLPotentiallyTrustworthy(request.url); - // 2. Remove any trailing HTTP whitespace from parameterValue. - parameterValue = removeHTTPWhitespace(parameterValue, false, true); + // 8. Execute the switch statements corresponding to the value of policy: + switch (policy) { + case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) + case 'unsafe-url': return referrerURL + case 'same-origin': + return areSameOrigin ? referrerOrigin : 'no-referrer' + case 'origin-when-cross-origin': + return areSameOrigin ? referrerURL : referrerOrigin + case 'strict-origin-when-cross-origin': { + const currentURL = requestCurrentURL(request); - // 3. If parameterValue is the empty string, then continue. - if (parameterValue.length === 0) { - continue + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL } - } - // 10. If all of the following are true - // - parameterName is not the empty string - // - parameterName solely contains HTTP token code points - // - parameterValue solely contains HTTP quoted-string token code points - // - mimeType’s parameters[parameterName] does not exist - // then set mimeType’s parameters[parameterName] to parameterValue. - if ( - parameterName.length !== 0 && - HTTP_TOKEN_CODEPOINTS.test(parameterName) && - (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && - !mimeType.parameters.has(parameterName) - ) { - mimeType.parameters.set(parameterName, parameterValue); + // 2. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } + + // 3. Return referrerOrigin. + return referrerOrigin } - } + case 'strict-origin': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case 'no-referrer-when-downgrade': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ - // 12. Return mimeType. - return mimeType + default: // eslint-disable-line + return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + } } - // https://infra.spec.whatwg.org/#forgiving-base64-decode - /** @param {string} data */ - function forgivingBase64 (data) { - // 1. Remove all ASCII whitespace from data. - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ''); // eslint-disable-line + /** + * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url + * @param {URL} url + * @param {boolean|undefined} originOnly + */ + function stripURLForReferrer (url, originOnly) { + // 1. Assert: url is a URL. + assert(url instanceof URL); - // 2. If data’s code point length divides by 4 leaving - // no remainder, then: - if (data.length % 4 === 0) { - // 1. If data ends with one or two U+003D (=) code points, - // then remove them from data. - data = data.replace(/=?=$/, ''); - } + url = new URL(url); - // 3. If data’s code point length divides by 4 leaving - // a remainder of 1, then return failure. - if (data.length % 4 === 1) { - return 'failure' + // 2. If url’s scheme is a local scheme, then return no referrer. + if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { + return 'no-referrer' } - // 4. If data contains a code point that is not one of - // U+002B (+) - // U+002F (/) - // ASCII alphanumeric - // then return failure. - if (/[^+/0-9A-Za-z]/.test(data)) { - return 'failure' - } + // 3. Set url’s username to the empty string. + url.username = ''; + + // 4. Set url’s password to the empty string. + url.password = ''; + + // 5. Set url’s fragment to null. + url.hash = ''; - const binary = atob(data); - const bytes = new Uint8Array(binary.length); + // 6. If the origin-only flag is true, then: + if (originOnly) { + // 1. Set url’s path to « the empty string ». + url.pathname = ''; - for (let byte = 0; byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte); + // 2. Set url’s query to null. + url.search = ''; } - return bytes + // 7. Return url. + return url } - // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string - // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string - /** - * @param {string} input - * @param {{ position: number }} position - * @param {boolean?} extractValue - */ - function collectAnHTTPQuotedString (input, position, extractValue) { - // 1. Let positionStart be position. - const positionStart = position.position; + function isURLPotentiallyTrustworthy (url) { + if (!(url instanceof URL)) { + return false + } - // 2. Let value be the empty string. - let value = ''; + // If child of about, return true + if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + return true + } - // 3. Assert: the code point at position within input - // is U+0022 ("). - assert(input[position.position] === '"'); + // If scheme is data, return true + if (url.protocol === 'data:') return true - // 4. Advance position by 1. - position.position++; + // If file, return true + if (url.protocol === 'file:') return true - // 5. While true: - while (true) { - // 1. Append the result of collecting a sequence of code points - // that are not U+0022 (") or U+005C (\) from input, given - // position, to value. - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== '\\', - input, - position - ); + return isOriginPotentiallyTrustworthy(url.origin) - // 2. If position is past the end of input, then break. - if (position.position >= input.length) { - break + function isOriginPotentiallyTrustworthy (origin) { + // If origin is explicitly null, return false + if (origin == null || origin === 'null') return false + + const originAsURL = new URL(origin); + + // If secure, return true + if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { + return true } - // 3. Let quoteOrBackslash be the code point at position within - // input. - const quoteOrBackslash = input[position.position]; + // If localhost or variants, return true + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || + (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || + (originAsURL.hostname.endsWith('.localhost'))) { + return true + } - // 4. Advance position by 1. - position.position++; + // If any other, return false + return false + } + } - // 5. If quoteOrBackslash is U+005C (\), then: - if (quoteOrBackslash === '\\') { - // 1. If position is past the end of input, then append - // U+005C (\) to value and break. - if (position.position >= input.length) { - value += '\\'; - break - } + /** + * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist + * @param {Uint8Array} bytes + * @param {string} metadataList + */ + function bytesMatch (bytes, metadataList) { + // If node is not built with OpenSSL support, we cannot check + // a request's integrity, so allow it by default (the spec will + // allow requests if an invalid hash is given, as precedence). + /* istanbul ignore if: only if node is built with --without-ssl */ + if (crypto === undefined) { + return true + } - // 2. Append the code point at position within input to value. - value += input[position.position]; + // 1. Let parsedMetadata be the result of parsing metadataList. + const parsedMetadata = parseMetadata(metadataList); - // 3. Advance position by 1. - position.position++; + // 2. If parsedMetadata is no metadata, return true. + if (parsedMetadata === 'no metadata') { + return true + } - // 6. Otherwise: - } else { - // 1. Assert: quoteOrBackslash is U+0022 ("). - assert(quoteOrBackslash === '"'); + // 3. If response is not eligible for integrity validation, return false. + // TODO - // 2. Break. - break - } + // 4. If parsedMetadata is the empty set, return true. + if (parsedMetadata.length === 0) { + return true } - // 6. If the extract-value flag is set, then return value. - if (extractValue) { - return value + // 5. Let metadata be the result of getting the strongest + // metadata from parsedMetadata. + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + + // 6. For each item in metadata: + for (const item of metadata) { + // 1. Let algorithm be the alg component of item. + const algorithm = item.algo; + + // 2. Let expectedValue be the val component of item. + const expectedValue = item.hash; + + // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e + // "be liberal with padding". This is annoying, and it's not even in the spec. + + // 3. Let actualValue be the result of applying algorithm to bytes. + let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64'); + + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); + } + } + + // 4. If actualValue is a case-sensitive match for expectedValue, + // return true. + if (compareBase64Mixed(actualValue, expectedValue)) { + return true + } } - // 7. Return the code points from positionStart to position, - // inclusive, within input. - return input.slice(positionStart, position.position) + // 7. Return false. + return false } + // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options + // https://www.w3.org/TR/CSP2/#source-list-syntax + // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 + const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + /** - * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type + * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata + * @param {string} metadata */ - function serializeAMimeType (mimeType) { - assert(mimeType !== 'failure'); - const { parameters, essence } = mimeType; - - // 1. Let serialization be the concatenation of mimeType’s - // type, U+002F (/), and mimeType’s subtype. - let serialization = essence; + function parseMetadata (metadata) { + // 1. Let result be the empty set. + /** @type {{ algo: string, hash: string }[]} */ + const result = []; - // 2. For each name → value of mimeType’s parameters: - for (let [name, value] of parameters.entries()) { - // 1. Append U+003B (;) to serialization. - serialization += ';'; + // 2. Let empty be equal to true. + let empty = true; - // 2. Append name to serialization. - serialization += name; + // 3. For each token returned by splitting metadata on spaces: + for (const token of metadata.split(' ')) { + // 1. Set empty to false. + empty = false; - // 3. Append U+003D (=) to serialization. - serialization += '='; + // 2. Parse token as a hash-with-options. + const parsedToken = parseHashWithOptions.exec(token); - // 4. If value does not solely contain HTTP token code - // points or value is the empty string, then: - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - // 1. Precede each occurence of U+0022 (") or - // U+005C (\) in value with U+005C (\). - value = value.replace(/(\\|")/g, '\\$1'); + // 3. If token does not parse, continue to the next token. + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { + // Note: Chromium blocks the request at this point, but Firefox + // gives a warning that an invalid integrity was given. The + // correct behavior is to ignore these, and subsequently not + // check the integrity of the resource. + continue + } - // 2. Prepend U+0022 (") to value. - value = '"' + value; + // 4. Let algorithm be the hash-algo component of token. + const algorithm = parsedToken.groups.algo.toLowerCase(); - // 3. Append U+0022 (") to value. - value += '"'; + // 5. If algorithm is a hash function recognized by the user + // agent, add the parsed token to result. + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); } + } - // 5. Append value to serialization. - serialization += value; + // 4. Return no metadata if empty is true, otherwise return result. + if (empty === true) { + return 'no metadata' } - // 3. Return serialization. - return serialization + return result } /** - * @see https://fetch.spec.whatwg.org/#http-whitespace - * @param {string} char + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList */ - function isHTTPWhiteSpace (char) { - return char === '\r' || char === '\n' || char === '\t' || char === ' ' - } + function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo; + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } - /** - * @see https://fetch.spec.whatwg.org/#http-whitespace - * @param {string} str - */ - function removeHTTPWhitespace (str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512'; + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384'; + } + } + return algorithm + } - if (leading) { - for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++); + function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList } - if (trailing) { - for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--); + let pos = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } } - return str.slice(lead, trail + 1) + metadataList.length = pos; + + return metadataList } /** - * @see https://infra.spec.whatwg.org/#ascii-whitespace - * @param {string} char + * Compares two base64 strings, allowing for base64url + * in the second string. + * + * @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} */ - function isASCIIWhitespace (char) { - return char === '\r' || char === '\n' || char === '\t' || char === '\f' || char === ' ' + function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true + } + + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request + function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { + // TODO } /** - * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} + * @param {URL} A + * @param {URL} B */ - function removeASCIIWhitespace (str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - - if (leading) { - for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++); + function sameOrigin (A, B) { + // 1. If A and B are the same opaque origin, then return true. + if (A.origin === B.origin && A.origin === 'null') { + return true } - if (trailing) { - for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--); + // 2. If A and B are both tuple origins and their schemes, + // hosts, and port are identical, then return true. + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true } - return str.slice(lead, trail + 1) + // 3. Return false. + return false } - dataURL = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType - }; - return dataURL; -} + function createDeferredPromise () { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); -var file$1; -var hasRequiredFile$1; + return { promise, resolve: res, reject: rej } + } -function requireFile$1 () { - if (hasRequiredFile$1) return file$1; - hasRequiredFile$1 = 1; + function isAborted (fetchParams) { + return fetchParams.controller.state === 'aborted' + } - const { Blob, File: NativeFile } = require$$7; - const { types } = require$$0__default; - const { kState } = requireSymbols$3(); - const { isBlobLike } = requireUtil$7(); - const { webidl } = requireWebidl(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - const { kEnumerableProperty } = requireUtil$8(); - const encoder = new TextEncoder(); + function isCancelled (fetchParams) { + return fetchParams.controller.state === 'aborted' || + fetchParams.controller.state === 'terminated' + } - class File extends Blob { - constructor (fileBits, fileName, options = {}) { - // The File constructor is invoked with two or three parameters, depending - // on whether the optional dictionary parameter is used. When the File() - // constructor is invoked, user agents must run the following steps: - webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' }); + /** + * @see https://fetch.spec.whatwg.org/#concept-method-normalize + * @param {string} method + */ + function normalizeMethod (method) { + return normalizedMethodRecordsBase[method.toLowerCase()] ?? method + } - fileBits = webidl.converters['sequence'](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); + // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string + function serializeJavascriptValueToJSONString (value) { + // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). + const result = JSON.stringify(value); - // 1. Let bytes be the result of processing blob parts given fileBits and - // options. - // Note: Blob handles this for us + // 2. If result is undefined, then throw a TypeError. + if (result === undefined) { + throw new TypeError('Value is not JSON serializable') + } - // 2. Let n be the fileName argument to the constructor. - const n = fileName; + // 3. Assert: result is a string. + assert(typeof result === 'string'); - // 3. Process FilePropertyBag dictionary argument by running the following - // substeps: + // 4. Return result. + return result + } - // 1. If the type member is provided and is not the empty string, let t - // be set to the type dictionary member. If t contains any characters - // outside the range U+0020 to U+007E, then set t to the empty string - // and return from these substeps. - // 2. Convert every character in t to ASCII lowercase. - let t = options.type; - let d; + // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object + const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - // eslint-disable-next-line no-labels - substep: { - if (t) { - t = parseMIMEType(t); + /** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {string} name name of the instance + * @param {symbol} kInternalIterator + * @param {string | number} [keyIndex] + * @param {string | number} [valueIndex] + */ + function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target + /** @type {'key' | 'value' | 'key+value'} */ + #kind + /** @type {number} */ + #index - if (t === 'failure') { - t = ''; - // eslint-disable-next-line no-labels - break substep - } + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor (target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; + } - t = serializeAMimeType(t).toLowerCase(); + next () { + // 1. Let interface be the interface for which the iterator prototype object exists. + // 2. Let thisValue be the this value. + // 3. Let object be ? ToObject(thisValue). + // 4. If object is a platform object, then perform a security + // check, passing: + // 5. If object is not a default iterator object for interface, + // then throw a TypeError. + if (typeof this !== 'object' || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ) } - // 3. If the lastModified member is provided, let d be set to the - // lastModified dictionary member. If it is not provided, set d to the - // current date and time represented as the number of milliseconds since - // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). - d = options.lastModified; - } + // 6. Let index be object’s index. + // 7. Let kind be object’s kind. + // 8. Let values be object’s target's value pairs to iterate over. + const index = this.#index; + const values = this.#target[kInternalIterator]; - // 4. Return a new File object F such that: - // F refers to the bytes byte sequence. - // F.size is set to the number of total bytes in bytes. - // F.name is set to n. - // F.type is set to t. - // F.lastModified is set to d. + // 9. Let len be the length of values. + const len = values.length; - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } + // 10. If index is greater than or equal to len, then return + // CreateIterResultObject(undefined, true). + if (index >= len) { + return { + value: undefined, + done: true + } + } - get name () { - webidl.brandCheck(this, File); + // 11. Let pair be the entry in values at index index. + const { [keyIndex]: key, [valueIndex]: value } = values[index]; - return this[kState].name - } + // 12. Set object’s index to index + 1. + this.#index = index + 1; - get lastModified () { - webidl.brandCheck(this, File); + // 13. Return the iterator result for pair and kind. - return this[kState].lastModified + // https://webidl.spec.whatwg.org/#iterator-result + + // 1. Let result be a value determined by the value of kind: + let result; + switch (this.#kind) { + case 'key': + // 1. Let idlKey be pair’s key. + // 2. Let key be the result of converting idlKey to an + // ECMAScript value. + // 3. result is key. + result = key; + break + case 'value': + // 1. Let idlValue be pair’s value. + // 2. Let value be the result of converting idlValue to + // an ECMAScript value. + // 3. result is value. + result = value; + break + case 'key+value': + // 1. Let idlKey be pair’s key. + // 2. Let idlValue be pair’s value. + // 3. Let key be the result of converting idlKey to an + // ECMAScript value. + // 4. Let value be the result of converting idlValue to + // an ECMAScript value. + // 5. Let array be ! ArrayCreate(2). + // 6. Call ! CreateDataProperty(array, "0", key). + // 7. Call ! CreateDataProperty(array, "1", value). + // 8. result is array. + result = [key, value]; + break + } + + // 2. Return CreateIterResultObject(result, false). + return { + value: result, + done: false + } + } } - get type () { - webidl.brandCheck(this, File); + // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + // @ts-ignore + delete FastIterableIterator.prototype.constructor; - return this[kState].type + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); + + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + + /** + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + * @returns {IterableIterator} + */ + return function (target, kind) { + return new FastIterableIterator(target, kind) } } - class FileLike { - constructor (blobLike, fileName, options = {}) { - // TODO: argument idl type check - - // The File constructor is invoked with two or three parameters, depending + /** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {string} name name of the instance + * @param {any} object class + * @param {symbol} kInternalIterator + * @param {string | number} [keyIndex] + * @param {string | number} [valueIndex] + */ + function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); + + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys () { + webidl.brandCheck(this, object); + return makeIterator(this, 'key') + } + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values () { + webidl.brandCheck(this, object); + return makeIterator(this, 'value') + } + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries () { + webidl.brandCheck(this, object); + return makeIterator(this, 'key+value') + } + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach (callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`); + if (typeof callbackfn !== 'function') { + throw new TypeError( + `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` + ) + } + for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) { + callbackfn.call(thisArg, value, key, this); + } + } + } + }; + + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value + } + }) + } + + /** + * @see https://fetch.spec.whatwg.org/#body-fully-read + */ + async function fullyReadBody (body, processBody, processBodyError) { + // 1. If taskDestination is null, then set taskDestination to + // the result of starting a new parallel queue. + + // 2. Let successSteps given a byte sequence bytes be to queue a + // fetch task to run processBody given bytes, with taskDestination. + const successSteps = processBody; + + // 3. Let errorSteps be to queue a fetch task to run processBodyError, + // with taskDestination. + const errorSteps = processBodyError; + + // 4. Let reader be the result of getting a reader for body’s stream. + // If that threw an exception, then run errorSteps with that + // exception and return. + let reader; + + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return + } + + // 5. Read all bytes from reader, given successSteps and errorSteps. + try { + successSteps(await readAllBytes(reader)); + } catch (e) { + errorSteps(e); + } + } + + function isReadableStreamLike (stream) { + return stream instanceof ReadableStream || ( + stream[Symbol.toStringTag] === 'ReadableStream' && + typeof stream.tee === 'function' + ) + } + + /** + * @param {ReadableStreamController} controller + */ + function readableStreamClose (controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + // TODO: add comment explaining why this error occurs. + if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) { + throw err + } + } + } + + const invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; // eslint-disable-line + + /** + * @see https://infra.spec.whatwg.org/#isomorphic-encode + * @param {string} input + */ + function isomorphicEncode (input) { + // 1. Assert: input contains no code points greater than U+00FF. + assert(!invalidIsomorphicEncodeValueRegex.test(input)); + + // 2. Return a byte sequence whose length is equal to input’s code + // point length and whose bytes have the same values as the + // values of input’s code points, in the same order + return input + } + + /** + * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes + * @see https://streams.spec.whatwg.org/#read-loop + * @param {ReadableStreamDefaultReader} reader + */ + async function readAllBytes (reader) { + const bytes = []; + let byteLength = 0; + + while (true) { + const { done, value: chunk } = await reader.read(); + + if (done) { + // 1. Call successSteps with bytes. + return Buffer.concat(bytes, byteLength) + } + + // 1. If chunk is not a Uint8Array object, call failureSteps + // with a TypeError and abort these steps. + if (!isUint8Array(chunk)) { + throw new TypeError('Received non-Uint8Array chunk') + } + + // 2. Append the bytes represented by chunk to bytes. + bytes.push(chunk); + byteLength += chunk.length; + + // 3. Read-loop given reader, bytes, successSteps, and failureSteps. + } + } + + /** + * @see https://fetch.spec.whatwg.org/#is-local + * @param {URL} url + */ + function urlIsLocal (url) { + assert('protocol' in url); // ensure it's a url object + + const protocol = url.protocol; + + return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' + } + + /** + * @param {string|URL} url + * @returns {boolean} + */ + function urlHasHttpsScheme (url) { + return ( + ( + typeof url === 'string' && + url[5] === ':' && + url[0] === 'h' && + url[1] === 't' && + url[2] === 't' && + url[3] === 'p' && + url[4] === 's' + ) || + url.protocol === 'https:' + ) + } + + /** + * @see https://fetch.spec.whatwg.org/#http-scheme + * @param {URL} url + */ + function urlIsHttpHttpsScheme (url) { + assert('protocol' in url); // ensure it's a url object + + const protocol = url.protocol; + + return protocol === 'http:' || protocol === 'https:' + } + + /** + * @see https://fetch.spec.whatwg.org/#simple-range-header-value + * @param {string} value + * @param {boolean} allowWhitespace + */ + function simpleRangeHeaderValue (value, allowWhitespace) { + // 1. Let data be the isomorphic decoding of value. + // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string, + // nothing more. We obviously don't need to do that if value is a string already. + const data = value; + + // 2. If data does not start with "bytes", then return failure. + if (!data.startsWith('bytes')) { + return 'failure' + } + + // 3. Let position be a position variable for data, initially pointing at the 5th code point of data. + const position = { position: 5 }; + + // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, + // from data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 5. If the code point at position within data is not U+003D (=), then return failure. + if (data.charCodeAt(position.position) !== 0x3D) { + return 'failure' + } + + // 6. Advance position by 1. + position.position++; + + // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from + // data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits, + // from data given position. + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + + return code >= 0x30 && code <= 0x39 + }, + data, + position + ); + + // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the + // empty string; otherwise null. + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + + // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, + // from data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 11. If the code point at position within data is not U+002D (-), then return failure. + if (data.charCodeAt(position.position) !== 0x2D) { + return 'failure' + } + + // 12. Advance position by 1. + position.position++; + + // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab + // or space, from data given position. + // Note from Khafra: its the same step as in #8 again lol + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 14. Let rangeEnd be the result of collecting a sequence of code points that are + // ASCII digits, from data given position. + // Note from Khafra: you wouldn't guess it, but this is also the same step as #8 + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + + return code >= 0x30 && code <= 0x39 + }, + data, + position + ); + + // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd + // is not the empty string; otherwise null. + // Note from Khafra: THE SAME STEP, AGAIN!!! + // Note: why interpret as a decimal if we only collect ascii digits? + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + + // 16. If position is not past the end of data, then return failure. + if (position.position < data.length) { + return 'failure' + } + + // 17. If rangeEndValue and rangeStartValue are null, then return failure. + if (rangeEndValue === null && rangeStartValue === null) { + return 'failure' + } + + // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is + // greater than rangeEndValue, then return failure. + // Note: ... when can they not be numbers? + if (rangeStartValue > rangeEndValue) { + return 'failure' + } + + // 19. Return (rangeStartValue, rangeEndValue). + return { rangeStartValue, rangeEndValue } + } + + /** + * @see https://fetch.spec.whatwg.org/#build-a-content-range + * @param {number} rangeStart + * @param {number} rangeEnd + * @param {number} fullLength + */ + function buildContentRange (rangeStart, rangeEnd, fullLength) { + // 1. Let contentRange be `bytes `. + let contentRange = 'bytes '; + + // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange. + contentRange += isomorphicEncode(`${rangeStart}`); + + // 3. Append 0x2D (-) to contentRange. + contentRange += '-'; + + // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange. + contentRange += isomorphicEncode(`${rangeEnd}`); + + // 5. Append 0x2F (/) to contentRange. + contentRange += '/'; + + // 6. Append fullLength, serialized and isomorphic encoded to contentRange. + contentRange += isomorphicEncode(`${fullLength}`); + + // 7. Return contentRange. + return contentRange + } + + // A Stream, which pipes the response to zlib.createInflate() or + // zlib.createInflateRaw() depending on the first byte of the Buffer. + // If the lower byte of the first byte is 0x08, then the stream is + // interpreted as a zlib stream, otherwise it's interpreted as a + // raw deflate stream. + class InflateStream extends Transform { + #zlibOptions + + /** @param {zlib.ZlibOptions} [zlibOptions] */ + constructor (zlibOptions) { + super(); + this.#zlibOptions = zlibOptions; + } + + _transform (chunk, encoding, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return + } + this._inflateStream = (chunk[0] & 0x0F) === 0x08 + ? zlib.createInflate(this.#zlibOptions) + : zlib.createInflateRaw(this.#zlibOptions); + + this._inflateStream.on('data', this.push.bind(this)); + this._inflateStream.on('end', () => this.push(null)); + this._inflateStream.on('error', (err) => this.destroy(err)); + } + + this._inflateStream.write(chunk, encoding, callback); + } + + _final (callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; + } + callback(); + } + } + + /** + * @param {zlib.ZlibOptions} [zlibOptions] + * @returns {InflateStream} + */ + function createInflate (zlibOptions) { + return new InflateStream(zlibOptions) + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type + * @param {import('./headers').HeadersList} headers + */ + function extractMimeType (headers) { + // 1. Let charset be null. + let charset = null; + + // 2. Let essence be null. + let essence = null; + + // 3. Let mimeType be null. + let mimeType = null; + + // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers. + const values = getDecodeSplit('content-type', headers); + + // 5. If values is null, then return failure. + if (values === null) { + return 'failure' + } + + // 6. For each value of values: + for (const value of values) { + // 6.1. Let temporaryMimeType be the result of parsing value. + const temporaryMimeType = parseMIMEType(value); + + // 6.2. If temporaryMimeType is failure or its essence is "*/*", then continue. + if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') { + continue + } + + // 6.3. Set mimeType to temporaryMimeType. + mimeType = temporaryMimeType; + + // 6.4. If mimeType’s essence is not essence, then: + if (mimeType.essence !== essence) { + // 6.4.1. Set charset to null. + charset = null; + + // 6.4.2. If mimeType’s parameters["charset"] exists, then set charset to + // mimeType’s parameters["charset"]. + if (mimeType.parameters.has('charset')) { + charset = mimeType.parameters.get('charset'); + } + + // 6.4.3. Set essence to mimeType’s essence. + essence = mimeType.essence; + } else if (!mimeType.parameters.has('charset') && charset !== null) { + // 6.5. Otherwise, if mimeType’s parameters["charset"] does not exist, and + // charset is non-null, set mimeType’s parameters["charset"] to charset. + mimeType.parameters.set('charset', charset); + } + } + + // 7. If mimeType is null, then return failure. + if (mimeType == null) { + return 'failure' + } + + // 8. Return mimeType. + return mimeType + } + + /** + * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split + * @param {string|null} value + */ + function gettingDecodingSplitting (value) { + // 1. Let input be the result of isomorphic decoding value. + const input = value; + + // 2. Let position be a position variable for input, initially pointing at the start of input. + const position = { position: 0 }; + + // 3. Let values be a list of strings, initially empty. + const values = []; + + // 4. Let temporaryValue be the empty string. + let temporaryValue = ''; + + // 5. While position is not past the end of input: + while (position.position < input.length) { + // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (") + // or U+002C (,) from input, given position, to temporaryValue. + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ',', + input, + position + ); + + // 5.2. If position is not past the end of input, then: + if (position.position < input.length) { + // 5.2.1. If the code point at position within input is U+0022 ("), then: + if (input.charCodeAt(position.position) === 0x22) { + // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue. + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + + // 5.2.1.2. If position is not past the end of input, then continue. + if (position.position < input.length) { + continue + } + } else { + // 5.2.2. Otherwise: + + // 5.2.2.1. Assert: the code point at position within input is U+002C (,). + assert(input.charCodeAt(position.position) === 0x2C); + + // 5.2.2.2. Advance position by 1. + position.position++; + } + } + + // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue. + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20); + + // 5.4. Append temporaryValue to values. + values.push(temporaryValue); + + // 5.6. Set temporaryValue to the empty string. + temporaryValue = ''; + } + + // 6. Return values. + return values + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split + * @param {string} name lowercase header name + * @param {import('./headers').HeadersList} list + */ + function getDecodeSplit (name, list) { + // 1. Let value be the result of getting name from list. + const value = list.get(name, true); + + // 2. If value is null, then return null. + if (value === null) { + return null + } + + // 3. Return the result of getting, decoding, and splitting value. + return gettingDecodingSplitting(value) + } + + const textDecoder = new TextDecoder(); + + /** + * @see https://encoding.spec.whatwg.org/#utf-8-decode + * @param {Buffer} buffer + */ + function utf8DecodeBytes (buffer) { + if (buffer.length === 0) { + return '' + } + + // 1. Let buffer be the result of peeking three bytes from + // ioQueue, converted to a byte sequence. + + // 2. If buffer is 0xEF 0xBB 0xBF, then read three + // bytes from ioQueue. (Do nothing with those bytes.) + if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { + buffer = buffer.subarray(3); + } + + // 3. Process a queue with an instance of UTF-8’s + // decoder, ioQueue, output, and "replacement". + const output = textDecoder.decode(buffer); + + // 4. Return output. + return output + } + + class EnvironmentSettingsObjectBase { + get baseUrl () { + return getGlobalOrigin() + } + + get origin () { + return this.baseUrl?.origin + } + + policyContainer = makePolicyContainer() + } + + class EnvironmentSettingsObject { + settingsObject = new EnvironmentSettingsObjectBase() + } + + const environmentSettingsObject = new EnvironmentSettingsObject(); + + util$g = { + isAborted, + isCancelled, + isValidEncodedURL, + createDeferredPromise, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + simpleRangeHeaderValue, + buildContentRange, + parseMetadata, + createInflate, + extractMimeType, + getDecodeSplit, + utf8DecodeBytes, + environmentSettingsObject + }; + return util$g; +} + +var symbols$8; +var hasRequiredSymbols$8; + +function requireSymbols$8 () { + if (hasRequiredSymbols$8) return symbols$8; + hasRequiredSymbols$8 = 1; + + symbols$8 = { + kUrl: Symbol('url'), + kHeaders: Symbol('headers'), + kSignal: Symbol('signal'), + kState: Symbol('state'), + kDispatcher: Symbol('dispatcher') + }; + return symbols$8; +} + +var file$2; +var hasRequiredFile$2; + +function requireFile$2 () { + if (hasRequiredFile$2) return file$2; + hasRequiredFile$2 = 1; + + const { Blob, File } = require$$0$6; + const { kState } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + + // TODO(@KhafraDev): remove + class FileLike { + constructor (blobLike, fileName, options = {}) { + // TODO: argument idl type check + + // The File constructor is invoked with two or three parameters, depending // on whether the optional dictionary parameter is used. When the File() // constructor is invoked, user agents must run the following steps: @@ -6378,145 +7615,15 @@ function requireFile$1 () { } } - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: 'File', - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob); - webidl.converters.BlobPart = function (V, opts) { - if (webidl.util.Type(V) === 'Object') { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) - } - - if ( - ArrayBuffer.isView(V) || - types.isAnyArrayBuffer(V) - ) { - return webidl.converters.BufferSource(V, opts) - } - } - - return webidl.converters.USVString(V, opts) - }; - - webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.BlobPart - ); - - // https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: 'lastModified', - converter: webidl.converters['long long'], - get defaultValue () { - return Date.now() - } - }, - { - key: 'type', - converter: webidl.converters.DOMString, - defaultValue: '' - }, - { - key: 'endings', - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - - if (value !== 'native') { - value = 'transparent'; - } - - return value - }, - defaultValue: 'transparent' - } - ]); - - /** - * @see https://www.w3.org/TR/FileAPI/#process-blob-parts - * @param {(NodeJS.TypedArray|Blob|string)[]} parts - * @param {{ type: string, endings: string }} options - */ - function processBlobParts (parts, options) { - // 1. Let bytes be an empty sequence of bytes. - /** @type {NodeJS.TypedArray[]} */ - const bytes = []; - - // 2. For each element in parts: - for (const element of parts) { - // 1. If element is a USVString, run the following substeps: - if (typeof element === 'string') { - // 1. Let s be element. - let s = element; - - // 2. If the endings member of options is "native", set s - // to the result of converting line endings to native - // of element. - if (options.endings === 'native') { - s = convertLineEndingsNative(s); - } - - // 3. Append the result of UTF-8 encoding s to bytes. - bytes.push(encoder.encode(s)); - } else if ( - types.isAnyArrayBuffer(element) || - types.isTypedArray(element) - ) { - // 2. If element is a BufferSource, get a copy of the - // bytes held by the buffer source, and append those - // bytes to bytes. - if (!element.buffer) { // ArrayBuffer - bytes.push(new Uint8Array(element)); - } else { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ); - } - } else if (isBlobLike(element)) { - // 3. If element is a Blob, append the bytes it represents - // to bytes. - bytes.push(element); - } - } - - // 3. Return bytes. - return bytes - } - - /** - * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native - * @param {string} s - */ - function convertLineEndingsNative (s) { - // 1. Let native line ending be be the code point U+000A LF. - let nativeLineEnding = '\n'; - - // 2. If the underlying platform’s conventions are to - // represent newlines as a carriage return and line feed - // sequence, set native line ending to the code point - // U+000D CR followed by the code point U+000A LF. - if (process.platform === 'win32') { - nativeLineEnding = '\r\n'; - } - - return s.replace(/\r?\n/g, nativeLineEnding) - } - // If this function is moved to ./util.js, some tools (such as // rollup) will warn about circular dependencies. See: // https://github.com/nodejs/undici/issues/1629 function isFileLike (object) { return ( - (NativeFile && object instanceof NativeFile) || - object instanceof File || ( + (object instanceof File) || + ( object && (typeof object.stream === 'function' || typeof object.arrayBuffer === 'function') && @@ -6525,29 +7632,33 @@ function requireFile$1 () { ) } - file$1 = { File, FileLike, isFileLike }; - return file$1; + file$2 = { FileLike, isFileLike }; + return file$2; } -var formdata; -var hasRequiredFormdata; +var formdata$1; +var hasRequiredFormdata$1; -function requireFormdata () { - if (hasRequiredFormdata) return formdata; - hasRequiredFormdata = 1; +function requireFormdata$1 () { + if (hasRequiredFormdata$1) return formdata$1; + hasRequiredFormdata$1 = 1; - const { isBlobLike, toUSVString, makeIterator } = requireUtil$7(); - const { kState } = requireSymbols$3(); - const { File: UndiciFile, FileLike, isFileLike } = requireFile$1(); - const { webidl } = requireWebidl(); - const { Blob, File: NativeFile } = require$$7; + const { isBlobLike, iteratorMixin } = requireUtil$g(); + const { kState } = requireSymbols$8(); + const { kEnumerableProperty } = requireUtil$h(); + const { FileLike, isFileLike } = requireFile$2(); + const { webidl } = requireWebidl$1(); + const { File: NativeFile } = require$$0$6; + const nodeUtil = require$$0$a; /** @type {globalThis['File']} */ - const File = NativeFile ?? UndiciFile; + const File = globalThis.File ?? NativeFile; // https://xhr.spec.whatwg.org/#formdata class FormData { constructor (form) { + webidl.util.markAsUncloneable(this); + if (form !== undefined) { throw webidl.errors.conversionFailed({ prefix: 'FormData constructor', @@ -6562,7 +7673,8 @@ function requireFormdata () { append (name, value, filename = undefined) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' }); + const prefix = 'FormData.append'; + webidl.argumentLengthCheck(arguments, 2, prefix); if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( @@ -6572,12 +7684,12 @@ function requireFormdata () { // 1. Let value be value if given; otherwise blobValue. - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); value = isBlobLike(value) - ? webidl.converters.Blob(value, { strict: false }) - : webidl.converters.USVString(value); + ? webidl.converters.Blob(value, prefix, 'value', { strict: false }) + : webidl.converters.USVString(value, prefix, 'value'); filename = arguments.length === 3 - ? webidl.converters.USVString(filename) + ? webidl.converters.USVString(filename, prefix, 'filename') : undefined; // 2. Let entry be the result of creating an entry with @@ -6591,9 +7703,10 @@ function requireFormdata () { delete (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' }); + const prefix = 'FormData.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // The delete(name) method steps are to remove all entries whose name // is name from this’s entry list. @@ -6603,9 +7716,10 @@ function requireFormdata () { get (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' }); + const prefix = 'FormData.get'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // 1. If there is no entry whose name is name in this’s entry list, // then return null. @@ -6622,9 +7736,10 @@ function requireFormdata () { getAll (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' }); + const prefix = 'FormData.getAll'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // 1. If there is no entry whose name is name in this’s entry list, // then return the empty list. @@ -6638,9 +7753,10 @@ function requireFormdata () { has (name) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' }); + const prefix = 'FormData.has'; + webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); // The has(name) method steps are to return true if there is an entry // whose name is name in this’s entry list; otherwise false. @@ -6650,7 +7766,8 @@ function requireFormdata () { set (name, value, filename = undefined) { webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' }); + const prefix = 'FormData.set'; + webidl.argumentLengthCheck(arguments, 2, prefix); if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( @@ -6663,12 +7780,12 @@ function requireFormdata () { // 1. Let value be value if given; otherwise blobValue. - name = webidl.converters.USVString(name); + name = webidl.converters.USVString(name, prefix, 'name'); value = isBlobLike(value) - ? webidl.converters.Blob(value, { strict: false }) - : webidl.converters.USVString(value); + ? webidl.converters.Blob(value, prefix, 'name', { strict: false }) + : webidl.converters.USVString(value, prefix, 'name'); filename = arguments.length === 3 - ? toUSVString(filename) + ? webidl.converters.USVString(filename, prefix, 'name') : undefined; // 2. Let entry be the result of creating an entry with name, value, and @@ -6690,60 +7807,40 @@ function requireFormdata () { } } - entries () { - webidl.brandCheck(this, FormData); - - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'key+value' - ) - } - - keys () { - webidl.brandCheck(this, FormData); - - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'key' - ) - } - - values () { - webidl.brandCheck(this, FormData); - - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'value' - ) - } + [nodeUtil.inspect.custom] (depth, options) { + const state = this[kState].reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach (callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, FormData); + return a + }, { __proto__: null }); - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' }); + options.depth ??= depth; + options.colors ??= true; - if (typeof callbackFn !== 'function') { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ) - } + const output = nodeUtil.formatWithOptions(options, state); - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } + // remove [Object null prototype] + return `FormData ${output.slice(output.indexOf(']') + 2)}` } } - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; + iteratorMixin('FormData', FormData, kState, 'name', 'value'); Object.defineProperties(FormData.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, [Symbol.toStringTag]: { value: 'FormData', configurable: true @@ -6759,16 +7856,11 @@ function requireFormdata () { */ function makeEntry (name, value, filename) { // 1. Set name to the result of converting name into a scalar value string. - // "To convert a string into a scalar value string, replace any surrogates - // with U+FFFD." - // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end - name = Buffer.from(name).toString('utf8'); + // Note: This operation was done by the webidl converter USVString. // 2. If value is a string, then set value to the result of converting // value into a scalar value string. - if (typeof value === 'string') { - value = Buffer.from(value).toString('utf8'); - } else { + if (typeof value === 'string') ; else { // 3. Otherwise: // 1. If value is not a File object, then set value to a new File object, @@ -6788,7 +7880,7 @@ function requireFormdata () { lastModified: value.lastModified }; - value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile + value = value instanceof NativeFile ? new File([value], filename, options) : new FileLike(value, filename, options); } @@ -6798,40 +7890,521 @@ function requireFormdata () { return { name, value } } - formdata = { FormData }; - return formdata; + formdata$1 = { FormData, makeEntry }; + return formdata$1; } -var body; -var hasRequiredBody; +var formdataParser$1; +var hasRequiredFormdataParser$1; -function requireBody () { - if (hasRequiredBody) return body; - hasRequiredBody = 1; +function requireFormdataParser$1 () { + if (hasRequiredFormdataParser$1) return formdataParser$1; + hasRequiredFormdataParser$1 = 1; + + const { isUSVString, bufferToLowerCasedHeaderName } = requireUtil$h(); + const { utf8DecodeBytes } = requireUtil$g(); + const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = requireDataUrl$1(); + const { isFileLike } = requireFile$2(); + const { makeEntry } = requireFormdata$1(); + const assert = require$$0$7; + const { File: NodeFile } = require$$0$6; + + const File = globalThis.File ?? NodeFile; + + const formDataNameBuffer = Buffer.from('form-data; name="'); + const filenameBuffer = Buffer.from('; filename'); + const dd = Buffer.from('--'); + const ddcrlf = Buffer.from('--\r\n'); + + /** + * @param {string} chars + */ + function isAsciiString (chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & -128) !== 0) { + return false + } + } + return true + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary + * @param {string} boundary + */ + function validateBoundary (boundary) { + const length = boundary.length; + + // - its length is greater or equal to 27 and lesser or equal to 70, and + if (length < 27 || length > 70) { + return false + } + + // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or + // 0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('), + // 0x2D (-) or 0x5F (_). + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + + if (!( + (cp >= 0x30 && cp <= 0x39) || + (cp >= 0x41 && cp <= 0x5a) || + (cp >= 0x61 && cp <= 0x7a) || + cp === 0x27 || + cp === 0x2d || + cp === 0x5f + )) { + return false + } + } + + return true + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser + * @param {Buffer} input + * @param {ReturnType} mimeType + */ + function multipartFormDataParser (input, mimeType) { + // 1. Assert: mimeType’s essence is "multipart/form-data". + assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data'); + + const boundaryString = mimeType.parameters.get('boundary'); + + // 2. If mimeType’s parameters["boundary"] does not exist, return failure. + // Otherwise, let boundary be the result of UTF-8 decoding mimeType’s + // parameters["boundary"]. + if (boundaryString === undefined) { + return 'failure' + } + + const boundary = Buffer.from(`--${boundaryString}`, 'utf8'); + + // 3. Let entry list be an empty entry list. + const entryList = []; + + // 4. Let position be a pointer to a byte in input, initially pointing at + // the first byte. + const position = { position: 0 }; + + // Note: undici addition, allows leading and trailing CRLFs. + while (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { + position.position += 2; + } + + let trailing = input.length; + + while (input[trailing - 1] === 0x0a && input[trailing - 2] === 0x0d) { + trailing -= 2; + } + + if (trailing !== input.length) { + input = input.subarray(0, trailing); + } + + // 5. While true: + while (true) { + // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D + // (`--`) followed by boundary, advance position by 2 + the length of + // boundary. Otherwise, return failure. + // Note: boundary is padded with 2 dashes already, no need to add 2. + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + return 'failure' + } + + // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A + // (`--` followed by CR LF) followed by the end of input, return entry list. + // Note: a body does NOT need to end with CRLF. It can end with --. + if ( + (position.position === input.length - 2 && bufferStartsWith(input, dd, position)) || + (position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) + ) { + return entryList + } + + // 5.3. If position does not point to a sequence of bytes starting with 0x0D + // 0x0A (CR LF), return failure. + if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { + return 'failure' + } + + // 5.4. Advance position by 2. (This skips past the newline.) + position.position += 2; + + // 5.5. Let name, filename and contentType be the result of parsing + // multipart/form-data headers on input and position, if the result + // is not failure. Otherwise, return failure. + const result = parseMultipartFormDataHeaders(input, position); + + if (result === 'failure') { + return 'failure' + } + + let { name, filename, contentType, encoding } = result; + + // 5.6. Advance position by 2. (This skips past the empty line that marks + // the end of the headers.) + position.position += 2; + + // 5.7. Let body be the empty byte sequence. + let body; + + // 5.8. Body loop: While position is not past the end of input: + // TODO: the steps here are completely wrong + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + + if (boundaryIndex === -1) { + return 'failure' + } + + body = input.subarray(position.position, boundaryIndex - 4); + + position.position += body.length; + + // Note: position must be advanced by the body's length before being + // decoded, otherwise the parsing will fail. + if (encoding === 'base64') { + body = Buffer.from(body.toString(), 'base64'); + } + } + + // 5.9. If position does not point to a sequence of bytes starting with + // 0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2. + if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { + return 'failure' + } else { + position.position += 2; + } + + // 5.10. If filename is not null: + let value; + + if (filename !== null) { + // 5.10.1. If contentType is null, set contentType to "text/plain". + contentType ??= 'text/plain'; + + // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string. + + // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead. + // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`. + if (!isAsciiString(contentType)) { + contentType = ''; + } + + // 5.10.3. Let value be a new File object with name filename, type contentType, and body body. + value = new File([body], filename, { type: contentType }); + } else { + // 5.11. Otherwise: + + // 5.11.1. Let value be the UTF-8 decoding without BOM of body. + value = utf8DecodeBytes(Buffer.from(body)); + } + + // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object. + assert(isUSVString(name)); + assert((typeof value === 'string' && isUSVString(value)) || isFileLike(value)); + + // 5.13. Create an entry with name and value, and append it to entry list. + entryList.push(makeEntry(name, value, filename)); + } + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers + * @param {Buffer} input + * @param {{ position: number }} position + */ + function parseMultipartFormDataHeaders (input, position) { + // 1. Let name, filename and contentType be null. + let name = null; + let filename = null; + let contentType = null; + let encoding = null; + + // 2. While true: + while (true) { + // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF): + if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { + // 2.1.1. If name is null, return failure. + if (name === null) { + return 'failure' + } + + // 2.1.2. Return name, filename and contentType. + return { name, filename, contentType, encoding } + } + + // 2.2. Let header name be the result of collecting a sequence of bytes that are + // not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position. + let headerName = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a, + input, + position + ); + + // 2.3. Remove any HTTP tab or space bytes from the start or end of header name. + headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20); + + // 2.4. If header name does not match the field-name token production, return failure. + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + return 'failure' + } + + // 2.5. If the byte at position is not 0x3A (:), return failure. + if (input[position.position] !== 0x3a) { + return 'failure' + } + + // 2.6. Advance position by 1. + position.position++; + + // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position. + // (Do nothing with those bytes.) + collectASequenceOfBytes( + (char) => char === 0x20 || char === 0x09, + input, + position + ); + + // 2.8. Byte-lowercase header name and switch on the result: + switch (bufferToLowerCasedHeaderName(headerName)) { + case 'content-disposition': { + // 1. Set name and filename to null. + name = filename = null; + + // 2. If position does not point to a sequence of bytes starting with + // `form-data; name="`, return failure. + if (!bufferStartsWith(input, formDataNameBuffer, position)) { + return 'failure' + } + + // 3. Advance position so it points at the byte after the next 0x22 (") + // byte (the one in the sequence of bytes matched above). + position.position += 17; - const Busboy = requireMain(); - const util = requireUtil$8(); + // 4. Set name to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return + // failure. + name = parseMultipartFormDataName(input, position); + + if (name === null) { + return 'failure' + } + + // 5. If position points to a sequence of bytes starting with `; filename="`: + if (bufferStartsWith(input, filenameBuffer, position)) { + // Note: undici also handles filename* + let check = position.position + filenameBuffer.length; + + if (input[check] === 0x2a) { + position.position += 1; + check += 1; + } + + if (input[check] !== 0x3d || input[check + 1] !== 0x22) { // =" + return 'failure' + } + + // 1. Advance position so it points at the byte after the next 0x22 (") byte + // (the one in the sequence of bytes matched above). + position.position += 12; + + // 2. Set filename to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return failure. + filename = parseMultipartFormDataName(input, position); + + if (filename === null) { + return 'failure' + } + } + + break + } + case 'content-type': { + // 1. Let header value be the result of collecting a sequence of bytes that are + // not 0x0A (LF) or 0x0D (CR), given position. + let headerValue = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + + // 2. Remove any HTTP tab or space bytes from the end of header value. + headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20); + + // 3. Set contentType to the isomorphic decoding of header value. + contentType = isomorphicDecode(headerValue); + + break + } + case 'content-transfer-encoding': { + let headerValue = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + + headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20); + + encoding = isomorphicDecode(headerValue); + + break + } + default: { + // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position. + // (Do nothing with those bytes.) + collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + } + } + + // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A + // (CR LF), return failure. Otherwise, advance position by 2 (past the newline). + if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) { + return 'failure' + } else { + position.position += 2; + } + } + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#parse-a-multipart-form-data-name + * @param {Buffer} input + * @param {{ position: number }} position + */ + function parseMultipartFormDataName (input, position) { + // 1. Assert: The byte at (position - 1) is 0x22 ("). + assert(input[position.position - 1] === 0x22); + + // 2. Let name be the result of collecting a sequence of bytes that are not 0x0A (LF), 0x0D (CR) or 0x22 ("), given position. + /** @type {string | Buffer} */ + let name = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d && char !== 0x22, + input, + position + ); + + // 3. If the byte at position is not 0x22 ("), return failure. Otherwise, advance position by 1. + if (input[position.position] !== 0x22) { + return null // name could be 'failure' + } else { + position.position++; + } + + // 4. Replace any occurrence of the following subsequences in name with the given byte: + // - `%0A`: 0x0A (LF) + // - `%0D`: 0x0D (CR) + // - `%22`: 0x22 (") + name = new TextDecoder().decode(name) + .replace(/%0A/ig, '\n') + .replace(/%0D/ig, '\r') + .replace(/%22/g, '"'); + + // 5. Return the UTF-8 decoding without BOM of name. + return name + } + + /** + * @param {(char: number) => boolean} condition + * @param {Buffer} input + * @param {{ position: number }} position + */ + function collectASequenceOfBytes (condition, input, position) { + let start = position.position; + + while (start < input.length && condition(input[start])) { + ++start; + } + + return input.subarray(position.position, (position.position = start)) + } + + /** + * @param {Buffer} buf + * @param {boolean} leading + * @param {boolean} trailing + * @param {(charCode: number) => boolean} predicate + * @returns {Buffer} + */ + function removeChars (buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + + if (leading) { + while (lead < buf.length && predicate(buf[lead])) lead++; + } + + { + while (trail > 0 && predicate(buf[trail])) trail--; + } + + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1) + } + + /** + * Checks if {@param buffer} starts with {@param start} + * @param {Buffer} buffer + * @param {Buffer} start + * @param {{ position: number }} position + */ + function bufferStartsWith (buffer, start, position) { + if (buffer.length < start.length) { + return false + } + + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer[position.position + i]) { + return false + } + } + + return true + } + + formdataParser$1 = { + multipartFormDataParser, + validateBoundary + }; + return formdataParser$1; +} + +var body$1; +var hasRequiredBody$1; + +function requireBody$1 () { + if (hasRequiredBody$1) return body$1; + hasRequiredBody$1 = 1; + + const util = requireUtil$h(); const { ReadableStreamFrom, isBlobLike, isReadableStreamLike, readableStreamClose, createDeferredPromise, - fullyReadBody - } = requireUtil$7(); - const { FormData } = requireFormdata(); - const { kState } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { DOMException, structuredClone } = requireConstants$a(); - const { Blob, File: NativeFile } = require$$7; - const { kBodyUsed } = requireSymbols$4(); - const assert = require$$0$8; - const { isErrored } = requireUtil$8(); - const { isUint8Array, isArrayBuffer } = require$$5; - const { File: UndiciFile } = requireFile$1(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); - + fullyReadBody, + extractMimeType, + utf8DecodeBytes + } = requireUtil$g(); + const { FormData } = requireFormdata$1(); + const { kState } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { Blob } = require$$0$6; + const assert = require$$0$7; + const { isErrored, isDisturbed } = require$$0$8; + const { isArrayBuffer } = require$$8$1; + const { serializeAMimeType } = requireDataUrl$1(); + const { multipartFormDataParser } = requireFormdataParser$1(); let random; + try { const crypto = require('node:crypto'); random = (max) => crypto.randomInt(0, max); @@ -6839,19 +8412,23 @@ function requireBody () { random = (max) => Math.floor(Math.random(max)); } - let ReadableStream = globalThis.ReadableStream; - - /** @type {globalThis['File']} */ - const File = NativeFile ?? UndiciFile; const textEncoder = new TextEncoder(); - const textDecoder = new TextDecoder(); + function noop () {} + + const hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf('v18') !== 0; + let streamRegistry; + + if (hasFinalizationRegistry) { + streamRegistry = new FinalizationRegistry((weakRef) => { + const stream = weakRef.deref(); + if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { + stream.cancel('Response object has been garbage collected').catch(noop); + } + }); + } // https://fetch.spec.whatwg.org/#concept-bodyinit-extract function extractBody (object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - // 1. Let stream be null. let stream = null; @@ -6864,16 +8441,19 @@ function requireBody () { stream = object.stream(); } else { // 4. Otherwise, set stream to a new ReadableStream object, and set - // up stream. + // up stream with byte reading support. stream = new ReadableStream({ async pull (controller) { - controller.enqueue( - typeof source === 'string' ? textEncoder.encode(source) : source - ); + const buffer = typeof source === 'string' ? textEncoder.encode(source) : source; + + if (buffer.byteLength) { + controller.enqueue(buffer); + } + queueMicrotask(() => readableStreamClose(controller)); }, start () {}, - type: undefined + type: 'bytes' }); } @@ -6965,7 +8545,10 @@ function requireBody () { } } - const chunk = textEncoder.encode(`--${boundary}--`); + // CRLF is appended to the body to function with legacy servers and match other implementations. + // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030 + // https://github.com/form-data/form-data/issues/63 + const chunk = textEncoder.encode(`--${boundary}--\r\n`); blobParts.push(chunk); length += chunk.byteLength; if (hasUnknownSizeValue) { @@ -6988,7 +8571,7 @@ function requireBody () { // Set type to `multipart/form-data; boundary=`, // followed by the multipart/form-data boundary string generated // by the multipart/form-data encoding algorithm. - type = 'multipart/form-data; boundary=' + boundary; + type = `multipart/form-data; boundary=${boundary}`; } else if (isBlobLike(object)) { // Blob @@ -7040,13 +8623,17 @@ function requireBody () { // When running action is done, close stream. queueMicrotask(() => { controller.close(); + controller.byobRequest?.respond(0); }); } else { // Whenever one or more bytes are available and stream is not errored, // enqueue a Uint8Array wrapping an ArrayBuffer containing the available // bytes into stream. if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)); + const buffer = new Uint8Array(value); + if (buffer.byteLength) { + controller.enqueue(buffer); + } } } return controller.desiredSize > 0 @@ -7054,7 +8641,7 @@ function requireBody () { async cancel (reason) { await iterator.return(); }, - type: undefined + type: 'bytes' }); } @@ -7068,11 +8655,6 @@ function requireBody () { // https://fetch.spec.whatwg.org/#bodyinit-safely-extract function safelyExtractBody (object, keepalive = false) { - if (!ReadableStream) { - // istanbul ignore next - ReadableStream = require$$14.ReadableStream; - } - // To safely extract a body and a `Content-Type` value from // a byte sequence or BodyInit object object, run these steps: @@ -7089,52 +8671,25 @@ function requireBody () { return extractBody(object, keepalive) } - function cloneBody (body) { + function cloneBody (instance, body) { // To clone a body body, run these steps: // https://fetch.spec.whatwg.org/#concept-body-clone // 1. Let « out1, out2 » be the result of teeing body’s stream. const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - // This, for whatever reasons, unrefs out2Clone which allows - // the process to exit by itself. - const [, finalClone] = out2Clone.tee(); // 2. Set body’s stream to out1. body.stream = out1; // 3. Return a body whose stream is out2 and other members are copied from body. return { - stream: finalClone, + stream: out2, length: body.length, source: body.source } } - async function * consumeBody (body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - - if (util.isDisturbed(stream)) { - throw new TypeError('The body has already been consumed.') - } - - if (stream.locked) { - throw new TypeError('The stream is locked.') - } - - // Compat. - stream[kBodyUsed] = true; - - yield * stream; - } - } - } - function throwIfAborted (state) { if (state.aborted) { throw new DOMException('The operation was aborted.', 'AbortError') @@ -7149,10 +8704,10 @@ function requireBody () { // given a byte sequence bytes: return a Blob whose // contents are bytes and whose type attribute is this’s // MIME type. - return specConsumeBody(this, (bytes) => { + return consumeBody(this, (bytes) => { let mimeType = bodyMimeType(this); - if (mimeType === 'failure') { + if (mimeType === null) { mimeType = ''; } else if (mimeType) { mimeType = serializeAMimeType(mimeType); @@ -7169,7 +8724,7 @@ function requireBody () { // of running consume body with this and the following step // given a byte sequence bytes: return a new ArrayBuffer // whose contents are bytes. - return specConsumeBody(this, (bytes) => { + return consumeBody(this, (bytes) => { return new Uint8Array(bytes).buffer }, instance) }, @@ -7177,126 +8732,74 @@ function requireBody () { text () { // The text() method steps are to return the result of running // consume body with this and UTF-8 decode. - return specConsumeBody(this, utf8DecodeBytes, instance) + return consumeBody(this, utf8DecodeBytes, instance) }, json () { // The json() method steps are to return the result of running // consume body with this and parse JSON from bytes. - return specConsumeBody(this, parseJSONFromBytes, instance) + return consumeBody(this, parseJSONFromBytes, instance) }, - async formData () { - webidl.brandCheck(this, instance); - - throwIfAborted(this[kState]); - - const contentType = this.headers.get('Content-Type'); - - // If mimeType’s essence is "multipart/form-data", then: - if (/multipart\/form-data/.test(contentType)) { - const headers = {}; - for (const [key, value] of this.headers) headers[key.toLowerCase()] = value; - - const responseFormData = new FormData(); - - let busboy; - - try { - busboy = new Busboy({ - headers, - preservePath: true - }); - } catch (err) { - throw new DOMException(`${err}`, 'AbortError') - } - - busboy.on('field', (name, value) => { - responseFormData.append(name, value); - }); - busboy.on('file', (name, value, filename, encoding, mimeType) => { - const chunks = []; - - if (encoding === 'base64' || encoding.toLowerCase() === 'base64') { - let base64chunk = ''; - - value.on('data', (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ''); - - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64')); + formData () { + // The formData() method steps are to return the result of running + // consume body with this and the following step given a byte sequence bytes: + return consumeBody(this, (value) => { + // 1. Let mimeType be the result of get the MIME type with this. + const mimeType = bodyMimeType(this); + + // 2. If mimeType is non-null, then switch on mimeType’s essence and run + // the corresponding steps: + if (mimeType !== null) { + switch (mimeType.essence) { + case 'multipart/form-data': { + // 1. ... [long step] + const parsed = multipartFormDataParser(value, mimeType); + + // 2. If that fails for some reason, then throw a TypeError. + if (parsed === 'failure') { + throw new TypeError('Failed to parse body as FormData.') + } - base64chunk = base64chunk.slice(end); - }); - value.on('end', () => { - chunks.push(Buffer.from(base64chunk, 'base64')); - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } else { - value.on('data', (chunk) => { - chunks.push(chunk); - }); - value.on('end', () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } - }); + // 3. Return a new FormData object, appending each entry, + // resulting from the parsing operation, to its entry list. + const fd = new FormData(); + fd[kState] = parsed; - const busboyResolve = new Promise((resolve, reject) => { - busboy.on('finish', resolve); - busboy.on('error', (err) => reject(new TypeError(err))); - }); + return fd + } + case 'application/x-www-form-urlencoded': { + // 1. Let entries be the result of parsing bytes. + const entries = new URLSearchParams(value.toString()); - if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk); - busboy.end(); - await busboyResolve; + // 2. If entries is failure, then throw a TypeError. - return responseFormData - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then: + // 3. Return a new FormData object whose entry list is entries. + const fd = new FormData(); - // 1. Let entries be the result of parsing bytes. - let entries; - try { - let text = ''; - // application/x-www-form-urlencoded parser will keep the BOM. - // https://url.spec.whatwg.org/#concept-urlencoded-parser - // Note that streaming decoder is stateful and cannot be reused - const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true }); + for (const [name, value] of entries) { + fd.append(name, value); + } - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError('Expected Uint8Array chunk') + return fd } - text += streamingDecoder.decode(chunk, { stream: true }); } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - // istanbul ignore next: Unclear when new URLSearchParams can fail on a string. - // 2. If entries is failure, then throw a TypeError. - throw Object.assign(new TypeError(), { cause: err }) - } - - // 3. Return a new FormData object whose entries are entries. - const formData = new FormData(); - for (const [name, value] of entries) { - formData.append(name, value); } - return formData - } else { - // Wait a tick before checking if the request has been aborted. - // Otherwise, a TypeError can be thrown when an AbortError should. - await Promise.resolve(); - throwIfAborted(this[kState]); + // 3. Throw a TypeError. + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + ) + }, instance) + }, - // Otherwise, throw a TypeError. - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: 'Could not parse content as FormData.' - }) - } + bytes () { + // The bytes() method steps are to return the result of running consume body + // with this and the following step given a byte sequence bytes: return the + // result of creating a Uint8Array from bytes in this’s relevant realm. + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes) + }, instance) } }; @@ -7313,17 +8816,17 @@ function requireBody () { * @param {(value: unknown) => unknown} convertBytesToJSValue * @param {Response|Request} instance */ - async function specConsumeBody (object, convertBytesToJSValue, instance) { + async function consumeBody (object, convertBytesToJSValue, instance) { webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - // 1. If object is unusable, then return a promise rejected // with a TypeError. - if (bodyUnusable(object[kState].body)) { - throw new TypeError('Body is unusable') + if (bodyUnusable(object)) { + throw new TypeError('Body is unusable: Body has already been read') } + throwIfAborted(object[kState]); + // 2. Let promise be a new promise. const promise = createDeferredPromise(); @@ -7345,7 +8848,7 @@ function requireBody () { // 5. If object’s body is null, then run successSteps with an // empty byte sequence. if (object[kState].body == null) { - successSteps(new Uint8Array()); + successSteps(Buffer.allocUnsafe(0)); return promise.promise } @@ -7358,39 +8861,15 @@ function requireBody () { } // https://fetch.spec.whatwg.org/#body-unusable - function bodyUnusable (body) { + function bodyUnusable (object) { + const body = object[kState].body; + // An object including the Body interface mixin is // said to be unusable if its body is non-null and // its body’s stream is disturbed or locked. return body != null && (body.stream.locked || util.isDisturbed(body.stream)) } - /** - * @see https://encoding.spec.whatwg.org/#utf-8-decode - * @param {Buffer} buffer - */ - function utf8DecodeBytes (buffer) { - if (buffer.length === 0) { - return '' - } - - // 1. Let buffer be the result of peeking three bytes from - // ioQueue, converted to a byte sequence. - - // 2. If buffer is 0xEF 0xBB 0xBF, then read three - // bytes from ioQueue. (Do nothing with those bytes.) - if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { - buffer = buffer.subarray(3); - } - - // 3. Process a queue with an instance of UTF-8’s - // decoder, ioQueue, output, and "replacement". - const output = textDecoder.decode(buffer); - - // 4. Return output. - return output - } - /** * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value * @param {Uint8Array} bytes @@ -7401,1615 +8880,1464 @@ function requireBody () { /** * @see https://fetch.spec.whatwg.org/#concept-body-mime-type - * @param {import('./response').Response|import('./request').Request} object + * @param {import('./response').Response|import('./request').Request} requestOrResponse */ - function bodyMimeType (object) { - const { headersList } = object[kState]; - const contentType = headersList.get('content-type'); + function bodyMimeType (requestOrResponse) { + // 1. Let headers be null. + // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list. + // 3. Otherwise, set headers to requestOrResponse’s response’s header list. + /** @type {import('./headers').HeadersList} */ + const headers = requestOrResponse[kState].headersList; - if (contentType === null) { - return 'failure' + // 4. Let mimeType be the result of extracting a MIME type from headers. + const mimeType = extractMimeType(headers); + + // 5. If mimeType is failure, then return null. + if (mimeType === 'failure') { + return null } - return parseMIMEType(contentType) + // 6. Return mimeType. + return mimeType } - body = { + body$1 = { extractBody, safelyExtractBody, cloneBody, - mixinBody + mixinBody, + streamRegistry, + hasFinalizationRegistry, + bodyUnusable }; - return body; + return body$1; } -var request$2; -var hasRequiredRequest$1; - -function requireRequest$1 () { - if (hasRequiredRequest$1) return request$2; - hasRequiredRequest$1 = 1; - - const { - InvalidArgumentError, - NotSupportedError - } = requireErrors$1(); - const assert = require$$0$8; - const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = requireSymbols$4(); - const util = requireUtil$8(); - - // tokenRegExp and headerCharRegex have been lifted from - // https://github.com/nodejs/node/blob/main/lib/_http_common.js - - /** - * Verifies that the given val is a valid HTTP token - * per the rules defined in RFC 7230 - * See https://tools.ietf.org/html/rfc7230#section-3.2.6 - */ - const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; +var clientH1$1; +var hasRequiredClientH1$1; - /** - * Matches if val contains an invalid field-vchar - * field-value = *( field-content / obs-fold ) - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - */ - const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; +function requireClientH1$1 () { + if (hasRequiredClientH1$1) return clientH1$1; + hasRequiredClientH1$1 = 1; - // Verifies that a given path is valid does not contain control chars \x00 to \x20 - const invalidPathRegex = /[^\u0021-\u00ff]/; + /* global WebAssembly */ - const kHandler = Symbol('handler'); + const assert = require$$0$7; + const util = requireUtil$h(); + const { channels } = requireDiagnostics$1(); + const timers = requireTimers$1(); + const { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError + } = requireErrors$2(); + const { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext + } = requireSymbols$9(); - const channels = {}; + const constants = requireConstants$f(); + const EMPTY_BUF = Buffer.alloc(0); + const FastBuffer = Buffer[Symbol.species]; + const addListener = util.addListener; + const removeAllListeners = util.removeAllListeners; let extractBody; - try { - const diagnosticsChannel = require('diagnostics_channel'); - channels.create = diagnosticsChannel.channel('undici:request:create'); - channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent'); - channels.headers = diagnosticsChannel.channel('undici:request:headers'); - channels.trailers = diagnosticsChannel.channel('undici:request:trailers'); - channels.error = diagnosticsChannel.channel('undici:request:error'); - } catch { - channels.create = { hasSubscribers: false }; - channels.bodySent = { hasSubscribers: false }; - channels.headers = { hasSubscribers: false }; - channels.trailers = { hasSubscribers: false }; - channels.error = { hasSubscribers: false }; - } - - class Request { - constructor (origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path !== 'string') { - throw new InvalidArgumentError('path must be a string') - } else if ( - path[0] !== '/' && - !(path.startsWith('http://') || path.startsWith('https://')) && - method !== 'CONNECT' - ) { - throw new InvalidArgumentError('path must be an absolute URL or start with a slash') - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError('invalid request path') - } + async function lazyllhttp () { + const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm$1() : undefined; - if (typeof method !== 'string') { - throw new InvalidArgumentError('method must be a string') - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError('invalid request method') - } + let mod; + try { + mod = await WebAssembly.compile(requireLlhttp_simdWasm$1()); + } catch (e) { + /* istanbul ignore next */ - if (upgrade && typeof upgrade !== 'string') { - throw new InvalidArgumentError('upgrade must be a string') - } + // We could check if the error was caused by the simd option not + // being enabled, but the occurring of this other error + // * https://github.com/emscripten-core/emscripten/issues/11495 + // got me to remove that check to avoid breaking Node 12. + mod = await WebAssembly.compile(llhttpWasmData || requireLlhttpWasm$1()); + } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('invalid headersTimeout') - } + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('invalid bodyTimeout') - } + wasm_on_url: (p, at, len) => { + /* istanbul ignore next */ + return 0 + }, + wasm_on_status: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_begin: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageBegin() || 0 + }, + wasm_on_header_field: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_header_value: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert(currentParser.ptr === p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + }, + wasm_on_body: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_complete: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageComplete() || 0 + } - if (reset != null && typeof reset !== 'boolean') { - throw new InvalidArgumentError('invalid reset') + /* eslint-enable camelcase */ } + }) + } - if (expectContinue != null && typeof expectContinue !== 'boolean') { - throw new InvalidArgumentError('invalid expectContinue') - } + let llhttpInstance = null; + let llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); - this.headersTimeout = headersTimeout; + let currentParser = null; + let currentBufferRef = null; + let currentBufferSize = 0; + let currentBufferPtr = null; - this.bodyTimeout = bodyTimeout; + const USE_NATIVE_TIMER = 0; + const USE_FAST_TIMER = 1; - this.throwOnError = throwOnError === true; + // Use fast timers for headers and body to take eventual event loop + // latency into account. + const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; + const TIMEOUT_BODY = 4 | USE_FAST_TIMER; - this.method = method; + // Use native timers to ignore event loop latency for keep-alive + // handling. + const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; - this.abort = null; + class Parser { + constructor (client, socket, { exports: exports$1 }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; + this.llhttp = exports$1; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ''; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy () { - util.destroy(this); - }; - this.body.on('end', this.endHandler); + this.bytesRead = 0; + + this.keepAlive = ''; + this.contentLength = ''; + this.connection = ''; + this.maxResponseSize = client[kMaxResponseSize]; + } + + setTimeout (delay, type) { + // If the existing timer and the new timer are of different timer type + // (fast or native) or have different delay, we need to clear the existing + // timer and set a new one. + if ( + delay !== this.timeoutValue || + (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER) + ) { + // If a timeout is already set, clear it with clearTimeout of the fast + // timer implementation, as it can clear fast and native timers. + if (this.timeout) { + timers.clearTimeout(this.timeout); + this.timeout = null; } - this.errorHandler = err => { - if (this.abort) { - this.abort(err); + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); } else { - this.error = err; + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); + this.timeout.unref(); } - }; - this.body.on('error', this.errorHandler); - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === 'string') { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') - } - - this.completed = false; - - this.aborted = false; - - this.upgrade = upgrade || null; + } - this.path = query ? util.buildURL(path, query) : path; + this.timeoutValue = delay; + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } - this.origin = origin; + this.timeoutType = type; + } - this.idempotent = idempotent == null - ? method === 'HEAD' || method === 'GET' - : idempotent; + resume () { + if (this.socket.destroyed || !this.paused) { + return + } - this.blocking = blocking == null ? false : blocking; + assert(this.ptr != null); + assert(currentParser == null); - this.reset = reset == null ? null : reset; + this.llhttp.llhttp_resume(this.ptr); - this.host = null; + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } - this.contentLength = null; + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); // Flush parser. + this.readMore(); + } - this.contentType = null; + readMore () { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break + } + this.execute(chunk); + } + } - this.headers = ''; + execute (data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); - // Only for H2 - this.expectContinue = expectContinue != null ? expectContinue : false; + const { socket, llhttp } = this; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); } - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) { - throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') - } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + + // Call `execute` on the wasm parser. + // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, + // and finally the length of bytes to parse. + // The return value is an error code or `constants.ERROR.OK`. + try { + let ret; - if (!extractBody) { - extractBody = requireBody().extractBody; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + /* eslint-disable-next-line no-useless-catch */ + } catch (err) { + /* istanbul ignore next: difficult to make a test case for */ + throw err + } finally { + currentParser = null; + currentBufferRef = null; } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r\n`; + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ''; + /* istanbul ignore else: difficult to make a test case for */ + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')'; + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r\n`; + } catch (err) { + util.destroy(socket, err); } + } - util.validateHandler(handler, method, upgrade); + destroy () { + assert(this.ptr != null); + assert(currentParser == null); - this.servername = util.getServerName(this.host); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; - this[kHandler] = handler; + this.timeout && timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } + this.paused = false; } - onBodySent (chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk) - } catch (err) { - this.abort(err); - } - } + onStatus (buf) { + this.statusText = buf.toString(); } - onRequestSent () { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); + onMessageBegin () { + const { socket, client } = this; + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent() - } catch (err) { - this.abort(err); - } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1 } + request.onResponseStarted(); } - onConnect (abort) { - assert(!this.aborted); - assert(!this.completed); + onHeaderField (buf) { + const len = this.headers.length; - if (this.error) { - abort(this.error); + if ((len & 1) === 0) { + this.headers.push(buf); } else { - this.abort = abort; - return this[kHandler].onConnect(abort) + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } + + this.trackHeader(buf.length); } - onHeaders (statusCode, headers, resume, statusText) { - assert(!this.aborted); - assert(!this.completed); + onHeaderValue (buf) { + let len = this.headers.length; - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText) - } catch (err) { - this.abort(err); + const key = this.headers[len - 2]; + if (key.length === 10) { + const headerName = util.bufferToLowerCasedHeaderName(key); + if (headerName === 'keep-alive') { + this.keepAlive += buf.toString(); + } else if (headerName === 'connection') { + this.connection += buf.toString(); + } + } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') { + this.contentLength += buf.toString(); } - } - onData (chunk) { - assert(!this.aborted); - assert(!this.completed); + this.trackHeader(buf.length); + } - try { - return this[kHandler].onData(chunk) - } catch (err) { - this.abort(err); - return false + trackHeader (len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()); } } - onUpgrade (statusCode, headers, socket) { - assert(!this.aborted); - assert(!this.completed); + onUpgrade (head) { + const { upgrade, client, socket, headers, statusCode } = this; - return this[kHandler].onUpgrade(statusCode, headers, socket) - } + assert(upgrade); + assert(client[kSocket] === socket); + assert(!socket.destroyed); + assert(!this.paused); + assert((headers.length & 1) === 0); - onComplete (trailers) { - this.onFinally(); + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(request.upgrade || request.method === 'CONNECT'); - assert(!this.aborted); + this.statusCode = null; + this.statusText = ''; + this.shouldKeepAlive = null; - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } + this.headers = []; + this.headersSize = 0; + + socket.unshift(head); + + socket[kParser].destroy(); + socket[kParser] = null; + + socket[kClient] = null; + socket[kError] = null; + + removeAllListeners(socket); + + client[kSocket] = null; + client[kHTTPContext] = null; // TODO (fix): This is hacky... + client[kQueue][client[kRunningIdx]++] = null; + client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')); try { - return this[kHandler].onComplete(trailers) + request.onUpgrade(statusCode, headers, socket); } catch (err) { - // TODO (fix): This might be a bad idea? - this.onError(err); + util.destroy(socket, err); } + + client[kResume](); } - onError (error) { - this.onFinally(); + onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 } - if (this.aborted) { - return + const request = client[kQueue][client[kRunningIdx]]; + + /* istanbul ignore next: difficult to make a test case for */ + if (!request) { + return -1 } - this.aborted = true; - return this[kHandler].onError(error) - } + assert(!this.upgrade); + assert(this.statusCode < 200); - onFinally () { - if (this.errorHandler) { - this.body.off('error', this.errorHandler); - this.errorHandler = null; + if (statusCode === 100) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))); + return -1 } - if (this.endHandler) { - this.body.off('end', this.endHandler); - this.endHandler = null; + /* this can only happen if server is misbehaving */ + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))); + return -1 } - } - // TODO: adjust to support H2 - addHeader (key, value) { - processHeader(this, key, value); - return this - } + assert(this.timeoutType === TIMEOUT_HEADERS); - static [kHTTP1BuildRequest] (origin, opts, handler) { - // TODO: Migrate header parsing here, to make Requests - // HTTP agnostic - return new Request(origin, opts, handler) - } + this.statusCode = statusCode; + this.shouldKeepAlive = ( + shouldKeepAlive || + // Override llhttp value which does not allow keepAlive for HEAD. + (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') + ); + + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null + ? request.bodyTimeout + : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } - static [kHTTP2BuildRequest] (origin, opts, handler) { - const headers = opts.headers; - opts = { ...opts, headers: null }; + if (request.method === 'CONNECT') { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2 + } - const request = new Request(origin, opts, handler); + if (upgrade) { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2 + } - request.headers = {}; + assert((this.headers.length & 1) === 0); + this.headers = []; + this.headersSize = 0; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true); - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(request, key, headers[key], true); + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; + + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') + } else { + // Stop more requests from being dispatched. + socket[kReset] = true; } - return request - } + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - static [kHTTP2CopyHeaders] (raw) { - const rawHeaders = raw.split('\r\n'); - const headers = {}; + if (request.aborted) { + return -1 + } - for (const header of rawHeaders) { - const [key, value] = header.split(': '); + if (request.method === 'HEAD') { + return 1 + } - if (value == null || value.length === 0) continue + if (statusCode < 200) { + return 1 + } - if (headers[key]) headers[key] += `,${value}`; - else headers[key] = value; + if (socket[kBlocking]) { + socket[kBlocking] = false; + client[kResume](); } - return headers + return pause ? constants.ERROR.PAUSED : 0 } - } - function processHeaderValue (key, val, skipAppend) { - if (val && typeof val === 'object') { - throw new InvalidArgumentError(`invalid ${key} header`) - } + onBody (buf) { + const { client, socket, statusCode, maxResponseSize } = this; - val = val != null ? `${val}` : ''; + if (socket.destroyed) { + return -1 + } - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } + const request = client[kQueue][client[kRunningIdx]]; + assert(request); - return skipAppend ? val : `${key}: ${val}\r\n` - } + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } - function processHeader (request, key, val, skipAppend = false) { - if (val && (typeof val === 'object' && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`) - } else if (val === undefined) { - return - } + assert(statusCode >= 200); - if ( - request.host === null && - key.length === 4 && - key.toLowerCase() === 'host' - ) { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - // Consumed by Client - request.host = val; - } else if ( - request.contentLength === null && - key.length === 14 && - key.toLowerCase() === 'content-length' - ) { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError('invalid content-length header') - } - } else if ( - request.contentType === null && - key.length === 12 && - key.toLowerCase() === 'content-type' - ) { - request.contentType = val; - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend); - else request.headers += processHeaderValue(key, val); - } else if ( - key.length === 17 && - key.toLowerCase() === 'transfer-encoding' - ) { - throw new InvalidArgumentError('invalid transfer-encoding header') - } else if ( - key.length === 10 && - key.toLowerCase() === 'connection' - ) { - const value = typeof val === 'string' ? val.toLowerCase() : null; - if (value !== 'close' && value !== 'keep-alive') { - throw new InvalidArgumentError('invalid connection header') - } else if (value === 'close') { - request.reset = true; + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()); + return -1 } - } else if ( - key.length === 10 && - key.toLowerCase() === 'keep-alive' - ) { - throw new InvalidArgumentError('invalid keep-alive header') - } else if ( - key.length === 7 && - key.toLowerCase() === 'upgrade' - ) { - throw new InvalidArgumentError('invalid upgrade header') - } else if ( - key.length === 6 && - key.toLowerCase() === 'expect' - ) { - throw new NotSupportedError('expect header not supported') - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError('invalid header key') - } else { - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - else request.headers[key] = processHeaderValue(key, val[i], skipAppend); - } else { - request.headers += processHeaderValue(key, val[i]); - } - } - } else { - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend); - else request.headers += processHeaderValue(key, val); + + this.bytesRead += buf.length; + + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED } } - } - request$2 = Request; - return request$2; -} + onMessageComplete () { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; -var dispatcher; -var hasRequiredDispatcher; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1 + } -function requireDispatcher () { - if (hasRequiredDispatcher) return dispatcher; - hasRequiredDispatcher = 1; + if (upgrade) { + return + } - const EventEmitter = require$$1$3; + assert(statusCode >= 100); + assert((this.headers.length & 1) === 0); - class Dispatcher extends EventEmitter { - dispatch () { - throw new Error('not implemented') - } + const request = client[kQueue][client[kRunningIdx]]; + assert(request); - close () { - throw new Error('not implemented') - } + this.statusCode = null; + this.statusText = ''; + this.bytesRead = 0; + this.contentLength = ''; + this.keepAlive = ''; + this.connection = ''; - destroy () { - throw new Error('not implemented') - } - } + this.headers = []; + this.headersSize = 0; - dispatcher = Dispatcher; - return dispatcher; -} + if (statusCode < 200) { + return + } -var dispatcherBase; -var hasRequiredDispatcherBase; + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()); + return -1 + } -function requireDispatcherBase () { - if (hasRequiredDispatcherBase) return dispatcherBase; - hasRequiredDispatcherBase = 1; + request.onComplete(headers); - const Dispatcher = requireDispatcher(); - const { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = requireErrors$1(); - const { kDestroy, kClose, kDispatch, kInterceptors } = requireSymbols$4(); + client[kQueue][client[kRunningIdx]++] = null; - const kDestroyed = Symbol('destroyed'); - const kClosed = Symbol('closed'); - const kOnDestroyed = Symbol('onDestroyed'); - const kOnClosed = Symbol('onClosed'); - const kInterceptedDispatch = Symbol('Intercepted Dispatch'); + if (socket[kWriting]) { + assert(client[kRunning] === 0); + // Response completed before request. + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (socket[kReset] && client[kRunning] === 0) { + // Destroy socket once all requests have completed. + // The request at the tail of the pipeline is the one + // that requested reset and no further requests should + // have been queued since then. + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + // We must wait a full event loop cycle to reuse this socket to make sure + // that non-spec compliant servers are not closing the connection even if they + // said they won't. + setImmediate(() => client[kResume]()); + } else { + client[kResume](); + } + } + } - class DispatcherBase extends Dispatcher { - constructor () { - super(); + function onParserTimeout (parser) { + const { socket, timeoutType, client, paused } = parser.deref(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; + /* istanbul ignore else */ + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!paused, 'cannot be paused while waiting for headers'); + util.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!paused) { + util.destroy(socket, new BodyTimeoutError()); + } + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util.destroy(socket, new InformationalError('socket idle timeout')); } + } - get destroyed () { - return this[kDestroyed] - } + async function connectH1 (client, socket) { + client[kSocket] = socket; - get closed () { - return this[kClosed] + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; } - get interceptors () { - return this[kInterceptors] - } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); - set interceptors (newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== 'function') { - throw new InvalidArgumentError('interceptor must be an function') - } - } - } + addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); - this[kInterceptors] = newInterceptors; - } + const parser = this[kParser]; - close (callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data) - }); - }) + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so for as a valid response. + parser.onMessageComplete(); + return } - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') + this[kError] = err; + + this[kClient][kOnError](err); + }); + addListener(socket, 'readable', function () { + const parser = this[kParser]; + + if (parser) { + parser.readMore(); } + }); + addListener(socket, 'end', function () { + const parser = this[kParser]; - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); + if (parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete(); return } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); + }); + addListener(socket, 'close', function () { + const client = this[kClient]; + const parser = this[kParser]; + + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete(); } - return + + this[kParser].destroy(); + this[kParser] = null; } - this[kClosed] = true; - this[kOnClosed].push(callback); + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; + client[kSocket] = null; + client[kHTTPContext] = null; // TODO (fix): This is hacky... - // Should not error. - this[kClose]() - .then(() => this.destroy()) - .then(() => { - queueMicrotask(onClosed); - }); - } + if (client.destroyed) { + assert(client[kPending] === 0); - destroy (err, callback) { - if (typeof err === 'function') { - callback = err; - err = null; - } + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err, data) => { - return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) - }); - }) + util.errorRequest(client, request, err); } - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } + client[kPendingIdx] = client[kRunningIdx]; - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return - } + assert(client[kRunning] === 0); - if (!err) { - err = new ClientDestroyedError(); - } + client.emit('disconnect', client[kUrl], [client], err); - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); + client[kResume](); + }); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); + let closed = false; + socket.on('close', () => { + closed = true; + }); + + return { + version: 'h1', + defaultPipelining: 1, + write (...args) { + return writeH1(client, ...args) + }, + resume () { + resumeH1(client); + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on('close', callback); + } + }, + get destroyed () { + return socket.destroyed + }, + busy (request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true } - }; - // Should not error. - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + // Non-idempotent request cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } - [kInterceptedDispatch] (opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler) - } + if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { + // Don't dispatch an upgrade until all preceding requests have completed. + // A misbehaving server might upgrade the connection before all pipelined + // request has completed. + return true + } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); - } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler) - } + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && + (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { + // Request with stream or iterator body can error while other requests + // are inflight and indirectly error those as well. + // Ensure this doesn't happen by waiting for inflight + // to complete before dispatching. - dispatch (opts, handler) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') + // Request with stream or iterator body cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } + } + + return false } + } + } - try { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object.') - } + function resumeH1 (client) { + const socket = client[kSocket]; - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError() + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } - if (this[kClosed]) { - throw new ClientClosedError() + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); } - - return this[kInterceptedDispatch](opts, handler) - } catch (err) { - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request.headersTimeout != null + ? request.headersTimeout + : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); } - - handler.onError(err); - - return false } } } - dispatcherBase = DispatcherBase; - return dispatcherBase; -} - -var connect; -var hasRequiredConnect; + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 + function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' + } -function requireConnect () { - if (hasRequiredConnect) return connect; - hasRequiredConnect = 1; + function writeH1 (client, request) { + const { method, path, host, upgrade, blocking, reset } = request; - const net = require$$0$9; - const assert = require$$0$8; - const util = requireUtil$8(); - const { InvalidArgumentError, ConnectTimeoutError } = requireErrors$1(); + let { body, headers, contentLength } = request; - let tls; // include tls conditionally since it is not always available + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - // TODO: session re-use does not wait for the first - // connection to resolve the session and might therefore - // resolve the same servername multiple times even when - // re-use is enabled. + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. - let SessionCache; - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (commonjsGlobal.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map(); - this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return - } + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' || + method === 'QUERY' || + method === 'PROPFIND' || + method === 'PROPPATCH' + ); - const ref = this._sessionCache.get(key); - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key); - } - }); + if (util.isFormDataLike(body)) { + if (!extractBody) { + extractBody = requireBody$1().extractBody; } - get (sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null + const [bodyStream, contentType] = extractBody(body); + if (request.contentType == null) { + headers.push('content-type', contentType); } + body = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && request.contentType == null && body.type) { + headers.push('content-type', body.type); + } - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0); + } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map(); - } + const bodyLength = util.bodyLength(body); - get (sessionKey) { - return this._sessionCache.get(sessionKey) + contentLength = bodyLength ?? contentLength; + + if (contentLength === null) { + contentLength = request.contentLength; + } + + if (contentLength === 0 && !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null; + } + + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false } - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } + process.emitWarning(new RequestContentLengthMismatchError()); + } - if (this._sessionCache.size >= this._maxCachedSessions) { - // remove the oldest session - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } + const socket = client[kSocket]; - this._sessionCache.set(sessionKey, session); + const abort = (err) => { + if (request.aborted || request.completed) { + return } + + util.errorRequest(client, request, err || new RequestAbortedError()); + + util.destroy(body); + util.destroy(socket, new InformationalError('aborted')); }; - } - function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + try { + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 10e3 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === 'https:') { - if (!tls) { - tls = require$$1$4; - } - servername = servername || options.servername || util.getServerName(host) || null; - - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; + if (request.aborted) { + return false + } - assert(sessionKey); + if (method === 'HEAD') { + // https://github.com/mcollina/undici/issues/258 + // Close after a HEAD request to interop with misbehaving servers + // that may send a body in the response. - socket = tls.connect({ - highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], - socket: httpSocket, // upgrade socket connection - port: port || 443, - host: hostname - }); + socket[kReset] = true; + } - socket - .on('session', function (session) { - // TODO (fix): Can a session become invalid once established? Don't think so? - sessionCache.set(sessionKey, session); - }); - } else { - assert(!httpSocket, 'httpSocket can only be sent on TLS update'); - socket = net.connect({ - highWaterMark: 64 * 1024, // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }); - } + if (upgrade || method === 'CONNECT') { + // On CONNECT or upgrade, block pipeline from dispatching further + // requests on this connection. - // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } + socket[kReset] = true; + } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); + if (reset != null) { + socket[kReset] = reset; + } - socket - .setNoDelay(true) - .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { - cancelTimeout(); + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }) - .on('error', function (err) { - cancelTimeout(); + if (blocking) { + socket[kBlocking] = true; + } - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); + let header = `${method} ${path} HTTP/1.1\r\n`; - return socket + if (typeof host === 'string') { + header += `host: ${host}\r\n`; + } else { + header += client[kHostHeader]; } - } - function setupTimeout (onConnectTimeout, timeout) { - if (!timeout) { - return () => {} + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; + } else if (client[kPipelining] && !socket[kReset]) { + header += 'connection: keep-alive\r\n'; + } else { + header += 'connection: close\r\n'; } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - // setImmediate is added to make sure that we priotorise socket error events over timeouts - s1 = setImmediate(() => { - if (process.platform === 'win32') { - // Windows needs an extra setImmediate probably due to implementation differences in the socket logic - s2 = setImmediate(() => onConnectTimeout()); + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0]; + const val = headers[n + 1]; + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r\n`; + } } else { - onConnectTimeout(); + header += `${key}: ${val}\r\n`; } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); + } } - } - function onConnectTimeout (socket) { - util.destroy(socket, new ConnectTimeoutError()); - } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } - connect = buildConnector; - return connect; -} + /* istanbul ignore else: assertion */ + if (!body || bodyLength === 0) { + writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBuffer(body)) { + writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload); + } else { + writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload); + } + } else if (util.isStream(body)) { + writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isIterable(body)) { + writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else { + assert(false); + } -var constants$9 = {}; + return true + } -var utils$6 = {}; + function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); -var hasRequiredUtils$6; + let finished = false; -function requireUtils$6 () { - if (hasRequiredUtils$6) return utils$6; - hasRequiredUtils$6 = 1; - Object.defineProperty(utils$6, "__esModule", { value: true }); - utils$6.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === 'number') { - res[key] = value; - } - }); - return res; - } - utils$6.enumToMap = enumToMap; - - return utils$6; -} + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); -var hasRequiredConstants$9; + const onData = function (chunk) { + if (finished) { + return + } -function requireConstants$9 () { - if (hasRequiredConstants$9) return constants$9; - hasRequiredConstants$9 = 1; - (function (exports$1) { - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; - const utils_1 = requireUtils$6(); - (function (ERROR) { - ERROR[ERROR["OK"] = 0] = "OK"; - ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; - ERROR[ERROR["STRICT"] = 2] = "STRICT"; - ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; - ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR[ERROR["USER"] = 24] = "USER"; - })(exports$1.ERROR || (exports$1.ERROR = {})); - (function (TYPE) { - TYPE[TYPE["BOTH"] = 0] = "BOTH"; - TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; - TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; - })(exports$1.TYPE || (exports$1.TYPE = {})); - (function (FLAGS) { - FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; - FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; - FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; - // 1 << 8 is unused - FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(exports$1.FLAGS || (exports$1.FLAGS = {})); - (function (LENIENT_FLAGS) { - LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); - var METHODS; - (function (METHODS) { - METHODS[METHODS["DELETE"] = 0] = "DELETE"; - METHODS[METHODS["GET"] = 1] = "GET"; - METHODS[METHODS["HEAD"] = 2] = "HEAD"; - METHODS[METHODS["POST"] = 3] = "POST"; - METHODS[METHODS["PUT"] = 4] = "PUT"; - /* pathological */ - METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; - METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; - METHODS[METHODS["TRACE"] = 7] = "TRACE"; - /* WebDAV */ - METHODS[METHODS["COPY"] = 8] = "COPY"; - METHODS[METHODS["LOCK"] = 9] = "LOCK"; - METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; - METHODS[METHODS["MOVE"] = 11] = "MOVE"; - METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; - METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; - METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; - METHODS[METHODS["BIND"] = 16] = "BIND"; - METHODS[METHODS["REBIND"] = 17] = "REBIND"; - METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; - METHODS[METHODS["ACL"] = 19] = "ACL"; - /* subversion */ - METHODS[METHODS["REPORT"] = 20] = "REPORT"; - METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS[METHODS["MERGE"] = 23] = "MERGE"; - /* upnp */ - METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; - METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - /* RFC-5789 */ - METHODS[METHODS["PATCH"] = 28] = "PATCH"; - METHODS[METHODS["PURGE"] = 29] = "PURGE"; - /* CalDAV */ - METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; - /* RFC-2068, section 19.6.1.2 */ - METHODS[METHODS["LINK"] = 31] = "LINK"; - METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; - /* icecast */ - METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; - /* RFC-7540, section 11.6 */ - METHODS[METHODS["PRI"] = 34] = "PRI"; - /* RFC-2326 RTSP */ - METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS[METHODS["SETUP"] = 37] = "SETUP"; - METHODS[METHODS["PLAY"] = 38] = "PLAY"; - METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; - METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; - METHODS[METHODS["RECORD"] = 44] = "RECORD"; - /* RAOP */ - METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); - exports$1.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS['M-SEARCH'], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE, - ]; - exports$1.METHODS_ICE = [ - METHODS.SOURCE, - ]; - exports$1.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST, - ]; - exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); - exports$1.H_METHOD_MAP = {}; - Object.keys(exports$1.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; - } - }); - (function (FINISH) { - FINISH[FINISH["SAFE"] = 0] = "SAFE"; - FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; - })(exports$1.FINISH || (exports$1.FINISH = {})); - exports$1.ALPHA = []; - for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { - // Upper case - exports$1.ALPHA.push(String.fromCharCode(i)); - // Lower case - exports$1.ALPHA.push(String.fromCharCode(i + 0x20)); - } - exports$1.NUM_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, - }; - exports$1.HEX_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, - A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, - a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, - }; - exports$1.NUM = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - ]; - exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); - exports$1.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; - exports$1.USERINFO_CHARS = exports$1.ALPHANUM - .concat(exports$1.MARK) - .concat(['%', ';', ':', '&', '=', '+', '$', ',']); - // TODO(indutny): use RFC - exports$1.STRICT_URL_CHAR = [ - '!', '"', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - ':', ';', '<', '=', '>', - '@', '[', '\\', ']', '^', '_', - '`', - '{', '|', '}', '~', - ].concat(exports$1.ALPHANUM); - exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR - .concat(['\t', '\f']); - // All characters with 0x80 bit set to 1 - for (let i = 0x80; i <= 0xff; i++) { - exports$1.URL_CHAR.push(i); - } - exports$1.HEX = exports$1.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); - /* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ - exports$1.STRICT_TOKEN = [ - '!', '#', '$', '%', '&', '\'', - '*', '+', '-', '.', - '^', '_', '`', - '|', '~', - ].concat(exports$1.ALPHANUM); - exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([' ']); - /* - * Verify that a char is a valid visible (printable) US-ASCII - * character or %x80-FF - */ - exports$1.HEADER_CHARS = ['\t']; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports$1.HEADER_CHARS.push(i); - } - } - // ',' = \x44 - exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); - exports$1.MAJOR = exports$1.NUM_MAP; - exports$1.MINOR = exports$1.MAJOR; - var HEADER_STATE; - (function (HEADER_STATE) { - HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); - exports$1.SPECIAL_HEADERS = { - 'connection': HEADER_STATE.CONNECTION, - 'content-length': HEADER_STATE.CONTENT_LENGTH, - 'proxy-connection': HEADER_STATE.CONNECTION, - 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, - 'upgrade': HEADER_STATE.UPGRADE, - }; - - } (constants$9)); - return constants$9; -} - -var RedirectHandler_1; -var hasRequiredRedirectHandler; + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util.destroy(this, err); + } + }; + const onDrain = function () { + if (finished) { + return + } -function requireRedirectHandler () { - if (hasRequiredRedirectHandler) return RedirectHandler_1; - hasRequiredRedirectHandler = 1; + if (body.resume) { + body.resume(); + } + }; + const onClose = function () { + // 'close' might be emitted *before* 'error' for + // broken streams. Wait a tick to avoid this case. + queueMicrotask(() => { + // It's only safe to remove 'error' listener after + // 'close'. + body.removeListener('error', onFinished); + }); - const util = requireUtil$8(); - const { kBodyUsed } = requireSymbols$4(); - const assert = require$$0$8; - const { InvalidArgumentError } = requireErrors$1(); - const EE = require$$1$3; + if (!finished) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + } + }; + const onFinished = function (err) { + if (finished) { + return + } - const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + finished = true; - const kBody = Symbol('body'); + assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)); - class BodyAsyncIterable { - constructor (body) { - this[kBody] = body; - this[kBodyUsed] = false; - } + socket + .off('drain', onDrain) + .off('error', onFinished); - async * [Symbol.asyncIterator] () { - assert(!this[kBodyUsed], 'disturbed'); - this[kBodyUsed] = true; - yield * this[kBody]; - } - } + body + .removeListener('data', onData) + .removeListener('end', onFinished) + .removeListener('close', onClose); - class RedirectHandler { - constructor (dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } } - util.validateHandler(handler, opts.method, opts.upgrade); + writer.destroy(err); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; + if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; - if (util.isStream(this.opts.body)) { - // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp - // so that it can be dispatched again? - // TODO (fix): Do we need 100-expect support to provide a way to do this properly? - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body - .on('data', function () { - assert(false); - }); - } + body + .on('data', onData) + .on('end', onFinished) + .on('error', onFinished) + .on('close', onClose); - if (typeof this.opts.body.readableDidRead !== 'boolean') { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, 'data', function () { - this[kBodyUsed] = true; - }); - } - } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { - // TODO (fix): We can't access ReadableStream internal state - // to determine whether or not it has been disturbed. This is just - // a workaround. - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if ( - this.opts.body && - typeof this.opts.body !== 'string' && - !ArrayBuffer.isView(this.opts.body) && - util.isIterable(this.opts.body) - ) { - // TODO: Should we allow re-using iterable if !this.opts.idempotent - // or through some other flag? - this.opts.body = new BodyAsyncIterable(this.opts.body); - } + if (body.resume) { + body.resume(); } - onConnect (abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); - } + socket + .on('drain', onDrain) + .on('error', onFinished); - onUpgrade (statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); + if (body.errorEmitted ?? body.errored) { + setImmediate(() => onFinished(body.errored)); + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(() => onFinished(null)); } - onError (error) { - this.handler.onError(error); + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose); } + } - onHeaders (statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) - ? null - : parseLocation(statusCode, headers); + function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); + } else { + assert(contentLength === null, 'no body must not have content length'); + socket.write(`${header}\r\n`, 'latin1'); + } + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length'); - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } } + request.onRequestSent(); - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText) + client[kResume](); + } catch (err) { + abort(err); + } + } + + async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length'); + + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; + const buffer = Buffer.from(await body.arrayBuffer()); - // Remove headers referring to the original URL. - // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. - // https://tools.ietf.org/html/rfc7231#section-6.4 - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + socket.write(buffer); + socket.uncork(); - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - // In case of HTTP 303, always replace method to be either HEAD or GET - if (statusCode === 303 && this.opts.method !== 'HEAD') { - this.opts.method = 'GET'; - this.opts.body = null; + request.onBodySent(buffer); + request.onRequestSent(); + + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; } + + client[kResume](); + } catch (err) { + abort(err); } + } - onData (chunk) { - if (this.location) ; else { - return this.handler.onData(chunk) + async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); + + let callback = null; + function onDrain () { + if (callback) { + const cb = callback; + callback = null; + cb(); } } - onComplete (trailers) { - if (this.location) { - /* - https://tools.ietf.org/html/rfc7231#section-6.4 + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); - TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections - and neither are useful if present. + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); - See comment on onData method above for more detailed informations. - */ + socket + .on('close', onDrain) + .on('drain', onDrain); - this.location = null; - this.abort = null; + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); + if (!writer.write(chunk)) { + await waitForDrain(); + } } - } - onBodySent (chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket + .off('close', onDrain) + .off('drain', onDrain); } } - function parseLocation (statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null + class AsyncWriter { + constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + + socket[kWriting] = true; } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toString().toLowerCase() === 'location') { - return headers[i + 1] + write (chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + + if (socket[kError]) { + throw socket[kError] } - } - } - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - function shouldRemoveHeader (header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === 'host' - } - if (removeContent && util.headerNameToString(header).startsWith('content-')) { - return true - } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util.headerNameToString(header); - return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' - } - return false - } + if (socket.destroyed) { + return false + } - // https://tools.ietf.org/html/rfc7231#section-6.4 - function cleanRequestHeaders (headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); + const len = Buffer.byteLength(chunk); + if (!len) { + return true + } + + // We should defer writing chunks. + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() } + + process.emitWarning(new RequestContentLengthMismatchError()); } - } else if (headers && typeof headers === 'object') { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); + + socket.cork(); + + if (bytesWritten === 0) { + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1'); + } else { + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); } } - } else { - assert(headers == null, 'headers must be an object or an array'); + + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1'); + } + + this.bytesWritten += len; + + const ret = socket.write(chunk); + + socket.uncork(); + + request.onBodySent(chunk); + + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + } + + return ret } - return ret - } - RedirectHandler_1 = RedirectHandler; - return RedirectHandler_1; -} + end () { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); -var redirectInterceptor; -var hasRequiredRedirectInterceptor; + socket[kWriting] = false; -function requireRedirectInterceptor () { - if (hasRequiredRedirectInterceptor) return redirectInterceptor; - hasRequiredRedirectInterceptor = 1; + if (socket[kError]) { + throw socket[kError] + } - const RedirectHandler = requireRedirectHandler(); + if (socket.destroyed) { + return + } - function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept (opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; + if (bytesWritten === 0) { + if (expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD send a Content-Length in a request message when + // no Transfer-Encoding is sent and the request method defines a meaning + // for an enclosed payload body. - if (!maxRedirections) { - return dispatch(opts, handler) + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); + } else { + socket.write(`${header}\r\n`, 'latin1'); } + } else if (contentLength === null) { + socket.write('\r\n0\r\n\r\n', 'latin1'); + } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting. - return dispatch(opts, redirectHandler) + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } } - } - } - redirectInterceptor = createRedirectInterceptor; - return redirectInterceptor; -} + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } -var llhttpWasm; -var hasRequiredLlhttpWasm; + client[kResume](); + } -function requireLlhttpWasm () { - if (hasRequiredLlhttpWasm) return llhttpWasm; - hasRequiredLlhttpWasm = 1; - llhttpWasm = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8='; - return llhttpWasm; -} + destroy (err) { + const { socket, client, abort } = this; -var llhttp_simdWasm; -var hasRequiredLlhttp_simdWasm; + socket[kWriting] = false; -function requireLlhttp_simdWasm () { - if (hasRequiredLlhttp_simdWasm) return llhttp_simdWasm; - hasRequiredLlhttp_simdWasm = 1; - llhttp_simdWasm = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=='; - return llhttp_simdWasm; -} + if (err) { + assert(client[kRunning] <= 1, 'pipeline should only contain this request'); + abort(err); + } + } + } -var client; -var hasRequiredClient; + clientH1$1 = connectH1; + return clientH1$1; +} -function requireClient () { - if (hasRequiredClient) return client; - hasRequiredClient = 1; +var clientH2$1; +var hasRequiredClientH2$1; - /* global WebAssembly */ +function requireClientH2$1 () { + if (hasRequiredClientH2$1) return clientH2$1; + hasRequiredClientH2$1 = 1; - const assert = require$$0$8; - const net = require$$0$9; - const http = require$$0$7; - const { pipeline } = require$$0__default$1; - const util = requireUtil$8(); - const timers = requireTimers(); - const Request = requireRequest$1(); - const DispatcherBase = requireDispatcherBase(); + const assert = require$$0$7; + const { pipeline } = require$$0$8; + const util = requireUtil$h(); const { RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = requireErrors$1(); - const buildConnector = requireConnect(); + InformationalError + } = requireErrors$2(); const { kUrl, kReset, - kServerName, kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, kRunning, kPending, - kSize, - kWriting, kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, kPendingIdx, kRunningIdx, kError, - kPipelining, kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, + kOnError, + kMaxConcurrentStreams, kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = requireSymbols$4(); + kResume, + kSize, + kHTTPContext + } = requireSymbols$9(); + + const kOpenStreams = Symbol('open streams'); + + let extractBody; + + // Experimental + let h2ExperimentalWarned = false; /** @type {import('http2')} */ let http2; try { - http2 = require('http2'); + http2 = require('node:http2'); } catch { // @ts-ignore http2 = { constants: {} }; @@ -9027,1071 +10355,1346 @@ function requireClient () { } } = http2; - // Experimental - let h2ExperimentalWarned = false; + function parseH2Headers (headers) { + const result = []; - const FastBuffer = Buffer[Symbol.species]; + for (const [name, value] of Object.entries(headers)) { + // h2 may concat the header value by array + // e.g. Set-Cookie + if (Array.isArray(value)) { + for (const subvalue of value) { + // we need to provide each header value of header name + // because the headers handler expect name-value pair + result.push(Buffer.from(name), Buffer.from(subvalue)); + } + } else { + result.push(Buffer.from(name), Buffer.from(value)); + } + } - const kClosedResolve = Symbol('kClosedResolve'); + return result + } - const channels = {}; + async function connectH2 (client, socket) { + client[kSocket] = socket; - try { - const diagnosticsChannel = require('diagnostics_channel'); - channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders'); - channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect'); - channels.connectError = diagnosticsChannel.channel('undici:client:connectError'); - channels.connected = diagnosticsChannel.channel('undici:client:connected'); - } catch { - channels.sendHeaders = { hasSubscribers: false }; - channels.beforeConnect = { hasSubscribers: false }; - channels.connectError = { hasSubscribers: false }; - channels.connected = { hasSubscribers: false }; - } + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning('H2 support is experimental, expect them to change at any time.', { + code: 'UNDICI-H2' + }); + } - /** - * @type {import('../types/client').default} - */ - class Client extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor (url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super(); + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + }); - if (keepAlive !== undefined) { - throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') - } + session[kOpenStreams] = 0; + session[kClient] = client; + session[kSocket] = socket; - if (socketTimeout !== undefined) { - throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') - } + util.addListener(session, 'error', onHttp2SessionError); + util.addListener(session, 'frameError', onHttp2FrameError); + util.addListener(session, 'end', onHttp2SessionEnd); + util.addListener(session, 'goaway', onHTTP2GoAway); + util.addListener(session, 'close', function () { + const { [kClient]: client } = this; + const { [kSocket]: socket } = client; - if (requestTimeout !== undefined) { - throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') - } + const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)); - if (idleTimeout !== undefined) { - throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') - } + client[kHTTP2Session] = null; - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') - } + if (client.destroyed) { + assert(client[kPending] === 0); - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError('invalid maxHeaderSize') + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } } + }); - if (socketPath != null && typeof socketPath !== 'string') { - throw new InvalidArgumentError('invalid socketPath') - } + session.unref(); - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError('invalid connectTimeout') - } + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveTimeout') - } + util.addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveMaxTimeout') - } + this[kError] = err; - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') - } + this[kClient][kOnError](err); + }); - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') - } + util.addListener(socket, 'end', function () { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); + }); - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') - } + util.addListener(socket, 'close', function () { + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + client[kSocket] = null; - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') - } + client[kPendingIdx] = client[kRunningIdx]; - if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError('localAddress must be valid string IP address') - } + assert(client[kRunning] === 0); - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError('maxResponseSize must be a positive number') - } + client.emit('disconnect', client[kUrl], [client], err); - if ( - autoSelectFamilyAttemptTimeout != null && - (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) - ) { - throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') - } + client[kResume](); + }); - // h2 - if (allowH2 != null && typeof allowH2 !== 'boolean') { - throw new InvalidArgumentError('allowH2 must be a valid boolean value') - } + let closed = false; + socket.on('close', () => { + closed = true; + }); - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0') + return { + version: 'h2', + defaultPipelining: Infinity, + write (...args) { + return writeH2(client, ...args) + }, + resume () { + resumeH2(client); + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + // Destroying the socket will trigger the session close + socket.destroy(err).on('close', callback); + } + }, + get destroyed () { + return socket.destroyed + }, + busy () { + return false } + } + } - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }); - } + function resumeH2 (client) { + const socket = client[kSocket]; - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) - ? interceptors.Client - : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming - this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = 'h1'; + if (socket?.destroyed === false) { + if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + socket.unref(); + client[kHTTP2Session].unref(); + } else { + socket.ref(); + client[kHTTP2Session].ref(); + } + } + } - // HTTP/2 - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 - ? null - : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, // Keep track of them to decide wether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server - }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}`; + function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); - // kQueue is built up of 3 sections separated by - // the kRunningIdx and kPendingIdx indices. - // | complete | running | pending | - // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length - // kRunningIdx points to the first running element. - // kPendingIdx points to the first pending element. - // This implements a fast queue with an amortized - // time of O(1). + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; + function onHttp2FrameError (type, code, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); } + } - get pipelining () { - return this[kPipelining] - } + function onHttp2SessionEnd () { + const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket])); + this.destroy(err); + util.destroy(this[kSocket], err); + } - set pipelining (value) { - this[kPipelining] = value; - resume(this, true); - } + /** + * This is the root cause of #3011 + * We need to handle GOAWAY frames properly, and trigger the session close + * along with the socket right away + */ + function onHTTP2GoAway (code) { + // We cannot recover, so best to close the session and the socket + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)); + const client = this[kClient]; - get [kPending] () { - return this[kQueue].length - this[kPendingIdx] - } + client[kSocket] = null; + client[kHTTPContext] = null; - get [kRunning] () { - return this[kPendingIdx] - this[kRunningIdx] + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + this[kHTTP2Session] = null; } - get [kSize] () { - return this[kQueue].length - this[kRunningIdx] - } + util.destroy(this[kSocket], err); - get [kConnected] () { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed + // Fail head of pipeline. + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util.errorRequest(client, request, err); + client[kPendingIdx] = client[kRunningIdx]; } - get [kBusy] () { - const socket = this[kSocket]; - return ( - (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || - (this[kSize] >= (this[kPipelining] || 1)) || - this[kPending] > 0 - ) + assert(client[kRunning] === 0); + + client.emit('disconnect', client[kUrl], [client], err); + + client[kResume](); + } + + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 + function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' + } + + function writeH2 (client, request) { + const session = client[kHTTP2Session]; + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + let { body } = request; + + if (upgrade) { + util.errorRequest(client, request, new Error('Upgrade not supported for H2')); + return false } - /* istanbul ignore: only used for test */ - [kConnect] (cb) { - connect(this); - this.once('connect', cb); + const headers = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `,${val[i]}`; + } else { + headers[key] = val[i]; + } + } + } else { + headers[key] = val; + } } - [kDispatch] (opts, handler) { - const origin = opts.origin || this[kUrl].origin; + /** @type {import('node:http2').ClientHttp2Stream} */ + let stream; - const request = this[kHTTPConnVersion] === 'h2' - ? Request[kHTTP2BuildRequest](origin, opts, handler) - : Request[kHTTP1BuildRequest](origin, opts, handler); + const { hostname, port } = client[kUrl]; - this[kQueue].push(request); - if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - // Wait a tick in case stream/iterator is ended in the same tick. - this[kResuming] = 1; - process.nextTick(resume, this); - } else { - resume(this, true); + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`; + headers[HTTP2_HEADER_METHOD] = method; + + const abort = (err) => { + if (request.aborted || request.completed) { + return } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; + err = err || new RequestAbortedError(); + + util.errorRequest(client, request, err); + + if (stream != null) { + util.destroy(stream, err); } - return this[kNeedDrain] < 2 + // We do not destroy the socket as we can continue using the session + // the stream get's destroyed and the session remains to create new streams + util.destroy(body, err); + client[kQueue][client[kRunningIdx]++] = null; + client[kResume](); + }; + + try { + // We are already connected, streams are pending. + // We can call on connect, and wait for abort + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); } - async [kClose] () { - // TODO: for H2 we need to gracefully flush the remaining enqueued - // request and close each stream. - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null); - } else { - this[kClosedResolve] = resolve; - } - }) + if (request.aborted) { + return false } - async [kDestroy] (err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - - const callback = () => { - if (this[kClosedResolve]) { - // TODO (fix): Should we error here with ClientDestroyedError? - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; + if (method === 'CONNECT') { + session.ref(); + // We are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream + stream = session.request(headers, { endStream: false, signal }); - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; - } + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + }); + } - if (!this[kSocket]) { - queueMicrotask(callback); - } else { - util.destroy(this[kSocket].on('close', callback), err); - } + stream.once('close', () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); + }); - resume(this); - }) + return true } - } - function onHttp2SessionError (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + // https://tools.ietf.org/html/rfc7540#section-8.3 + // :path and :scheme headers must be omitted when sending CONNECT - this[kSocket][kError] = err; + headers[HTTP2_HEADER_PATH] = path; + headers[HTTP2_HEADER_SCHEME] = 'https'; - onError(this[kClient], err); - } + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - function onHttp2FrameError (type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. - if (id === 0) { - this[kSocket][kError] = err; - onError(this[kClient], err); + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ); + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0); } - } - function onHttp2SessionEnd () { - util.destroy(this, new SocketError('other side closed')); - util.destroy(this[kSocket], new SocketError('other side closed')); - } + let contentLength = util.bodyLength(body); - function onHTTP2GoAway (code) { - const client = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); - client[kSocket] = null; - client[kHTTP2Session] = null; + if (util.isFormDataLike(body)) { + extractBody ??= requireBody$1().extractBody; - if (client.destroyed) { - assert(this[kPending] === 0); + const [bodyStream, contentType] = extractBody(body); + headers['content-type'] = contentType; - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - } else if (client[kRunning] > 0) { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; + body = bodyStream.stream; + contentLength = bodyStream.length; + } - errorRequest(client, request, err); + if (contentLength == null) { + contentLength = request.contentLength; } - client[kPendingIdx] = client[kRunningIdx]; + if (contentLength === 0 || !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. - assert(client[kRunning] === 0); + contentLength = null; + } - client.emit('disconnect', - client[kUrl], - [client], - err - ); + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false + } - resume(client); - } + process.emitWarning(new RequestContentLengthMismatchError()); + } - const constants = requireConstants$9(); - const createRedirectInterceptor = requireRedirectInterceptor(); - const EMPTY_BUF = Buffer.alloc(0); + if (contentLength != null) { + assert(body, 'no body must not have content length'); + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } - async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm() : undefined; + session.ref(); - let mod; - try { - mod = await WebAssembly.compile(Buffer.from(requireLlhttp_simdWasm(), 'base64')); - } catch (e) { - /* istanbul ignore next */ + const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null; + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = '100-continue'; + stream = session.request(headers, { endStream: shouldEndStream, signal }); - // We could check if the error was caused by the simd option not - // being enabled, but the occurring of this other error - // * https://github.com/emscripten-core/emscripten/issues/11495 - // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || requireLlhttpWasm(), 'base64')); + stream.once('continue', writeBodyH2); + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); } - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ + // Increment counter as we have new streams open + ++session[kOpenStreams]; - wasm_on_url: (p, at, len) => { - /* istanbul ignore next */ - return 0 - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0 - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0 + stream.once('response', headers => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers; + request.onResponseStarted(); + + // Due to the stream nature, it is possible we face a race condition + // where the stream has been assigned, but the request has been aborted + // the request remains in-flight and headers hasn't been received yet + // for those scenarios, best effort is to destroy the stream immediately + // as there's no value to keep it open. + if (request.aborted) { + const err = new RequestAbortedError(); + util.errorRequest(client, request, err); + util.destroy(stream, err); + return + } + + if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) { + stream.pause(); + } + + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); } + }); + }); - /* eslint-enable camelcase */ + stream.once('end', () => { + // When state is null, it means we haven't consumed body and the stream still do not have + // a state. + // Present specially when using pipeline or stream + if (stream.state?.state == null || stream.state.state < 6) { + request.onComplete([]); } - }) - } - let llhttpInstance = null; - let llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); + if (session[kOpenStreams] === 0) { + // Stream is closed or half-closed-remote (6), decrement counter and cleanup + // It does not have sense to continue working with the stream as we do not + // have yet RST_STREAM support on client-side - let currentParser = null; - let currentBufferRef = null; - let currentBufferSize = 0; - let currentBufferPtr = null; + session.unref(); + } + + abort(new InformationalError('HTTP/2: stream half-closed (remote)')); + client[kQueue][client[kRunningIdx]++] = null; + client[kPendingIdx] = client[kRunningIdx]; + client[kResume](); + }); - const TIMEOUT_HEADERS = 1; - const TIMEOUT_BODY = 2; - const TIMEOUT_IDLE = 3; + stream.once('close', () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + }); - class Parser { - constructor (client, socket, { exports: exports$1 }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + stream.once('error', function (err) { + abort(err); + }); - this.llhttp = exports$1; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ''; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); + stream.once('frameError', (type, code) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); + }); - this.bytesRead = 0; + // stream.on('aborted', () => { + // // TODO(HTTP/2): Support aborted + // }) - this.keepAlive = ''; - this.contentLength = ''; - this.connection = ''; - this.maxResponseSize = client[kMaxResponseSize]; - } + // stream.on('timeout', () => { + // // TODO(HTTP/2): Support timeout + // }) - setTimeout (value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - // istanbul ignore else: only for jest - if (this.timeout.unref) { - this.timeout.unref(); - } + // stream.on('push', headers => { + // // TODO(HTTP/2): Support push + // }) + + // stream.on('trailers', headers => { + // // TODO(HTTP/2): Support trailers + // }) + + return true + + function writeBodyH2 () { + /* istanbul ignore else: assertion */ + if (!body || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util.isBuffer(body)) { + writeBuffer( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable( + abort, + stream, + body.stream(), + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); + writeBlob( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } + } else if (util.isStream(body)) { + writeStream( + abort, + client[kSocket], + expectsPayload, + stream, + body, + client, + request, + contentLength + ); + } else if (util.isIterable(body)) { + writeIterable( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else { + assert(false); } } + } - resume () { - if (this.socket.destroyed || !this.paused) { - return - } - - assert(this.ptr != null); - assert(currentParser == null); + function writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + try { + if (body != null && util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length'); + h2stream.cork(); + h2stream.write(body); + h2stream.uncork(); + h2stream.end(); - this.llhttp.llhttp_resume(this.ptr); + request.onBodySent(body); + } - assert(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); - } + if (!expectsPayload) { + socket[kReset] = true; } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); // Flush parser. - this.readMore(); + request.onRequestSent(); + client[kResume](); + } catch (error) { + abort(error); } + } - readMore () { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break - } - this.execute(chunk); - } - } + function writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); - execute (data) { - assert(this.ptr != null); - assert(currentParser == null); - assert(!this.paused); + // For HTTP/2, is enough to pipe the stream + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(pipe, err); + abort(err); + } else { + util.removeAllListeners(pipe); + request.onRequestSent(); - const { socket, llhttp } = this; + if (!expectsPayload) { + socket[kReset] = true; + } - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); + client[kResume](); } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); } + ); - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - - // Call `execute` on the wasm parser. - // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, - // and finally the length of bytes to parse. - // The return value is an error code or `constants.ERROR.OK`. - try { - let ret; + util.addListener(pipe, 'data', onPipeData); - try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - /* eslint-disable-next-line no-useless-catch */ - } catch (err) { - /* istanbul ignore next: difficult to make a test case for */ - throw err - } finally { - currentParser = null; - currentBufferRef = null; - } + function onPipeData (chunk) { + request.onBodySent(chunk); + } + } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + async function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length'); - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ''; - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')'; - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) - } - } catch (err) { - util.destroy(socket, err); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() } - } - destroy () { - assert(this.ptr != null); - assert(currentParser == null); + const buffer = Buffer.from(await body.arrayBuffer()); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + h2stream.end(); - timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; + request.onBodySent(buffer); + request.onRequestSent(); - this.paused = false; - } + if (!expectsPayload) { + socket[kReset] = true; + } - onStatus (buf) { - this.statusText = buf.toString(); + client[kResume](); + } catch (err) { + abort(err); } + } - onMessageBegin () { - const { socket, client } = this; - - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } + async function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1 + let callback = null; + function onDrain () { + if (callback) { + const cb = callback; + callback = null; + cb(); } } - onHeaderField (buf) { - const len = this.headers.length; + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); - if ((len & 1) === 0) { - this.headers.push(buf); + if (socket[kError]) { + reject(socket[kError]); } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + callback = resolve; } + }); - this.trackHeader(buf.length); - } + h2stream + .on('close', onDrain) + .on('drain', onDrain); - onHeaderValue (buf) { - let len = this.headers.length; + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { + await waitForDrain(); + } } - const key = this.headers[len - 2]; - if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { - this.keepAlive += buf.toString(); - } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') { - this.connection += buf.toString(); - } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { - this.contentLength += buf.toString(); - } + h2stream.end(); - this.trackHeader(buf.length); - } + request.onRequestSent(); - trackHeader (len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()); + if (!expectsPayload) { + socket[kReset] = true; } + + client[kResume](); + } catch (err) { + abort(err); + } finally { + h2stream + .off('close', onDrain) + .off('drain', onDrain); } + } - onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode } = this; + clientH2$1 = connectH2; + return clientH2$1; +} - assert(upgrade); +var redirectHandler$1; +var hasRequiredRedirectHandler$1; - const request = client[kQueue][client[kRunningIdx]]; - assert(request); +function requireRedirectHandler$1 () { + if (hasRequiredRedirectHandler$1) return redirectHandler$1; + hasRequiredRedirectHandler$1 = 1; - assert(!socket.destroyed); - assert(socket === client[kSocket]); - assert(!this.paused); - assert(request.upgrade || request.method === 'CONNECT'); + const util = requireUtil$h(); + const { kBodyUsed } = requireSymbols$9(); + const assert = require$$0$7; + const { InvalidArgumentError } = requireErrors$2(); + const EE = require$$8; - this.statusCode = null; - this.statusText = ''; - this.shouldKeepAlive = null; + const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; + const kBody = Symbol('body'); - socket.unshift(head); + class BodyAsyncIterable { + constructor (body) { + this[kBody] = body; + this[kBodyUsed] = false; + } - socket[kParser].destroy(); - socket[kParser] = null; + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed'); + this[kBodyUsed] = true; + yield * this[kBody]; + } + } - socket[kClient] = null; - socket[kError] = null; - socket - .removeListener('error', onSocketError) - .removeListener('readable', onSocketReadable) - .removeListener('end', onSocketEnd) - .removeListener('close', onSocketClose); - - client[kSocket] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')); - - try { - request.onUpgrade(statusCode, headers, socket); - } catch (err) { - util.destroy(socket, err); + class RedirectHandler { + constructor (dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') } - resume(client); - } - - onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; + util.validateHandler(handler, opts.method, opts.upgrade); - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; + this.redirectionLimitReached = false; - const request = client[kQueue][client[kRunningIdx]]; + if (util.isStream(this.opts.body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body + .on('data', function () { + assert(false); + }); + } - /* istanbul ignore next: difficult to make a test case for */ - if (!request) { - return -1 + if (typeof this.opts.body.readableDidRead !== 'boolean') { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, 'data', function () { + this[kBodyUsed] = true; + }); + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if ( + this.opts.body && + typeof this.opts.body !== 'string' && + !ArrayBuffer.isView(this.opts.body) && + util.isIterable(this.opts.body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + this.opts.body = new BodyAsyncIterable(this.opts.body); } + } - assert(!this.upgrade); - assert(this.statusCode < 200); - - if (statusCode === 100) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))); - return -1 - } + onConnect (abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } - /* this can only happen if server is misbehaving */ - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))); - return -1 - } + onUpgrade (statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + onError (error) { + this.handler.onError(error); + } - this.statusCode = statusCode; - this.shouldKeepAlive = ( - shouldKeepAlive || - // Override llhttp value which does not allow keepAlive for HEAD. - (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') - ); + onHeaders (statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) + ? null + : parseLocation(statusCode, headers); - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null - ? request.bodyTimeout - : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + if (this.request) { + this.request.abort(new Error('max redirects')); } - } - if (request.method === 'CONNECT') { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2 + this.redirectionLimitReached = true; + this.abort(new Error('max redirects')); + return } - if (upgrade) { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2 + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); } - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; - } - } else { - // Stop more requests from being dispatched. - socket[kReset] = true; + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText) } - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - - if (request.aborted) { - return -1 - } + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; - if (request.method === 'HEAD') { - return 1 - } + // Remove headers referring to the original URL. + // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. + // https://tools.ietf.org/html/rfc7231#section-6.4 + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; - if (statusCode < 200) { - return 1 + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + // In case of HTTP 303, always replace method to be either HEAD or GET + if (statusCode === 303 && this.opts.method !== 'HEAD') { + this.opts.method = 'GET'; + this.opts.body = null; } + } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client); + onData (chunk) { + if (this.location) ; else { + return this.handler.onData(chunk) } - - return pause ? constants.ERROR.PAUSED : 0 } - onBody (buf) { - const { client, socket, statusCode, maxResponseSize } = this; + onComplete (trailers) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 - if (socket.destroyed) { - return -1 - } + TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections + and neither are useful if present. - const request = client[kQueue][client[kRunningIdx]]; - assert(request); + See comment on onData method above for more detailed information. + */ - assert.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } + this.location = null; + this.abort = null; - assert(statusCode >= 200); + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()); - return -1 + onBodySent (chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); } + } + } - this.bytesRead += buf.length; + function parseLocation (statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null + } - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].length === 8 && util.headerNameToString(headers[i]) === 'location') { + return headers[i + 1] } } + } - onMessageComplete () { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + function shouldRemoveHeader (header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header); + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false + } - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1 + // https://tools.ietf.org/html/rfc7231#section-6.4 + function cleanRequestHeaders (headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); + } } - - if (upgrade) { - return + } else if (headers && typeof headers === 'object') { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); + } } + } else { + assert(headers == null, 'headers must be an object or an array'); + } + return ret + } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - - assert(statusCode >= 100); - - this.statusCode = null; - this.statusText = ''; - this.bytesRead = 0; - this.contentLength = ''; - this.keepAlive = ''; - this.connection = ''; + redirectHandler$1 = RedirectHandler; + return redirectHandler$1; +} - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; +var redirectInterceptor$1; +var hasRequiredRedirectInterceptor$1; - if (statusCode < 200) { - return - } +function requireRedirectInterceptor$1 () { + if (hasRequiredRedirectInterceptor$1) return redirectInterceptor$1; + hasRequiredRedirectInterceptor$1 = 1; - /* istanbul ignore next: should be handled by llhttp? */ - if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()); - return -1 - } + const RedirectHandler = requireRedirectHandler$1(); - request.onComplete(headers); + function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept (opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts; - client[kQueue][client[kRunningIdx]++] = null; + if (!maxRedirections) { + return dispatch(opts, handler) + } - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0); - // Response completed before request. - util.destroy(socket, new InformationalError('reset')); - return constants.ERROR.PAUSED - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError('reset')); - return constants.ERROR.PAUSED - } else if (socket[kReset] && client[kRunning] === 0) { - // Destroy socket once all requests have completed. - // The request at the tail of the pipeline is the one - // that requested reset and no further requests should - // have been queued since then. - util.destroy(socket, new InformationalError('reset')); - return constants.ERROR.PAUSED - } else if (client[kPipelining] === 1) { - // We must wait a full event loop cycle to reuse this socket to make sure - // that non-spec compliant servers are not closing the connection even if they - // said they won't. - setImmediate(resume, client); - } else { - resume(client); + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); + opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting. + return dispatch(opts, redirectHandler) } } } - function onParserTimeout (parser) { - const { socket, timeoutType, client } = parser; - - /* istanbul ignore else */ - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, 'cannot be paused while waiting for headers'); - util.destroy(socket, new HeadersTimeoutError()); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError()); - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util.destroy(socket, new InformationalError('socket idle timeout')); - } - } + redirectInterceptor$1 = createRedirectInterceptor; + return redirectInterceptor$1; +} - function onSocketReadable () { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); - } - } +var client$1; +var hasRequiredClient$1; - function onSocketError (err) { - const { [kClient]: client, [kParser]: parser } = this; +function requireClient$1 () { + if (hasRequiredClient$1) return client$1; + hasRequiredClient$1 = 1; - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + const assert = require$$0$7; + const net = require$$0$9; + const http = require$$2; + const util = requireUtil$h(); + const { channels } = requireDiagnostics$1(); + const Request = requireRequest$3(); + const DispatcherBase = requireDispatcherBase$1(); + const { + InvalidArgumentError, + InformationalError, + ClientDestroyedError + } = requireErrors$2(); + const buildConnector = requireConnect$1(); + const { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume + } = requireSymbols$9(); + const connectH1 = requireClientH1$1(); + const connectH2 = requireClientH2$1(); + let deprecatedInterceptorWarned = false; - if (client[kHTTPConnVersion] !== 'h2') { - // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded - // to the user. - if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete(); - return - } - } + const kClosedResolve = Symbol('kClosedResolve'); - this[kError] = err; + const noop = () => {}; - onError(this[kClient], err); + function getPipelining (client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1 } - function onError (client, err) { - if ( - client[kRunning] === 0 && - err.code !== 'UND_ERR_INFO' && - err.code !== 'UND_ERR_SOCKET' - ) { - // Error is not caused by running request and not a recoverable - // socket error. + /** + * @type {import('../../types/client.js').default} + */ + class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor (url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2 + } = {}) { + super(); - assert(client[kPendingIdx] === client[kRunningIdx]); + if (keepAlive !== undefined) { + throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') + } - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + if (socketTimeout !== undefined) { + throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') } - assert(client[kSize] === 0); - } - } - function onSocketEnd () { - const { [kParser]: parser, [kClient]: client } = this; + if (requestTimeout !== undefined) { + throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') + } - if (client[kHTTPConnVersion] !== 'h2') { - if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete(); - return + if (idleTimeout !== undefined) { + throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') } - } - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); - } + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + } - function onSocketClose () { - const { [kClient]: client, [kParser]: parser } = this; + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError('invalid maxHeaderSize') + } - if (client[kHTTPConnVersion] === 'h1' && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete(); + if (socketPath != null && typeof socketPath !== 'string') { + throw new InvalidArgumentError('invalid socketPath') } - this[kParser].destroy(); - this[kParser] = null; - } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError('invalid connectTimeout') + } - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveTimeout') + } - client[kSocket] = null; + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveMaxTimeout') + } - if (client.destroyed) { - assert(client[kPending] === 0); + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') + } - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') } - } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + } - client[kPendingIdx] = client[kRunningIdx]; + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } - assert(client[kRunning] === 0); + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - client.emit('disconnect', client[kUrl], [client], err); + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + } - resume(client); - } + if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError('localAddress must be valid string IP address') + } - async function connect (client) { - assert(!client[kConnecting]); - assert(!client[kSocket]); + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError('maxResponseSize must be a positive number') + } - let { host, hostname, protocol, port } = client[kUrl]; + if ( + autoSelectFamilyAttemptTimeout != null && + (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) + ) { + throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') + } - // Resolve ipv6 + // h2 + if (allowH2 != null && typeof allowH2 !== 'boolean') { + throw new InvalidArgumentError('allowH2 must be a valid boolean value') + } + + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0') + } + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }); + } + + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client; + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true; + process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', { + code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED' + }); + } + } else { + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; + } + + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming + this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; // Max peerConcurrentStreams for a Node h2 server + this[kHTTPContext] = null; + + // kQueue is built up of 3 sections separated by + // the kRunningIdx and kPendingIdx indices. + // | complete | running | pending | + // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length + // kRunningIdx points to the first running element. + // kPendingIdx points to the first pending element. + // This implements a fast queue with an amortized + // time of O(1). + + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); + } + + get pipelining () { + return this[kPipelining] + } + + set pipelining (value) { + this[kPipelining] = value; + this[kResume](true); + } + + get [kPending] () { + return this[kQueue].length - this[kPendingIdx] + } + + get [kRunning] () { + return this[kPendingIdx] - this[kRunningIdx] + } + + get [kSize] () { + return this[kQueue].length - this[kRunningIdx] + } + + get [kConnected] () { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed + } + + get [kBusy] () { + return Boolean( + this[kHTTPContext]?.busy(null) || + (this[kSize] >= (getPipelining(this) || 1)) || + this[kPending] > 0 + ) + } + + /* istanbul ignore: only used for test */ + [kConnect] (cb) { + connect(this); + this.once('connect', cb); + } + + [kDispatch] (opts, handler) { + const origin = opts.origin || this[kUrl].origin; + const request = new Request(origin, opts, handler); + + this[kQueue].push(request); + if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + // Wait a tick in case stream/iterator is ended in the same tick. + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); + } + + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + + return this[kNeedDrain] < 2 + } + + async [kClose] () { + // TODO: for H2 we need to gracefully flush the remaining enqueued + // request and close each stream. + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; + } else { + resolve(null); + } + }) + } + + async [kDestroy] (err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(this, request, err); + } + + const callback = () => { + if (this[kClosedResolve]) { + // TODO (fix): Should we error here with ClientDestroyedError? + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + + this[kResume](); + }) + } + } + + const createRedirectInterceptor = requireRedirectInterceptor$1(); + + function onError (client, err) { + if ( + client[kRunning] === 0 && + err.code !== 'UND_ERR_INFO' && + err.code !== 'UND_ERR_SOCKET' + ) { + // Error is not caused by running request and not a recoverable + // socket error. + + assert(client[kPendingIdx] === client[kRunningIdx]); + + const requests = client[kQueue].splice(client[kRunningIdx]); + + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + assert(client[kSize] === 0); + } + } + + /** + * @param {Client} client + * @returns + */ + async function connect (client) { + assert(!client[kConnecting]); + assert(!client[kHTTPContext]); + + let { host, hostname, protocol, port } = client[kUrl]; + + // Resolve ipv6 if (hostname[0] === '[') { const idx = hostname.indexOf(']'); @@ -10111,6 +11714,7 @@ function requireClient () { hostname, protocol, port, + version: client[kHTTPContext]?.version, servername: client[kServerName], localAddress: client[kLocalAddress] }, @@ -10137,66 +11741,28 @@ function requireClient () { }); if (client.destroyed) { - util.destroy(socket.on('error', () => {}), new ClientDestroyedError()); + util.destroy(socket.on('error', noop), new ClientDestroyedError()); return } - client[kConnecting] = false; - assert(socket); - const isH2 = socket.alpnProtocol === 'h2'; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning('H2 support is experimental, expect them to change at any time.', { - code: 'UNDICI-H2' - }); - } - - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }); - - client[kHTTPConnVersion] = 'h2'; - session[kClient] = client; - session[kSocket] = socket; - session.on('error', onHttp2SessionError); - session.on('frameError', onHttp2FrameError); - session.on('end', onHttp2SessionEnd); - session.on('goaway', onHTTP2GoAway); - session.on('close', onSocketClose); - session.unref(); - - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); + try { + client[kHTTPContext] = socket.alpnProtocol === 'h2' + ? await connectH2(client, socket) + : await connectH1(client, socket); + } catch (err) { + socket.destroy().on('error', noop); + throw err } + client[kConnecting] = false; + socket[kCounter] = 0; socket[kMaxRequests] = client[kMaxRequests]; socket[kClient] = client; socket[kError] = null; - socket - .on('error', onSocketError) - .on('readable', onSocketReadable) - .on('end', onSocketEnd) - .on('close', onSocketClose); - - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { channels.connected.publish({ connectParams: { @@ -10204,6 +11770,7 @@ function requireClient () { hostname, protocol, port, + version: client[kHTTPContext]?.version, servername: client[kServerName], localAddress: client[kLocalAddress] }, @@ -10226,6 +11793,7 @@ function requireClient () { hostname, protocol, port, + version: client[kHTTPContext]?.version, servername: client[kServerName], localAddress: client[kLocalAddress] }, @@ -10238,7 +11806,7 @@ function requireClient () { assert(client[kRunning] === 0); while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); + util.errorRequest(client, request, err); } } else { onError(client, err); @@ -10247,7 +11815,7 @@ function requireClient () { client.emit('connectionError', client[kUrl], [client], err); } - resume(client); + client[kResume](); } function emitDrain (client) { @@ -10285,32 +11853,8 @@ function requireClient () { return } - const socket = client[kSocket]; - - if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request.headersTimeout != null - ? request.headersTimeout - : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } + if (client[kHTTPContext]) { + client[kHTTPContext].resume(); } if (client[kBusy]) { @@ -10318,7 +11862,7 @@ function requireClient () { } else if (client[kNeedDrain] === 2) { if (sync) { client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); + queueMicrotask(() => emitDrain(client)); } else { emitDrain(client); } @@ -10329,7 +11873,7 @@ function requireClient () { return } - if (client[kRunning] >= (client[kPipelining] || 1)) { + if (client[kRunning] >= (getPipelining(client) || 1)) { return } @@ -10341,54 +11885,30 @@ function requireClient () { } client[kServerName] = request.servername; - - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError('servername changed')); - return - } + client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => { + client[kHTTPContext] = null; + resume(client); + }); } if (client[kConnecting]) { return } - if (!socket && !client[kHTTP2Session]) { + if (!client[kHTTPContext]) { connect(client); return } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return - } - - if (client[kRunning] > 0 && !request.idempotent) { - // Non-idempotent request cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. + if (client[kHTTPContext].destroyed) { return } - if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { - // Don't dispatch an upgrade until all preceding requests have completed. - // A misbehaving server might upgrade the connection before all pipelined - // request has completed. - return - } - - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && - (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - // Request with stream or iterator body can error while other requests - // are inflight and indirectly error those as well. - // Ensure this doesn't happen by waiting for inflight - // to complete before dispatching. - - // Request with stream or iterator body cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. + if (client[kHTTPContext].busy(request)) { return } - if (!request.aborted && write(client, request)) { + if (!request.aborted && client[kHTTPContext].write(request)) { client[kPendingIdx]++; } else { client[kQueue].splice(client[kPendingIdx], 1); @@ -10396,1746 +11916,1756 @@ function requireClient () { } } - // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 - function shouldSendContentLength (method) { - return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' - } - - function write (client, request) { - if (client[kHTTPConnVersion] === 'h2') { - writeH2(client, client[kHTTP2Session], request); - return - } - - const { body, method, path, host, upgrade, headers, blocking, reset } = request; + client$1 = Client; + return client$1; +} - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 +/* eslint-disable */ - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. +var fixedQueue$1; +var hasRequiredFixedQueue$1; - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ); +function requireFixedQueue$1 () { + if (hasRequiredFixedQueue$1) return fixedQueue$1; + hasRequiredFixedQueue$1 = 1; - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0); - } + // Extracted from node/lib/internal/fixed_queue.js - const bodyLength = util.bodyLength(body); + // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. + const kSize = 2048; + const kMask = kSize - 1; - let contentLength = bodyLength; + // The FixedQueue is implemented as a singly-linked list of fixed-size + // circular buffers. It looks something like this: + // + // head tail + // | | + // v v + // +-----------+ <-----\ +-----------+ <------\ +-----------+ + // | [null] | \----- | next | \------- | next | + // +-----------+ +-----------+ +-----------+ + // | item | <-- bottom | item | <-- bottom | [empty] | + // | item | | item | | [empty] | + // | item | | item | | [empty] | + // | item | | item | | [empty] | + // | item | | item | bottom --> | item | + // | item | | item | | item | + // | ... | | ... | | ... | + // | item | | item | | item | + // | item | | item | | item | + // | [empty] | <-- top | item | | item | + // | [empty] | | item | | item | + // | [empty] | | [empty] | <-- top top --> | [empty] | + // +-----------+ +-----------+ +-----------+ + // + // Or, if there is only one circular buffer, it looks something + // like either of these: + // + // head tail head tail + // | | | | + // v v v v + // +-----------+ +-----------+ + // | [null] | | [null] | + // +-----------+ +-----------+ + // | [empty] | | item | + // | [empty] | | item | + // | item | <-- bottom top --> | [empty] | + // | item | | [empty] | + // | [empty] | <-- top bottom --> | item | + // | [empty] | | item | + // +-----------+ +-----------+ + // + // Adding a value means moving `top` forward by one, removing means + // moving `bottom` forward by one. After reaching the end, the queue + // wraps around. + // + // When `top === bottom` the current queue is empty and when + // `top + 1 === bottom` it's full. This wastes a single space of storage + // but allows much quicker checks. - if (contentLength === null) { - contentLength = request.contentLength; + class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; } - if (contentLength === 0 && !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. - - contentLength = null; + isEmpty() { + return this.top === this.bottom; } - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false - } - - process.emitWarning(new RequestContentLengthMismatchError()); + isFull() { + return ((this.top + 1) & kMask) === this.bottom; } - const socket = client[kSocket]; - - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } - - errorRequest(client, request, err || new RequestAbortedError()); - - util.destroy(socket, new InformationalError('aborted')); - }); - } catch (err) { - errorRequest(client, request, err); + push(data) { + this.list[this.top] = data; + this.top = (this.top + 1) & kMask; } - if (request.aborted) { - return false + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = (this.bottom + 1) & kMask; + return nextItem; } + } - if (method === 'HEAD') { - // https://github.com/mcollina/undici/issues/258 - // Close after a HEAD request to interop with misbehaving servers - // that may send a body in the response. - - socket[kReset] = true; + fixedQueue$1 = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - if (upgrade || method === 'CONNECT') { - // On CONNECT or upgrade, block pipeline from dispatching further - // requests on this connection. - - socket[kReset] = true; + isEmpty() { + return this.head.isEmpty(); } - if (reset != null) { - socket[kReset] = reset; + push(data) { + if (this.head.isFull()) { + // Head is full: Creates a new queue, sets the old queue's `.next` to it, + // and sets it as the new main queue. + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + // If there is another queue, it forms the new tail. + this.tail = tail.next; + } + return next; } + }; + return fixedQueue$1; +} - if (blocking) { - socket[kBlocking] = true; - } +var poolStats$1; +var hasRequiredPoolStats$1; - let header = `${method} ${path} HTTP/1.1\r\n`; +function requirePoolStats$1 () { + if (hasRequiredPoolStats$1) return poolStats$1; + hasRequiredPoolStats$1 = 1; + const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$9(); + const kPool = Symbol('pool'); - if (typeof host === 'string') { - header += `host: ${host}\r\n`; - } else { - header += client[kHostHeader]; + class PoolStats { + constructor (pool) { + this[kPool] = pool; } - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; - } else if (client[kPipelining] && !socket[kReset]) { - header += 'connection: keep-alive\r\n'; - } else { - header += 'connection: close\r\n'; + get connected () { + return this[kPool][kConnected] } - if (headers) { - header += headers; + get free () { + return this[kPool][kFree] } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); + get pending () { + return this[kPool][kPending] } - /* istanbul ignore else: assertion */ - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); - } else { - assert(contentLength === null, 'no body must not have content length'); - socket.write(`${header}\r\n`, 'latin1'); - } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length'); + get queued () { + return this[kPool][kQueued] + } - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert(false); + get running () { + return this[kPool][kRunning] } - return true + get size () { + return this[kPool][kSize] + } } - function writeH2 (client, session, request) { - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + poolStats$1 = PoolStats; + return poolStats$1; +} - let headers; - if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else headers = reqHeaders; +var poolBase$1; +var hasRequiredPoolBase$1; - if (upgrade) { - errorRequest(client, request, new Error('Upgrade not supported for H2')); - return false - } +function requirePoolBase$1 () { + if (hasRequiredPoolBase$1) return poolBase$1; + hasRequiredPoolBase$1 = 1; - try { - // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event? - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } + const DispatcherBase = requireDispatcherBase$1(); + const FixedQueue = requireFixedQueue$1(); + const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$9(); + const PoolStats = requirePoolStats$1(); - errorRequest(client, request, err || new RequestAbortedError()); - }); - } catch (err) { - errorRequest(client, request, err); - } + const kClients = Symbol('clients'); + const kNeedDrain = Symbol('needDrain'); + const kQueue = Symbol('queue'); + const kClosedResolve = Symbol('closed resolve'); + const kOnDrain = Symbol('onDrain'); + const kOnConnect = Symbol('onConnect'); + const kOnDisconnect = Symbol('onDisconnect'); + const kOnConnectionError = Symbol('onConnectionError'); + const kGetDispatcher = Symbol('get dispatcher'); + const kAddClient = Symbol('add client'); + const kRemoveClient = Symbol('remove client'); + const kStats = Symbol('stats'); - if (request.aborted) { - return false - } + class PoolBase extends DispatcherBase { + constructor () { + super(); - /** @type {import('node:http2').ClientHttp2Stream} */ - let stream; - const h2State = client[kHTTP2SessionState]; + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; - headers[HTTP2_HEADER_METHOD] = method; + const pool = this; - if (method === 'CONNECT') { - session.ref(); - // we are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered - // We disabled endStream to allow the user to write to the stream - stream = session.request(headers, { endStream: false, signal }); + this[kOnDrain] = function onDrain (origin, targets) { + const queue = pool[kQueue]; - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - } else { - stream.once('ready', () => { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - }); - } + let needDrain = false; - stream.once('close', () => { - h2State.openStreams -= 1; - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) session.unref(); - }); + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break + } + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } - return true - } + this[kNeedDrain] = needDrain; - // https://tools.ietf.org/html/rfc7540#section-8.3 - // :path and :scheme headers must be omited when sending CONNECT + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit('drain', origin, [pool, ...targets]); + } - headers[HTTP2_HEADER_PATH] = path; - headers[HTTP2_HEADER_SCHEME] = 'https'; + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise + .all(pool[kClients].map(c => c.close())) + .then(pool[kClosedResolve]); + } + }; - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 + this[kOnConnect] = (origin, targets) => { + pool.emit('connect', origin, [pool, ...targets]); + }; - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit('disconnect', origin, [pool, ...targets], err); + }; - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ); + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit('connectionError', origin, [pool, ...targets], err); + }; - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0); + this[kStats] = new PoolStats(this); } - let contentLength = util.bodyLength(body); - - if (contentLength == null) { - contentLength = request.contentLength; + get [kBusy] () { + return this[kNeedDrain] } - if (contentLength === 0 || !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. - - contentLength = null; + get [kConnected] () { + return this[kClients].filter(client => client[kConnected]).length } - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false - } - - process.emitWarning(new RequestContentLengthMismatchError()); + get [kFree] () { + return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length } - if (contentLength != null) { - assert(body, 'no body must not have content length'); - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + get [kPending] () { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret } - session.ref(); - - const shouldEndStream = method === 'GET' || method === 'HEAD'; - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = '100-continue'; - stream = session.request(headers, { endStream: shouldEndStream, signal }); - - stream.once('continue', writeBodyH2); - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }); - writeBodyH2(); + get [kRunning] () { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret } - // Increment counter as we have new several streams open - ++h2State.openStreams; - - stream.once('response', headers => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers; - - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) { - stream.pause(); + get [kSize] () { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; } - }); + return ret + } - stream.once('end', () => { - request.onComplete([]); - }); + get stats () { + return this[kStats] + } - stream.on('data', (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); + async [kClose] () { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map(c => c.close())); + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); } - }); + } - stream.once('close', () => { - h2State.openStreams -= 1; - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) { - session.unref(); + async [kDestroy] (err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break + } + item.handler.onError(err); } - }); - stream.once('error', function (err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } - }); + await Promise.all(this[kClients].map(c => c.destroy(err))); + } - stream.once('frameError', (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client, request, err); + [kDispatch] (opts, handler) { + const dispatcher = this[kGetDispatcher](); - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); } - }); - // stream.on('aborted', () => { - // // TODO(HTTP/2): Support aborted - // }) + return !this[kNeedDrain] + } - // stream.on('timeout', () => { - // // TODO(HTTP/2): Support timeout - // }) + [kAddClient] (client) { + client + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]); - // stream.on('push', headers => { - // // TODO(HTTP/2): Suppor push - // }) + this[kClients].push(client); - // stream.on('trailers', headers => { - // // TODO(HTTP/2): Support trailers - // }) + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } - return true + return this + } - function writeBodyH2 () { - /* istanbul ignore else: assertion */ - if (!body) { - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length'); - stream.cork(); - stream.write(body); - stream.uncork(); - stream.end(); - request.onBodySent(body); - request.onRequestSent(); - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: '' - }); - } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: '', - socket: client[kSocket] - }); + [kRemoveClient] (client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: '' - }); - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: '', - h2stream: stream, - socket: client[kSocket] - }); - } else { - assert(false); - } + }); + + this[kNeedDrain] = this[kClients].some(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )); } } - function writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); + poolBase$1 = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; + return poolBase$1; +} - if (client[kHTTPConnVersion] === 'h2') { - // For HTTP/2, is enough to pipe the stream - const pipe = pipeline( - body, - h2stream, - (err) => { - if (err) { - util.destroy(body, err); - util.destroy(h2stream, err); - } else { - request.onRequestSent(); - } - } - ); +var pool$1; +var hasRequiredPool$1; - pipe.on('data', onPipeData); - pipe.once('end', () => { - pipe.removeListener('data', onPipeData); - util.destroy(pipe); - }); +function requirePool$1 () { + if (hasRequiredPool$1) return pool$1; + hasRequiredPool$1 = 1; - function onPipeData (chunk) { - request.onBodySent(chunk); - } + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = requirePoolBase$1(); + const Client = requireClient$1(); + const { + InvalidArgumentError + } = requireErrors$2(); + const util = requireUtil$h(); + const { kUrl, kInterceptors } = requireSymbols$9(); + const buildConnector = requireConnect$1(); - return - } + const kOptions = Symbol('options'); + const kConnections = Symbol('connections'); + const kFactory = Symbol('factory'); - let finished = false; + function defaultFactory (origin, opts) { + return new Client(origin, opts) + } - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + class Pool extends PoolBase { + constructor (origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); - const onData = function (chunk) { - if (finished) { - return + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError('invalid connections') } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function () { - if (finished) { - return + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') } - if (body.resume) { - body.resume(); - } - }; - const onAbort = function () { - if (finished) { - return - } - const err = new RequestAbortedError(); - queueMicrotask(() => onFinished(err)); - }; - const onFinished = function (err) { - if (finished) { - return + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') } - finished = true; - - assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)); + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }); + } - socket - .off('drain', onDrain) - .off('error', onFinished); + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) + ? options.interceptors.Pool + : []; + this[kConnections] = connections || null; + this[kUrl] = util.parseOrigin(origin); + this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined; + this[kFactory] = factory; - body - .removeListener('data', onData) - .removeListener('end', onFinished) - .removeListener('error', onFinished) - .removeListener('close', onAbort); + this.on('connectionError', (origin, targets, error) => { + // If a connection error occurs, we remove the client from the pool, + // and emit a connectionError event. They will not be re-used. + // Fixes https://github.com/nodejs/undici/issues/3895 + for (const target of targets) { + // Do not use kRemoveClient here, as it will close the client, + // but the client cannot be closed in this state. + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); + } - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; + [kGetDispatcher] () { + for (const client of this[kClients]) { + if (!client[kNeedDrain]) { + return client } } - writer.destroy(err); - - if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { - util.destroy(body, err); - } else { - util.destroy(body); + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher } - }; - - body - .on('data', onData) - .on('end', onFinished) - .on('error', onFinished) - .on('close', onAbort); - - if (body.resume) { - body.resume(); } - - socket - .on('drain', onDrain) - .on('error', onFinished); } - async function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, 'blob body must have content length'); + pool$1 = Pool; + return pool$1; +} - const isH2 = client[kHTTPConnVersion] === 'h2'; - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError() - } +var balancedPool$1; +var hasRequiredBalancedPool$1; - const buffer = Buffer.from(await body.arrayBuffer()); +function requireBalancedPool$1 () { + if (hasRequiredBalancedPool$1) return balancedPool$1; + hasRequiredBalancedPool$1 = 1; - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); - socket.write(buffer); - socket.uncork(); - } + const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = requireErrors$2(); + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = requirePoolBase$1(); + const Pool = requirePool$1(); + const { kUrl, kInterceptors } = requireSymbols$9(); + const { parseOrigin } = requireUtil$h(); + const kFactory = Symbol('factory'); - request.onBodySent(buffer); - request.onRequestSent(); + const kOptions = Symbol('options'); + const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor'); + const kCurrentWeight = Symbol('kCurrentWeight'); + const kIndex = Symbol('kIndex'); + const kWeight = Symbol('kWeight'); + const kMaxWeightPerServer = Symbol('kMaxWeightPerServer'); + const kErrorPenalty = Symbol('kErrorPenalty'); - if (!expectsPayload) { - socket[kReset] = true; - } + /** + * Calculate the greatest common divisor of two numbers by + * using the Euclidean algorithm. + * + * @param {number} a + * @param {number} b + * @returns {number} + */ + function getGreatestCommonDivisor (a, b) { + if (a === 0) return b - resume(client); - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err); + while (b !== 0) { + const t = b; + b = a % b; + a = t; } + return a } - async function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); + function defaultFactory (origin, opts) { + return new Pool(origin, opts) + } - let callback = null; - function onDrain () { - if (callback) { - const cb = callback; - callback = null; - cb(); - } - } + class BalancedPool extends PoolBase { + constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null); + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; } - }); - if (client[kHTTPConnVersion] === 'h2') { - h2stream - .on('close', onDrain) - .on('drain', onDrain); + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } + this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) + ? opts.interceptors.BalancedPool + : []; + this[kFactory] = factory; - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } - } - } catch (err) { - h2stream.destroy(err); - } finally { - request.onRequestSent(); - h2stream.end(); - h2stream - .off('close', onDrain) - .off('drain', onDrain); + for (const upstream of upstreams) { + this.addUpstream(upstream); } - - return + this._updateBalancedPoolStats(); } - socket - .on('close', onDrain) - .on('drain', onDrain); + addUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } + if (this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + ))) { + return this + } + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); - if (!writer.write(chunk)) { - await waitForDrain(); + this[kAddClient](pool); + pool.on('connect', () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); + }); + + pool.on('connectionError', () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + + pool.on('disconnect', (...args) => { + const err = args[2]; + if (err && err.code === 'UND_ERR_SOCKET') { + // decrease the weight of the pool. + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); } + }); + + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer]; } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket - .off('close', onDrain) - .off('drain', onDrain); + this._updateBalancedPoolStats(); + + return this } - } - class AsyncWriter { - constructor ({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; + _updateBalancedPoolStats () { + let result = 0; + for (let i = 0; i < this[kClients].length; i++) { + result = getGreatestCommonDivisor(this[kClients][i][kWeight], result); + } - socket[kWriting] = true; + this[kGreatestCommonDivisor] = result; } - write (chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + removeUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; - if (socket[kError]) { - throw socket[kError] - } + const pool = this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + )); - if (socket.destroyed) { - return false + if (pool) { + this[kRemoveClient](pool); } - const len = Buffer.byteLength(chunk); - if (!len) { - return true - } + return this + } - // We should defer writing chunks. - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } + get upstreams () { + return this[kClients] + .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) + .map((p) => p[kUrl].origin) + } - process.emitWarning(new RequestContentLengthMismatchError()); + [kGetDispatcher] () { + // We validate that pools is greater than 0, + // otherwise we would have to wait until an upstream + // is added, which might never happen. + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError() } - socket.cork(); - - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } - - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1'); - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); - } - } + const dispatcher = this[kClients].find(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )); - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1'); + if (!dispatcher) { + return } - this.bytesWritten += len; - - const ret = socket.write(chunk); - - socket.uncork(); - - request.onBodySent(chunk); + const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } + if (allClientsBusy) { + return } - return ret - } - - end () { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - - socket[kWriting] = false; - - if (socket[kError]) { - throw socket[kError] - } + let counter = 0; - if (socket.destroyed) { - return - } + let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]); - if (bytesWritten === 0) { - if (expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD send a Content-Length in a request message when - // no Transfer-Encoding is sent and the request method defines a meaning - // for an enclosed payload body. + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool = this[kClients][this[kIndex]]; - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); - } else { - socket.write(`${header}\r\n`, 'latin1'); + // find pool index with the largest weight + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex]; } - } else if (contentLength === null) { - socket.write('\r\n0\r\n\r\n', 'latin1'); - } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } - } + // decrease the current weight every `this[kClients].length`. + if (this[kIndex] === 0) { + // Set the current weight to the next lower weight. + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; + } + } + if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { + return pool } } - resume(client); + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex] } + } - destroy (err) { - const { socket, client } = this; - - socket[kWriting] = false; + balancedPool$1 = BalancedPool; + return balancedPool$1; +} - if (err) { - assert(client[kRunning] <= 1, 'pipeline should only contain this request'); - util.destroy(socket, err); - } - } - } +var agent$1; +var hasRequiredAgent$1; - function errorRequest (client, request, err) { - try { - request.onError(err); - assert(request.aborted); - } catch (err) { - client.emit('error', err); - } - } +function requireAgent$1 () { + if (hasRequiredAgent$1) return agent$1; + hasRequiredAgent$1 = 1; - client = Client; - return client; -} + const { InvalidArgumentError } = requireErrors$2(); + const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$9(); + const DispatcherBase = requireDispatcherBase$1(); + const Pool = requirePool$1(); + const Client = requireClient$1(); + const util = requireUtil$h(); + const createRedirectInterceptor = requireRedirectInterceptor$1(); -/* eslint-disable */ + const kOnConnect = Symbol('onConnect'); + const kOnDisconnect = Symbol('onDisconnect'); + const kOnConnectionError = Symbol('onConnectionError'); + const kMaxRedirections = Symbol('maxRedirections'); + const kOnDrain = Symbol('onDrain'); + const kFactory = Symbol('factory'); + const kOptions = Symbol('options'); -var fixedQueue; -var hasRequiredFixedQueue; + function defaultFactory (origin, opts) { + return opts && opts.connections === 1 + ? new Client(origin, opts) + : new Pool(origin, opts) + } -function requireFixedQueue () { - if (hasRequiredFixedQueue) return fixedQueue; - hasRequiredFixedQueue = 1; + class Agent extends DispatcherBase { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + super(); - // Extracted from node/lib/internal/fixed_queue.js + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } - // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. - const kSize = 2048; - const kMask = kSize - 1; + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } - // The FixedQueue is implemented as a singly-linked list of fixed-size - // circular buffers. It looks something like this: - // - // head tail - // | | - // v v - // +-----------+ <-----\ +-----------+ <------\ +-----------+ - // | [null] | \----- | next | \------- | next | - // +-----------+ +-----------+ +-----------+ - // | item | <-- bottom | item | <-- bottom | [empty] | - // | item | | item | | [empty] | - // | item | | item | | [empty] | - // | item | | item | | [empty] | - // | item | | item | bottom --> | item | - // | item | | item | | item | - // | ... | | ... | | ... | - // | item | | item | | item | - // | item | | item | | item | - // | [empty] | <-- top | item | | item | - // | [empty] | | item | | item | - // | [empty] | | [empty] | <-- top top --> | [empty] | - // +-----------+ +-----------+ +-----------+ - // - // Or, if there is only one circular buffer, it looks something - // like either of these: - // - // head tail head tail - // | | | | - // v v v v - // +-----------+ +-----------+ - // | [null] | | [null] | - // +-----------+ +-----------+ - // | [empty] | | item | - // | [empty] | | item | - // | item | <-- bottom top --> | [empty] | - // | item | | [empty] | - // | [empty] | <-- top bottom --> | item | - // | [empty] | | item | - // +-----------+ +-----------+ - // - // Adding a value means moving `top` forward by one, removing means - // moving `bottom` forward by one. After reaching the end, the queue - // wraps around. - // - // When `top === bottom` the current queue is empty and when - // `top + 1 === bottom` it's full. This wastes a single space of storage - // but allows much quicker checks. + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } + if (connect && typeof connect !== 'function') { + connect = { ...connect }; + } - isEmpty() { - return this.top === this.bottom; - } + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) + ? options.interceptors.Agent + : [createRedirectInterceptor({ maxRedirections })]; - isFull() { - return ((this.top + 1) & kMask) === this.bottom; - } + this[kOptions] = { ...util.deepClone(options), connect }; + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = new Map(); - push(data) { - this.list[this.top] = data; - this.top = (this.top + 1) & kMask; - } + this[kOnDrain] = (origin, targets) => { + this.emit('drain', origin, [this, ...targets]); + }; - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = (this.bottom + 1) & kMask; - return nextItem; - } - } + this[kOnConnect] = (origin, targets) => { + this.emit('connect', origin, [this, ...targets]); + }; - fixedQueue = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } + this[kOnDisconnect] = (origin, targets, err) => { + this.emit('disconnect', origin, [this, ...targets], err); + }; - isEmpty() { - return this.head.isEmpty(); + this[kOnConnectionError] = (origin, targets, err) => { + this.emit('connectionError', origin, [this, ...targets], err); + }; } - push(data) { - if (this.head.isFull()) { - // Head is full: Creates a new queue, sets the old queue's `.next` to it, - // and sets it as the new main queue. - this.head = this.head.next = new FixedCircularBuffer(); + get [kRunning] () { + let ret = 0; + for (const client of this[kClients].values()) { + ret += client[kRunning]; } - this.head.push(data); + return ret } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - // If there is another queue, it forms the new tail. - this.tail = tail.next; + [kDispatch] (opts, handler) { + let key; + if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') } - return next; - } - }; - return fixedQueue; -} - -var poolStats; -var hasRequiredPoolStats; -function requirePoolStats () { - if (hasRequiredPoolStats) return poolStats; - hasRequiredPoolStats = 1; - const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$4(); - const kPool = Symbol('pool'); + let dispatcher = this[kClients].get(key); - class PoolStats { - constructor (pool) { - this[kPool] = pool; - } + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]) + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]); - get connected () { - return this[kPool][kConnected] - } + // This introduces a tiny memory leak, as dispatchers are never removed from the map. + // TODO(mcollina): remove te timer when the client/pool do not have any more + // active connections. + this[kClients].set(key, dispatcher); + } - get free () { - return this[kPool][kFree] + return dispatcher.dispatch(opts, handler) } - get pending () { - return this[kPool][kPending] - } + async [kClose] () { + const closePromises = []; + for (const client of this[kClients].values()) { + closePromises.push(client.close()); + } + this[kClients].clear(); - get queued () { - return this[kPool][kQueued] + await Promise.all(closePromises); } - get running () { - return this[kPool][kRunning] - } + async [kDestroy] (err) { + const destroyPromises = []; + for (const client of this[kClients].values()) { + destroyPromises.push(client.destroy(err)); + } + this[kClients].clear(); - get size () { - return this[kPool][kSize] + await Promise.all(destroyPromises); } } - poolStats = PoolStats; - return poolStats; + agent$1 = Agent; + return agent$1; } -var poolBase; -var hasRequiredPoolBase; - -function requirePoolBase () { - if (hasRequiredPoolBase) return poolBase; - hasRequiredPoolBase = 1; +var proxyAgent$1; +var hasRequiredProxyAgent$1; - const DispatcherBase = requireDispatcherBase(); - const FixedQueue = requireFixedQueue(); - const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$4(); - const PoolStats = requirePoolStats(); +function requireProxyAgent$1 () { + if (hasRequiredProxyAgent$1) return proxyAgent$1; + hasRequiredProxyAgent$1 = 1; - const kClients = Symbol('clients'); - const kNeedDrain = Symbol('needDrain'); - const kQueue = Symbol('queue'); - const kClosedResolve = Symbol('closed resolve'); - const kOnDrain = Symbol('onDrain'); - const kOnConnect = Symbol('onConnect'); - const kOnDisconnect = Symbol('onDisconnect'); - const kOnConnectionError = Symbol('onConnectionError'); - const kGetDispatcher = Symbol('get dispatcher'); - const kAddClient = Symbol('add client'); - const kRemoveClient = Symbol('remove client'); - const kStats = Symbol('stats'); + const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$9(); + const { URL } = require$$1$5; + const Agent = requireAgent$1(); + const Pool = requirePool$1(); + const DispatcherBase = requireDispatcherBase$1(); + const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = requireErrors$2(); + const buildConnector = requireConnect$1(); + const Client = requireClient$1(); - class PoolBase extends DispatcherBase { - constructor () { - super(); + const kAgent = Symbol('proxy agent'); + const kClient = Symbol('proxy client'); + const kProxyHeaders = Symbol('proxy headers'); + const kRequestTls = Symbol('request tls settings'); + const kProxyTls = Symbol('proxy tls settings'); + const kConnectEndpoint = Symbol('connect endpoint function'); + const kTunnelProxy = Symbol('tunnel proxy'); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; + function defaultProtocolPort (protocol) { + return protocol === 'https:' ? 443 : 80 + } - const pool = this; + function defaultFactory (origin, opts) { + return new Pool(origin, opts) + } - this[kOnDrain] = function onDrain (origin, targets) { - const queue = pool[kQueue]; + const noop = () => {}; - let needDrain = false; + function defaultAgentFactory (origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts) + } + return new Pool(origin, opts) + } - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } + class Http1ProxyWrapper extends DispatcherBase { + #client - this[kNeedDrain] = needDrain; + constructor (proxyUrl, { headers = {}, connect, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError('Proxy URL is mandatory') + } - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit('drain', origin, [pool, ...targets]); - } + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); + } + } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise - .all(pool[kClients].map(c => c.close())) - .then(pool[kClosedResolve]); + [kDispatch] (opts, handler) { + const onHeaders = handler.onHeaders; + handler.onHeaders = function (statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === 'function') { + handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)')); + } + return } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); }; - this[kOnConnect] = (origin, targets) => { - pool.emit('connect', origin, [pool, ...targets]); - }; + // Rewrite request as an HTTP1 Proxy request, without tunneling. + const { + origin, + path = '/', + headers = {} + } = opts; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit('disconnect', origin, [pool, ...targets], err); - }; + opts.path = origin + path; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit('connectionError', origin, [pool, ...targets], err); - }; + if (!('host' in headers) && !('Host' in headers)) { + const { host } = new URL(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; - this[kStats] = new PoolStats(this); + return this.#client[kDispatch](opts, handler) } - get [kBusy] () { - return this[kNeedDrain] + async [kClose] () { + return this.#client.close() } - get [kConnected] () { - return this[kClients].filter(client => client[kConnected]).length + async [kDestroy] (err) { + return this.#client.destroy(err) } + } - get [kFree] () { - return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length - } + class ProxyAgent extends DispatcherBase { + constructor (opts) { + super(); - get [kPending] () { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; + if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) { + throw new InvalidArgumentError('Proxy uri is mandatory') } - return ret - } - get [kRunning] () { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== 'function') { + throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') } - return ret - } - get [kSize] () { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; - } - return ret - } + const { proxyTunnel = true } = opts; - get stats () { - return this[kStats] - } + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; - async [kClose] () { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map(c => c.close())) - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }) + this[kProxy] = { uri: href, protocol }; + this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) + ? opts.interceptors.ProxyAgent + : []; + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; + + if (opts.auth && opts.token) { + throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') + } else if (opts.auth) { + /* @deprecated in favour of opts.token */ + this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]['proxy-authorization'] = opts.token; + } else if (username && password) { + this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`; } - } - async [kDestroy] (err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break + const connect = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin, options) => { + const { protocol } = new URL(origin); + if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }) } - item.handler.onError(err); + return agentFactory(origin, options) + }; + this[kClient] = clientFactory(url, { connect }); + this[kAgent] = new Agent({ + ...opts, + factory, + connect: async (opts, callback) => { + let requestedPath = opts.host; + if (!opts.port) { + requestedPath += `:${defaultProtocolPort(opts.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedPath, + signal: opts.signal, + headers: { + ...this[kProxyHeaders], + host: opts.host + }, + servername: this[kProxyTls]?.servername || proxyHostname + }); + if (statusCode !== 200) { + socket.on('error', noop).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + } + if (opts.protocol !== 'https:') { + callback(null, socket); + return + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts.servername; + } + this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback); + } catch (err) { + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + // Throw a custom error to avoid loop in client.js#connect + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } + } + } + }); + } + + dispatch (opts, handler) { + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); + + if (headers && !('host' in headers) && !('Host' in headers)) { + const { host } = new URL(opts.origin); + headers.host = host; } - return Promise.all(this[kClients].map(c => c.destroy(err))) + return this[kAgent].dispatch( + { + ...opts, + headers + }, + handler + ) } - [kDispatch] (opts, handler) { - const dispatcher = this[kGetDispatcher](); - - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); + /** + * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl (opts) { + if (typeof opts === 'string') { + return new URL(opts) + } else if (opts instanceof URL) { + return opts + } else { + return new URL(opts.uri) } + } - return !this[kNeedDrain] + async [kClose] () { + await this[kAgent].close(); + await this[kClient].close(); } - [kAddClient] (client) { - client - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]); + async [kDestroy] () { + await this[kAgent].destroy(); + await this[kClient].destroy(); + } + } - this[kClients].push(client); + /** + * @param {string[] | Record} headers + * @returns {Record} + */ + function buildHeaders (headers) { + // When using undici.fetch, the headers list is stored + // as an array. + if (Array.isArray(headers)) { + /** @type {Record} */ + const headersPair = {}; - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; } - return this + return headersPair } - [kRemoveClient] (client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); + return headers + } - this[kNeedDrain] = this[kClients].some(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )); + /** + * @param {Record} headers + * + * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers + * Nevertheless, it was changed and to avoid a security vulnerability by end users + * this check was created. + * It should be removed in the next major version for performance reasons + */ + function throwIfProxyAuthIsSent (headers) { + const existProxyAuth = headers && Object.keys(headers) + .find((key) => key.toLowerCase() === 'proxy-authorization'); + if (existProxyAuth) { + throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') } } - poolBase = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - return poolBase; + proxyAgent$1 = ProxyAgent; + return proxyAgent$1; } -var pool; -var hasRequiredPool; +var envHttpProxyAgent$1; +var hasRequiredEnvHttpProxyAgent$1; -function requirePool () { - if (hasRequiredPool) return pool; - hasRequiredPool = 1; +function requireEnvHttpProxyAgent$1 () { + if (hasRequiredEnvHttpProxyAgent$1) return envHttpProxyAgent$1; + hasRequiredEnvHttpProxyAgent$1 = 1; - const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = requirePoolBase(); - const Client = requireClient(); - const { - InvalidArgumentError - } = requireErrors$1(); - const util = requireUtil$8(); - const { kUrl, kInterceptors } = requireSymbols$4(); - const buildConnector = requireConnect(); + const DispatcherBase = requireDispatcherBase$1(); + const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = requireSymbols$9(); + const ProxyAgent = requireProxyAgent$1(); + const Agent = requireAgent$1(); - const kOptions = Symbol('options'); - const kConnections = Symbol('connections'); - const kFactory = Symbol('factory'); + const DEFAULT_PORTS = { + 'http:': 80, + 'https:': 443 + }; - function defaultFactory (origin, opts) { - return new Client(origin, opts) - } + let experimentalWarned = false; - class Pool extends PoolBase { - constructor (origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { + class EnvHttpProxyAgent extends DispatcherBase { + #noProxyValue = null + #noProxyEntries = null + #opts = null + + constructor (opts = {}) { super(); + this.#opts = opts; - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError('invalid connections') + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning('EnvHttpProxyAgent is experimental, expect them to change at any time.', { + code: 'UNDICI-EHPA' + }); } - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts; - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + this[kNoProxyAgent] = new Agent(agentOpts); - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }); + const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY; + if (HTTP_PROXY) { + this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }); + } else { + this[kHttpProxyAgent] = this[kNoProxyAgent]; } - this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) - ? options.interceptors.Pool - : []; - this[kConnections] = connections || null; - this[kUrl] = util.parseOrigin(origin); - this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined; - this[kFactory] = factory; + const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY; + if (HTTPS_PROXY) { + this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }); + } else { + this[kHttpsProxyAgent] = this[kHttpProxyAgent]; + } - this.on('connectionError', (origin, targets, error) => { - // If a connection error occurs, we remove the client from the pool, - // and emit a connectionError event. They will not be re-used. - // Fixes https://github.com/nodejs/undici/issues/3895 - for (const target of targets) { - // Do not use kRemoveClient here, as it will close the client, - // but the client cannot be closed in this state. - const idx = this[kClients].indexOf(target); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - } - }); + this.#parseNoProxy(); } - [kGetDispatcher] () { - let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]); + [kDispatch] (opts, handler) { + const url = new URL(opts.origin); + const agent = this.#getProxyAgentForUrl(url); + return agent.dispatch(opts, handler) + } - if (dispatcher) { - return dispatcher + async [kClose] () { + await this[kNoProxyAgent].close(); + if (!this[kHttpProxyAgent][kClosed]) { + await this[kHttpProxyAgent].close(); } - - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); + if (!this[kHttpsProxyAgent][kClosed]) { + await this[kHttpsProxyAgent].close(); } - - return dispatcher } - } - pool = Pool; - return pool; -} + async [kDestroy] (err) { + await this[kNoProxyAgent].destroy(err); + if (!this[kHttpProxyAgent][kDestroyed]) { + await this[kHttpProxyAgent].destroy(err); + } + if (!this[kHttpsProxyAgent][kDestroyed]) { + await this[kHttpsProxyAgent].destroy(err); + } + } -var balancedPool; -var hasRequiredBalancedPool; + #getProxyAgentForUrl (url) { + let { protocol, host: hostname, port } = url; -function requireBalancedPool () { - if (hasRequiredBalancedPool) return balancedPool; - hasRequiredBalancedPool = 1; + // Stripping ports in this way instead of using parsedUrl.hostname to make + // sure that the brackets around IPv6 addresses are kept. + hostname = hostname.replace(/:\d*$/, '').toLowerCase(); + port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; + if (!this.#shouldProxy(hostname, port)) { + return this[kNoProxyAgent] + } + if (protocol === 'https:') { + return this[kHttpsProxyAgent] + } + return this[kHttpProxyAgent] + } - const { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = requireErrors$1(); - const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = requirePoolBase(); - const Pool = requirePool(); - const { kUrl, kInterceptors } = requireSymbols$4(); - const { parseOrigin } = requireUtil$8(); - const kFactory = Symbol('factory'); + #shouldProxy (hostname, port) { + if (this.#noProxyChanged) { + this.#parseNoProxy(); + } - const kOptions = Symbol('options'); - const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor'); - const kCurrentWeight = Symbol('kCurrentWeight'); - const kIndex = Symbol('kIndex'); - const kWeight = Symbol('kWeight'); - const kMaxWeightPerServer = Symbol('kMaxWeightPerServer'); - const kErrorPenalty = Symbol('kErrorPenalty'); + if (this.#noProxyEntries.length === 0) { + return true // Always proxy if NO_PROXY is not set or empty. + } + if (this.#noProxyValue === '*') { + return false // Never proxy if wildcard is set. + } - function getGreatestCommonDivisor (a, b) { - if (b === 0) return a - return getGreatestCommonDivisor(b, a % b) - } + for (let i = 0; i < this.#noProxyEntries.length; i++) { + const entry = this.#noProxyEntries[i]; + if (entry.port && entry.port !== port) { + continue // Skip if ports don't match. + } + if (!/^[.*]/.test(entry.hostname)) { + // No wildcards, so don't proxy only if there is not an exact match. + if (hostname === entry.hostname) { + return false + } + } else { + // Don't proxy if the hostname ends with the no_proxy host. + if (hostname.endsWith(entry.hostname.replace(/^\*/, ''))) { + return false + } + } + } - function defaultFactory (origin, opts) { - return new Pool(origin, opts) - } + return true + } - class BalancedPool extends PoolBase { - constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super(); + #parseNoProxy () { + const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv; + const noProxySplit = noProxyValue.split(/[,\s]/); + const noProxyEntries = []; - this[kOptions] = opts; - this[kIndex] = -1; - this[kCurrentWeight] = 0; + for (let i = 0; i < noProxySplit.length; i++) { + const entry = noProxySplit[i]; + if (!entry) { + continue + } + const parsed = entry.match(/^(.+):(\d+)$/); + noProxyEntries.push({ + hostname: (parsed ? parsed[1] : entry).toLowerCase(), + port: parsed ? Number.parseInt(parsed[2], 10) : 0 + }); + } - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + this.#noProxyValue = noProxyValue; + this.#noProxyEntries = noProxyEntries; + } - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; + get #noProxyChanged () { + if (this.#opts.noProxy !== undefined) { + return false } + return this.#noProxyValue !== this.#noProxyEnv + } - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + get #noProxyEnv () { + return process.env.no_proxy ?? process.env.NO_PROXY ?? '' + } + } - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) - ? opts.interceptors.BalancedPool - : []; - this[kFactory] = factory; + envHttpProxyAgent$1 = EnvHttpProxyAgent; + return envHttpProxyAgent$1; +} - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } +var retryHandler$1; +var hasRequiredRetryHandler$1; - addUpstream (upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; +function requireRetryHandler$1 () { + if (hasRequiredRetryHandler$1) return retryHandler$1; + hasRequiredRetryHandler$1 = 1; + const assert = require$$0$7; - if (this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - ))) { - return this - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + const { kRetryHandlerDefaultRetry } = requireSymbols$9(); + const { RequestRetryError } = requireErrors$2(); + const { + isDisturbed, + parseHeaders, + parseRangeHeader, + wrapRequestBody + } = requireUtil$h(); - this[kAddClient](pool); - pool.on('connect', () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); - }); + function calculateRetryAfterHeader (retryAfter) { + const current = Date.now(); + return new Date(retryAfter).getTime() - current + } - pool.on('connectionError', () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); + class RetryHandler { + constructor (opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts; + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {}; - pool.on('disconnect', (...args) => { - const err = args[2]; - if (err && err.code === 'UND_ERR_SOCKET') { - // decrease the weight of the pool. - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); + this.dispatch = handlers.dispatch; + this.handler = handlers.handler; + this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }; + this.abort = null; + this.aborted = false; + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1000, // 30s, + minTimeout: minTimeout ?? 500, // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + 'ECONNRESET', + 'ECONNREFUSED', + 'ENOTFOUND', + 'ENETDOWN', + 'ENETUNREACH', + 'EHOSTDOWN', + 'EHOSTUNREACH', + 'EPIPE', + 'UND_ERR_SOCKET' + ] + }; + + this.retryCount = 0; + this.retryCountCheckpoint = 0; + this.start = 0; + this.end = null; + this.etag = null; + this.resume = null; + + // Handle possible onConnect duplication + this.handler.onConnect(reason => { + this.aborted = true; + if (this.abort) { + this.abort(reason); + } else { + this.reason = reason; } }); + } - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer]; + onRequestSent () { + if (this.handler.onRequestSent) { + this.handler.onRequestSent(); } - - this._updateBalancedPoolStats(); - - return this } - _updateBalancedPoolStats () { - this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0); + onUpgrade (statusCode, headers, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers, socket); + } } - removeUpstream (upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - - const pool = this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - )); - - if (pool) { - this[kRemoveClient](pool); + onConnect (abort) { + if (this.aborted) { + abort(this.reason); + } else { + this.abort = abort; } - - return this } - get upstreams () { - return this[kClients] - .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) - .map((p) => p[kUrl].origin) + onBodySent (chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk) } - [kGetDispatcher] () { - // We validate that pools is greater than 0, - // otherwise we would have to wait until an upstream - // is added, which might never happen. - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError() - } + static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { + const { statusCode, code, headers } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + minTimeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + const { counter } = state; - const dispatcher = this[kClients].find(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )); + // Any code that is not a Undici's originated and allowed to retry + if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) { + cb(err); + return + } - if (!dispatcher) { + // If a set of method are provided and the current method is not in the list + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); return } - const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true); + // If a set of status code are provided and the current status code is not in the list + if ( + statusCode != null && + Array.isArray(statusCodes) && + !statusCodes.includes(statusCode) + ) { + cb(err); + return + } - if (allClientsBusy) { + // If we reached the max number of retries + if (counter > maxRetries) { + cb(err); return } - let counter = 0; + let retryAfterHeader = headers?.['retry-after']; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = Number.isNaN(retryAfterHeader) + ? calculateRetryAfterHeader(retryAfterHeader) + : retryAfterHeader * 1e3; // Retry-After is in seconds + } - let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]); + const retryTimeout = + retryAfterHeader > 0 + ? Math.min(retryAfterHeader, maxTimeout) + : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool = this[kClients][this[kIndex]]; + setTimeout(() => cb(null), retryTimeout); + } - // find pool index with the largest weight - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex]; + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = parseHeaders(rawHeaders); + + this.retryCount += 1; + + if (statusCode >= 300) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } else { + this.abort( + new RequestRetryError('Request failed', statusCode, { + headers, + data: { + count: this.retryCount + } + }) + ); + return false } + } - // decrease the current weight every `this[kClients].length`. - if (this[kIndex] === 0) { - // Set the current weight to the next lower weight. - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + // Checkpoint for resume from where we left it + if (this.resume != null) { + this.resume = null; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; - } + // Only Partial Content 206 supposed to provide Content-Range, + // any other status code that partially consumed the payload + // should not be retry because it would result in downstream + // wrongly concatanete multiple responses. + if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { + this.abort( + new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false } - if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { - return pool + + const contentRange = parseRangeHeader(headers['content-range']); + // If no content range + if (!contentRange) { + this.abort( + new RequestRetryError('Content-Range mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false } - } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex] - } - } + // Let's start with a weak etag check + if (this.etag != null && this.etag !== headers.etag) { + this.abort( + new RequestRetryError('ETag mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false + } - balancedPool = BalancedPool; - return balancedPool; -} + const { start, size, end = size - 1 } = contentRange; -var dispatcherWeakref; -var hasRequiredDispatcherWeakref; + assert(this.start === start, 'content-range mismatch'); + assert(this.end == null || this.end === end, 'content-range mismatch'); -function requireDispatcherWeakref () { - if (hasRequiredDispatcherWeakref) return dispatcherWeakref; - hasRequiredDispatcherWeakref = 1; + this.resume = resume; + return true + } - /* istanbul ignore file: only for Node 12 */ + if (this.end == null) { + if (statusCode === 206) { + // First time we receive 206 + const range = parseRangeHeader(headers['content-range']); - const { kConnected, kSize } = requireSymbols$4(); + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } - class CompatWeakRef { - constructor (value) { - this.value = value; - } + const { start, size, end = size - 1 } = range; + assert( + start != null && Number.isFinite(start), + 'content-range mismatch' + ); + assert(end != null && Number.isFinite(end), 'invalid content-length'); - deref () { - return this.value[kConnected] === 0 && this.value[kSize] === 0 - ? undefined - : this.value - } - } + this.start = start; + this.end = end; + } - class CompatFinalizer { - constructor (finalizer) { - this.finalizer = finalizer; - } + // We make our best to checkpoint the body for further range headers + if (this.end == null) { + const contentLength = headers['content-length']; + this.end = contentLength != null ? Number(contentLength) - 1 : null; + } - register (dispatcher, key) { - if (dispatcher.on) { - dispatcher.on('disconnect', () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key); - } - }); - } - } - } + assert(Number.isFinite(this.start)); + assert( + this.end == null || Number.isFinite(this.end), + 'invalid content-length' + ); - dispatcherWeakref = function () { - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - } - } - return { - WeakRef: commonjsGlobal.WeakRef || CompatWeakRef, - FinalizationRegistry: commonjsGlobal.FinalizationRegistry || CompatFinalizer - } - }; - return dispatcherWeakref; -} + this.resume = resume; + this.etag = headers.etag != null ? headers.etag : null; -var agent; -var hasRequiredAgent; + // Weak etags are not useful for comparison nor cache + // for instance not safe to assume if the response is byte-per-byte + // equal + if (this.etag != null && this.etag.startsWith('W/')) { + this.etag = null; + } -function requireAgent () { - if (hasRequiredAgent) return agent; - hasRequiredAgent = 1; + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } - const { InvalidArgumentError } = requireErrors$1(); - const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4(); - const DispatcherBase = requireDispatcherBase(); - const Pool = requirePool(); - const Client = requireClient(); - const util = requireUtil$8(); - const createRedirectInterceptor = requireRedirectInterceptor(); - const { WeakRef, FinalizationRegistry } = requireDispatcherWeakref()(); + const err = new RequestRetryError('Request failed', statusCode, { + headers, + data: { count: this.retryCount } + }); - const kOnConnect = Symbol('onConnect'); - const kOnDisconnect = Symbol('onDisconnect'); - const kOnConnectionError = Symbol('onConnectionError'); - const kMaxRedirections = Symbol('maxRedirections'); - const kOnDrain = Symbol('onDrain'); - const kFactory = Symbol('factory'); - const kFinalizer = Symbol('finalizer'); - const kOptions = Symbol('options'); + this.abort(err); - function defaultFactory (origin, opts) { - return opts && opts.connections === 1 - ? new Client(origin, opts) - : new Pool(origin, opts) - } + return false + } - class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super(); + onData (chunk) { + this.start += chunk.length; - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + return this.handler.onData(chunk) + } - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + onComplete (rawTrailers) { + this.retryCount = 0; + return this.handler.onComplete(rawTrailers) + } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError('maxRedirections must be a positive number') + onError (err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) } - if (connect && typeof connect !== 'function') { - connect = { ...connect }; + // We reconcile in case of a mix between network errors + // and server error response + if (this.retryCount - this.retryCountCheckpoint > 0) { + // We count the difference between the last checkpoint and the current retry count + this.retryCount = + this.retryCountCheckpoint + + (this.retryCount - this.retryCountCheckpoint); + } else { + this.retryCount += 1; } - this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) - ? options.interceptors.Agent - : [createRedirectInterceptor({ maxRedirections })]; + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ); - this[kOptions] = { ...util.deepClone(options), connect }; - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = new Map(); - this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => { - const ref = this[kClients].get(key); - if (ref !== undefined && ref.deref() === undefined) { - this[kClients].delete(key); + function onRetry (err) { + if (err != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) } - }); - - const agent = this; - - this[kOnDrain] = (origin, targets) => { - agent.emit('drain', origin, [agent, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - agent.emit('connect', origin, [agent, ...targets]); - }; + if (this.start !== 0) { + const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }; - this[kOnDisconnect] = (origin, targets, err) => { - agent.emit('disconnect', origin, [agent, ...targets], err); - }; + // Weak etag check - weak etags will make comparison algorithms never match + if (this.etag != null) { + headers['if-match'] = this.etag; + } - this[kOnConnectionError] = (origin, targets, err) => { - agent.emit('connectionError', origin, [agent, ...targets], err); - }; - } + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + ...headers + } + }; + } - get [kRunning] () { - let ret = 0; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - /* istanbul ignore next: gc is undeterministic */ - if (client) { - ret += client[kRunning]; + try { + this.retryCountCheckpoint = this.retryCount; + this.dispatch(this.opts, this); + } catch (err) { + this.handler.onError(err); } } - return ret } + } - [kDispatch] (opts, handler) { - let key; - if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') - } + retryHandler$1 = RetryHandler; + return retryHandler$1; +} - const ref = this[kClients].get(key); +var retryAgent$1; +var hasRequiredRetryAgent$1; - let dispatcher = ref ? ref.deref() : null; - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]) - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]); +function requireRetryAgent$1 () { + if (hasRequiredRetryAgent$1) return retryAgent$1; + hasRequiredRetryAgent$1 = 1; - this[kClients].set(key, new WeakRef(dispatcher)); - this[kFinalizer].register(dispatcher, key); - } + const Dispatcher = requireDispatcher$1(); + const RetryHandler = requireRetryHandler$1(); - return dispatcher.dispatch(opts, handler) + class RetryAgent extends Dispatcher { + #agent = null + #options = null + constructor (agent, options = {}) { + super(options); + this.#agent = agent; + this.#options = options; } - async [kClose] () { - const closePromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - /* istanbul ignore else: gc is undeterministic */ - if (client) { - closePromises.push(client.close()); - } - } - - await Promise.all(closePromises); + dispatch (opts, handler) { + const retry = new RetryHandler({ + ...opts, + retryOptions: this.#options + }, { + dispatch: this.#agent.dispatch.bind(this.#agent), + handler + }); + return this.#agent.dispatch(opts, retry) } - async [kDestroy] (err) { - const destroyPromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - /* istanbul ignore else: gc is undeterministic */ - if (client) { - destroyPromises.push(client.destroy(err)); - } - } + close () { + return this.#agent.close() + } - await Promise.all(destroyPromises); + destroy () { + return this.#agent.destroy() } } - agent = Agent; - return agent; + retryAgent$1 = RetryAgent; + return retryAgent$1; } -var api = {}; - -var apiRequest = {exports: {}}; +var api$1 = {}; -var readable; -var hasRequiredReadable; +var apiRequest$1 = {exports: {}}; -function requireReadable () { - if (hasRequiredReadable) return readable; - hasRequiredReadable = 1; +var readable$1; +var hasRequiredReadable$1; - const assert = require$$0$8; - const { Readable } = require$$0__default$1; - const { RequestAbortedError, NotSupportedError, InvalidArgumentError } = requireErrors$1(); - const util = requireUtil$8(); - const { ReadableStreamFrom, toUSVString } = requireUtil$8(); +function requireReadable$1 () { + if (hasRequiredReadable$1) return readable$1; + hasRequiredReadable$1 = 1; - let Blob; + const assert = require$$0$7; + const { Readable } = require$$0$8; + const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = requireErrors$2(); + const util = requireUtil$h(); + const { ReadableStreamFrom } = requireUtil$h(); const kConsume = Symbol('kConsume'); const kReading = Symbol('kReading'); const kBody = Symbol('kBody'); - const kAbort = Symbol('abort'); + const kAbort = Symbol('kAbort'); const kContentType = Symbol('kContentType'); + const kContentLength = Symbol('kContentLength'); const noop = () => {}; - readable = class BodyReadable extends Readable { + class BodyReadable extends Readable { constructor ({ resume, abort, contentType = '', + contentLength, highWaterMark = 64 * 1024 // Same as nodejs fs streams. }) { super({ @@ -12150,6 +13680,7 @@ function requireReadable () { this[kConsume] = null; this[kBody] = null; this[kContentType] = contentType; + this[kContentLength] = contentLength; // Is stream being consumed through Readable API? // This is an optimization so that we avoid checking @@ -12159,11 +13690,6 @@ function requireReadable () { } destroy (err) { - if (this.destroyed) { - // Node < 16 - return this - } - if (!err && !this._readableState.endEmitted) { err = new RequestAbortedError(); } @@ -12175,15 +13701,18 @@ function requireReadable () { return super.destroy(err) } - emit (ev, ...args) { - if (ev === 'data') { - // Node < 16.7 - this._readableState.dataEmitted = true; - } else if (ev === 'error') { - // Node < 16 - this._readableState.errorEmitted = true; + _destroy (err, callback) { + // Workaround for Node "bug". If the stream is destroyed in same + // tick as it is created, then a user who is waiting for a + // promise (i.e micro tick) for installing a 'error' listener will + // never get a chance and will always encounter an unhandled exception. + if (!this[kReading]) { + setImmediate(() => { + callback(err); + }); + } else { + callback(err); } - return super.emit(ev, ...args) } on (ev, ...args) { @@ -12213,7 +13742,7 @@ function requireReadable () { } push (chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { + if (this[kConsume] && chunk !== null) { consumePush(this[kConsume], chunk); return this[kReading] ? super.push(chunk) : true } @@ -12235,6 +13764,11 @@ function requireReadable () { return consume(this, 'blob') } + // https://fetch.spec.whatwg.org/#dom-body-bytes + async bytes () { + return consume(this, 'bytes') + } + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer async arrayBuffer () { return consume(this, 'arrayBuffer') @@ -12264,37 +13798,35 @@ function requireReadable () { return this[kBody] } - dump (opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; - const signal = opts && opts.signal; + async dump (opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024; + const signal = opts?.signal; - if (signal) { - try { - if (typeof signal !== 'object' || !('aborted' in signal)) { - throw new InvalidArgumentError('signal must be an AbortSignal') - } - util.throwIfAborted(signal); - } catch (err) { - return Promise.reject(err) - } + if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) { + throw new InvalidArgumentError('signal must be an AbortSignal') } - if (this.closed) { - return Promise.resolve(null) + signal?.throwIfAborted(); + + if (this._readableState.closeEmitted) { + return null } - return new Promise((resolve, reject) => { - const signalListenerCleanup = signal - ? util.addAbortListener(signal, () => { - this.destroy(); - }) - : noop; + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()); + } + + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal?.addEventListener('abort', onAbort); this .on('close', function () { - signalListenerCleanup(); - if (signal && signal.aborted) { - reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' })); + signal?.removeEventListener('abort', onAbort); + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()); } else { resolve(null); } @@ -12309,7 +13841,7 @@ function requireReadable () { .resume(); }) } - }; + } // https://streams.spec.whatwg.org/#readablestream-locked function isLocked (self) { @@ -12323,33 +13855,46 @@ function requireReadable () { } async function consume (stream, type) { - if (isUnusable(stream)) { - throw new TypeError('unusable') - } - assert(!stream[kConsume]); return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream + .on('error', err => { + reject(err); + }) + .on('close', () => { + reject(new TypeError('unusable')); + }); + } else { + reject(rState.errored ?? new TypeError('unusable')); + } + } else { + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; - stream - .on('error', function (err) { - consumeFinish(this[kConsume], err); - }) - .on('close', function () { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()); - } - }); + stream + .on('error', function (err) { + consumeFinish(this[kConsume], err); + }) + .on('close', function () { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); - process.nextTick(consumeStart, stream[kConsume]); + consumeStart(stream[kConsume]); + }); + } }) } @@ -12360,8 +13905,16 @@ function requireReadable () { const { _readableState: state } = consume.stream; - for (const chunk of state.buffer) { - consumePush(consume, chunk); + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume, state.buffer[n]); + } + } else { + for (const chunk of state.buffer) { + consumePush(consume, chunk); + } } if (state.endEmitted) { @@ -12379,29 +13932,67 @@ function requireReadable () { } } + /** + * @param {Buffer[]} chunks + * @param {number} length + */ + function chunksDecode (chunks, length) { + if (chunks.length === 0 || length === 0) { + return '' + } + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer.length; + + // Skip BOM. + const start = + bufferLength > 2 && + buffer[0] === 0xef && + buffer[1] === 0xbb && + buffer[2] === 0xbf + ? 3 + : 0; + return buffer.utf8Slice(start, bufferLength) + } + + /** + * @param {Buffer[]} chunks + * @param {number} length + * @returns {Uint8Array} + */ + function chunksConcat (chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0) + } + if (chunks.length === 1) { + // fast-path + return new Uint8Array(chunks[0]) + } + const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); + + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i]; + buffer.set(chunk, offset); + offset += chunk.length; + } + + return buffer + } + function consumeEnd (consume) { const { type, body, resolve, stream, length } = consume; try { if (type === 'text') { - resolve(toUSVString(Buffer.concat(body))); + resolve(chunksDecode(body, length)); } else if (type === 'json') { - resolve(JSON.parse(Buffer.concat(body))); + resolve(JSON.parse(chunksDecode(body, length))); } else if (type === 'arrayBuffer') { - const dst = new Uint8Array(length); - - let pos = 0; - for (const buf of body) { - dst.set(buf, pos); - pos += buf.byteLength; - } - - resolve(dst.buffer); + resolve(chunksConcat(body, length).buffer); } else if (type === 'blob') { - if (!Blob) { - Blob = require('buffer').Blob; - } resolve(new Blob(body, { type: stream[kContentType] })); + } else if (type === 'bytes') { + resolve(chunksConcat(body, length)); } consumeFinish(consume); @@ -12433,142 +14024,125 @@ function requireReadable () { consume.length = 0; consume.body = null; } - return readable; + + readable$1 = { Readable: BodyReadable, chunksDecode }; + return readable$1; } -var util$6; -var hasRequiredUtil$6; +var util$f; +var hasRequiredUtil$f; -function requireUtil$6 () { - if (hasRequiredUtil$6) return util$6; - hasRequiredUtil$6 = 1; - const assert = require$$0$8; +function requireUtil$f () { + if (hasRequiredUtil$f) return util$f; + hasRequiredUtil$f = 1; + const assert = require$$0$7; const { ResponseStatusCodeError - } = requireErrors$1(); - const { toUSVString } = requireUtil$8(); + } = requireErrors$2(); + + const { chunksDecode } = requireReadable$1(); + const CHUNK_LIMIT = 128 * 1024; async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { assert(body); let chunks = []; - let limit = 0; - - for await (const chunk of body) { - chunks.push(chunk); - limit += chunk.length; - if (limit > 128 * 1024) { - chunks = null; - break - } - } - - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)); - return - } + let length = 0; try { - if (contentType.startsWith('application/json')) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)); - return - } - - if (contentType.startsWith('text/')) { - const payload = toUSVString(Buffer.concat(chunks)); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)); - return + for await (const chunk of body) { + chunks.push(chunk); + length += chunk.length; + if (length > CHUNK_LIMIT) { + chunks = []; + length = 0; + break + } } - } catch (err) { - // Process in a fallback if error - } - - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)); - } - - util$6 = { getResolveErrorBodyCallback }; - return util$6; -} - -var abortSignal$1; -var hasRequiredAbortSignal; - -function requireAbortSignal () { - if (hasRequiredAbortSignal) return abortSignal$1; - hasRequiredAbortSignal = 1; - const { addAbortListener } = requireUtil$8(); - const { RequestAbortedError } = requireErrors$1(); - - const kListener = Symbol('kListener'); - const kSignal = Symbol('kSignal'); - - function abort (self) { - if (self.abort) { - self.abort(); - } else { - self.onError(new RequestAbortedError()); + } catch { + chunks = []; + length = 0; + // Do nothing.... } - } - - function addSignal (self, signal) { - self[kSignal] = null; - self[kListener] = null; - if (!signal) { - return - } + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`; - if (signal.aborted) { - abort(self); + if (statusCode === 204 || !contentType || !length) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))); return } - self[kSignal] = signal; - self[kListener] = () => { - abort(self); - }; - - addAbortListener(self[kSignal], self[kListener]); - } + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + let payload; - function removeSignal (self) { - if (!self[kSignal]) { - return + try { + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)); + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length); + } + } catch { + // process in a callback to avoid throwing in the microtask queue + } finally { + Error.stackTraceLimit = stackTraceLimit; } + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))); + } - if ('removeEventListener' in self[kSignal]) { - self[kSignal].removeEventListener('abort', self[kListener]); - } else { - self[kSignal].removeListener('abort', self[kListener]); - } + const isContentTypeApplicationJson = (contentType) => { + return ( + contentType.length > 15 && + contentType[11] === '/' && + contentType[0] === 'a' && + contentType[1] === 'p' && + contentType[2] === 'p' && + contentType[3] === 'l' && + contentType[4] === 'i' && + contentType[5] === 'c' && + contentType[6] === 'a' && + contentType[7] === 't' && + contentType[8] === 'i' && + contentType[9] === 'o' && + contentType[10] === 'n' && + contentType[12] === 'j' && + contentType[13] === 's' && + contentType[14] === 'o' && + contentType[15] === 'n' + ) + }; - self[kSignal] = null; - self[kListener] = null; - } + const isContentTypeText = (contentType) => { + return ( + contentType.length > 4 && + contentType[4] === '/' && + contentType[0] === 't' && + contentType[1] === 'e' && + contentType[2] === 'x' && + contentType[3] === 't' + ) + }; - abortSignal$1 = { - addSignal, - removeSignal + util$f = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText }; - return abortSignal$1; + return util$f; } -var hasRequiredApiRequest; +var hasRequiredApiRequest$1; -function requireApiRequest () { - if (hasRequiredApiRequest) return apiRequest.exports; - hasRequiredApiRequest = 1; +function requireApiRequest$1 () { + if (hasRequiredApiRequest$1) return apiRequest$1.exports; + hasRequiredApiRequest$1 = 1; - const Readable = requireReadable(); - const { - InvalidArgumentError, - RequestAbortedError - } = requireErrors$1(); - const util = requireUtil$8(); - const { getResolveErrorBodyCallback } = requireUtil$6(); - const { AsyncResource } = require$$4$1; - const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$7; + const { Readable } = requireReadable$1(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$2(); + const util = requireUtil$h(); + const { getResolveErrorBodyCallback } = requireUtil$f(); + const { AsyncResource } = require$$5$2; class RequestHandler extends AsyncResource { constructor (opts, callback) { @@ -12607,6 +14181,7 @@ function requireApiRequest () { throw err } + this.method = method; this.responseHeaders = responseHeaders || null; this.opaque = opaque || null; this.callback = callback; @@ -12618,6 +14193,9 @@ function requireApiRequest () { this.onInfo = onInfo || null; this.throwOnError = throwOnError; this.highWaterMark = highWaterMark; + this.signal = signal; + this.reason = null; + this.removeAbortListener = null; if (util.isStream(body)) { body.on('error', (err) => { @@ -12625,14 +14203,36 @@ function requireApiRequest () { }); } - addSignal(this, signal); + if (this.signal) { + if (this.signal.aborted) { + this.reason = this.signal.reason ?? new RequestAbortedError(); + } else { + this.removeAbortListener = util.addAbortListener(this.signal, () => { + this.reason = this.signal.reason ?? new RequestAbortedError(); + if (this.res) { + util.destroy(this.res.on('error', util.nop), this.reason); + } else if (this.abort) { + this.abort(this.reason); + } + + if (this.removeAbortListener) { + this.res?.off('close', this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } + }); + } + } } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = context; } @@ -12651,14 +14251,27 @@ function requireApiRequest () { const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers; const contentType = parsedHeaders['content-type']; - const body = new Readable({ resume, abort, contentType, highWaterMark }); + const contentLength = parsedHeaders['content-length']; + const res = new Readable({ + resume, + abort, + contentType, + contentLength: this.method !== 'HEAD' && contentLength + ? Number(contentLength) + : null, + highWaterMark + }); + + if (this.removeAbortListener) { + res.on('close', this.removeAbortListener); + } this.callback = null; - this.res = body; + this.res = res; if (callback !== null) { if (this.throwOnError && statusCode >= 400) { this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body, contentType, statusCode, statusMessage, headers } + { callback, body: res, contentType, statusCode, statusMessage, headers } ); } else { this.runInAsyncScope(callback, null, null, { @@ -12666,7 +14279,7 @@ function requireApiRequest () { headers, trailers: this.trailers, opaque, - body, + body: res, context }); } @@ -12674,25 +14287,17 @@ function requireApiRequest () { } onData (chunk) { - const { res } = this; - return res.push(chunk) + return this.res.push(chunk) } onComplete (trailers) { - const { res } = this; - - removeSignal(this); - util.parseHeaders(trailers, this.trailers); - - res.push(null); + this.res.push(null); } onError (err) { const { res, callback, body, opaque } = this; - removeSignal(this); - if (callback) { // TODO: Does this need queueMicrotask? this.callback = null; @@ -12713,6 +14318,12 @@ function requireApiRequest () { this.body = null; util.destroy(body, err); } + + if (this.removeAbortListener) { + res?.off('close', this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } } } @@ -12731,39 +14342,102 @@ function requireApiRequest () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiRequest.exports = request; - apiRequest.exports.RequestHandler = RequestHandler; - return apiRequest.exports; + apiRequest$1.exports = request; + apiRequest$1.exports.RequestHandler = RequestHandler; + return apiRequest$1.exports; } -var apiStream; -var hasRequiredApiStream; +var abortSignal$2; +var hasRequiredAbortSignal$1; -function requireApiStream () { - if (hasRequiredApiStream) return apiStream; - hasRequiredApiStream = 1; +function requireAbortSignal$1 () { + if (hasRequiredAbortSignal$1) return abortSignal$2; + hasRequiredAbortSignal$1 = 1; + const { addAbortListener } = requireUtil$h(); + const { RequestAbortedError } = requireErrors$2(); - const { finished, PassThrough } = require$$0__default$1; - const { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = requireErrors$1(); - const util = requireUtil$8(); - const { getResolveErrorBodyCallback } = requireUtil$6(); - const { AsyncResource } = require$$4$1; - const { addSignal, removeSignal } = requireAbortSignal(); + const kListener = Symbol('kListener'); + const kSignal = Symbol('kSignal'); - class StreamHandler extends AsyncResource { - constructor (opts, factory, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } + function abort (self) { + if (self.abort) { + self.abort(self[kSignal]?.reason); + } else { + self.reason = self[kSignal]?.reason ?? new RequestAbortedError(); + } + removeSignal(self); + } + + function addSignal (self, signal) { + self.reason = null; + + self[kSignal] = null; + self[kListener] = null; + + if (!signal) { + return + } + + if (signal.aborted) { + abort(self); + return + } + + self[kSignal] = signal; + self[kListener] = () => { + abort(self); + }; + + addAbortListener(self[kSignal], self[kListener]); + } + + function removeSignal (self) { + if (!self[kSignal]) { + return + } + + if ('removeEventListener' in self[kSignal]) { + self[kSignal].removeEventListener('abort', self[kListener]); + } else { + self[kSignal].removeListener('abort', self[kListener]); + } + + self[kSignal] = null; + self[kListener] = null; + } + + abortSignal$2 = { + addSignal, + removeSignal + }; + return abortSignal$2; +} + +var apiStream$1; +var hasRequiredApiStream$1; + +function requireApiStream$1 () { + if (hasRequiredApiStream$1) return apiStream$1; + hasRequiredApiStream$1 = 1; + + const assert = require$$0$7; + const { finished, PassThrough } = require$$0$8; + const { InvalidArgumentError, InvalidReturnValueError } = requireErrors$2(); + const util = requireUtil$h(); + const { getResolveErrorBodyCallback } = requireUtil$f(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal$1(); + + class StreamHandler extends AsyncResource { + constructor (opts, factory, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; @@ -12818,10 +14492,13 @@ function requireApiStream () { } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = context; } @@ -12896,7 +14573,7 @@ function requireApiStream () { const needDrain = res.writableNeedDrain !== undefined ? res.writableNeedDrain - : res._writableState && res._writableState.needDrain; + : res._writableState?.needDrain; return needDrain !== true } @@ -12960,36 +14637,36 @@ function requireApiStream () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiStream = stream; - return apiStream; + apiStream$1 = stream; + return apiStream$1; } -var apiPipeline; -var hasRequiredApiPipeline; +var apiPipeline$1; +var hasRequiredApiPipeline$1; -function requireApiPipeline () { - if (hasRequiredApiPipeline) return apiPipeline; - hasRequiredApiPipeline = 1; +function requireApiPipeline$1 () { + if (hasRequiredApiPipeline$1) return apiPipeline$1; + hasRequiredApiPipeline$1 = 1; const { Readable, Duplex, PassThrough - } = require$$0__default$1; + } = require$$0$8; const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError - } = requireErrors$1(); - const util = requireUtil$8(); - const { AsyncResource } = require$$4$1; - const { addSignal, removeSignal } = requireAbortSignal(); - const assert = require$$0$8; + } = requireErrors$2(); + const util = requireUtil$h(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal$1(); + const assert = require$$0$7; const kResume = Symbol('resume'); @@ -13076,7 +14753,7 @@ function requireApiPipeline () { read: () => { const { body } = this; - if (body && body.resume) { + if (body?.resume) { body.resume(); } }, @@ -13123,12 +14800,14 @@ function requireApiPipeline () { onConnect (abort, context) { const { ret, res } = this; - assert(!res, 'pipeline cannot be retried'); - - if (ret.destroyed) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(!res, 'pipeline cannot be retried'); + assert(!ret.destroyed); + this.abort = abort; this.context = context; } @@ -13222,22 +14901,22 @@ function requireApiPipeline () { } } - apiPipeline = pipeline; - return apiPipeline; + apiPipeline$1 = pipeline; + return apiPipeline$1; } -var apiUpgrade; -var hasRequiredApiUpgrade; +var apiUpgrade$1; +var hasRequiredApiUpgrade$1; -function requireApiUpgrade () { - if (hasRequiredApiUpgrade) return apiUpgrade; - hasRequiredApiUpgrade = 1; +function requireApiUpgrade$1 () { + if (hasRequiredApiUpgrade$1) return apiUpgrade$1; + hasRequiredApiUpgrade$1 = 1; - const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors$1(); - const { AsyncResource } = require$$4$1; - const util = requireUtil$8(); - const { addSignal, removeSignal } = requireAbortSignal(); - const assert = require$$0$8; + const { InvalidArgumentError, SocketError } = requireErrors$2(); + const { AsyncResource } = require$$5$2; + const util = requireUtil$h(); + const { addSignal, removeSignal } = requireAbortSignal$1(); + const assert = require$$0$7; class UpgradeHandler extends AsyncResource { constructor (opts, callback) { @@ -13267,10 +14946,13 @@ function requireApiUpgrade () { } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = null; } @@ -13280,9 +14962,9 @@ function requireApiUpgrade () { } onUpgrade (statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; + assert(statusCode === 101); - assert.strictEqual(statusCode, 101); + const { callback, opaque, context } = this; removeSignal(this); @@ -13330,26 +15012,27 @@ function requireApiUpgrade () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiUpgrade = upgrade; - return apiUpgrade; + apiUpgrade$1 = upgrade; + return apiUpgrade$1; } -var apiConnect; -var hasRequiredApiConnect; +var apiConnect$1; +var hasRequiredApiConnect$1; -function requireApiConnect () { - if (hasRequiredApiConnect) return apiConnect; - hasRequiredApiConnect = 1; +function requireApiConnect$1 () { + if (hasRequiredApiConnect$1) return apiConnect$1; + hasRequiredApiConnect$1 = 1; - const { AsyncResource } = require$$4$1; - const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors$1(); - const util = requireUtil$8(); - const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$7; + const { AsyncResource } = require$$5$2; + const { InvalidArgumentError, SocketError } = requireErrors$2(); + const util = requireUtil$h(); + const { addSignal, removeSignal } = requireAbortSignal$1(); class ConnectHandler extends AsyncResource { constructor (opts, callback) { @@ -13378,10 +15061,13 @@ function requireApiConnect () { } onConnect (abort, context) { - if (!this.callback) { - throw new RequestAbortedError() + if (this.reason) { + abort(this.reason); + return } + assert(this.callback); + this.abort = abort; this.context = context; } @@ -13442,38 +15128,43 @@ function requireApiConnect () { if (typeof callback !== 'function') { throw err } - const opaque = opts && opts.opaque; + const opaque = opts?.opaque; queueMicrotask(() => callback(err, { opaque })); } } - apiConnect = connect; - return apiConnect; + apiConnect$1 = connect; + return apiConnect$1; } -var hasRequiredApi; +var hasRequiredApi$1; -function requireApi () { - if (hasRequiredApi) return api; - hasRequiredApi = 1; +function requireApi$1 () { + if (hasRequiredApi$1) return api$1; + hasRequiredApi$1 = 1; - api.request = requireApiRequest(); - api.stream = requireApiStream(); - api.pipeline = requireApiPipeline(); - api.upgrade = requireApiUpgrade(); - api.connect = requireApiConnect(); - return api; + api$1.request = requireApiRequest$1(); + api$1.stream = requireApiStream$1(); + api$1.pipeline = requireApiPipeline$1(); + api$1.upgrade = requireApiUpgrade$1(); + api$1.connect = requireApiConnect$1(); + return api$1; } -var mockErrors; -var hasRequiredMockErrors; +var mockErrors$1; +var hasRequiredMockErrors$1; -function requireMockErrors () { - if (hasRequiredMockErrors) return mockErrors; - hasRequiredMockErrors = 1; +function requireMockErrors$1 () { + if (hasRequiredMockErrors$1) return mockErrors$1; + hasRequiredMockErrors$1 = 1; - const { UndiciError } = requireErrors$1(); + const { UndiciError } = requireErrors$2(); + + const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED'); + /** + * The request does not match any registered mock dispatches. + */ class MockNotMatchedError extends UndiciError { constructor (message) { super(message); @@ -13482,22 +15173,28 @@ function requireMockErrors () { this.message = message || 'The request does not match any registered mock dispatches'; this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'; } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kMockNotMatchedError] === true + } + + [kMockNotMatchedError] = true } - mockErrors = { + mockErrors$1 = { MockNotMatchedError }; - return mockErrors; + return mockErrors$1; } -var mockSymbols; -var hasRequiredMockSymbols; +var mockSymbols$1; +var hasRequiredMockSymbols$1; -function requireMockSymbols () { - if (hasRequiredMockSymbols) return mockSymbols; - hasRequiredMockSymbols = 1; +function requireMockSymbols$1 () { + if (hasRequiredMockSymbols$1) return mockSymbols$1; + hasRequiredMockSymbols$1 = 1; - mockSymbols = { + mockSymbols$1 = { kAgent: Symbol('agent'), kOptions: Symbol('options'), kFactory: Symbol('factory'), @@ -13518,31 +15215,31 @@ function requireMockSymbols () { kGetNetConnect: Symbol('get net connect'), kConnected: Symbol('connected') }; - return mockSymbols; + return mockSymbols$1; } -var mockUtils; -var hasRequiredMockUtils; +var mockUtils$1; +var hasRequiredMockUtils$1; -function requireMockUtils () { - if (hasRequiredMockUtils) return mockUtils; - hasRequiredMockUtils = 1; +function requireMockUtils$1 () { + if (hasRequiredMockUtils$1) return mockUtils$1; + hasRequiredMockUtils$1 = 1; - const { MockNotMatchedError } = requireMockErrors(); + const { MockNotMatchedError } = requireMockErrors$1(); const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect - } = requireMockSymbols(); - const { buildURL, nop } = requireUtil$8(); - const { STATUS_CODES } = require$$0$7; + } = requireMockSymbols$1(); + const { buildURL } = requireUtil$h(); + const { STATUS_CODES } = require$$2; const { types: { isPromise } - } = require$$0__default; + } = require$$0$a; function matchValue (match, value) { if (typeof match === 'string') { @@ -13646,6 +15343,10 @@ function requireMockUtils () { function getResponseData (data) { if (Buffer.isBuffer(data)) { return data + } else if (data instanceof Uint8Array) { + return data + } else if (data instanceof ArrayBuffer) { + return data } else if (typeof data === 'object') { return JSON.stringify(data) } else { @@ -13666,19 +15367,20 @@ function requireMockUtils () { // Match method matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`) + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`) } // Match body matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`) + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`) } // Match headers matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)); if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`) + const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers; + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`) } return matchedMockDispatches[0] @@ -13716,11 +15418,21 @@ function requireMockUtils () { } function generateKeyValues (data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []) + const keys = Object.keys(data); + const result = []; + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + const value = data[key]; + const name = Buffer.from(`${key}`); + if (Array.isArray(value)) { + for (let j = 0; j < value.length; ++j) { + result.push(name, Buffer.from(`${value[j]}`)); + } + } else { + result.push(name, Buffer.from(`${value}`)); + } + } + return result } /** @@ -13802,10 +15514,10 @@ function requireMockUtils () { const responseHeaders = generateKeyValues(headers); const responseTrailers = generateKeyValues(trailers); - handler.abort = nop; - handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); - handler.onData(Buffer.from(responseData)); - handler.onComplete(responseTrailers); + handler.onConnect?.(err => handler.onError(err), null); + handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler.onData?.(Buffer.from(responseData)); + handler.onComplete?.(responseTrailers); deleteMockDispatch(mockDispatches, key); } @@ -13861,7 +15573,7 @@ function requireMockUtils () { } } - mockUtils = { + mockUtils$1 = { getResponseData, getMockDispatch, addMockDispatch, @@ -13875,20 +15587,21 @@ function requireMockUtils () { buildMockDispatch, checkNetConnect, buildMockOptions, - getHeaderByName + getHeaderByName, + buildHeadersFromArray }; - return mockUtils; + return mockUtils$1; } -var mockInterceptor = {}; +var mockInterceptor$1 = {}; -var hasRequiredMockInterceptor; +var hasRequiredMockInterceptor$1; -function requireMockInterceptor () { - if (hasRequiredMockInterceptor) return mockInterceptor; - hasRequiredMockInterceptor = 1; +function requireMockInterceptor$1 () { + if (hasRequiredMockInterceptor$1) return mockInterceptor$1; + hasRequiredMockInterceptor$1 = 1; - const { getResponseData, buildKey, addMockDispatch } = requireMockUtils(); + const { getResponseData, buildKey, addMockDispatch } = requireMockUtils$1(); const { kDispatches, kDispatchKey, @@ -13896,9 +15609,9 @@ function requireMockInterceptor () { kDefaultTrailers, kContentLength, kMockDispatch - } = requireMockSymbols(); - const { InvalidArgumentError } = requireErrors$1(); - const { buildURL } = requireUtil$8(); + } = requireMockSymbols$1(); + const { InvalidArgumentError } = requireErrors$2(); + const { buildURL } = requireUtil$h(); /** * Defines the scope API for an interceptor reply @@ -13962,7 +15675,7 @@ function requireMockInterceptor () { if (opts.query) { opts.path = buildURL(opts.path, opts.query); } else { - // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811 + // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811 const parsedURL = new URL(opts.path, 'data://'); opts.path = parsedURL.pathname + parsedURL.search; } @@ -13978,7 +15691,7 @@ function requireMockInterceptor () { this[kContentLength] = false; } - createMockScopeDispatchData (statusCode, data, responseOptions = {}) { + createMockScopeDispatchData ({ statusCode, data, responseOptions }) { const responseData = getResponseData(data); const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}; const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; @@ -13987,14 +15700,11 @@ function requireMockInterceptor () { return { statusCode, data, headers, trailers } } - validateReplyParameters (statusCode, data, responseOptions) { - if (typeof statusCode === 'undefined') { + validateReplyParameters (replyParameters) { + if (typeof replyParameters.statusCode === 'undefined') { throw new InvalidArgumentError('statusCode must be defined') } - if (typeof data === 'undefined') { - throw new InvalidArgumentError('data must be defined') - } - if (typeof responseOptions !== 'object') { + if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) { throw new InvalidArgumentError('responseOptions must be an object') } } @@ -14002,28 +15712,28 @@ function requireMockInterceptor () { /** * Mock an undici request with a defined reply. */ - reply (replyData) { + reply (replyOptionsCallbackOrStatusCode) { // Values of reply aren't available right now as they // can only be available when the reply callback is invoked. - if (typeof replyData === 'function') { + if (typeof replyOptionsCallbackOrStatusCode === 'function') { // We'll first wrap the provided callback in another function, // this function will properly resolve the data from the callback // when invoked. const wrappedDefaultsCallback = (opts) => { // Our reply options callback contains the parameter for statusCode, data and options. - const resolvedData = replyData(opts); + const resolvedData = replyOptionsCallbackOrStatusCode(opts); // Check if it is in the right format - if (typeof resolvedData !== 'object') { + if (typeof resolvedData !== 'object' || resolvedData === null) { throw new InvalidArgumentError('reply options callback must return an object') } - const { statusCode, data = '', responseOptions = {} } = resolvedData; - this.validateReplyParameters(statusCode, data, responseOptions); + const replyParameters = { data: '', responseOptions: {}, ...resolvedData }; + this.validateReplyParameters(replyParameters); // Since the values can be obtained immediately we return them // from this higher order function that will be resolved later. return { - ...this.createMockScopeDispatchData(statusCode, data, responseOptions) + ...this.createMockScopeDispatchData(replyParameters) } }; @@ -14036,11 +15746,15 @@ function requireMockInterceptor () { // we should have 1-3 parameters. So we spread the arguments of // this function to obtain the parameters, since replyData will always // just be the statusCode. - const [statusCode, data = '', responseOptions = {}] = [...arguments]; - this.validateReplyParameters(statusCode, data, responseOptions); + const replyParameters = { + statusCode: replyOptionsCallbackOrStatusCode, + data: arguments[1] === undefined ? '' : arguments[1], + responseOptions: arguments[2] === undefined ? {} : arguments[2] + }; + this.validateReplyParameters(replyParameters); // Send in-already provided data like usual - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); + const dispatchData = this.createMockScopeDispatchData(replyParameters); const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); return new MockScope(newMockDispatch) } @@ -14090,21 +15804,21 @@ function requireMockInterceptor () { } } - mockInterceptor.MockInterceptor = MockInterceptor; - mockInterceptor.MockScope = MockScope; - return mockInterceptor; + mockInterceptor$1.MockInterceptor = MockInterceptor; + mockInterceptor$1.MockScope = MockScope; + return mockInterceptor$1; } -var mockClient; -var hasRequiredMockClient; +var mockClient$1; +var hasRequiredMockClient$1; -function requireMockClient () { - if (hasRequiredMockClient) return mockClient; - hasRequiredMockClient = 1; +function requireMockClient$1 () { + if (hasRequiredMockClient$1) return mockClient$1; + hasRequiredMockClient$1 = 1; - const { promisify } = require$$0__default; - const Client = requireClient(); - const { buildMockDispatch } = requireMockUtils(); + const { promisify } = require$$0$a; + const Client = requireClient$1(); + const { buildMockDispatch } = requireMockUtils$1(); const { kDispatches, kMockAgent, @@ -14113,10 +15827,10 @@ function requireMockClient () { kOrigin, kOriginalDispatch, kConnected - } = requireMockSymbols(); - const { MockInterceptor } = requireMockInterceptor(); - const Symbols = requireSymbols$4(); - const { InvalidArgumentError } = requireErrors$1(); + } = requireMockSymbols$1(); + const { MockInterceptor } = requireMockInterceptor$1(); + const Symbols = requireSymbols$9(); + const { InvalidArgumentError } = requireErrors$2(); /** * MockClient provides an API that extends the Client to influence the mockDispatches. @@ -14158,20 +15872,20 @@ function requireMockClient () { } } - mockClient = MockClient; - return mockClient; + mockClient$1 = MockClient; + return mockClient$1; } -var mockPool; -var hasRequiredMockPool; +var mockPool$1; +var hasRequiredMockPool$1; -function requireMockPool () { - if (hasRequiredMockPool) return mockPool; - hasRequiredMockPool = 1; +function requireMockPool$1 () { + if (hasRequiredMockPool$1) return mockPool$1; + hasRequiredMockPool$1 = 1; - const { promisify } = require$$0__default; - const Pool = requirePool(); - const { buildMockDispatch } = requireMockUtils(); + const { promisify } = require$$0$a; + const Pool = requirePool$1(); + const { buildMockDispatch } = requireMockUtils$1(); const { kDispatches, kMockAgent, @@ -14180,10 +15894,10 @@ function requireMockPool () { kOrigin, kOriginalDispatch, kConnected - } = requireMockSymbols(); - const { MockInterceptor } = requireMockInterceptor(); - const Symbols = requireSymbols$4(); - const { InvalidArgumentError } = requireErrors$1(); + } = requireMockSymbols$1(); + const { MockInterceptor } = requireMockInterceptor$1(); + const Symbols = requireSymbols$9(); + const { InvalidArgumentError } = requireErrors$2(); /** * MockPool provides an API that extends the Pool to influence the mockDispatches. @@ -14225,16 +15939,16 @@ function requireMockPool () { } } - mockPool = MockPool; - return mockPool; + mockPool$1 = MockPool; + return mockPool$1; } -var pluralizer; -var hasRequiredPluralizer; +var pluralizer$1; +var hasRequiredPluralizer$1; -function requirePluralizer () { - if (hasRequiredPluralizer) return pluralizer; - hasRequiredPluralizer = 1; +function requirePluralizer$1 () { + if (hasRequiredPluralizer$1) return pluralizer$1; + hasRequiredPluralizer$1 = 1; const singulars = { pronoun: 'it', @@ -14250,7 +15964,7 @@ function requirePluralizer () { this: 'these' }; - pluralizer = class Pluralizer { + pluralizer$1 = class Pluralizer { constructor (singular, plural) { this.singular = singular; this.plural = plural; @@ -14263,23 +15977,26 @@ function requirePluralizer () { return { ...keys, count, noun } } }; - return pluralizer; + return pluralizer$1; } -var pendingInterceptorsFormatter; -var hasRequiredPendingInterceptorsFormatter; +var pendingInterceptorsFormatter$1; +var hasRequiredPendingInterceptorsFormatter$1; -function requirePendingInterceptorsFormatter () { - if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter; - hasRequiredPendingInterceptorsFormatter = 1; +function requirePendingInterceptorsFormatter$1 () { + if (hasRequiredPendingInterceptorsFormatter$1) return pendingInterceptorsFormatter$1; + hasRequiredPendingInterceptorsFormatter$1 = 1; - const { Transform } = require$$0__default$1; + const { Transform } = require$$0$8; const { Console } = require$$1$6; + const PERSISTENT = process.versions.icu ? '✅' : 'Y '; + const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '; + /** * Gets the output of `console.table(…)` as a string. */ - pendingInterceptorsFormatter = class PendingInterceptorsFormatter { + pendingInterceptorsFormatter$1 = class PendingInterceptorsFormatter { constructor ({ disableColors } = {}) { this.transform = new Transform({ transform (chunk, _enc, cb) { @@ -14302,7 +16019,7 @@ function requirePendingInterceptorsFormatter () { Origin: origin, Path: path, 'Status code': statusCode, - Persistent: persist ? '✅' : '❌', + Persistent: persist ? PERSISTENT : NOT_PERSISTENT, Invocations: timesInvoked, Remaining: persist ? Infinity : times - timesInvoked })); @@ -14311,18 +16028,18 @@ function requirePendingInterceptorsFormatter () { return this.transform.read().toString() } }; - return pendingInterceptorsFormatter; + return pendingInterceptorsFormatter$1; } -var mockAgent; -var hasRequiredMockAgent; +var mockAgent$1; +var hasRequiredMockAgent$1; -function requireMockAgent () { - if (hasRequiredMockAgent) return mockAgent; - hasRequiredMockAgent = 1; +function requireMockAgent$1 () { + if (hasRequiredMockAgent$1) return mockAgent$1; + hasRequiredMockAgent$1 = 1; - const { kClients } = requireSymbols$4(); - const Agent = requireAgent(); + const { kClients } = requireSymbols$9(); + const Agent = requireAgent$1(); const { kAgent, kMockAgentSet, @@ -14333,24 +16050,14 @@ function requireMockAgent () { kGetNetConnect, kOptions, kFactory - } = requireMockSymbols(); - const MockClient = requireMockClient(); - const MockPool = requireMockPool(); - const { matchValue, buildMockOptions } = requireMockUtils(); - const { InvalidArgumentError, UndiciError } = requireErrors$1(); - const Dispatcher = requireDispatcher(); - const Pluralizer = requirePluralizer(); - const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter(); - - class FakeWeakRef { - constructor (value) { - this.value = value; - } - - deref () { - return this.value - } - } + } = requireMockSymbols$1(); + const MockClient = requireMockClient$1(); + const MockPool = requireMockPool$1(); + const { matchValue, buildMockOptions } = requireMockUtils$1(); + const { InvalidArgumentError, UndiciError } = requireErrors$2(); + const Dispatcher = requireDispatcher$1(); + const Pluralizer = requirePluralizer$1(); + const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter$1(); class MockAgent extends Dispatcher { constructor (opts) { @@ -14360,10 +16067,10 @@ function requireMockAgent () { this[kIsMockActive] = true; // Instantiate Agent and encapsulate - if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) { + if ((opts?.agent && typeof opts.agent.dispatch !== 'function')) { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } - const agent = opts && opts.agent ? opts.agent : new Agent(opts); + const agent = opts?.agent ? opts.agent : new Agent(opts); this[kAgent] = agent; this[kClients] = agent[kClients]; @@ -14424,7 +16131,7 @@ function requireMockAgent () { } [kMockAgentSet] (origin, dispatcher) { - this[kClients].set(origin, new FakeWeakRef(dispatcher)); + this[kClients].set(origin, dispatcher); } [kFactory] (origin) { @@ -14436,9 +16143,9 @@ function requireMockAgent () { [kMockAgentGet] (origin) { // First check if we can immediately find it - const ref = this[kClients].get(origin); - if (ref) { - return ref.deref() + const client = this[kClients].get(origin); + if (client) { + return client } // If the origin is not a string create a dummy parent pool and return to user @@ -14449,8 +16156,7 @@ function requireMockAgent () { } // If we match, create a pool and assign the same dispatches - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref(); + for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) { if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { const dispatcher = this[kFactory](origin); this[kMockAgentSet](origin, dispatcher); @@ -14468,7 +16174,7 @@ function requireMockAgent () { const mockAgentClients = this[kClients]; return Array.from(mockAgentClients.entries()) - .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin }))) + .flatMap(([origin, scope]) => scope[kDispatches].map(dispatch => ({ ...dispatch, origin }))) .filter(({ pending }) => pending) } @@ -14489,653 +16195,692 @@ ${pendingInterceptorsFormatter.format(pending)} } } - mockAgent = MockAgent; - return mockAgent; + mockAgent$1 = MockAgent; + return mockAgent$1; } -var proxyAgent; -var hasRequiredProxyAgent; - -function requireProxyAgent () { - if (hasRequiredProxyAgent) return proxyAgent; - hasRequiredProxyAgent = 1; +var global$3; +var hasRequiredGlobal$2; - const { kProxy, kClose, kDestroy, kInterceptors } = requireSymbols$4(); - const { URL } = require$$5$1; - const Agent = requireAgent(); - const Pool = requirePool(); - const DispatcherBase = requireDispatcherBase(); - const { InvalidArgumentError, RequestAbortedError } = requireErrors$1(); - const buildConnector = requireConnect(); +function requireGlobal$2 () { + if (hasRequiredGlobal$2) return global$3; + hasRequiredGlobal$2 = 1; - const kAgent = Symbol('proxy agent'); - const kClient = Symbol('proxy client'); - const kProxyHeaders = Symbol('proxy headers'); - const kRequestTls = Symbol('request tls settings'); - const kProxyTls = Symbol('proxy tls settings'); - const kConnectEndpoint = Symbol('connect endpoint function'); + // We include a version number for the Dispatcher API. In case of breaking changes, + // this version number must be increased to avoid conflicts. + const globalDispatcher = Symbol.for('undici.globalDispatcher.1'); + const { InvalidArgumentError } = requireErrors$2(); + const Agent = requireAgent$1(); - function defaultProtocolPort (protocol) { - return protocol === 'https:' ? 443 : 80 + if (getGlobalDispatcher() === undefined) { + setGlobalDispatcher(new Agent()); } - function buildProxyOptions (opts) { - if (typeof opts === 'string') { - opts = { uri: opts }; - } - - if (!opts || !opts.uri) { - throw new InvalidArgumentError('Proxy opts.uri is mandatory') - } - - return { - uri: opts.uri, - protocol: opts.protocol || 'https' + function setGlobalDispatcher (agent) { + if (!agent || typeof agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument agent must implement Agent') } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }); } - function defaultFactory (origin, opts) { - return new Pool(origin, opts) + function getGlobalDispatcher () { + return globalThis[globalDispatcher] } - class ProxyAgent extends DispatcherBase { - constructor (opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) - ? opts.interceptors.ProxyAgent - : []; + global$3 = { + setGlobalDispatcher, + getGlobalDispatcher + }; + return global$3; +} - if (typeof opts === 'string') { - opts = { uri: opts }; - } +var decoratorHandler$1; +var hasRequiredDecoratorHandler$1; - if (!opts || !opts.uri) { - throw new InvalidArgumentError('Proxy opts.uri is mandatory') - } +function requireDecoratorHandler$1 () { + if (hasRequiredDecoratorHandler$1) return decoratorHandler$1; + hasRequiredDecoratorHandler$1 = 1; - const { clientFactory = defaultFactory } = opts; + decoratorHandler$1 = class DecoratorHandler { + #handler - if (typeof clientFactory !== 'function') { - throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') + constructor (handler) { + if (typeof handler !== 'object' || handler === null) { + throw new TypeError('handler must be an object') } + this.#handler = handler; + } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; + onConnect (...args) { + return this.#handler.onConnect?.(...args) + } - const resolvedUrl = new URL(opts.uri); - const { origin, port, host, username, password } = resolvedUrl; + onError (...args) { + return this.#handler.onError?.(...args) + } - if (opts.auth && opts.token) { - throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') - } else if (opts.auth) { - /* @deprecated in favour of opts.token */ - this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]['proxy-authorization'] = opts.token; - } else if (username && password) { - this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`; - } + onUpgrade (...args) { + return this.#handler.onUpgrade?.(...args) + } - const connect = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts, callback) => { - let requestedHost = opts.host; - if (!opts.port) { - requestedHost += `:${defaultProtocolPort(opts.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts.signal, - headers: { - ...this[kProxyHeaders], - host - } - }); - if (statusCode !== 200) { - socket.on('error', () => {}).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - } - if (opts.protocol !== 'https:') { - callback(null, socket); - return - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts.servername; - } - this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } - } - }); + onResponseStarted (...args) { + return this.#handler.onResponseStarted?.(...args) } - dispatch (opts, handler) { - const { host } = new URL(opts.origin); - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - return this[kAgent].dispatch( - { - ...opts, - headers: { - ...headers, - host - } - }, - handler - ) + onHeaders (...args) { + return this.#handler.onHeaders?.(...args) } - async [kClose] () { - await this[kAgent].close(); - await this[kClient].close(); + onData (...args) { + return this.#handler.onData?.(...args) } - async [kDestroy] () { - await this[kAgent].destroy(); - await this[kClient].destroy(); + onComplete (...args) { + return this.#handler.onComplete?.(...args) } - } - /** - * @param {string[] | Record} headers - * @returns {Record} - */ - function buildHeaders (headers) { - // When using undici.fetch, the headers list is stored - // as an array. - if (Array.isArray(headers)) { - /** @type {Record} */ - const headersPair = {}; + onBodySent (...args) { + return this.#handler.onBodySent?.(...args) + } + }; + return decoratorHandler$1; +} - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } +var redirect$1; +var hasRequiredRedirect$1; - return headersPair - } +function requireRedirect$1 () { + if (hasRequiredRedirect$1) return redirect$1; + hasRequiredRedirect$1 = 1; + const RedirectHandler = requireRedirectHandler$1(); - return headers - } + redirect$1 = opts => { + const globalMaxRedirections = opts?.maxRedirections; + return dispatch => { + return function redirectInterceptor (opts, handler) { + const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts; - /** - * @param {Record} headers - * - * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers - * Nevertheless, it was changed and to avoid a security vulnerability by end users - * this check was created. - * It should be removed in the next major version for performance reasons - */ - function throwIfProxyAuthIsSent (headers) { - const existProxyAuth = headers && Object.keys(headers) - .find((key) => key.toLowerCase() === 'proxy-authorization'); - if (existProxyAuth) { - throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') + if (!maxRedirections) { + return dispatch(opts, handler) + } + + const redirectHandler = new RedirectHandler( + dispatch, + maxRedirections, + opts, + handler + ); + + return dispatch(baseOpts, redirectHandler) + } } - } + }; + return redirect$1; +} - proxyAgent = ProxyAgent; - return proxyAgent; +var retry$1; +var hasRequiredRetry$1; + +function requireRetry$1 () { + if (hasRequiredRetry$1) return retry$1; + hasRequiredRetry$1 = 1; + const RetryHandler = requireRetryHandler$1(); + + retry$1 = globalOpts => { + return dispatch => { + return function retryInterceptor (opts, handler) { + return dispatch( + opts, + new RetryHandler( + { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, + { + handler, + dispatch + } + ) + ) + } + } + }; + return retry$1; } -var RetryHandler_1; -var hasRequiredRetryHandler; +var dump$1; +var hasRequiredDump$1; -function requireRetryHandler () { - if (hasRequiredRetryHandler) return RetryHandler_1; - hasRequiredRetryHandler = 1; - const assert = require$$0$8; +function requireDump$1 () { + if (hasRequiredDump$1) return dump$1; + hasRequiredDump$1 = 1; - const { kRetryHandlerDefaultRetry } = requireSymbols$4(); - const { RequestRetryError } = requireErrors$1(); - const { isDisturbed, parseHeaders, parseRangeHeader } = requireUtil$8(); + const util = requireUtil$h(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$2(); + const DecoratorHandler = requireDecoratorHandler$1(); - function calculateRetryAfterHeader (retryAfter) { - const current = Date.now(); - const diff = new Date(retryAfter).getTime() - current; + class DumpHandler extends DecoratorHandler { + #maxSize = 1024 * 1024 + #abort = null + #dumped = false + #aborted = false + #size = 0 + #reason = null + #handler = null - return diff - } + constructor ({ maxSize }, handler) { + super(handler); - class RetryHandler { - constructor (opts, handlers) { - const { retryOptions, ...dispatchOpts } = opts; - const { - // Retry scoped - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - // Response scoped - methods, - errorCodes, - retryAfter, - statusCodes - } = retryOptions ?? {}; + if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { + throw new InvalidArgumentError('maxSize must be a number greater than 0') + } - this.dispatch = handlers.dispatch; - this.handler = handlers.handler; - this.opts = dispatchOpts; - this.abort = null; - this.aborted = false; - this.retryOpts = { - retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1000, // 30s, - timeout: minTimeout ?? 500, // .5s - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - // What errors we should retry - methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], - // Indicates which errors to retry - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - // List of errors to retry - errorCodes: errorCodes ?? [ - 'ECONNRESET', - 'ECONNREFUSED', - 'ENOTFOUND', - 'ENETDOWN', - 'ENETUNREACH', - 'EHOSTDOWN', - 'EHOSTUNREACH', - 'EPIPE' - ] - }; + this.#maxSize = maxSize ?? this.#maxSize; + this.#handler = handler; + } - this.retryCount = 0; - this.start = 0; - this.end = null; - this.etag = null; - this.resume = null; + onConnect (abort) { + this.#abort = abort; - // Handle possible onConnect duplication - this.handler.onConnect(reason => { - this.aborted = true; - if (this.abort) { - this.abort(reason); - } else { - this.reason = reason; - } - }); + this.#handler.onConnect(this.#customAbort.bind(this)); } - onRequestSent () { - if (this.handler.onRequestSent) { - this.handler.onRequestSent(); - } + #customAbort (reason) { + this.#aborted = true; + this.#reason = reason; } - onUpgrade (statusCode, headers, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers, socket); + // TODO: will require adjustment after new hooks are out + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = util.parseHeaders(rawHeaders); + const contentLength = headers['content-length']; + + if (contentLength != null && contentLength > this.#maxSize) { + throw new RequestAbortedError( + `Response size (${contentLength}) larger than maxSize (${ + this.#maxSize + })` + ) } - } - onConnect (abort) { - if (this.aborted) { - abort(this.reason); - } else { - this.abort = abort; + if (this.#aborted) { + return true } - } - onBodySent (chunk) { - if (this.handler.onBodySent) return this.handler.onBodySent(chunk) + return this.#handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) } - static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { - const { statusCode, code, headers } = err; - const { method, retryOptions } = opts; - const { - maxRetries, - timeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions; - let { counter, currentTimeout } = state; + onError (err) { + if (this.#dumped) { + return + } - currentTimeout = - currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; + err = this.#reason ?? err; - // Any code that is not a Undici's originated and allowed to retry - if ( - code && - code !== 'UND_ERR_REQ_RETRY' && - code !== 'UND_ERR_SOCKET' && - !errorCodes.includes(code) - ) { - cb(err); - return - } + this.#handler.onError(err); + } - // If a set of method are provided and the current method is not in the list - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err); - return - } + onData (chunk) { + this.#size = this.#size + chunk.length; - // If a set of status code are provided and the current status code is not in the list - if ( - statusCode != null && - Array.isArray(statusCodes) && - !statusCodes.includes(statusCode) - ) { - cb(err); - return + if (this.#size >= this.#maxSize) { + this.#dumped = true; + + if (this.#aborted) { + this.#handler.onError(this.#reason); + } else { + this.#handler.onComplete([]); + } } - // If we reached the max number of retries - if (counter > maxRetries) { - cb(err); + return true + } + + onComplete (trailers) { + if (this.#dumped) { return } - let retryAfterHeader = headers != null && headers['retry-after']; - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader); - retryAfterHeader = isNaN(retryAfterHeader) - ? calculateRetryAfterHeader(retryAfterHeader) - : retryAfterHeader * 1e3; // Retry-After is in seconds + if (this.#aborted) { + this.#handler.onError(this.reason); + return } - const retryTimeout = - retryAfterHeader > 0 - ? Math.min(retryAfterHeader, maxTimeout) - : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); - - state.currentTimeout = retryTimeout; - - setTimeout(() => cb(null), retryTimeout); + this.#handler.onComplete(trailers); } + } - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const headers = parseHeaders(rawHeaders); - - this.retryCount += 1; + function createDumpInterceptor ( + { maxSize: defaultMaxSize } = { + maxSize: 1024 * 1024 + } + ) { + return dispatch => { + return function Intercept (opts, handler) { + const { dumpMaxSize = defaultMaxSize } = + opts; - if (statusCode >= 300) { - this.abort( - new RequestRetryError('Request failed', statusCode, { - headers, - count: this.retryCount - }) + const dumpHandler = new DumpHandler( + { maxSize: dumpMaxSize }, + handler ); - return false + + return dispatch(opts, dumpHandler) } + } + } - // Checkpoint for resume from where we left it - if (this.resume != null) { - this.resume = null; + dump$1 = createDumpInterceptor; + return dump$1; +} - if (statusCode !== 206) { - return true - } +var dns$1; +var hasRequiredDns$1; - const contentRange = parseRangeHeader(headers['content-range']); - // If no content range - if (!contentRange) { - this.abort( - new RequestRetryError('Content-Range mismatch', statusCode, { - headers, - count: this.retryCount - }) - ); - return false - } +function requireDns$1 () { + if (hasRequiredDns$1) return dns$1; + hasRequiredDns$1 = 1; + const { isIP } = require$$0$9; + const { lookup } = require$$1$7; + const DecoratorHandler = requireDecoratorHandler$1(); + const { InvalidArgumentError, InformationalError } = requireErrors$2(); + const maxInt = Math.pow(2, 31) - 1; - // Let's start with a weak etag check - if (this.etag != null && this.etag !== headers.etag) { - this.abort( - new RequestRetryError('ETag mismatch', statusCode, { - headers, - count: this.retryCount - }) - ); - return false - } + class DNSInstance { + #maxTTL = 0 + #maxItems = 0 + #records = new Map() + dualStack = true + affinity = null + lookup = null + pick = null - const { start, size, end = size } = contentRange; + constructor (opts) { + this.#maxTTL = opts.maxTTL; + this.#maxItems = opts.maxItems; + this.dualStack = opts.dualStack; + this.affinity = opts.affinity; + this.lookup = opts.lookup ?? this.#defaultLookup; + this.pick = opts.pick ?? this.#defaultPick; + } - assert(this.start === start, 'content-range mismatch'); - assert(this.end == null || this.end === end, 'content-range mismatch'); + get full () { + return this.#records.size === this.#maxItems + } - this.resume = resume; - return true + runLookup (origin, opts, cb) { + const ips = this.#records.get(origin.hostname); + + // If full, we just return the origin + if (ips == null && this.full) { + cb(null, origin.origin); + return } - if (this.end == null) { - if (statusCode === 206) { - // First time we receive 206 - const range = parseRangeHeader(headers['content-range']); + const newOpts = { + affinity: this.affinity, + dualStack: this.dualStack, + lookup: this.lookup, + pick: this.pick, + ...opts.dns, + maxTTL: this.#maxTTL, + maxItems: this.#maxItems + }; - if (range == null) { - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) + // If no IPs we lookup + if (ips == null) { + this.lookup(origin, newOpts, (err, addresses) => { + if (err || addresses == null || addresses.length === 0) { + cb(err ?? new InformationalError('No DNS entries found')); + return } - const { start, size, end = size } = range; + this.setRecords(origin, addresses); + const records = this.#records.get(origin.hostname); - assert( - start != null && Number.isFinite(start) && this.start !== start, - 'content-range mismatch' + const ip = this.pick( + origin, + records, + newOpts.affinity ); - assert(Number.isFinite(start)); - assert( - end != null && Number.isFinite(end) && this.end !== end, - 'invalid content-length' + + let port; + if (typeof ip.port === 'number') { + port = `:${ip.port}`; + } else if (origin.port !== '') { + port = `:${origin.port}`; + } else { + port = ''; + } + + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` ); + }); + } else { + // If there's IPs we pick + const ip = this.pick( + origin, + ips, + newOpts.affinity + ); - this.start = start; - this.end = end; + // If no IPs we lookup - deleting old records + if (ip == null) { + this.#records.delete(origin.hostname); + this.runLookup(origin, opts, cb); + return } - // We make our best to checkpoint the body for further range headers - if (this.end == null) { - const contentLength = headers['content-length']; - this.end = contentLength != null ? Number(contentLength) : null; + let port; + if (typeof ip.port === 'number') { + port = `:${ip.port}`; + } else if (origin.port !== '') { + port = `:${origin.port}`; + } else { + port = ''; } - assert(Number.isFinite(this.start)); - assert( - this.end == null || Number.isFinite(this.end), - 'invalid content-length' + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` ); - - this.resume = resume; - this.etag = headers.etag != null ? headers.etag : null; - - return this.handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) } + } - const err = new RequestRetryError('Request failed', statusCode, { - headers, - count: this.retryCount - }); + #defaultLookup (origin, opts, cb) { + lookup( + origin.hostname, + { + all: true, + family: this.dualStack === false ? this.affinity : 0, + order: 'ipv4first' + }, + (err, addresses) => { + if (err) { + return cb(err) + } - this.abort(err); + const results = new Map(); - return false + for (const addr of addresses) { + // On linux we found duplicates, we attempt to remove them with + // the latest record + results.set(`${addr.address}:${addr.family}`, addr); + } + + cb(null, results.values()); + } + ); } - onData (chunk) { - this.start += chunk.length; + #defaultPick (origin, hostnameRecords, affinity) { + let ip = null; + const { records, offset } = hostnameRecords; - return this.handler.onData(chunk) - } + let family; + if (this.dualStack) { + if (affinity == null) { + // Balance between ip families + if (offset == null || offset === maxInt) { + hostnameRecords.offset = 0; + affinity = 4; + } else { + hostnameRecords.offset++; + affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4; + } + } - onComplete (rawTrailers) { - this.retryCount = 0; - return this.handler.onComplete(rawTrailers) - } + if (records[affinity] != null && records[affinity].ips.length > 0) { + family = records[affinity]; + } else { + family = records[affinity === 4 ? 6 : 4]; + } + } else { + family = records[affinity]; + } - onError (err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) + // If no IPs we return null + if (family == null || family.ips.length === 0) { + return ip } - this.retryOpts.retry( - err, - { - state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, - onRetry.bind(this) - ); + if (family.offset == null || family.offset === maxInt) { + family.offset = 0; + } else { + family.offset++; + } - function onRetry (err) { - if (err != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) - } + const position = family.offset % family.ips.length; + ip = family.ips[position] ?? null; - if (this.start !== 0) { - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - range: `bytes=${this.start}-${this.end ?? ''}` - } - }; - } + if (ip == null) { + return ip + } - try { - this.dispatch(this.opts, this); - } catch (err) { - this.handler.onError(err); - } + if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms + // We delete expired records + // It is possible that they have different TTL, so we manage them individually + family.ips.splice(position, 1); + return this.pick(origin, hostnameRecords, affinity) } + + return ip } - } - RetryHandler_1 = RetryHandler; - return RetryHandler_1; -} + setRecords (origin, addresses) { + const timestamp = Date.now(); + const records = { records: { 4: null, 6: null } }; + for (const record of addresses) { + record.timestamp = timestamp; + if (typeof record.ttl === 'number') { + // The record TTL is expected to be in ms + record.ttl = Math.min(record.ttl, this.#maxTTL); + } else { + record.ttl = this.#maxTTL; + } -var global$1; -var hasRequiredGlobal; + const familyRecords = records.records[record.family] ?? { ips: [] }; -function requireGlobal () { - if (hasRequiredGlobal) return global$1; - hasRequiredGlobal = 1; + familyRecords.ips.push(record); + records.records[record.family] = familyRecords; + } - // We include a version number for the Dispatcher API. In case of breaking changes, - // this version number must be increased to avoid conflicts. - const globalDispatcher = Symbol.for('undici.globalDispatcher.1'); - const { InvalidArgumentError } = requireErrors$1(); - const Agent = requireAgent(); + this.#records.set(origin.hostname, records); + } - if (getGlobalDispatcher() === undefined) { - setGlobalDispatcher(new Agent()); + getHandler (meta, opts) { + return new DNSDispatchHandler(this, meta, opts) + } } - function setGlobalDispatcher (agent) { - if (!agent || typeof agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument agent must implement Agent') + class DNSDispatchHandler extends DecoratorHandler { + #state = null + #opts = null + #dispatch = null + #handler = null + #origin = null + + constructor (state, { origin, handler, dispatch }, opts) { + super(handler); + this.#origin = origin; + this.#handler = handler; + this.#opts = { ...opts }; + this.#state = state; + this.#dispatch = dispatch; } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher () { - return globalThis[globalDispatcher] - } + onError (err) { + switch (err.code) { + case 'ETIMEDOUT': + case 'ECONNREFUSED': { + if (this.#state.dualStack) { + // We delete the record and retry + this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => { + if (err) { + return this.#handler.onError(err) + } - global$1 = { - setGlobalDispatcher, - getGlobalDispatcher - }; - return global$1; -} + const dispatchOpts = { + ...this.#opts, + origin: newOrigin + }; -var DecoratorHandler_1; -var hasRequiredDecoratorHandler; + this.#dispatch(dispatchOpts, this); + }); -function requireDecoratorHandler () { - if (hasRequiredDecoratorHandler) return DecoratorHandler_1; - hasRequiredDecoratorHandler = 1; + // if dual-stack disabled, we error out + return + } - DecoratorHandler_1 = class DecoratorHandler { - constructor (handler) { - this.handler = handler; + this.#handler.onError(err); + return + } + case 'ENOTFOUND': + this.#state.deleteRecord(this.#origin); + // eslint-disable-next-line no-fallthrough + default: + this.#handler.onError(err); + break + } } + } - onConnect (...args) { - return this.handler.onConnect(...args) + dns$1 = interceptorOpts => { + if ( + interceptorOpts?.maxTTL != null && + (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0) + ) { + throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number') } - onError (...args) { - return this.handler.onError(...args) + if ( + interceptorOpts?.maxItems != null && + (typeof interceptorOpts?.maxItems !== 'number' || + interceptorOpts?.maxItems < 1) + ) { + throw new InvalidArgumentError( + 'Invalid maxItems. Must be a positive number and greater than zero' + ) } - onUpgrade (...args) { - return this.handler.onUpgrade(...args) + if ( + interceptorOpts?.affinity != null && + interceptorOpts?.affinity !== 4 && + interceptorOpts?.affinity !== 6 + ) { + throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6') } - onHeaders (...args) { - return this.handler.onHeaders(...args) + if ( + interceptorOpts?.dualStack != null && + typeof interceptorOpts?.dualStack !== 'boolean' + ) { + throw new InvalidArgumentError('Invalid dualStack. Must be a boolean') } - onData (...args) { - return this.handler.onData(...args) + if ( + interceptorOpts?.lookup != null && + typeof interceptorOpts?.lookup !== 'function' + ) { + throw new InvalidArgumentError('Invalid lookup. Must be a function') } - onComplete (...args) { - return this.handler.onComplete(...args) + if ( + interceptorOpts?.pick != null && + typeof interceptorOpts?.pick !== 'function' + ) { + throw new InvalidArgumentError('Invalid pick. Must be a function') } - onBodySent (...args) { - return this.handler.onBodySent(...args) + const dualStack = interceptorOpts?.dualStack ?? true; + let affinity; + if (dualStack) { + affinity = interceptorOpts?.affinity ?? null; + } else { + affinity = interceptorOpts?.affinity ?? 4; + } + + const opts = { + maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms + lookup: interceptorOpts?.lookup ?? null, + pick: interceptorOpts?.pick ?? null, + dualStack, + affinity, + maxItems: interceptorOpts?.maxItems ?? Infinity + }; + + const instance = new DNSInstance(opts); + + return dispatch => { + return function dnsInterceptor (origDispatchOpts, handler) { + const origin = + origDispatchOpts.origin.constructor === URL + ? origDispatchOpts.origin + : new URL(origDispatchOpts.origin); + + if (isIP(origin.hostname) !== 0) { + return dispatch(origDispatchOpts, handler) + } + + instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { + if (err) { + return handler.onError(err) + } + + let dispatchOpts = null; + dispatchOpts = { + ...origDispatchOpts, + servername: origin.hostname, // For SNI on TLS + origin: newOrigin, + headers: { + host: origin.hostname, + ...origDispatchOpts.headers + } + }; + + dispatch( + dispatchOpts, + instance.getHandler({ origin, dispatch, handler }, origDispatchOpts) + ); + }); + + return true + } } }; - return DecoratorHandler_1; + return dns$1; } -var headers; -var hasRequiredHeaders; +var headers$1; +var hasRequiredHeaders$1; -function requireHeaders () { - if (hasRequiredHeaders) return headers; - hasRequiredHeaders = 1; +function requireHeaders$1 () { + if (hasRequiredHeaders$1) return headers$1; + hasRequiredHeaders$1 = 1; - const { kHeadersList, kConstruct } = requireSymbols$4(); - const { kGuard } = requireSymbols$3(); - const { kEnumerableProperty } = requireUtil$8(); + const { kConstruct } = requireSymbols$9(); + const { kEnumerableProperty } = requireUtil$h(); const { - makeIterator, + iteratorMixin, isValidHeaderName, isValidHeaderValue - } = requireUtil$7(); - const util = require$$0__default; - const { webidl } = requireWebidl(); - const assert = require$$0$8; + } = requireUtil$g(); + const { webidl } = requireWebidl$1(); + const assert = require$$0$7; + const util = require$$0$a; const kHeadersMap = Symbol('headers map'); const kHeadersSortedMap = Symbol('headers map sorted'); @@ -15226,21 +16971,27 @@ function requireHeaders () { // 3. If headers’s guard is "immutable", then throw a TypeError. // 4. Otherwise, if headers’s guard is "request" and name is a // forbidden header name, return. + // 5. Otherwise, if headers’s guard is "request-no-cors": + // TODO // Note: undici does not implement forbidden header names - if (headers[kGuard] === 'immutable') { + if (getHeadersGuard(headers) === 'immutable') { throw new TypeError('immutable') - } else if (headers[kGuard] === 'request-no-cors') ; + } // 6. Otherwise, if headers’s guard is "response" and name is a // forbidden response-header name, return. // 7. Append (name, value) to headers’s header list. - return headers[kHeadersList].append(name, value) + return getHeadersList(headers).append(name, value, false) // 8. If headers’s guard is "request-no-cors", then remove // privileged no-CORS request headers from headers } + function compareHeaderName (a, b) { + return a[0] < b[0] ? -1 : 1 + } + class HeadersList { /** @type {[string, string][]|null} */ cookies = null @@ -15256,14 +17007,17 @@ function requireHeaders () { } } - // https://fetch.spec.whatwg.org/#header-list-contains - contains (name) { + /** + * @see https://fetch.spec.whatwg.org/#header-list-contains + * @param {string} name + * @param {boolean} isLowerCase + */ + contains (name, isLowerCase) { // A header list list contains a header name name if list // contains a header whose name is a byte-case-insensitive // match for name. - name = name.toLowerCase(); - return this[kHeadersMap].has(name) + return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase()) } clear () { @@ -15272,13 +17026,18 @@ function requireHeaders () { this.cookies = null; } - // https://fetch.spec.whatwg.org/#concept-header-list-append - append (name, value) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-append + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + append (name, value, isLowerCase) { this[kHeadersSortedMap] = null; // 1. If list contains name, then set name to the first such // header’s name. - const lowercaseName = name.toLowerCase(); + const lowercaseName = isLowerCase ? name : name.toLowerCase(); const exists = this[kHeadersMap].get(lowercaseName); // 2. Append (name, value) to list. @@ -15293,15 +17052,19 @@ function requireHeaders () { } if (lowercaseName === 'set-cookie') { - this.cookies ??= []; - this.cookies.push(value); + (this.cookies ??= []).push(value); } } - // https://fetch.spec.whatwg.org/#concept-header-list-set - set (name, value) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-set + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + set (name, value, isLowerCase) { this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); + const lowercaseName = isLowerCase ? name : name.toLowerCase(); if (lowercaseName === 'set-cookie') { this.cookies = [value]; @@ -15314,11 +17077,14 @@ function requireHeaders () { this[kHeadersMap].set(lowercaseName, { name, value }); } - // https://fetch.spec.whatwg.org/#concept-header-list-delete - delete (name) { + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-delete + * @param {string} name + * @param {boolean} isLowerCase + */ + delete (name, isLowerCase) { this[kHeadersSortedMap] = null; - - name = name.toLowerCase(); + if (!isLowerCase) name = name.toLowerCase(); if (name === 'set-cookie') { this.cookies = null; @@ -15327,20 +17093,23 @@ function requireHeaders () { this[kHeadersMap].delete(name); } - // https://fetch.spec.whatwg.org/#concept-header-list-get - get (name) { - const value = this[kHeadersMap].get(name.toLowerCase()); - + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get + * @param {string} name + * @param {boolean} isLowerCase + * @returns {string | null} + */ + get (name, isLowerCase) { // 1. If list does not contain name, then return null. // 2. Return the values of all headers in list whose name // is a byte-case-insensitive match for name, // separated from each other by 0x2C 0x20, in order. - return value === undefined ? null : value.value + return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null } * [Symbol.iterator] () { // use the lowercased name - for (const [name, { value }] of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { yield [name, value]; } } @@ -15348,7 +17117,7 @@ function requireHeaders () { get entries () { const headers = {}; - if (this[kHeadersMap].size) { + if (this[kHeadersMap].size !== 0) { for (const { name, value } of this[kHeadersMap].values()) { headers[name] = value; } @@ -15356,24 +17125,125 @@ function requireHeaders () { return headers } + + rawValues () { + return this[kHeadersMap].values() + } + + get entriesList () { + const headers = []; + + if (this[kHeadersMap].size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) { + if (lowerName === 'set-cookie') { + for (const cookie of this.cookies) { + headers.push([name, cookie]); + } + } else { + headers.push([name, value]); + } + } + } + + return headers + } + + // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set + toSortedArray () { + const size = this[kHeadersMap].size; + const array = new Array(size); + // In most cases, you will use the fast-path. + // fast-path: Use binary insertion sort for small arrays. + if (size <= 32) { + if (size === 0) { + // If empty, it is an empty array. To avoid the first index assignment. + return array + } + // Improve performance by unrolling loop and avoiding double-loop. + // Double-loop-less version of the binary insertion sort. + const iterator = this[kHeadersMap][Symbol.iterator](); + const firstValue = iterator.next().value; + // set [name, value] to first index. + array[0] = [firstValue[0], firstValue[1].value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(firstValue[1].value !== null); + for ( + let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value; + i < size; + ++i + ) { + // get next value + value = iterator.next().value; + // set [name, value] to current index. + x = array[i] = [value[0], value[1].value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(x[1] !== null); + left = 0; + right = i; + // binary search + while (left < right) { + // middle index + pivot = left + ((right - left) >> 1); + // compare header name + if (array[pivot][0] <= x[0]) { + left = pivot + 1; + } else { + right = pivot; + } + } + if (i !== pivot) { + j = i; + while (j > left) { + array[j] = array[--j]; + } + array[left] = x; + } + } + /* c8 ignore next 4 */ + if (!iterator.next().done) { + // This is for debugging and will never be called. + throw new TypeError('Unreachable') + } + return array + } else { + // This case would be a rare occurrence. + // slow-path: fallback + let i = 0; + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + array[i++] = [name, value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(value !== null); + } + return array.sort(compareHeaderName) + } + } } // https://fetch.spec.whatwg.org/#headers-class class Headers { + #guard + #headersList + constructor (init = undefined) { + webidl.util.markAsUncloneable(this); + if (init === kConstruct) { return } - this[kHeadersList] = new HeadersList(); + + this.#headersList = new HeadersList(); // The new Headers(init) constructor steps are: // 1. Set this’s guard to "none". - this[kGuard] = 'none'; + this.#guard = 'none'; // 2. If init is given, then fill this with init. if (init !== undefined) { - init = webidl.converters.HeadersInit(init); + init = webidl.converters.HeadersInit(init, 'Headers contructor', 'init'); fill(this, init); } } @@ -15382,10 +17252,11 @@ function requireHeaders () { append (name, value) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' }); + webidl.argumentLengthCheck(arguments, 2, 'Headers.append'); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); + const prefix = 'Headers.append'; + name = webidl.converters.ByteString(name, prefix, 'name'); + value = webidl.converters.ByteString(value, prefix, 'value'); return appendHeader(this, name, value) } @@ -15394,9 +17265,10 @@ function requireHeaders () { delete (name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' }); + webidl.argumentLengthCheck(arguments, 1, 'Headers.delete'); - name = webidl.converters.ByteString(name); + const prefix = 'Headers.delete'; + name = webidl.converters.ByteString(name, prefix, 'name'); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { @@ -15417,34 +17289,35 @@ function requireHeaders () { // 5. Otherwise, if this’s guard is "response" and name is // a forbidden response-header name, return. // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { + if (this.#guard === 'immutable') { throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') ; + } // 6. If this’s header list does not contain name, then // return. - if (!this[kHeadersList].contains(name)) { + if (!this.#headersList.contains(name, false)) { return } // 7. Delete name from this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this. - this[kHeadersList].delete(name); + this.#headersList.delete(name, false); } // https://fetch.spec.whatwg.org/#dom-headers-get get (name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' }); + webidl.argumentLengthCheck(arguments, 1, 'Headers.get'); - name = webidl.converters.ByteString(name); + const prefix = 'Headers.get'; + name = webidl.converters.ByteString(name, prefix, 'name'); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.get', + prefix, value: name, type: 'header name' }) @@ -15452,21 +17325,22 @@ function requireHeaders () { // 2. Return the result of getting name from this’s header // list. - return this[kHeadersList].get(name) + return this.#headersList.get(name, false) } // https://fetch.spec.whatwg.org/#dom-headers-has has (name) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' }); + webidl.argumentLengthCheck(arguments, 1, 'Headers.has'); - name = webidl.converters.ByteString(name); + const prefix = 'Headers.has'; + name = webidl.converters.ByteString(name, prefix, 'name'); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.has', + prefix, value: name, type: 'header name' }) @@ -15474,17 +17348,18 @@ function requireHeaders () { // 2. Return true if this’s header list contains name; // otherwise false. - return this[kHeadersList].contains(name) + return this.#headersList.contains(name, false) } // https://fetch.spec.whatwg.org/#dom-headers-set set (name, value) { webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' }); + webidl.argumentLengthCheck(arguments, 2, 'Headers.set'); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); + const prefix = 'Headers.set'; + name = webidl.converters.ByteString(name, prefix, 'name'); + value = webidl.converters.ByteString(value, prefix, 'value'); // 1. Normalize value. value = headerValueNormalize(value); @@ -15493,13 +17368,13 @@ function requireHeaders () { // header value, then throw a TypeError. if (!isValidHeaderName(name)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.set', + prefix, value: name, type: 'header name' }) } else if (!isValidHeaderValue(value)) { throw webidl.errors.invalidArgument({ - prefix: 'Headers.set', + prefix, value, type: 'header value' }) @@ -15514,14 +17389,14 @@ function requireHeaders () { // 6. Otherwise, if this’s guard is "response" and name is a // forbidden response-header name, return. // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { + if (this.#guard === 'immutable') { throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') ; + } // 7. Set (name, value) in this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this - this[kHeadersList].set(name, value); + this.#headersList.set(name, value, false); } // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie @@ -15532,7 +17407,7 @@ function requireHeaders () { // 2. Return the values of all headers in this’s header list whose name is // a byte-case-insensitive match for `Set-Cookie`, in order. - const list = this[kHeadersList].cookies; + const list = this.#headersList.cookies; if (list) { return [...list] @@ -15543,8 +17418,8 @@ function requireHeaders () { // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine get [kHeadersSortedMap] () { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap] + if (this.#headersList[kHeadersSortedMap]) { + return this.#headersList[kHeadersSortedMap] } // 1. Let headers be an empty list of headers with the key being the name @@ -15553,12 +17428,19 @@ function requireHeaders () { // 2. Let names be the result of convert header names to a sorted-lowercase // set with all the names of the headers in list. - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); - const cookies = this[kHeadersList].cookies; + const names = this.#headersList.toSortedArray(); + + const cookies = this.#headersList.cookies; + + // fast-path + if (cookies === null || cookies.length === 1) { + // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray` + return (this.#headersList[kHeadersSortedMap] = names) + } // 3. For each name of names: for (let i = 0; i < names.length; ++i) { - const [name, value] = names[i]; + const { 0: name, 1: value } = names[i]; // 1. If name is `set-cookie`, then: if (name === 'set-cookie') { // 1. Let values be a list of all values of headers in list whose name @@ -15575,95 +17457,47 @@ function requireHeaders () { // 1. Let value be the result of getting name from list. // 2. Assert: value is non-null. - assert(value !== null); + // Note: This operation was done by `HeadersList#toSortedArray`. // 3. Append (name, value) to headers. headers.push([name, value]); } } - this[kHeadersList][kHeadersSortedMap] = headers; - // 4. Return headers. - return headers + return (this.#headersList[kHeadersSortedMap] = headers) } - keys () { - webidl.brandCheck(this, Headers); - - if (this[kGuard] === 'immutable') { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, 'Headers', - 'key') - } + [util.inspect.custom] (depth, options) { + options.depth ??= depth; - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'key' - ) + return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}` } - values () { - webidl.brandCheck(this, Headers); - - if (this[kGuard] === 'immutable') { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, 'Headers', - 'value') - } - - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'value' - ) + static getHeadersGuard (o) { + return o.#guard } - entries () { - webidl.brandCheck(this, Headers); - - if (this[kGuard] === 'immutable') { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, 'Headers', - 'key+value') - } - - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'key+value' - ) + static setHeadersGuard (o, guard) { + o.#guard = guard; } - /** - * @param {(value: string, key: string, self: Headers) => void} callbackFn - * @param {unknown} thisArg - */ - forEach (callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, Headers); - - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' }); - - if (typeof callbackFn !== 'function') { - throw new TypeError( - "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." - ) - } - - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } + static getHeadersList (o) { + return o.#headersList } - [Symbol.for('nodejs.util.inspect.custom')] () { - webidl.brandCheck(this, Headers); - - return this[kHeadersList] + static setHeadersList (o, list) { + o.#headersList = list; } } - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers; + Reflect.deleteProperty(Headers, 'getHeadersGuard'); + Reflect.deleteProperty(Headers, 'setHeadersGuard'); + Reflect.deleteProperty(Headers, 'getHeadersList'); + Reflect.deleteProperty(Headers, 'setHeadersList'); + + iteratorMixin('Headers', Headers, kHeadersSortedMap, 0, 1); Object.defineProperties(Headers.prototype, { append: kEnumerableProperty, @@ -15672,11 +17506,6 @@ function requireHeaders () { has: kEnumerableProperty, set: kEnumerableProperty, getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, [Symbol.toStringTag]: { value: 'Headers', configurable: true @@ -15686,13 +17515,25 @@ function requireHeaders () { } }); - webidl.converters.HeadersInit = function (V) { + webidl.converters.HeadersInit = function (V, prefix, argument) { if (webidl.util.Type(V) === 'Object') { - if (V[Symbol.iterator]) { - return webidl.converters['sequence>'](V) + const iterator = Reflect.get(V, Symbol.iterator); + + // A work-around to ensure we send the properly-cased Headers when V is a Headers object. + // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please. + if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object + try { + return getHeadersList(V).entriesList + } catch { + // fall-through + } } - return webidl.converters['record'](V) + if (typeof iterator === 'function') { + return webidl.converters['sequence>'](V, prefix, argument, iterator.bind(V)) + } + + return webidl.converters['record'](V, prefix, argument) } throw webidl.errors.conversionFailed({ @@ -15702,24 +17543,31 @@ function requireHeaders () { }) }; - headers = { + headers$1 = { fill, + // for test. + compareHeaderName, Headers, - HeadersList + HeadersList, + getHeadersGuard, + setHeadersGuard, + setHeadersList, + getHeadersList }; - return headers; + return headers$1; } -var response$1; -var hasRequiredResponse$1; +var response$2; +var hasRequiredResponse$2; -function requireResponse$1 () { - if (hasRequiredResponse$1) return response$1; - hasRequiredResponse$1 = 1; +function requireResponse$2 () { + if (hasRequiredResponse$2) return response$2; + hasRequiredResponse$2 = 1; - const { Headers, HeadersList, fill } = requireHeaders(); - const { extractBody, cloneBody, mixinBody } = requireBody(); - const util = requireUtil$8(); + const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = requireHeaders$1(); + const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = requireBody$1(); + const util = requireUtil$h(); + const nodeUtil = require$$0$a; const { kEnumerableProperty } = util; const { isValidReasonPhrase, @@ -15728,47 +17576,38 @@ function requireResponse$1 () { isBlobLike, serializeJavascriptValueToJSONString, isErrorLike, - isomorphicEncode - } = requireUtil$7(); + isomorphicEncode, + environmentSettingsObject: relevantRealm + } = requireUtil$g(); const { redirectStatusSet, - nullBodyStatus, - DOMException - } = requireConstants$a(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { FormData } = requireFormdata(); - const { getGlobalOrigin } = requireGlobal$1(); - const { URLSerializer } = requireDataURL(); - const { kHeadersList, kConstruct } = requireSymbols$4(); - const assert = require$$0$8; - const { types } = require$$0__default; + nullBodyStatus + } = requireConstants$e(); + const { kState, kHeaders } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { FormData } = requireFormdata$1(); + const { URLSerializer } = requireDataUrl$1(); + const { kConstruct } = requireSymbols$9(); + const assert = require$$0$7; + const { types } = require$$0$a; - const ReadableStream = globalThis.ReadableStream || require$$14.ReadableStream; const textEncoder = new TextEncoder('utf-8'); // https://fetch.spec.whatwg.org/#response-class class Response { // Creates network error Response. static error () { - // TODO - const relevantRealm = { settingsObject: {} }; - // The static error() method steps are to return the result of creating a // Response object, given a new network error, "immutable", and this’s // relevant Realm. - const responseObject = new Response(); - responseObject[kState] = makeNetworkError(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; - responseObject[kHeaders][kGuard] = 'immutable'; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeNetworkError(), 'immutable'); + return responseObject } // https://fetch.spec.whatwg.org/#dom-response-json static json (data, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' }); + webidl.argumentLengthCheck(arguments, 1, 'Response.json'); if (init !== null) { init = webidl.converters.ResponseInit(init); @@ -15784,11 +17623,7 @@ function requireResponse$1 () { // 3. Let responseObject be the result of creating a Response object, given a new response, // "response", and this’s relevant Realm. - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = 'response'; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeResponse({}), 'response'); // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }); @@ -15799,9 +17634,7 @@ function requireResponse$1 () { // Creates a redirect Response that redirects to url with status status. static redirect (url, status = 302) { - const relevantRealm = { settingsObject: {} }; - - webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' }); + webidl.argumentLengthCheck(arguments, 1, 'Response.redirect'); url = webidl.converters.USVString(url); status = webidl.converters['unsigned short'](status); @@ -15812,24 +17645,19 @@ function requireResponse$1 () { // TODO: base-URL? let parsedURL; try { - parsedURL = new URL(url, getGlobalOrigin()); + parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl); } catch (err) { - throw Object.assign(new TypeError('Failed to parse URL from ' + url), { - cause: err - }) + throw new TypeError(`Failed to parse URL from ${url}`, { cause: err }) } // 3. If status is not a redirect status, then throw a RangeError. if (!redirectStatusSet.has(status)) { - throw new RangeError('Invalid status code ' + status) + throw new RangeError(`Invalid status code ${status}`) } // 4. Let responseObject be the result of creating a Response object, // given a new response, "immutable", and this’s relevant Realm. - const responseObject = new Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = 'immutable'; - responseObject[kHeaders][kRealm] = relevantRealm; + const responseObject = fromInnerResponse(makeResponse({}), 'immutable'); // 5. Set responseObject’s response’s status to status. responseObject[kState].status = status; @@ -15838,7 +17666,7 @@ function requireResponse$1 () { const value = isomorphicEncode(URLSerializer(parsedURL)); // 7. Append `Location`/value to responseObject’s response’s header list. - responseObject[kState].headersList.append('location', value); + responseObject[kState].headersList.append('location', value, true); // 8. Return responseObject. return responseObject @@ -15846,15 +17674,17 @@ function requireResponse$1 () { // https://fetch.spec.whatwg.org/#dom-response constructor (body = null, init = {}) { + webidl.util.markAsUncloneable(this); + if (body === kConstruct) { + return + } + if (body !== null) { body = webidl.converters.BodyInit(body); } init = webidl.converters.ResponseInit(init); - // TODO - this[kRealm] = { settingsObject: {} }; - // 1. Set this’s response to a new response. this[kState] = makeResponse({}); @@ -15862,9 +17692,8 @@ function requireResponse$1 () { // Realm, whose header list is this’s response’s header list and guard // is "response". this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kGuard] = 'response'; - this[kHeaders][kHeadersList] = this[kState].headersList; - this[kHeaders][kRealm] = this[kRealm]; + setHeadersGuard(this[kHeaders], 'response'); + setHeadersList(this[kHeaders], this[kState].headersList); // 3. Let bodyWithType be null. let bodyWithType = null; @@ -15965,7 +17794,7 @@ function requireResponse$1 () { webidl.brandCheck(this, Response); // 1. If this is unusable, then throw a TypeError. - if (this.bodyUsed || (this.body && this.body.locked)) { + if (bodyUnusable(this)) { throw webidl.errors.exception({ header: 'Response.clone', message: 'Body has already been consumed.' @@ -15975,16 +17804,36 @@ function requireResponse$1 () { // 2. Let clonedResponse be the result of cloning this’s response. const clonedResponse = cloneResponse(this[kState]); + // Note: To re-register because of a new stream. + if (hasFinalizationRegistry && this[kState].body?.stream) { + streamRegistry.register(this, new WeakRef(this[kState].body.stream)); + } + // 3. Return the result of creating a Response object, given // clonedResponse, this’s headers’s guard, and this’s relevant Realm. - const clonedResponseObject = new Response(); - clonedResponseObject[kState] = clonedResponse; - clonedResponseObject[kRealm] = this[kRealm]; - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders])) + } + + [nodeUtil.inspect.custom] (depth, options) { + if (options.depth === null) { + options.depth = 2; + } - return clonedResponseObject + options.colors ??= true; + + const properties = { + status: this.status, + statusText: this.statusText, + headers: this.headers, + body: this.body, + bodyUsed: this.bodyUsed, + ok: this.ok, + redirected: this.redirected, + type: this.type, + url: this.url + }; + + return `Response ${nodeUtil.formatWithOptions(options, properties)}` } } @@ -16033,7 +17882,7 @@ function requireResponse$1 () { // 3. If response’s body is non-null, then set newResponse’s body to the // result of cloning response’s body. if (response.body != null) { - newResponse.body = cloneBody(response.body); + newResponse.body = cloneBody(newResponse, response.body); } // 4. Return newResponse. @@ -16052,10 +17901,10 @@ function requireResponse$1 () { cacheState: '', statusText: '', ...init, - headersList: init.headersList - ? new HeadersList(init.headersList) + headersList: init?.headersList + ? new HeadersList(init?.headersList) : new HeadersList(), - urlList: init.urlList ? [...init.urlList] : [] + urlList: init?.urlList ? [...init.urlList] : [] } } @@ -16071,6 +17920,16 @@ function requireResponse$1 () { }) } + // @see https://fetch.spec.whatwg.org/#concept-network-error + function isNetworkError (response) { + return ( + // A network error is a response whose type is "error", + response.type === 'error' && + // status is 0 + response.status === 0 + ) + } + function makeFilteredResponse (response, state) { state = { internalResponse: response, @@ -16194,7 +18053,7 @@ function requireResponse$1 () { if (nullBodyStatus.includes(response.status)) { throw webidl.errors.exception({ header: 'Response constructor', - message: 'Invalid response status code ' + response.status + message: `Invalid response status code ${response.status}` }) } @@ -16203,12 +18062,37 @@ function requireResponse$1 () { // 3. If body's type is non-null and response's header list does not contain // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. - if (body.type != null && !response[kState].headersList.contains('Content-Type')) { - response[kState].headersList.append('content-type', body.type); + if (body.type != null && !response[kState].headersList.contains('content-type', true)) { + response[kState].headersList.append('content-type', body.type, true); } } } + /** + * @see https://fetch.spec.whatwg.org/#response-create + * @param {any} innerResponse + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @returns {Response} + */ + function fromInnerResponse (innerResponse, guard) { + const response = new Response(kConstruct); + response[kState] = innerResponse; + response[kHeaders] = new Headers(kConstruct); + setHeadersList(response[kHeaders], innerResponse.headersList); + setHeadersGuard(response[kHeaders], guard); + + if (hasFinalizationRegistry && innerResponse.body?.stream) { + // If the target (response) is reclaimed, the cleanup callback may be called at some point with + // the held value provided for it (innerResponse.body.stream). The held value can be any value: + // a primitive or an object, even undefined. If the held value is an object, the registry keeps + // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry + streamRegistry.register(response, new WeakRef(innerResponse.body.stream)); + } + + return response + } + webidl.converters.ReadableStream = webidl.interfaceConverter( ReadableStream ); @@ -16222,34 +18106,34 @@ function requireResponse$1 () { ); // https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit - webidl.converters.XMLHttpRequestBodyInit = function (V) { + webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) { if (typeof V === 'string') { - return webidl.converters.USVString(V) + return webidl.converters.USVString(V, prefix, name) } if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) + return webidl.converters.Blob(V, prefix, name, { strict: false }) } - if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { - return webidl.converters.BufferSource(V) + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { + return webidl.converters.BufferSource(V, prefix, name) } if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }) + return webidl.converters.FormData(V, prefix, name, { strict: false }) } if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V) + return webidl.converters.URLSearchParams(V, prefix, name) } - return webidl.converters.DOMString(V) + return webidl.converters.DOMString(V, prefix, name) }; // https://fetch.spec.whatwg.org/#bodyinit - webidl.converters.BodyInit = function (V) { + webidl.converters.BodyInit = function (V, prefix, argument) { if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V) + return webidl.converters.ReadableStream(V, prefix, argument) } // Note: the spec doesn't include async iterables, @@ -16258,19 +18142,19 @@ function requireResponse$1 () { return V } - return webidl.converters.XMLHttpRequestBodyInit(V) + return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument) }; webidl.converters.ResponseInit = webidl.dictionaryConverter([ { key: 'status', converter: webidl.converters['unsigned short'], - defaultValue: 200 + defaultValue: () => 200 }, { key: 'statusText', converter: webidl.converters.ByteString, - defaultValue: '' + defaultValue: () => '' }, { key: 'headers', @@ -16278,37 +18162,92 @@ function requireResponse$1 () { } ]); - response$1 = { + response$2 = { + isNetworkError, makeNetworkError, makeResponse, makeAppropriateNetworkError, filterResponse, Response, - cloneResponse + cloneResponse, + fromInnerResponse }; - return response$1; + return response$2; +} + +var dispatcherWeakref$1; +var hasRequiredDispatcherWeakref$1; + +function requireDispatcherWeakref$1 () { + if (hasRequiredDispatcherWeakref$1) return dispatcherWeakref$1; + hasRequiredDispatcherWeakref$1 = 1; + + const { kConnected, kSize } = requireSymbols$9(); + + class CompatWeakRef { + constructor (value) { + this.value = value; + } + + deref () { + return this.value[kConnected] === 0 && this.value[kSize] === 0 + ? undefined + : this.value + } + } + + class CompatFinalizer { + constructor (finalizer) { + this.finalizer = finalizer; + } + + register (dispatcher, key) { + if (dispatcher.on) { + dispatcher.on('disconnect', () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key); + } + }); + } + } + + unregister (key) {} + } + + dispatcherWeakref$1 = function () { + // FIXME: remove workaround when the Node bug is backported to v18 + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (process.env.NODE_V8_COVERAGE && process.version.startsWith('v18')) { + process._rawDebug('Using compatibility WeakRef and FinalizationRegistry'); + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + } + } + return { WeakRef, FinalizationRegistry } + }; + return dispatcherWeakref$1; } /* globals AbortController */ -var request$1; -var hasRequiredRequest; +var request$3; +var hasRequiredRequest$2; -function requireRequest () { - if (hasRequiredRequest) return request$1; - hasRequiredRequest = 1; +function requireRequest$2 () { + if (hasRequiredRequest$2) return request$3; + hasRequiredRequest$2 = 1; - const { extractBody, mixinBody, cloneBody } = requireBody(); - const { Headers, fill: fillHeaders, HeadersList } = requireHeaders(); - const { FinalizationRegistry } = requireDispatcherWeakref()(); - const util = requireUtil$8(); + const { extractBody, mixinBody, cloneBody, bodyUnusable } = requireBody$1(); + const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = requireHeaders$1(); + const { FinalizationRegistry } = requireDispatcherWeakref$1()(); + const util = requireUtil$h(); + const nodeUtil = require$$0$a; const { isValidHTTPToken, sameOrigin, - normalizeMethod, - makePolicyContainer, - normalizeMethodRecord - } = requireUtil$7(); + environmentSettingsObject + } = requireUtil$g(); const { forbiddenMethodsSet, corsSafeListedMethodsSet, @@ -16318,17 +18257,14 @@ function requireRequest () { requestCredentials, requestCache, requestDuplex - } = requireConstants$a(); - const { kEnumerableProperty } = util; - const { kHeaders, kSignal, kState, kGuard, kRealm } = requireSymbols$3(); - const { webidl } = requireWebidl(); - const { getGlobalOrigin } = requireGlobal$1(); - const { URLSerializer } = requireDataURL(); - const { kHeadersList, kConstruct } = requireSymbols$4(); - const assert = require$$0$8; - const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$1$3; - - let TransformStream = globalThis.TransformStream; + } = requireConstants$e(); + const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util; + const { kHeaders, kSignal, kState, kDispatcher } = requireSymbols$8(); + const { webidl } = requireWebidl$1(); + const { URLSerializer } = requireDataUrl$1(); + const { kConstruct } = requireSymbols$9(); + const assert = require$$0$7; + const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$8; const kAbortController = Symbol('abortController'); @@ -16336,29 +18272,62 @@ function requireRequest () { signal.removeEventListener('abort', abort); }); + const dependentControllerMap = new WeakMap(); + + function buildAbort (acRef) { + return abort + + function abort () { + const ac = acRef.deref(); + if (ac !== undefined) { + // Currently, there is a problem with FinalizationRegistry. + // https://github.com/nodejs/node/issues/49344 + // https://github.com/nodejs/node/issues/47748 + // In the case of abort, the first step is to unregister from it. + // If the controller can refer to it, it is still registered. + // It will be removed in the future. + requestFinalizer.unregister(abort); + + // Unsubscribe a listener. + // FinalizationRegistry will no longer be called, so this must be done. + this.removeEventListener('abort', abort); + + ac.abort(this.reason); + + const controllerList = dependentControllerMap.get(ac.signal); + + if (controllerList !== undefined) { + if (controllerList.size !== 0) { + for (const ref of controllerList) { + const ctrl = ref.deref(); + if (ctrl !== undefined) { + ctrl.abort(this.reason); + } + } + controllerList.clear(); + } + dependentControllerMap.delete(ac.signal); + } + } + } + } + + let patchMethodWarning = false; + // https://fetch.spec.whatwg.org/#request-class class Request { // https://fetch.spec.whatwg.org/#dom-request constructor (input, init = {}) { + webidl.util.markAsUncloneable(this); if (input === kConstruct) { return } - webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' }); + const prefix = 'Request constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - - // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin () { - return this.baseUrl?.origin - }, - policyContainer: makePolicyContainer() - } - }; + input = webidl.converters.RequestInfo(input, prefix, 'input'); + init = webidl.converters.RequestInit(init, prefix, 'init'); // 1. Let request be null. let request = null; @@ -16367,13 +18336,15 @@ function requireRequest () { let fallbackMode = null; // 3. Let baseURL be this’s relevant settings object’s API base URL. - const baseUrl = this[kRealm].settingsObject.baseUrl; + const baseUrl = environmentSettingsObject.settingsObject.baseUrl; // 4. Let signal be null. let signal = null; // 5. If input is a string, then: if (typeof input === 'string') { + this[kDispatcher] = init.dispatcher; + // 1. Let parsedURL be the result of parsing input with baseURL. // 2. If parsedURL is failure, then throw a TypeError. let parsedURL; @@ -16397,6 +18368,8 @@ function requireRequest () { // 5. Set fallbackMode to "cors". fallbackMode = 'cors'; } else { + this[kDispatcher] = init.dispatcher || input[kDispatcher]; + // 6. Otherwise: // 7. Assert: input is a Request object. @@ -16410,7 +18383,7 @@ function requireRequest () { } // 7. Let origin be this’s relevant settings object’s origin. - const origin = this[kRealm].settingsObject.origin; + const origin = environmentSettingsObject.settingsObject.origin; // 8. Let window be "client". let window = 'client'; @@ -16446,7 +18419,7 @@ function requireRequest () { // unsafe-request flag Set. unsafeRequest: request.unsafeRequest, // client This’s relevant settings object. - client: this[kRealm].settingsObject, + client: environmentSettingsObject.settingsObject, // window window. window, // priority request’s priority. @@ -16535,7 +18508,7 @@ function requireRequest () { // then set request’s referrer to "client". if ( (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') || - (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) + (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) ) { request.referrer = 'client'; } else { @@ -16611,21 +18584,40 @@ function requireRequest () { // 1. Let method be init["method"]. let method = init.method; - // 2. If method is not a method or method is a forbidden method, then - // throw a TypeError. - if (!isValidHTTPToken(method)) { - throw new TypeError(`'${method}' is not a valid HTTP method.`) - } + const mayBeNormalized = normalizedMethodRecords[method]; + + if (mayBeNormalized !== undefined) { + // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones + request.method = mayBeNormalized; + } else { + // 2. If method is not a method or method is a forbidden method, then + // throw a TypeError. + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`) + } + + const upperCase = method.toUpperCase(); + + if (forbiddenMethodsSet.has(upperCase)) { + throw new TypeError(`'${method}' HTTP method is unsupported.`) + } - if (forbiddenMethodsSet.has(method.toUpperCase())) { - throw new TypeError(`'${method}' HTTP method is unsupported.`) + // 3. Normalize method. + // https://fetch.spec.whatwg.org/#concept-method-normalize + // Note: must be in uppercase + method = normalizedMethodRecordsBase[upperCase] ?? method; + + // 4. Set request’s method to method. + request.method = method; } - // 3. Normalize method. - method = normalizeMethodRecord[method] ?? normalizeMethod(method); + if (!patchMethodWarning && request.method === 'patch') { + process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', { + code: 'UNDICI-FETCH-patch' + }); - // 4. Set request’s method to method. - request.method = method; + patchMethodWarning = true; + } } // 26. If init["signal"] exists, then set signal to it. @@ -16642,7 +18634,6 @@ function requireRequest () { // (https://dom.spec.whatwg.org/#dom-abortsignal-any) const ac = new AbortController(); this[kSignal] = ac.signal; - this[kSignal][kRealm] = this[kRealm]; // 29. If signal is not null, then make this’s signal follow signal. if (signal != null) { @@ -16666,12 +18657,7 @@ function requireRequest () { this[kAbortController] = ac; const acRef = new WeakRef(ac); - const abort = function () { - const ac = acRef.deref(); - if (ac !== undefined) { - ac.abort(this.reason); - } - }; + const abort = buildAbort(acRef); // Third-party AbortControllers may not work with these. // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619. @@ -16679,14 +18665,18 @@ function requireRequest () { // If the max amount of listeners is equal to the default, increase it // This is only available in node >= v19.9.0 if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal); + setMaxListeners(1500, signal); } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { - setMaxListeners(100, signal); + setMaxListeners(1500, signal); } } catch {} util.addAbortListener(signal, abort); - requestFinalizer.register(ac, { signal, abort }); + // The third argument must be a registry key to be unregistered. + // Without it, you cannot unregister. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry + // abort is used as the unregister key. (because it is unique) + requestFinalizer.register(ac, { signal, abort }, abort); } } @@ -16694,9 +18684,8 @@ function requireRequest () { // Realm, whose header list is request’s header list and guard is // "request". this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kHeadersList] = request.headersList; - this[kHeaders][kGuard] = 'request'; - this[kHeaders][kRealm] = this[kRealm]; + setHeadersList(this[kHeaders], request.headersList); + setHeadersGuard(this[kHeaders], 'request'); // 31. If this’s request’s mode is "no-cors", then: if (mode === 'no-cors') { @@ -16709,13 +18698,13 @@ function requireRequest () { } // 2. Set this’s headers’s guard to "request-no-cors". - this[kHeaders][kGuard] = 'request-no-cors'; + setHeadersGuard(this[kHeaders], 'request-no-cors'); } // 32. If init is not empty, then: if (initHasKey) { /** @type {HeadersList} */ - const headersList = this[kHeaders][kHeadersList]; + const headersList = getHeadersList(this[kHeaders]); // 1. Let headers be a copy of this’s headers and its associated header // list. // 2. If init["headers"] exists, then set headers to init["headers"]. @@ -16727,8 +18716,8 @@ function requireRequest () { // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. if (headers instanceof HeadersList) { - for (const [key, val] of headers) { - headersList.append(key, val); + for (const { name, value } of headers.rawValues()) { + headersList.append(name, value, false); } // Note: Copy the `set-cookie` meta-data. headersList.cookies = headers.cookies; @@ -16769,7 +18758,7 @@ function requireRequest () { // 3, If Content-Type is non-null and this’s headers’s header list does // not contain `Content-Type`, then append `Content-Type`/Content-Type to // this’s headers. - if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) { + if (contentType && !getHeadersList(this[kHeaders]).contains('content-type', true)) { this[kHeaders].append('content-type', contentType); } } @@ -16805,17 +18794,13 @@ function requireRequest () { // 40. If initBody is null and inputBody is non-null, then: if (initBody == null && inputBody != null) { // 1. If input is unusable, then throw a TypeError. - if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + if (bodyUnusable(input)) { throw new TypeError( 'Cannot construct a Request with a Request object that has already been used.' ) } // 2. Set finalBody to the result of creating a proxy for inputBody. - if (!TransformStream) { - TransformStream = require$$14.TransformStream; - } - // https://streams.spec.whatwg.org/#readablestream-create-a-proxy const identityTransform = new TransformStream(); inputBody.stream.pipeThrough(identityTransform); @@ -16969,7 +18954,7 @@ function requireRequest () { } // Returns a boolean indicating whether or not request is for a history - // navigation (a.k.a. back-foward navigation). + // navigation (a.k.a. back-forward navigation). get isHistoryNavigation () { webidl.brandCheck(this, Request); @@ -17011,7 +18996,7 @@ function requireRequest () { webidl.brandCheck(this, Request); // 1. If this is unusable, then throw a TypeError. - if (this.bodyUsed || this.body?.locked) { + if (bodyUnusable(this)) { throw new TypeError('unusable') } @@ -17020,80 +19005,103 @@ function requireRequest () { // 3. Let clonedRequestObject be the result of creating a Request object, // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. - const clonedRequestObject = new Request(kConstruct); - clonedRequestObject[kState] = clonedRequest; - clonedRequestObject[kRealm] = this[kRealm]; - clonedRequestObject[kHeaders] = new Headers(kConstruct); - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - // 4. Make clonedRequestObject’s signal follow this’s signal. const ac = new AbortController(); if (this.signal.aborted) { ac.abort(this.signal.reason); } else { + let list = dependentControllerMap.get(this.signal); + if (list === undefined) { + list = new Set(); + dependentControllerMap.set(this.signal, list); + } + const acRef = new WeakRef(ac); + list.add(acRef); util.addAbortListener( - this.signal, - () => { - ac.abort(this.signal.reason); - } + ac.signal, + buildAbort(acRef) ); } - clonedRequestObject[kSignal] = ac.signal; // 4. Return clonedRequestObject. - return clonedRequestObject + return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders])) + } + + [nodeUtil.inspect.custom] (depth, options) { + if (options.depth === null) { + options.depth = 2; + } + + options.colors ??= true; + + const properties = { + method: this.method, + url: this.url, + headers: this.headers, + destination: this.destination, + referrer: this.referrer, + referrerPolicy: this.referrerPolicy, + mode: this.mode, + credentials: this.credentials, + cache: this.cache, + redirect: this.redirect, + integrity: this.integrity, + keepalive: this.keepalive, + isReloadNavigation: this.isReloadNavigation, + isHistoryNavigation: this.isHistoryNavigation, + signal: this.signal + }; + + return `Request ${nodeUtil.formatWithOptions(options, properties)}` } } mixinBody(Request); + // https://fetch.spec.whatwg.org/#requests function makeRequest (init) { - // https://fetch.spec.whatwg.org/#requests - const request = { - method: 'GET', - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: '', - window: 'client', - keepalive: false, - serviceWorkers: 'all', - initiator: '', - destination: '', - priority: null, - origin: 'client', - policyContainer: 'client', - referrer: 'client', - referrerPolicy: '', - mode: 'no-cors', - useCORSPreflightFlag: false, - credentials: 'same-origin', - useCredentials: false, - cache: 'default', - redirect: 'follow', - integrity: '', - cryptoGraphicsNonceMetadata: '', - parserMetadata: '', - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: 'basic', - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, + return { + method: init.method ?? 'GET', + localURLsOnly: init.localURLsOnly ?? false, + unsafeRequest: init.unsafeRequest ?? false, + body: init.body ?? null, + client: init.client ?? null, + reservedClient: init.reservedClient ?? null, + replacesClientId: init.replacesClientId ?? '', + window: init.window ?? 'client', + keepalive: init.keepalive ?? false, + serviceWorkers: init.serviceWorkers ?? 'all', + initiator: init.initiator ?? '', + destination: init.destination ?? '', + priority: init.priority ?? null, + origin: init.origin ?? 'client', + policyContainer: init.policyContainer ?? 'client', + referrer: init.referrer ?? 'client', + referrerPolicy: init.referrerPolicy ?? '', + mode: init.mode ?? 'no-cors', + useCORSPreflightFlag: init.useCORSPreflightFlag ?? false, + credentials: init.credentials ?? 'same-origin', + useCredentials: init.useCredentials ?? false, + cache: init.cache ?? 'default', + redirect: init.redirect ?? 'follow', + integrity: init.integrity ?? '', + cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '', + parserMetadata: init.parserMetadata ?? '', + reloadNavigation: init.reloadNavigation ?? false, + historyNavigation: init.historyNavigation ?? false, + userActivation: init.userActivation ?? false, + taintedOrigin: init.taintedOrigin ?? false, + redirectCount: init.redirectCount ?? 0, + responseTainting: init.responseTainting ?? 'basic', + preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false, + done: init.done ?? false, + timingAllowFailed: init.timingAllowFailed ?? false, + urlList: init.urlList, + url: init.urlList[0], headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() - }; - request.url = request.urlList[0]; - return request + } } // https://fetch.spec.whatwg.org/#concept-request-clone @@ -17106,13 +19114,30 @@ function requireRequest () { // 2. If request’s body is non-null, set newRequest’s body to the // result of cloning request’s body. if (request.body != null) { - newRequest.body = cloneBody(request.body); + newRequest.body = cloneBody(newRequest, request.body); } // 3. Return newRequest. return newRequest } + /** + * @see https://fetch.spec.whatwg.org/#request-create + * @param {any} innerRequest + * @param {AbortSignal} signal + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @returns {Request} + */ + function fromInnerRequest (innerRequest, signal, guard) { + const request = new Request(kConstruct); + request[kState] = innerRequest; + request[kSignal] = signal; + request[kHeaders] = new Headers(kConstruct); + setHeadersList(request[kHeaders], innerRequest.headersList); + setHeadersGuard(request[kHeaders], guard); + return request + } + Object.defineProperties(Request.prototype, { method: kEnumerableProperty, url: kEnumerableProperty, @@ -17145,16 +19170,16 @@ function requireRequest () { ); // https://fetch.spec.whatwg.org/#requestinfo - webidl.converters.RequestInfo = function (V) { + webidl.converters.RequestInfo = function (V, prefix, argument) { if (typeof V === 'string') { - return webidl.converters.USVString(V) + return webidl.converters.USVString(V, prefix, argument) } if (V instanceof Request) { - return webidl.converters.Request(V) + return webidl.converters.Request(V, prefix, argument) } - return webidl.converters.USVString(V) + return webidl.converters.USVString(V, prefix, argument) }; webidl.converters.AbortSignal = webidl.interfaceConverter( @@ -17224,6 +19249,8 @@ function requireRequest () { converter: webidl.nullableConverter( (signal) => webidl.converters.AbortSignal( signal, + 'RequestInit', + 'signal', { strict: false } ) ) @@ -17236,30 +19263,34 @@ function requireRequest () { key: 'duplex', converter: webidl.converters.DOMString, allowedValues: requestDuplex + }, + { + key: 'dispatcher', // undici specific option + converter: webidl.converters.any } ]); - request$1 = { Request, makeRequest }; - return request$1; + request$3 = { Request, makeRequest, fromInnerRequest, cloneRequest }; + return request$3; } -var fetch_1; -var hasRequiredFetch; +var fetch_1$1; +var hasRequiredFetch$1; -function requireFetch () { - if (hasRequiredFetch) return fetch_1; - hasRequiredFetch = 1; +function requireFetch$1 () { + if (hasRequiredFetch$1) return fetch_1$1; + hasRequiredFetch$1 = 1; const { - Response, makeNetworkError, makeAppropriateNetworkError, filterResponse, - makeResponse - } = requireResponse$1(); - const { Headers } = requireHeaders(); - const { Request, makeRequest } = requireRequest(); - const zlib = require$$3$1; + makeResponse, + fromInnerResponse + } = requireResponse$2(); + const { HeadersList } = requireHeaders$1(); + const { Request, cloneRequest } = requireRequest$2(); + const zlib = require$$3; const { bytesMatch, makePolicyContainer, @@ -17288,33 +19319,38 @@ function requireFetch () { isomorphicEncode, urlIsLocal, urlIsHttpHttpsScheme, - urlHasHttpsScheme - } = requireUtil$7(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const assert = require$$0$8; - const { safelyExtractBody } = requireBody(); + urlHasHttpsScheme, + clampAndCoarsenConnectionTimingInfo, + simpleRangeHeaderValue, + buildContentRange, + createInflate, + extractMimeType + } = requireUtil$g(); + const { kState, kDispatcher } = requireSymbols$8(); + const assert = require$$0$7; + const { safelyExtractBody, extractBody } = requireBody$1(); const { redirectStatusSet, nullBodyStatus, safeMethodsSet, requestBodyHeader, - subresourceSet, - DOMException - } = requireConstants$a(); - const { kHeadersList } = requireSymbols$4(); - const EE = require$$1$3; - const { Readable, pipeline } = require$$0__default$1; - const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = requireUtil$8(); - const { dataURLProcessor, serializeAMimeType } = requireDataURL(); - const { TransformStream } = require$$14; - const { getGlobalDispatcher } = requireGlobal(); - const { webidl } = requireWebidl(); - const { STATUS_CODES } = require$$0$7; + subresourceSet + } = requireConstants$e(); + const EE = require$$8; + const { Readable, pipeline, finished } = require$$0$8; + const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = requireUtil$h(); + const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = requireDataUrl$1(); + const { getGlobalDispatcher } = requireGlobal$2(); + const { webidl } = requireWebidl$1(); + const { STATUS_CODES } = require$$2; const GET_OR_HEAD = ['GET', 'HEAD']; + const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined' + ? 'node' + : 'undici'; + /** @type {import('buffer').resolveObjectURL} */ let resolveObjectURL; - let ReadableStream = globalThis.ReadableStream; class Fetch extends EE { constructor (dispatcher) { @@ -17324,12 +19360,6 @@ function requireFetch () { this.connection = null; this.dump = false; this.state = 'ongoing'; - // 2 terminated listeners get added per request, - // but only 1 gets removed. If there are 20 redirects, - // 21 listeners will be added. - // See https://github.com/nodejs/undici/issues/1711 - // TODO (fix): Find and fix root cause for leaked listener. - this.setMaxListeners(21); } terminate (reason) { @@ -17369,12 +19399,16 @@ function requireFetch () { } } + function handleFetchDone (response) { + finalizeAndReportTiming(response, 'fetch'); + } + // https://fetch.spec.whatwg.org/#fetch-method - function fetch (input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }); + function fetch (input, init = undefined) { + webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch'); // 1. Let p be a new promise. - const p = createDeferredPromise(); + let p = createDeferredPromise(); // 2. Let requestObject be the result of invoking the initial value of // Request as constructor with input and init as arguments. If this throws @@ -17414,7 +19448,6 @@ function requireFetch () { let responseObject = null; // 8. Let relevantRealm be this’s relevant Realm. - const relevantRealm = null; // 9. Let locallyAborted be false. let locallyAborted = false; @@ -17435,16 +19468,17 @@ function requireFetch () { // 3. Abort controller with requestObject’s signal’s abort reason. controller.abort(requestObject.signal.reason); + const realResponse = responseObject?.deref(); + // 4. Abort the fetch() call with p, request, responseObject, // and requestObject’s signal’s abort reason. - abortFetch(p, request, responseObject, requestObject.signal.reason); + abortFetch(p, request, realResponse, requestObject.signal.reason); } ); // 12. Let handleFetchDone given response response be to finalize and // report timing with response, globalObject, and "fetch". - const handleFetchDone = (response) => - finalizeAndReportTiming(response, 'fetch'); + // see function handleFetchDone // 13. Set controller to the result of calling fetch given request, // with processResponseEndOfBody set to handleFetchDone, and processResponse @@ -17453,7 +19487,7 @@ function requireFetch () { const processResponse = (response) => { // 1. If locallyAborted is true, terminate these substeps. if (locallyAborted) { - return Promise.resolve() + return } // 2. If response’s aborted flag is set, then: @@ -17466,36 +19500,30 @@ function requireFetch () { // deserializedError. abortFetch(p, request, responseObject, controller.serializedAbortReason); - return Promise.resolve() + return } // 3. If response is a network error, then reject p with a TypeError // and terminate these substeps. if (response.type === 'error') { - p.reject( - Object.assign(new TypeError('fetch failed'), { cause: response.error }) - ); - return Promise.resolve() + p.reject(new TypeError('fetch failed', { cause: response.error })); + return } // 4. Set responseObject to the result of creating a Response object, // given response, "immutable", and relevantRealm. - responseObject = new Response(); - responseObject[kState] = response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = 'immutable'; - responseObject[kHeaders][kRealm] = relevantRealm; + responseObject = new WeakRef(fromInnerResponse(response, 'immutable')); // 5. Resolve p with responseObject. - p.resolve(responseObject); + p.resolve(responseObject.deref()); + p = null; }; controller = fetching({ request, processResponseEndOfBody: handleFetchDone, processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici + dispatcher: requestObject[kDispatcher] // undici }); // 14. Return p. @@ -17558,7 +19586,7 @@ function requireFetch () { // global, and cacheState. markResourceTiming( timingInfo, - originalURL, + originalURL.href, initiatorType, globalThis, cacheState @@ -17566,23 +19594,15 @@ function requireFetch () { } // https://w3c.github.io/resource-timing/#dfn-mark-resource-timing - function markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) { - if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState); - } - } + const markResourceTiming = performance.markResourceTiming; // https://fetch.spec.whatwg.org/#abort-fetch function abortFetch (p, request, responseObject, error) { - // Note: AbortSignal.reason was added in node v17.2.0 - // which would give us an undefined error to reject with. - // Remove this once node v16 is no longer supported. - if (!error) { - error = new DOMException('The operation was aborted.', 'AbortError'); - } - // 1. Reject promise with error. - p.reject(error); + if (p) { + // We might have already resolved the promise at this stage + p.reject(error); + } // 2. If request’s body is not null and is readable, then cancel request’s // body with error. @@ -17626,8 +19646,11 @@ function requireFetch () { processResponseEndOfBody, processResponseConsumeBody, useParallelQueue = false, - dispatcher // undici + dispatcher = getGlobalDispatcher() // undici }) { + // Ensure that the dispatcher is set accordingly + assert(dispatcher); + // 1. Let taskDestination be null. let taskDestination = null; @@ -17652,9 +19675,9 @@ function requireFetch () { // 5. Let timingInfo be a new fetch timing info whose start time and // post-redirect start time are the coarsened shared current time given // crossOriginIsolatedCapability. - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime + startTime: currentTime }); // 6. Let fetchParams be a new fetch params whose @@ -17700,8 +19723,7 @@ function requireFetch () { // 9. If request’s origin is "client", then set request’s origin to request’s // client’s origin. if (request.origin === 'client') { - // TODO: What if request.client is null? - request.origin = request.client?.origin; + request.origin = request.client.origin; } // 10. If all of the following conditions are true: @@ -17723,7 +19745,7 @@ function requireFetch () { } // 12. If request’s header list does not contain `Accept`, then: - if (!request.headersList.contains('accept')) { + if (!request.headersList.contains('accept', true)) { // 1. Let value be `*/*`. const value = '*/*'; @@ -17740,14 +19762,14 @@ function requireFetch () { // TODO // 3. Append `Accept`/value to request’s header list. - request.headersList.append('accept', value); + request.headersList.append('accept', value, true); } // 13. If request’s header list does not contain `Accept-Language`, then // user agents should append `Accept-Language`/an appropriate value to // request’s header list. - if (!request.headersList.contains('accept-language')) { - request.headersList.append('accept-language', '*'); + if (!request.headersList.contains('accept-language', true)) { + request.headersList.append('accept-language', '*', true); } // 14. If request’s priority is null, then use request’s initiator and @@ -17951,7 +19973,7 @@ function requireFetch () { response.type === 'opaque' && internalResponse.status === 206 && internalResponse.rangeRequested && - !request.headers.contains('range') + !request.headers.contains('range', true) ) { response = internalResponse = makeNetworkError(); } @@ -18036,7 +20058,7 @@ function requireFetch () { } case 'blob:': { if (!resolveObjectURL) { - resolveObjectURL = require$$7.resolveObjectURL; + resolveObjectURL = require$$0$6.resolveObjectURL; } // 1. Let blobURLEntry be request’s current URL’s blob URL entry. @@ -18048,38 +20070,118 @@ function requireFetch () { return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.')) } - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); + const blob = resolveObjectURL(blobURLEntry.toString()); // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s // object is not a Blob object, then return a network error. - if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) { + if (request.method !== 'GET' || !isBlobLike(blob)) { return Promise.resolve(makeNetworkError('invalid method')) } - // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object. - const bodyWithType = safelyExtractBody(blobURLEntryObject); + // 3. Let blob be blobURLEntry’s object. + // Note: done above - // 4. Let body be bodyWithType’s body. - const body = bodyWithType[0]; + // 4. Let response be a new response. + const response = makeResponse(); - // 5. Let length be body’s length, serialized and isomorphic encoded. - const length = isomorphicEncode(`${body.length}`); + // 5. Let fullLength be blob’s size. + const fullLength = blob.size; - // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence. - const type = bodyWithType[1] ?? ''; + // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded. + const serializedFullLength = isomorphicEncode(`${fullLength}`); - // 7. Return a new response whose status message is `OK`, header list is - // « (`Content-Length`, length), (`Content-Type`, type) », and body is body. - const response = makeResponse({ - statusText: 'OK', - headersList: [ - ['content-length', { name: 'Content-Length', value: length }], - ['content-type', { name: 'Content-Type', value: type }] - ] - }); + // 7. Let type be blob’s type. + const type = blob.type; + + // 8. If request’s header list does not contain `Range`: + // 9. Otherwise: + if (!request.headersList.contains('range', true)) { + // 1. Let bodyWithType be the result of safely extracting blob. + // Note: in the FileAPI a blob "object" is a Blob *or* a MediaSource. + // In node, this can only ever be a Blob. Therefore we can safely + // use extractBody directly. + const bodyWithType = extractBody(blob); + + // 2. Set response’s status message to `OK`. + response.statusText = 'OK'; + + // 3. Set response’s body to bodyWithType’s body. + response.body = bodyWithType[0]; + + // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ». + response.headersList.set('content-length', serializedFullLength, true); + response.headersList.set('content-type', type, true); + } else { + // 1. Set response’s range-requested flag. + response.rangeRequested = true; + + // 2. Let rangeHeader be the result of getting `Range` from request’s header list. + const rangeHeader = request.headersList.get('range', true); + + // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true. + const rangeValue = simpleRangeHeaderValue(rangeHeader, true); + + // 4. If rangeValue is failure, then return a network error. + if (rangeValue === 'failure') { + return Promise.resolve(makeNetworkError('failed to fetch the data URL')) + } + + // 5. Let (rangeStart, rangeEnd) be rangeValue. + let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; + + // 6. If rangeStart is null: + // 7. Otherwise: + if (rangeStart === null) { + // 1. Set rangeStart to fullLength − rangeEnd. + rangeStart = fullLength - rangeEnd; + + // 2. Set rangeEnd to rangeStart + rangeEnd − 1. + rangeEnd = rangeStart + rangeEnd - 1; + } else { + // 1. If rangeStart is greater than or equal to fullLength, then return a network error. + if (rangeStart >= fullLength) { + return Promise.resolve(makeNetworkError('Range start is greater than the blob\'s size.')) + } - response.body = body; + // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set + // rangeEnd to fullLength − 1. + if (rangeEnd === null || rangeEnd >= fullLength) { + rangeEnd = fullLength - 1; + } + } + + // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart, + // rangeEnd + 1, and type. + const slicedBlob = blob.slice(rangeStart, rangeEnd, type); + + // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob. + // Note: same reason as mentioned above as to why we use extractBody + const slicedBodyWithType = extractBody(slicedBlob); + + // 10. Set response’s body to slicedBodyWithType’s body. + response.body = slicedBodyWithType[0]; + + // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded. + const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); + + // 12. Let contentRange be the result of invoking build a content range given rangeStart, + // rangeEnd, and fullLength. + const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); + + // 13. Set response’s status to 206. + response.status = 206; + // 14. Set response’s status message to `Partial Content`. + response.statusText = 'Partial Content'; + + // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength), + // (`Content-Type`, type), (`Content-Range`, contentRange) ». + response.headersList.set('content-length', serializedSlicedLength, true); + response.headersList.set('content-type', type, true); + response.headersList.set('content-range', contentRange, true); + } + + // 10. Return response. return Promise.resolve(response) } case 'data:': { @@ -18141,92 +20243,128 @@ function requireFetch () { // https://fetch.spec.whatwg.org/#fetch-finale function fetchFinale (fetchParams, response) { - // 1. If response is a network error, then: - if (response.type === 'error') { - // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ». - response.urlList = [fetchParams.request.urlList[0]]; - - // 2. Set response’s timing info to the result of creating an opaque timing - // info for fetchParams’s timing info. - response.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }); - } + // 1. Let timingInfo be fetchParams’s timing info. + let timingInfo = fetchParams.timingInfo; + + // 2. If response is not a network error and fetchParams’s request’s client is a secure context, + // then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting + // `Server-Timing` from response’s internal response’s header list. + // TODO - // 2. Let processResponseEndOfBody be the following steps: + // 3. Let processResponseEndOfBody be the following steps: const processResponseEndOfBody = () => { - // 1. Set fetchParams’s request’s done flag. - fetchParams.request.done = true; + // 1. Let unsafeEndTime be the unsafe shared current time. + const unsafeEndTime = Date.now(); // ? - // If fetchParams’s process response end-of-body is not null, - // then queue a fetch task to run fetchParams’s process response - // end-of-body given response with fetchParams’s task destination. - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); + // 2. If fetchParams’s request’s destination is "document", then set fetchParams’s controller’s + // full timing info to fetchParams’s timing info. + if (fetchParams.request.destination === 'document') { + fetchParams.controller.fullTimingInfo = timingInfo; } - }; - // 3. If fetchParams’s process response is non-null, then queue a fetch task - // to run fetchParams’s process response given response, with fetchParams’s - // task destination. - if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response)); - } + // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global: + fetchParams.controller.reportTimingSteps = () => { + // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return. + if (fetchParams.request.url.protocol !== 'https:') { + return + } - // 4. If response’s body is null, then run processResponseEndOfBody. - if (response.body == null) { - processResponseEndOfBody(); - } else { - // 5. Otherwise: + // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global. + timingInfo.endTime = unsafeEndTime; + + // 3. Let cacheState be response’s cache state. + let cacheState = response.cacheState; - // 1. Let transformStream be a new a TransformStream. + // 4. Let bodyInfo be response’s body info. + const bodyInfo = response.bodyInfo; - // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, - // enqueues chunk in transformStream. - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk); + // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an + // opaque timing info for timingInfo and set cacheState to the empty string. + if (!response.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo(timingInfo); + + cacheState = ''; + } + + // 6. Let responseStatus be 0. + let responseStatus = 0; + + // 7. If fetchParams’s request’s mode is not "navigate" or response’s has-cross-origin-redirects is false: + if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) { + // 1. Set responseStatus to response’s status. + responseStatus = response.status; + + // 2. Let mimeType be the result of extracting a MIME type from response’s header list. + const mimeType = extractMimeType(response.headersList); + + // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType. + if (mimeType !== 'failure') { + bodyInfo.contentType = minimizeSupportedMimeType(mimeType); + } + } + + // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo, + // fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo, + // and responseStatus. + if (fetchParams.request.initiatorType != null) { + // TODO: update markresourcetiming + markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus); + } }; - // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm - // and flushAlgorithm set to processResponseEndOfBody. - const transformStream = new TransformStream({ - start () {}, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size () { - return 1 + // 4. Let processResponseEndOfBodyTask be the following steps: + const processResponseEndOfBodyTask = () => { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true; + + // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process + // response end-of-body given response. + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); } - }, { - size () { - return 1 + + // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s + // global object is fetchParams’s task destination, then run fetchParams’s controller’s report + // timing steps given fetchParams’s request’s client’s global object. + if (fetchParams.request.initiatorType != null) { + fetchParams.controller.reportTimingSteps(); } - }); + }; - // 4. Set response’s body to the result of piping response’s body through transformStream. - response.body = { stream: response.body.stream.pipeThrough(transformStream) }; - } + // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination + queueMicrotask(() => processResponseEndOfBodyTask()); + }; - // 6. If fetchParams’s process response consume body is non-null, then: - if (fetchParams.processResponseConsumeBody != null) { - // 1. Let processBody given nullOrBytes be this step: run fetchParams’s - // process response consume body given response and nullOrBytes. - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); + // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s + // process response given response, with fetchParams’s task destination. + if (fetchParams.processResponse != null) { + queueMicrotask(() => { + fetchParams.processResponse(response); + fetchParams.processResponse = null; + }); + } - // 2. Let processBodyError be this step: run fetchParams’s process - // response consume body given response and failure. - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); + // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response. + const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response); - // 3. If response’s body is null, then queue a fetch task to run processBody - // given null, with fetchParams’s task destination. - if (response.body == null) { - queueMicrotask(() => processBody(null)); - } else { - // 4. Otherwise, fully read response’s body given processBody, processBodyError, - // and fetchParams’s task destination. - return fullyReadBody(response.body, processBody, processBodyError) - } - return Promise.resolve() + // 6. If internalResponse’s body is null, then run processResponseEndOfBody. + // 7. Otherwise: + if (internalResponse.body == null) { + processResponseEndOfBody(); + } else { + // mcollina: all the following steps of the specs are skipped. + // The internal transform stream is not needed. + // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541 + + // 1. Let transformStream be a new TransformStream. + // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream. + // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm + // set to processResponseEndOfBody. + // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream. + + finished(internalResponse.body.stream, () => { + processResponseEndOfBody(); + }); } } @@ -18301,7 +20439,7 @@ function requireFetch () { // encouraged to, transmit an RST_STREAM frame. // See, https://github.com/whatwg/fetch/issues/1288 if (request.redirect !== 'manual') { - fetchParams.controller.connection.destroy(); + fetchParams.controller.connection.destroy(undefined, false); } // 2. Switch on request’s redirect mode: @@ -18432,14 +20570,14 @@ function requireFetch () { // delete headerName from request’s header list. if (!sameOrigin(requestCurrentURL(request), locationURL)) { // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name - request.headersList.delete('authorization'); + request.headersList.delete('authorization', true); // https://fetch.spec.whatwg.org/#authentication-entries request.headersList.delete('proxy-authorization', true); // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. - request.headersList.delete('cookie'); - request.headersList.delete('host'); + request.headersList.delete('cookie', true); + request.headersList.delete('host', true); } // 14. If request’s body is non-null, then set request’s body to the first return @@ -18505,7 +20643,7 @@ function requireFetch () { // Otherwise: // 1. Set httpRequest to a clone of request. - httpRequest = makeRequest(request); + httpRequest = cloneRequest(request); // 2. Set httpFetchParams to a copy of fetchParams. httpFetchParams = { ...fetchParams }; @@ -18546,7 +20684,7 @@ function requireFetch () { // `Content-Length`/contentLengthHeaderValue to httpRequest’s header // list. if (contentLengthHeaderValue != null) { - httpRequest.headersList.append('content-length', contentLengthHeaderValue); + httpRequest.headersList.append('content-length', contentLengthHeaderValue, true); } // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, @@ -18560,7 +20698,7 @@ function requireFetch () { // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, // to httpRequest’s header list. if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href)); + httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true); } // 12. Append a request `Origin` header for httpRequest. @@ -18572,8 +20710,8 @@ function requireFetch () { // 14. If httpRequest’s header list does not contain `User-Agent`, then // user agents should append `User-Agent`/default `User-Agent` value to // httpRequest’s header list. - if (!httpRequest.headersList.contains('user-agent')) { - httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node'); + if (!httpRequest.headersList.contains('user-agent', true)) { + httpRequest.headersList.append('user-agent', defaultUserAgent); } // 15. If httpRequest’s cache mode is "default" and httpRequest’s header @@ -18582,11 +20720,11 @@ function requireFetch () { // httpRequest’s cache mode to "no-store". if ( httpRequest.cache === 'default' && - (httpRequest.headersList.contains('if-modified-since') || - httpRequest.headersList.contains('if-none-match') || - httpRequest.headersList.contains('if-unmodified-since') || - httpRequest.headersList.contains('if-match') || - httpRequest.headersList.contains('if-range')) + (httpRequest.headersList.contains('if-modified-since', true) || + httpRequest.headersList.contains('if-none-match', true) || + httpRequest.headersList.contains('if-unmodified-since', true) || + httpRequest.headersList.contains('if-match', true) || + httpRequest.headersList.contains('if-range', true)) ) { httpRequest.cache = 'no-store'; } @@ -18598,44 +20736,44 @@ function requireFetch () { if ( httpRequest.cache === 'no-cache' && !httpRequest.preventNoCacheCacheControlHeaderModification && - !httpRequest.headersList.contains('cache-control') + !httpRequest.headersList.contains('cache-control', true) ) { - httpRequest.headersList.append('cache-control', 'max-age=0'); + httpRequest.headersList.append('cache-control', 'max-age=0', true); } // 17. If httpRequest’s cache mode is "no-store" or "reload", then: if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { // 1. If httpRequest’s header list does not contain `Pragma`, then append // `Pragma`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.contains('pragma')) { - httpRequest.headersList.append('pragma', 'no-cache'); + if (!httpRequest.headersList.contains('pragma', true)) { + httpRequest.headersList.append('pragma', 'no-cache', true); } // 2. If httpRequest’s header list does not contain `Cache-Control`, // then append `Cache-Control`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.contains('cache-control')) { - httpRequest.headersList.append('cache-control', 'no-cache'); + if (!httpRequest.headersList.contains('cache-control', true)) { + httpRequest.headersList.append('cache-control', 'no-cache', true); } } // 18. If httpRequest’s header list contains `Range`, then append // `Accept-Encoding`/`identity` to httpRequest’s header list. - if (httpRequest.headersList.contains('range')) { - httpRequest.headersList.append('accept-encoding', 'identity'); + if (httpRequest.headersList.contains('range', true)) { + httpRequest.headersList.append('accept-encoding', 'identity', true); } // 19. Modify httpRequest’s header list per HTTP. Do not append a given // header if httpRequest’s header list contains that header’s name. // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 - if (!httpRequest.headersList.contains('accept-encoding')) { + if (!httpRequest.headersList.contains('accept-encoding', true)) { if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate'); + httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true); } else { - httpRequest.headersList.append('accept-encoding', 'gzip, deflate'); + httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true); } } - httpRequest.headersList.delete('host'); + httpRequest.headersList.delete('host', true); // 21. If there’s a proxy-authentication entry, use it as appropriate. // TODO: proxy-authentication @@ -18652,7 +20790,7 @@ function requireFetch () { // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", // then: - if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') ; + if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') ; // 9. If aborted, then return the appropriate network error for fetchParams. // TODO @@ -18661,7 +20799,7 @@ function requireFetch () { if (response == null) { // 1. If httpRequest’s cache mode is "only-if-cached", then return a // network error. - if (httpRequest.mode === 'only-if-cached') { + if (httpRequest.cache === 'only-if-cached') { return makeNetworkError('only if cached') } @@ -18699,7 +20837,7 @@ function requireFetch () { // 12. If httpRequest’s header list contains `Range`, then set response’s // range-requested flag. - if (httpRequest.headersList.contains('range')) { + if (httpRequest.headersList.contains('range', true)) { response.rangeRequested = true; } @@ -18781,10 +20919,12 @@ function requireFetch () { fetchParams.controller.connection = { abort: null, destroyed: false, - destroy (err) { + destroy (err, abort = true) { if (!this.destroyed) { this.destroyed = true; - this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')); + if (abort) { + this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')); + } } } }; @@ -18953,14 +21093,18 @@ function requireFetch () { // 11. Let pullAlgorithm be an action that resumes the ongoing fetch // if it is suspended. - const pullAlgorithm = () => { - fetchParams.controller.resume(); + const pullAlgorithm = async () => { + await fetchParams.controller.resume(); }; // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s // controller with reason, given reason. const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason); + // If the aborted fetch was already terminated, then we do not + // need to do anything. + if (!isCancelled(fetchParams)) { + fetchParams.controller.abort(reason); + } }; // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by @@ -18972,13 +21116,8 @@ function requireFetch () { // TODO // 15. Let stream be a new ReadableStream. - // 16. Set up stream with pullAlgorithm set to pullAlgorithm, - // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to - // highWaterMark, and sizeAlgorithm set to sizeAlgorithm. - if (!ReadableStream) { - ReadableStream = require$$14.ReadableStream; - } - + // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm, + // cancelAlgorithm set to cancelAlgorithm. const stream = new ReadableStream( { async start (controller) { @@ -18989,20 +21128,15 @@ function requireFetch () { }, async cancel (reason) { await cancelAlgorithm(reason); - } - }, - { - highWaterMark: 0, - size () { - return 1 - } + }, + type: 'bytes' } ); // 17. Run these steps, but abort when the ongoing fetch is terminated: // 1. Set response’s body to a new body whose stream is stream. - response.body = { stream }; + response.body = { stream, source: null, length: null }; // 2. If response is not a network error and request’s cache mode is // not "no-store", then update response in httpCache for request. @@ -19021,6 +21155,7 @@ function requireFetch () { // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: + fetchParams.controller.onAborted = onAborted; fetchParams.controller.on('terminated', onAborted); fetchParams.controller.resume = async () => { // 1. While true @@ -19075,7 +21210,10 @@ function requireFetch () { // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes // into stream. - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); + const buffer = new Uint8Array(bytes); + if (buffer.byteLength) { + fetchParams.controller.controller.enqueue(buffer); + } // 8. If stream is errored, then terminate the ongoing fetch. if (isErrored(stream)) { @@ -19085,7 +21223,7 @@ function requireFetch () { // 9. If stream doesn’t need more data ask the user agent to suspend // the ongoing fetch. - if (!fetchParams.controller.controller.desiredSize) { + if (fetchParams.controller.controller.desiredSize <= 0) { return } } @@ -19124,7 +21262,7 @@ function requireFetch () { // 20. Return response. return response - async function dispatch ({ body }) { + function dispatch ({ body }) { const url = requestCurrentURL(request); /** @type {import('../..').Agent} */ const agent = fetchParams.controller.dispatcher; @@ -19134,7 +21272,7 @@ function requireFetch () { path: url.pathname + url.search, origin: url.origin, method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, + body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body, headers: request.headersList.entries, maxRedirections: 0, upgrade: request.mode === 'websocket' ? 'websocket' : undefined @@ -19147,67 +21285,71 @@ function requireFetch () { // TODO (fix): Do we need connection here? const { connection } = fetchParams.controller; + // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen + // connection timing info with connection’s timing info, timingInfo’s post-redirect start + // time, and fetchParams’s cross-origin isolated capability. + // TODO: implement connection timing + timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability); + if (connection.destroyed) { abort(new DOMException('The operation was aborted.', 'AbortError')); } else { fetchParams.controller.on('terminated', abort); this.abort = connection.abort = abort; } + + // Set timingInfo’s final network-request start time to the coarsened shared current time given + // fetchParams’s cross-origin isolated capability. + timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + + onResponseStarted () { + // Set timingInfo’s final network-response start time to the coarsened shared current + // time given fetchParams’s cross-origin isolated capability, immediately after the + // user agent’s HTTP parser receives the first byte of the response (e.g., frame header + // bytes for HTTP/2 or response status line for HTTP/1.x). + timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); }, - onHeaders (status, headersList, resume, statusText) { + onHeaders (status, rawHeaders, resume, statusText) { if (status < 200) { return } - let codings = []; let location = ''; - const headers = new Headers(); - - // For H2, the headers are a plain JS object - // We distinguish between them and iterate accordingly - if (Array.isArray(headersList)) { - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString('latin1'); - const val = headersList[n + 1].toString('latin1'); - if (key.toLowerCase() === 'content-encoding') { - // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 - // "All content-coding values are case-insensitive..." - codings = val.toLowerCase().split(',').map((x) => x.trim()); - } else if (key.toLowerCase() === 'location') { - location = val; - } - - headers[kHeadersList].append(key, val); - } - } else { - const keys = Object.keys(headersList); - for (const key of keys) { - const val = headersList[key]; - if (key.toLowerCase() === 'content-encoding') { - // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 - // "All content-coding values are case-insensitive..." - codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse(); - } else if (key.toLowerCase() === 'location') { - location = val; - } + const headersList = new HeadersList(); - headers[kHeadersList].append(key, val); - } + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true); } + location = headersList.get('location', true); this.body = new Readable({ read: resume }); const decoders = []; - const willFollow = request.redirect === 'follow' && - location && + const willFollow = location && request.redirect === 'follow' && redirectStatusSet.has(status); // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { - for (const coding of codings) { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + const contentEncoding = headersList.get('content-encoding', true); + // "All content-coding values are case-insensitive..." + /** @type {string[]} */ + const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []; + + // Limit the number of content-encodings to prevent resource exhaustion. + // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). + const maxContentEncodings = 5; + if (codings.length > maxContentEncodings) { + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)); + return true + } + + for (let i = codings.length - 1; i >= 0; --i) { + const coding = codings[i].trim(); // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 if (coding === 'x-gzip' || coding === 'gzip') { decoders.push(zlib.createGunzip({ @@ -19219,9 +21361,15 @@ function requireFetch () { finishFlush: zlib.constants.Z_SYNC_FLUSH })); } else if (coding === 'deflate') { - decoders.push(zlib.createInflate()); + decoders.push(createInflate({ + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); } else if (coding === 'br') { - decoders.push(zlib.createBrotliDecompress()); + decoders.push(zlib.createBrotliDecompress({ + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH + })); } else { decoders.length = 0; break @@ -19229,13 +21377,19 @@ function requireFetch () { } } + const onError = this.onError.bind(this); + resolve({ status, statusText, - headersList: headers[kHeadersList], + headersList, body: decoders.length - ? pipeline(this.body, ...decoders, () => { }) - : this.body.on('error', () => {}) + ? pipeline(this.body, ...decoders, (err) => { + if (err) { + this.onError(err); + } + }).on('error', onError) + : this.body.on('error', onError) }); return true @@ -19269,6 +21423,10 @@ function requireFetch () { fetchParams.controller.off('terminated', this.abort); } + if (fetchParams.controller.onAborted) { + fetchParams.controller.off('terminated', fetchParams.controller.onAborted); + } + fetchParams.controller.ended = true; this.body.push(null); @@ -19286,24 +21444,21 @@ function requireFetch () { reject(error); }, - onUpgrade (status, headersList, socket) { + onUpgrade (status, rawHeaders, socket) { if (status !== 101) { return } - const headers = new Headers(); - - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString('latin1'); - const val = headersList[n + 1].toString('latin1'); + const headersList = new HeadersList(); - headers[kHeadersList].append(key, val); + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true); } resolve({ status, statusText: STATUS_CODES[status], - headersList: headers[kHeadersList], + headersList, socket }); @@ -19314,23 +21469,23 @@ function requireFetch () { } } - fetch_1 = { + fetch_1$1 = { fetch, Fetch, fetching, finalizeAndReportTiming }; - return fetch_1; + return fetch_1$1; } -var symbols$2; -var hasRequiredSymbols$2; +var symbols$7; +var hasRequiredSymbols$7; -function requireSymbols$2 () { - if (hasRequiredSymbols$2) return symbols$2; - hasRequiredSymbols$2 = 1; +function requireSymbols$7 () { + if (hasRequiredSymbols$7) return symbols$7; + hasRequiredSymbols$7 = 1; - symbols$2 = { + symbols$7 = { kState: Symbol('FileReader state'), kResult: Symbol('FileReader result'), kError: Symbol('FileReader error'), @@ -19338,17 +21493,17 @@ function requireSymbols$2 () { kEvents: Symbol('FileReader events'), kAborted: Symbol('FileReader aborted') }; - return symbols$2; + return symbols$7; } -var progressevent; -var hasRequiredProgressevent; +var progressevent$1; +var hasRequiredProgressevent$1; -function requireProgressevent () { - if (hasRequiredProgressevent) return progressevent; - hasRequiredProgressevent = 1; +function requireProgressevent$1 () { + if (hasRequiredProgressevent$1) return progressevent$1; + hasRequiredProgressevent$1 = 1; - const { webidl } = requireWebidl(); + const { webidl } = requireWebidl$1(); const kState = Symbol('ProgressEvent state'); @@ -19357,7 +21512,7 @@ function requireProgressevent () { */ class ProgressEvent extends Event { constructor (type, eventInitDict = {}) { - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, 'ProgressEvent constructor', 'type'); eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); super(type, eventInitDict); @@ -19392,47 +21547,47 @@ function requireProgressevent () { { key: 'lengthComputable', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'loaded', converter: webidl.converters['unsigned long long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'total', converter: webidl.converters['unsigned long long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'bubbles', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'cancelable', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'composed', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]); - progressevent = { + progressevent$1 = { ProgressEvent }; - return progressevent; + return progressevent$1; } -var encoding; -var hasRequiredEncoding; +var encoding$1; +var hasRequiredEncoding$1; -function requireEncoding () { - if (hasRequiredEncoding) return encoding; - hasRequiredEncoding = 1; +function requireEncoding$1 () { + if (hasRequiredEncoding$1) return encoding$1; + hasRequiredEncoding$1 = 1; /** * @see https://encoding.spec.whatwg.org/#concept-encoding-get @@ -19719,18 +21874,18 @@ function requireEncoding () { } } - encoding = { + encoding$1 = { getEncoding }; - return encoding; + return encoding$1; } -var util$5; -var hasRequiredUtil$5; +var util$e; +var hasRequiredUtil$e; -function requireUtil$5 () { - if (hasRequiredUtil$5) return util$5; - hasRequiredUtil$5 = 1; +function requireUtil$e () { + if (hasRequiredUtil$e) return util$e; + hasRequiredUtil$e = 1; const { kState, @@ -19738,14 +21893,13 @@ function requireUtil$5 () { kResult, kAborted, kLastProgressEventFired - } = requireSymbols$2(); - const { ProgressEvent } = requireProgressevent(); - const { getEncoding } = requireEncoding(); - const { DOMException } = requireConstants$a(); - const { serializeAMimeType, parseMIMEType } = requireDataURL(); - const { types } = require$$0__default; - const { StringDecoder } = require$$0$d; - const { btoa } = require$$7; + } = requireSymbols$7(); + const { ProgressEvent } = requireProgressevent$1(); + const { getEncoding } = requireEncoding$1(); + const { serializeAMimeType, parseMIMEType } = requireDataUrl$1(); + const { types } = require$$0$a; + const { StringDecoder } = require$$5$3; + const { btoa } = require$$0$6; /** @type {PropertyDescriptor} */ const staticPropertyDescriptors = { @@ -20117,35 +22271,35 @@ function requireUtil$5 () { }, new Uint8Array(size)) } - util$5 = { + util$e = { staticPropertyDescriptors, readOperation, fireAProgressEvent }; - return util$5; + return util$e; } -var filereader; -var hasRequiredFilereader; +var filereader$1; +var hasRequiredFilereader$1; -function requireFilereader () { - if (hasRequiredFilereader) return filereader; - hasRequiredFilereader = 1; +function requireFilereader$1 () { + if (hasRequiredFilereader$1) return filereader$1; + hasRequiredFilereader$1 = 1; const { staticPropertyDescriptors, readOperation, fireAProgressEvent - } = requireUtil$5(); + } = requireUtil$e(); const { kState, kError, kResult, kEvents, kAborted - } = requireSymbols$2(); - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$8(); + } = requireSymbols$7(); + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$h(); class FileReader extends EventTarget { constructor () { @@ -20171,7 +22325,7 @@ function requireFilereader () { readAsArrayBuffer (blob) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsArrayBuffer'); blob = webidl.converters.Blob(blob, { strict: false }); @@ -20187,7 +22341,7 @@ function requireFilereader () { readAsBinaryString (blob) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsBinaryString'); blob = webidl.converters.Blob(blob, { strict: false }); @@ -20204,12 +22358,12 @@ function requireFilereader () { readAsText (blob, encoding = undefined) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsText'); blob = webidl.converters.Blob(blob, { strict: false }); if (encoding !== undefined) { - encoding = webidl.converters.DOMString(encoding); + encoding = webidl.converters.DOMString(encoding, 'FileReader.readAsText', 'encoding'); } // The readAsText(blob, encoding) method, when invoked, @@ -20224,7 +22378,7 @@ function requireFilereader () { readAsDataURL (blob) { webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }); + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsDataURL'); blob = webidl.converters.Blob(blob, { strict: false }); @@ -20471,35 +22625,35 @@ function requireFilereader () { DONE: staticPropertyDescriptors }); - filereader = { + filereader$1 = { FileReader }; - return filereader; + return filereader$1; } -var symbols$1; -var hasRequiredSymbols$1; +var symbols$6; +var hasRequiredSymbols$6; -function requireSymbols$1 () { - if (hasRequiredSymbols$1) return symbols$1; - hasRequiredSymbols$1 = 1; +function requireSymbols$6 () { + if (hasRequiredSymbols$6) return symbols$6; + hasRequiredSymbols$6 = 1; - symbols$1 = { - kConstruct: requireSymbols$4().kConstruct + symbols$6 = { + kConstruct: requireSymbols$9().kConstruct }; - return symbols$1; + return symbols$6; } -var util$4; -var hasRequiredUtil$4; +var util$d; +var hasRequiredUtil$d; -function requireUtil$4 () { - if (hasRequiredUtil$4) return util$4; - hasRequiredUtil$4 = 1; +function requireUtil$d () { + if (hasRequiredUtil$d) return util$d; + hasRequiredUtil$d = 1; - const assert = require$$0$8; - const { URLSerializer } = requireDataURL(); - const { isValidHeaderName } = requireUtil$7(); + const assert = require$$0$7; + const { URLSerializer } = requireDataUrl$1(); + const { isValidHeaderName } = requireUtil$g(); /** * @see https://url.spec.whatwg.org/#concept-url-equals @@ -20520,7 +22674,7 @@ function requireUtil$4 () { * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 * @param {string} header */ - function fieldValues (header) { + function getFieldValues (header) { assert(header !== null); const values = []; @@ -20528,44 +22682,38 @@ function requireUtil$4 () { for (let value of header.split(',')) { value = value.trim(); - if (!value.length) { - continue - } else if (!isValidHeaderName(value)) { - continue + if (isValidHeaderName(value)) { + values.push(value); } - - values.push(value); } return values } - util$4 = { + util$d = { urlEquals, - fieldValues + getFieldValues }; - return util$4; + return util$d; } -var cache$3; -var hasRequiredCache$3; +var cache$4; +var hasRequiredCache$4; -function requireCache$3 () { - if (hasRequiredCache$3) return cache$3; - hasRequiredCache$3 = 1; +function requireCache$4 () { + if (hasRequiredCache$4) return cache$4; + hasRequiredCache$4 = 1; - const { kConstruct } = requireSymbols$1(); - const { urlEquals, fieldValues: getFieldValues } = requireUtil$4(); - const { kEnumerableProperty, isDisturbed } = requireUtil$8(); - const { kHeadersList } = requireSymbols$4(); - const { webidl } = requireWebidl(); - const { Response, cloneResponse } = requireResponse$1(); - const { Request } = requireRequest(); - const { kState, kHeaders, kGuard, kRealm } = requireSymbols$3(); - const { fetching } = requireFetch(); - const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$7(); - const assert = require$$0$8; - const { getGlobalDispatcher } = requireGlobal(); + const { kConstruct } = requireSymbols$6(); + const { urlEquals, getFieldValues } = requireUtil$d(); + const { kEnumerableProperty, isDisturbed } = requireUtil$h(); + const { webidl } = requireWebidl$1(); + const { Response, cloneResponse, fromInnerResponse } = requireResponse$2(); + const { Request, fromInnerRequest } = requireRequest$2(); + const { kState } = requireSymbols$8(); + const { fetching } = requireFetch$1(); + const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$g(); + const assert = require$$0$7; /** * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation @@ -20593,17 +22741,20 @@ function requireCache$3 () { webidl.illegalConstructor(); } + webidl.util.markAsUncloneable(this); this.#relevantRequestResponseList = arguments[1]; } async match (request, options = {}) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); + const prefix = 'Cache.match'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); - const p = await this.matchAll(request, options); + const p = this.#internalMatchAll(request, options, 1); if (p.length === 0) { return @@ -20615,76 +22766,20 @@ function requireCache$3 () { async matchAll (request = undefined, options = {}) { webidl.brandCheck(this, Cache); - if (request !== undefined) request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - - // 1. - let r = null; - - // 2. - if (request !== undefined) { - if (request instanceof Request) { - // 2.1.1 - r = request[kState]; - - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { - // 2.2.1 - r = new Request(request)[kState]; - } - } - - // 5. - // 5.1 - const responses = []; - - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options); + const prefix = 'Cache.matchAll'; + if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); - // 5.3.2 - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } - } - - // 5.4 - // We don't implement CORs so we don't need to loop over the responses, yay! - - // 5.5.1 - const responseList = []; - - // 5.5.2 - for (const response of responses) { - // 5.5.2.1 - const responseObject = new Response(response.body?.source ?? null); - const body = responseObject[kState].body; - responseObject[kState] = response; - responseObject[kState].body = body; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = 'immutable'; - - responseList.push(responseObject); - } - - // 6. - return Object.freeze(responseList) + return this.#internalMatchAll(request, options) } async add (request) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' }); - request = webidl.converters.RequestInfo(request); + const prefix = 'Cache.add'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); // 1. const requests = [request]; @@ -20698,9 +22793,9 @@ function requireCache$3 () { async addAll (requests) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' }); - requests = webidl.converters['sequence'](requests); + const prefix = 'Cache.addAll'; + webidl.argumentLengthCheck(arguments, 1, prefix); // 1. const responsePromises = []; @@ -20709,7 +22804,17 @@ function requireCache$3 () { const requestList = []; // 3. - for (const request of requests) { + for (let request of requests) { + if (request === undefined) { + throw webidl.errors.conversionFailed({ + prefix, + argument: 'Argument 1', + types: ['undefined is not allowed'] + }) + } + + request = webidl.converters.RequestInfo(request); + if (typeof request === 'string') { continue } @@ -20720,7 +22825,7 @@ function requireCache$3 () { // 3.2 if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { throw webidl.errors.exception({ - header: 'Cache.addAll', + header: prefix, message: 'Expected http/s scheme when method is not GET.' }) } @@ -20738,7 +22843,7 @@ function requireCache$3 () { // 5.2 if (!urlIsHttpHttpsScheme(r.url)) { throw webidl.errors.exception({ - header: 'Cache.addAll', + header: prefix, message: 'Expected http/s scheme.' }) } @@ -20756,7 +22861,6 @@ function requireCache$3 () { // 5.7 fetchControllers.push(fetching({ request: r, - dispatcher: getGlobalDispatcher(), processResponse (response) { // 1. if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { @@ -20859,10 +22963,12 @@ function requireCache$3 () { async put (request, response) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' }); - request = webidl.converters.RequestInfo(request); - response = webidl.converters.Response(response); + const prefix = 'Cache.put'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + response = webidl.converters.Response(response, prefix, 'response'); // 1. let innerRequest = null; @@ -20877,7 +22983,7 @@ function requireCache$3 () { // 4. if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Expected an http/s scheme when method is not GET' }) } @@ -20888,7 +22994,7 @@ function requireCache$3 () { // 6. if (innerResponse.status === 206) { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Got 206 status' }) } @@ -20903,7 +23009,7 @@ function requireCache$3 () { // 7.2.1 if (fieldValue === '*') { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Got * vary field value' }) } @@ -20913,7 +23019,7 @@ function requireCache$3 () { // 8. if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { throw webidl.errors.exception({ - header: 'Cache.put', + header: prefix, message: 'Response body is locked or disturbed' }) } @@ -20988,10 +23094,12 @@ function requireCache$3 () { async delete (request, options = {}) { webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); + const prefix = 'Cache.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); /** * @type {Request} @@ -21048,13 +23156,15 @@ function requireCache$3 () { * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys * @param {any} request * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {readonly Request[]} + * @returns {Promise} */ async keys (request = undefined, options = {}) { webidl.brandCheck(this, Cache); - if (request !== undefined) request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); + const prefix = 'Cache.keys'; + + if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); // 1. let r = null; @@ -21107,12 +23217,11 @@ function requireCache$3 () { // 5.4.2 for (const request of requests) { - const requestObject = new Request('https://a'); - requestObject[kState] = request; - requestObject[kHeaders][kHeadersList] = request.headersList; - requestObject[kHeaders][kGuard] = 'immutable'; - requestObject[kRealm] = request.client; - + const requestObject = fromInnerRequest( + request, + new AbortController().signal, + 'immutable' + ); // 5.4.2.1 requestList.push(requestObject); } @@ -21337,6 +23446,68 @@ function requireCache$3 () { return true } + + #internalMatchAll (request, options, maxResponses = Infinity) { + // 1. + let r = null; + + // 2. + if (request !== undefined) { + if (request instanceof Request) { + // 2.1.1 + r = request[kState]; + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] + } + } else if (typeof request === 'string') { + // 2.2.1 + r = new Request(request)[kState]; + } + } + + // 5. + // 5.1 + const responses = []; + + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options); + + // 5.3.2 + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + + // 5.4 + // We don't implement CORs so we don't need to loop over the responses, yay! + + // 5.5.1 + const responseList = []; + + // 5.5.2 + for (const response of responses) { + // 5.5.2.1 + const responseObject = fromInnerResponse(response, 'immutable'); + + responseList.push(responseObject.clone()); + + if (responseList.length >= maxResponses) { + break + } + } + + // 6. + return Object.freeze(responseList) + } } Object.defineProperties(Cache.prototype, { @@ -21357,17 +23528,17 @@ function requireCache$3 () { { key: 'ignoreSearch', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'ignoreMethod', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'ignoreVary', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]; @@ -21387,23 +23558,23 @@ function requireCache$3 () { webidl.converters.RequestInfo ); - cache$3 = { + cache$4 = { Cache }; - return cache$3; + return cache$4; } -var cachestorage; -var hasRequiredCachestorage; +var cachestorage$1; +var hasRequiredCachestorage$1; -function requireCachestorage () { - if (hasRequiredCachestorage) return cachestorage; - hasRequiredCachestorage = 1; +function requireCachestorage$1 () { + if (hasRequiredCachestorage$1) return cachestorage$1; + hasRequiredCachestorage$1 = 1; - const { kConstruct } = requireSymbols$1(); - const { Cache } = requireCache$3(); - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$8(); + const { kConstruct } = requireSymbols$6(); + const { Cache } = requireCache$4(); + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$h(); class CacheStorage { /** @@ -21416,11 +23587,13 @@ function requireCachestorage () { if (arguments[0] !== kConstruct) { webidl.illegalConstructor(); } + + webidl.util.markAsUncloneable(this); } async match (request, options = {}) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.match' }); + webidl.argumentLengthCheck(arguments, 1, 'CacheStorage.match'); request = webidl.converters.RequestInfo(request); options = webidl.converters.MultiCacheQueryOptions(options); @@ -21457,9 +23630,11 @@ function requireCachestorage () { */ async has (cacheName) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }); - cacheName = webidl.converters.DOMString(cacheName); + const prefix = 'CacheStorage.has'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); // 2.1.1 // 2.2 @@ -21473,9 +23648,11 @@ function requireCachestorage () { */ async open (cacheName) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }); - cacheName = webidl.converters.DOMString(cacheName); + const prefix = 'CacheStorage.open'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); // 2.1 if (this.#caches.has(cacheName)) { @@ -21505,16 +23682,18 @@ function requireCachestorage () { */ async delete (cacheName) { webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }); - cacheName = webidl.converters.DOMString(cacheName); + const prefix = 'CacheStorage.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); return this.#caches.delete(cacheName) } /** * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {string[]} + * @returns {Promise} */ async keys () { webidl.brandCheck(this, CacheStorage); @@ -21539,18 +23718,18 @@ function requireCachestorage () { keys: kEnumerableProperty }); - cachestorage = { + cachestorage$1 = { CacheStorage }; - return cachestorage; + return cachestorage$1; } -var constants$8; -var hasRequiredConstants$8; +var constants$d; +var hasRequiredConstants$d; -function requireConstants$8 () { - if (hasRequiredConstants$8) return constants$8; - hasRequiredConstants$8 = 1; +function requireConstants$d () { + if (hasRequiredConstants$d) return constants$d; + hasRequiredConstants$d = 1; // https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size const maxAttributeValueSize = 1024; @@ -21558,40 +23737,37 @@ function requireConstants$8 () { // https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size const maxNameValuePairSize = 4096; - constants$8 = { + constants$d = { maxAttributeValueSize, maxNameValuePairSize }; - return constants$8; + return constants$d; } -var util$3; -var hasRequiredUtil$3; +var util$c; +var hasRequiredUtil$c; -function requireUtil$3 () { - if (hasRequiredUtil$3) return util$3; - hasRequiredUtil$3 = 1; +function requireUtil$c () { + if (hasRequiredUtil$c) return util$c; + hasRequiredUtil$c = 1; /** * @param {string} value * @returns {boolean} */ function isCTLExcludingHtab (value) { - if (value.length === 0) { - return false - } - - for (const char of value) { - const code = char.charCodeAt(0); + for (let i = 0; i < value.length; ++i) { + const code = value.charCodeAt(i); if ( - (code >= 0x00 || code <= 0x08) || - (code >= 0x0A || code <= 0x1F) || + (code >= 0x00 && code <= 0x08) || + (code >= 0x0A && code <= 0x1F) || code === 0x7F ) { - return false + return true } } + return false } /** @@ -21604,28 +23780,29 @@ function requireUtil$3 () { * @param {string} name */ function validateCookieName (name) { - for (const char of name) { - const code = char.charCodeAt(0); + for (let i = 0; i < name.length; ++i) { + const code = name.charCodeAt(i); if ( - (code <= 0x20 || code > 0x7F) || - char === '(' || - char === ')' || - char === '>' || - char === '<' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' + code < 0x21 || // exclude CTLs (0-31), SP and HT + code > 0x7E || // exclude non-ascii and DEL + code === 0x22 || // " + code === 0x28 || // ( + code === 0x29 || // ) + code === 0x3C || // < + code === 0x3E || // > + code === 0x40 || // @ + code === 0x2C || // , + code === 0x3B || // ; + code === 0x3A || // : + code === 0x5C || // \ + code === 0x2F || // / + code === 0x5B || // [ + code === 0x5D || // ] + code === 0x3F || // ? + code === 0x3D || // = + code === 0x7B || // { + code === 0x7D // } ) { throw new Error('Invalid cookie name') } @@ -21641,18 +23818,30 @@ function requireUtil$3 () { * @param {string} value */ function validateCookieValue (value) { - for (const char of value) { - const code = char.charCodeAt(0); + let len = value.length; + let i = 0; + + // if the value is wrapped in DQUOTE + if (value[0] === '"') { + if (len === 1 || value[len - 1] !== '"') { + throw new Error('Invalid cookie value') + } + --len; + ++i; + } + + while (i < len) { + const code = value.charCodeAt(i++); if ( code < 0x21 || // exclude CTLs (0-31) - code === 0x22 || - code === 0x2C || - code === 0x3B || - code === 0x5C || - code > 0x7E // non-ascii + code > 0x7E || // non-ascii and DEL (127) + code === 0x22 || // " + code === 0x2C || // , + code === 0x3B || // ; + code === 0x5C // \ ) { - throw new Error('Invalid header value') + throw new Error('Invalid cookie value') } } } @@ -21662,10 +23851,14 @@ function requireUtil$3 () { * @param {string} path */ function validateCookiePath (path) { - for (const char of path) { - const code = char.charCodeAt(0); + for (let i = 0; i < path.length; ++i) { + const code = path.charCodeAt(i); - if (code < 0x21 || char === ';') { + if ( + code < 0x20 || // exclude CTLs (0-31) + code === 0x7F || // DEL + code === 0x3B // ; + ) { throw new Error('Invalid cookie path') } } @@ -21686,6 +23879,18 @@ function requireUtil$3 () { } } + const IMFDays = [ + 'Sun', 'Mon', 'Tue', 'Wed', + 'Thu', 'Fri', 'Sat' + ]; + + const IMFMonths = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ]; + + const IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0')); + /** * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 * @param {number|Date} date @@ -21732,25 +23937,7 @@ function requireUtil$3 () { date = new Date(date); } - const days = [ - 'Sun', 'Mon', 'Tue', 'Wed', - 'Thu', 'Fri', 'Sat' - ]; - - const months = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' - ]; - - const dayName = days[date.getUTCDay()]; - const day = date.getUTCDate().toString().padStart(2, '0'); - const month = months[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - const hour = date.getUTCHours().toString().padStart(2, '0'); - const minute = date.getUTCMinutes().toString().padStart(2, '0'); - const second = date.getUTCSeconds().toString().padStart(2, '0'); - - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT` + return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT` } /** @@ -21836,7 +24023,7 @@ function requireUtil$3 () { return out.join('; ') } - util$3 = { + util$c = { isCTLExcludingHtab, validateCookieName, validateCookiePath, @@ -21844,20 +24031,20 @@ function requireUtil$3 () { toIMFDate, stringify }; - return util$3; + return util$c; } -var parse$1; -var hasRequiredParse$1; +var parse$2; +var hasRequiredParse$2; -function requireParse$1 () { - if (hasRequiredParse$1) return parse$1; - hasRequiredParse$1 = 1; +function requireParse$2 () { + if (hasRequiredParse$2) return parse$2; + hasRequiredParse$2 = 1; - const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$8(); - const { isCTLExcludingHtab } = requireUtil$3(); - const { collectASequenceOfCodePointsFast } = requireDataURL(); - const assert = require$$0$8; + const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$d(); + const { isCTLExcludingHtab } = requireUtil$c(); + const { collectASequenceOfCodePointsFast } = requireDataUrl$1(); + const assert = require$$0$7; /** * @description Parses the field-value attributes of a set-cookie header string. @@ -22165,24 +24352,24 @@ function requireParse$1 () { return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) } - parse$1 = { + parse$2 = { parseSetCookie, parseUnparsedAttributes }; - return parse$1; + return parse$2; } -var cookies; -var hasRequiredCookies; +var cookies$1; +var hasRequiredCookies$1; -function requireCookies () { - if (hasRequiredCookies) return cookies; - hasRequiredCookies = 1; +function requireCookies$1 () { + if (hasRequiredCookies$1) return cookies$1; + hasRequiredCookies$1 = 1; - const { parseSetCookie } = requireParse$1(); - const { stringify } = requireUtil$3(); - const { webidl } = requireWebidl(); - const { Headers } = requireHeaders(); + const { parseSetCookie } = requireParse$2(); + const { stringify } = requireUtil$c(); + const { webidl } = requireWebidl$1(); + const { Headers } = requireHeaders$1(); /** * @typedef {Object} Cookie @@ -22203,7 +24390,7 @@ function requireCookies () { * @returns {Record} */ function getCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }); + webidl.argumentLengthCheck(arguments, 1, 'getCookies'); webidl.brandCheck(headers, Headers, { strict: false }); @@ -22230,11 +24417,12 @@ function requireCookies () { * @returns {void} */ function deleteCookie (headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }); - webidl.brandCheck(headers, Headers, { strict: false }); - name = webidl.converters.DOMString(name); + const prefix = 'deleteCookie'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + name = webidl.converters.DOMString(name, prefix, 'name'); attributes = webidl.converters.DeleteCookieAttributes(attributes); // Matches behavior of @@ -22252,7 +24440,7 @@ function requireCookies () { * @returns {Cookie[]} */ function getSetCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }); + webidl.argumentLengthCheck(arguments, 1, 'getSetCookies'); webidl.brandCheck(headers, Headers, { strict: false }); @@ -22271,7 +24459,7 @@ function requireCookies () { * @returns {void} */ function setCookie (headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }); + webidl.argumentLengthCheck(arguments, 2, 'setCookie'); webidl.brandCheck(headers, Headers, { strict: false }); @@ -22280,7 +24468,7 @@ function requireCookies () { const str = stringify(cookie); if (str) { - headers.append('Set-Cookie', stringify(cookie)); + headers.append('Set-Cookie', str); } } @@ -22288,12 +24476,12 @@ function requireCookies () { { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'path', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'domain', - defaultValue: null + defaultValue: () => null } ]); @@ -22315,32 +24503,32 @@ function requireCookies () { return new Date(value) }), key: 'expires', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters['long long']), key: 'maxAge', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'domain', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.DOMString), key: 'path', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.boolean), key: 'secure', - defaultValue: null + defaultValue: () => null }, { converter: webidl.nullableConverter(webidl.converters.boolean), key: 'httpOnly', - defaultValue: null + defaultValue: () => null }, { converter: webidl.converters.USVString, @@ -22350,108 +24538,30 @@ function requireCookies () { { converter: webidl.sequenceConverter(webidl.converters.DOMString), key: 'unparsed', - defaultValue: [] + defaultValue: () => new Array(0) } ]); - cookies = { + cookies$1 = { getCookies, deleteCookie, getSetCookies, setCookie }; - return cookies; -} - -var constants$7; -var hasRequiredConstants$7; - -function requireConstants$7 () { - if (hasRequiredConstants$7) return constants$7; - hasRequiredConstants$7 = 1; - - // This is a Globally Unique Identifier unique used - // to validate that the endpoint accepts websocket - // connections. - // See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 - const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; - - /** @type {PropertyDescriptor} */ - const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - - const states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - - const opcodes = { - CONTINUATION: 0x0, - TEXT: 0x1, - BINARY: 0x2, - CLOSE: 0x8, - PING: 0x9, - PONG: 0xA - }; - - const maxUnsigned16Bit = 2 ** 16 - 1; // 65535 - - const parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - - const emptyBuffer = Buffer.allocUnsafe(0); - - constants$7 = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer - }; - return constants$7; -} - -var symbols; -var hasRequiredSymbols; - -function requireSymbols () { - if (hasRequiredSymbols) return symbols; - hasRequiredSymbols = 1; - - symbols = { - kWebSocketURL: Symbol('url'), - kReadyState: Symbol('ready state'), - kController: Symbol('controller'), - kResponse: Symbol('response'), - kBinaryType: Symbol('binary type'), - kSentClose: Symbol('sent close'), - kReceivedClose: Symbol('received close'), - kByteParser: Symbol('byte parser') - }; - return symbols; + return cookies$1; } -var events; -var hasRequiredEvents; +var events$1; +var hasRequiredEvents$1; -function requireEvents () { - if (hasRequiredEvents) return events; - hasRequiredEvents = 1; +function requireEvents$1 () { + if (hasRequiredEvents$1) return events$1; + hasRequiredEvents$1 = 1; - const { webidl } = requireWebidl(); - const { kEnumerableProperty } = requireUtil$8(); - const { MessagePort } = require$$0$c; + const { webidl } = requireWebidl$1(); + const { kEnumerableProperty } = requireUtil$h(); + const { kConstruct } = requireSymbols$9(); + const { MessagePort } = require$$1$4; /** * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent @@ -22460,14 +24570,22 @@ function requireEvents () { #eventInit constructor (type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' }); + if (type === kConstruct) { + super(arguments[1], arguments[2]); + webidl.util.markAsUncloneable(this); + return + } + + const prefix = 'MessageEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict); + type = webidl.converters.DOMString(type, prefix, 'type'); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict'); super(type, eventInitDict); this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); } get data () { @@ -22516,14 +24634,28 @@ function requireEvents () { ) { webidl.brandCheck(this, MessageEvent); - webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' }); + webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent'); return new MessageEvent(type, { bubbles, cancelable, data, origin, lastEventId, source, ports }) } + + static createFastMessageEvent (type, init) { + const messageEvent = new MessageEvent(kConstruct, type, init); + messageEvent.#eventInit = init; + messageEvent.#eventInit.data ??= null; + messageEvent.#eventInit.origin ??= ''; + messageEvent.#eventInit.lastEventId ??= ''; + messageEvent.#eventInit.source ??= null; + messageEvent.#eventInit.ports ??= []; + return messageEvent + } } + const { createFastMessageEvent } = MessageEvent; + delete MessageEvent.createFastMessageEvent; + /** * @see https://websockets.spec.whatwg.org/#the-closeevent-interface */ @@ -22531,14 +24663,16 @@ function requireEvents () { #eventInit constructor (type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' }); + const prefix = 'CloseEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, prefix, 'type'); eventInitDict = webidl.converters.CloseEventInit(eventInitDict); super(type, eventInitDict); this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); } get wasClean () { @@ -22565,11 +24699,13 @@ function requireEvents () { #eventInit constructor (type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' }); + const prefix = 'ErrorEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); super(type, eventInitDict); + webidl.util.markAsUncloneable(this); - type = webidl.converters.DOMString(type); + type = webidl.converters.DOMString(type, prefix, 'type'); eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); this.#eventInit = eventInitDict; @@ -22651,17 +24787,17 @@ function requireEvents () { { key: 'bubbles', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'cancelable', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'composed', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false } ]; @@ -22670,31 +24806,29 @@ function requireEvents () { { key: 'data', converter: webidl.converters.any, - defaultValue: null + defaultValue: () => null }, { key: 'origin', converter: webidl.converters.USVString, - defaultValue: '' + defaultValue: () => '' }, { key: 'lastEventId', converter: webidl.converters.DOMString, - defaultValue: '' + defaultValue: () => '' }, { key: 'source', // Node doesn't implement WindowProxy or ServiceWorker, so the only // valid value for source is a MessagePort. converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null + defaultValue: () => null }, { key: 'ports', converter: webidl.converters['sequence'], - get defaultValue () { - return [] - } + defaultValue: () => new Array(0) } ]); @@ -22703,17 +24837,17 @@ function requireEvents () { { key: 'wasClean', converter: webidl.converters.boolean, - defaultValue: false + defaultValue: () => false }, { key: 'code', converter: webidl.converters['unsigned short'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'reason', converter: webidl.converters.USVString, - defaultValue: '' + defaultValue: () => '' } ]); @@ -22722,22 +24856,22 @@ function requireEvents () { { key: 'message', converter: webidl.converters.DOMString, - defaultValue: '' + defaultValue: () => '' }, { key: 'filename', converter: webidl.converters.USVString, - defaultValue: '' + defaultValue: () => '' }, { key: 'lineno', converter: webidl.converters['unsigned long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'colno', converter: webidl.converters['unsigned long'], - defaultValue: 0 + defaultValue: () => 0 }, { key: 'error', @@ -22745,29 +24879,137 @@ function requireEvents () { } ]); - events = { + events$1 = { MessageEvent, CloseEvent, - ErrorEvent + ErrorEvent, + createFastMessageEvent }; - return events; + return events$1; } -var util$2; -var hasRequiredUtil$2; +var constants$c; +var hasRequiredConstants$c; -function requireUtil$2 () { - if (hasRequiredUtil$2) return util$2; - hasRequiredUtil$2 = 1; +function requireConstants$c () { + if (hasRequiredConstants$c) return constants$c; + hasRequiredConstants$c = 1; - const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols(); - const { states, opcodes } = requireConstants$7(); - const { MessageEvent, ErrorEvent } = requireEvents(); + // This is a Globally Unique Identifier unique used + // to validate that the endpoint accepts websocket + // connections. + // See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 + const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; + + /** @type {PropertyDescriptor} */ + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + + const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + + const sentCloseFrameState = { + NOT_SENT: 0, + PROCESSING: 1, + SENT: 2 + }; + + const opcodes = { + CONTINUATION: 0x0, + TEXT: 0x1, + BINARY: 0x2, + CLOSE: 0x8, + PING: 0x9, + PONG: 0xA + }; + + const maxUnsigned16Bit = 2 ** 16 - 1; // 65535 + + const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + + const emptyBuffer = Buffer.allocUnsafe(0); + + const sendHints = { + string: 1, + typedArray: 2, + arrayBuffer: 3, + blob: 4 + }; + + constants$c = { + uid, + sentCloseFrameState, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer, + sendHints + }; + return constants$c; +} + +var symbols$5; +var hasRequiredSymbols$5; + +function requireSymbols$5 () { + if (hasRequiredSymbols$5) return symbols$5; + hasRequiredSymbols$5 = 1; + + symbols$5 = { + kWebSocketURL: Symbol('url'), + kReadyState: Symbol('ready state'), + kController: Symbol('controller'), + kResponse: Symbol('response'), + kBinaryType: Symbol('binary type'), + kSentClose: Symbol('sent close'), + kReceivedClose: Symbol('received close'), + kByteParser: Symbol('byte parser') + }; + return symbols$5; +} + +var util$b; +var hasRequiredUtil$b; + +function requireUtil$b () { + if (hasRequiredUtil$b) return util$b; + hasRequiredUtil$b = 1; + + const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols$5(); + const { states, opcodes } = requireConstants$c(); + const { ErrorEvent, createFastMessageEvent } = requireEvents$1(); + const { isUtf8 } = require$$0$6; + const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = requireDataUrl$1(); /* globals Blob */ /** * @param {import('./websocket').WebSocket} ws + * @returns {boolean} + */ + function isConnecting (ws) { + // If the WebSocket connection is not yet established, and the connection + // is not yet closed, then the WebSocket connection is in the CONNECTING state. + return ws[kReadyState] === states.CONNECTING + } + + /** + * @param {import('./websocket').WebSocket} ws + * @returns {boolean} */ function isEstablished (ws) { // If the server's response is validated as provided for above, it is @@ -22778,6 +25020,7 @@ function requireUtil$2 () { /** * @param {import('./websocket').WebSocket} ws + * @returns {boolean} */ function isClosing (ws) { // Upon either sending or receiving a Close control frame, it is said @@ -22788,6 +25031,7 @@ function requireUtil$2 () { /** * @param {import('./websocket').WebSocket} ws + * @returns {boolean} */ function isClosed (ws) { return ws[kReadyState] === states.CLOSED @@ -22797,15 +25041,16 @@ function requireUtil$2 () { * @see https://dom.spec.whatwg.org/#concept-event-fire * @param {string} e * @param {EventTarget} target + * @param {(...args: ConstructorParameters) => Event} eventFactory * @param {EventInit | undefined} eventInitDict */ - function fireEvent (e, target, eventConstructor = Event, eventInitDict) { + function fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { // 1. If eventConstructor is not given, then let eventConstructor be Event. // 2. Let event be the result of creating an event given eventConstructor, // in the relevant realm of target. // 3. Initialize event’s type attribute to e. - const event = new eventConstructor(e, eventInitDict); // eslint-disable-line new-cap + const event = eventFactory(e, eventInitDict); // 4. Initialize any other IDL attributes of event as described in the // invocation of this algorithm. @@ -22834,7 +25079,7 @@ function requireUtil$2 () { // -> type indicates that the data is Text // a new DOMString containing data try { - dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data); + dataForEvent = utf8Decode(data); } catch { failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.'); return @@ -22849,19 +25094,26 @@ function requireUtil$2 () { // -> type indicates that the data is Binary and binary type is "arraybuffer" // a new ArrayBuffer object, created in the relevant Realm of the // WebSocket object, whose contents are data - dataForEvent = new Uint8Array(data).buffer; + dataForEvent = toArrayBuffer(data); } } // 3. Fire an event named message at the WebSocket object, using MessageEvent, // with the origin attribute initialized to the serialization of the WebSocket // object’s url's origin, and the data attribute initialized to dataForEvent. - fireEvent('message', ws, MessageEvent, { + fireEvent('message', ws, createFastMessageEvent, { origin: ws[kWebSocketURL].origin, data: dataForEvent }); } + function toArrayBuffer (buffer) { + if (buffer.byteLength === buffer.buffer.byteLength) { + return buffer.buffer + } + return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) + } + /** * @see https://datatracker.ietf.org/doc/html/rfc6455 * @see https://datatracker.ietf.org/doc/html/rfc2616 @@ -22879,31 +25131,29 @@ function requireUtil$2 () { return false } - for (const char of protocol) { - const code = char.charCodeAt(0); + for (let i = 0; i < protocol.length; ++i) { + const code = protocol.charCodeAt(i); if ( - code < 0x21 || + code < 0x21 || // CTL, contains SP (0x20) and HT (0x09) code > 0x7E || - char === '(' || - char === ')' || - char === '<' || - char === '>' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' || - code === 32 || // SP - code === 9 // HT + code === 0x22 || // " + code === 0x28 || // ( + code === 0x29 || // ) + code === 0x2C || // , + code === 0x2F || // / + code === 0x3A || // : + code === 0x3B || // ; + code === 0x3C || // < + code === 0x3D || // = + code === 0x3E || // > + code === 0x3F || // ? + code === 0x40 || // @ + code === 0x5B || // [ + code === 0x5C || // \ + code === 0x5D || // ] + code === 0x7B || // { + code === 0x7D // } ) { return false } @@ -22942,13 +25192,99 @@ function requireUtil$2 () { } if (reason) { - fireEvent('error', ws, ErrorEvent, { - error: new Error(reason) + // TODO: process.nextTick + fireEvent('error', ws, (type, init) => new ErrorEvent(type, init), { + error: new Error(reason), + message: reason }); } } - util$2 = { + /** + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5 + * @param {number} opcode + */ + function isControlFrame (opcode) { + return ( + opcode === opcodes.CLOSE || + opcode === opcodes.PING || + opcode === opcodes.PONG + ) + } + + function isContinuationFrame (opcode) { + return opcode === opcodes.CONTINUATION + } + + function isTextBinaryFrame (opcode) { + return opcode === opcodes.TEXT || opcode === opcodes.BINARY + } + + function isValidOpcode (opcode) { + return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode) + } + + /** + * Parses a Sec-WebSocket-Extensions header value. + * @param {string} extensions + * @returns {Map} + */ + // TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 + function parseExtensions (extensions) { + const position = { position: 0 }; + const extensionList = new Map(); + + while (position.position < extensions.length) { + const pair = collectASequenceOfCodePointsFast(';', extensions, position); + const [name, value = ''] = pair.split('='); + + extensionList.set( + removeHTTPWhitespace(name, true, false), + removeHTTPWhitespace(value, false, true) + ); + + position.position++; + } + + return extensionList + } + + /** + * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2 + * @description "client-max-window-bits = 1*DIGIT" + * @param {string} value + */ + function isValidClientWindowBits (value) { + for (let i = 0; i < value.length; i++) { + const byte = value.charCodeAt(i); + + if (byte < 0x30 || byte > 0x39) { + return false + } + } + + return true + } + + // https://nodejs.org/api/intl.html#detecting-internationalization-support + const hasIntl = typeof process.versions.icu === 'string'; + const fatalDecoder = hasIntl ? new TextDecoder('utf-8', { fatal: true }) : undefined; + + /** + * Converts a Buffer to utf-8, even on platforms without icu. + * @param {Buffer} buffer + */ + const utf8Decode = hasIntl + ? fatalDecoder.decode.bind(fatalDecoder) + : function (buffer) { + if (isUtf8(buffer)) { + return buffer.toString('utf-8') + } + throw new TypeError('Invalid utf-8 received.') + }; + + util$b = { + isConnecting, isEstablished, isClosing, isClosed, @@ -22956,43 +25292,151 @@ function requireUtil$2 () { isValidSubprotocol, isValidStatusCode, failWebsocketConnection, - websocketMessageReceived + websocketMessageReceived, + utf8Decode, + isControlFrame, + isContinuationFrame, + isTextBinaryFrame, + isValidOpcode, + parseExtensions, + isValidClientWindowBits }; - return util$2; + return util$b; } -var connection; -var hasRequiredConnection; +var frame$1; +var hasRequiredFrame$1; -function requireConnection () { - if (hasRequiredConnection) return connection; - hasRequiredConnection = 1; +function requireFrame$1 () { + if (hasRequiredFrame$1) return frame$1; + hasRequiredFrame$1 = 1; + + const { maxUnsigned16Bit } = requireConstants$c(); + + const BUFFER_SIZE = 16386; - const diagnosticsChannel = require$$0$e; - const { uid, states } = requireConstants$7(); + /** @type {import('crypto')} */ + let crypto; + let buffer = null; + let bufIdx = BUFFER_SIZE; + + try { + crypto = require('node:crypto'); + /* c8 ignore next 3 */ + } catch { + crypto = { + // not full compatibility, but minimum. + randomFillSync: function randomFillSync (buffer, _offset, _size) { + for (let i = 0; i < buffer.length; ++i) { + buffer[i] = Math.random() * 255 | 0; + } + return buffer + } + }; + } + + function generateMask () { + if (bufIdx === BUFFER_SIZE) { + bufIdx = 0; + crypto.randomFillSync((buffer ??= Buffer.allocUnsafe(BUFFER_SIZE)), 0, BUFFER_SIZE); + } + return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]] + } + + class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor (data) { + this.frameData = data; + } + + createFrame (opcode) { + const frameData = this.frameData; + const maskKey = generateMask(); + const bodyLength = frameData?.byteLength ?? 0; + + /** @type {number} */ + let payloadLength = bodyLength; // 0-125 + let offset = 6; + + if (bodyLength > maxUnsigned16Bit) { + offset += 8; // payload length is next 8 bytes + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; // payload length is next 2 bytes + payloadLength = 126; + } + + const buffer = Buffer.allocUnsafe(bodyLength + offset); + + // Clear first 2 bytes, everything else is overwritten + buffer[0] = buffer[1] = 0; + buffer[0] |= 0x80; // FIN + buffer[0] = (buffer[0] & 0xF0) + opcode; // opcode + + /*! ws. MIT License. Einar Otto Stangvik */ + buffer[offset - 4] = maskKey[0]; + buffer[offset - 3] = maskKey[1]; + buffer[offset - 2] = maskKey[2]; + buffer[offset - 1] = maskKey[3]; + + buffer[1] = payloadLength; + + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + // Clear extended payload length + buffer[2] = buffer[3] = 0; + buffer.writeUIntBE(bodyLength, 4, 6); + } + + buffer[1] |= 0x80; // MASK + + // mask body + for (let i = 0; i < bodyLength; ++i) { + buffer[offset + i] = frameData[i] ^ maskKey[i & 3]; + } + + return buffer + } + } + + frame$1 = { + WebsocketFrameSend + }; + return frame$1; +} + +var connection$1; +var hasRequiredConnection$1; + +function requireConnection$1 () { + if (hasRequiredConnection$1) return connection$1; + hasRequiredConnection$1 = 1; + + const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = requireConstants$c(); const { kReadyState, kSentClose, kByteParser, - kReceivedClose - } = requireSymbols(); - const { fireEvent, failWebsocketConnection } = requireUtil$2(); - const { CloseEvent } = requireEvents(); - const { makeRequest } = requireRequest(); - const { fetching } = requireFetch(); - const { Headers } = requireHeaders(); - const { getGlobalDispatcher } = requireGlobal(); - const { kHeadersList } = requireSymbols$4(); - - const channels = {}; - channels.open = diagnosticsChannel.channel('undici:websocket:open'); - channels.close = diagnosticsChannel.channel('undici:websocket:close'); - channels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error'); + kReceivedClose, + kResponse + } = requireSymbols$5(); + const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = requireUtil$b(); + const { channels } = requireDiagnostics$1(); + const { CloseEvent } = requireEvents$1(); + const { makeRequest } = requireRequest$2(); + const { fetching } = requireFetch$1(); + const { Headers, getHeadersList } = requireHeaders$1(); + const { getDecodeSplit } = requireUtil$g(); + const { WebsocketFrameSend } = requireFrame$1(); /** @type {import('crypto')} */ let crypto; try { - crypto = require('crypto'); + crypto = require('node:crypto'); + /* c8 ignore next 3 */ } catch { } @@ -23002,10 +25446,10 @@ function requireConnection () { * @param {URL} url * @param {string|string[]} protocols * @param {import('./websocket').WebSocket} ws - * @param {(response: any) => void} onEstablish + * @param {(response: any, extensions: string[] | undefined) => void} onEstablish * @param {Partial} options */ - function establishWebSocketConnection (url, protocols, ws, onEstablish, options) { + function establishWebSocketConnection (url, protocols, client, ws, onEstablish, options) { // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s // scheme is "ws", and to "https" otherwise. const requestURL = url; @@ -23018,6 +25462,7 @@ function requireConnection () { // and redirect mode is "error". const request = makeRequest({ urlList: [requestURL], + client, serviceWorkers: 'none', referrer: 'no-referrer', mode: 'websocket', @@ -23028,7 +25473,7 @@ function requireConnection () { // Note: undici extension, allow setting custom headers. if (options.headers) { - const headersList = new Headers(options.headers)[kHeadersList]; + const headersList = getHeadersList(new Headers(options.headers)); request.headersList = headersList; } @@ -23061,19 +25506,18 @@ function requireConnection () { // 9. Let permessageDeflate be a user-agent defined // "permessage-deflate" extension header value. // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673 - // TODO: enable once permessage-deflate is supported - const permessageDeflate = ''; // 'permessage-deflate; 15' + const permessageDeflate = 'permessage-deflate; client_max_window_bits'; // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to // request’s header list. - // request.headersList.append('sec-websocket-extensions', permessageDeflate) + request.headersList.append('sec-websocket-extensions', permessageDeflate); // 11. Fetch request with useParallelQueue set to true, and // processResponse given response being these steps: const controller = fetching({ request, useParallelQueue: true, - dispatcher: options.dispatcher ?? getGlobalDispatcher(), + dispatcher: options.dispatcher, processResponse (response) { // 1. If response is a network error or its status is not 101, // fail the WebSocket connection. @@ -23137,10 +25581,15 @@ function requireConnection () { // header field to determine which extensions are requested is // discussed in Section 9.1.) const secExtension = response.headersList.get('Sec-WebSocket-Extensions'); + let extensions; - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.'); - return + if (secExtension !== null) { + extensions = parseExtensions(secExtension); + + if (!extensions.has('permessage-deflate')) { + failWebsocketConnection(ws, 'Sec-WebSocket-Extensions header does not match.'); + return + } } // 6. If the response includes a |Sec-WebSocket-Protocol| header field @@ -23150,9 +25599,18 @@ function requireConnection () { // the WebSocket Connection_. const secProtocol = response.headersList.get('Sec-WebSocket-Protocol'); - if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) { - failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.'); - return + if (secProtocol !== null) { + const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList); + + // The client can request that the server use a specific subprotocol by + // including the |Sec-WebSocket-Protocol| field in its handshake. If it + // is specified, the server needs to include the same field and one of + // the selected subprotocol values in its response for the connection to + // be established. + if (!requestProtocols.includes(secProtocol)) { + failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.'); + return + } } response.socket.on('data', onSocketData); @@ -23167,13 +25625,72 @@ function requireConnection () { }); } - onEstablish(response); + onEstablish(response, extensions); } }); return controller } + function closeWebSocketConnection (ws, code, reason, reasonByteLength) { + if (isClosing(ws) || isClosed(ws)) ; else if (!isEstablished(ws)) { + // If the WebSocket connection is not yet established + // Fail the WebSocket connection and set this's ready state + // to CLOSING (2). + failWebsocketConnection(ws, 'Connection was closed before it was established.'); + ws[kReadyState] = states.CLOSING; + } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) { + // If the WebSocket closing handshake has not yet been started + // Start the WebSocket closing handshake and set this's ready + // state to CLOSING (2). + // - If neither code nor reason is present, the WebSocket Close + // message must not have a body. + // - If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + // - If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + + ws[kSentClose] = sentCloseFrameState.PROCESSING; + + const frame = new WebsocketFrameSend(); + + // If neither code nor reason is present, the WebSocket Close + // message must not have a body. + + // If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + if (code !== undefined && reason === undefined) { + frame.frameData = Buffer.allocUnsafe(2); + frame.frameData.writeUInt16BE(code, 0); + } else if (code !== undefined && reason !== undefined) { + // If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame.frameData.writeUInt16BE(code, 0); + // the body MAY contain UTF-8-encoded data with value /reason/ + frame.frameData.write(reason, 2, 'utf-8'); + } else { + frame.frameData = emptyBuffer; + } + + /** @type {import('stream').Duplex} */ + const socket = ws[kResponse].socket; + + socket.write(frame.createFrame(opcodes.CLOSE)); + + ws[kSentClose] = sentCloseFrameState.SENT; + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + ws[kReadyState] = states.CLOSING; + } else { + // Otherwise + // Set this's ready state to CLOSING (2). + ws[kReadyState] = states.CLOSING; + } + } + /** * @param {Buffer} chunk */ @@ -23189,21 +25706,26 @@ function requireConnection () { */ function onSocketClose () { const { ws } = this; + const { [kResponse]: response } = ws; + + response.socket.off('data', onSocketData); + response.socket.off('close', onSocketClose); + response.socket.off('error', onSocketError); // If the TCP connection was closed after the // WebSocket closing handshake was completed, the WebSocket connection // is said to have been closed _cleanly_. - const wasClean = ws[kSentClose] && ws[kReceivedClose]; + const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose]; let code = 1005; let reason = ''; const result = ws[kByteParser].closingInfo; - if (result) { + if (result && !result.error) { code = result.code ?? 1005; reason = result.reason; - } else if (!ws[kSentClose]) { + } else if (!ws[kReceivedClose]) { // If _The WebSocket // Connection is Closed_ and no Close control frame was received by the // endpoint (such as could occur if the underlying transport connection @@ -23229,7 +25751,8 @@ function requireConnection () { // attribute initialized to the result of applying UTF-8 // decode without BOM to the WebSocket connection close // reason. - fireEvent('close', ws, CloseEvent, { + // TODO: process.nextTick + fireEvent('close', ws, (type, init) => new CloseEvent(type, init), { wasClean, code, reason }); @@ -23254,129 +25777,144 @@ function requireConnection () { this.destroy(); } - connection = { - establishWebSocketConnection + connection$1 = { + establishWebSocketConnection, + closeWebSocketConnection }; - return connection; + return connection$1; } -var frame; -var hasRequiredFrame; +var permessageDeflate$1; +var hasRequiredPermessageDeflate$1; -function requireFrame () { - if (hasRequiredFrame) return frame; - hasRequiredFrame = 1; +function requirePermessageDeflate$1 () { + if (hasRequiredPermessageDeflate$1) return permessageDeflate$1; + hasRequiredPermessageDeflate$1 = 1; - const { maxUnsigned16Bit } = requireConstants$7(); + const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$3; + const { isValidClientWindowBits } = requireUtil$b(); - /** @type {import('crypto')} */ - let crypto; - try { - crypto = require('crypto'); - } catch { + const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]); + const kBuffer = Symbol('kBuffer'); + const kLength = Symbol('kLength'); - } + class PerMessageDeflate { + /** @type {import('node:zlib').InflateRaw} */ + #inflate - class WebsocketFrameSend { - /** - * @param {Buffer|undefined} data - */ - constructor (data) { - this.frameData = data; - this.maskKey = crypto.randomBytes(4); + #options = {} + + constructor (extensions) { + this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover'); + this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits'); } - createFrame (opcode) { - const bodyLength = this.frameData?.byteLength ?? 0; + decompress (chunk, fin, callback) { + // An endpoint uses the following algorithm to decompress a message. + // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the + // payload of the message. + // 2. Decompress the resulting data using DEFLATE. - /** @type {number} */ - let payloadLength = bodyLength; // 0-125 - let offset = 6; + if (!this.#inflate) { + let windowBits = Z_DEFAULT_WINDOWBITS; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; // payload length is next 8 bytes - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; // payload length is next 2 bytes - payloadLength = 126; - } + if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS + if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) { + callback(new Error('Invalid server_max_window_bits')); + return + } - const buffer = Buffer.allocUnsafe(bodyLength + offset); + windowBits = Number.parseInt(this.#options.serverMaxWindowBits); + } - // Clear first 2 bytes, everything else is overwritten - buffer[0] = buffer[1] = 0; - buffer[0] |= 0x80; // FIN - buffer[0] = (buffer[0] & 0xF0) + opcode; // opcode + this.#inflate = createInflateRaw({ windowBits }); + this.#inflate[kBuffer] = []; + this.#inflate[kLength] = 0; - /*! ws. MIT License. Einar Otto Stangvik */ - buffer[offset - 4] = this.maskKey[0]; - buffer[offset - 3] = this.maskKey[1]; - buffer[offset - 2] = this.maskKey[2]; - buffer[offset - 1] = this.maskKey[3]; + this.#inflate.on('data', (data) => { + this.#inflate[kBuffer].push(data); + this.#inflate[kLength] += data.length; + }); - buffer[1] = payloadLength; + this.#inflate.on('error', (err) => { + this.#inflate = null; + callback(err); + }); + } - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - // Clear extended payload length - buffer[2] = buffer[3] = 0; - buffer.writeUIntBE(bodyLength, 4, 6); + this.#inflate.write(chunk); + if (fin) { + this.#inflate.write(tail); } - buffer[1] |= 0x80; // MASK + this.#inflate.flush(() => { + const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]); - // mask body - for (let i = 0; i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; - } + this.#inflate[kBuffer].length = 0; + this.#inflate[kLength] = 0; - return buffer + callback(null, full); + }); } } - frame = { - WebsocketFrameSend - }; - return frame; + permessageDeflate$1 = { PerMessageDeflate }; + return permessageDeflate$1; } -var receiver; -var hasRequiredReceiver; +var receiver$1; +var hasRequiredReceiver$1; -function requireReceiver () { - if (hasRequiredReceiver) return receiver; - hasRequiredReceiver = 1; +function requireReceiver$1 () { + if (hasRequiredReceiver$1) return receiver$1; + hasRequiredReceiver$1 = 1; - const { Writable } = require$$0__default$1; - const diagnosticsChannel = require$$0$e; - const { parserStates, opcodes, states, emptyBuffer } = requireConstants$7(); - const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols(); - const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = requireUtil$2(); - const { WebsocketFrameSend } = requireFrame(); + const { Writable } = require$$0$8; + const assert = require$$0$7; + const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = requireConstants$c(); + const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols$5(); + const { channels } = requireDiagnostics$1(); + const { + isValidStatusCode, + isValidOpcode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isTextBinaryFrame, + isContinuationFrame + } = requireUtil$b(); + const { WebsocketFrameSend } = requireFrame$1(); + const { closeWebSocketConnection } = requireConnection$1(); + const { PerMessageDeflate } = requirePermessageDeflate$1(); // This code was influenced by ws released under the MIT license. // Copyright (c) 2011 Einar Otto Stangvik // Copyright (c) 2013 Arnout Kazemier and contributors // Copyright (c) 2016 Luigi Pinca and contributors - const channels = {}; - channels.ping = diagnosticsChannel.channel('undici:websocket:ping'); - channels.pong = diagnosticsChannel.channel('undici:websocket:pong'); - class ByteParser extends Writable { #buffers = [] #byteOffset = 0 + #loop = false #state = parserStates.INFO #info = {} #fragments = [] - constructor (ws) { + /** @type {Map} */ + #extensions + + constructor (ws, extensions) { super(); this.ws = ws; + this.#extensions = extensions == null ? new Map() : extensions; + + if (this.#extensions.has('permessage-deflate')) { + this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions)); + } } /** @@ -23386,6 +25924,7 @@ function requireReceiver () { _write (chunk, _, callback) { this.#buffers.push(chunk); this.#byteOffset += chunk.length; + this.#loop = true; this.run(callback); } @@ -23396,7 +25935,7 @@ function requireReceiver () { * or not enough bytes are buffered to parse. */ run (callback) { - while (true) { + while (this.#loop) { if (this.#state === parserStates.INFO) { // If there aren't enough bytes to parse the payload length, etc. if (this.#byteOffset < 2) { @@ -23404,132 +25943,95 @@ function requireReceiver () { } const buffer = this.consume(2); + const fin = (buffer[0] & 0x80) !== 0; + const opcode = buffer[0] & 0x0F; + const masked = (buffer[1] & 0x80) === 0x80; - this.#info.fin = (buffer[0] & 0x80) !== 0; - this.#info.opcode = buffer[0] & 0x0F; + const fragmented = !fin && opcode !== opcodes.CONTINUATION; + const payloadLength = buffer[1] & 0x7F; + + const rsv1 = buffer[0] & 0x40; + const rsv2 = buffer[0] & 0x20; + const rsv3 = buffer[0] & 0x10; + + if (!isValidOpcode(opcode)) { + failWebsocketConnection(this.ws, 'Invalid opcode received'); + return callback() + } - // If we receive a fragmented message, we use the type of the first - // frame to parse the full message as binary/text, when it's terminated - this.#info.originalOpcode ??= this.#info.opcode; + if (masked) { + failWebsocketConnection(this.ws, 'Frame cannot be masked'); + return callback() + } - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; + // MUST be 0 unless an extension is negotiated that defines meanings + // for non-zero values. If a nonzero value is received and none of + // the negotiated extensions defines the meaning of such a nonzero + // value, the receiving endpoint MUST _Fail the WebSocket + // Connection_. + // This document allocates the RSV1 bit of the WebSocket header for + // PMCEs and calls the bit the "Per-Message Compressed" bit. On a + // WebSocket connection where a PMCE is in use, this bit indicates + // whether a message is compressed or not. + if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) { + failWebsocketConnection(this.ws, 'Expected RSV1 to be clear.'); + return + } - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + if (rsv2 !== 0 || rsv3 !== 0) { + failWebsocketConnection(this.ws, 'RSV1, RSV2, RSV3 must be clear'); + return + } + + if (fragmented && !isTextBinaryFrame(opcode)) { // Only text and binary frames can be fragmented failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.'); return } - const payloadLength = buffer[1] & 0x7F; - - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; + // If we are already parsing a text/binary frame and do not receive either + // a continuation frame or close frame, fail the connection. + if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { + failWebsocketConnection(this.ws, 'Expected continuation frame'); + return } - if (this.#info.fragmented && payloadLength > 125) { + if (this.#info.fragmented && fragmented) { // A fragmented frame can't be fragmented itself failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.'); return - } else if ( - (this.#info.opcode === opcodes.PING || - this.#info.opcode === opcodes.PONG || - this.#info.opcode === opcodes.CLOSE) && - payloadLength > 125 - ) { - // Control frames can have a payload length of 125 bytes MAX - failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.'); - return - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.'); - return - } - - const body = this.consume(payloadLength); - - this.#info.closeInfo = this.parseCloseBody(false, body); - - if (!this.ws[kSentClose]) { - // If an endpoint receives a Close frame and did not previously send a - // Close frame, the endpoint MUST send a Close frame in response. (When - // sending a Close frame in response, the endpoint typically echos the - // status code it received.) - const body = Buffer.allocUnsafe(2); - body.writeUInt16BE(this.#info.closeInfo.code, 0); - const closeFrame = new WebsocketFrameSend(body); - - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = true; - } - } - ); - } - - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; - - this.end(); + } + // "All control frames MUST have a payload length of 125 bytes or less + // and MUST NOT be fragmented." + if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { + failWebsocketConnection(this.ws, 'Control frame either too large or fragmented'); return - } else if (this.#info.opcode === opcodes.PING) { - // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in - // response, unless it already received a Close frame. - // A Pong frame sent in response to a Ping frame must have identical - // "Application data" - - const body = this.consume(payloadLength); - - if (!this.ws[kReceivedClose]) { - const frame = new WebsocketFrameSend(body); - - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); - - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body - }); - } - } - - this.#state = parserStates.INFO; - - if (this.#byteOffset > 0) { - continue - } else { - callback(); - return - } - } else if (this.#info.opcode === opcodes.PONG) { - // A Pong frame MAY be sent unsolicited. This serves as a - // unidirectional heartbeat. A response to an unsolicited Pong frame is - // not expected. + } - const body = this.consume(payloadLength); + if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { + failWebsocketConnection(this.ws, 'Unexpected continuation frame'); + return + } - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body - }); - } + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; + } - if (this.#byteOffset > 0) { - continue - } else { - callback(); - return - } + if (isTextBinaryFrame(opcode)) { + this.#info.binaryType = opcode; + this.#info.compressed = rsv1 !== 0; } + + this.#info.opcode = opcode; + this.#info.masked = masked; + this.#info.fin = fin; + this.#info.fragmented = fragmented; } else if (this.#state === parserStates.PAYLOADLENGTH_16) { if (this.#byteOffset < 2) { return callback() @@ -23547,7 +26049,7 @@ function requireReceiver () { const buffer = this.consume(8); const upper = buffer.readUInt32BE(0); - // 2^31 is the maxinimum bytes an arraybuffer can contain + // 2^31 is the maximum bytes an arraybuffer can contain // on 32-bit systems. Although, on 64-bit systems, this is // 2^53-1 bytes. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length @@ -23564,47 +26066,69 @@ function requireReceiver () { this.#state = parserStates.READ_DATA; } else if (this.#state === parserStates.READ_DATA) { if (this.#byteOffset < this.#info.payloadLength) { - // If there is still more data in this chunk that needs to be read return callback() - } else if (this.#byteOffset >= this.#info.payloadLength) { - // If the server sent multiple frames in a single chunk + } + + const body = this.consume(this.#info.payloadLength); + + if (isControlFrame(this.#info.opcode)) { + this.#loop = this.parseControlFrame(body); + this.#state = parserStates.INFO; + } else { + if (!this.#info.compressed) { + this.#fragments.push(body); + + // If the frame is not fragmented, a message has been received. + // If the frame is fragmented, it will terminate with a fin bit set + // and an opcode of 0 (continuation), therefore we handle that when + // parsing continuation frames, not here. + if (!this.#info.fragmented && this.#info.fin) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage); + this.#fragments.length = 0; + } - const body = this.consume(this.#info.payloadLength); + this.#state = parserStates.INFO; + } else { + this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => { + if (error) { + closeWebSocketConnection(this.ws, 1007, error.message, error.message.length); + return + } - this.#fragments.push(body); + this.#fragments.push(data); - // If the frame is unfragmented, or a fragmented frame was terminated, - // a message was received - if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) { - const fullMessage = Buffer.concat(this.#fragments); + if (!this.#info.fin) { + this.#state = parserStates.INFO; + this.#loop = true; + this.run(callback); + return + } - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); + websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)); - this.#info = {}; - this.#fragments.length = 0; - } + this.#loop = true; + this.#state = parserStates.INFO; + this.#fragments.length = 0; + this.run(callback); + }); - this.#state = parserStates.INFO; + this.#loop = false; + break + } } } - - if (this.#byteOffset > 0) { - continue - } else { - callback(); - break - } } } /** * Take n bytes from the buffered Buffers * @param {number} n - * @returns {Buffer|null} + * @returns {Buffer} */ consume (n) { if (n > this.#byteOffset) { - return null + throw new Error('Called consume() before buffers satiated.') } else if (n === 0) { return emptyBuffer } @@ -23639,7 +26163,9 @@ function requireReceiver () { return buffer } - parseCloseBody (onlyCode, data) { + parseCloseBody (data) { + assert(data.length !== 1); + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 /** @type {number|undefined} */ let code; @@ -23651,12 +26177,8 @@ function requireReceiver () { code = data.readUInt16BE(0); } - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null - } - - return { code } + if (code !== undefined && !isValidStatusCode(code)) { + return { code: 1002, reason: 'Invalid status code', error: true } } // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6 @@ -23668,18 +26190,97 @@ function requireReceiver () { reason = reason.subarray(3); } - if (code !== undefined && !isValidStatusCode(code)) { - return null - } - try { - // TODO: optimize this - reason = new TextDecoder('utf-8', { fatal: true }).decode(reason); + reason = utf8Decode(reason); } catch { - return null + return { code: 1007, reason: 'Invalid UTF-8', error: true } + } + + return { code, reason, error: false } + } + + /** + * Parses control frames. + * @param {Buffer} body + */ + parseControlFrame (body) { + const { opcode, payloadLength } = this.#info; + + if (opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.'); + return false + } + + this.#info.closeInfo = this.parseCloseBody(body); + + if (this.#info.closeInfo.error) { + const { code, reason } = this.#info.closeInfo; + + closeWebSocketConnection(this.ws, code, reason, reason.length); + failWebsocketConnection(this.ws, reason); + return false + } + + if (this.ws[kSentClose] !== sentCloseFrameState.SENT) { + // If an endpoint receives a Close frame and did not previously send a + // Close frame, the endpoint MUST send a Close frame in response. (When + // sending a Close frame in response, the endpoint typically echos the + // status code it received.) + let body = emptyBuffer; + if (this.#info.closeInfo.code) { + body = Buffer.allocUnsafe(2); + body.writeUInt16BE(this.#info.closeInfo.code, 0); + } + const closeFrame = new WebsocketFrameSend(body); + + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = sentCloseFrameState.SENT; + } + } + ); + } + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + + return false + } else if (opcode === opcodes.PING) { + // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in + // response, unless it already received a Close frame. + // A Pong frame sent in response to a Ping frame must have identical + // "Application data" + + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body); + + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); + + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }); + } + } + } else if (opcode === opcodes.PONG) { + // A Pong frame MAY be sent unsolicited. This serves as a + // unidirectional heartbeat. A response to an unsolicited Pong frame is + // not expected. + + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }); + } } - return { code, reason } + return true } get closingInfo () { @@ -23687,24 +26288,135 @@ function requireReceiver () { } } - receiver = { + receiver$1 = { ByteParser }; - return receiver; + return receiver$1; } -var websocket; -var hasRequiredWebsocket; +var sender$1; +var hasRequiredSender$1; -function requireWebsocket () { - if (hasRequiredWebsocket) return websocket; - hasRequiredWebsocket = 1; +function requireSender$1 () { + if (hasRequiredSender$1) return sender$1; + hasRequiredSender$1 = 1; - const { webidl } = requireWebidl(); - const { DOMException } = requireConstants$a(); - const { URLSerializer } = requireDataURL(); - const { getGlobalOrigin } = requireGlobal$1(); - const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = requireConstants$7(); + const { WebsocketFrameSend } = requireFrame$1(); + const { opcodes, sendHints } = requireConstants$c(); + const FixedQueue = requireFixedQueue$1(); + + /** @type {typeof Uint8Array} */ + const FastBuffer = Buffer[Symbol.species]; + + /** + * @typedef {object} SendQueueNode + * @property {Promise | null} promise + * @property {((...args: any[]) => any)} callback + * @property {Buffer | null} frame + */ + + class SendQueue { + /** + * @type {FixedQueue} + */ + #queue = new FixedQueue() + + /** + * @type {boolean} + */ + #running = false + + /** @type {import('node:net').Socket} */ + #socket + + constructor (socket) { + this.#socket = socket; + } + + add (item, cb, hint) { + if (hint !== sendHints.blob) { + const frame = createFrame(item, hint); + if (!this.#running) { + // fast-path + this.#socket.write(frame, cb); + } else { + /** @type {SendQueueNode} */ + const node = { + promise: null, + callback: cb, + frame + }; + this.#queue.push(node); + } + return + } + + /** @type {SendQueueNode} */ + const node = { + promise: item.arrayBuffer().then((ab) => { + node.promise = null; + node.frame = createFrame(ab, hint); + }), + callback: cb, + frame: null + }; + + this.#queue.push(node); + + if (!this.#running) { + this.#run(); + } + } + + async #run () { + this.#running = true; + const queue = this.#queue; + while (!queue.isEmpty()) { + const node = queue.shift(); + // wait pending promise + if (node.promise !== null) { + await node.promise; + } + // write + this.#socket.write(node.frame, node.callback); + // cleanup + node.callback = node.frame = null; + } + this.#running = false; + } + } + + function createFrame (data, hint) { + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY) + } + + function toBuffer (data, hint) { + switch (hint) { + case sendHints.string: + return Buffer.from(data) + case sendHints.arrayBuffer: + case sendHints.blob: + return new FastBuffer(data) + case sendHints.typedArray: + return new FastBuffer(data.buffer, data.byteOffset, data.byteLength) + } + } + + sender$1 = { SendQueue }; + return sender$1; +} + +var websocket$1; +var hasRequiredWebsocket$1; + +function requireWebsocket$1 () { + if (hasRequiredWebsocket$1) return websocket$1; + hasRequiredWebsocket$1 = 1; + + const { webidl } = requireWebidl$1(); + const { URLSerializer } = requireDataUrl$1(); + const { environmentSettingsObject } = requireUtil$g(); + const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = requireConstants$c(); const { kWebSocketURL, kReadyState, @@ -23713,16 +26425,21 @@ function requireWebsocket () { kResponse, kSentClose, kByteParser - } = requireSymbols(); - const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = requireUtil$2(); - const { establishWebSocketConnection } = requireConnection(); - const { WebsocketFrameSend } = requireFrame(); - const { ByteParser } = requireReceiver(); - const { kEnumerableProperty, isBlobLike } = requireUtil$8(); - const { getGlobalDispatcher } = requireGlobal(); - const { types } = require$$0__default; - - let experimentalWarned = false; + } = requireSymbols$5(); + const { + isConnecting, + isEstablished, + isClosing, + isValidSubprotocol, + fireEvent + } = requireUtil$b(); + const { establishWebSocketConnection, closeWebSocketConnection } = requireConnection$1(); + const { ByteParser } = requireReceiver$1(); + const { kEnumerableProperty, isBlobLike } = requireUtil$h(); + const { getGlobalDispatcher } = requireGlobal$2(); + const { types } = require$$0$a; + const { ErrorEvent, CloseEvent } = requireEvents$1(); + const { SendQueue } = requireSender$1(); // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -23737,6 +26454,9 @@ function requireWebsocket () { #protocol = '' #extensions = '' + /** @type {SendQueue} */ + #sendQueue + /** * @param {string} url * @param {string|string[]} protocols @@ -23744,22 +26464,18 @@ function requireWebsocket () { constructor (url, protocols = []) { super(); - webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' }); + webidl.util.markAsUncloneable(this); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning('WebSockets are experimental, expect them to change at any time.', { - code: 'UNDICI-WS' - }); - } + const prefix = 'WebSocket constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols); + const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options'); - url = webidl.converters.USVString(url); + url = webidl.converters.USVString(url, prefix, 'url'); protocols = options.protocols; // 1. Let baseURL be this's relevant settings object's API base URL. - const baseURL = getGlobalOrigin(); + const baseURL = environmentSettingsObject.settingsObject.baseUrl; // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. let urlRecord; @@ -23815,6 +26531,7 @@ function requireWebsocket () { this[kWebSocketURL] = new URL(urlRecord.href); // 11. Let client be this's relevant settings object. + const client = environmentSettingsObject.settingsObject; // 12. Run this step in parallel: @@ -23823,8 +26540,9 @@ function requireWebsocket () { this[kController] = establishWebSocketConnection( urlRecord, protocols, + client, this, - (response) => this.#onConnectionEstablished(response), + (response, extensions) => this.#onConnectionEstablished(response, extensions), options ); @@ -23833,6 +26551,8 @@ function requireWebsocket () { // be CONNECTING (0). this[kReadyState] = WebSocket.CONNECTING; + this[kSentClose] = sentCloseFrameState.NOT_SENT; + // The extensions attribute must initially return the empty string. // The protocol attribute must initially return the empty string. @@ -23850,12 +26570,14 @@ function requireWebsocket () { close (code = undefined, reason = undefined) { webidl.brandCheck(this, WebSocket); + const prefix = 'WebSocket.close'; + if (code !== undefined) { - code = webidl.converters['unsigned short'](code, { clamp: true }); + code = webidl.converters['unsigned short'](code, prefix, 'code', { clamp: true }); } if (reason !== undefined) { - reason = webidl.converters.USVString(reason); + reason = webidl.converters.USVString(reason, prefix, 'reason'); } // 1. If code is present, but is neither an integer equal to 1000 nor an @@ -23885,62 +26607,7 @@ function requireWebsocket () { } // 3. Run the first matching steps from the following list: - if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) ; else if (!isEstablished(this)) { - // If the WebSocket connection is not yet established - // Fail the WebSocket connection and set this's ready state - // to CLOSING (2). - failWebsocketConnection(this, 'Connection was closed before it was established.'); - this[kReadyState] = WebSocket.CLOSING; - } else if (!isClosing(this)) { - // If the WebSocket closing handshake has not yet been started - // Start the WebSocket closing handshake and set this's ready - // state to CLOSING (2). - // - If neither code nor reason is present, the WebSocket Close - // message must not have a body. - // - If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - // - If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. - - const frame = new WebsocketFrameSend(); - - // If neither code nor reason is present, the WebSocket Close - // message must not have a body. - - // If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - if (code !== undefined && reason === undefined) { - frame.frameData = Buffer.allocUnsafe(2); - frame.frameData.writeUInt16BE(code, 0); - } else if (code !== undefined && reason !== undefined) { - // If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); - frame.frameData.writeUInt16BE(code, 0); - // the body MAY contain UTF-8-encoded data with value /reason/ - frame.frameData.write(reason, 2, 'utf-8'); - } else { - frame.frameData = emptyBuffer; - } - - /** @type {import('stream').Duplex} */ - const socket = this[kResponse].socket; - - socket.write(frame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true; - } - }); - - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - this[kReadyState] = states.CLOSING; - } else { - // Otherwise - // Set this's ready state to CLOSING (2). - this[kReadyState] = WebSocket.CLOSING; - } + closeWebSocketConnection(this, code, reason, reasonByteLength); } /** @@ -23950,13 +26617,14 @@ function requireWebsocket () { send (data) { webidl.brandCheck(this, WebSocket); - webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' }); + const prefix = 'WebSocket.send'; + webidl.argumentLengthCheck(arguments, 1, prefix); - data = webidl.converters.WebSocketSendData(data); + data = webidl.converters.WebSocketSendData(data, prefix, 'data'); // 1. If this's ready state is CONNECTING, then throw an // "InvalidStateError" DOMException. - if (this[kReadyState] === WebSocket.CONNECTING) { + if (isConnecting(this)) { throw new DOMException('Sent before connected.', 'InvalidStateError') } @@ -23968,9 +26636,6 @@ function requireWebsocket () { return } - /** @type {import('stream').Duplex} */ - const socket = this[kResponse].socket; - // If data is a string if (typeof data === 'string') { // If the WebSocket connection is established and the WebSocket @@ -23984,14 +26649,12 @@ function requireWebsocket () { // the bufferedAmount attribute by the number of bytes needed to // express the argument as UTF-8. - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.TEXT); + const length = Buffer.byteLength(data); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); + this.#bufferedAmount += length; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= length; + }, sendHints.string); } else if (types.isArrayBuffer(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -24005,14 +26668,10 @@ function requireWebsocket () { // increase the bufferedAmount attribute by the length of the // ArrayBuffer in bytes. - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.BINARY); - - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.arrayBuffer); } else if (ArrayBuffer.isView(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -24026,15 +26685,10 @@ function requireWebsocket () { // not throw an exception must increase the bufferedAmount attribute // by the length of data’s buffer in bytes. - const ab = Buffer.from(data, data.byteOffset, data.byteLength); - - const frame = new WebsocketFrameSend(ab); - const buffer = frame.createFrame(opcodes.BINARY); - - this.#bufferedAmount += ab.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength; - }); + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.typedArray); } else if (isBlobLike(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -24047,18 +26701,10 @@ function requireWebsocket () { // an exception must increase the bufferedAmount attribute by the size // of the Blob object’s raw data, in bytes. - const frame = new WebsocketFrameSend(); - - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab); - frame.frameData = value; - const buffer = frame.createFrame(opcodes.BINARY); - - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - }); + this.#bufferedAmount += data.size; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.size; + }, sendHints.blob); } } @@ -24197,19 +26843,20 @@ function requireWebsocket () { /** * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol */ - #onConnectionEstablished (response) { + #onConnectionEstablished (response, parsedExtensions) { // processResponse is called when the "response’s header list has been received and initialized." // once this happens, the connection is open this[kResponse] = response; - const parser = new ByteParser(this); - parser.on('drain', function onParserDrain () { - this.ws[kResponse].socket.resume(); - }); + const parser = new ByteParser(this, parsedExtensions); + parser.on('drain', onParserDrain); + parser.on('error', onParserError.bind(this)); response.socket.ws = this; this[kByteParser] = parser; + this.#sendQueue = new SendQueue(response.socket); + // 1. Change the ready state to OPEN (1). this[kReadyState] = states.OPEN; @@ -24281,29 +26928,25 @@ function requireWebsocket () { webidl.converters.DOMString ); - webidl.converters['DOMString or sequence'] = function (V) { + webidl.converters['DOMString or sequence'] = function (V, prefix, argument) { if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { return webidl.converters['sequence'](V) } - return webidl.converters.DOMString(V) + return webidl.converters.DOMString(V, prefix, argument) }; - // This implements the propsal made in https://github.com/whatwg/websockets/issues/42 + // This implements the proposal made in https://github.com/whatwg/websockets/issues/42 webidl.converters.WebSocketInit = webidl.dictionaryConverter([ { key: 'protocols', converter: webidl.converters['DOMString or sequence'], - get defaultValue () { - return [] - } + defaultValue: () => new Array(0) }, { key: 'dispatcher', - converter: (V) => V, - get defaultValue () { - return getGlobalDispatcher() - } + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() }, { key: 'headers', @@ -24325,7 +26968,7 @@ function requireWebsocket () { return webidl.converters.Blob(V, { strict: false }) } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { return webidl.converters.BufferSource(V) } } @@ -24333,63 +26976,1028 @@ function requireWebsocket () { return webidl.converters.USVString(V) }; - websocket = { + function onParserDrain () { + this.ws[kResponse].socket.resume(); + } + + function onParserError (err) { + let message; + let code; + + if (err instanceof CloseEvent) { + message = err.reason; + code = err.code; + } else { + message = err.message; + } + + fireEvent('error', this, () => new ErrorEvent('error', { error: err, message })); + + closeWebSocketConnection(this, code); + } + + websocket$1 = { WebSocket }; - return websocket; + return websocket$1; } -var hasRequiredUndici; +var util$a; +var hasRequiredUtil$a; -function requireUndici () { - if (hasRequiredUndici) return undici; - hasRequiredUndici = 1; +function requireUtil$a () { + if (hasRequiredUtil$a) return util$a; + hasRequiredUtil$a = 1; - const Client = requireClient(); - const Dispatcher = requireDispatcher(); - const errors = requireErrors$1(); - const Pool = requirePool(); - const BalancedPool = requireBalancedPool(); - const Agent = requireAgent(); - const util = requireUtil$8(); - const { InvalidArgumentError } = errors; - const api = requireApi(); - const buildConnector = requireConnect(); - const MockClient = requireMockClient(); - const MockAgent = requireMockAgent(); - const MockPool = requireMockPool(); - const mockErrors = requireMockErrors(); - const ProxyAgent = requireProxyAgent(); - const RetryHandler = requireRetryHandler(); - const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal(); - const DecoratorHandler = requireDecoratorHandler(); - const RedirectHandler = requireRedirectHandler(); - const createRedirectInterceptor = requireRedirectInterceptor(); + /** + * Checks if the given value is a valid LastEventId. + * @param {string} value + * @returns {boolean} + */ + function isValidLastEventId (value) { + // LastEventId should not contain U+0000 NULL + return value.indexOf('\u0000') === -1 + } - let hasCrypto; - try { - require('crypto'); - hasCrypto = true; - } catch { - hasCrypto = false; + /** + * Checks if the given value is a base 10 digit. + * @param {string} value + * @returns {boolean} + */ + function isASCIINumber (value) { + if (value.length === 0) return false + for (let i = 0; i < value.length; i++) { + if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false + } + return true } - Object.assign(Dispatcher.prototype, api); + // https://github.com/nodejs/undici/issues/2664 + function delay (ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms).unref(); + }) + } - undici.Dispatcher = Dispatcher; - undici.Client = Client; - undici.Pool = Pool; - undici.BalancedPool = BalancedPool; - undici.Agent = Agent; - undici.ProxyAgent = ProxyAgent; - undici.RetryHandler = RetryHandler; + util$a = { + isValidLastEventId, + isASCIINumber, + delay + }; + return util$a; +} - undici.DecoratorHandler = DecoratorHandler; - undici.RedirectHandler = RedirectHandler; - undici.createRedirectInterceptor = createRedirectInterceptor; +var eventsourceStream$1; +var hasRequiredEventsourceStream$1; - undici.buildConnector = buildConnector; - undici.errors = errors; +function requireEventsourceStream$1 () { + if (hasRequiredEventsourceStream$1) return eventsourceStream$1; + hasRequiredEventsourceStream$1 = 1; + const { Transform } = require$$0$8; + const { isASCIINumber, isValidLastEventId } = requireUtil$a(); + + /** + * @type {number[]} BOM + */ + const BOM = [0xEF, 0xBB, 0xBF]; + /** + * @type {10} LF + */ + const LF = 0x0A; + /** + * @type {13} CR + */ + const CR = 0x0D; + /** + * @type {58} COLON + */ + const COLON = 0x3A; + /** + * @type {32} SPACE + */ + const SPACE = 0x20; + + /** + * @typedef {object} EventSourceStreamEvent + * @type {object} + * @property {string} [event] The event type. + * @property {string} [data] The data of the message. + * @property {string} [id] A unique ID for the event. + * @property {string} [retry] The reconnection time, in milliseconds. + */ + + /** + * @typedef eventSourceSettings + * @type {object} + * @property {string} lastEventId The last event ID received from the server. + * @property {string} origin The origin of the event source. + * @property {number} reconnectionTime The reconnection time, in milliseconds. + */ + + class EventSourceStream extends Transform { + /** + * @type {eventSourceSettings} + */ + state = null + + /** + * Leading byte-order-mark check. + * @type {boolean} + */ + checkBOM = true + + /** + * @type {boolean} + */ + crlfCheck = false + + /** + * @type {boolean} + */ + eventEndCheck = false + + /** + * @type {Buffer} + */ + buffer = null + + pos = 0 + + event = { + data: undefined, + event: undefined, + id: undefined, + retry: undefined + } + + /** + * @param {object} options + * @param {eventSourceSettings} options.eventSourceSettings + * @param {Function} [options.push] + */ + constructor (options = {}) { + // Enable object mode as EventSourceStream emits objects of shape + // EventSourceStreamEvent + options.readableObjectMode = true; + + super(options); + + this.state = options.eventSourceSettings || {}; + if (options.push) { + this.push = options.push; + } + } + + /** + * @param {Buffer} chunk + * @param {string} _encoding + * @param {Function} callback + * @returns {void} + */ + _transform (chunk, _encoding, callback) { + if (chunk.length === 0) { + callback(); + return + } + + // Cache the chunk in the buffer, as the data might not be complete while + // processing it + // TODO: Investigate if there is a more performant way to handle + // incoming chunks + // see: https://github.com/nodejs/undici/issues/2630 + if (this.buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.buffer = chunk; + } + + // Strip leading byte-order-mark if we opened the stream and started + // the processing of the incoming data + if (this.checkBOM) { + switch (this.buffer.length) { + case 1: + // Check if the first byte is the same as the first byte of the BOM + if (this.buffer[0] === BOM[0]) { + // If it is, we need to wait for more data + callback(); + return + } + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + + // The buffer only contains one byte so we need to wait for more data + callback(); + return + case 2: + // Check if the first two bytes are the same as the first two bytes + // of the BOM + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] + ) { + // If it is, we need to wait for more data, because the third byte + // is needed to determine if it is the BOM or not + callback(); + return + } + + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + break + case 3: + // Check if the first three bytes are the same as the first three + // bytes of the BOM + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] && + this.buffer[2] === BOM[2] + ) { + // If it is, we can drop the buffered data, as it is only the BOM + this.buffer = Buffer.alloc(0); + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + + // Await more data + callback(); + return + } + // If it is not the BOM, we can start processing the data + this.checkBOM = false; + break + default: + // The buffer is longer than 3 bytes, so we can drop the BOM if it is + // present + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] && + this.buffer[2] === BOM[2] + ) { + // Remove the BOM from the buffer + this.buffer = this.buffer.subarray(3); + } + + // Set the checkBOM flag to false as we don't need to check for the + this.checkBOM = false; + break + } + } + + while (this.pos < this.buffer.length) { + // If the previous line ended with an end-of-line, we need to check + // if the next character is also an end-of-line. + if (this.eventEndCheck) { + // If the the current character is an end-of-line, then the event + // is finished and we can process it + + // If the previous line ended with a carriage return, we need to + // check if the current character is a line feed and remove it + // from the buffer. + if (this.crlfCheck) { + // If the current character is a line feed, we can remove it + // from the buffer and reset the crlfCheck flag + if (this.buffer[this.pos] === LF) { + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.crlfCheck = false; + + // It is possible that the line feed is not the end of the + // event. We need to check if the next character is an + // end-of-line character to determine if the event is + // finished. We simply continue the loop to check the next + // character. + + // As we removed the line feed from the buffer and set the + // crlfCheck flag to false, we basically don't make any + // distinction between a line feed and a carriage return. + continue + } + this.crlfCheck = false; + } + + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + // If the current character is a carriage return, we need to + // set the crlfCheck flag to true, as we need to check if the + // next character is a line feed so we can remove it from the + // buffer + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + if ( + this.event.data !== undefined || this.event.event || this.event.id || this.event.retry) { + this.processEvent(this.event); + } + this.clearEvent(); + continue + } + // If the current character is not an end-of-line, then the event + // is not finished and we have to reset the eventEndCheck flag + this.eventEndCheck = false; + continue + } + + // If the current character is an end-of-line, we can process the + // line + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + // If the current character is a carriage return, we need to + // set the crlfCheck flag to true, as we need to check if the + // next character is a line feed + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + + // In any case, we can process the line as we reached an + // end-of-line character + this.parseLine(this.buffer.subarray(0, this.pos), this.event); + + // Remove the processed line from the buffer + this.buffer = this.buffer.subarray(this.pos + 1); + // Reset the position as we removed the processed line from the buffer + this.pos = 0; + // A line was processed and this could be the end of the event. We need + // to check if the next line is empty to determine if the event is + // finished. + this.eventEndCheck = true; + continue + } + + this.pos++; + } + + callback(); + } + + /** + * @param {Buffer} line + * @param {EventStreamEvent} event + */ + parseLine (line, event) { + // If the line is empty (a blank line) + // Dispatch the event, as defined below. + // This will be handled in the _transform method + if (line.length === 0) { + return + } + + // If the line starts with a U+003A COLON character (:) + // Ignore the line. + const colonPosition = line.indexOf(COLON); + if (colonPosition === 0) { + return + } + + let field = ''; + let value = ''; + + // If the line contains a U+003A COLON character (:) + if (colonPosition !== -1) { + // Collect the characters on the line before the first U+003A COLON + // character (:), and let field be that string. + // TODO: Investigate if there is a more performant way to extract the + // field + // see: https://github.com/nodejs/undici/issues/2630 + field = line.subarray(0, colonPosition).toString('utf8'); + + // Collect the characters on the line after the first U+003A COLON + // character (:), and let value be that string. + // If value starts with a U+0020 SPACE character, remove it from value. + let valueStart = colonPosition + 1; + if (line[valueStart] === SPACE) { + ++valueStart; + } + // TODO: Investigate if there is a more performant way to extract the + // value + // see: https://github.com/nodejs/undici/issues/2630 + value = line.subarray(valueStart).toString('utf8'); + + // Otherwise, the string is not empty but does not contain a U+003A COLON + // character (:) + } else { + // Process the field using the steps described below, using the whole + // line as the field name, and the empty string as the field value. + field = line.toString('utf8'); + value = ''; + } + + // Modify the event with the field name and value. The value is also + // decoded as UTF-8 + switch (field) { + case 'data': + if (event[field] === undefined) { + event[field] = value; + } else { + event[field] += `\n${value}`; + } + break + case 'retry': + if (isASCIINumber(value)) { + event[field] = value; + } + break + case 'id': + if (isValidLastEventId(value)) { + event[field] = value; + } + break + case 'event': + if (value.length > 0) { + event[field] = value; + } + break + } + } + + /** + * @param {EventSourceStreamEvent} event + */ + processEvent (event) { + if (event.retry && isASCIINumber(event.retry)) { + this.state.reconnectionTime = parseInt(event.retry, 10); + } + + if (event.id && isValidLastEventId(event.id)) { + this.state.lastEventId = event.id; + } + + // only dispatch event, when data is provided + if (event.data !== undefined) { + this.push({ + type: event.event || 'message', + options: { + data: event.data, + lastEventId: this.state.lastEventId, + origin: this.state.origin + } + }); + } + } + + clearEvent () { + this.event = { + data: undefined, + event: undefined, + id: undefined, + retry: undefined + }; + } + } + + eventsourceStream$1 = { + EventSourceStream + }; + return eventsourceStream$1; +} + +var eventsource$1; +var hasRequiredEventsource$1; + +function requireEventsource$1 () { + if (hasRequiredEventsource$1) return eventsource$1; + hasRequiredEventsource$1 = 1; + + const { pipeline } = require$$0$8; + const { fetching } = requireFetch$1(); + const { makeRequest } = requireRequest$2(); + const { webidl } = requireWebidl$1(); + const { EventSourceStream } = requireEventsourceStream$1(); + const { parseMIMEType } = requireDataUrl$1(); + const { createFastMessageEvent } = requireEvents$1(); + const { isNetworkError } = requireResponse$2(); + const { delay } = requireUtil$a(); + const { kEnumerableProperty } = requireUtil$h(); + const { environmentSettingsObject } = requireUtil$g(); + + let experimentalWarned = false; + + /** + * A reconnection time, in milliseconds. This must initially be an implementation-defined value, + * probably in the region of a few seconds. + * + * In Comparison: + * - Chrome uses 3000ms. + * - Deno uses 5000ms. + * + * @type {3000} + */ + const defaultReconnectionTime = 3000; + + /** + * The readyState attribute represents the state of the connection. + * @enum + * @readonly + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev + */ + + /** + * The connection has not yet been established, or it was closed and the user + * agent is reconnecting. + * @type {0} + */ + const CONNECTING = 0; + + /** + * The user agent has an open connection and is dispatching events as it + * receives them. + * @type {1} + */ + const OPEN = 1; + + /** + * The connection is not open, and the user agent is not trying to reconnect. + * @type {2} + */ + const CLOSED = 2; + + /** + * Requests for the element will have their mode set to "cors" and their credentials mode set to "same-origin". + * @type {'anonymous'} + */ + const ANONYMOUS = 'anonymous'; + + /** + * Requests for the element will have their mode set to "cors" and their credentials mode set to "include". + * @type {'use-credentials'} + */ + const USE_CREDENTIALS = 'use-credentials'; + + /** + * The EventSource interface is used to receive server-sent events. It + * connects to a server over HTTP and receives events in text/event-stream + * format without closing the connection. + * @extends {EventTarget} + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events + * @api public + */ + class EventSource extends EventTarget { + #events = { + open: null, + error: null, + message: null + } + + #url = null + #withCredentials = false + + #readyState = CONNECTING + + #request = null + #controller = null + + #dispatcher + + /** + * @type {import('./eventsource-stream').eventSourceSettings} + */ + #state + + /** + * Creates a new EventSource object. + * @param {string} url + * @param {EventSourceInit} [eventSourceInitDict] + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface + */ + constructor (url, eventSourceInitDict = {}) { + // 1. Let ev be a new EventSource object. + super(); + + webidl.util.markAsUncloneable(this); + + const prefix = 'EventSource constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning('EventSource is experimental, expect them to change at any time.', { + code: 'UNDICI-ES' + }); + } + + url = webidl.converters.USVString(url, prefix, 'url'); + eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict'); + + this.#dispatcher = eventSourceInitDict.dispatcher; + this.#state = { + lastEventId: '', + reconnectionTime: defaultReconnectionTime + }; + + // 2. Let settings be ev's relevant settings object. + // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object + const settings = environmentSettingsObject; + + let urlRecord; + + try { + // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings. + urlRecord = new URL(url, settings.settingsObject.baseUrl); + this.#state.origin = urlRecord.origin; + } catch (e) { + // 4. If urlRecord is failure, then throw a "SyntaxError" DOMException. + throw new DOMException(e, 'SyntaxError') + } + + // 5. Set ev's url to urlRecord. + this.#url = urlRecord.href; + + // 6. Let corsAttributeState be Anonymous. + let corsAttributeState = ANONYMOUS; + + // 7. If the value of eventSourceInitDict's withCredentials member is true, + // then set corsAttributeState to Use Credentials and set ev's + // withCredentials attribute to true. + if (eventSourceInitDict.withCredentials) { + corsAttributeState = USE_CREDENTIALS; + this.#withCredentials = true; + } + + // 8. Let request be the result of creating a potential-CORS request given + // urlRecord, the empty string, and corsAttributeState. + const initRequest = { + redirect: 'follow', + keepalive: true, + // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes + mode: 'cors', + credentials: corsAttributeState === 'anonymous' + ? 'same-origin' + : 'omit', + referrer: 'no-referrer' + }; + + // 9. Set request's client to settings. + initRequest.client = environmentSettingsObject.settingsObject; + + // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list. + initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]; + + // 11. Set request's cache mode to "no-store". + initRequest.cache = 'no-store'; + + // 12. Set request's initiator type to "other". + initRequest.initiator = 'other'; + + initRequest.urlList = [new URL(this.#url)]; + + // 13. Set ev's request to request. + this.#request = makeRequest(initRequest); + + this.#connect(); + } + + /** + * Returns the state of this EventSource object's connection. It can have the + * values described below. + * @returns {0|1|2} + * @readonly + */ + get readyState () { + return this.#readyState + } + + /** + * Returns the URL providing the event stream. + * @readonly + * @returns {string} + */ + get url () { + return this.#url + } + + /** + * Returns a boolean indicating whether the EventSource object was + * instantiated with CORS credentials set (true), or not (false, the default). + */ + get withCredentials () { + return this.#withCredentials + } + + #connect () { + if (this.#readyState === CLOSED) return + + this.#readyState = CONNECTING; + + const fetchParams = { + request: this.#request, + dispatcher: this.#dispatcher + }; + + // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection. + const processEventSourceEndOfBody = (response) => { + if (isNetworkError(response)) { + this.dispatchEvent(new Event('error')); + this.close(); + } + + this.#reconnect(); + }; + + // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody... + fetchParams.processResponseEndOfBody = processEventSourceEndOfBody; + + // and processResponse set to the following steps given response res: + fetchParams.processResponse = (response) => { + // 1. If res is an aborted network error, then fail the connection. + + if (isNetworkError(response)) { + // 1. When a user agent is to fail the connection, the user agent + // must queue a task which, if the readyState attribute is set to a + // value other than CLOSED, sets the readyState attribute to CLOSED + // and fires an event named error at the EventSource object. Once the + // user agent has failed the connection, it does not attempt to + // reconnect. + if (response.aborted) { + this.close(); + this.dispatchEvent(new Event('error')); + return + // 2. Otherwise, if res is a network error, then reestablish the + // connection, unless the user agent knows that to be futile, in + // which case the user agent may fail the connection. + } else { + this.#reconnect(); + return + } + } + + // 3. Otherwise, if res's status is not 200, or if res's `Content-Type` + // is not `text/event-stream`, then fail the connection. + const contentType = response.headersList.get('content-type', true); + const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'; + const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'; + if ( + response.status !== 200 || + contentTypeValid === false + ) { + this.close(); + this.dispatchEvent(new Event('error')); + return + } + + // 4. Otherwise, announce the connection and interpret res's body + // line by line. + + // When a user agent is to announce the connection, the user agent + // must queue a task which, if the readyState attribute is set to a + // value other than CLOSED, sets the readyState attribute to OPEN + // and fires an event named open at the EventSource object. + // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + this.#readyState = OPEN; + this.dispatchEvent(new Event('open')); + + // If redirected to a different origin, set the origin to the new origin. + this.#state.origin = response.urlList[response.urlList.length - 1].origin; + + const eventSourceStream = new EventSourceStream({ + eventSourceSettings: this.#state, + push: (event) => { + this.dispatchEvent(createFastMessageEvent( + event.type, + event.options + )); + } + }); + + pipeline(response.body.stream, + eventSourceStream, + (error) => { + if ( + error?.aborted === false + ) { + this.close(); + this.dispatchEvent(new Event('error')); + } + }); + }; + + this.#controller = fetching(fetchParams); + } + + /** + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + * @returns {Promise} + */ + async #reconnect () { + // When a user agent is to reestablish the connection, the user agent must + // run the following steps. These steps are run in parallel, not as part of + // a task. (The tasks that it queues, of course, are run like normal tasks + // and not themselves in parallel.) + + // 1. Queue a task to run the following steps: + + // 1. If the readyState attribute is set to CLOSED, abort the task. + if (this.#readyState === CLOSED) return + + // 2. Set the readyState attribute to CONNECTING. + this.#readyState = CONNECTING; + + // 3. Fire an event named error at the EventSource object. + this.dispatchEvent(new Event('error')); + + // 2. Wait a delay equal to the reconnection time of the event source. + await delay(this.#state.reconnectionTime); + + // 5. Queue a task to run the following steps: + + // 1. If the EventSource object's readyState attribute is not set to + // CONNECTING, then return. + if (this.#readyState !== CONNECTING) return + + // 2. Let request be the EventSource object's request. + // 3. If the EventSource object's last event ID string is not the empty + // string, then: + // 1. Let lastEventIDValue be the EventSource object's last event ID + // string, encoded as UTF-8. + // 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header + // list. + if (this.#state.lastEventId.length) { + this.#request.headersList.set('last-event-id', this.#state.lastEventId, true); + } + + // 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section. + this.#connect(); + } + + /** + * Closes the connection, if any, and sets the readyState attribute to + * CLOSED. + */ + close () { + webidl.brandCheck(this, EventSource); + + if (this.#readyState === CLOSED) return + this.#readyState = CLOSED; + this.#controller.abort(); + this.#request = null; + } + + get onopen () { + return this.#events.open + } + + set onopen (fn) { + if (this.#events.open) { + this.removeEventListener('open', this.#events.open); + } + + if (typeof fn === 'function') { + this.#events.open = fn; + this.addEventListener('open', fn); + } else { + this.#events.open = null; + } + } + + get onmessage () { + return this.#events.message + } + + set onmessage (fn) { + if (this.#events.message) { + this.removeEventListener('message', this.#events.message); + } + + if (typeof fn === 'function') { + this.#events.message = fn; + this.addEventListener('message', fn); + } else { + this.#events.message = null; + } + } + + get onerror () { + return this.#events.error + } + + set onerror (fn) { + if (this.#events.error) { + this.removeEventListener('error', this.#events.error); + } + + if (typeof fn === 'function') { + this.#events.error = fn; + this.addEventListener('error', fn); + } else { + this.#events.error = null; + } + } + } + + const constantsPropertyDescriptors = { + CONNECTING: { + __proto__: null, + configurable: false, + enumerable: true, + value: CONNECTING, + writable: false + }, + OPEN: { + __proto__: null, + configurable: false, + enumerable: true, + value: OPEN, + writable: false + }, + CLOSED: { + __proto__: null, + configurable: false, + enumerable: true, + value: CLOSED, + writable: false + } + }; + + Object.defineProperties(EventSource, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors); + + Object.defineProperties(EventSource.prototype, { + close: kEnumerableProperty, + onerror: kEnumerableProperty, + onmessage: kEnumerableProperty, + onopen: kEnumerableProperty, + readyState: kEnumerableProperty, + url: kEnumerableProperty, + withCredentials: kEnumerableProperty + }); + + webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ + { + key: 'withCredentials', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'dispatcher', // undici only + converter: webidl.converters.any + } + ]); + + eventsource$1 = { + EventSource, + defaultReconnectionTime + }; + return eventsource$1; +} + +var hasRequiredUndici$1; + +function requireUndici$1 () { + if (hasRequiredUndici$1) return undici$1; + hasRequiredUndici$1 = 1; + + const Client = requireClient$1(); + const Dispatcher = requireDispatcher$1(); + const Pool = requirePool$1(); + const BalancedPool = requireBalancedPool$1(); + const Agent = requireAgent$1(); + const ProxyAgent = requireProxyAgent$1(); + const EnvHttpProxyAgent = requireEnvHttpProxyAgent$1(); + const RetryAgent = requireRetryAgent$1(); + const errors = requireErrors$2(); + const util = requireUtil$h(); + const { InvalidArgumentError } = errors; + const api = requireApi$1(); + const buildConnector = requireConnect$1(); + const MockClient = requireMockClient$1(); + const MockAgent = requireMockAgent$1(); + const MockPool = requireMockPool$1(); + const mockErrors = requireMockErrors$1(); + const RetryHandler = requireRetryHandler$1(); + const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal$2(); + const DecoratorHandler = requireDecoratorHandler$1(); + const RedirectHandler = requireRedirectHandler$1(); + const createRedirectInterceptor = requireRedirectInterceptor$1(); + + Object.assign(Dispatcher.prototype, api); + + undici$1.Dispatcher = Dispatcher; + undici$1.Client = Client; + undici$1.Pool = Pool; + undici$1.BalancedPool = BalancedPool; + undici$1.Agent = Agent; + undici$1.ProxyAgent = ProxyAgent; + undici$1.EnvHttpProxyAgent = EnvHttpProxyAgent; + undici$1.RetryAgent = RetryAgent; + undici$1.RetryHandler = RetryHandler; + + undici$1.DecoratorHandler = DecoratorHandler; + undici$1.RedirectHandler = RedirectHandler; + undici$1.createRedirectInterceptor = createRedirectInterceptor; + undici$1.interceptors = { + redirect: requireRedirect$1(), + retry: requireRetry$1(), + dump: requireDump$1(), + dns: requireDns$1() + }; + + undici$1.buildConnector = buildConnector; + undici$1.errors = errors; + undici$1.util = { + parseHeaders: util.parseHeaders, + headerNameToString: util.headerNameToString + }; function makeDispatcher (fn) { return (url, opts, handler) => { @@ -24440,86 +28048,82 @@ function requireUndici () { } } - undici.setGlobalDispatcher = setGlobalDispatcher; - undici.getGlobalDispatcher = getGlobalDispatcher; + undici$1.setGlobalDispatcher = setGlobalDispatcher; + undici$1.getGlobalDispatcher = getGlobalDispatcher; - if (util.nodeMajor > 16 || (util.nodeMajor === 16 && util.nodeMinor >= 8)) { - let fetchImpl = null; - undici.fetch = async function fetch (resource) { - if (!fetchImpl) { - fetchImpl = requireFetch().fetch; + const fetchImpl = requireFetch$1().fetch; + undici$1.fetch = async function fetch (init, options = undefined) { + try { + return await fetchImpl(init, options) + } catch (err) { + if (err && typeof err === 'object') { + Error.captureStackTrace(err); } - try { - return await fetchImpl(...arguments) - } catch (err) { - if (typeof err === 'object') { - Error.captureStackTrace(err, this); - } + throw err + } + }; + undici$1.Headers = requireHeaders$1().Headers; + undici$1.Response = requireResponse$2().Response; + undici$1.Request = requireRequest$2().Request; + undici$1.FormData = requireFormdata$1().FormData; + undici$1.File = globalThis.File ?? require$$0$6.File; + undici$1.FileReader = requireFilereader$1().FileReader; - throw err - } - }; - undici.Headers = requireHeaders().Headers; - undici.Response = requireResponse$1().Response; - undici.Request = requireRequest().Request; - undici.FormData = requireFormdata().FormData; - undici.File = requireFile$1().File; - undici.FileReader = requireFilereader().FileReader; + const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$3(); - const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$1(); + undici$1.setGlobalOrigin = setGlobalOrigin; + undici$1.getGlobalOrigin = getGlobalOrigin; - undici.setGlobalOrigin = setGlobalOrigin; - undici.getGlobalOrigin = getGlobalOrigin; + const { CacheStorage } = requireCachestorage$1(); + const { kConstruct } = requireSymbols$6(); - const { CacheStorage } = requireCachestorage(); - const { kConstruct } = requireSymbols$1(); + // Cache & CacheStorage are tightly coupled with fetch. Even if it may run + // in an older version of Node, it doesn't have any use without fetch. + undici$1.caches = new CacheStorage(kConstruct); - // Cache & CacheStorage are tightly coupled with fetch. Even if it may run - // in an older version of Node, it doesn't have any use without fetch. - undici.caches = new CacheStorage(kConstruct); - } + const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies$1(); - if (util.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies(); + undici$1.deleteCookie = deleteCookie; + undici$1.getCookies = getCookies; + undici$1.getSetCookies = getSetCookies; + undici$1.setCookie = setCookie; - undici.deleteCookie = deleteCookie; - undici.getCookies = getCookies; - undici.getSetCookies = getSetCookies; - undici.setCookie = setCookie; + const { parseMIMEType, serializeAMimeType } = requireDataUrl$1(); - const { parseMIMEType, serializeAMimeType } = requireDataURL(); + undici$1.parseMIMEType = parseMIMEType; + undici$1.serializeAMimeType = serializeAMimeType; - undici.parseMIMEType = parseMIMEType; - undici.serializeAMimeType = serializeAMimeType; - } + const { CloseEvent, ErrorEvent, MessageEvent } = requireEvents$1(); + undici$1.WebSocket = requireWebsocket$1().WebSocket; + undici$1.CloseEvent = CloseEvent; + undici$1.ErrorEvent = ErrorEvent; + undici$1.MessageEvent = MessageEvent; - if (util.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = requireWebsocket(); + undici$1.request = makeDispatcher(api.request); + undici$1.stream = makeDispatcher(api.stream); + undici$1.pipeline = makeDispatcher(api.pipeline); + undici$1.connect = makeDispatcher(api.connect); + undici$1.upgrade = makeDispatcher(api.upgrade); - undici.WebSocket = WebSocket; - } + undici$1.MockClient = MockClient; + undici$1.MockPool = MockPool; + undici$1.MockAgent = MockAgent; + undici$1.mockErrors = mockErrors; - undici.request = makeDispatcher(api.request); - undici.stream = makeDispatcher(api.stream); - undici.pipeline = makeDispatcher(api.pipeline); - undici.connect = makeDispatcher(api.connect); - undici.upgrade = makeDispatcher(api.upgrade); + const { EventSource } = requireEventsource$1(); - undici.MockClient = MockClient; - undici.MockPool = MockPool; - undici.MockAgent = MockAgent; - undici.mockErrors = mockErrors; - return undici; + undici$1.EventSource = EventSource; + return undici$1; } -var hasRequiredLib$3; +var hasRequiredLib; -function requireLib$3 () { - if (hasRequiredLib$3) return lib$3; - hasRequiredLib$3 = 1; +function requireLib () { + if (hasRequiredLib) return lib; + hasRequiredLib = 1; /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (lib$3 && lib$3.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (lib && lib.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -24530,12 +28134,12 @@ function requireLib$3 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (lib$3 && lib$3.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (lib && lib.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (lib$3 && lib$3.__importStar) || (function () { + var __importStar = (lib && lib.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -24552,7 +28156,7 @@ function requireLib$3 () { return result; }; })(); - var __awaiter = (lib$3 && lib$3.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (lib && lib.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -24561,15 +28165,15 @@ function requireLib$3 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(lib$3, "__esModule", { value: true }); - lib$3.HttpClient = lib$3.HttpClientResponse = lib$3.HttpClientError = lib$3.MediaTypes = lib$3.Headers = lib$3.HttpCodes = void 0; - lib$3.getProxyUrl = getProxyUrl; - lib$3.isHttps = isHttps; - const http = __importStar(require$$0$7); + Object.defineProperty(lib, "__esModule", { value: true }); + lib.HttpClient = lib.HttpClientResponse = lib.HttpClientError = lib.MediaTypes = lib.Headers = lib.HttpCodes = void 0; + lib.getProxyUrl = getProxyUrl; + lib.isHttps = isHttps; + const http = __importStar(require$$0$4); const https = __importStar(require$$1$2); - const pm = __importStar(requireProxy$3()); + const pm = __importStar(requireProxy()); const tunnel = __importStar(requireTunnel()); - const undici_1 = requireUndici(); + const undici_1 = requireUndici$1(); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -24599,16 +28203,16 @@ function requireLib$3 () { HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib$3.HttpCodes = HttpCodes = {})); + })(HttpCodes || (lib.HttpCodes = HttpCodes = {})); var Headers; (function (Headers) { Headers["Accept"] = "accept"; Headers["ContentType"] = "content-type"; - })(Headers || (lib$3.Headers = Headers = {})); + })(Headers || (lib.Headers = Headers = {})); var MediaTypes; (function (MediaTypes) { MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib$3.MediaTypes = MediaTypes = {})); + })(MediaTypes || (lib.MediaTypes = MediaTypes = {})); /** * Returns the proxy URL, depending upon the supplied url and proxy environment variables. * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com @@ -24640,7 +28244,7 @@ function requireLib$3 () { Object.setPrototypeOf(this, HttpClientError.prototype); } } - lib$3.HttpClientError = HttpClientError; + lib.HttpClientError = HttpClientError; class HttpClientResponse { constructor(message) { this.message = message; @@ -24672,7 +28276,7 @@ function requireLib$3 () { }); } } - lib$3.HttpClientResponse = HttpClientResponse; + lib.HttpClientResponse = HttpClientResponse; function isHttps(requestUrl) { const parsedUrl = new URL(requestUrl); return parsedUrl.protocol === 'https:'; @@ -24687,7 +28291,7 @@ function requireLib$3 () { this._maxRetries = 1; this._keepAlive = false; this._disposed = false; - this.userAgent = userAgent; + this.userAgent = this._getUserAgentWithOrchestrationId(userAgent); this.handlers = handlers || []; this.requestOptions = requestOptions; if (requestOptions) { @@ -25167,6 +28771,17 @@ function requireLib$3 () { } return proxyAgent; } + _getUserAgentWithOrchestrationId(userAgent) { + const baseUserAgent = userAgent || 'actions/http-client'; + const orchId = process.env['ACTIONS_ORCHESTRATION_ID']; + if (orchId) { + // Sanitize the orchestration ID to ensure it contains only valid characters + // Valid characters: 0-9, a-z, _, -, . + const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, '_'); + return `${baseUserAgent} actions_orchestration_id/${sanitizedId}`; + } + return baseUserAgent; + } _performExponentialBackoff(retryNumber) { return __awaiter(this, void 0, void 0, function* () { retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); @@ -25240,20 +28855,20 @@ function requireLib$3 () { }); } } - lib$3.HttpClient = HttpClient; + lib.HttpClient = HttpClient; const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - return lib$3; + return lib; } -var auth$3 = {}; +var auth$1 = {}; -var hasRequiredAuth$2; +var hasRequiredAuth; -function requireAuth$2 () { - if (hasRequiredAuth$2) return auth$3; - hasRequiredAuth$2 = 1; - var __awaiter = (auth$3 && auth$3.__awaiter) || function (thisArg, _arguments, P, generator) { +function requireAuth () { + if (hasRequiredAuth) return auth$1; + hasRequiredAuth = 1; + var __awaiter = (auth$1 && auth$1.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25262,8 +28877,8 @@ function requireAuth$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(auth$3, "__esModule", { value: true }); - auth$3.PersonalAccessTokenCredentialHandler = auth$3.BearerCredentialHandler = auth$3.BasicCredentialHandler = void 0; + Object.defineProperty(auth$1, "__esModule", { value: true }); + auth$1.PersonalAccessTokenCredentialHandler = auth$1.BearerCredentialHandler = auth$1.BasicCredentialHandler = void 0; class BasicCredentialHandler { constructor(username, password) { this.username = username; @@ -25285,7 +28900,7 @@ function requireAuth$2 () { }); } } - auth$3.BasicCredentialHandler = BasicCredentialHandler; + auth$1.BasicCredentialHandler = BasicCredentialHandler; class BearerCredentialHandler { constructor(token) { this.token = token; @@ -25308,7 +28923,7 @@ function requireAuth$2 () { }); } } - auth$3.BearerCredentialHandler = BearerCredentialHandler; + auth$1.BearerCredentialHandler = BearerCredentialHandler; class PersonalAccessTokenCredentialHandler { constructor(token) { this.token = token; @@ -25331,17 +28946,17 @@ function requireAuth$2 () { }); } } - auth$3.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; + auth$1.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - return auth$3; + return auth$1; } -var hasRequiredOidcUtils$2; +var hasRequiredOidcUtils; -function requireOidcUtils$2 () { - if (hasRequiredOidcUtils$2) return oidcUtils$2; - hasRequiredOidcUtils$2 = 1; - var __awaiter = (oidcUtils$2 && oidcUtils$2.__awaiter) || function (thisArg, _arguments, P, generator) { +function requireOidcUtils () { + if (hasRequiredOidcUtils) return oidcUtils; + hasRequiredOidcUtils = 1; + var __awaiter = (oidcUtils && oidcUtils.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25350,11 +28965,11 @@ function requireOidcUtils$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(oidcUtils$2, "__esModule", { value: true }); - oidcUtils$2.OidcClient = void 0; - const http_client_1 = requireLib$3(); - const auth_1 = requireAuth$2(); - const core_1 = requireCore$2(); + Object.defineProperty(oidcUtils, "__esModule", { value: true }); + oidcUtils.OidcClient = void 0; + const http_client_1 = requireLib(); + const auth_1 = requireAuth(); + const core_1 = requireCore(); class OidcClient { static createHttpClient(allowRetry = true, maxRetry = 10) { const requestOptions = { @@ -25415,20 +29030,20 @@ function requireOidcUtils$2 () { }); } } - oidcUtils$2.OidcClient = OidcClient; + oidcUtils.OidcClient = OidcClient; - return oidcUtils$2; + return oidcUtils; } -var summary$2 = {}; +var summary = {}; -var hasRequiredSummary$2; +var hasRequiredSummary; -function requireSummary$2 () { - if (hasRequiredSummary$2) return summary$2; - hasRequiredSummary$2 = 1; +function requireSummary () { + if (hasRequiredSummary) return summary; + hasRequiredSummary = 1; (function (exports$1) { - var __awaiter = (summary$2 && summary$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (summary && summary.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -25439,7 +29054,7 @@ function requireSummary$2 () { }; Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; - const os_1 = require$$0$5; + const os_1 = os; const fs_1 = fs__default; const { access, appendFile, writeFile } = fs_1.promises; exports$1.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; @@ -25710,18 +29325,18 @@ function requireSummary$2 () { exports$1.markdownSummary = _summary; exports$1.summary = _summary; - } (summary$2)); - return summary$2; + } (summary)); + return summary; } -var pathUtils$2 = {}; +var pathUtils = {}; -var hasRequiredPathUtils$2; +var hasRequiredPathUtils; -function requirePathUtils$2 () { - if (hasRequiredPathUtils$2) return pathUtils$2; - hasRequiredPathUtils$2 = 1; - var __createBinding = (pathUtils$2 && pathUtils$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requirePathUtils () { + if (hasRequiredPathUtils) return pathUtils; + hasRequiredPathUtils = 1; + var __createBinding = (pathUtils && pathUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -25732,12 +29347,12 @@ function requirePathUtils$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (pathUtils$2 && pathUtils$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (pathUtils && pathUtils.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (pathUtils$2 && pathUtils$2.__importStar) || (function () { + var __importStar = (pathUtils && pathUtils.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -25754,10 +29369,10 @@ function requirePathUtils$2 () { return result; }; })(); - Object.defineProperty(pathUtils$2, "__esModule", { value: true }); - pathUtils$2.toPosixPath = toPosixPath; - pathUtils$2.toWin32Path = toWin32Path; - pathUtils$2.toPlatformPath = toPlatformPath; + Object.defineProperty(pathUtils, "__esModule", { value: true }); + pathUtils.toPosixPath = toPosixPath; + pathUtils.toWin32Path = toWin32Path; + pathUtils.toPlatformPath = toPlatformPath; const path = __importStar(require$$1__default); /** * toPosixPath converts the given path to the posix form. On Windows, \\ will be @@ -25791,26 +29406,26 @@ function requirePathUtils$2 () { return pth.replace(/[/\\]/g, path.sep); } - return pathUtils$2; + return pathUtils; } -var platform$2 = {}; +var platform = {}; -var exec$3 = {}; +var exec$1 = {}; -var toolrunner$2 = {}; +var toolrunner = {}; -var io$2 = {}; +var io = {}; -var ioUtil$2 = {}; +var ioUtil = {}; -var hasRequiredIoUtil$2; +var hasRequiredIoUtil; -function requireIoUtil$2 () { - if (hasRequiredIoUtil$2) return ioUtil$2; - hasRequiredIoUtil$2 = 1; +function requireIoUtil () { + if (hasRequiredIoUtil) return ioUtil; + hasRequiredIoUtil = 1; (function (exports$1) { - var __createBinding = (ioUtil$2 && ioUtil$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (ioUtil && ioUtil.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -25821,12 +29436,12 @@ function requireIoUtil$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (ioUtil$2 && ioUtil$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (ioUtil && ioUtil.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (ioUtil$2 && ioUtil$2.__importStar) || (function () { + var __importStar = (ioUtil && ioUtil.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -25843,7 +29458,7 @@ function requireIoUtil$2 () { return result; }; })(); - var __awaiter = (ioUtil$2 && ioUtil$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (ioUtil && ioUtil.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -26033,16 +29648,16 @@ function requireIoUtil$2 () { return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; } - } (ioUtil$2)); - return ioUtil$2; + } (ioUtil)); + return ioUtil; } -var hasRequiredIo$2; +var hasRequiredIo; -function requireIo$2 () { - if (hasRequiredIo$2) return io$2; - hasRequiredIo$2 = 1; - var __createBinding = (io$2 && io$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireIo () { + if (hasRequiredIo) return io; + hasRequiredIo = 1; + var __createBinding = (io && io.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -26053,12 +29668,12 @@ function requireIo$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (io$2 && io$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (io && io.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (io$2 && io$2.__importStar) || (function () { + var __importStar = (io && io.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -26075,7 +29690,7 @@ function requireIo$2 () { return result; }; })(); - var __awaiter = (io$2 && io$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (io && io.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -26084,16 +29699,16 @@ function requireIo$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(io$2, "__esModule", { value: true }); - io$2.cp = cp; - io$2.mv = mv; - io$2.rmRF = rmRF; - io$2.mkdirP = mkdirP; - io$2.which = which; - io$2.findInPath = findInPath; - const assert_1 = require$$0$8; + Object.defineProperty(io, "__esModule", { value: true }); + io.cp = cp; + io.mv = mv; + io.rmRF = rmRF; + io.mkdirP = mkdirP; + io.which = which; + io.findInPath = findInPath; + const assert_1 = require$$2$1; const path = __importStar(require$$1__default); - const ioUtil = __importStar(requireIoUtil$2()); + const ioUtil = __importStar(requireIoUtil()); /** * Copies a file or folder. * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js @@ -26353,15 +29968,15 @@ function requireIo$2 () { }); } - return io$2; + return io; } -var hasRequiredToolrunner$2; +var hasRequiredToolrunner; -function requireToolrunner$2 () { - if (hasRequiredToolrunner$2) return toolrunner$2; - hasRequiredToolrunner$2 = 1; - var __createBinding = (toolrunner$2 && toolrunner$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireToolrunner () { + if (hasRequiredToolrunner) return toolrunner; + hasRequiredToolrunner = 1; + var __createBinding = (toolrunner && toolrunner.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -26372,12 +29987,12 @@ function requireToolrunner$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (toolrunner$2 && toolrunner$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (toolrunner && toolrunner.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (toolrunner$2 && toolrunner$2.__importStar) || (function () { + var __importStar = (toolrunner && toolrunner.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -26394,7 +30009,7 @@ function requireToolrunner$2 () { return result; }; })(); - var __awaiter = (toolrunner$2 && toolrunner$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (toolrunner && toolrunner.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -26403,16 +30018,16 @@ function requireToolrunner$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(toolrunner$2, "__esModule", { value: true }); - toolrunner$2.ToolRunner = void 0; - toolrunner$2.argStringToArray = argStringToArray; - const os = __importStar(require$$0$5); - const events = __importStar(require$$1$3); + Object.defineProperty(toolrunner, "__esModule", { value: true }); + toolrunner.ToolRunner = void 0; + toolrunner.argStringToArray = argStringToArray; + const os$1 = __importStar(os); + const events = __importStar(require$$0$5); const child = __importStar(require$$2$2); const path = __importStar(require$$1__default); - const io = __importStar(requireIo$2()); - const ioUtil = __importStar(requireIoUtil$2()); - const timers_1 = require$$6; + const io = __importStar(requireIo()); + const ioUtil = __importStar(requireIoUtil()); + const timers_1 = require$$6$1; /* eslint-disable @typescript-eslint/unbound-method */ const IS_WINDOWS = process.platform === 'win32'; /* @@ -26474,13 +30089,13 @@ function requireToolrunner$2 () { _processLineBuffer(data, strBuffer, onLine) { try { let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); + let n = s.indexOf(os$1.EOL); while (n > -1) { const line = s.substring(0, n); onLine(line); // the rest of the string ... - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); + s = s.substring(n + os$1.EOL.length); + n = s.indexOf(os$1.EOL); } return s; } @@ -26771,7 +30386,7 @@ function requireToolrunner$2 () { } const optionsNonNull = this._cloneExecOptions(this.options); if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os$1.EOL); } const state = new ExecState(optionsNonNull, this.toolPath); state.on('debug', (message) => { @@ -26864,7 +30479,7 @@ function requireToolrunner$2 () { }); } } - toolrunner$2.ToolRunner = ToolRunner; + toolrunner.ToolRunner = ToolRunner; /** * Convert an arg string to an array of args. Handles escaping * @@ -26985,15 +30600,15 @@ function requireToolrunner$2 () { } } - return toolrunner$2; + return toolrunner; } -var hasRequiredExec$2; +var hasRequiredExec; -function requireExec$2 () { - if (hasRequiredExec$2) return exec$3; - hasRequiredExec$2 = 1; - var __createBinding = (exec$3 && exec$3.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireExec () { + if (hasRequiredExec) return exec$1; + hasRequiredExec = 1; + var __createBinding = (exec$1 && exec$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27004,12 +30619,12 @@ function requireExec$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (exec$3 && exec$3.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (exec$1 && exec$1.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (exec$3 && exec$3.__importStar) || (function () { + var __importStar = (exec$1 && exec$1.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -27026,7 +30641,7 @@ function requireExec$2 () { return result; }; })(); - var __awaiter = (exec$3 && exec$3.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (exec$1 && exec$1.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -27035,11 +30650,11 @@ function requireExec$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(exec$3, "__esModule", { value: true }); - exec$3.exec = exec; - exec$3.getExecOutput = getExecOutput; - const string_decoder_1 = require$$0$d; - const tr = __importStar(requireToolrunner$2()); + Object.defineProperty(exec$1, "__esModule", { value: true }); + exec$1.exec = exec; + exec$1.getExecOutput = getExecOutput; + const string_decoder_1 = require$$5$3; + const tr = __importStar(requireToolrunner()); /** * Exec a command. * Output will be streamed to the live console. @@ -27108,16 +30723,16 @@ function requireExec$2 () { }); } - return exec$3; + return exec$1; } -var hasRequiredPlatform$2; +var hasRequiredPlatform; -function requirePlatform$2 () { - if (hasRequiredPlatform$2) return platform$2; - hasRequiredPlatform$2 = 1; +function requirePlatform () { + if (hasRequiredPlatform) return platform; + hasRequiredPlatform = 1; (function (exports$1) { - var __createBinding = (platform$2 && platform$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (platform && platform.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27128,12 +30743,12 @@ function requirePlatform$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (platform$2 && platform$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (platform && platform.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (platform$2 && platform$2.__importStar) || (function () { + var __importStar = (platform && platform.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -27150,7 +30765,7 @@ function requirePlatform$2 () { return result; }; })(); - var __awaiter = (platform$2 && platform$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (platform && platform.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -27159,14 +30774,14 @@ function requirePlatform$2 () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - var __importDefault = (platform$2 && platform$2.__importDefault) || function (mod) { + var __importDefault = (platform && platform.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0; exports$1.getDetails = getDetails; - const os_1 = __importDefault(require$$0$5); - const exec = __importStar(requireExec$2()); + const os_1 = __importDefault(os); + const exec = __importStar(requireExec()); const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { silent: true @@ -27220,17 +30835,17 @@ function requirePlatform$2 () { }); } - } (platform$2)); - return platform$2; + } (platform)); + return platform; } -var hasRequiredCore$2; +var hasRequiredCore; -function requireCore$2 () { - if (hasRequiredCore$2) return core$2; - hasRequiredCore$2 = 1; +function requireCore () { + if (hasRequiredCore) return core; + hasRequiredCore = 1; (function (exports$1) { - var __createBinding = (core$2 && core$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { + var __createBinding = (core && core.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { @@ -27241,12 +30856,12 @@ function requireCore$2 () { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (core$2 && core$2.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (core && core.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (core$2 && core$2.__importStar) || (function () { + var __importStar = (core && core.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; @@ -27263,7 +30878,7 @@ function requireCore$2 () { return result; }; })(); - var __awaiter = (core$2 && core$2.__awaiter) || function (thisArg, _arguments, P, generator) { + var __awaiter = (core && core.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -27295,12 +30910,12 @@ function requireCore$2 () { exports$1.saveState = saveState; exports$1.getState = getState; exports$1.getIDToken = getIDToken; - const command_1 = requireCommand$2(); - const file_command_1 = requireFileCommand$2(); - const utils_1 = requireUtils$7(); - const os = __importStar(require$$0$5); + const command_1 = requireCommand(); + const file_command_1 = requireFileCommand(); + const utils_1 = requireUtils$4(); + const os$1 = __importStar(os); const path = __importStar(require$$1__default); - const oidc_utils_1 = requireOidcUtils$2(); + const oidc_utils_1 = requireOidcUtils(); /** * The code to exit an action */ @@ -27448,7 +31063,7 @@ function requireCore$2 () { if (filePath) { return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value)); } - process.stdout.write(os.EOL); + process.stdout.write(os$1.EOL); (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value)); } /** @@ -27516,7 +31131,7 @@ function requireCore$2 () { * @param message info message */ function info(message) { - process.stdout.write(message + os.EOL); + process.stdout.write(message + os$1.EOL); } /** * Begin an output group. @@ -27589,39 +31204,39 @@ function requireCore$2 () { /** * Summary exports */ - var summary_1 = requireSummary$2(); + var summary_1 = requireSummary(); Object.defineProperty(exports$1, "summary", { enumerable: true, get: function () { return summary_1.summary; } }); /** * @deprecated use core.summary */ - var summary_2 = requireSummary$2(); + var summary_2 = requireSummary(); Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } }); /** * Path exports */ - var path_utils_1 = requirePathUtils$2(); + var path_utils_1 = requirePathUtils(); Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } }); Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } }); Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }); /** * Platform utilities exports */ - exports$1.platform = __importStar(requirePlatform$2()); + exports$1.platform = __importStar(requirePlatform()); - } (core$2)); - return core$2; + } (core)); + return core; } -var coreExports = requireCore$2(); +var coreExports = requireCore(); var re = {exports: {}}; -var constants$6; -var hasRequiredConstants$6; +var constants$b; +var hasRequiredConstants$b; -function requireConstants$6 () { - if (hasRequiredConstants$6) return constants$6; - hasRequiredConstants$6 = 1; +function requireConstants$b () { + if (hasRequiredConstants$b) return constants$b; + hasRequiredConstants$b = 1; // Note: this is the semver.org version of the spec that it implements // Not necessarily the package version of this code. @@ -27648,7 +31263,7 @@ function requireConstants$6 () { 'prerelease', ]; - constants$6 = { + constants$b = { MAX_LENGTH, MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -27658,7 +31273,7 @@ function requireConstants$6 () { FLAG_INCLUDE_PRERELEASE: 0b001, FLAG_LOOSE: 0b010, }; - return constants$6; + return constants$b; } var debug_1; @@ -27691,7 +31306,7 @@ function requireRe () { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH, - } = requireConstants$6(); + } = requireConstants$b(); const debug = requireDebug$1(); exports$1 = module.exports = {}; @@ -27982,7 +31597,7 @@ function requireSemver$3 () { hasRequiredSemver$3 = 1; const debug = requireDebug$1(); - const { MAX_LENGTH, MAX_SAFE_INTEGER } = requireConstants$6(); + const { MAX_LENGTH, MAX_SAFE_INTEGER } = requireConstants$b(); const { safeRe: re, t } = requireRe(); const parseOptions = requireParseOptions(); @@ -28316,11 +31931,11 @@ function requireSemver$3 () { } var parse_1; -var hasRequiredParse; +var hasRequiredParse$1; -function requireParse () { - if (hasRequiredParse) return parse_1; - hasRequiredParse = 1; +function requireParse$1 () { + if (hasRequiredParse$1) return parse_1; + hasRequiredParse$1 = 1; const SemVer = requireSemver$3(); const parse = (version, options, throwErrors = false) => { @@ -28348,7 +31963,7 @@ function requireValid$1 () { if (hasRequiredValid$1) return valid_1; hasRequiredValid$1 = 1; - const parse = requireParse(); + const parse = requireParse$1(); const valid = (version, options) => { const v = parse(version, options); return v ? v.version : null @@ -28364,7 +31979,7 @@ function requireClean () { if (hasRequiredClean) return clean_1; hasRequiredClean = 1; - const parse = requireParse(); + const parse = requireParse$1(); const clean = (version, options) => { const s = parse(version.trim().replace(/^[=v]+/, ''), options); return s ? s.version : null @@ -28409,7 +32024,7 @@ function requireDiff () { if (hasRequiredDiff) return diff_1; hasRequiredDiff = 1; - const parse = requireParse(); + const parse = requireParse$1(); const diff = (version1, version2) => { const v1 = parse(version1, null, true); @@ -28516,7 +32131,7 @@ function requirePrerelease () { if (hasRequiredPrerelease) return prerelease_1; hasRequiredPrerelease = 1; - const parse = requireParse(); + const parse = requireParse$1(); const prerelease = (version, options) => { const parsed = parse(version, options); return (parsed && parsed.prerelease.length) ? parsed.prerelease : null @@ -28757,7 +32372,7 @@ function requireCoerce () { hasRequiredCoerce = 1; const SemVer = requireSemver$3(); - const parse = requireParse(); + const parse = requireParse$1(); const { safeRe: re, t } = requireRe(); const coerce = (version, options) => { @@ -29104,7 +32719,7 @@ function requireRange$1 () { tildeTrimReplace, caretTrimReplace, } = requireRe(); - const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants$6(); + const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants$b(); const isNullSet = c => c.value === '<0.0.0-0'; const isAny = c => c.value === ''; @@ -30242,10 +33857,10 @@ function requireSemver$2 () { // just pre-load all the stuff that index.js lazily exports const internalRe = requireRe(); - const constants = requireConstants$6(); + const constants = requireConstants$b(); const SemVer = requireSemver$3(); const identifiers = requireIdentifiers(); - const parse = requireParse(); + const parse = requireParse$1(); const valid = requireValid$1(); const clean = requireClean(); const inc = requireInc(); @@ -30334,12748 +33949,32857 @@ function requireSemver$2 () { var semverExports = requireSemver$2(); -var github = {}; +class Context { + /** + * Hydrate the context from the environment + */ + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if (existsSync(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse(readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); + } + else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10); + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; + this.graphqlUrl = + (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } +} -var context = {}; +var libExports = requireLib(); -var hasRequiredContext; +var undici = {}; -function requireContext () { - if (hasRequiredContext) return context; - hasRequiredContext = 1; - Object.defineProperty(context, "__esModule", { value: true }); - context.Context = void 0; - const fs_1 = fs__default; - const os_1 = require$$0$5; - class Context { - /** - * Hydrate the context from the environment - */ - constructor() { - var _a, _b, _c; - this.payload = {}; - if (process.env.GITHUB_EVENT_PATH) { - if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) { - this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); - } - else { - const path = process.env.GITHUB_EVENT_PATH; - process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); - } - } - this.eventName = process.env.GITHUB_EVENT_NAME; - this.sha = process.env.GITHUB_SHA; - this.ref = process.env.GITHUB_REF; - this.workflow = process.env.GITHUB_WORKFLOW; - this.action = process.env.GITHUB_ACTION; - this.actor = process.env.GITHUB_ACTOR; - this.job = process.env.GITHUB_JOB; - this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10); - this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); - this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); - this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; - this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; - this.graphqlUrl = - (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; - } - get issue() { - const payload = this.payload; - return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); - } - get repo() { - if (process.env.GITHUB_REPOSITORY) { - const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); - return { owner, repo }; - } - if (this.payload.repository) { - return { - owner: this.payload.repository.owner.login, - repo: this.payload.repository.name - }; - } - throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); - } - } - context.Context = Context; - - return context; +var symbols$4; +var hasRequiredSymbols$4; + +function requireSymbols$4 () { + if (hasRequiredSymbols$4) return symbols$4; + hasRequiredSymbols$4 = 1; + symbols$4 = { + kClose: Symbol('close'), + kDestroy: Symbol('destroy'), + kDispatch: Symbol('dispatch'), + kUrl: Symbol('url'), + kWriting: Symbol('writing'), + kResuming: Symbol('resuming'), + kQueue: Symbol('queue'), + kConnect: Symbol('connect'), + kConnecting: Symbol('connecting'), + kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), + kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), + kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), + kKeepAliveTimeoutValue: Symbol('keep alive timeout'), + kKeepAlive: Symbol('keep alive'), + kHeadersTimeout: Symbol('headers timeout'), + kBodyTimeout: Symbol('body timeout'), + kServerName: Symbol('server name'), + kLocalAddress: Symbol('local address'), + kHost: Symbol('host'), + kNoRef: Symbol('no ref'), + kBodyUsed: Symbol('used'), + kBody: Symbol('abstracted request body'), + kRunning: Symbol('running'), + kBlocking: Symbol('blocking'), + kPending: Symbol('pending'), + kSize: Symbol('size'), + kBusy: Symbol('busy'), + kQueued: Symbol('queued'), + kFree: Symbol('free'), + kConnected: Symbol('connected'), + kClosed: Symbol('closed'), + kNeedDrain: Symbol('need drain'), + kReset: Symbol('reset'), + kDestroyed: Symbol.for('nodejs.stream.destroyed'), + kResume: Symbol('resume'), + kOnError: Symbol('on error'), + kMaxHeadersSize: Symbol('max headers size'), + kRunningIdx: Symbol('running index'), + kPendingIdx: Symbol('pending index'), + kError: Symbol('error'), + kClients: Symbol('clients'), + kClient: Symbol('client'), + kParser: Symbol('parser'), + kOnDestroyed: Symbol('destroy callbacks'), + kPipelining: Symbol('pipelining'), + kSocket: Symbol('socket'), + kHostHeader: Symbol('host header'), + kConnector: Symbol('connector'), + kStrictContentLength: Symbol('strict content length'), + kMaxRedirections: Symbol('maxRedirections'), + kMaxRequests: Symbol('maxRequestsPerClient'), + kProxy: Symbol('proxy agent options'), + kCounter: Symbol('socket request counter'), + kInterceptors: Symbol('dispatch interceptors'), + kMaxResponseSize: Symbol('max response size'), + kHTTP2Session: Symbol('http2Session'), + kHTTP2SessionState: Symbol('http2Session state'), + kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), + kConstruct: Symbol('constructable'), + kListeners: Symbol('listeners'), + kHTTPContext: Symbol('http context'), + kMaxConcurrentStreams: Symbol('max concurrent streams'), + kNoProxyAgent: Symbol('no proxy agent'), + kHttpProxyAgent: Symbol('http proxy agent'), + kHttpsProxyAgent: Symbol('https proxy agent') + }; + return symbols$4; } -var utils$5 = {}; +var errors$1; +var hasRequiredErrors$1; -var utils$4 = {}; +function requireErrors$1 () { + if (hasRequiredErrors$1) return errors$1; + hasRequiredErrors$1 = 1; -var lib$2 = {}; + const kUndiciError = Symbol.for('undici.error.UND_ERR'); + class UndiciError extends Error { + constructor (message) { + super(message); + this.name = 'UndiciError'; + this.code = 'UND_ERR'; + } -var proxy$2 = {}; + static [Symbol.hasInstance] (instance) { + return instance && instance[kUndiciError] === true + } -var hasRequiredProxy$2; + [kUndiciError] = true + } -function requireProxy$2 () { - if (hasRequiredProxy$2) return proxy$2; - hasRequiredProxy$2 = 1; - Object.defineProperty(proxy$2, "__esModule", { value: true }); - proxy$2.checkBypass = proxy$2.getProxyUrl = void 0; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - try { - return new DecodedURL(proxyVar); - } - catch (_a) { - if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://')) - return new DecodedURL(`http://${proxyVar}`); - } - } - else { - return undefined; - } + const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT'); + class ConnectTimeoutError extends UndiciError { + constructor (message) { + super(message); + this.name = 'ConnectTimeoutError'; + this.message = message || 'Connect Timeout Error'; + this.code = 'UND_ERR_CONNECT_TIMEOUT'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kConnectTimeoutError] === true + } + + [kConnectTimeoutError] = true } - proxy$2.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperNoProxyItem === '*' || - upperReqHosts.some(x => x === upperNoProxyItem || - x.endsWith(`.${upperNoProxyItem}`) || - (upperNoProxyItem.startsWith('.') && - x.endsWith(`${upperNoProxyItem}`)))) { - return true; - } - } - return false; + + const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT'); + class HeadersTimeoutError extends UndiciError { + constructor (message) { + super(message); + this.name = 'HeadersTimeoutError'; + this.message = message || 'Headers Timeout Error'; + this.code = 'UND_ERR_HEADERS_TIMEOUT'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersTimeoutError] === true + } + + [kHeadersTimeoutError] = true } - proxy$2.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return (hostLower === 'localhost' || - hostLower.startsWith('127.') || - hostLower.startsWith('[::1]') || - hostLower.startsWith('[0:0:0:0:0:0:0:1]')); + + const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW'); + class HeadersOverflowError extends UndiciError { + constructor (message) { + super(message); + this.name = 'HeadersOverflowError'; + this.message = message || 'Headers Overflow Error'; + this.code = 'UND_ERR_HEADERS_OVERFLOW'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHeadersOverflowError] === true + } + + [kHeadersOverflowError] = true } - class DecodedURL extends URL { - constructor(url, base) { - super(url, base); - this._decodedUsername = decodeURIComponent(super.username); - this._decodedPassword = decodeURIComponent(super.password); - } - get username() { - return this._decodedUsername; - } - get password() { - return this._decodedPassword; - } + + const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT'); + class BodyTimeoutError extends UndiciError { + constructor (message) { + super(message); + this.name = 'BodyTimeoutError'; + this.message = message || 'Body Timeout Error'; + this.code = 'UND_ERR_BODY_TIMEOUT'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kBodyTimeoutError] === true + } + + [kBodyTimeoutError] = true } - - return proxy$2; -} -var hasRequiredLib$2; + const kResponseStatusCodeError = Symbol.for('undici.error.UND_ERR_RESPONSE_STATUS_CODE'); + class ResponseStatusCodeError extends UndiciError { + constructor (message, statusCode, headers, body) { + super(message); + this.name = 'ResponseStatusCodeError'; + this.message = message || 'Response Status Code Error'; + this.code = 'UND_ERR_RESPONSE_STATUS_CODE'; + this.body = body; + this.status = statusCode; + this.statusCode = statusCode; + this.headers = headers; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseStatusCodeError] === true + } -function requireLib$2 () { - if (hasRequiredLib$2) return lib$2; - hasRequiredLib$2 = 1; - /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (lib$2 && lib$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (lib$2 && lib$2.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (lib$2 && lib$2.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (lib$2 && lib$2.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(lib$2, "__esModule", { value: true }); - lib$2.HttpClient = lib$2.isHttps = lib$2.HttpClientResponse = lib$2.HttpClientError = lib$2.getProxyUrl = lib$2.MediaTypes = lib$2.Headers = lib$2.HttpCodes = void 0; - const http = __importStar(require$$0$7); - const https = __importStar(require$$1$2); - const pm = __importStar(requireProxy$2()); - const tunnel = __importStar(requireTunnel()); - const undici_1 = requireUndici(); - var HttpCodes; - (function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib$2.HttpCodes = HttpCodes = {})); - var Headers; - (function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; - })(Headers || (lib$2.Headers = Headers = {})); - var MediaTypes; - (function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib$2.MediaTypes = MediaTypes = {})); - /** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; + [kResponseStatusCodeError] = true } - lib$2.getProxyUrl = getProxyUrl; - const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } + + const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG'); + class InvalidArgumentError extends UndiciError { + constructor (message) { + super(message); + this.name = 'InvalidArgumentError'; + this.message = message || 'Invalid Argument Error'; + this.code = 'UND_ERR_INVALID_ARG'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidArgumentError] === true + } + + [kInvalidArgumentError] = true } - lib$2.HttpClientError = HttpClientError; - class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); - } - readBodyBuffer() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - this.message.on('data', (chunk) => { - chunks.push(chunk); - }); - this.message.on('end', () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); - } + + const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE'); + class InvalidReturnValueError extends UndiciError { + constructor (message) { + super(message); + this.name = 'InvalidReturnValueError'; + this.message = message || 'Invalid Return Value Error'; + this.code = 'UND_ERR_INVALID_RETURN_VALUE'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInvalidReturnValueError] === true + } + + [kInvalidReturnValueError] = true } - lib$2.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; + + const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT'); + class AbortError extends UndiciError { + constructor (message) { + super(message); + this.name = 'AbortError'; + this.message = message || 'The operation was aborted'; + this.code = 'UND_ERR_ABORT'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kAbortError] === true + } + + [kAbortError] = true } - lib$2.isHttps = isHttps; - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); + + const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED'); + class RequestAbortedError extends AbortError { + constructor (message) { + super(message); + this.name = 'AbortError'; + this.message = message || 'Request aborted'; + this.code = 'UND_ERR_ABORTED'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestAbortedError] === true + } + + [kRequestAbortedError] = true + } + + const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO'); + class InformationalError extends UndiciError { + constructor (message) { + super(message); + this.name = 'InformationalError'; + this.message = message || 'Request information'; + this.code = 'UND_ERR_INFO'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kInformationalError] === true + } + + [kInformationalError] = true + } + + const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'); + class RequestContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message); + this.name = 'RequestContentLengthMismatchError'; + this.message = message || 'Request body length does not match content-length header'; + this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestContentLengthMismatchError] === true + } + + [kRequestContentLengthMismatchError] = true + } + + const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH'); + class ResponseContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message); + this.name = 'ResponseContentLengthMismatchError'; + this.message = message || 'Response body length does not match content-length header'; + this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseContentLengthMismatchError] === true + } + + [kResponseContentLengthMismatchError] = true + } + + const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED'); + class ClientDestroyedError extends UndiciError { + constructor (message) { + super(message); + this.name = 'ClientDestroyedError'; + this.message = message || 'The client is destroyed'; + this.code = 'UND_ERR_DESTROYED'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientDestroyedError] === true + } + + [kClientDestroyedError] = true + } + + const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED'); + class ClientClosedError extends UndiciError { + constructor (message) { + super(message); + this.name = 'ClientClosedError'; + this.message = message || 'The client is closed'; + this.code = 'UND_ERR_CLOSED'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kClientClosedError] === true + } + + [kClientClosedError] = true + } + + const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET'); + class SocketError extends UndiciError { + constructor (message, socket) { + super(message); + this.name = 'SocketError'; + this.message = message || 'Socket error'; + this.code = 'UND_ERR_SOCKET'; + this.socket = socket; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kSocketError] === true + } + + [kSocketError] = true + } + + const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED'); + class NotSupportedError extends UndiciError { + constructor (message) { + super(message); + this.name = 'NotSupportedError'; + this.message = message || 'Not supported error'; + this.code = 'UND_ERR_NOT_SUPPORTED'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kNotSupportedError] === true + } + + [kNotSupportedError] = true + } + + const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM'); + class BalancedPoolMissingUpstreamError extends UndiciError { + constructor (message) { + super(message); + this.name = 'MissingUpstreamError'; + this.message = message || 'No upstream has been added to the BalancedPool'; + this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true + } + + [kBalancedPoolMissingUpstreamError] = true + } + + const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER'); + class HTTPParserError extends Error { + constructor (message, code, data) { + super(message); + this.name = 'HTTPParserError'; + this.code = code ? `HPE_${code}` : undefined; + this.data = data ? data.toString() : undefined; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kHTTPParserError] === true + } + + [kHTTPParserError] = true + } + + const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE'); + class ResponseExceededMaxSizeError extends UndiciError { + constructor (message) { + super(message); + this.name = 'ResponseExceededMaxSizeError'; + this.message = message || 'Response content exceeded max size'; + this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseExceededMaxSizeError] === true + } + + [kResponseExceededMaxSizeError] = true + } + + const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY'); + class RequestRetryError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message); + this.name = 'RequestRetryError'; + this.message = message || 'Request retry error'; + this.code = 'UND_ERR_REQ_RETRY'; + this.statusCode = code; + this.data = data; + this.headers = headers; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kRequestRetryError] === true + } + + [kRequestRetryError] = true + } + + const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE'); + class ResponseError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message); + this.name = 'ResponseError'; + this.message = message || 'Response error'; + this.code = 'UND_ERR_RESPONSE'; + this.statusCode = code; + this.data = data; + this.headers = headers; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kResponseError] === true + } + + [kResponseError] = true + } + + const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS'); + class SecureProxyConnectionError extends UndiciError { + constructor (cause, message, options) { + super(message, { cause, ...(options ?? {}) }); + this.name = 'SecureProxyConnectionError'; + this.message = message || 'Secure Proxy Connection failed'; + this.code = 'UND_ERR_PRX_TLS'; + this.cause = cause; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kSecureProxyConnectionError] === true + } + + [kSecureProxyConnectionError] = true + } + + errors$1 = { + AbortError, + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError, + RequestRetryError, + ResponseError, + SecureProxyConnectionError + }; + return errors$1; +} + +var constants$a; +var hasRequiredConstants$a; + +function requireConstants$a () { + if (hasRequiredConstants$a) return constants$a; + hasRequiredConstants$a = 1; + + /** @type {Record} */ + const headerNameLowerCasedRecord = {}; + + // https://developer.mozilla.org/docs/Web/HTTP/Headers + const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' + ]; + + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey; + } + + // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + + constants$a = { + wellknownHeaderNames, + headerNameLowerCasedRecord + }; + return constants$a; +} + +var tree_1; +var hasRequiredTree; + +function requireTree () { + if (hasRequiredTree) return tree_1; + hasRequiredTree = 1; + + const { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = requireConstants$a(); + + class TstNode { + /** @type {any} */ + value = null + /** @type {null | TstNode} */ + left = null + /** @type {null | TstNode} */ + middle = null + /** @type {null | TstNode} */ + right = null + /** @type {number} */ + code + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor (key, value, index) { + if (index === undefined || index >= key.length) { + throw new TypeError('Unreachable') } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); + const code = this.code = key.charCodeAt(index); + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); + if (key.length !== ++index) { + this.middle = new TstNode(key, value, index); + } else { + this.value = value; } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); + } + + /** + * @param {string} key + * @param {any} value + */ + add (key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError('Unreachable') } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); + let index = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index); + // check code is ascii string + if (code > 0x7F) { + throw new TypeError('key must be ascii string') + } + if (node.code === code) { + if (length === ++index) { + node.value = value; + break + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new TstNode(key, value, index); + break + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new TstNode(key, value, index); + break + } + } else if (node.right !== null) { + node = node.right; + } else { + node.right = new TstNode(key, value, index); + break + } } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); + } + + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search (key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code = key[index]; + // A-Z + // First check if it is bigger than 0x5a. + // Lowercase letters have higher char codes than uppercase ones. + // Also we assume that headers will mostly contain lowercase characters. + if (code <= 0x5a && code >= 0x41) { + // Lowercase for uppercase. + code |= 32; + } + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + // Returns Node since it is the last key. + return node + } + node = node.middle; + break + } + node = node.code < code ? node.left : node.right; + } } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); + return null + } + } + + class TernarySearchTree { + /** @type {TstNode | null} */ + node = null + + /** + * @param {string} key + * @param {any} value + * */ + insert (key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); + } + + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup (key) { + return this.node?.search(key)?.value ?? null + } + } + + const tree = new TernarySearchTree(); + + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + + tree_1 = { + TernarySearchTree, + tree + }; + return tree_1; +} + +var util$9; +var hasRequiredUtil$9; + +function requireUtil$9 () { + if (hasRequiredUtil$9) return util$9; + hasRequiredUtil$9 = 1; + + const assert = require$$0$7; + const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols$4(); + const { IncomingMessage } = require$$2; + const stream = require$$0$8; + const net = require$$0$9; + const { Blob } = require$$0$6; + const nodeUtil = require$$0$a; + const { stringify } = require$$7; + const { EventEmitter: EE } = require$$8; + const { InvalidArgumentError } = requireErrors$1(); + const { headerNameLowerCasedRecord } = requireConstants$a(); + const { tree } = requireTree(); + + const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)); + + class BodyAsyncIterable { + constructor (body) { + this[kBody] = body; + this[kBodyUsed] = false; + } + + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed'); + this[kBodyUsed] = true; + yield * this[kBody]; + } + } + + function wrapRequestBody (body) { + if (isStream(body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (bodyLength(body) === 0) { + body + .on('data', function () { + assert(false); }); } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + + if (typeof body.readableDidRead !== 'boolean') { + body[kBodyUsed] = false; + EE.prototype.on.call(body, 'data', function () { + this[kBodyUsed] = true; + }); } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } - } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); - } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; - } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; - } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if tunneling agent isn't assigned create a new agent - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; - } - // if agent is already assigned use that agent. - if (proxyAgent) { - return proxyAgent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}` - }))); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); - } - return proxyAgent; - } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); - } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } - else { - resolve(response); - } - })); - }); - } - } - lib$2.HttpClient = HttpClient; - const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - - return lib$2; -} - -var hasRequiredUtils$5; -function requireUtils$5 () { - if (hasRequiredUtils$5) return utils$4; - hasRequiredUtils$5 = 1; - var __createBinding = (utils$4 && utils$4.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (utils$4 && utils$4.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (utils$4 && utils$4.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (utils$4 && utils$4.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(utils$4, "__esModule", { value: true }); - utils$4.getApiBaseUrl = utils$4.getProxyFetch = utils$4.getProxyAgentDispatcher = utils$4.getProxyAgent = utils$4.getAuthString = void 0; - const httpClient = __importStar(requireLib$2()); - const undici_1 = requireUndici(); - function getAuthString(token, options) { - if (!token && !options.auth) { - throw new Error('Parameter token or opts.auth is required'); - } - else if (token && options.auth) { - throw new Error('Parameters token and opts.auth may not both be specified'); - } - return typeof options.auth === 'string' ? options.auth : `token ${token}`; - } - utils$4.getAuthString = getAuthString; - function getProxyAgent(destinationUrl) { - const hc = new httpClient.HttpClient(); - return hc.getAgent(destinationUrl); - } - utils$4.getProxyAgent = getProxyAgent; - function getProxyAgentDispatcher(destinationUrl) { - const hc = new httpClient.HttpClient(); - return hc.getAgentDispatcher(destinationUrl); - } - utils$4.getProxyAgentDispatcher = getProxyAgentDispatcher; - function getProxyFetch(destinationUrl) { - const httpDispatcher = getProxyAgentDispatcher(destinationUrl); - const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () { - return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher })); - }); - return proxyFetch; - } - utils$4.getProxyFetch = getProxyFetch; - function getApiBaseUrl() { - return process.env['GITHUB_API_URL'] || 'https://api.github.com'; + return body + } else if (body && typeof body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + return new BodyAsyncIterable(body) + } else if ( + body && + typeof body !== 'string' && + !ArrayBuffer.isView(body) && + isIterable(body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + return new BodyAsyncIterable(body) + } else { + return body + } } - utils$4.getApiBaseUrl = getApiBaseUrl; - - return utils$4; -} -function getUserAgent() { - if (typeof navigator === "object" && "userAgent" in navigator) { - return navigator.userAgent; - } - if (typeof process === "object" && process.version !== undefined) { - return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; - } - return ""; -} - -var beforeAfterHook = {exports: {}}; + function nop () {} -var register_1; -var hasRequiredRegister; + function isStream (obj) { + return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' + } -function requireRegister () { - if (hasRequiredRegister) return register_1; - hasRequiredRegister = 1; - register_1 = register; + // based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) + function isBlobLike (object) { + if (object === null) { + return false + } else if (object instanceof Blob) { + return true + } else if (typeof object !== 'object') { + return false + } else { + const sTag = object[Symbol.toStringTag]; - function register(state, name, method, options) { - if (typeof method !== "function") { - throw new Error("method for before hook must be a function"); + return (sTag === 'Blob' || sTag === 'File') && ( + ('stream' in object && typeof object.stream === 'function') || + ('arrayBuffer' in object && typeof object.arrayBuffer === 'function') + ) } + } - if (!options) { - options = {}; + function buildURL (url, queryParams) { + if (url.includes('?') || url.includes('#')) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".') } - if (Array.isArray(name)) { - return name.reverse().reduce(function (callback, name) { - return register.bind(null, state, name, callback, options); - }, method)(); + const stringified = stringify(queryParams); + + if (stringified) { + url += '?' + stringified; } - return Promise.resolve().then(function () { - if (!state.registry[name]) { - return method(options); - } + return url + } - return state.registry[name].reduce(function (method, registered) { - return registered.hook.bind(null, method, options); - }, method)(); - }); + function isValidPort (port) { + const value = parseInt(port, 10); + return ( + value === Number(port) && + value >= 0 && + value <= 65535 + ) } - return register_1; -} -var add; -var hasRequiredAdd; + function isHttpOrHttpsPrefixed (value) { + return ( + value != null && + value[0] === 'h' && + value[1] === 't' && + value[2] === 't' && + value[3] === 'p' && + ( + value[4] === ':' || + ( + value[4] === 's' && + value[5] === ':' + ) + ) + ) + } -function requireAdd () { - if (hasRequiredAdd) return add; - hasRequiredAdd = 1; - add = addHook; + function parseURL (url) { + if (typeof url === 'string') { + url = new URL(url); - function addHook(state, kind, name, hook) { - var orig = hook; - if (!state.registry[name]) { - state.registry[name] = []; - } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } - if (kind === "before") { - hook = function (method, options) { - return Promise.resolve() - .then(orig.bind(null, options)) - .then(method.bind(null, options)); - }; + return url } - if (kind === "after") { - hook = function (method, options) { - var result; - return Promise.resolve() - .then(method.bind(null, options)) - .then(function (result_) { - result = result_; - return orig(result, options); - }) - .then(function () { - return result; - }); - }; + if (!url || typeof url !== 'object') { + throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') } - if (kind === "error") { - hook = function (method, options) { - return Promise.resolve() - .then(method.bind(null, options)) - .catch(function (error) { - return orig(error, options); - }); - }; - } + if (!(url instanceof URL)) { + if (url.port != null && url.port !== '' && isValidPort(url.port) === false) { + throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') + } - state.registry[name].push({ - hook: hook, - orig: orig, - }); - } - return add; -} + if (url.path != null && typeof url.path !== 'string') { + throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') + } -var remove; -var hasRequiredRemove; + if (url.pathname != null && typeof url.pathname !== 'string') { + throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') + } -function requireRemove () { - if (hasRequiredRemove) return remove; - hasRequiredRemove = 1; - remove = removeHook; + if (url.hostname != null && typeof url.hostname !== 'string') { + throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') + } - function removeHook(state, name, method) { - if (!state.registry[name]) { - return; - } + if (url.origin != null && typeof url.origin !== 'string') { + throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') + } - var index = state.registry[name] - .map(function (registered) { - return registered.orig; - }) - .indexOf(method); + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } - if (index === -1) { - return; + const port = url.port != null + ? url.port + : (url.protocol === 'https:' ? 443 : 80); + let origin = url.origin != null + ? url.origin + : `${url.protocol || ''}//${url.hostname || ''}:${port}`; + let path = url.path != null + ? url.path + : `${url.pathname || ''}${url.search || ''}`; + + if (origin[origin.length - 1] === '/') { + origin = origin.slice(0, origin.length - 1); + } + + if (path && path[0] !== '/') { + path = `/${path}`; + } + // new URL(path, origin) is unsafe when `path` contains an absolute URL + // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: + // If first parameter is a relative URL, second param is required, and will be used as the base URL. + // If first parameter is an absolute URL, a given second param will be ignored. + return new URL(`${origin}${path}`) } - state.registry[name].splice(index, 1); - } - return remove; -} + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } -var hasRequiredBeforeAfterHook; + return url + } -function requireBeforeAfterHook () { - if (hasRequiredBeforeAfterHook) return beforeAfterHook.exports; - hasRequiredBeforeAfterHook = 1; - var register = requireRegister(); - var addHook = requireAdd(); - var removeHook = requireRemove(); + function parseOrigin (url) { + url = parseURL(url); - // bind with array of arguments: https://stackoverflow.com/a/21792913 - var bind = Function.bind; - var bindable = bind.bind(bind); + if (url.pathname !== '/' || url.search || url.hash) { + throw new InvalidArgumentError('invalid url') + } - function bindApi(hook, state, name) { - var removeHookRef = bindable(removeHook, null).apply( - null, - name ? [state, name] : [state] - ); - hook.api = { remove: removeHookRef }; - hook.remove = removeHookRef; - ["before", "error", "after", "wrap"].forEach(function (kind) { - var args = name ? [state, kind, name] : [state, kind]; - hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args); - }); + return url } - function HookSingular() { - var singularHookName = "h"; - var singularHookState = { - registry: {}, - }; - var singularHook = register.bind(null, singularHookState, singularHookName); - bindApi(singularHook, singularHookState, singularHookName); - return singularHook; - } + function getHostname (host) { + if (host[0] === '[') { + const idx = host.indexOf(']'); - function HookCollection() { - var state = { - registry: {}, - }; + assert(idx !== -1); + return host.substring(1, idx) + } - var hook = register.bind(null, state); - bindApi(hook, state); + const idx = host.indexOf(':'); + if (idx === -1) return host - return hook; + return host.substring(0, idx) } - var collectionHookDeprecationMessageDisplayed = false; - function Hook() { - if (!collectionHookDeprecationMessageDisplayed) { - console.warn( - '[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4' - ); - collectionHookDeprecationMessageDisplayed = true; + // IP addresses are not valid server names per RFC6066 + // > Currently, the only server names supported are DNS hostnames + function getServerName (host) { + if (!host) { + return null } - return HookCollection(); - } - Hook.Singular = HookSingular.bind(); - Hook.Collection = HookCollection.bind(); + assert(typeof host === 'string'); - beforeAfterHook.exports = Hook; - // expose constructors as a named property for TypeScript - beforeAfterHook.exports.Hook = Hook; - beforeAfterHook.exports.Singular = Hook.Singular; - beforeAfterHook.exports.Collection = Hook.Collection; - return beforeAfterHook.exports; -} + const servername = getHostname(host); + if (net.isIP(servername)) { + return '' + } -var beforeAfterHookExports = requireBeforeAfterHook(); + return servername + } -const VERSION$5 = "9.0.6"; + function deepClone (obj) { + return JSON.parse(JSON.stringify(obj)) + } -const userAgent$3 = `octokit-endpoint.js/${VERSION$5} ${getUserAgent()}`; -const DEFAULTS = { - method: "GET", - baseUrl: "https://api.github.com", - headers: { - accept: "application/vnd.github.v3+json", - "user-agent": userAgent$3 - }, - mediaType: { - format: "" - } -}; + function isAsyncIterable (obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') + } -function lowercaseKeys(object) { - if (!object) { - return {}; - } - return Object.keys(object).reduce((newObj, key) => { - newObj[key.toLowerCase()] = object[key]; - return newObj; - }, {}); -} + function isIterable (obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) + } -function isPlainObject$1(value) { - if (typeof value !== "object" || value === null) - return false; - if (Object.prototype.toString.call(value) !== "[object Object]") - return false; - const proto = Object.getPrototypeOf(value); - if (proto === null) - return true; - const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; - return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value); -} + function bodyLength (body) { + if (body == null) { + return 0 + } else if (isStream(body)) { + const state = body._readableState; + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) + ? state.length + : null + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null + } else if (isBuffer(body)) { + return body.byteLength + } -function mergeDeep(defaults, options) { - const result = Object.assign({}, defaults); - Object.keys(options).forEach((key) => { - if (isPlainObject$1(options[key])) { - if (!(key in defaults)) - Object.assign(result, { [key]: options[key] }); - else - result[key] = mergeDeep(defaults[key], options[key]); - } else { - Object.assign(result, { [key]: options[key] }); - } - }); - return result; -} + return null + } -function removeUndefinedProperties(obj) { - for (const key in obj) { - if (obj[key] === void 0) { - delete obj[key]; - } - } - return obj; -} + function isDestroyed (body) { + return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body))) + } -function merge(defaults, route, options) { - if (typeof route === "string") { - let [method, url] = route.split(" "); - options = Object.assign(url ? { method, url } : { url: method }, options); - } else { - options = Object.assign({}, route); - } - options.headers = lowercaseKeys(options.headers); - removeUndefinedProperties(options); - removeUndefinedProperties(options.headers); - const mergedOptions = mergeDeep(defaults || {}, options); - if (options.url === "/graphql") { - if (defaults && defaults.mediaType.previews?.length) { - mergedOptions.mediaType.previews = defaults.mediaType.previews.filter( - (preview) => !mergedOptions.mediaType.previews.includes(preview) - ).concat(mergedOptions.mediaType.previews); - } - mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, "")); - } - return mergedOptions; -} + function destroy (stream, err) { + if (stream == null || !isStream(stream) || isDestroyed(stream)) { + return + } -function addQueryParameters(url, parameters) { - const separator = /\?/.test(url) ? "&" : "?"; - const names = Object.keys(parameters); - if (names.length === 0) { - return url; - } - return url + separator + names.map((name) => { - if (name === "q") { - return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); - } - return `${name}=${encodeURIComponent(parameters[name])}`; - }).join("&"); -} + if (typeof stream.destroy === 'function') { + if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { + // See: https://github.com/nodejs/node/pull/38505/files + stream.socket = null; + } -const urlVariableRegex = /\{[^{}}]+\}/g; -function removeNonChars(variableName) { - return variableName.replace(/(?:^\W+)|(?:(? a.concat(b), []); -} + stream.destroy(err); + } else if (err) { + queueMicrotask(() => { + stream.emit('error', err); + }); + } -function omit(object, keysToOmit) { - const result = { __proto__: null }; - for (const key of Object.keys(object)) { - if (keysToOmit.indexOf(key) === -1) { - result[key] = object[key]; - } - } - return result; -} + if (stream.destroyed !== true) { + stream[kDestroyed] = true; + } + } -function encodeReserved(str) { - return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { - if (!/%[0-9A-Fa-f]/.test(part)) { - part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); - } - return part; - }).join(""); -} -function encodeUnreserved(str) { - return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { - return "%" + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} -function encodeValue(operator, value, key) { - value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); - if (key) { - return encodeUnreserved(key) + "=" + value; - } else { - return value; - } -} -function isDefined(value) { - return value !== void 0 && value !== null; -} -function isKeyOperator(operator) { - return operator === ";" || operator === "&" || operator === "?"; -} -function getValues(context, operator, key, modifier) { - var value = context[key], result = []; - if (isDefined(value) && value !== "") { - if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { - value = value.toString(); - if (modifier && modifier !== "*") { - value = value.substring(0, parseInt(modifier, 10)); - } - result.push( - encodeValue(operator, value, isKeyOperator(operator) ? key : "") - ); - } else { - if (modifier === "*") { - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function(value2) { - result.push( - encodeValue(operator, value2, isKeyOperator(operator) ? key : "") - ); - }); - } else { - Object.keys(value).forEach(function(k) { - if (isDefined(value[k])) { - result.push(encodeValue(operator, value[k], k)); - } - }); - } - } else { - const tmp = []; - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function(value2) { - tmp.push(encodeValue(operator, value2)); - }); - } else { - Object.keys(value).forEach(function(k) { - if (isDefined(value[k])) { - tmp.push(encodeUnreserved(k)); - tmp.push(encodeValue(operator, value[k].toString())); - } - }); - } - if (isKeyOperator(operator)) { - result.push(encodeUnreserved(key) + "=" + tmp.join(",")); - } else if (tmp.length !== 0) { - result.push(tmp.join(",")); - } - } - } - } else { - if (operator === ";") { - if (isDefined(value)) { - result.push(encodeUnreserved(key)); - } - } else if (value === "" && (operator === "&" || operator === "?")) { - result.push(encodeUnreserved(key) + "="); - } else if (value === "") { - result.push(""); - } - } - return result; -} -function parseUrl(template) { - return { - expand: expand.bind(null, template) - }; -} -function expand(template, context) { - var operators = ["+", "#", ".", "/", ";", "?", "&"]; - template = template.replace( - /\{([^\{\}]+)\}|([^\{\}]+)/g, - function(_, expression, literal) { - if (expression) { - let operator = ""; - const values = []; - if (operators.indexOf(expression.charAt(0)) !== -1) { - operator = expression.charAt(0); - expression = expression.substr(1); - } - expression.split(/,/g).forEach(function(variable) { - var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); - values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); - }); - if (operator && operator !== "+") { - var separator = ","; - if (operator === "?") { - separator = "&"; - } else if (operator !== "#") { - separator = operator; - } - return (values.length !== 0 ? operator : "") + values.join(separator); - } else { - return values.join(","); - } - } else { - return encodeReserved(literal); - } - } - ); - if (template === "/") { - return template; - } else { - return template.replace(/\/$/, ""); - } -} + const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout (val) { + const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); + return m ? parseInt(m[1], 10) * 1000 : null + } -function parse(options) { - let method = options.method.toUpperCase(); - let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); - let headers = Object.assign({}, options.headers); - let body; - let parameters = omit(options, [ - "method", - "baseUrl", - "url", - "headers", - "request", - "mediaType" - ]); - const urlVariableNames = extractUrlVariableNames(url); - url = parseUrl(url).expand(parameters); - if (!/^http/.test(url)) { - url = options.baseUrl + url; - } - const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); - const remainingParameters = omit(parameters, omittedParameters); - const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); - if (!isBinaryRequest) { - if (options.mediaType.format) { - headers.accept = headers.accept.split(/,/).map( - (format) => format.replace( - /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, - `application/vnd$1$2.${options.mediaType.format}` - ) - ).join(","); - } - if (url.endsWith("/graphql")) { - if (options.mediaType.previews?.length) { - const previewsFromAcceptHeader = headers.accept.match(/(? { - const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; - return `application/vnd.github.${preview}-preview${format}`; - }).join(","); - } - } - } - if (["GET", "HEAD"].includes(method)) { - url = addQueryParameters(url, remainingParameters); - } else { - if ("data" in remainingParameters) { - body = remainingParameters.data; - } else { - if (Object.keys(remainingParameters).length) { - body = remainingParameters; - } - } - } - if (!headers["content-type"] && typeof body !== "undefined") { - headers["content-type"] = "application/json; charset=utf-8"; - } - if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { - body = ""; - } - return Object.assign( - { method, url, headers }, - typeof body !== "undefined" ? { body } : null, - options.request ? { request: options.request } : null - ); -} + /** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ + function headerNameToString (value) { + return typeof value === 'string' + ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() + : tree.lookup(value) ?? value.toString('latin1').toLowerCase() + } -function endpointWithDefaults(defaults, route, options) { - return parse(merge(defaults, route, options)); -} + /** + * Receive the buffer as a string and return its lowercase value. + * @param {Buffer} value Header name + * @returns {string} + */ + function bufferToLowerCasedHeaderName (value) { + return tree.lookup(value) ?? value.toString('latin1').toLowerCase() + } -function withDefaults$2(oldDefaults, newDefaults) { - const DEFAULTS = merge(oldDefaults, newDefaults); - const endpoint = endpointWithDefaults.bind(null, DEFAULTS); - return Object.assign(endpoint, { - DEFAULTS, - defaults: withDefaults$2.bind(null, DEFAULTS), - merge: merge.bind(null, DEFAULTS), - parse - }); -} + /** + * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers + * @param {Record} [obj] + * @returns {Record} + */ + function parseHeaders (headers, obj) { + if (obj === undefined) obj = {}; + for (let i = 0; i < headers.length; i += 2) { + const key = headerNameToString(headers[i]); + let val = obj[key]; -const endpoint = withDefaults$2(null, DEFAULTS); + if (val) { + if (typeof val === 'string') { + val = [val]; + obj[key] = val; + } + val.push(headers[i + 1].toString('utf8')); + } else { + const headersValue = headers[i + 1]; + if (typeof headersValue === 'string') { + obj[key] = headersValue; + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map(x => x.toString('utf8')) : headersValue.toString('utf8'); + } + } + } -const VERSION$4 = "8.4.1"; + // See https://github.com/nodejs/node/pull/46528 + if ('content-length' in obj && 'content-disposition' in obj) { + obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1'); + } -function isPlainObject(value) { - if (typeof value !== "object" || value === null) - return false; - if (Object.prototype.toString.call(value) !== "[object Object]") - return false; - const proto = Object.getPrototypeOf(value); - if (proto === null) - return true; - const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; - return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value); -} + return obj + } -class Deprecation extends Error { - constructor(message) { - super(message); // Maintains proper stack trace (only available on V8) + function parseRawHeaders (headers) { + const len = headers.length; + const ret = new Array(len); - /* istanbul ignore next */ + let hasContentLength = false; + let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } + for (let n = 0; n < headers.length; n += 2) { + key = headers[n]; + val = headers[n + 1]; - this.name = 'Deprecation'; - } + typeof key !== 'string' && (key = key.toString()); + typeof val !== 'string' && (val = val.toString('utf8')); -} + kLen = key.length; + if (kLen === 14 && key[7] === '-' && (key === 'content-length' || key.toLowerCase() === 'content-length')) { + hasContentLength = true; + } else if (kLen === 19 && key[7] === '-' && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { + contentDispositionIdx = n + 1; + } + ret[n] = key; + ret[n + 1] = val; + } -var once$1 = {exports: {}}; + // See https://github.com/nodejs/node/pull/46528 + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1'); + } -var wrappy_1; -var hasRequiredWrappy; + return ret + } -function requireWrappy () { - if (hasRequiredWrappy) return wrappy_1; - hasRequiredWrappy = 1; - // Returns a wrapper function that returns a wrapped callback - // The wrapper function should do some stuff, and return a - // presumably different callback function. - // This makes sure that own properties are retained, so that - // decorations and such are not lost along the way. - wrappy_1 = wrappy; - function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) + function isBuffer (buffer) { + // See, https://github.com/mcollina/undici/pull/319 + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) + } - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') + function validateHandler (handler, method, upgrade) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k]; - }); + if (typeof handler.onConnect !== 'function') { + throw new InvalidArgumentError('invalid onConnect method') + } - return wrapper + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } + + if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { + throw new InvalidArgumentError('invalid onBodySent method') + } - function wrapper() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; + if (upgrade || method === 'CONNECT') { + if (typeof handler.onUpgrade !== 'function') { + throw new InvalidArgumentError('invalid onUpgrade method') } - var ret = fn.apply(this, args); - var cb = args[args.length-1]; - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k]; - }); + } else { + if (typeof handler.onHeaders !== 'function') { + throw new InvalidArgumentError('invalid onHeaders method') + } + + if (typeof handler.onData !== 'function') { + throw new InvalidArgumentError('invalid onData method') + } + + if (typeof handler.onComplete !== 'function') { + throw new InvalidArgumentError('invalid onComplete method') } - return ret } } - return wrappy_1; -} -var hasRequiredOnce; + // A body is disturbed if it has been read from and it cannot + // be re-used without losing state or data. + function isDisturbed (body) { + // TODO (fix): Why is body[kBodyUsed] needed? + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])) + } -function requireOnce () { - if (hasRequiredOnce) return once$1.exports; - hasRequiredOnce = 1; - var wrappy = requireWrappy(); - once$1.exports = wrappy(once); - once$1.exports.strict = wrappy(onceStrict); + function isErrored (body) { + return !!(body && stream.isErrored(body)) + } - once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }); + function isReadable (body) { + return !!(body && stream.isReadable(body)) + } - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }); - }); + function getSocketInfo (socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + } + } - function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true; - return f.value = fn.apply(this, arguments) - }; - f.called = false; - return f + /** @type {globalThis['ReadableStream']} */ + function ReadableStreamFrom (iterable) { + // We cannot use ReadableStream.from here because it does not return a byte stream. + + let iterator; + return new ReadableStream( + { + async start () { + iterator = iterable[Symbol.asyncIterator](); + }, + async pull (controller) { + const { done, value } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)); + } + } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return(); + }, + type: 'bytes' + } + ) } - function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true; - return f.value = fn.apply(this, arguments) - }; - var name = fn.name || 'Function wrapped with `once`'; - f.onceError = name + " shouldn't be called more than once"; - f.called = false; - return f + // The chunk should be a FormData instance and contains + // all the required methods. + function isFormDataLike (object) { + return ( + object && + typeof object === 'object' && + typeof object.append === 'function' && + typeof object.delete === 'function' && + typeof object.get === 'function' && + typeof object.getAll === 'function' && + typeof object.has === 'function' && + typeof object.set === 'function' && + object[Symbol.toStringTag] === 'FormData' + ) } - return once$1.exports; -} -var onceExports = requireOnce(); -var once = /*@__PURE__*/getDefaultExportFromCjs(onceExports); + function addAbortListener (signal, listener) { + if ('addEventListener' in signal) { + signal.addEventListener('abort', listener, { once: true }); + return () => signal.removeEventListener('abort', listener) + } + signal.addListener('abort', listener); + return () => signal.removeListener('abort', listener) + } -const logOnceCode = once((deprecation) => console.warn(deprecation)); -const logOnceHeaders = once((deprecation) => console.warn(deprecation)); -class RequestError extends Error { - constructor(message, statusCode, options) { - super(message); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - this.name = "HttpError"; - this.status = statusCode; - let headers; - if ("headers" in options && typeof options.headers !== "undefined") { - headers = options.headers; - } - if ("response" in options) { - this.response = options.response; - headers = options.response.headers; - } - const requestCopy = Object.assign({}, options.request); - if (options.request.headers.authorization) { - requestCopy.headers = Object.assign({}, options.request.headers, { - authorization: options.request.headers.authorization.replace( - /(? { - url = response.url; - status = response.status; - for (const keyAndValue of response.headers) { - headers[keyAndValue[0]] = keyAndValue[1]; - } - if ("deprecation" in headers) { - const matches = headers.link && headers.link.match(/<([^<>]+)>; rel="deprecation"/); - const deprecationLink = matches && matches.pop(); - log.warn( - `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` - ); - } - if (status === 204 || status === 205) { - return; - } - if (requestOptions.method === "HEAD") { - if (status < 400) { - return; - } - throw new RequestError(response.statusText, status, { - response: { - url, - status, - headers, - data: void 0 - }, - request: requestOptions - }); - } - if (status === 304) { - throw new RequestError("Not modified", status, { - response: { - url, - status, - headers, - data: await getResponseData(response) - }, - request: requestOptions - }); - } - if (status >= 400) { - const data = await getResponseData(response); - const error = new RequestError(toErrorMessage(data), status, { - response: { - url, - status, - headers, - data - }, - request: requestOptions - }); - throw error; - } - return parseSuccessResponseBody ? await getResponseData(response) : response.body; - }).then((data) => { - return { - status, - url, - headers, - data - }; - }).catch((error) => { - if (error instanceof RequestError) - throw error; - else if (error.name === "AbortError") - throw error; - let message = error.message; - if (error.name === "TypeError" && "cause" in error) { - if (error.cause instanceof Error) { - message = error.cause.message; - } else if (typeof error.cause === "string") { - message = error.cause; - } - } - throw new RequestError(message, 500, { - request: requestOptions - }); - }); -} -async function getResponseData(response) { - const contentType = response.headers.get("content-type"); - if (/application\/json/.test(contentType)) { - return response.json().catch(() => response.text()).catch(() => ""); - } - if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { - return response.text(); - } - return getBufferResponse(response); -} -function toErrorMessage(data) { - if (typeof data === "string") - return data; - let suffix; - if ("documentation_url" in data) { - suffix = ` - ${data.documentation_url}`; - } else { - suffix = ""; - } - if ("message" in data) { - if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`; - } - return `${data.message}${suffix}`; - } - return `Unknown error: ${JSON.stringify(data)}`; -} + /** + * @param {string} val + */ + // TODO: move this to webidl + function isUSVString (val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}` + } -function withDefaults$1(oldEndpoint, newDefaults) { - const endpoint = oldEndpoint.defaults(newDefaults); - const newApi = function(route, parameters) { - const endpointOptions = endpoint.merge(route, parameters); - if (!endpointOptions.request || !endpointOptions.request.hook) { - return fetchWrapper(endpoint.parse(endpointOptions)); - } - const request = (route2, parameters2) => { - return fetchWrapper( - endpoint.parse(endpoint.merge(route2, parameters2)) - ); - }; - Object.assign(request, { - endpoint, - defaults: withDefaults$1.bind(null, endpoint) - }); - return endpointOptions.request.hook(request, endpointOptions); - }; - return Object.assign(newApi, { - endpoint, - defaults: withDefaults$1.bind(null, endpoint) - }); -} + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 + * @param {number} c + */ + function isTokenCharCode (c) { + switch (c) { + case 0x22: + case 0x28: + case 0x29: + case 0x2c: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x40: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x7b: + case 0x7d: + // DQUOTE and "(),/:;<=>?@[\]{}" + return false + default: + // VCHAR %x21-7E + return c >= 0x21 && c <= 0x7e + } + } -const request = withDefaults$1(endpoint, { - headers: { - "user-agent": `octokit-request.js/${VERSION$4} ${getUserAgent()}` - } -}); + /** + * @param {string} characters + */ + function isValidHTTPToken (characters) { + if (characters.length === 0) { + return false + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false + } + } + return true + } -// pkg/dist-src/index.js + // headerCharRegex have been lifted from + // https://github.com/nodejs/node/blob/main/lib/_http_common.js -// pkg/dist-src/version.js -var VERSION$3 = "7.1.1"; + /** + * Matches if val contains an invalid field-vchar + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + */ + const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; -// pkg/dist-src/error.js -function _buildMessageForResponseErrors(data) { - return `Request failed due to following response errors: -` + data.errors.map((e) => ` - ${e.message}`).join("\n"); -} -var GraphqlResponseError = class extends Error { - constructor(request2, headers, response) { - super(_buildMessageForResponseErrors(response)); - this.request = request2; - this.headers = headers; - this.response = response; - this.name = "GraphqlResponseError"; - this.errors = response.errors; - this.data = response.data; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - } -}; + /** + * @param {string} characters + */ + function isValidHeaderValue (characters) { + return !headerCharRegex.test(characters) + } -// pkg/dist-src/graphql.js -var NON_VARIABLE_OPTIONS = [ - "method", - "baseUrl", - "url", - "headers", - "request", - "query", - "mediaType" -]; -var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; -var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; -function graphql(request2, query, options) { - if (options) { - if (typeof query === "string" && "query" in options) { - return Promise.reject( - new Error(`[@octokit/graphql] "query" cannot be used as variable name`) - ); - } - for (const key in options) { - if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; - return Promise.reject( - new Error( - `[@octokit/graphql] "${key}" cannot be used as variable name` - ) - ); - } - } - const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; - const requestOptions = Object.keys( - parsedOptions - ).reduce((result, key) => { - if (NON_VARIABLE_OPTIONS.includes(key)) { - result[key] = parsedOptions[key]; - return result; - } - if (!result.variables) { - result.variables = {}; - } - result.variables[key] = parsedOptions[key]; - return result; - }, {}); - const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; - if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { - requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); - } - return request2(requestOptions).then((response) => { - if (response.data.errors) { - const headers = {}; - for (const key of Object.keys(response.headers)) { - headers[key] = response.headers[key]; - } - throw new GraphqlResponseError( - requestOptions, - headers, - response.data - ); - } - return response.data.data; - }); -} + // Parsed accordingly to RFC 9110 + // https://www.rfc-editor.org/rfc/rfc9110#field.content-range + function parseRangeHeader (range) { + if (range == null || range === '') return { start: 0, end: null, size: null } -// pkg/dist-src/with-defaults.js -function withDefaults(request2, newDefaults) { - const newRequest = request2.defaults(newDefaults); - const newApi = (query, options) => { - return graphql(newRequest, query, options); - }; - return Object.assign(newApi, { - defaults: withDefaults.bind(null, newRequest), - endpoint: newRequest.endpoint - }); -} + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; + return m + ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } + : null + } -// pkg/dist-src/index.js -withDefaults(request, { - headers: { - "user-agent": `octokit-graphql.js/${VERSION$3} ${getUserAgent()}` - }, - method: "POST", - url: "/graphql" -}); -function withCustomRequest(customRequest) { - return withDefaults(customRequest, { - method: "POST", - url: "/graphql" - }); -} + function addListener (obj, name, listener) { + const listeners = (obj[kListeners] ??= []); + listeners.push([name, listener]); + obj.on(name, listener); + return obj + } -const REGEX_IS_INSTALLATION_LEGACY = /^v1\./; -const REGEX_IS_INSTALLATION = /^ghs_/; -const REGEX_IS_USER_TO_SERVER = /^ghu_/; -async function auth$2(token) { - const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); - const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; - return { - type: "token", - token, - tokenType - }; -} + function removeAllListeners (obj) { + for (const [name, listener] of obj[kListeners] ?? []) { + obj.removeListener(name, listener); + } + obj[kListeners] = null; + } -function withAuthorizationPrefix(token) { - if (token.split(/\./).length === 3) { - return `bearer ${token}`; - } - return `token ${token}`; -} + function errorRequest (client, request, err) { + try { + request.onError(err); + assert(request.aborted); + } catch (err) { + client.emit('error', err); + } + } -async function hook(token, request, route, parameters) { - const endpoint = request.endpoint.merge( - route, - parameters - ); - endpoint.headers.authorization = withAuthorizationPrefix(token); - return request(endpoint); -} + const kEnumerableProperty = Object.create(null); + kEnumerableProperty.enumerable = true; -const createTokenAuth = function createTokenAuth2(token) { - if (!token) { - throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); - } - if (typeof token !== "string") { - throw new Error( - "[@octokit/auth-token] Token passed to createTokenAuth is not a string" - ); - } - token = token.replace(/^(token|bearer) +/i, ""); - return Object.assign(auth$2.bind(null, token), { - hook: hook.bind(null, token) - }); -}; + const normalizedMethodRecordsBase = { + delete: 'DELETE', + DELETE: 'DELETE', + get: 'GET', + GET: 'GET', + head: 'HEAD', + HEAD: 'HEAD', + options: 'OPTIONS', + OPTIONS: 'OPTIONS', + post: 'POST', + POST: 'POST', + put: 'PUT', + PUT: 'PUT' + }; -// pkg/dist-src/index.js + const normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: 'patch', + PATCH: 'PATCH' + }; -// pkg/dist-src/version.js -var VERSION$2 = "5.2.0"; + // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); -// pkg/dist-src/index.js -var noop = () => { -}; -var consoleWarn = console.warn.bind(console); -var consoleError = console.error.bind(console); -var userAgentTrail = `octokit-core.js/${VERSION$2} ${getUserAgent()}`; -var Octokit = class { - static { - this.VERSION = VERSION$2; - } - static defaults(defaults) { - const OctokitWithDefaults = class extends this { - constructor(...args) { - const options = args[0] || {}; - if (typeof defaults === "function") { - super(defaults(options)); - return; - } - super( - Object.assign( - {}, - defaults, - options, - options.userAgent && defaults.userAgent ? { - userAgent: `${options.userAgent} ${defaults.userAgent}` - } : null - ) - ); - } - }; - return OctokitWithDefaults; - } - static { - this.plugins = []; - } - /** - * Attach a plugin (or many) to your Octokit instance. - * - * @example - * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) - */ - static plugin(...newPlugins) { - const currentPlugins = this.plugins; - const NewOctokit = class extends this { - static { - this.plugins = currentPlugins.concat( - newPlugins.filter((plugin) => !currentPlugins.includes(plugin)) - ); - } - }; - return NewOctokit; - } - constructor(options = {}) { - const hook = new beforeAfterHookExports.Collection(); - const requestDefaults = { - baseUrl: request.endpoint.DEFAULTS.baseUrl, - headers: {}, - request: Object.assign({}, options.request, { - // @ts-ignore internal usage only, no need to type - hook: hook.bind(null, "request") - }), - mediaType: { - previews: [], - format: "" - } - }; - requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail; - if (options.baseUrl) { - requestDefaults.baseUrl = options.baseUrl; - } - if (options.previews) { - requestDefaults.mediaType.previews = options.previews; - } - if (options.timeZone) { - requestDefaults.headers["time-zone"] = options.timeZone; - } - this.request = request.defaults(requestDefaults); - this.graphql = withCustomRequest(this.request).defaults(requestDefaults); - this.log = Object.assign( - { - debug: noop, - info: noop, - warn: consoleWarn, - error: consoleError - }, - options.log - ); - this.hook = hook; - if (!options.authStrategy) { - if (!options.auth) { - this.auth = async () => ({ - type: "unauthenticated" - }); - } else { - const auth = createTokenAuth(options.auth); - hook.wrap("request", auth.hook); - this.auth = auth; - } - } else { - const { authStrategy, ...otherOptions } = options; - const auth = authStrategy( - Object.assign( - { - request: this.request, - log: this.log, - // we pass the current octokit instance as well as its constructor options - // to allow for authentication strategies that return a new octokit instance - // that shares the same internal state as the current one. The original - // requirement for this was the "event-octokit" authentication strategy - // of https://github.com/probot/octokit-auth-probot. - octokit: this, - octokitOptions: otherOptions - }, - options.auth - ) - ); - hook.wrap("request", auth.hook); - this.auth = auth; - } - const classConstructor = this.constructor; - for (let i = 0; i < classConstructor.plugins.length; ++i) { - Object.assign(this, classConstructor.plugins[i](this, options)); - } - } -}; + util$9 = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isUSVString, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, + parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, + nodeMajor, + nodeMinor, + safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'], + wrapRequestBody + }; + return util$9; +} + +var diagnostics; +var hasRequiredDiagnostics; + +function requireDiagnostics () { + if (hasRequiredDiagnostics) return diagnostics; + hasRequiredDiagnostics = 1; + const diagnosticsChannel = require$$0$b; + const util = require$$0$a; + + const undiciDebugLog = util.debuglog('undici'); + const fetchDebuglog = util.debuglog('fetch'); + const websocketDebuglog = util.debuglog('websocket'); + let isClientSet = false; + const channels = { + // Client + beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), + connected: diagnosticsChannel.channel('undici:client:connected'), + connectError: diagnosticsChannel.channel('undici:client:connectError'), + sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'), + // Request + create: diagnosticsChannel.channel('undici:request:create'), + bodySent: diagnosticsChannel.channel('undici:request:bodySent'), + headers: diagnosticsChannel.channel('undici:request:headers'), + trailers: diagnosticsChannel.channel('undici:request:trailers'), + error: diagnosticsChannel.channel('undici:request:error'), + // WebSocket + open: diagnosticsChannel.channel('undici:websocket:open'), + close: diagnosticsChannel.channel('undici:websocket:close'), + socketError: diagnosticsChannel.channel('undici:websocket:socket_error'), + ping: diagnosticsChannel.channel('undici:websocket:ping'), + pong: diagnosticsChannel.channel('undici:websocket:pong') + }; + + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; + + // Track all Client events + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connecting to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ); + }); -var distWeb$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - Octokit: Octokit -}); + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connected to %s using %s%s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version + ); + }); -var require$$2 = /*@__PURE__*/getAugmentedNamespace(distWeb$1); + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + 'connection to %s using %s%s errored - %s', + `${host}${port ? `:${port}` : ''}`, + protocol, + version, + error.message + ); + }); -const VERSION$1 = "10.4.1"; + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('sending request to %s %s/%s', method, origin, path); + }); -const Endpoints = { - actions: { - addCustomLabelsToSelfHostedRunnerForOrg: [ - "POST /orgs/{org}/actions/runners/{runner_id}/labels" - ], - addCustomLabelsToSelfHostedRunnerForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - addSelectedRepoToOrgSecret: [ - "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" - ], - addSelectedRepoToOrgVariable: [ - "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" - ], - approveWorkflowRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve" - ], - cancelWorkflowRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel" - ], - createEnvironmentVariable: [ - "POST /repositories/{repository_id}/environments/{environment_name}/variables" - ], - createOrUpdateEnvironmentSecret: [ - "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}" - ], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], - createOrUpdateRepoSecret: [ - "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}" - ], - createOrgVariable: ["POST /orgs/{org}/actions/variables"], - createRegistrationTokenForOrg: [ - "POST /orgs/{org}/actions/runners/registration-token" - ], - createRegistrationTokenForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/registration-token" - ], - createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], - createRemoveTokenForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/remove-token" - ], - createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"], - createWorkflowDispatch: [ - "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches" - ], - deleteActionsCacheById: [ - "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}" - ], - deleteActionsCacheByKey: [ - "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}" - ], - deleteArtifact: [ - "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}" - ], - deleteEnvironmentSecret: [ - "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}" - ], - deleteEnvironmentVariable: [ - "DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}" - ], - deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], - deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"], - deleteRepoSecret: [ - "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}" - ], - deleteRepoVariable: [ - "DELETE /repos/{owner}/{repo}/actions/variables/{name}" - ], - deleteSelfHostedRunnerFromOrg: [ - "DELETE /orgs/{org}/actions/runners/{runner_id}" - ], - deleteSelfHostedRunnerFromRepo: [ - "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}" - ], - deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], - deleteWorkflowRunLogs: [ - "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs" - ], - disableSelectedRepositoryGithubActionsOrganization: [ - "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}" - ], - disableWorkflow: [ - "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable" - ], - downloadArtifact: [ - "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}" - ], - downloadJobLogsForWorkflowRun: [ - "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs" - ], - downloadWorkflowRunAttemptLogs: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs" - ], - downloadWorkflowRunLogs: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs" - ], - enableSelectedRepositoryGithubActionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}" - ], - enableWorkflow: [ - "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable" - ], - forceCancelWorkflowRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel" - ], - generateRunnerJitconfigForOrg: [ - "POST /orgs/{org}/actions/runners/generate-jitconfig" - ], - generateRunnerJitconfigForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig" - ], - getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], - getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], - getActionsCacheUsageByRepoForOrg: [ - "GET /orgs/{org}/actions/cache/usage-by-repository" - ], - getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], - getAllowedActionsOrganization: [ - "GET /orgs/{org}/actions/permissions/selected-actions" - ], - getAllowedActionsRepository: [ - "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" - ], - getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - getCustomOidcSubClaimForRepo: [ - "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" - ], - getEnvironmentPublicKey: [ - "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key" - ], - getEnvironmentSecret: [ - "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}" - ], - getEnvironmentVariable: [ - "GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}" - ], - getGithubActionsDefaultWorkflowPermissionsOrganization: [ - "GET /orgs/{org}/actions/permissions/workflow" - ], - getGithubActionsDefaultWorkflowPermissionsRepository: [ - "GET /repos/{owner}/{repo}/actions/permissions/workflow" - ], - getGithubActionsPermissionsOrganization: [ - "GET /orgs/{org}/actions/permissions" - ], - getGithubActionsPermissionsRepository: [ - "GET /repos/{owner}/{repo}/actions/permissions" - ], - getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], - getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], - getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"], - getPendingDeploymentsForRun: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" - ], - getRepoPermissions: [ - "GET /repos/{owner}/{repo}/actions/permissions", - {}, - { renamed: ["actions", "getGithubActionsPermissionsRepository"] } - ], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"], - getReviewsForRun: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals" - ], - getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], - getSelfHostedRunnerForRepo: [ - "GET /repos/{owner}/{repo}/actions/runners/{runner_id}" - ], - getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], - getWorkflowAccessToRepository: [ - "GET /repos/{owner}/{repo}/actions/permissions/access" - ], - getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], - getWorkflowRunAttempt: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}" - ], - getWorkflowRunUsage: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing" - ], - getWorkflowUsage: [ - "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing" - ], - listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], - listEnvironmentSecrets: [ - "GET /repositories/{repository_id}/environments/{environment_name}/secrets" - ], - listEnvironmentVariables: [ - "GET /repositories/{repository_id}/environments/{environment_name}/variables" - ], - listJobsForWorkflowRun: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs" - ], - listJobsForWorkflowRunAttempt: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs" - ], - listLabelsForSelfHostedRunnerForOrg: [ - "GET /orgs/{org}/actions/runners/{runner_id}/labels" - ], - listLabelsForSelfHostedRunnerForRepo: [ - "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], - listOrgVariables: ["GET /orgs/{org}/actions/variables"], - listRepoOrganizationSecrets: [ - "GET /repos/{owner}/{repo}/actions/organization-secrets" - ], - listRepoOrganizationVariables: [ - "GET /repos/{owner}/{repo}/actions/organization-variables" - ], - listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], - listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"], - listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], - listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], - listRunnerApplicationsForRepo: [ - "GET /repos/{owner}/{repo}/actions/runners/downloads" - ], - listSelectedReposForOrgSecret: [ - "GET /orgs/{org}/actions/secrets/{secret_name}/repositories" - ], - listSelectedReposForOrgVariable: [ - "GET /orgs/{org}/actions/variables/{name}/repositories" - ], - listSelectedRepositoriesEnabledGithubActionsOrganization: [ - "GET /orgs/{org}/actions/permissions/repositories" - ], - listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], - listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], - listWorkflowRunArtifacts: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts" - ], - listWorkflowRuns: [ - "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs" - ], - listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], - reRunJobForWorkflowRun: [ - "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun" - ], - reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], - reRunWorkflowFailedJobs: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs" - ], - removeAllCustomLabelsFromSelfHostedRunnerForOrg: [ - "DELETE /orgs/{org}/actions/runners/{runner_id}/labels" - ], - removeAllCustomLabelsFromSelfHostedRunnerForRepo: [ - "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - removeCustomLabelFromSelfHostedRunnerForOrg: [ - "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}" - ], - removeCustomLabelFromSelfHostedRunnerForRepo: [ - "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}" - ], - removeSelectedRepoFromOrgSecret: [ - "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" - ], - removeSelectedRepoFromOrgVariable: [ - "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" - ], - reviewCustomGatesForRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule" - ], - reviewPendingDeploymentsForRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" - ], - setAllowedActionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/selected-actions" - ], - setAllowedActionsRepository: [ - "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions" - ], - setCustomLabelsForSelfHostedRunnerForOrg: [ - "PUT /orgs/{org}/actions/runners/{runner_id}/labels" - ], - setCustomLabelsForSelfHostedRunnerForRepo: [ - "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - setCustomOidcSubClaimForRepo: [ - "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" - ], - setGithubActionsDefaultWorkflowPermissionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/workflow" - ], - setGithubActionsDefaultWorkflowPermissionsRepository: [ - "PUT /repos/{owner}/{repo}/actions/permissions/workflow" - ], - setGithubActionsPermissionsOrganization: [ - "PUT /orgs/{org}/actions/permissions" - ], - setGithubActionsPermissionsRepository: [ - "PUT /repos/{owner}/{repo}/actions/permissions" - ], - setSelectedReposForOrgSecret: [ - "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories" - ], - setSelectedReposForOrgVariable: [ - "PUT /orgs/{org}/actions/variables/{name}/repositories" - ], - setSelectedRepositoriesEnabledGithubActionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/repositories" - ], - setWorkflowAccessToRepository: [ - "PUT /repos/{owner}/{repo}/actions/permissions/access" - ], - updateEnvironmentVariable: [ - "PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}" - ], - updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"], - updateRepoVariable: [ - "PATCH /repos/{owner}/{repo}/actions/variables/{name}" - ] - }, - activity: { - checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], - deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], - deleteThreadSubscription: [ - "DELETE /notifications/threads/{thread_id}/subscription" - ], - getFeeds: ["GET /feeds"], - getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], - getThread: ["GET /notifications/threads/{thread_id}"], - getThreadSubscriptionForAuthenticatedUser: [ - "GET /notifications/threads/{thread_id}/subscription" - ], - listEventsForAuthenticatedUser: ["GET /users/{username}/events"], - listNotificationsForAuthenticatedUser: ["GET /notifications"], - listOrgEventsForAuthenticatedUser: [ - "GET /users/{username}/events/orgs/{org}" - ], - listPublicEvents: ["GET /events"], - listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], - listPublicEventsForUser: ["GET /users/{username}/events/public"], - listPublicOrgEvents: ["GET /orgs/{org}/events"], - listReceivedEventsForUser: ["GET /users/{username}/received_events"], - listReceivedPublicEventsForUser: [ - "GET /users/{username}/received_events/public" - ], - listRepoEvents: ["GET /repos/{owner}/{repo}/events"], - listRepoNotificationsForAuthenticatedUser: [ - "GET /repos/{owner}/{repo}/notifications" - ], - listReposStarredByAuthenticatedUser: ["GET /user/starred"], - listReposStarredByUser: ["GET /users/{username}/starred"], - listReposWatchedByUser: ["GET /users/{username}/subscriptions"], - listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], - listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], - listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], - markNotificationsAsRead: ["PUT /notifications"], - markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], - markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], - markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], - setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], - setThreadSubscription: [ - "PUT /notifications/threads/{thread_id}/subscription" - ], - starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], - unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] - }, - apps: { - addRepoToInstallation: [ - "PUT /user/installations/{installation_id}/repositories/{repository_id}", - {}, - { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] } - ], - addRepoToInstallationForAuthenticatedUser: [ - "PUT /user/installations/{installation_id}/repositories/{repository_id}" - ], - checkToken: ["POST /applications/{client_id}/token"], - createFromManifest: ["POST /app-manifests/{code}/conversions"], - createInstallationAccessToken: [ - "POST /app/installations/{installation_id}/access_tokens" - ], - deleteAuthorization: ["DELETE /applications/{client_id}/grant"], - deleteInstallation: ["DELETE /app/installations/{installation_id}"], - deleteToken: ["DELETE /applications/{client_id}/token"], - getAuthenticated: ["GET /app"], - getBySlug: ["GET /apps/{app_slug}"], - getInstallation: ["GET /app/installations/{installation_id}"], - getOrgInstallation: ["GET /orgs/{org}/installation"], - getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], - getSubscriptionPlanForAccount: [ - "GET /marketplace_listing/accounts/{account_id}" - ], - getSubscriptionPlanForAccountStubbed: [ - "GET /marketplace_listing/stubbed/accounts/{account_id}" - ], - getUserInstallation: ["GET /users/{username}/installation"], - getWebhookConfigForApp: ["GET /app/hook/config"], - getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], - listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], - listAccountsForPlanStubbed: [ - "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts" - ], - listInstallationReposForAuthenticatedUser: [ - "GET /user/installations/{installation_id}/repositories" - ], - listInstallationRequestsForAuthenticatedApp: [ - "GET /app/installation-requests" - ], - listInstallations: ["GET /app/installations"], - listInstallationsForAuthenticatedUser: ["GET /user/installations"], - listPlans: ["GET /marketplace_listing/plans"], - listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], - listReposAccessibleToInstallation: ["GET /installation/repositories"], - listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], - listSubscriptionsForAuthenticatedUserStubbed: [ - "GET /user/marketplace_purchases/stubbed" - ], - listWebhookDeliveries: ["GET /app/hook/deliveries"], - redeliverWebhookDelivery: [ - "POST /app/hook/deliveries/{delivery_id}/attempts" - ], - removeRepoFromInstallation: [ - "DELETE /user/installations/{installation_id}/repositories/{repository_id}", - {}, - { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] } - ], - removeRepoFromInstallationForAuthenticatedUser: [ - "DELETE /user/installations/{installation_id}/repositories/{repository_id}" - ], - resetToken: ["PATCH /applications/{client_id}/token"], - revokeInstallationAccessToken: ["DELETE /installation/token"], - scopeToken: ["POST /applications/{client_id}/token/scoped"], - suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], - unsuspendInstallation: [ - "DELETE /app/installations/{installation_id}/suspended" - ], - updateWebhookConfigForApp: ["PATCH /app/hook/config"] - }, - billing: { - getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], - getGithubActionsBillingUser: [ - "GET /users/{username}/settings/billing/actions" - ], - getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], - getGithubPackagesBillingUser: [ - "GET /users/{username}/settings/billing/packages" - ], - getSharedStorageBillingOrg: [ - "GET /orgs/{org}/settings/billing/shared-storage" - ], - getSharedStorageBillingUser: [ - "GET /users/{username}/settings/billing/shared-storage" - ] - }, - checks: { - create: ["POST /repos/{owner}/{repo}/check-runs"], - createSuite: ["POST /repos/{owner}/{repo}/check-suites"], - get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], - getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], - listAnnotations: [ - "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations" - ], - listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], - listForSuite: [ - "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs" - ], - listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], - rerequestRun: [ - "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest" - ], - rerequestSuite: [ - "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest" - ], - setSuitesPreferences: [ - "PATCH /repos/{owner}/{repo}/check-suites/preferences" - ], - update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] - }, - codeScanning: { - deleteAnalysis: [ - "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" - ], - getAlert: [ - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", - {}, - { renamedParameters: { alert_id: "alert_number" } } - ], - getAnalysis: [ - "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}" - ], - getCodeqlDatabase: [ - "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" - ], - getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], - getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], - listAlertInstances: [ - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances" - ], - listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], - listAlertsInstances: [ - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", - {}, - { renamed: ["codeScanning", "listAlertInstances"] } - ], - listCodeqlDatabases: [ - "GET /repos/{owner}/{repo}/code-scanning/codeql/databases" - ], - listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], - updateAlert: [ - "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}" - ], - updateDefaultSetup: [ - "PATCH /repos/{owner}/{repo}/code-scanning/default-setup" - ], - uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] - }, - codesOfConduct: { - getAllCodesOfConduct: ["GET /codes_of_conduct"], - getConductCode: ["GET /codes_of_conduct/{key}"] - }, - codespaces: { - addRepositoryForSecretForAuthenticatedUser: [ - "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - addSelectedRepoToOrgSecret: [ - "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - checkPermissionsForDevcontainer: [ - "GET /repos/{owner}/{repo}/codespaces/permissions_check" - ], - codespaceMachinesForAuthenticatedUser: [ - "GET /user/codespaces/{codespace_name}/machines" - ], - createForAuthenticatedUser: ["POST /user/codespaces"], - createOrUpdateOrgSecret: [ - "PUT /orgs/{org}/codespaces/secrets/{secret_name}" - ], - createOrUpdateRepoSecret: [ - "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" - ], - createOrUpdateSecretForAuthenticatedUser: [ - "PUT /user/codespaces/secrets/{secret_name}" - ], - createWithPrForAuthenticatedUser: [ - "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces" - ], - createWithRepoForAuthenticatedUser: [ - "POST /repos/{owner}/{repo}/codespaces" - ], - deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], - deleteFromOrganization: [ - "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}" - ], - deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"], - deleteRepoSecret: [ - "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" - ], - deleteSecretForAuthenticatedUser: [ - "DELETE /user/codespaces/secrets/{secret_name}" - ], - exportForAuthenticatedUser: [ - "POST /user/codespaces/{codespace_name}/exports" - ], - getCodespacesForUserInOrg: [ - "GET /orgs/{org}/members/{username}/codespaces" - ], - getExportDetailsForAuthenticatedUser: [ - "GET /user/codespaces/{codespace_name}/exports/{export_id}" - ], - getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], - getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"], - getPublicKeyForAuthenticatedUser: [ - "GET /user/codespaces/secrets/public-key" - ], - getRepoPublicKey: [ - "GET /repos/{owner}/{repo}/codespaces/secrets/public-key" - ], - getRepoSecret: [ - "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" - ], - getSecretForAuthenticatedUser: [ - "GET /user/codespaces/secrets/{secret_name}" - ], - listDevcontainersInRepositoryForAuthenticatedUser: [ - "GET /repos/{owner}/{repo}/codespaces/devcontainers" - ], - listForAuthenticatedUser: ["GET /user/codespaces"], - listInOrganization: [ - "GET /orgs/{org}/codespaces", - {}, - { renamedParameters: { org_id: "org" } } - ], - listInRepositoryForAuthenticatedUser: [ - "GET /repos/{owner}/{repo}/codespaces" - ], - listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], - listRepositoriesForSecretForAuthenticatedUser: [ - "GET /user/codespaces/secrets/{secret_name}/repositories" - ], - listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], - listSelectedReposForOrgSecret: [ - "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories" - ], - preFlightWithRepoForAuthenticatedUser: [ - "GET /repos/{owner}/{repo}/codespaces/new" - ], - publishForAuthenticatedUser: [ - "POST /user/codespaces/{codespace_name}/publish" - ], - removeRepositoryForSecretForAuthenticatedUser: [ - "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - removeSelectedRepoFromOrgSecret: [ - "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - repoMachinesForAuthenticatedUser: [ - "GET /repos/{owner}/{repo}/codespaces/machines" - ], - setRepositoriesForSecretForAuthenticatedUser: [ - "PUT /user/codespaces/secrets/{secret_name}/repositories" - ], - setSelectedReposForOrgSecret: [ - "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories" - ], - startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], - stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], - stopInOrganization: [ - "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop" - ], - updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] - }, - copilot: { - addCopilotSeatsForTeams: [ - "POST /orgs/{org}/copilot/billing/selected_teams" - ], - addCopilotSeatsForUsers: [ - "POST /orgs/{org}/copilot/billing/selected_users" - ], - cancelCopilotSeatAssignmentForTeams: [ - "DELETE /orgs/{org}/copilot/billing/selected_teams" - ], - cancelCopilotSeatAssignmentForUsers: [ - "DELETE /orgs/{org}/copilot/billing/selected_users" - ], - getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], - getCopilotSeatDetailsForUser: [ - "GET /orgs/{org}/members/{username}/copilot" - ], - listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] - }, - dependabot: { - addSelectedRepoToOrgSecret: [ - "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" - ], - createOrUpdateOrgSecret: [ - "PUT /orgs/{org}/dependabot/secrets/{secret_name}" - ], - createOrUpdateRepoSecret: [ - "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" - ], - deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], - deleteRepoSecret: [ - "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" - ], - getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], - getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], - getRepoPublicKey: [ - "GET /repos/{owner}/{repo}/dependabot/secrets/public-key" - ], - getRepoSecret: [ - "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" - ], - listAlertsForEnterprise: [ - "GET /enterprises/{enterprise}/dependabot/alerts" - ], - listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"], - listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], - listSelectedReposForOrgSecret: [ - "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories" - ], - removeSelectedRepoFromOrgSecret: [ - "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" - ], - setSelectedReposForOrgSecret: [ - "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories" - ], - updateAlert: [ - "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}" - ] - }, - dependencyGraph: { - createRepositorySnapshot: [ - "POST /repos/{owner}/{repo}/dependency-graph/snapshots" - ], - diffRange: [ - "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}" - ], - exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"] - }, - emojis: { get: ["GET /emojis"] }, - gists: { - checkIsStarred: ["GET /gists/{gist_id}/star"], - create: ["POST /gists"], - createComment: ["POST /gists/{gist_id}/comments"], - delete: ["DELETE /gists/{gist_id}"], - deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], - fork: ["POST /gists/{gist_id}/forks"], - get: ["GET /gists/{gist_id}"], - getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], - getRevision: ["GET /gists/{gist_id}/{sha}"], - list: ["GET /gists"], - listComments: ["GET /gists/{gist_id}/comments"], - listCommits: ["GET /gists/{gist_id}/commits"], - listForUser: ["GET /users/{username}/gists"], - listForks: ["GET /gists/{gist_id}/forks"], - listPublic: ["GET /gists/public"], - listStarred: ["GET /gists/starred"], - star: ["PUT /gists/{gist_id}/star"], - unstar: ["DELETE /gists/{gist_id}/star"], - update: ["PATCH /gists/{gist_id}"], - updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] - }, - git: { - createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], - createCommit: ["POST /repos/{owner}/{repo}/git/commits"], - createRef: ["POST /repos/{owner}/{repo}/git/refs"], - createTag: ["POST /repos/{owner}/{repo}/git/tags"], - createTree: ["POST /repos/{owner}/{repo}/git/trees"], - deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], - getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], - getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], - getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], - getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], - getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], - listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], - updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] - }, - gitignore: { - getAllTemplates: ["GET /gitignore/templates"], - getTemplate: ["GET /gitignore/templates/{name}"] - }, - interactions: { - getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], - getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], - getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], - getRestrictionsForYourPublicRepos: [ - "GET /user/interaction-limits", - {}, - { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] } - ], - removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], - removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], - removeRestrictionsForRepo: [ - "DELETE /repos/{owner}/{repo}/interaction-limits" - ], - removeRestrictionsForYourPublicRepos: [ - "DELETE /user/interaction-limits", - {}, - { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] } - ], - setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], - setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], - setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], - setRestrictionsForYourPublicRepos: [ - "PUT /user/interaction-limits", - {}, - { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] } - ] - }, - issues: { - addAssignees: [ - "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees" - ], - addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], - checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], - checkUserCanBeAssignedToIssue: [ - "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" - ], - create: ["POST /repos/{owner}/{repo}/issues"], - createComment: [ - "POST /repos/{owner}/{repo}/issues/{issue_number}/comments" - ], - createLabel: ["POST /repos/{owner}/{repo}/labels"], - createMilestone: ["POST /repos/{owner}/{repo}/milestones"], - deleteComment: [ - "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}" - ], - deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], - deleteMilestone: [ - "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}" - ], - get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], - getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], - getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], - getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], - getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], - list: ["GET /issues"], - listAssignees: ["GET /repos/{owner}/{repo}/assignees"], - listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], - listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], - listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], - listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], - listEventsForTimeline: [ - "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline" - ], - listForAuthenticatedUser: ["GET /user/issues"], - listForOrg: ["GET /orgs/{org}/issues"], - listForRepo: ["GET /repos/{owner}/{repo}/issues"], - listLabelsForMilestone: [ - "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels" - ], - listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], - listLabelsOnIssue: [ - "GET /repos/{owner}/{repo}/issues/{issue_number}/labels" - ], - listMilestones: ["GET /repos/{owner}/{repo}/milestones"], - lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], - removeAllLabels: [ - "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels" - ], - removeAssignees: [ - "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees" - ], - removeLabel: [ - "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}" - ], - setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], - unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], - update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], - updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], - updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], - updateMilestone: [ - "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}" - ] - }, - licenses: { - get: ["GET /licenses/{license}"], - getAllCommonlyUsed: ["GET /licenses"], - getForRepo: ["GET /repos/{owner}/{repo}/license"] - }, - markdown: { - render: ["POST /markdown"], - renderRaw: [ - "POST /markdown/raw", - { headers: { "content-type": "text/plain; charset=utf-8" } } - ] - }, - meta: { - get: ["GET /meta"], - getAllVersions: ["GET /versions"], - getOctocat: ["GET /octocat"], - getZen: ["GET /zen"], - root: ["GET /"] - }, - migrations: { - cancelImport: [ - "DELETE /repos/{owner}/{repo}/import", - {}, - { - deprecated: "octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import" - } - ], - deleteArchiveForAuthenticatedUser: [ - "DELETE /user/migrations/{migration_id}/archive" - ], - deleteArchiveForOrg: [ - "DELETE /orgs/{org}/migrations/{migration_id}/archive" - ], - downloadArchiveForOrg: [ - "GET /orgs/{org}/migrations/{migration_id}/archive" - ], - getArchiveForAuthenticatedUser: [ - "GET /user/migrations/{migration_id}/archive" - ], - getCommitAuthors: [ - "GET /repos/{owner}/{repo}/import/authors", - {}, - { - deprecated: "octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors" - } - ], - getImportStatus: [ - "GET /repos/{owner}/{repo}/import", - {}, - { - deprecated: "octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status" - } - ], - getLargeFiles: [ - "GET /repos/{owner}/{repo}/import/large_files", - {}, - { - deprecated: "octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files" - } - ], - getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], - getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], - listForAuthenticatedUser: ["GET /user/migrations"], - listForOrg: ["GET /orgs/{org}/migrations"], - listReposForAuthenticatedUser: [ - "GET /user/migrations/{migration_id}/repositories" - ], - listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], - listReposForUser: [ - "GET /user/migrations/{migration_id}/repositories", - {}, - { renamed: ["migrations", "listReposForAuthenticatedUser"] } - ], - mapCommitAuthor: [ - "PATCH /repos/{owner}/{repo}/import/authors/{author_id}", - {}, - { - deprecated: "octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author" - } - ], - setLfsPreference: [ - "PATCH /repos/{owner}/{repo}/import/lfs", - {}, - { - deprecated: "octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference" - } - ], - startForAuthenticatedUser: ["POST /user/migrations"], - startForOrg: ["POST /orgs/{org}/migrations"], - startImport: [ - "PUT /repos/{owner}/{repo}/import", - {}, - { - deprecated: "octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import" - } - ], - unlockRepoForAuthenticatedUser: [ - "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock" - ], - unlockRepoForOrg: [ - "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock" - ], - updateImport: [ - "PATCH /repos/{owner}/{repo}/import", - {}, - { - deprecated: "octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import" - } - ] - }, - oidc: { - getOidcCustomSubTemplateForOrg: [ - "GET /orgs/{org}/actions/oidc/customization/sub" - ], - updateOidcCustomSubTemplateForOrg: [ - "PUT /orgs/{org}/actions/oidc/customization/sub" - ] - }, - orgs: { - addSecurityManagerTeam: [ - "PUT /orgs/{org}/security-managers/teams/{team_slug}" - ], - assignTeamToOrgRole: [ - "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" - ], - assignUserToOrgRole: [ - "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" - ], - blockUser: ["PUT /orgs/{org}/blocks/{username}"], - cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], - checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], - checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], - checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], - convertMemberToOutsideCollaborator: [ - "PUT /orgs/{org}/outside_collaborators/{username}" - ], - createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], - createInvitation: ["POST /orgs/{org}/invitations"], - createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], - createOrUpdateCustomPropertiesValuesForRepos: [ - "PATCH /orgs/{org}/properties/values" - ], - createOrUpdateCustomProperty: [ - "PUT /orgs/{org}/properties/schema/{custom_property_name}" - ], - createWebhook: ["POST /orgs/{org}/hooks"], - delete: ["DELETE /orgs/{org}"], - deleteCustomOrganizationRole: [ - "DELETE /orgs/{org}/organization-roles/{role_id}" - ], - deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], - enableOrDisableSecurityProductOnAllOrgRepos: [ - "POST /orgs/{org}/{security_product}/{enablement}" - ], - get: ["GET /orgs/{org}"], - getAllCustomProperties: ["GET /orgs/{org}/properties/schema"], - getCustomProperty: [ - "GET /orgs/{org}/properties/schema/{custom_property_name}" - ], - getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], - getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], - getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], - getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], - getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], - getWebhookDelivery: [ - "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}" - ], - list: ["GET /organizations"], - listAppInstallations: ["GET /orgs/{org}/installations"], - listBlockedUsers: ["GET /orgs/{org}/blocks"], - listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"], - listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], - listForAuthenticatedUser: ["GET /user/orgs"], - listForUser: ["GET /users/{username}/orgs"], - listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], - listMembers: ["GET /orgs/{org}/members"], - listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], - listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], - listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], - listOrgRoles: ["GET /orgs/{org}/organization-roles"], - listOrganizationFineGrainedPermissions: [ - "GET /orgs/{org}/organization-fine-grained-permissions" - ], - listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], - listPatGrantRepositories: [ - "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" - ], - listPatGrantRequestRepositories: [ - "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories" - ], - listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"], - listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], - listPendingInvitations: ["GET /orgs/{org}/invitations"], - listPublicMembers: ["GET /orgs/{org}/public_members"], - listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], - listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], - listWebhooks: ["GET /orgs/{org}/hooks"], - patchCustomOrganizationRole: [ - "PATCH /orgs/{org}/organization-roles/{role_id}" - ], - pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], - redeliverWebhookDelivery: [ - "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" - ], - removeCustomProperty: [ - "DELETE /orgs/{org}/properties/schema/{custom_property_name}" - ], - removeMember: ["DELETE /orgs/{org}/members/{username}"], - removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], - removeOutsideCollaborator: [ - "DELETE /orgs/{org}/outside_collaborators/{username}" - ], - removePublicMembershipForAuthenticatedUser: [ - "DELETE /orgs/{org}/public_members/{username}" - ], - removeSecurityManagerTeam: [ - "DELETE /orgs/{org}/security-managers/teams/{team_slug}" - ], - reviewPatGrantRequest: [ - "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}" - ], - reviewPatGrantRequestsInBulk: [ - "POST /orgs/{org}/personal-access-token-requests" - ], - revokeAllOrgRolesTeam: [ - "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" - ], - revokeAllOrgRolesUser: [ - "DELETE /orgs/{org}/organization-roles/users/{username}" - ], - revokeOrgRoleTeam: [ - "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" - ], - revokeOrgRoleUser: [ - "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" - ], - setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], - setPublicMembershipForAuthenticatedUser: [ - "PUT /orgs/{org}/public_members/{username}" - ], - unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], - update: ["PATCH /orgs/{org}"], - updateMembershipForAuthenticatedUser: [ - "PATCH /user/memberships/orgs/{org}" - ], - updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"], - updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"], - updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], - updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] - }, - packages: { - deletePackageForAuthenticatedUser: [ - "DELETE /user/packages/{package_type}/{package_name}" - ], - deletePackageForOrg: [ - "DELETE /orgs/{org}/packages/{package_type}/{package_name}" - ], - deletePackageForUser: [ - "DELETE /users/{username}/packages/{package_type}/{package_name}" - ], - deletePackageVersionForAuthenticatedUser: [ - "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - deletePackageVersionForOrg: [ - "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - deletePackageVersionForUser: [ - "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - getAllPackageVersionsForAPackageOwnedByAnOrg: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", - {}, - { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] } - ], - getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}/versions", - {}, - { - renamed: [ - "packages", - "getAllPackageVersionsForPackageOwnedByAuthenticatedUser" - ] - } - ], - getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}/versions" - ], - getAllPackageVersionsForPackageOwnedByOrg: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions" - ], - getAllPackageVersionsForPackageOwnedByUser: [ - "GET /users/{username}/packages/{package_type}/{package_name}/versions" - ], - getPackageForAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}" - ], - getPackageForOrganization: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}" - ], - getPackageForUser: [ - "GET /users/{username}/packages/{package_type}/{package_name}" - ], - getPackageVersionForAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - getPackageVersionForOrganization: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - getPackageVersionForUser: [ - "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - listDockerMigrationConflictingPackagesForAuthenticatedUser: [ - "GET /user/docker/conflicts" - ], - listDockerMigrationConflictingPackagesForOrganization: [ - "GET /orgs/{org}/docker/conflicts" - ], - listDockerMigrationConflictingPackagesForUser: [ - "GET /users/{username}/docker/conflicts" - ], - listPackagesForAuthenticatedUser: ["GET /user/packages"], - listPackagesForOrganization: ["GET /orgs/{org}/packages"], - listPackagesForUser: ["GET /users/{username}/packages"], - restorePackageForAuthenticatedUser: [ - "POST /user/packages/{package_type}/{package_name}/restore{?token}" - ], - restorePackageForOrg: [ - "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}" - ], - restorePackageForUser: [ - "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}" - ], - restorePackageVersionForAuthenticatedUser: [ - "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" - ], - restorePackageVersionForOrg: [ - "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" - ], - restorePackageVersionForUser: [ - "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" - ] - }, - projects: { - addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], - createCard: ["POST /projects/columns/{column_id}/cards"], - createColumn: ["POST /projects/{project_id}/columns"], - createForAuthenticatedUser: ["POST /user/projects"], - createForOrg: ["POST /orgs/{org}/projects"], - createForRepo: ["POST /repos/{owner}/{repo}/projects"], - delete: ["DELETE /projects/{project_id}"], - deleteCard: ["DELETE /projects/columns/cards/{card_id}"], - deleteColumn: ["DELETE /projects/columns/{column_id}"], - get: ["GET /projects/{project_id}"], - getCard: ["GET /projects/columns/cards/{card_id}"], - getColumn: ["GET /projects/columns/{column_id}"], - getPermissionForUser: [ - "GET /projects/{project_id}/collaborators/{username}/permission" - ], - listCards: ["GET /projects/columns/{column_id}/cards"], - listCollaborators: ["GET /projects/{project_id}/collaborators"], - listColumns: ["GET /projects/{project_id}/columns"], - listForOrg: ["GET /orgs/{org}/projects"], - listForRepo: ["GET /repos/{owner}/{repo}/projects"], - listForUser: ["GET /users/{username}/projects"], - moveCard: ["POST /projects/columns/cards/{card_id}/moves"], - moveColumn: ["POST /projects/columns/{column_id}/moves"], - removeCollaborator: [ - "DELETE /projects/{project_id}/collaborators/{username}" - ], - update: ["PATCH /projects/{project_id}"], - updateCard: ["PATCH /projects/columns/cards/{card_id}"], - updateColumn: ["PATCH /projects/columns/{column_id}"] - }, - pulls: { - checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - create: ["POST /repos/{owner}/{repo}/pulls"], - createReplyForReviewComment: [ - "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies" - ], - createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - createReviewComment: [ - "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments" - ], - deletePendingReview: [ - "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" - ], - deleteReviewComment: [ - "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}" - ], - dismissReview: [ - "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals" - ], - get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], - getReview: [ - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" - ], - getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - list: ["GET /repos/{owner}/{repo}/pulls"], - listCommentsForReview: [ - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments" - ], - listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], - listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], - listRequestedReviewers: [ - "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" - ], - listReviewComments: [ - "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments" - ], - listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], - listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - removeRequestedReviewers: [ - "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" - ], - requestReviewers: [ - "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" - ], - submitReview: [ - "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events" - ], - update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], - updateBranch: [ - "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch" - ], - updateReview: [ - "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" - ], - updateReviewComment: [ - "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}" - ] - }, - rateLimit: { get: ["GET /rate_limit"] }, - reactions: { - createForCommitComment: [ - "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions" - ], - createForIssue: [ - "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions" - ], - createForIssueComment: [ - "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions" - ], - createForPullRequestReviewComment: [ - "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" - ], - createForRelease: [ - "POST /repos/{owner}/{repo}/releases/{release_id}/reactions" - ], - createForTeamDiscussionCommentInOrg: [ - "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" - ], - createForTeamDiscussionInOrg: [ - "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" - ], - deleteForCommitComment: [ - "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}" - ], - deleteForIssue: [ - "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}" - ], - deleteForIssueComment: [ - "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}" - ], - deleteForPullRequestComment: [ - "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}" - ], - deleteForRelease: [ - "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}" - ], - deleteForTeamDiscussion: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}" - ], - deleteForTeamDiscussionComment: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}" - ], - listForCommitComment: [ - "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions" - ], - listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], - listForIssueComment: [ - "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions" - ], - listForPullRequestReviewComment: [ - "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" - ], - listForRelease: [ - "GET /repos/{owner}/{repo}/releases/{release_id}/reactions" - ], - listForTeamDiscussionCommentInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" - ], - listForTeamDiscussionInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" - ] - }, - repos: { - acceptInvitation: [ - "PATCH /user/repository_invitations/{invitation_id}", - {}, - { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] } - ], - acceptInvitationForAuthenticatedUser: [ - "PATCH /user/repository_invitations/{invitation_id}" - ], - addAppAccessRestrictions: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", - {}, - { mapToData: "apps" } - ], - addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], - addStatusCheckContexts: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", - {}, - { mapToData: "contexts" } - ], - addTeamAccessRestrictions: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", - {}, - { mapToData: "teams" } - ], - addUserAccessRestrictions: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", - {}, - { mapToData: "users" } - ], - cancelPagesDeployment: [ - "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" - ], - checkAutomatedSecurityFixes: [ - "GET /repos/{owner}/{repo}/automated-security-fixes" - ], - checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], - checkVulnerabilityAlerts: [ - "GET /repos/{owner}/{repo}/vulnerability-alerts" - ], - codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], - compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], - compareCommitsWithBasehead: [ - "GET /repos/{owner}/{repo}/compare/{basehead}" - ], - createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], - createCommitComment: [ - "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments" - ], - createCommitSignatureProtection: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" - ], - createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], - createDeployKey: ["POST /repos/{owner}/{repo}/keys"], - createDeployment: ["POST /repos/{owner}/{repo}/deployments"], - createDeploymentBranchPolicy: [ - "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" - ], - createDeploymentProtectionRule: [ - "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" - ], - createDeploymentStatus: [ - "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses" - ], - createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], - createForAuthenticatedUser: ["POST /user/repos"], - createFork: ["POST /repos/{owner}/{repo}/forks"], - createInOrg: ["POST /orgs/{org}/repos"], - createOrUpdateCustomPropertiesValues: [ - "PATCH /repos/{owner}/{repo}/properties/values" - ], - createOrUpdateEnvironment: [ - "PUT /repos/{owner}/{repo}/environments/{environment_name}" - ], - createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], - createOrgRuleset: ["POST /orgs/{org}/rulesets"], - createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], - createPagesSite: ["POST /repos/{owner}/{repo}/pages"], - createRelease: ["POST /repos/{owner}/{repo}/releases"], - createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], - createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], - createUsingTemplate: [ - "POST /repos/{template_owner}/{template_repo}/generate" - ], - createWebhook: ["POST /repos/{owner}/{repo}/hooks"], - declineInvitation: [ - "DELETE /user/repository_invitations/{invitation_id}", - {}, - { renamed: ["repos", "declineInvitationForAuthenticatedUser"] } - ], - declineInvitationForAuthenticatedUser: [ - "DELETE /user/repository_invitations/{invitation_id}" - ], - delete: ["DELETE /repos/{owner}/{repo}"], - deleteAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" - ], - deleteAdminBranchProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" - ], - deleteAnEnvironment: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}" - ], - deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], - deleteBranchProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection" - ], - deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], - deleteCommitSignatureProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" - ], - deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], - deleteDeployment: [ - "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}" - ], - deleteDeploymentBranchPolicy: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" - ], - deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], - deleteInvitation: [ - "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}" - ], - deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"], - deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], - deletePullRequestReviewProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" - ], - deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], - deleteReleaseAsset: [ - "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}" - ], - deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - deleteTagProtection: [ - "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}" - ], - deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], - disableAutomatedSecurityFixes: [ - "DELETE /repos/{owner}/{repo}/automated-security-fixes" - ], - disableDeploymentProtectionRule: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" - ], - disablePrivateVulnerabilityReporting: [ - "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting" - ], - disableVulnerabilityAlerts: [ - "DELETE /repos/{owner}/{repo}/vulnerability-alerts" - ], - downloadArchive: [ - "GET /repos/{owner}/{repo}/zipball/{ref}", - {}, - { renamed: ["repos", "downloadZipballArchive"] } - ], - downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], - downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], - enableAutomatedSecurityFixes: [ - "PUT /repos/{owner}/{repo}/automated-security-fixes" - ], - enablePrivateVulnerabilityReporting: [ - "PUT /repos/{owner}/{repo}/private-vulnerability-reporting" - ], - enableVulnerabilityAlerts: [ - "PUT /repos/{owner}/{repo}/vulnerability-alerts" - ], - generateReleaseNotes: [ - "POST /repos/{owner}/{repo}/releases/generate-notes" - ], - get: ["GET /repos/{owner}/{repo}"], - getAccessRestrictions: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" - ], - getAdminBranchProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" - ], - getAllDeploymentProtectionRules: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" - ], - getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], - getAllStatusCheckContexts: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts" - ], - getAllTopics: ["GET /repos/{owner}/{repo}/topics"], - getAppsWithAccessToProtectedBranch: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps" - ], - getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], - getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], - getBranchProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection" - ], - getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"], - getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], - getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], - getCollaboratorPermissionLevel: [ - "GET /repos/{owner}/{repo}/collaborators/{username}/permission" - ], - getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], - getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], - getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], - getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], - getCommitSignatureProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" - ], - getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], - getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], - getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], - getCustomDeploymentProtectionRule: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" - ], - getCustomPropertiesValues: ["GET /repos/{owner}/{repo}/properties/values"], - getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], - getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], - getDeploymentBranchPolicy: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" - ], - getDeploymentStatus: [ - "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}" - ], - getEnvironment: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}" - ], - getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], - getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], - getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"], - getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"], - getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"], - getOrgRulesets: ["GET /orgs/{org}/rulesets"], - getPages: ["GET /repos/{owner}/{repo}/pages"], - getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], - getPagesDeployment: [ - "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" - ], - getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], - getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], - getPullRequestReviewProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" - ], - getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], - getReadme: ["GET /repos/{owner}/{repo}/readme"], - getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], - getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], - getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], - getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], - getRepoRuleSuite: [ - "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}" - ], - getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], - getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], - getStatusChecksProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" - ], - getTeamsWithAccessToProtectedBranch: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams" - ], - getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], - getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], - getUsersWithAccessToProtectedBranch: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users" - ], - getViews: ["GET /repos/{owner}/{repo}/traffic/views"], - getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], - getWebhookConfigForRepo: [ - "GET /repos/{owner}/{repo}/hooks/{hook_id}/config" - ], - getWebhookDelivery: [ - "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}" - ], - listActivities: ["GET /repos/{owner}/{repo}/activity"], - listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], - listBranches: ["GET /repos/{owner}/{repo}/branches"], - listBranchesForHeadCommit: [ - "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head" - ], - listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], - listCommentsForCommit: [ - "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments" - ], - listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], - listCommitStatusesForRef: [ - "GET /repos/{owner}/{repo}/commits/{ref}/statuses" - ], - listCommits: ["GET /repos/{owner}/{repo}/commits"], - listContributors: ["GET /repos/{owner}/{repo}/contributors"], - listCustomDeploymentRuleIntegrations: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps" - ], - listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], - listDeploymentBranchPolicies: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" - ], - listDeploymentStatuses: [ - "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses" - ], - listDeployments: ["GET /repos/{owner}/{repo}/deployments"], - listForAuthenticatedUser: ["GET /user/repos"], - listForOrg: ["GET /orgs/{org}/repos"], - listForUser: ["GET /users/{username}/repos"], - listForks: ["GET /repos/{owner}/{repo}/forks"], - listInvitations: ["GET /repos/{owner}/{repo}/invitations"], - listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], - listLanguages: ["GET /repos/{owner}/{repo}/languages"], - listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], - listPublic: ["GET /repositories"], - listPullRequestsAssociatedWithCommit: [ - "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls" - ], - listReleaseAssets: [ - "GET /repos/{owner}/{repo}/releases/{release_id}/assets" - ], - listReleases: ["GET /repos/{owner}/{repo}/releases"], - listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], - listTags: ["GET /repos/{owner}/{repo}/tags"], - listTeams: ["GET /repos/{owner}/{repo}/teams"], - listWebhookDeliveries: [ - "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries" - ], - listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], - merge: ["POST /repos/{owner}/{repo}/merges"], - mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], - pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], - redeliverWebhookDelivery: [ - "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" - ], - removeAppAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", - {}, - { mapToData: "apps" } - ], - removeCollaborator: [ - "DELETE /repos/{owner}/{repo}/collaborators/{username}" - ], - removeStatusCheckContexts: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", - {}, - { mapToData: "contexts" } - ], - removeStatusCheckProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" - ], - removeTeamAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", - {}, - { mapToData: "teams" } - ], - removeUserAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", - {}, - { mapToData: "users" } - ], - renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], - replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], - requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], - setAdminBranchProtection: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" - ], - setAppAccessRestrictions: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", - {}, - { mapToData: "apps" } - ], - setStatusCheckContexts: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", - {}, - { mapToData: "contexts" } - ], - setTeamAccessRestrictions: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", - {}, - { mapToData: "teams" } - ], - setUserAccessRestrictions: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", - {}, - { mapToData: "users" } - ], - testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], - transfer: ["POST /repos/{owner}/{repo}/transfer"], - update: ["PATCH /repos/{owner}/{repo}"], - updateBranchProtection: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection" - ], - updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], - updateDeploymentBranchPolicy: [ - "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" - ], - updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], - updateInvitation: [ - "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}" - ], - updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"], - updatePullRequestReviewProtection: [ - "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" - ], - updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], - updateReleaseAsset: [ - "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}" - ], - updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - updateStatusCheckPotection: [ - "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", - {}, - { renamed: ["repos", "updateStatusCheckProtection"] } - ], - updateStatusCheckProtection: [ - "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" - ], - updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], - updateWebhookConfigForRepo: [ - "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config" - ], - uploadReleaseAsset: [ - "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", - { baseUrl: "https://uploads.github.com" } - ] - }, - search: { - code: ["GET /search/code"], - commits: ["GET /search/commits"], - issuesAndPullRequests: ["GET /search/issues"], - labels: ["GET /search/labels"], - repos: ["GET /search/repositories"], - topics: ["GET /search/topics"], - users: ["GET /search/users"] - }, - secretScanning: { - getAlert: [ - "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" - ], - listAlertsForEnterprise: [ - "GET /enterprises/{enterprise}/secret-scanning/alerts" - ], - listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], - listLocationsForAlert: [ - "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations" - ], - updateAlert: [ - "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" - ] - }, - securityAdvisories: { - createFork: [ - "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" - ], - createPrivateVulnerabilityReport: [ - "POST /repos/{owner}/{repo}/security-advisories/reports" - ], - createRepositoryAdvisory: [ - "POST /repos/{owner}/{repo}/security-advisories" - ], - createRepositoryAdvisoryCveRequest: [ - "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve" - ], - getGlobalAdvisory: ["GET /advisories/{ghsa_id}"], - getRepositoryAdvisory: [ - "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}" - ], - listGlobalAdvisories: ["GET /advisories"], - listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"], - listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"], - updateRepositoryAdvisory: [ - "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}" - ] - }, - teams: { - addOrUpdateMembershipForUserInOrg: [ - "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}" - ], - addOrUpdateProjectPermissionsInOrg: [ - "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}" - ], - addOrUpdateRepoPermissionsInOrg: [ - "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" - ], - checkPermissionsForProjectInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}" - ], - checkPermissionsForRepoInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" - ], - create: ["POST /orgs/{org}/teams"], - createDiscussionCommentInOrg: [ - "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" - ], - createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], - deleteDiscussionCommentInOrg: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" - ], - deleteDiscussionInOrg: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" - ], - deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], - getByName: ["GET /orgs/{org}/teams/{team_slug}"], - getDiscussionCommentInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" - ], - getDiscussionInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" - ], - getMembershipForUserInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/memberships/{username}" - ], - list: ["GET /orgs/{org}/teams"], - listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], - listDiscussionCommentsInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" - ], - listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], - listForAuthenticatedUser: ["GET /user/teams"], - listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], - listPendingInvitationsInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/invitations" - ], - listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], - listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], - removeMembershipForUserInOrg: [ - "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}" - ], - removeProjectInOrg: [ - "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}" - ], - removeRepoInOrg: [ - "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" - ], - updateDiscussionCommentInOrg: [ - "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" - ], - updateDiscussionInOrg: [ - "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" - ], - updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] - }, - users: { - addEmailForAuthenticated: [ - "POST /user/emails", - {}, - { renamed: ["users", "addEmailForAuthenticatedUser"] } - ], - addEmailForAuthenticatedUser: ["POST /user/emails"], - addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"], - block: ["PUT /user/blocks/{username}"], - checkBlocked: ["GET /user/blocks/{username}"], - checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], - checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], - createGpgKeyForAuthenticated: [ - "POST /user/gpg_keys", - {}, - { renamed: ["users", "createGpgKeyForAuthenticatedUser"] } - ], - createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], - createPublicSshKeyForAuthenticated: [ - "POST /user/keys", - {}, - { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] } - ], - createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], - createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"], - deleteEmailForAuthenticated: [ - "DELETE /user/emails", - {}, - { renamed: ["users", "deleteEmailForAuthenticatedUser"] } - ], - deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], - deleteGpgKeyForAuthenticated: [ - "DELETE /user/gpg_keys/{gpg_key_id}", - {}, - { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] } - ], - deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], - deletePublicSshKeyForAuthenticated: [ - "DELETE /user/keys/{key_id}", - {}, - { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] } - ], - deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], - deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"], - deleteSshSigningKeyForAuthenticatedUser: [ - "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}" - ], - follow: ["PUT /user/following/{username}"], - getAuthenticated: ["GET /user"], - getByUsername: ["GET /users/{username}"], - getContextForUser: ["GET /users/{username}/hovercard"], - getGpgKeyForAuthenticated: [ - "GET /user/gpg_keys/{gpg_key_id}", - {}, - { renamed: ["users", "getGpgKeyForAuthenticatedUser"] } - ], - getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], - getPublicSshKeyForAuthenticated: [ - "GET /user/keys/{key_id}", - {}, - { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] } - ], - getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], - getSshSigningKeyForAuthenticatedUser: [ - "GET /user/ssh_signing_keys/{ssh_signing_key_id}" - ], - list: ["GET /users"], - listBlockedByAuthenticated: [ - "GET /user/blocks", - {}, - { renamed: ["users", "listBlockedByAuthenticatedUser"] } - ], - listBlockedByAuthenticatedUser: ["GET /user/blocks"], - listEmailsForAuthenticated: [ - "GET /user/emails", - {}, - { renamed: ["users", "listEmailsForAuthenticatedUser"] } - ], - listEmailsForAuthenticatedUser: ["GET /user/emails"], - listFollowedByAuthenticated: [ - "GET /user/following", - {}, - { renamed: ["users", "listFollowedByAuthenticatedUser"] } - ], - listFollowedByAuthenticatedUser: ["GET /user/following"], - listFollowersForAuthenticatedUser: ["GET /user/followers"], - listFollowersForUser: ["GET /users/{username}/followers"], - listFollowingForUser: ["GET /users/{username}/following"], - listGpgKeysForAuthenticated: [ - "GET /user/gpg_keys", - {}, - { renamed: ["users", "listGpgKeysForAuthenticatedUser"] } - ], - listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], - listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], - listPublicEmailsForAuthenticated: [ - "GET /user/public_emails", - {}, - { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] } - ], - listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], - listPublicKeysForUser: ["GET /users/{username}/keys"], - listPublicSshKeysForAuthenticated: [ - "GET /user/keys", - {}, - { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] } - ], - listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], - listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"], - listSocialAccountsForUser: ["GET /users/{username}/social_accounts"], - listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"], - listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"], - setPrimaryEmailVisibilityForAuthenticated: [ - "PATCH /user/email/visibility", - {}, - { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] } - ], - setPrimaryEmailVisibilityForAuthenticatedUser: [ - "PATCH /user/email/visibility" - ], - unblock: ["DELETE /user/blocks/{username}"], - unfollow: ["DELETE /user/following/{username}"], - updateAuthenticated: ["PATCH /user"] - } -}; -var endpoints_default = Endpoints; + // Track Request events + diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt; + debuglog( + 'received response to %s %s/%s - HTTP %d', + method, + origin, + path, + statusCode + ); + }); + + diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('trailers received from %s %s/%s', method, origin, path); + }); + + diagnosticsChannel.channel('undici:request:error').subscribe(evt => { + const { + request: { method, path, origin }, + error + } = evt; + debuglog( + 'request to %s %s/%s errored - %s', + method, + origin, + path, + error.message + ); + }); + + isClientSet = true; + } + + if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; + diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connecting to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ); + }); + + diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + const { + connectParams: { version, protocol, port, host } + } = evt; + debuglog( + 'connected to %s%s using %s%s', + host, + port ? `:${port}` : '', + protocol, + version + ); + }); + + diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + const { + connectParams: { version, protocol, port, host }, + error + } = evt; + debuglog( + 'connection to %s%s using %s%s errored - %s', + host, + port ? `:${port}` : '', + protocol, + version, + error.message + ); + }); + + diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + const { + request: { method, path, origin } + } = evt; + debuglog('sending request to %s %s/%s', method, origin, path); + }); + } + + // Track all WebSocket events + diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { + const { + address: { address, port } + } = evt; + websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : ''); + }); + + diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { + const { websocket, code, reason } = evt; + websocketDebuglog( + 'closed connection to %s - %s %s', + websocket.url, + code, + reason + ); + }); + + diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { + websocketDebuglog('connection errored - %s', err.message); + }); + + diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { + websocketDebuglog('ping received'); + }); + + diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { + websocketDebuglog('pong received'); + }); + } + + diagnostics = { + channels + }; + return diagnostics; +} + +var request$2; +var hasRequiredRequest$1; + +function requireRequest$1 () { + if (hasRequiredRequest$1) return request$2; + hasRequiredRequest$1 = 1; + + const { + InvalidArgumentError, + NotSupportedError + } = requireErrors$1(); + const assert = require$$0$7; + const { + isValidHTTPToken, + isValidHeaderValue, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName, + normalizedMethodRecords + } = requireUtil$9(); + const { channels } = requireDiagnostics(); + const { headerNameLowerCasedRecord } = requireConstants$a(); + + // Verifies that a given path is valid does not contain control chars \x00 to \x20 + const invalidPathRegex = /[^\u0021-\u00ff]/; + + const kHandler = Symbol('handler'); + + class Request { + constructor (origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler) { + if (typeof path !== 'string') { + throw new InvalidArgumentError('path must be a string') + } else if ( + path[0] !== '/' && + !(path.startsWith('http://') || path.startsWith('https://')) && + method !== 'CONNECT' + ) { + throw new InvalidArgumentError('path must be an absolute URL or start with a slash') + } else if (invalidPathRegex.test(path)) { + throw new InvalidArgumentError('invalid request path') + } + + if (typeof method !== 'string') { + throw new InvalidArgumentError('method must be a string') + } else if (normalizedMethodRecords[method] === undefined && !isValidHTTPToken(method)) { + throw new InvalidArgumentError('invalid request method') + } + + if (upgrade && typeof upgrade !== 'string') { + throw new InvalidArgumentError('upgrade must be a string') + } + + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('invalid headersTimeout') + } + + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('invalid bodyTimeout') + } + + if (reset != null && typeof reset !== 'boolean') { + throw new InvalidArgumentError('invalid reset') + } + + if (expectContinue != null && typeof expectContinue !== 'boolean') { + throw new InvalidArgumentError('invalid expectContinue') + } + + this.headersTimeout = headersTimeout; + + this.bodyTimeout = bodyTimeout; + + this.throwOnError = throwOnError === true; + + this.method = method; + + this.abort = null; + + if (body == null) { + this.body = null; + } else if (isStream(body)) { + this.body = body; + + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy () { + destroy(this); + }; + this.body.on('end', this.endHandler); + } + + this.errorHandler = err => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on('error', this.errorHandler); + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === 'string') { + this.body = body.length ? Buffer.from(body) : null; + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + } + + this.completed = false; + + this.aborted = false; + + this.upgrade = upgrade || null; + + this.path = query ? buildURL(path, query) : path; + + this.origin = origin; + + this.idempotent = idempotent == null + ? method === 'HEAD' || method === 'GET' + : idempotent; + + this.blocking = blocking == null ? false : blocking; + + this.reset = reset == null ? null : reset; + + this.host = null; + + this.contentLength = null; + + this.contentType = null; + + this.headers = []; + + // Only for H2 + this.expectContinue = expectContinue != null ? expectContinue : false; + + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === 'object') { + if (headers[Symbol.iterator]) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError('headers must be in key-value pair format') + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]); + } + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') + } + + validateHandler(handler, method, upgrade); + + this.servername = servername || getServerName(this.host); + + this[kHandler] = handler; + + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } + } + + onBodySent (chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk) + } catch (err) { + this.abort(err); + } + } + } + + onRequestSent () { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent() + } catch (err) { + this.abort(err); + } + } + } + + onConnect (abort) { + assert(!this.aborted); + assert(!this.completed); + + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort) + } + } + + onResponseStarted () { + return this[kHandler].onResponseStarted?.() + } + + onHeaders (statusCode, headers, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); + + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } + + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + } catch (err) { + this.abort(err); + } + } + + onData (chunk) { + assert(!this.aborted); + assert(!this.completed); + + try { + return this[kHandler].onData(chunk) + } catch (err) { + this.abort(err); + return false + } + } + + onUpgrade (statusCode, headers, socket) { + assert(!this.aborted); + assert(!this.completed); + + return this[kHandler].onUpgrade(statusCode, headers, socket) + } + + onComplete (trailers) { + this.onFinally(); + + assert(!this.aborted); + + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); + } + + try { + return this[kHandler].onComplete(trailers) + } catch (err) { + // TODO (fix): This might be a bad idea? + this.onError(err); + } + } + + onError (error) { + this.onFinally(); + + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); + } + + if (this.aborted) { + return + } + this.aborted = true; + + return this[kHandler].onError(error) + } + + onFinally () { + if (this.errorHandler) { + this.body.off('error', this.errorHandler); + this.errorHandler = null; + } + + if (this.endHandler) { + this.body.off('end', this.endHandler); + this.endHandler = null; + } + } + + addHeader (key, value) { + processHeader(this, key, value); + return this + } + } + + function processHeader (request, key, val) { + if (val && (typeof val === 'object' && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`) + } else if (val === undefined) { + return + } + + let headerName = headerNameLowerCasedRecord[key]; + + if (headerName === undefined) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === undefined && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError('invalid header key') + } + } + + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === 'string') { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(''); + } else if (typeof val[i] === 'object') { + throw new InvalidArgumentError(`invalid ${key} header`) + } else { + arr.push(`${val[i]}`); + } + } + val = arr; + } else if (typeof val === 'string') { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + } else if (val === null) { + val = ''; + } else { + val = `${val}`; + } + + if (request.host === null && headerName === 'host') { + if (typeof val !== 'string') { + throw new InvalidArgumentError('invalid host header') + } + // Consumed by Client + request.host = val; + } else if (request.contentLength === null && headerName === 'content-length') { + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError('invalid content-length header') + } + } else if (request.contentType === null && headerName === 'content-type') { + request.contentType = val; + request.headers.push(key, val); + } else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') { + throw new InvalidArgumentError(`invalid ${headerName} header`) + } else if (headerName === 'connection') { + const value = typeof val === 'string' ? val.toLowerCase() : null; + if (value !== 'close' && value !== 'keep-alive') { + throw new InvalidArgumentError('invalid connection header') + } + + if (value === 'close') { + request.reset = true; + } + } else if (headerName === 'expect') { + throw new NotSupportedError('expect header not supported') + } else { + request.headers.push(key, val); + } + } + + request$2 = Request; + return request$2; +} + +var dispatcher; +var hasRequiredDispatcher; + +function requireDispatcher () { + if (hasRequiredDispatcher) return dispatcher; + hasRequiredDispatcher = 1; + const EventEmitter = require$$8; + + class Dispatcher extends EventEmitter { + dispatch () { + throw new Error('not implemented') + } + + close () { + throw new Error('not implemented') + } + + destroy () { + throw new Error('not implemented') + } + + compose (...args) { + // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ... + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); + + for (const interceptor of interceptors) { + if (interceptor == null) { + continue + } + + if (typeof interceptor !== 'function') { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`) + } + + dispatch = interceptor(dispatch); + + if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) { + throw new TypeError('invalid interceptor') + } + } + + return new ComposedDispatcher(this, dispatch) + } + } + + class ComposedDispatcher extends Dispatcher { + #dispatcher = null + #dispatch = null + + constructor (dispatcher, dispatch) { + super(); + this.#dispatcher = dispatcher; + this.#dispatch = dispatch; + } + + dispatch (...args) { + this.#dispatch(...args); + } + + close (...args) { + return this.#dispatcher.close(...args) + } + + destroy (...args) { + return this.#dispatcher.destroy(...args) + } + } + + dispatcher = Dispatcher; + return dispatcher; +} + +var dispatcherBase; +var hasRequiredDispatcherBase; + +function requireDispatcherBase () { + if (hasRequiredDispatcherBase) return dispatcherBase; + hasRequiredDispatcherBase = 1; + + const Dispatcher = requireDispatcher(); + const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = requireErrors$1(); + const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = requireSymbols$4(); + + const kOnDestroyed = Symbol('onDestroyed'); + const kOnClosed = Symbol('onClosed'); + const kInterceptedDispatch = Symbol('Intercepted Dispatch'); + + class DispatcherBase extends Dispatcher { + constructor () { + super(); + + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; + } + + get destroyed () { + return this[kDestroyed] + } + + get closed () { + return this[kClosed] + } + + get interceptors () { + return this[kInterceptors] + } + + set interceptors (newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== 'function') { + throw new InvalidArgumentError('interceptor must be an function') + } + } + } + + this[kInterceptors] = newInterceptors; + } + + close (callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data) + }); + }) + } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return + } + + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return + } + + this[kClosed] = true; + this[kOnClosed].push(callback); + + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + + // Should not error. + this[kClose]() + .then(() => this.destroy()) + .then(() => { + queueMicrotask(onClosed); + }); + } + + destroy (err, callback) { + if (typeof err === 'function') { + callback = err; + err = null; + } + + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err, data) => { + return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) + }); + }) + } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return + } + + if (!err) { + err = new ClientDestroyedError(); + } + + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + + // Should not error. + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); + } + + [kInterceptedDispatch] (opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler) + } + + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler) + } + + dispatch (opts, handler) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } + + try { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object.') + } + + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError() + } + + if (this[kClosed]) { + throw new ClientClosedError() + } + + return this[kInterceptedDispatch](opts, handler) + } catch (err) { + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } + + handler.onError(err); + + return false + } + } + } + + dispatcherBase = DispatcherBase; + return dispatcherBase; +} + +var timers; +var hasRequiredTimers; + +function requireTimers () { + if (hasRequiredTimers) return timers; + hasRequiredTimers = 1; + + /** + * This module offers an optimized timer implementation designed for scenarios + * where high precision is not critical. + * + * The timer achieves faster performance by using a low-resolution approach, + * with an accuracy target of within 500ms. This makes it particularly useful + * for timers with delays of 1 second or more, where exact timing is less + * crucial. + * + * It's important to note that Node.js timers are inherently imprecise, as + * delays can occur due to the event loop being blocked by other operations. + * Consequently, timers may trigger later than their scheduled time. + */ + + /** + * The fastNow variable contains the internal fast timer clock value. + * + * @type {number} + */ + let fastNow = 0; + + /** + * RESOLUTION_MS represents the target resolution time in milliseconds. + * + * @type {number} + * @default 1000 + */ + const RESOLUTION_MS = 1e3; + + /** + * TICK_MS defines the desired interval in milliseconds between each tick. + * The target value is set to half the resolution time, minus 1 ms, to account + * for potential event loop overhead. + * + * @type {number} + * @default 499 + */ + const TICK_MS = (RESOLUTION_MS >> 1) - 1; + + /** + * fastNowTimeout is a Node.js timer used to manage and process + * the FastTimers stored in the `fastTimers` array. + * + * @type {NodeJS.Timeout} + */ + let fastNowTimeout; + + /** + * The kFastTimer symbol is used to identify FastTimer instances. + * + * @type {Symbol} + */ + const kFastTimer = Symbol('kFastTimer'); + + /** + * The fastTimers array contains all active FastTimers. + * + * @type {FastTimer[]} + */ + const fastTimers = []; + + /** + * These constants represent the various states of a FastTimer. + */ + + /** + * The `NOT_IN_LIST` constant indicates that the FastTimer is not included + * in the `fastTimers` array. Timers with this status will not be processed + * during the next tick by the `onTick` function. + * + * A FastTimer can be re-added to the `fastTimers` array by invoking the + * `refresh` method on the FastTimer instance. + * + * @type {-2} + */ + const NOT_IN_LIST = -2; + + /** + * The `TO_BE_CLEARED` constant indicates that the FastTimer is scheduled + * for removal from the `fastTimers` array. A FastTimer in this state will + * be removed in the next tick by the `onTick` function and will no longer + * be processed. + * + * This status is also set when the `clear` method is called on the FastTimer instance. + * + * @type {-1} + */ + const TO_BE_CLEARED = -1; + + /** + * The `PENDING` constant signifies that the FastTimer is awaiting processing + * in the next tick by the `onTick` function. Timers with this status will have + * their `_idleStart` value set and their status updated to `ACTIVE` in the next tick. + * + * @type {0} + */ + const PENDING = 0; + + /** + * The `ACTIVE` constant indicates that the FastTimer is active and waiting + * for its timer to expire. During the next tick, the `onTick` function will + * check if the timer has expired, and if so, it will execute the associated callback. + * + * @type {1} + */ + const ACTIVE = 1; + + /** + * The onTick function processes the fastTimers array. + * + * @returns {void} + */ + function onTick () { + /** + * Increment the fastNow value by the TICK_MS value, despite the actual time + * that has passed since the last tick. This approach ensures independence + * from the system clock and delays caused by a blocked event loop. + * + * @type {number} + */ + fastNow += TICK_MS; + + /** + * The `idx` variable is used to iterate over the `fastTimers` array. + * Expired timers are removed by replacing them with the last element in the array. + * Consequently, `idx` is only incremented when the current element is not removed. + * + * @type {number} + */ + let idx = 0; + + /** + * The len variable will contain the length of the fastTimers array + * and will be decremented when a FastTimer should be removed from the + * fastTimers array. + * + * @type {number} + */ + let len = fastTimers.length; + + while (idx < len) { + /** + * @type {FastTimer} + */ + const timer = fastTimers[idx]; + + // If the timer is in the ACTIVE state and the timer has expired, it will + // be processed in the next tick. + if (timer._state === PENDING) { + // Set the _idleStart value to the fastNow value minus the TICK_MS value + // to account for the time the timer was in the PENDING state. + timer._idleStart = fastNow - TICK_MS; + timer._state = ACTIVE; + } else if ( + timer._state === ACTIVE && + fastNow >= timer._idleStart + timer._idleTimeout + ) { + timer._state = TO_BE_CLEARED; + timer._idleStart = -1; + timer._onTimeout(timer._timerArg); + } + + if (timer._state === TO_BE_CLEARED) { + timer._state = NOT_IN_LIST; + + // Move the last element to the current index and decrement len if it is + // not the only element in the array. + if (--len !== 0) { + fastTimers[idx] = fastTimers[len]; + } + } else { + ++idx; + } + } + + // Set the length of the fastTimers array to the new length and thus + // removing the excess FastTimers elements from the array. + fastTimers.length = len; + + // If there are still active FastTimers in the array, refresh the Timer. + // If there are no active FastTimers, the timer will be refreshed again + // when a new FastTimer is instantiated. + if (fastTimers.length !== 0) { + refreshTimeout(); + } + } + + function refreshTimeout () { + // If the fastNowTimeout is already set, refresh it. + if (fastNowTimeout) { + fastNowTimeout.refresh(); + // fastNowTimeout is not instantiated yet, create a new Timer. + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTick, TICK_MS); + + // If the Timer has an unref method, call it to allow the process to exit if + // there are no other active handles. + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } + } + } + + /** + * The `FastTimer` class is a data structure designed to store and manage + * timer information. + */ + class FastTimer { + [kFastTimer] = true + + /** + * The state of the timer, which can be one of the following: + * - NOT_IN_LIST (-2) + * - TO_BE_CLEARED (-1) + * - PENDING (0) + * - ACTIVE (1) + * + * @type {-2|-1|0|1} + * @private + */ + _state = NOT_IN_LIST + + /** + * The number of milliseconds to wait before calling the callback. + * + * @type {number} + * @private + */ + _idleTimeout = -1 + + /** + * The time in milliseconds when the timer was started. This value is used to + * calculate when the timer should expire. + * + * @type {number} + * @default -1 + * @private + */ + _idleStart = -1 + + /** + * The function to be executed when the timer expires. + * @type {Function} + * @private + */ + _onTimeout + + /** + * The argument to be passed to the callback when the timer expires. + * + * @type {*} + * @private + */ + _timerArg + + /** + * @constructor + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should wait + * before the specified function or code is executed. + * @param {*} arg + */ + constructor (callback, delay, arg) { + this._onTimeout = callback; + this._idleTimeout = delay; + this._timerArg = arg; + + this.refresh(); + } + + /** + * Sets the timer's start time to the current time, and reschedules the timer + * to call its callback at the previously specified duration adjusted to the + * current time. + * Using this on a timer that has already called its callback will reactivate + * the timer. + * + * @returns {void} + */ + refresh () { + // In the special case that the timer is not in the list of active timers, + // add it back to the array to be processed in the next tick by the onTick + // function. + if (this._state === NOT_IN_LIST) { + fastTimers.push(this); + } + + // If the timer is the only active timer, refresh the fastNowTimeout for + // better resolution. + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } + + // Setting the state to PENDING will cause the timer to be reset in the + // next tick by the onTick function. + this._state = PENDING; + } + + /** + * The `clear` method cancels the timer, preventing it from executing. + * + * @returns {void} + * @private + */ + clear () { + // Set the state to TO_BE_CLEARED to mark the timer for removal in the next + // tick by the onTick function. + this._state = TO_BE_CLEARED; + + // Reset the _idleStart value to -1 to indicate that the timer is no longer + // active. + this._idleStart = -1; + } + } + + /** + * This module exports a setTimeout and clearTimeout function that can be + * used as a drop-in replacement for the native functions. + */ + timers = { + /** + * The setTimeout() method sets a timer which executes a function once the + * timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {NodeJS.Timeout|FastTimer} + */ + setTimeout (callback, delay, arg) { + // If the delay is less than or equal to the RESOLUTION_MS value return a + // native Node.js Timer instance. + return delay <= RESOLUTION_MS + ? setTimeout(callback, delay, arg) + : new FastTimer(callback, delay, arg) + }, + /** + * The clearTimeout method cancels an instantiated Timer previously created + * by calling setTimeout. + * + * @param {NodeJS.Timeout|FastTimer} timeout + */ + clearTimeout (timeout) { + // If the timeout is a FastTimer, call its own clear method. + if (timeout[kFastTimer]) { + /** + * @type {FastTimer} + */ + timeout.clear(); + // Otherwise it is an instance of a native NodeJS.Timeout, so call the + // Node.js native clearTimeout function. + } else { + clearTimeout(timeout); + } + }, + /** + * The setFastTimeout() method sets a fastTimer which executes a function once + * the timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {FastTimer} + */ + setFastTimeout (callback, delay, arg) { + return new FastTimer(callback, delay, arg) + }, + /** + * The clearTimeout method cancels an instantiated FastTimer previously + * created by calling setFastTimeout. + * + * @param {FastTimer} timeout + */ + clearFastTimeout (timeout) { + timeout.clear(); + }, + /** + * The now method returns the value of the internal fast timer clock. + * + * @returns {number} + */ + now () { + return fastNow + }, + /** + * Trigger the onTick function to process the fastTimers array. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + * @param {number} [delay=0] The delay in milliseconds to add to the now value. + */ + tick (delay = 0) { + fastNow += delay - RESOLUTION_MS + 1; + onTick(); + onTick(); + }, + /** + * Reset FastTimers. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + reset () { + fastNow = 0; + fastTimers.length = 0; + clearTimeout(fastNowTimeout); + fastNowTimeout = null; + }, + /** + * Exporting for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + kFastTimer + }; + return timers; +} + +var connect; +var hasRequiredConnect; + +function requireConnect () { + if (hasRequiredConnect) return connect; + hasRequiredConnect = 1; + + const net = require$$0$9; + const assert = require$$0$7; + const util = requireUtil$9(); + const { InvalidArgumentError, ConnectTimeoutError } = requireErrors$1(); + const timers = requireTimers(); + + function noop () {} + + let tls; // include tls conditionally since it is not always available + + // TODO: session re-use does not wait for the first + // connection to resolve the session and might therefore + // resolve the same servername multiple times even when + // re-use is enabled. + + let SessionCache; + // FIXME: remove workaround when the Node bug is fixed + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (commonjsGlobal.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map(); + this._sessionRegistry = new commonjsGlobal.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return + } + + const ref = this._sessionCache.get(key); + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key); + } + }); + } + + get (sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); + } + }; + } else { + SessionCache = class SimpleSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map(); + } + + get (sessionKey) { + return this._sessionCache.get(sessionKey) + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + if (this._sessionCache.size >= this._maxCachedSessions) { + // remove the oldest session + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + + this._sessionCache.set(sessionKey, session); + } + }; + } + + function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + } + + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 10e3 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === 'https:') { + if (!tls) { + tls = require$$5; + } + servername = servername || options.servername || util.getServerName(host) || null; + + const sessionKey = servername || hostname; + assert(sessionKey); + + const session = customSession || sessionCache.get(sessionKey) || null; + + port = port || 443; + + socket = tls.connect({ + highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], + socket: httpSocket, // upgrade socket connection + port, + host: hostname + }); + + socket + .on('session', function (session) { + // TODO (fix): Can a session become invalid once established? Don't think so? + sessionCache.set(sessionKey, session); + }); + } else { + assert(!httpSocket, 'httpSocket can only be sent on TLS update'); + + port = port || 80; + + socket = net.connect({ + highWaterMark: 64 * 1024, // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }); + } + + // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + + const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); + + socket + .setNoDelay(true) + .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { + queueMicrotask(clearConnectTimeout); + + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }) + .on('error', function (err) { + queueMicrotask(clearConnectTimeout); + + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + + return socket + } + } + + /** + * @param {WeakRef} socketWeakRef + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + * @returns {() => void} + */ + const setupConnectTimeout = process.platform === 'win32' + ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } + + let s1 = null; + let s2 = null; + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + // Windows needs an extra setImmediate probably due to implementation differences in the socket logic + s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + clearImmediate(s2); + } + } + : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop + } + + let s1 = null; + const fastTimer = timers.setFastTimeout(() => { + // setImmediate is added to make sure that we prioritize socket error events over timeouts + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + } + }; + + /** + * @param {net.Socket} socket + * @param {object} opts + * @param {number} opts.timeout + * @param {string} opts.hostname + * @param {number} opts.port + */ + function onConnectTimeout (socket, opts) { + // The socket could be already garbage collected + if (socket == null) { + return + } + + let message = 'Connect Timeout Error'; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`; + } else { + message += ` (attempted address: ${opts.hostname}:${opts.port},`; + } + + message += ` timeout: ${opts.timeout}ms)`; + + util.destroy(socket, new ConnectTimeoutError(message)); + } + + connect = buildConnector; + return connect; +} + +var constants$9 = {}; + +var utils$2 = {}; + +var hasRequiredUtils$2; + +function requireUtils$2 () { + if (hasRequiredUtils$2) return utils$2; + hasRequiredUtils$2 = 1; + Object.defineProperty(utils$2, "__esModule", { value: true }); + utils$2.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === 'number') { + res[key] = value; + } + }); + return res; + } + utils$2.enumToMap = enumToMap; + + return utils$2; +} + +var hasRequiredConstants$9; + +function requireConstants$9 () { + if (hasRequiredConstants$9) return constants$9; + hasRequiredConstants$9 = 1; + (function (exports$1) { + Object.defineProperty(exports$1, "__esModule", { value: true }); + exports$1.SPECIAL_HEADERS = exports$1.HEADER_STATE = exports$1.MINOR = exports$1.MAJOR = exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS = exports$1.TOKEN = exports$1.STRICT_TOKEN = exports$1.HEX = exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR = exports$1.USERINFO_CHARS = exports$1.MARK = exports$1.ALPHANUM = exports$1.NUM = exports$1.HEX_MAP = exports$1.NUM_MAP = exports$1.ALPHA = exports$1.FINISH = exports$1.H_METHOD_MAP = exports$1.METHOD_MAP = exports$1.METHODS_RTSP = exports$1.METHODS_ICE = exports$1.METHODS_HTTP = exports$1.METHODS = exports$1.LENIENT_FLAGS = exports$1.FLAGS = exports$1.TYPE = exports$1.ERROR = void 0; + const utils_1 = requireUtils$2(); + (function (ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; + })(exports$1.ERROR || (exports$1.ERROR = {})); + (function (TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; + })(exports$1.TYPE || (exports$1.TYPE = {})); + (function (FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + // 1 << 8 is unused + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(exports$1.FLAGS || (exports$1.FLAGS = {})); + (function (LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(exports$1.LENIENT_FLAGS || (exports$1.LENIENT_FLAGS = {})); + var METHODS; + (function (METHODS) { + METHODS[METHODS["DELETE"] = 0] = "DELETE"; + METHODS[METHODS["GET"] = 1] = "GET"; + METHODS[METHODS["HEAD"] = 2] = "HEAD"; + METHODS[METHODS["POST"] = 3] = "POST"; + METHODS[METHODS["PUT"] = 4] = "PUT"; + /* pathological */ + METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; + METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; + METHODS[METHODS["TRACE"] = 7] = "TRACE"; + /* WebDAV */ + METHODS[METHODS["COPY"] = 8] = "COPY"; + METHODS[METHODS["LOCK"] = 9] = "LOCK"; + METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; + METHODS[METHODS["MOVE"] = 11] = "MOVE"; + METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; + METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; + METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; + METHODS[METHODS["BIND"] = 16] = "BIND"; + METHODS[METHODS["REBIND"] = 17] = "REBIND"; + METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; + METHODS[METHODS["ACL"] = 19] = "ACL"; + /* subversion */ + METHODS[METHODS["REPORT"] = 20] = "REPORT"; + METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS[METHODS["MERGE"] = 23] = "MERGE"; + /* upnp */ + METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; + METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + /* RFC-5789 */ + METHODS[METHODS["PATCH"] = 28] = "PATCH"; + METHODS[METHODS["PURGE"] = 29] = "PURGE"; + /* CalDAV */ + METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; + /* RFC-2068, section 19.6.1.2 */ + METHODS[METHODS["LINK"] = 31] = "LINK"; + METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; + /* icecast */ + METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; + /* RFC-7540, section 11.6 */ + METHODS[METHODS["PRI"] = 34] = "PRI"; + /* RFC-2326 RTSP */ + METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS[METHODS["SETUP"] = 37] = "SETUP"; + METHODS[METHODS["PLAY"] = 38] = "PLAY"; + METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; + METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; + METHODS[METHODS["RECORD"] = 44] = "RECORD"; + /* RAOP */ + METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports$1.METHODS || (exports$1.METHODS = {})); + exports$1.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS['M-SEARCH'], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE, + ]; + exports$1.METHODS_ICE = [ + METHODS.SOURCE, + ]; + exports$1.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST, + ]; + exports$1.METHOD_MAP = utils_1.enumToMap(METHODS); + exports$1.H_METHOD_MAP = {}; + Object.keys(exports$1.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports$1.H_METHOD_MAP[key] = exports$1.METHOD_MAP[key]; + } + }); + (function (FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; + })(exports$1.FINISH || (exports$1.FINISH = {})); + exports$1.ALPHA = []; + for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { + // Upper case + exports$1.ALPHA.push(String.fromCharCode(i)); + // Lower case + exports$1.ALPHA.push(String.fromCharCode(i + 0x20)); + } + exports$1.NUM_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + }; + exports$1.HEX_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, + a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, + }; + exports$1.NUM = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + ]; + exports$1.ALPHANUM = exports$1.ALPHA.concat(exports$1.NUM); + exports$1.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; + exports$1.USERINFO_CHARS = exports$1.ALPHANUM + .concat(exports$1.MARK) + .concat(['%', ';', ':', '&', '=', '+', '$', ',']); + // TODO(indutny): use RFC + exports$1.STRICT_URL_CHAR = [ + '!', '"', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + ':', ';', '<', '=', '>', + '@', '[', '\\', ']', '^', '_', + '`', + '{', '|', '}', '~', + ].concat(exports$1.ALPHANUM); + exports$1.URL_CHAR = exports$1.STRICT_URL_CHAR + .concat(['\t', '\f']); + // All characters with 0x80 bit set to 1 + for (let i = 0x80; i <= 0xff; i++) { + exports$1.URL_CHAR.push(i); + } + exports$1.HEX = exports$1.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); + /* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ + exports$1.STRICT_TOKEN = [ + '!', '#', '$', '%', '&', '\'', + '*', '+', '-', '.', + '^', '_', '`', + '|', '~', + ].concat(exports$1.ALPHANUM); + exports$1.TOKEN = exports$1.STRICT_TOKEN.concat([' ']); + /* + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + */ + exports$1.HEADER_CHARS = ['\t']; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports$1.HEADER_CHARS.push(i); + } + } + // ',' = \x44 + exports$1.CONNECTION_TOKEN_CHARS = exports$1.HEADER_CHARS.filter((c) => c !== 44); + exports$1.MAJOR = exports$1.NUM_MAP; + exports$1.MINOR = exports$1.MAJOR; + var HEADER_STATE; + (function (HEADER_STATE) { + HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports$1.HEADER_STATE || (exports$1.HEADER_STATE = {})); + exports$1.SPECIAL_HEADERS = { + 'connection': HEADER_STATE.CONNECTION, + 'content-length': HEADER_STATE.CONTENT_LENGTH, + 'proxy-connection': HEADER_STATE.CONNECTION, + 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, + 'upgrade': HEADER_STATE.UPGRADE, + }; + + } (constants$9)); + return constants$9; +} + +var llhttpWasm; +var hasRequiredLlhttpWasm; + +function requireLlhttpWasm () { + if (hasRequiredLlhttpWasm) return llhttpWasm; + hasRequiredLlhttpWasm = 1; + + const { Buffer } = require$$0$6; + + llhttpWasm = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv', 'base64'); + return llhttpWasm; +} + +var llhttp_simdWasm; +var hasRequiredLlhttp_simdWasm; + +function requireLlhttp_simdWasm () { + if (hasRequiredLlhttp_simdWasm) return llhttp_simdWasm; + hasRequiredLlhttp_simdWasm = 1; + + const { Buffer } = require$$0$6; + + llhttp_simdWasm = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==', 'base64'); + return llhttp_simdWasm; +} + +var constants$8; +var hasRequiredConstants$8; + +function requireConstants$8 () { + if (hasRequiredConstants$8) return constants$8; + hasRequiredConstants$8 = 1; + + const corsSafeListedMethods = /** @type {const} */ (['GET', 'HEAD', 'POST']); + const corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + + const nullBodyStatus = /** @type {const} */ ([101, 204, 205, 304]); + + const redirectStatus = /** @type {const} */ ([301, 302, 303, 307, 308]); + const redirectStatusSet = new Set(redirectStatus); + + /** + * @see https://fetch.spec.whatwg.org/#block-bad-port + */ + const badPorts = /** @type {const} */ ([ + '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', + '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', + '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', + '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', + '2049', '3659', '4045', '4190', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6679', + '6697', '10080' + ]); + const badPortsSet = new Set(badPorts); + + /** + * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies + */ + const referrerPolicy = /** @type {const} */ ([ + '', + 'no-referrer', + 'no-referrer-when-downgrade', + 'same-origin', + 'origin', + 'strict-origin', + 'origin-when-cross-origin', + 'strict-origin-when-cross-origin', + 'unsafe-url' + ]); + const referrerPolicySet = new Set(referrerPolicy); + + const requestRedirect = /** @type {const} */ (['follow', 'manual', 'error']); + + const safeMethods = /** @type {const} */ (['GET', 'HEAD', 'OPTIONS', 'TRACE']); + const safeMethodsSet = new Set(safeMethods); + + const requestMode = /** @type {const} */ (['navigate', 'same-origin', 'no-cors', 'cors']); + + const requestCredentials = /** @type {const} */ (['omit', 'same-origin', 'include']); + + const requestCache = /** @type {const} */ ([ + 'default', + 'no-store', + 'reload', + 'no-cache', + 'force-cache', + 'only-if-cached' + ]); + + /** + * @see https://fetch.spec.whatwg.org/#request-body-header-name + */ + const requestBodyHeader = /** @type {const} */ ([ + 'content-encoding', + 'content-language', + 'content-location', + 'content-type', + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + 'content-length' + ]); + + /** + * @see https://fetch.spec.whatwg.org/#enumdef-requestduplex + */ + const requestDuplex = /** @type {const} */ ([ + 'half' + ]); + + /** + * @see http://fetch.spec.whatwg.org/#forbidden-method + */ + const forbiddenMethods = /** @type {const} */ (['CONNECT', 'TRACE', 'TRACK']); + const forbiddenMethodsSet = new Set(forbiddenMethods); + + const subresource = /** @type {const} */ ([ + 'audio', + 'audioworklet', + 'font', + 'image', + 'manifest', + 'paintworklet', + 'script', + 'style', + 'track', + 'video', + 'xslt', + '' + ]); + const subresourceSet = new Set(subresource); + + constants$8 = { + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet + }; + return constants$8; +} + +var global$2; +var hasRequiredGlobal$1; + +function requireGlobal$1 () { + if (hasRequiredGlobal$1) return global$2; + hasRequiredGlobal$1 = 1; + + // In case of breaking changes, increase the version + // number to avoid conflicts. + const globalOrigin = Symbol.for('undici.globalOrigin.1'); + + function getGlobalOrigin () { + return globalThis[globalOrigin] + } + + function setGlobalOrigin (newOrigin) { + if (newOrigin === undefined) { + Object.defineProperty(globalThis, globalOrigin, { + value: undefined, + writable: true, + enumerable: false, + configurable: false + }); + + return + } + + const parsedURL = new URL(newOrigin); + + if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`) + } + + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + + global$2 = { + getGlobalOrigin, + setGlobalOrigin + }; + return global$2; +} + +var dataUrl; +var hasRequiredDataUrl; + +function requireDataUrl () { + if (hasRequiredDataUrl) return dataUrl; + hasRequiredDataUrl = 1; + + const assert = require$$0$7; + + const encoder = new TextEncoder(); + + /** + * @see https://mimesniff.spec.whatwg.org/#http-token-code-point + */ + const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+\-.^_|~A-Za-z0-9]+$/; + const HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; // eslint-disable-line + const ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; // eslint-disable-line + /** + * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point + */ + const HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/; // eslint-disable-line + + // https://fetch.spec.whatwg.org/#data-url-processor + /** @param {URL} dataURL */ + function dataURLProcessor (dataURL) { + // 1. Assert: dataURL’s scheme is "data". + assert(dataURL.protocol === 'data:'); + + // 2. Let input be the result of running the URL + // serializer on dataURL with exclude fragment + // set to true. + let input = URLSerializer(dataURL, true); + + // 3. Remove the leading "data:" string from input. + input = input.slice(5); + + // 4. Let position point at the start of input. + const position = { position: 0 }; + + // 5. Let mimeType be the result of collecting a + // sequence of code points that are not equal + // to U+002C (,), given position. + let mimeType = collectASequenceOfCodePointsFast( + ',', + input, + position + ); + + // 6. Strip leading and trailing ASCII whitespace + // from mimeType. + // Undici implementation note: we need to store the + // length because if the mimetype has spaces removed, + // the wrong amount will be sliced from the input in + // step #9 + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + + // 7. If position is past the end of input, then + // return failure + if (position.position >= input.length) { + return 'failure' + } + + // 8. Advance position by 1. + position.position++; + + // 9. Let encodedBody be the remainder of input. + const encodedBody = input.slice(mimeTypeLength + 1); + + // 10. Let body be the percent-decoding of encodedBody. + let body = stringPercentDecode(encodedBody); + + // 11. If mimeType ends with U+003B (;), followed by + // zero or more U+0020 SPACE, followed by an ASCII + // case-insensitive match for "base64", then: + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + // 1. Let stringBody be the isomorphic decode of body. + const stringBody = isomorphicDecode(body); + + // 2. Set body to the forgiving-base64 decode of + // stringBody. + body = forgivingBase64(stringBody); + + // 3. If body is failure, then return failure. + if (body === 'failure') { + return 'failure' + } + + // 4. Remove the last 6 code points from mimeType. + mimeType = mimeType.slice(0, -6); + + // 5. Remove trailing U+0020 SPACE code points from mimeType, + // if any. + mimeType = mimeType.replace(/(\u0020)+$/, ''); + + // 6. Remove the last U+003B (;) code point from mimeType. + mimeType = mimeType.slice(0, -1); + } + + // 12. If mimeType starts with U+003B (;), then prepend + // "text/plain" to mimeType. + if (mimeType.startsWith(';')) { + mimeType = 'text/plain' + mimeType; + } + + // 13. Let mimeTypeRecord be the result of parsing + // mimeType. + let mimeTypeRecord = parseMIMEType(mimeType); + + // 14. If mimeTypeRecord is failure, then set + // mimeTypeRecord to text/plain;charset=US-ASCII. + if (mimeTypeRecord === 'failure') { + mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII'); + } + + // 15. Return a new data: URL struct whose MIME + // type is mimeTypeRecord and body is body. + // https://fetch.spec.whatwg.org/#data-url-struct + return { mimeType: mimeTypeRecord, body } + } + + // https://url.spec.whatwg.org/#concept-url-serializer + /** + * @param {URL} url + * @param {boolean} excludeFragment + */ + function URLSerializer (url, excludeFragment = false) { + if (!excludeFragment) { + return url.href + } + + const href = url.href; + const hashLength = url.hash.length; + + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + + if (!hashLength && href.endsWith('#')) { + return serialized.slice(0, -1) + } + + return serialized + } + + // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points + /** + * @param {(char: string) => boolean} condition + * @param {string} input + * @param {{ position: number }} position + */ + function collectASequenceOfCodePoints (condition, input, position) { + // 1. Let result be the empty string. + let result = ''; + + // 2. While position doesn’t point past the end of input and the + // code point at position within input meets the condition condition: + while (position.position < input.length && condition(input[position.position])) { + // 1. Append that code point to the end of result. + result += input[position.position]; + + // 2. Advance position by 1. + position.position++; + } + + // 3. Return result. + return result + } + + /** + * A faster collectASequenceOfCodePoints that only works when comparing a single character. + * @param {string} char + * @param {string} input + * @param {{ position: number }} position + */ + function collectASequenceOfCodePointsFast (char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + + if (idx === -1) { + position.position = input.length; + return input.slice(start) + } + + position.position = idx; + return input.slice(start, position.position) + } + + // https://url.spec.whatwg.org/#string-percent-decode + /** @param {string} input */ + function stringPercentDecode (input) { + // 1. Let bytes be the UTF-8 encoding of input. + const bytes = encoder.encode(input); + + // 2. Return the percent-decoding of bytes. + return percentDecode(bytes) + } + + /** + * @param {number} byte + */ + function isHexCharByte (byte) { + // 0-9 A-F a-f + return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66) + } + + /** + * @param {number} byte + */ + function hexByteToNumber (byte) { + return ( + // 0-9 + byte >= 0x30 && byte <= 0x39 + ? (byte - 48) + // Convert to uppercase + // ((byte & 0xDF) - 65) + 10 + : ((byte & 0xDF) - 55) + ) + } + + // https://url.spec.whatwg.org/#percent-decode + /** @param {Uint8Array} input */ + function percentDecode (input) { + const length = input.length; + // 1. Let output be an empty byte sequence. + /** @type {Uint8Array} */ + const output = new Uint8Array(length); + let j = 0; + // 2. For each byte byte in input: + for (let i = 0; i < length; ++i) { + const byte = input[i]; + + // 1. If byte is not 0x25 (%), then append byte to output. + if (byte !== 0x25) { + output[j++] = byte; + + // 2. Otherwise, if byte is 0x25 (%) and the next two bytes + // after byte in input are not in the ranges + // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), + // and 0x61 (a) to 0x66 (f), all inclusive, append byte + // to output. + } else if ( + byte === 0x25 && + !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2])) + ) { + output[j++] = 0x25; + + // 3. Otherwise: + } else { + // 1. Let bytePoint be the two bytes after byte in input, + // decoded, and then interpreted as hexadecimal number. + // 2. Append a byte whose value is bytePoint to output. + output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2]); + + // 3. Skip the next two bytes in input. + i += 2; + } + } + + // 3. Return output. + return length === j ? output : output.subarray(0, j) + } + + // https://mimesniff.spec.whatwg.org/#parse-a-mime-type + /** @param {string} input */ + function parseMIMEType (input) { + // 1. Remove any leading and trailing HTTP whitespace + // from input. + input = removeHTTPWhitespace(input, true, true); + + // 2. Let position be a position variable for input, + // initially pointing at the start of input. + const position = { position: 0 }; + + // 3. Let type be the result of collecting a sequence + // of code points that are not U+002F (/) from + // input, given position. + const type = collectASequenceOfCodePointsFast( + '/', + input, + position + ); + + // 4. If type is the empty string or does not solely + // contain HTTP token code points, then return failure. + // https://mimesniff.spec.whatwg.org/#http-token-code-point + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return 'failure' + } + + // 5. If position is past the end of input, then return + // failure + if (position.position > input.length) { + return 'failure' + } + + // 6. Advance position by 1. (This skips past U+002F (/).) + position.position++; + + // 7. Let subtype be the result of collecting a sequence of + // code points that are not U+003B (;) from input, given + // position. + let subtype = collectASequenceOfCodePointsFast( + ';', + input, + position + ); + + // 8. Remove any trailing HTTP whitespace from subtype. + subtype = removeHTTPWhitespace(subtype, false, true); + + // 9. If subtype is the empty string or does not solely + // contain HTTP token code points, then return failure. + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return 'failure' + } + + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + + // 10. Let mimeType be a new MIME type record whose type + // is type, in ASCII lowercase, and subtype is subtype, + // in ASCII lowercase. + // https://mimesniff.spec.whatwg.org/#mime-type + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; + + // 11. While position is not past the end of input: + while (position.position < input.length) { + // 1. Advance position by 1. (This skips past U+003B (;).) + position.position++; + + // 2. Collect a sequence of code points that are HTTP + // whitespace from input given position. + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + char => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); + + // 3. Let parameterName be the result of collecting a + // sequence of code points that are not U+003B (;) + // or U+003D (=) from input, given position. + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ';' && char !== '=', + input, + position + ); + + // 4. Set parameterName to parameterName, in ASCII + // lowercase. + parameterName = parameterName.toLowerCase(); + + // 5. If position is not past the end of input, then: + if (position.position < input.length) { + // 1. If the code point at position within input is + // U+003B (;), then continue. + if (input[position.position] === ';') { + continue + } + + // 2. Advance position by 1. (This skips past U+003D (=).) + position.position++; + } + + // 6. If position is past the end of input, then break. + if (position.position > input.length) { + break + } + + // 7. Let parameterValue be null. + let parameterValue = null; + + // 8. If the code point at position within input is + // U+0022 ("), then: + if (input[position.position] === '"') { + // 1. Set parameterValue to the result of collecting + // an HTTP quoted string from input, given position + // and the extract-value flag. + parameterValue = collectAnHTTPQuotedString(input, position, true); + + // 2. Collect a sequence of code points that are not + // U+003B (;) from input, given position. + collectASequenceOfCodePointsFast( + ';', + input, + position + ); + + // 9. Otherwise: + } else { + // 1. Set parameterValue to the result of collecting + // a sequence of code points that are not U+003B (;) + // from input, given position. + parameterValue = collectASequenceOfCodePointsFast( + ';', + input, + position + ); + + // 2. Remove any trailing HTTP whitespace from parameterValue. + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + + // 3. If parameterValue is the empty string, then continue. + if (parameterValue.length === 0) { + continue + } + } + + // 10. If all of the following are true + // - parameterName is not the empty string + // - parameterName solely contains HTTP token code points + // - parameterValue solely contains HTTP quoted-string token code points + // - mimeType’s parameters[parameterName] does not exist + // then set mimeType’s parameters[parameterName] to parameterValue. + if ( + parameterName.length !== 0 && + HTTP_TOKEN_CODEPOINTS.test(parameterName) && + (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && + !mimeType.parameters.has(parameterName) + ) { + mimeType.parameters.set(parameterName, parameterValue); + } + } + + // 12. Return mimeType. + return mimeType + } + + // https://infra.spec.whatwg.org/#forgiving-base64-decode + /** @param {string} data */ + function forgivingBase64 (data) { + // 1. Remove all ASCII whitespace from data. + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ''); // eslint-disable-line + + let dataLength = data.length; + // 2. If data’s code point length divides by 4 leaving + // no remainder, then: + if (dataLength % 4 === 0) { + // 1. If data ends with one or two U+003D (=) code points, + // then remove them from data. + if (data.charCodeAt(dataLength - 1) === 0x003D) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 0x003D) { + --dataLength; + } + } + } + + // 3. If data’s code point length divides by 4 leaving + // a remainder of 1, then return failure. + if (dataLength % 4 === 1) { + return 'failure' + } + + // 4. If data contains a code point that is not one of + // U+002B (+) + // U+002F (/) + // ASCII alphanumeric + // then return failure. + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { + return 'failure' + } + + const buffer = Buffer.from(data, 'base64'); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength) + } + + // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string + // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string + /** + * @param {string} input + * @param {{ position: number }} position + * @param {boolean?} extractValue + */ + function collectAnHTTPQuotedString (input, position, extractValue) { + // 1. Let positionStart be position. + const positionStart = position.position; + + // 2. Let value be the empty string. + let value = ''; + + // 3. Assert: the code point at position within input + // is U+0022 ("). + assert(input[position.position] === '"'); + + // 4. Advance position by 1. + position.position++; + + // 5. While true: + while (true) { + // 1. Append the result of collecting a sequence of code points + // that are not U+0022 (") or U+005C (\) from input, given + // position, to value. + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== '\\', + input, + position + ); + + // 2. If position is past the end of input, then break. + if (position.position >= input.length) { + break + } + + // 3. Let quoteOrBackslash be the code point at position within + // input. + const quoteOrBackslash = input[position.position]; + + // 4. Advance position by 1. + position.position++; + + // 5. If quoteOrBackslash is U+005C (\), then: + if (quoteOrBackslash === '\\') { + // 1. If position is past the end of input, then append + // U+005C (\) to value and break. + if (position.position >= input.length) { + value += '\\'; + break + } + + // 2. Append the code point at position within input to value. + value += input[position.position]; + + // 3. Advance position by 1. + position.position++; + + // 6. Otherwise: + } else { + // 1. Assert: quoteOrBackslash is U+0022 ("). + assert(quoteOrBackslash === '"'); + + // 2. Break. + break + } + } + + // 6. If the extract-value flag is set, then return value. + if (extractValue) { + return value + } + + // 7. Return the code points from positionStart to position, + // inclusive, within input. + return input.slice(positionStart, position.position) + } + + /** + * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type + */ + function serializeAMimeType (mimeType) { + assert(mimeType !== 'failure'); + const { parameters, essence } = mimeType; + + // 1. Let serialization be the concatenation of mimeType’s + // type, U+002F (/), and mimeType’s subtype. + let serialization = essence; + + // 2. For each name → value of mimeType’s parameters: + for (let [name, value] of parameters.entries()) { + // 1. Append U+003B (;) to serialization. + serialization += ';'; + + // 2. Append name to serialization. + serialization += name; + + // 3. Append U+003D (=) to serialization. + serialization += '='; + + // 4. If value does not solely contain HTTP token code + // points or value is the empty string, then: + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + // 1. Precede each occurrence of U+0022 (") or + // U+005C (\) in value with U+005C (\). + value = value.replace(/(\\|")/g, '\\$1'); + + // 2. Prepend U+0022 (") to value. + value = '"' + value; + + // 3. Append U+0022 (") to value. + value += '"'; + } + + // 5. Append value to serialization. + serialization += value; + } + + // 3. Return serialization. + return serialization + } + + /** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {number} char + */ + function isHTTPWhiteSpace (char) { + // "\r\n\t " + return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020 + } + + /** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} str + * @param {boolean} [leading=true] + * @param {boolean} [trailing=true] + */ + function removeHTTPWhitespace (str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isHTTPWhiteSpace) + } + + /** + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * @param {number} char + */ + function isASCIIWhitespace (char) { + // "\r\n\t\f " + return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x00c || char === 0x020 + } + + /** + * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + * @param {string} str + * @param {boolean} [leading=true] + * @param {boolean} [trailing=true] + */ + function removeASCIIWhitespace (str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace) + } + + /** + * @param {string} str + * @param {boolean} leading + * @param {boolean} trailing + * @param {(charCode: number) => boolean} predicate + * @returns + */ + function removeChars (str, leading, trailing, predicate) { + let lead = 0; + let trail = str.length - 1; + + if (leading) { + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; + } + + if (trailing) { + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; + } + + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1) + } + + /** + * @see https://infra.spec.whatwg.org/#isomorphic-decode + * @param {Uint8Array} input + * @returns {string} + */ + function isomorphicDecode (input) { + // 1. To isomorphic decode a byte sequence input, return a string whose code point + // length is equal to input’s length and whose code points have the same values + // as the values of input’s bytes, in the same order. + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input) + } + let result = ''; let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; + } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); + } + return result + } + + /** + * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type + * @param {Exclude, 'failure'>} mimeType + */ + function minimizeSupportedMimeType (mimeType) { + switch (mimeType.essence) { + case 'application/ecmascript': + case 'application/javascript': + case 'application/x-ecmascript': + case 'application/x-javascript': + case 'text/ecmascript': + case 'text/javascript': + case 'text/javascript1.0': + case 'text/javascript1.1': + case 'text/javascript1.2': + case 'text/javascript1.3': + case 'text/javascript1.4': + case 'text/javascript1.5': + case 'text/jscript': + case 'text/livescript': + case 'text/x-ecmascript': + case 'text/x-javascript': + // 1. If mimeType is a JavaScript MIME type, then return "text/javascript". + return 'text/javascript' + case 'application/json': + case 'text/json': + // 2. If mimeType is a JSON MIME type, then return "application/json". + return 'application/json' + case 'image/svg+xml': + // 3. If mimeType’s essence is "image/svg+xml", then return "image/svg+xml". + return 'image/svg+xml' + case 'text/xml': + case 'application/xml': + // 4. If mimeType is an XML MIME type, then return "application/xml". + return 'application/xml' + } + + // 2. If mimeType is a JSON MIME type, then return "application/json". + if (mimeType.subtype.endsWith('+json')) { + return 'application/json' + } + + // 4. If mimeType is an XML MIME type, then return "application/xml". + if (mimeType.subtype.endsWith('+xml')) { + return 'application/xml' + } + + // 5. If mimeType is supported by the user agent, then return mimeType’s essence. + // Technically, node doesn't support any mimetypes. + + // 6. Return the empty string. + return '' + } + + dataUrl = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType, + removeChars, + removeHTTPWhitespace, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS, + isomorphicDecode + }; + return dataUrl; +} + +var webidl_1; +var hasRequiredWebidl; + +function requireWebidl () { + if (hasRequiredWebidl) return webidl_1; + hasRequiredWebidl = 1; + + const { types, inspect } = require$$0$a; + const { markAsUncloneable } = require$$1$4; + const { toUSVString } = requireUtil$9(); + + /** @type {import('../../../types/webidl').Webidl} */ + const webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + + webidl.errors.exception = function (message) { + return new TypeError(`${message.header}: ${message.message}`) + }; + + webidl.errors.conversionFailed = function (context) { + const plural = context.types.length === 1 ? '' : ' one of'; + const message = + `${context.argument} could not be converted to` + + `${plural}: ${context.types.join(', ')}.`; + + return webidl.errors.exception({ + header: context.prefix, + message + }) + }; + + webidl.errors.invalidArgument = function (context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }) + }; + + // https://webidl.spec.whatwg.org/#implements + webidl.brandCheck = function (V, I, opts) { + if (opts?.strict !== false) { + if (!(V instanceof I)) { + const err = new TypeError('Illegal invocation'); + err.code = 'ERR_INVALID_THIS'; // node compat. + throw err + } + } else { + if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + const err = new TypeError('Illegal invocation'); + err.code = 'ERR_INVALID_THIS'; // node compat. + throw err + } + } + }; + + webidl.argumentLengthCheck = function ({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? 's' : ''} required, ` + + `but${length ? ' only' : ''} ${length} found.`, + header: ctx + }) + } + }; + + webidl.illegalConstructor = function () { + throw webidl.errors.exception({ + header: 'TypeError', + message: 'Illegal constructor' + }) + }; + + // https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values + webidl.util.Type = function (V) { + switch (typeof V) { + case 'undefined': return 'Undefined' + case 'boolean': return 'Boolean' + case 'string': return 'String' + case 'symbol': return 'Symbol' + case 'number': return 'Number' + case 'bigint': return 'BigInt' + case 'function': + case 'object': { + if (V === null) { + return 'Null' + } + + return 'Object' + } + } + }; + + webidl.util.markAsUncloneable = markAsUncloneable || (() => {}); + // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint + webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) { + let upperBound; + let lowerBound; + + // 1. If bitLength is 64, then: + if (bitLength === 64) { + // 1. Let upperBound be 2^53 − 1. + upperBound = Math.pow(2, 53) - 1; + + // 2. If signedness is "unsigned", then let lowerBound be 0. + if (signedness === 'unsigned') { + lowerBound = 0; + } else { + // 3. Otherwise let lowerBound be −2^53 + 1. + lowerBound = Math.pow(-2, 53) + 1; + } + } else if (signedness === 'unsigned') { + // 2. Otherwise, if signedness is "unsigned", then: + + // 1. Let lowerBound be 0. + lowerBound = 0; + + // 2. Let upperBound be 2^bitLength − 1. + upperBound = Math.pow(2, bitLength) - 1; + } else { + // 3. Otherwise: + + // 1. Let lowerBound be -2^bitLength − 1. + lowerBound = Math.pow(-2, bitLength) - 1; + + // 2. Let upperBound be 2^bitLength − 1 − 1. + upperBound = Math.pow(2, bitLength - 1) - 1; + } + + // 4. Let x be ? ToNumber(V). + let x = Number(V); + + // 5. If x is −0, then set x to +0. + if (x === 0) { + x = 0; + } + + // 6. If the conversion is to an IDL type associated + // with the [EnforceRange] extended attribute, then: + if (opts?.enforceRange === true) { + // 1. If x is NaN, +∞, or −∞, then throw a TypeError. + if ( + Number.isNaN(x) || + x === Number.POSITIVE_INFINITY || + x === Number.NEGATIVE_INFINITY + ) { + throw webidl.errors.exception({ + header: 'Integer conversion', + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` + }) + } + + // 2. Set x to IntegerPart(x). + x = webidl.util.IntegerPart(x); + + // 3. If x < lowerBound or x > upperBound, then + // throw a TypeError. + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: 'Integer conversion', + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }) + } + + // 4. Return x. + return x + } + + // 7. If x is not NaN and the conversion is to an IDL + // type associated with the [Clamp] extended + // attribute, then: + if (!Number.isNaN(x) && opts?.clamp === true) { + // 1. Set x to min(max(x, lowerBound), upperBound). + x = Math.min(Math.max(x, lowerBound), upperBound); + + // 2. Round x to the nearest integer, choosing the + // even integer if it lies halfway between two, + // and choosing +0 rather than −0. + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); + } else { + x = Math.ceil(x); + } + + // 3. Return x. + return x + } + + // 8. If x is NaN, +0, +∞, or −∞, then return +0. + if ( + Number.isNaN(x) || + (x === 0 && Object.is(0, x)) || + x === Number.POSITIVE_INFINITY || + x === Number.NEGATIVE_INFINITY + ) { + return 0 + } + + // 9. Set x to IntegerPart(x). + x = webidl.util.IntegerPart(x); + + // 10. Set x to x modulo 2^bitLength. + x = x % Math.pow(2, bitLength); + + // 11. If signedness is "signed" and x ≥ 2^bitLength − 1, + // then return x − 2^bitLength. + if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength) + } + + // 12. Otherwise, return x. + return x + }; + + // https://webidl.spec.whatwg.org/#abstract-opdef-integerpart + webidl.util.IntegerPart = function (n) { + // 1. Let r be floor(abs(n)). + const r = Math.floor(Math.abs(n)); + + // 2. If n < 0, then return -1 × r. + if (n < 0) { + return -1 * r + } + + // 3. Otherwise, return r. + return r + }; + + webidl.util.Stringify = function (V) { + const type = webidl.util.Type(V); + + switch (type) { + case 'Symbol': + return `Symbol(${V.description})` + case 'Object': + return inspect(V) + case 'String': + return `"${V}"` + default: + return `${V}` + } + }; + + // https://webidl.spec.whatwg.org/#es-sequence + webidl.sequenceConverter = function (converter) { + return (V, prefix, argument, Iterable) => { + // 1. If Type(V) is not Object, throw a TypeError. + if (webidl.util.Type(V) !== 'Object') { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` + }) + } + + // 2. Let method be ? GetMethod(V, @@iterator). + /** @type {Generator} */ + const method = typeof Iterable === 'function' ? Iterable() : V?.[Symbol.iterator]?.(); + const seq = []; + let index = 0; + + // 3. If method is undefined, throw a TypeError. + if ( + method === undefined || + typeof method.next !== 'function' + ) { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is not iterable.` + }) + } + + // https://webidl.spec.whatwg.org/#create-sequence-from-iterable + while (true) { + const { done, value } = method.next(); + + if (done) { + break + } + + seq.push(converter(value, prefix, `${argument}[${index++}]`)); + } + + return seq + } + }; + + // https://webidl.spec.whatwg.org/#es-to-record + webidl.recordConverter = function (keyConverter, valueConverter) { + return (O, prefix, argument) => { + // 1. If Type(O) is not Object, throw a TypeError. + if (webidl.util.Type(O) !== 'Object') { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` + }) + } + + // 2. Let result be a new empty instance of record. + const result = {}; + + if (!types.isProxy(O)) { + // 1. Let desc be ? O.[[GetOwnProperty]](key). + const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; + + for (const key of keys) { + // 1. Let typedKey be key converted to an IDL value of type K. + const typedKey = keyConverter(key, prefix, argument); + + // 2. Let value be ? Get(O, key). + // 3. Let typedValue be value converted to an IDL value of type V. + const typedValue = valueConverter(O[key], prefix, argument); + + // 4. Set result[typedKey] to typedValue. + result[typedKey] = typedValue; + } + + // 5. Return result. + return result + } + + // 3. Let keys be ? O.[[OwnPropertyKeys]](). + const keys = Reflect.ownKeys(O); + + // 4. For each key of keys. + for (const key of keys) { + // 1. Let desc be ? O.[[GetOwnProperty]](key). + const desc = Reflect.getOwnPropertyDescriptor(O, key); + + // 2. If desc is not undefined and desc.[[Enumerable]] is true: + if (desc?.enumerable) { + // 1. Let typedKey be key converted to an IDL value of type K. + const typedKey = keyConverter(key, prefix, argument); + + // 2. Let value be ? Get(O, key). + // 3. Let typedValue be value converted to an IDL value of type V. + const typedValue = valueConverter(O[key], prefix, argument); + + // 4. Set result[typedKey] to typedValue. + result[typedKey] = typedValue; + } + } + + // 5. Return result. + return result + } + }; + + webidl.interfaceConverter = function (i) { + return (V, prefix, argument, opts) => { + if (opts?.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` + }) + } + + return V + } + }; + + webidl.dictionaryConverter = function (converters) { + return (dictionary, prefix, argument) => { + const type = webidl.util.Type(dictionary); + const dict = {}; + + if (type === 'Null' || type === 'Undefined') { + return dict + } else if (type !== 'Object') { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }) + } + + for (const options of converters) { + const { key, defaultValue, required, converter } = options; + + if (required === true) { + if (!Object.hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: prefix, + message: `Missing required key "${key}".` + }) + } + } + + let value = dictionary[key]; + const hasDefault = Object.hasOwn(options, 'defaultValue'); + + // Only use defaultValue if value is undefined and + // a defaultValue options was provided. + if (hasDefault && value !== null) { + value ??= defaultValue(); + } + + // A key can be optional and have no default value. + // When this happens, do not perform a conversion, + // and do not assign the key a value. + if (required || hasDefault || value !== undefined) { + value = converter(value, prefix, `${argument}.${key}`); + + if ( + options.allowedValues && + !options.allowedValues.includes(value) + ) { + throw webidl.errors.exception({ + header: prefix, + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` + }) + } + + dict[key] = value; + } + } + + return dict + } + }; + + webidl.nullableConverter = function (converter) { + return (V, prefix, argument) => { + if (V === null) { + return V + } + + return converter(V, prefix, argument) + } + }; + + // https://webidl.spec.whatwg.org/#es-DOMString + webidl.converters.DOMString = function (V, prefix, argument, opts) { + // 1. If V is null and the conversion is to an IDL type + // associated with the [LegacyNullToEmptyString] + // extended attribute, then return the DOMString value + // that represents the empty string. + if (V === null && opts?.legacyNullToEmptyString) { + return '' + } + + // 2. Let x be ? ToString(V). + if (typeof V === 'symbol') { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a DOMString.` + }) + } + + // 3. Return the IDL DOMString value that represents the + // same sequence of code units as the one the + // ECMAScript String value x represents. + return String(V) + }; + + // https://webidl.spec.whatwg.org/#es-ByteString + webidl.converters.ByteString = function (V, prefix, argument) { + // 1. Let x be ? ToString(V). + // Note: DOMString converter perform ? ToString(V) + const x = webidl.converters.DOMString(V, prefix, argument); + + // 2. If the value of any element of x is greater than + // 255, then throw a TypeError. + for (let index = 0; index < x.length; index++) { + if (x.charCodeAt(index) > 255) { + throw new TypeError( + 'Cannot convert argument to a ByteString because the character at ' + + `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` + ) + } + } + + // 3. Return an IDL ByteString value whose length is the + // length of x, and where the value of each element is + // the value of the corresponding element of x. + return x + }; + + // https://webidl.spec.whatwg.org/#es-USVString + // TODO: rewrite this so we can control the errors thrown + webidl.converters.USVString = toUSVString; + + // https://webidl.spec.whatwg.org/#es-boolean + webidl.converters.boolean = function (V) { + // 1. Let x be the result of computing ToBoolean(V). + const x = Boolean(V); + + // 2. Return the IDL boolean value that is the one that represents + // the same truth value as the ECMAScript Boolean value x. + return x + }; + + // https://webidl.spec.whatwg.org/#es-any + webidl.converters.any = function (V) { + return V + }; + + // https://webidl.spec.whatwg.org/#es-long-long + webidl.converters['long long'] = function (V, prefix, argument) { + // 1. Let x be ? ConvertToInt(V, 64, "signed"). + const x = webidl.util.ConvertToInt(V, 64, 'signed', undefined, prefix, argument); + + // 2. Return the IDL long long value that represents + // the same numeric value as x. + return x + }; + + // https://webidl.spec.whatwg.org/#es-unsigned-long-long + webidl.converters['unsigned long long'] = function (V, prefix, argument) { + // 1. Let x be ? ConvertToInt(V, 64, "unsigned"). + const x = webidl.util.ConvertToInt(V, 64, 'unsigned', undefined, prefix, argument); + + // 2. Return the IDL unsigned long long value that + // represents the same numeric value as x. + return x + }; + + // https://webidl.spec.whatwg.org/#es-unsigned-long + webidl.converters['unsigned long'] = function (V, prefix, argument) { + // 1. Let x be ? ConvertToInt(V, 32, "unsigned"). + const x = webidl.util.ConvertToInt(V, 32, 'unsigned', undefined, prefix, argument); + + // 2. Return the IDL unsigned long value that + // represents the same numeric value as x. + return x + }; + + // https://webidl.spec.whatwg.org/#es-unsigned-short + webidl.converters['unsigned short'] = function (V, prefix, argument, opts) { + // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). + const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts, prefix, argument); + + // 2. Return the IDL unsigned short value that represents + // the same numeric value as x. + return x + }; + + // https://webidl.spec.whatwg.org/#idl-ArrayBuffer + webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) { + // 1. If Type(V) is not Object, or V does not have an + // [[ArrayBufferData]] internal slot, then throw a + // TypeError. + // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances + // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances + if ( + webidl.util.Type(V) !== 'Object' || + !types.isAnyArrayBuffer(V) + ) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ['ArrayBuffer'] + }) + } + + // 2. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V) is true, then throw a + // TypeError. + if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 3. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V) is true, then throw a + // TypeError. + if (V.resizable || V.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } + + // 4. Return the IDL ArrayBuffer value that is a + // reference to the same object as V. + return V + }; + + webidl.converters.TypedArray = function (V, T, prefix, name, opts) { + // 1. Let T be the IDL type V is being converted to. + + // 2. If Type(V) is not Object, or V does not have a + // [[TypedArrayName]] internal slot with a value + // equal to T’s name, then throw a TypeError. + if ( + webidl.util.Type(V) !== 'Object' || + !types.isTypedArray(V) || + V.constructor.name !== T.name + ) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, + types: [T.name] + }) + } + + // 3. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 4. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } + + // 5. Return the IDL value of type T that is a reference + // to the same object as V. + return V + }; + + webidl.converters.DataView = function (V, prefix, name, opts) { + // 1. If Type(V) is not Object, or V does not have a + // [[DataView]] internal slot, then throw a TypeError. + if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `${name} is not a DataView.` + }) + } + + // 2. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, + // then throw a TypeError. + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 3. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'Received a resizable ArrayBuffer.' + }) + } + + // 4. Return the IDL DataView value that is a reference + // to the same object as V. + return V + }; + + // https://webidl.spec.whatwg.org/#BufferSource + webidl.converters.BufferSource = function (V, prefix, name, opts) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false }) + } + + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false }) + } + + if (types.isDataView(V)) { + return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false }) + } + + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name} ("${webidl.util.Stringify(V)}")`, + types: ['BufferSource'] + }) + }; + + webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + + webidl.converters['sequence>'] = webidl.sequenceConverter( + webidl.converters['sequence'] + ); + + webidl.converters['record'] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + + webidl_1 = { + webidl + }; + return webidl_1; +} + +var util$8; +var hasRequiredUtil$8; + +function requireUtil$8 () { + if (hasRequiredUtil$8) return util$8; + hasRequiredUtil$8 = 1; + + const { Transform } = require$$0$8; + const zlib = require$$3; + const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = requireConstants$8(); + const { getGlobalOrigin } = requireGlobal$1(); + const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = requireDataUrl(); + const { performance } = require$$5$1; + const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = requireUtil$9(); + const assert = require$$0$7; + const { isUint8Array } = require$$8$1; + const { webidl } = requireWebidl(); + + let supportedHashes = []; + + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable + /** @type {import('crypto')} */ + let crypto; + try { + crypto = require('node:crypto'); + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + /* c8 ignore next 3 */ + } catch { + + } + + function responseURL (response) { + // https://fetch.spec.whatwg.org/#responses + // A response has an associated URL. It is a pointer to the last URL + // in response’s URL list and null if response’s URL list is empty. + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString() + } + + // https://fetch.spec.whatwg.org/#concept-response-location-url + function responseLocationURL (response, requestFragment) { + // 1. If response’s status is not a redirect status, then return null. + if (!redirectStatusSet.has(response.status)) { + return null + } + + // 2. Let location be the result of extracting header list values given + // `Location` and response’s header list. + let location = response.headersList.get('location', true); + + // 3. If location is a header value, then set location to the result of + // parsing location with response’s URL. + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + // Some websites respond location header in UTF-8 form without encoding them as ASCII + // and major browsers redirect them to correctly UTF-8 encoded addresses. + // Here, we handle that behavior in the same way. + location = normalizeBinaryStringToUtf8(location); + } + location = new URL(location, responseURL(response)); + } + + // 4. If location is a URL whose fragment is null, then set location’s + // fragment to requestFragment. + if (location && !location.hash) { + location.hash = requestFragment; + } + + // 5. Return location. + return location + } + + /** + * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2 + * @param {string} url + * @returns {boolean} + */ + function isValidEncodedURL (url) { + for (let i = 0; i < url.length; ++i) { + const code = url.charCodeAt(i); + + if ( + code > 0x7E || // Non-US-ASCII + DEL + code < 0x20 // Control characters NUL - US + ) { + return false + } + } + return true + } + + /** + * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it. + * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well. + * @param {string} value + * @returns {string} + */ + function normalizeBinaryStringToUtf8 (value) { + return Buffer.from(value, 'binary').toString('utf8') + } + + /** @returns {URL} */ + function requestCurrentURL (request) { + return request.urlList[request.urlList.length - 1] + } + + function requestBadPort (request) { + // 1. Let url be request’s current URL. + const url = requestCurrentURL(request); + + // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, + // then return blocked. + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return 'blocked' + } + + // 3. Return allowed. + return 'allowed' + } + + function isErrorLike (object) { + return object instanceof Error || ( + object?.constructor?.name === 'Error' || + object?.constructor?.name === 'DOMException' + ) + } + + // Check whether |statusText| is a ByteString and + // matches the Reason-Phrase token production. + // RFC 2616: https://tools.ietf.org/html/rfc2616 + // RFC 7230: https://tools.ietf.org/html/rfc7230 + // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" + // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 + function isValidReasonPhrase (statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if ( + !( + ( + c === 0x09 || // HTAB + (c >= 0x20 && c <= 0x7e) || // SP / VCHAR + (c >= 0x80 && c <= 0xff) + ) // obs-text + ) + ) { + return false + } + } + return true + } + + /** + * @see https://fetch.spec.whatwg.org/#header-name + * @param {string} potentialValue + */ + const isValidHeaderName = isValidHTTPToken; + + /** + * @see https://fetch.spec.whatwg.org/#header-value + * @param {string} potentialValue + */ + function isValidHeaderValue (potentialValue) { + // - Has no leading or trailing HTTP tab or space bytes. + // - Contains no 0x00 (NUL) or HTTP newline bytes. + return ( + potentialValue[0] === '\t' || + potentialValue[0] === ' ' || + potentialValue[potentialValue.length - 1] === '\t' || + potentialValue[potentialValue.length - 1] === ' ' || + potentialValue.includes('\n') || + potentialValue.includes('\r') || + potentialValue.includes('\0') + ) === false + } + + // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect + function setRequestReferrerPolicyOnRedirect (request, actualResponse) { + // Given a request request and a response actualResponse, this algorithm + // updates request’s referrer policy according to the Referrer-Policy + // header (if any) in actualResponse. + + // 1. Let policy be the result of executing § 8.1 Parse a referrer policy + // from a Referrer-Policy header on actualResponse. + + // 8.1 Parse a referrer policy from a Referrer-Policy header + // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. + const { headersList } = actualResponse; + // 2. Let policy be the empty string. + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. + // 4. Return policy. + const policyHeader = (headersList.get('referrer-policy', true) ?? '').split(','); + + // Note: As the referrer-policy can contain multiple policies + // separated by comma, we need to loop through all of them + // and pick the first valid one. + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy + let policy = ''; + if (policyHeader.length > 0) { + // The right-most policy takes precedence. + // The left-most policy is the fallback. + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break + } + } + } + + // 2. If policy is not the empty string, then set request’s referrer policy to policy. + if (policy !== '') { + request.referrerPolicy = policy; + } + } + + // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check + function crossOriginResourcePolicyCheck () { + // TODO + return 'allowed' + } + + // https://fetch.spec.whatwg.org/#concept-cors-check + function corsCheck () { + // TODO + return 'success' + } + + // https://fetch.spec.whatwg.org/#concept-tao-check + function TAOCheck () { + // TODO + return 'success' + } + + function appendFetchMetadata (httpRequest) { + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header + // TODO + + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header + + // 1. Assert: r’s url is a potentially trustworthy URL. + // TODO + + // 2. Let header be a Structured Header whose value is a token. + let header = null; + + // 3. Set header’s value to r’s mode. + header = httpRequest.mode; + + // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. + httpRequest.headersList.set('sec-fetch-mode', header, true); + + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header + // TODO + + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header + // TODO + } + + // https://fetch.spec.whatwg.org/#append-a-request-origin-header + function appendRequestOriginHeader (request) { + // 1. Let serializedOrigin be the result of byte-serializing a request origin + // with request. + // TODO: implement "byte-serializing a request origin" + let serializedOrigin = request.origin; + + // - "'client' is changed to an origin during fetching." + // This doesn't happen in undici (in most cases) because undici, by default, + // has no concept of origin. + // - request.origin can also be set to request.client.origin (client being + // an environment settings object), which is undefined without using + // setGlobalOrigin. + if (serializedOrigin === 'client' || serializedOrigin === undefined) { + return + } + + // 2. If request’s response tainting is "cors" or request’s mode is "websocket", + // then append (`Origin`, serializedOrigin) to request’s header list. + // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: + if (request.responseTainting === 'cors' || request.mode === 'websocket') { + request.headersList.append('origin', serializedOrigin, true); + } else if (request.method !== 'GET' && request.method !== 'HEAD') { + // 1. Switch on request’s referrer policy: + switch (request.referrerPolicy) { + case 'no-referrer': + // Set serializedOrigin to `null`. + serializedOrigin = null; + break + case 'no-referrer-when-downgrade': + case 'strict-origin': + case 'strict-origin-when-cross-origin': + // If request’s origin is a tuple origin, its scheme is "https", and + // request’s current URL’s scheme is not "https", then set + // serializedOrigin to `null`. + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break + case 'same-origin': + // If request’s origin is not same origin with request’s current URL’s + // origin, then set serializedOrigin to `null`. + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break + // Do nothing. + } + + // 2. Append (`Origin`, serializedOrigin) to request’s header list. + request.headersList.append('origin', serializedOrigin, true); + } + } + + // https://w3c.github.io/hr-time/#dfn-coarsen-time + function coarsenTime (timestamp, crossOriginIsolatedCapability) { + // TODO + return timestamp + } + + // https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info + function clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + } + } + + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + } + } + + // https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time + function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { + return coarsenTime(performance.now()) + } + + // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info + function createOpaqueTimingInfo (timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + } + } + + // https://html.spec.whatwg.org/multipage/origin.html#policy-container + function makePolicyContainer () { + // Note: the fetch spec doesn't make use of embedder policy or CSP list + return { + referrerPolicy: 'strict-origin-when-cross-origin' + } + } + + // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container + function clonePolicyContainer (policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + } + } + + // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer + function determineRequestsReferrer (request) { + // 1. Let policy be request's referrer policy. + const policy = request.referrerPolicy; + + // Note: policy cannot (shouldn't) be null or an empty string. + assert(policy); + + // 2. Let environment be request’s client. + + let referrerSource = null; + + // 3. Switch on request’s referrer: + if (request.referrer === 'client') { + // Note: node isn't a browser and doesn't implement document/iframes, + // so we bypass this step and replace it with our own. + + const globalOrigin = getGlobalOrigin(); + + if (!globalOrigin || globalOrigin.origin === 'null') { + return 'no-referrer' + } + + // note: we need to clone it as it's mutated + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + // Let referrerSource be request’s referrer. + referrerSource = request.referrer; + } + + // 4. Let request’s referrerURL be the result of stripping referrerSource for + // use as a referrer. + let referrerURL = stripURLForReferrer(referrerSource); + + // 5. Let referrerOrigin be the result of stripping referrerSource for use as + // a referrer, with the origin-only flag set to true. + const referrerOrigin = stripURLForReferrer(referrerSource, true); + + // 6. If the result of serializing referrerURL is a string whose length is + // greater than 4096, set referrerURL to referrerOrigin. + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } + + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && + !isURLPotentiallyTrustworthy(request.url); + + // 8. Execute the switch statements corresponding to the value of policy: + switch (policy) { + case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) + case 'unsafe-url': return referrerURL + case 'same-origin': + return areSameOrigin ? referrerOrigin : 'no-referrer' + case 'origin-when-cross-origin': + return areSameOrigin ? referrerURL : referrerOrigin + case 'strict-origin-when-cross-origin': { + const currentURL = requestCurrentURL(request); + + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL + } + + // 2. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } + + // 3. Return referrerOrigin. + return referrerOrigin + } + case 'strict-origin': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case 'no-referrer-when-downgrade': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + + default: // eslint-disable-line + return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + } + } + + /** + * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url + * @param {URL} url + * @param {boolean|undefined} originOnly + */ + function stripURLForReferrer (url, originOnly) { + // 1. Assert: url is a URL. + assert(url instanceof URL); + + url = new URL(url); + + // 2. If url’s scheme is a local scheme, then return no referrer. + if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { + return 'no-referrer' + } + + // 3. Set url’s username to the empty string. + url.username = ''; + + // 4. Set url’s password to the empty string. + url.password = ''; + + // 5. Set url’s fragment to null. + url.hash = ''; + + // 6. If the origin-only flag is true, then: + if (originOnly) { + // 1. Set url’s path to « the empty string ». + url.pathname = ''; + + // 2. Set url’s query to null. + url.search = ''; + } + + // 7. Return url. + return url + } + + function isURLPotentiallyTrustworthy (url) { + if (!(url instanceof URL)) { + return false + } + + // If child of about, return true + if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + return true + } + + // If scheme is data, return true + if (url.protocol === 'data:') return true + + // If file, return true + if (url.protocol === 'file:') return true + + return isOriginPotentiallyTrustworthy(url.origin) + + function isOriginPotentiallyTrustworthy (origin) { + // If origin is explicitly null, return false + if (origin == null || origin === 'null') return false + + const originAsURL = new URL(origin); + + // If secure, return true + if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { + return true + } + + // If localhost or variants, return true + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || + (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || + (originAsURL.hostname.endsWith('.localhost'))) { + return true + } + + // If any other, return false + return false + } + } + + /** + * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist + * @param {Uint8Array} bytes + * @param {string} metadataList + */ + function bytesMatch (bytes, metadataList) { + // If node is not built with OpenSSL support, we cannot check + // a request's integrity, so allow it by default (the spec will + // allow requests if an invalid hash is given, as precedence). + /* istanbul ignore if: only if node is built with --without-ssl */ + if (crypto === undefined) { + return true + } + + // 1. Let parsedMetadata be the result of parsing metadataList. + const parsedMetadata = parseMetadata(metadataList); + + // 2. If parsedMetadata is no metadata, return true. + if (parsedMetadata === 'no metadata') { + return true + } + + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. + if (parsedMetadata.length === 0) { + return true + } + + // 5. Let metadata be the result of getting the strongest + // metadata from parsedMetadata. + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + + // 6. For each item in metadata: + for (const item of metadata) { + // 1. Let algorithm be the alg component of item. + const algorithm = item.algo; + + // 2. Let expectedValue be the val component of item. + const expectedValue = item.hash; + + // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e + // "be liberal with padding". This is annoying, and it's not even in the spec. + + // 3. Let actualValue be the result of applying algorithm to bytes. + let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64'); + + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); + } + } + + // 4. If actualValue is a case-sensitive match for expectedValue, + // return true. + if (compareBase64Mixed(actualValue, expectedValue)) { + return true + } + } + + // 7. Return false. + return false + } + + // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options + // https://www.w3.org/TR/CSP2/#source-list-syntax + // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 + const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + + /** + * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata + * @param {string} metadata + */ + function parseMetadata (metadata) { + // 1. Let result be the empty set. + /** @type {{ algo: string, hash: string }[]} */ + const result = []; + + // 2. Let empty be equal to true. + let empty = true; + + // 3. For each token returned by splitting metadata on spaces: + for (const token of metadata.split(' ')) { + // 1. Set empty to false. + empty = false; + + // 2. Parse token as a hash-with-options. + const parsedToken = parseHashWithOptions.exec(token); + + // 3. If token does not parse, continue to the next token. + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { + // Note: Chromium blocks the request at this point, but Firefox + // gives a warning that an invalid integrity was given. The + // correct behavior is to ignore these, and subsequently not + // check the integrity of the resource. + continue + } + + // 4. Let algorithm be the hash-algo component of token. + const algorithm = parsedToken.groups.algo.toLowerCase(); + + // 5. If algorithm is a hash function recognized by the user + // agent, add the parsed token to result. + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); + } + } + + // 4. Return no metadata if empty is true, otherwise return result. + if (empty === true) { + return 'no metadata' + } + + return result + } + + /** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ + function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo; + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512'; + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384'; + } + } + return algorithm + } + + function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + + let pos = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } + } + + metadataList.length = pos; + + return metadataList + } + + /** + * Compares two base64 strings, allowing for base64url + * in the second string. + * + * @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ + function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true + } + + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request + function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { + // TODO + } + + /** + * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} + * @param {URL} A + * @param {URL} B + */ + function sameOrigin (A, B) { + // 1. If A and B are the same opaque origin, then return true. + if (A.origin === B.origin && A.origin === 'null') { + return true + } + + // 2. If A and B are both tuple origins and their schemes, + // hosts, and port are identical, then return true. + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true + } + + // 3. Return false. + return false + } + + function createDeferredPromise () { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + + return { promise, resolve: res, reject: rej } + } + + function isAborted (fetchParams) { + return fetchParams.controller.state === 'aborted' + } + + function isCancelled (fetchParams) { + return fetchParams.controller.state === 'aborted' || + fetchParams.controller.state === 'terminated' + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-method-normalize + * @param {string} method + */ + function normalizeMethod (method) { + return normalizedMethodRecordsBase[method.toLowerCase()] ?? method + } + + // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string + function serializeJavascriptValueToJSONString (value) { + // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). + const result = JSON.stringify(value); + + // 2. If result is undefined, then throw a TypeError. + if (result === undefined) { + throw new TypeError('Value is not JSON serializable') + } + + // 3. Assert: result is a string. + assert(typeof result === 'string'); + + // 4. Return result. + return result + } + + // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object + const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + + /** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {string} name name of the instance + * @param {symbol} kInternalIterator + * @param {string | number} [keyIndex] + * @param {string | number} [valueIndex] + */ + function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target + /** @type {'key' | 'value' | 'key+value'} */ + #kind + /** @type {number} */ + #index + + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor (target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; + } + + next () { + // 1. Let interface be the interface for which the iterator prototype object exists. + // 2. Let thisValue be the this value. + // 3. Let object be ? ToObject(thisValue). + // 4. If object is a platform object, then perform a security + // check, passing: + // 5. If object is not a default iterator object for interface, + // then throw a TypeError. + if (typeof this !== 'object' || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ) + } + + // 6. Let index be object’s index. + // 7. Let kind be object’s kind. + // 8. Let values be object’s target's value pairs to iterate over. + const index = this.#index; + const values = this.#target[kInternalIterator]; + + // 9. Let len be the length of values. + const len = values.length; + + // 10. If index is greater than or equal to len, then return + // CreateIterResultObject(undefined, true). + if (index >= len) { + return { + value: undefined, + done: true + } + } + + // 11. Let pair be the entry in values at index index. + const { [keyIndex]: key, [valueIndex]: value } = values[index]; + + // 12. Set object’s index to index + 1. + this.#index = index + 1; + + // 13. Return the iterator result for pair and kind. + + // https://webidl.spec.whatwg.org/#iterator-result + + // 1. Let result be a value determined by the value of kind: + let result; + switch (this.#kind) { + case 'key': + // 1. Let idlKey be pair’s key. + // 2. Let key be the result of converting idlKey to an + // ECMAScript value. + // 3. result is key. + result = key; + break + case 'value': + // 1. Let idlValue be pair’s value. + // 2. Let value be the result of converting idlValue to + // an ECMAScript value. + // 3. result is value. + result = value; + break + case 'key+value': + // 1. Let idlKey be pair’s key. + // 2. Let idlValue be pair’s value. + // 3. Let key be the result of converting idlKey to an + // ECMAScript value. + // 4. Let value be the result of converting idlValue to + // an ECMAScript value. + // 5. Let array be ! ArrayCreate(2). + // 6. Call ! CreateDataProperty(array, "0", key). + // 7. Call ! CreateDataProperty(array, "1", value). + // 8. result is array. + result = [key, value]; + break + } + + // 2. Return CreateIterResultObject(result, false). + return { + value: result, + done: false + } + } + } + + // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + // @ts-ignore + delete FastIterableIterator.prototype.constructor; + + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); + + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + + /** + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + * @returns {IterableIterator} + */ + return function (target, kind) { + return new FastIterableIterator(target, kind) + } + } + + /** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {string} name name of the instance + * @param {any} object class + * @param {symbol} kInternalIterator + * @param {string | number} [keyIndex] + * @param {string | number} [valueIndex] + */ + function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); + + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys () { + webidl.brandCheck(this, object); + return makeIterator(this, 'key') + } + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values () { + webidl.brandCheck(this, object); + return makeIterator(this, 'value') + } + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries () { + webidl.brandCheck(this, object); + return makeIterator(this, 'key+value') + } + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach (callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`); + if (typeof callbackfn !== 'function') { + throw new TypeError( + `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` + ) + } + for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) { + callbackfn.call(thisArg, value, key, this); + } + } + } + }; + + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value + } + }) + } + + /** + * @see https://fetch.spec.whatwg.org/#body-fully-read + */ + async function fullyReadBody (body, processBody, processBodyError) { + // 1. If taskDestination is null, then set taskDestination to + // the result of starting a new parallel queue. + + // 2. Let successSteps given a byte sequence bytes be to queue a + // fetch task to run processBody given bytes, with taskDestination. + const successSteps = processBody; + + // 3. Let errorSteps be to queue a fetch task to run processBodyError, + // with taskDestination. + const errorSteps = processBodyError; + + // 4. Let reader be the result of getting a reader for body’s stream. + // If that threw an exception, then run errorSteps with that + // exception and return. + let reader; + + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return + } + + // 5. Read all bytes from reader, given successSteps and errorSteps. + try { + successSteps(await readAllBytes(reader)); + } catch (e) { + errorSteps(e); + } + } + + function isReadableStreamLike (stream) { + return stream instanceof ReadableStream || ( + stream[Symbol.toStringTag] === 'ReadableStream' && + typeof stream.tee === 'function' + ) + } + + /** + * @param {ReadableStreamController} controller + */ + function readableStreamClose (controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + // TODO: add comment explaining why this error occurs. + if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) { + throw err + } + } + } + + const invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; // eslint-disable-line + + /** + * @see https://infra.spec.whatwg.org/#isomorphic-encode + * @param {string} input + */ + function isomorphicEncode (input) { + // 1. Assert: input contains no code points greater than U+00FF. + assert(!invalidIsomorphicEncodeValueRegex.test(input)); + + // 2. Return a byte sequence whose length is equal to input’s code + // point length and whose bytes have the same values as the + // values of input’s code points, in the same order + return input + } + + /** + * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes + * @see https://streams.spec.whatwg.org/#read-loop + * @param {ReadableStreamDefaultReader} reader + */ + async function readAllBytes (reader) { + const bytes = []; + let byteLength = 0; + + while (true) { + const { done, value: chunk } = await reader.read(); + + if (done) { + // 1. Call successSteps with bytes. + return Buffer.concat(bytes, byteLength) + } + + // 1. If chunk is not a Uint8Array object, call failureSteps + // with a TypeError and abort these steps. + if (!isUint8Array(chunk)) { + throw new TypeError('Received non-Uint8Array chunk') + } + + // 2. Append the bytes represented by chunk to bytes. + bytes.push(chunk); + byteLength += chunk.length; + + // 3. Read-loop given reader, bytes, successSteps, and failureSteps. + } + } + + /** + * @see https://fetch.spec.whatwg.org/#is-local + * @param {URL} url + */ + function urlIsLocal (url) { + assert('protocol' in url); // ensure it's a url object + + const protocol = url.protocol; + + return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' + } + + /** + * @param {string|URL} url + * @returns {boolean} + */ + function urlHasHttpsScheme (url) { + return ( + ( + typeof url === 'string' && + url[5] === ':' && + url[0] === 'h' && + url[1] === 't' && + url[2] === 't' && + url[3] === 'p' && + url[4] === 's' + ) || + url.protocol === 'https:' + ) + } + + /** + * @see https://fetch.spec.whatwg.org/#http-scheme + * @param {URL} url + */ + function urlIsHttpHttpsScheme (url) { + assert('protocol' in url); // ensure it's a url object + + const protocol = url.protocol; + + return protocol === 'http:' || protocol === 'https:' + } + + /** + * @see https://fetch.spec.whatwg.org/#simple-range-header-value + * @param {string} value + * @param {boolean} allowWhitespace + */ + function simpleRangeHeaderValue (value, allowWhitespace) { + // 1. Let data be the isomorphic decoding of value. + // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string, + // nothing more. We obviously don't need to do that if value is a string already. + const data = value; + + // 2. If data does not start with "bytes", then return failure. + if (!data.startsWith('bytes')) { + return 'failure' + } + + // 3. Let position be a position variable for data, initially pointing at the 5th code point of data. + const position = { position: 5 }; + + // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, + // from data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 5. If the code point at position within data is not U+003D (=), then return failure. + if (data.charCodeAt(position.position) !== 0x3D) { + return 'failure' + } + + // 6. Advance position by 1. + position.position++; + + // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from + // data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits, + // from data given position. + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + + return code >= 0x30 && code <= 0x39 + }, + data, + position + ); + + // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the + // empty string; otherwise null. + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + + // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, + // from data given position. + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 11. If the code point at position within data is not U+002D (-), then return failure. + if (data.charCodeAt(position.position) !== 0x2D) { + return 'failure' + } + + // 12. Advance position by 1. + position.position++; + + // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab + // or space, from data given position. + // Note from Khafra: its the same step as in #8 again lol + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === '\t' || char === ' ', + data, + position + ); + } + + // 14. Let rangeEnd be the result of collecting a sequence of code points that are + // ASCII digits, from data given position. + // Note from Khafra: you wouldn't guess it, but this is also the same step as #8 + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + + return code >= 0x30 && code <= 0x39 + }, + data, + position + ); + + // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd + // is not the empty string; otherwise null. + // Note from Khafra: THE SAME STEP, AGAIN!!! + // Note: why interpret as a decimal if we only collect ascii digits? + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + + // 16. If position is not past the end of data, then return failure. + if (position.position < data.length) { + return 'failure' + } + + // 17. If rangeEndValue and rangeStartValue are null, then return failure. + if (rangeEndValue === null && rangeStartValue === null) { + return 'failure' + } + + // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is + // greater than rangeEndValue, then return failure. + // Note: ... when can they not be numbers? + if (rangeStartValue > rangeEndValue) { + return 'failure' + } + + // 19. Return (rangeStartValue, rangeEndValue). + return { rangeStartValue, rangeEndValue } + } + + /** + * @see https://fetch.spec.whatwg.org/#build-a-content-range + * @param {number} rangeStart + * @param {number} rangeEnd + * @param {number} fullLength + */ + function buildContentRange (rangeStart, rangeEnd, fullLength) { + // 1. Let contentRange be `bytes `. + let contentRange = 'bytes '; + + // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange. + contentRange += isomorphicEncode(`${rangeStart}`); + + // 3. Append 0x2D (-) to contentRange. + contentRange += '-'; + + // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange. + contentRange += isomorphicEncode(`${rangeEnd}`); + + // 5. Append 0x2F (/) to contentRange. + contentRange += '/'; + + // 6. Append fullLength, serialized and isomorphic encoded to contentRange. + contentRange += isomorphicEncode(`${fullLength}`); + + // 7. Return contentRange. + return contentRange + } + + // A Stream, which pipes the response to zlib.createInflate() or + // zlib.createInflateRaw() depending on the first byte of the Buffer. + // If the lower byte of the first byte is 0x08, then the stream is + // interpreted as a zlib stream, otherwise it's interpreted as a + // raw deflate stream. + class InflateStream extends Transform { + #zlibOptions + + /** @param {zlib.ZlibOptions} [zlibOptions] */ + constructor (zlibOptions) { + super(); + this.#zlibOptions = zlibOptions; + } + + _transform (chunk, encoding, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return + } + this._inflateStream = (chunk[0] & 0x0F) === 0x08 + ? zlib.createInflate(this.#zlibOptions) + : zlib.createInflateRaw(this.#zlibOptions); + + this._inflateStream.on('data', this.push.bind(this)); + this._inflateStream.on('end', () => this.push(null)); + this._inflateStream.on('error', (err) => this.destroy(err)); + } + + this._inflateStream.write(chunk, encoding, callback); + } + + _final (callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; + } + callback(); + } + } + + /** + * @param {zlib.ZlibOptions} [zlibOptions] + * @returns {InflateStream} + */ + function createInflate (zlibOptions) { + return new InflateStream(zlibOptions) + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type + * @param {import('./headers').HeadersList} headers + */ + function extractMimeType (headers) { + // 1. Let charset be null. + let charset = null; + + // 2. Let essence be null. + let essence = null; + + // 3. Let mimeType be null. + let mimeType = null; + + // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers. + const values = getDecodeSplit('content-type', headers); + + // 5. If values is null, then return failure. + if (values === null) { + return 'failure' + } + + // 6. For each value of values: + for (const value of values) { + // 6.1. Let temporaryMimeType be the result of parsing value. + const temporaryMimeType = parseMIMEType(value); + + // 6.2. If temporaryMimeType is failure or its essence is "*/*", then continue. + if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') { + continue + } + + // 6.3. Set mimeType to temporaryMimeType. + mimeType = temporaryMimeType; + + // 6.4. If mimeType’s essence is not essence, then: + if (mimeType.essence !== essence) { + // 6.4.1. Set charset to null. + charset = null; + + // 6.4.2. If mimeType’s parameters["charset"] exists, then set charset to + // mimeType’s parameters["charset"]. + if (mimeType.parameters.has('charset')) { + charset = mimeType.parameters.get('charset'); + } + + // 6.4.3. Set essence to mimeType’s essence. + essence = mimeType.essence; + } else if (!mimeType.parameters.has('charset') && charset !== null) { + // 6.5. Otherwise, if mimeType’s parameters["charset"] does not exist, and + // charset is non-null, set mimeType’s parameters["charset"] to charset. + mimeType.parameters.set('charset', charset); + } + } + + // 7. If mimeType is null, then return failure. + if (mimeType == null) { + return 'failure' + } + + // 8. Return mimeType. + return mimeType + } + + /** + * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split + * @param {string|null} value + */ + function gettingDecodingSplitting (value) { + // 1. Let input be the result of isomorphic decoding value. + const input = value; + + // 2. Let position be a position variable for input, initially pointing at the start of input. + const position = { position: 0 }; + + // 3. Let values be a list of strings, initially empty. + const values = []; + + // 4. Let temporaryValue be the empty string. + let temporaryValue = ''; + + // 5. While position is not past the end of input: + while (position.position < input.length) { + // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (") + // or U+002C (,) from input, given position, to temporaryValue. + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ',', + input, + position + ); + + // 5.2. If position is not past the end of input, then: + if (position.position < input.length) { + // 5.2.1. If the code point at position within input is U+0022 ("), then: + if (input.charCodeAt(position.position) === 0x22) { + // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue. + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + + // 5.2.1.2. If position is not past the end of input, then continue. + if (position.position < input.length) { + continue + } + } else { + // 5.2.2. Otherwise: + + // 5.2.2.1. Assert: the code point at position within input is U+002C (,). + assert(input.charCodeAt(position.position) === 0x2C); + + // 5.2.2.2. Advance position by 1. + position.position++; + } + } + + // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue. + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20); + + // 5.4. Append temporaryValue to values. + values.push(temporaryValue); + + // 5.6. Set temporaryValue to the empty string. + temporaryValue = ''; + } + + // 6. Return values. + return values + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split + * @param {string} name lowercase header name + * @param {import('./headers').HeadersList} list + */ + function getDecodeSplit (name, list) { + // 1. Let value be the result of getting name from list. + const value = list.get(name, true); + + // 2. If value is null, then return null. + if (value === null) { + return null + } + + // 3. Return the result of getting, decoding, and splitting value. + return gettingDecodingSplitting(value) + } + + const textDecoder = new TextDecoder(); + + /** + * @see https://encoding.spec.whatwg.org/#utf-8-decode + * @param {Buffer} buffer + */ + function utf8DecodeBytes (buffer) { + if (buffer.length === 0) { + return '' + } + + // 1. Let buffer be the result of peeking three bytes from + // ioQueue, converted to a byte sequence. + + // 2. If buffer is 0xEF 0xBB 0xBF, then read three + // bytes from ioQueue. (Do nothing with those bytes.) + if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { + buffer = buffer.subarray(3); + } + + // 3. Process a queue with an instance of UTF-8’s + // decoder, ioQueue, output, and "replacement". + const output = textDecoder.decode(buffer); + + // 4. Return output. + return output + } + + class EnvironmentSettingsObjectBase { + get baseUrl () { + return getGlobalOrigin() + } + + get origin () { + return this.baseUrl?.origin + } + + policyContainer = makePolicyContainer() + } + + class EnvironmentSettingsObject { + settingsObject = new EnvironmentSettingsObjectBase() + } + + const environmentSettingsObject = new EnvironmentSettingsObject(); + + util$8 = { + isAborted, + isCancelled, + isValidEncodedURL, + createDeferredPromise, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + simpleRangeHeaderValue, + buildContentRange, + parseMetadata, + createInflate, + extractMimeType, + getDecodeSplit, + utf8DecodeBytes, + environmentSettingsObject + }; + return util$8; +} + +var symbols$3; +var hasRequiredSymbols$3; + +function requireSymbols$3 () { + if (hasRequiredSymbols$3) return symbols$3; + hasRequiredSymbols$3 = 1; + + symbols$3 = { + kUrl: Symbol('url'), + kHeaders: Symbol('headers'), + kSignal: Symbol('signal'), + kState: Symbol('state'), + kDispatcher: Symbol('dispatcher') + }; + return symbols$3; +} + +var file$1; +var hasRequiredFile$1; + +function requireFile$1 () { + if (hasRequiredFile$1) return file$1; + hasRequiredFile$1 = 1; + + const { Blob, File } = require$$0$6; + const { kState } = requireSymbols$3(); + const { webidl } = requireWebidl(); + + // TODO(@KhafraDev): remove + class FileLike { + constructor (blobLike, fileName, options = {}) { + // TODO: argument idl type check + + // The File constructor is invoked with two or three parameters, depending + // on whether the optional dictionary parameter is used. When the File() + // constructor is invoked, user agents must run the following steps: + + // 1. Let bytes be the result of processing blob parts given fileBits and + // options. + + // 2. Let n be the fileName argument to the constructor. + const n = fileName; + + // 3. Process FilePropertyBag dictionary argument by running the following + // substeps: + + // 1. If the type member is provided and is not the empty string, let t + // be set to the type dictionary member. If t contains any characters + // outside the range U+0020 to U+007E, then set t to the empty string + // and return from these substeps. + // TODO + const t = options.type; + + // 2. Convert every character in t to ASCII lowercase. + // TODO + + // 3. If the lastModified member is provided, let d be set to the + // lastModified dictionary member. If it is not provided, set d to the + // current date and time represented as the number of milliseconds since + // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). + const d = options.lastModified ?? Date.now(); + + // 4. Return a new File object F such that: + // F refers to the bytes byte sequence. + // F.size is set to the number of total bytes in bytes. + // F.name is set to n. + // F.type is set to t. + // F.lastModified is set to d. + + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; + } + + stream (...args) { + webidl.brandCheck(this, FileLike); + + return this[kState].blobLike.stream(...args) + } + + arrayBuffer (...args) { + webidl.brandCheck(this, FileLike); + + return this[kState].blobLike.arrayBuffer(...args) + } + + slice (...args) { + webidl.brandCheck(this, FileLike); + + return this[kState].blobLike.slice(...args) + } + + text (...args) { + webidl.brandCheck(this, FileLike); + + return this[kState].blobLike.text(...args) + } + + get size () { + webidl.brandCheck(this, FileLike); + + return this[kState].blobLike.size + } + + get type () { + webidl.brandCheck(this, FileLike); + + return this[kState].blobLike.type + } + + get name () { + webidl.brandCheck(this, FileLike); + + return this[kState].name + } + + get lastModified () { + webidl.brandCheck(this, FileLike); + + return this[kState].lastModified + } + + get [Symbol.toStringTag] () { + return 'File' + } + } + + webidl.converters.Blob = webidl.interfaceConverter(Blob); + + // If this function is moved to ./util.js, some tools (such as + // rollup) will warn about circular dependencies. See: + // https://github.com/nodejs/undici/issues/1629 + function isFileLike (object) { + return ( + (object instanceof File) || + ( + object && + (typeof object.stream === 'function' || + typeof object.arrayBuffer === 'function') && + object[Symbol.toStringTag] === 'File' + ) + ) + } + + file$1 = { FileLike, isFileLike }; + return file$1; +} + +var formdata; +var hasRequiredFormdata; + +function requireFormdata () { + if (hasRequiredFormdata) return formdata; + hasRequiredFormdata = 1; + + const { isBlobLike, iteratorMixin } = requireUtil$8(); + const { kState } = requireSymbols$3(); + const { kEnumerableProperty } = requireUtil$9(); + const { FileLike, isFileLike } = requireFile$1(); + const { webidl } = requireWebidl(); + const { File: NativeFile } = require$$0$6; + const nodeUtil = require$$0$a; + + /** @type {globalThis['File']} */ + const File = globalThis.File ?? NativeFile; + + // https://xhr.spec.whatwg.org/#formdata + class FormData { + constructor (form) { + webidl.util.markAsUncloneable(this); + + if (form !== undefined) { + throw webidl.errors.conversionFailed({ + prefix: 'FormData constructor', + argument: 'Argument 1', + types: ['undefined'] + }) + } + + this[kState] = []; + } + + append (name, value, filename = undefined) { + webidl.brandCheck(this, FormData); + + const prefix = 'FormData.append'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ) + } + + // 1. Let value be value if given; otherwise blobValue. + + name = webidl.converters.USVString(name, prefix, 'name'); + value = isBlobLike(value) + ? webidl.converters.Blob(value, prefix, 'value', { strict: false }) + : webidl.converters.USVString(value, prefix, 'value'); + filename = arguments.length === 3 + ? webidl.converters.USVString(filename, prefix, 'filename') + : undefined; + + // 2. Let entry be the result of creating an entry with + // name, value, and filename if given. + const entry = makeEntry(name, value, filename); + + // 3. Append entry to this’s entry list. + this[kState].push(entry); + } + + delete (name) { + webidl.brandCheck(this, FormData); + + const prefix = 'FormData.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + name = webidl.converters.USVString(name, prefix, 'name'); + + // The delete(name) method steps are to remove all entries whose name + // is name from this’s entry list. + this[kState] = this[kState].filter(entry => entry.name !== name); + } + + get (name) { + webidl.brandCheck(this, FormData); + + const prefix = 'FormData.get'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + name = webidl.converters.USVString(name, prefix, 'name'); + + // 1. If there is no entry whose name is name in this’s entry list, + // then return null. + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx === -1) { + return null + } + + // 2. Return the value of the first entry whose name is name from + // this’s entry list. + return this[kState][idx].value + } + + getAll (name) { + webidl.brandCheck(this, FormData); + + const prefix = 'FormData.getAll'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + name = webidl.converters.USVString(name, prefix, 'name'); + + // 1. If there is no entry whose name is name in this’s entry list, + // then return the empty list. + // 2. Return the values of all entries whose name is name, in order, + // from this’s entry list. + return this[kState] + .filter((entry) => entry.name === name) + .map((entry) => entry.value) + } + + has (name) { + webidl.brandCheck(this, FormData); + + const prefix = 'FormData.has'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + name = webidl.converters.USVString(name, prefix, 'name'); + + // The has(name) method steps are to return true if there is an entry + // whose name is name in this’s entry list; otherwise false. + return this[kState].findIndex((entry) => entry.name === name) !== -1 + } + + set (name, value, filename = undefined) { + webidl.brandCheck(this, FormData); + + const prefix = 'FormData.set'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ) + } + + // The set(name, value) and set(name, blobValue, filename) method steps + // are: + + // 1. Let value be value if given; otherwise blobValue. + + name = webidl.converters.USVString(name, prefix, 'name'); + value = isBlobLike(value) + ? webidl.converters.Blob(value, prefix, 'name', { strict: false }) + : webidl.converters.USVString(value, prefix, 'name'); + filename = arguments.length === 3 + ? webidl.converters.USVString(filename, prefix, 'name') + : undefined; + + // 2. Let entry be the result of creating an entry with name, value, and + // filename if given. + const entry = makeEntry(name, value, filename); + + // 3. If there are entries in this’s entry list whose name is name, then + // replace the first such entry with entry and remove the others. + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name) + ]; + } else { + // 4. Otherwise, append entry to this’s entry list. + this[kState].push(entry); + } + } + + [nodeUtil.inspect.custom] (depth, options) { + const state = this[kState].reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } + + return a + }, { __proto__: null }); + + options.depth ??= depth; + options.colors ??= true; + + const output = nodeUtil.formatWithOptions(options, state); + + // remove [Object null prototype] + return `FormData ${output.slice(output.indexOf(']') + 2)}` + } + } + + iteratorMixin('FormData', FormData, kState, 'name', 'value'); + + Object.defineProperties(FormData.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'FormData', + configurable: true + } + }); + + /** + * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry + * @param {string} name + * @param {string|Blob} value + * @param {?string} filename + * @returns + */ + function makeEntry (name, value, filename) { + // 1. Set name to the result of converting name into a scalar value string. + // Note: This operation was done by the webidl converter USVString. + + // 2. If value is a string, then set value to the result of converting + // value into a scalar value string. + if (typeof value === 'string') ; else { + // 3. Otherwise: + + // 1. If value is not a File object, then set value to a new File object, + // representing the same bytes, whose name attribute value is "blob" + if (!isFileLike(value)) { + value = value instanceof Blob + ? new File([value], 'blob', { type: value.type }) + : new FileLike(value, 'blob', { type: value.type }); + } + + // 2. If filename is given, then set value to a new File object, + // representing the same bytes, whose name attribute is filename. + if (filename !== undefined) { + /** @type {FilePropertyBag} */ + const options = { + type: value.type, + lastModified: value.lastModified + }; + + value = value instanceof NativeFile + ? new File([value], filename, options) + : new FileLike(value, filename, options); + } + } + + // 4. Return an entry whose name is name and whose value is value. + return { name, value } + } + + formdata = { FormData, makeEntry }; + return formdata; +} + +var formdataParser; +var hasRequiredFormdataParser; + +function requireFormdataParser () { + if (hasRequiredFormdataParser) return formdataParser; + hasRequiredFormdataParser = 1; + + const { isUSVString, bufferToLowerCasedHeaderName } = requireUtil$9(); + const { utf8DecodeBytes } = requireUtil$8(); + const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = requireDataUrl(); + const { isFileLike } = requireFile$1(); + const { makeEntry } = requireFormdata(); + const assert = require$$0$7; + const { File: NodeFile } = require$$0$6; + + const File = globalThis.File ?? NodeFile; + + const formDataNameBuffer = Buffer.from('form-data; name="'); + const filenameBuffer = Buffer.from('; filename'); + const dd = Buffer.from('--'); + const ddcrlf = Buffer.from('--\r\n'); + + /** + * @param {string} chars + */ + function isAsciiString (chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & -128) !== 0) { + return false + } + } + return true + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-boundary + * @param {string} boundary + */ + function validateBoundary (boundary) { + const length = boundary.length; + + // - its length is greater or equal to 27 and lesser or equal to 70, and + if (length < 27 || length > 70) { + return false + } + + // - it is composed by bytes in the ranges 0x30 to 0x39, 0x41 to 0x5A, or + // 0x61 to 0x7A, inclusive (ASCII alphanumeric), or which are 0x27 ('), + // 0x2D (-) or 0x5F (_). + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + + if (!( + (cp >= 0x30 && cp <= 0x39) || + (cp >= 0x41 && cp <= 0x5a) || + (cp >= 0x61 && cp <= 0x7a) || + cp === 0x27 || + cp === 0x2d || + cp === 0x5f + )) { + return false + } + } + + return true + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#multipart-form-data-parser + * @param {Buffer} input + * @param {ReturnType} mimeType + */ + function multipartFormDataParser (input, mimeType) { + // 1. Assert: mimeType’s essence is "multipart/form-data". + assert(mimeType !== 'failure' && mimeType.essence === 'multipart/form-data'); + + const boundaryString = mimeType.parameters.get('boundary'); + + // 2. If mimeType’s parameters["boundary"] does not exist, return failure. + // Otherwise, let boundary be the result of UTF-8 decoding mimeType’s + // parameters["boundary"]. + if (boundaryString === undefined) { + return 'failure' + } + + const boundary = Buffer.from(`--${boundaryString}`, 'utf8'); + + // 3. Let entry list be an empty entry list. + const entryList = []; + + // 4. Let position be a pointer to a byte in input, initially pointing at + // the first byte. + const position = { position: 0 }; + + // Note: undici addition, allows leading and trailing CRLFs. + while (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { + position.position += 2; + } + + let trailing = input.length; + + while (input[trailing - 1] === 0x0a && input[trailing - 2] === 0x0d) { + trailing -= 2; + } + + if (trailing !== input.length) { + input = input.subarray(0, trailing); + } + + // 5. While true: + while (true) { + // 5.1. If position points to a sequence of bytes starting with 0x2D 0x2D + // (`--`) followed by boundary, advance position by 2 + the length of + // boundary. Otherwise, return failure. + // Note: boundary is padded with 2 dashes already, no need to add 2. + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + return 'failure' + } + + // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A + // (`--` followed by CR LF) followed by the end of input, return entry list. + // Note: a body does NOT need to end with CRLF. It can end with --. + if ( + (position.position === input.length - 2 && bufferStartsWith(input, dd, position)) || + (position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) + ) { + return entryList + } + + // 5.3. If position does not point to a sequence of bytes starting with 0x0D + // 0x0A (CR LF), return failure. + if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { + return 'failure' + } + + // 5.4. Advance position by 2. (This skips past the newline.) + position.position += 2; + + // 5.5. Let name, filename and contentType be the result of parsing + // multipart/form-data headers on input and position, if the result + // is not failure. Otherwise, return failure. + const result = parseMultipartFormDataHeaders(input, position); + + if (result === 'failure') { + return 'failure' + } + + let { name, filename, contentType, encoding } = result; + + // 5.6. Advance position by 2. (This skips past the empty line that marks + // the end of the headers.) + position.position += 2; + + // 5.7. Let body be the empty byte sequence. + let body; + + // 5.8. Body loop: While position is not past the end of input: + // TODO: the steps here are completely wrong + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + + if (boundaryIndex === -1) { + return 'failure' + } + + body = input.subarray(position.position, boundaryIndex - 4); + + position.position += body.length; + + // Note: position must be advanced by the body's length before being + // decoded, otherwise the parsing will fail. + if (encoding === 'base64') { + body = Buffer.from(body.toString(), 'base64'); + } + } + + // 5.9. If position does not point to a sequence of bytes starting with + // 0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2. + if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { + return 'failure' + } else { + position.position += 2; + } + + // 5.10. If filename is not null: + let value; + + if (filename !== null) { + // 5.10.1. If contentType is null, set contentType to "text/plain". + contentType ??= 'text/plain'; + + // 5.10.2. If contentType is not an ASCII string, set contentType to the empty string. + + // Note: `buffer.isAscii` can be used at zero-cost, but converting a string to a buffer is a high overhead. + // Content-Type is a relatively small string, so it is faster to use `String#charCodeAt`. + if (!isAsciiString(contentType)) { + contentType = ''; + } + + // 5.10.3. Let value be a new File object with name filename, type contentType, and body body. + value = new File([body], filename, { type: contentType }); + } else { + // 5.11. Otherwise: + + // 5.11.1. Let value be the UTF-8 decoding without BOM of body. + value = utf8DecodeBytes(Buffer.from(body)); + } + + // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object. + assert(isUSVString(name)); + assert((typeof value === 'string' && isUSVString(value)) || isFileLike(value)); + + // 5.13. Create an entry with name and value, and append it to entry list. + entryList.push(makeEntry(name, value, filename)); + } + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#parse-multipart-form-data-headers + * @param {Buffer} input + * @param {{ position: number }} position + */ + function parseMultipartFormDataHeaders (input, position) { + // 1. Let name, filename and contentType be null. + let name = null; + let filename = null; + let contentType = null; + let encoding = null; + + // 2. While true: + while (true) { + // 2.1. If position points to a sequence of bytes starting with 0x0D 0x0A (CR LF): + if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { + // 2.1.1. If name is null, return failure. + if (name === null) { + return 'failure' + } + + // 2.1.2. Return name, filename and contentType. + return { name, filename, contentType, encoding } + } + + // 2.2. Let header name be the result of collecting a sequence of bytes that are + // not 0x0A (LF), 0x0D (CR) or 0x3A (:), given position. + let headerName = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d && char !== 0x3a, + input, + position + ); + + // 2.3. Remove any HTTP tab or space bytes from the start or end of header name. + headerName = removeChars(headerName, true, true, (char) => char === 0x9 || char === 0x20); + + // 2.4. If header name does not match the field-name token production, return failure. + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + return 'failure' + } + + // 2.5. If the byte at position is not 0x3A (:), return failure. + if (input[position.position] !== 0x3a) { + return 'failure' + } + + // 2.6. Advance position by 1. + position.position++; + + // 2.7. Collect a sequence of bytes that are HTTP tab or space bytes given position. + // (Do nothing with those bytes.) + collectASequenceOfBytes( + (char) => char === 0x20 || char === 0x09, + input, + position + ); + + // 2.8. Byte-lowercase header name and switch on the result: + switch (bufferToLowerCasedHeaderName(headerName)) { + case 'content-disposition': { + // 1. Set name and filename to null. + name = filename = null; + + // 2. If position does not point to a sequence of bytes starting with + // `form-data; name="`, return failure. + if (!bufferStartsWith(input, formDataNameBuffer, position)) { + return 'failure' + } + + // 3. Advance position so it points at the byte after the next 0x22 (") + // byte (the one in the sequence of bytes matched above). + position.position += 17; + + // 4. Set name to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return + // failure. + name = parseMultipartFormDataName(input, position); + + if (name === null) { + return 'failure' + } + + // 5. If position points to a sequence of bytes starting with `; filename="`: + if (bufferStartsWith(input, filenameBuffer, position)) { + // Note: undici also handles filename* + let check = position.position + filenameBuffer.length; + + if (input[check] === 0x2a) { + position.position += 1; + check += 1; + } + + if (input[check] !== 0x3d || input[check + 1] !== 0x22) { // =" + return 'failure' + } + + // 1. Advance position so it points at the byte after the next 0x22 (") byte + // (the one in the sequence of bytes matched above). + position.position += 12; + + // 2. Set filename to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return failure. + filename = parseMultipartFormDataName(input, position); + + if (filename === null) { + return 'failure' + } + } + + break + } + case 'content-type': { + // 1. Let header value be the result of collecting a sequence of bytes that are + // not 0x0A (LF) or 0x0D (CR), given position. + let headerValue = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + + // 2. Remove any HTTP tab or space bytes from the end of header value. + headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20); + + // 3. Set contentType to the isomorphic decoding of header value. + contentType = isomorphicDecode(headerValue); + + break + } + case 'content-transfer-encoding': { + let headerValue = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + + headerValue = removeChars(headerValue, false, true, (char) => char === 0x9 || char === 0x20); + + encoding = isomorphicDecode(headerValue); + + break + } + default: { + // Collect a sequence of bytes that are not 0x0A (LF) or 0x0D (CR), given position. + // (Do nothing with those bytes.) + collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d, + input, + position + ); + } + } + + // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A + // (CR LF), return failure. Otherwise, advance position by 2 (past the newline). + if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) { + return 'failure' + } else { + position.position += 2; + } + } + } + + /** + * @see https://andreubotella.github.io/multipart-form-data/#parse-a-multipart-form-data-name + * @param {Buffer} input + * @param {{ position: number }} position + */ + function parseMultipartFormDataName (input, position) { + // 1. Assert: The byte at (position - 1) is 0x22 ("). + assert(input[position.position - 1] === 0x22); + + // 2. Let name be the result of collecting a sequence of bytes that are not 0x0A (LF), 0x0D (CR) or 0x22 ("), given position. + /** @type {string | Buffer} */ + let name = collectASequenceOfBytes( + (char) => char !== 0x0a && char !== 0x0d && char !== 0x22, + input, + position + ); + + // 3. If the byte at position is not 0x22 ("), return failure. Otherwise, advance position by 1. + if (input[position.position] !== 0x22) { + return null // name could be 'failure' + } else { + position.position++; + } + + // 4. Replace any occurrence of the following subsequences in name with the given byte: + // - `%0A`: 0x0A (LF) + // - `%0D`: 0x0D (CR) + // - `%22`: 0x22 (") + name = new TextDecoder().decode(name) + .replace(/%0A/ig, '\n') + .replace(/%0D/ig, '\r') + .replace(/%22/g, '"'); + + // 5. Return the UTF-8 decoding without BOM of name. + return name + } + + /** + * @param {(char: number) => boolean} condition + * @param {Buffer} input + * @param {{ position: number }} position + */ + function collectASequenceOfBytes (condition, input, position) { + let start = position.position; + + while (start < input.length && condition(input[start])) { + ++start; + } + + return input.subarray(position.position, (position.position = start)) + } + + /** + * @param {Buffer} buf + * @param {boolean} leading + * @param {boolean} trailing + * @param {(charCode: number) => boolean} predicate + * @returns {Buffer} + */ + function removeChars (buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + + if (leading) { + while (lead < buf.length && predicate(buf[lead])) lead++; + } + + { + while (trail > 0 && predicate(buf[trail])) trail--; + } + + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1) + } + + /** + * Checks if {@param buffer} starts with {@param start} + * @param {Buffer} buffer + * @param {Buffer} start + * @param {{ position: number }} position + */ + function bufferStartsWith (buffer, start, position) { + if (buffer.length < start.length) { + return false + } + + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer[position.position + i]) { + return false + } + } + + return true + } + + formdataParser = { + multipartFormDataParser, + validateBoundary + }; + return formdataParser; +} + +var body; +var hasRequiredBody; + +function requireBody () { + if (hasRequiredBody) return body; + hasRequiredBody = 1; + + const util = requireUtil$9(); + const { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody, + extractMimeType, + utf8DecodeBytes + } = requireUtil$8(); + const { FormData } = requireFormdata(); + const { kState } = requireSymbols$3(); + const { webidl } = requireWebidl(); + const { Blob } = require$$0$6; + const assert = require$$0$7; + const { isErrored, isDisturbed } = require$$0$8; + const { isArrayBuffer } = require$$8$1; + const { serializeAMimeType } = requireDataUrl(); + const { multipartFormDataParser } = requireFormdataParser(); + let random; + + try { + const crypto = require('node:crypto'); + random = (max) => crypto.randomInt(0, max); + } catch { + random = (max) => Math.floor(Math.random(max)); + } + + const textEncoder = new TextEncoder(); + function noop () {} + + const hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf('v18') !== 0; + let streamRegistry; + + if (hasFinalizationRegistry) { + streamRegistry = new FinalizationRegistry((weakRef) => { + const stream = weakRef.deref(); + if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { + stream.cancel('Response object has been garbage collected').catch(noop); + } + }); + } + + // https://fetch.spec.whatwg.org/#concept-bodyinit-extract + function extractBody (object, keepalive = false) { + // 1. Let stream be null. + let stream = null; + + // 2. If object is a ReadableStream object, then set stream to object. + if (object instanceof ReadableStream) { + stream = object; + } else if (isBlobLike(object)) { + // 3. Otherwise, if object is a Blob object, set stream to the + // result of running object’s get stream. + stream = object.stream(); + } else { + // 4. Otherwise, set stream to a new ReadableStream object, and set + // up stream with byte reading support. + stream = new ReadableStream({ + async pull (controller) { + const buffer = typeof source === 'string' ? textEncoder.encode(source) : source; + + if (buffer.byteLength) { + controller.enqueue(buffer); + } + + queueMicrotask(() => readableStreamClose(controller)); + }, + start () {}, + type: 'bytes' + }); + } + + // 5. Assert: stream is a ReadableStream object. + assert(isReadableStreamLike(stream)); + + // 6. Let action be null. + let action = null; + + // 7. Let source be null. + let source = null; + + // 8. Let length be null. + let length = null; + + // 9. Let type be null. + let type = null; + + // 10. Switch on object: + if (typeof object === 'string') { + // Set source to the UTF-8 encoding of object. + // Note: setting source to a Uint8Array here breaks some mocking assumptions. + source = object; + + // Set type to `text/plain;charset=UTF-8`. + type = 'text/plain;charset=UTF-8'; + } else if (object instanceof URLSearchParams) { + // URLSearchParams + + // spec says to run application/x-www-form-urlencoded on body.list + // this is implemented in Node.js as apart of an URLSearchParams instance toString method + // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490 + // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100 + + // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list. + source = object.toString(); + + // Set type to `application/x-www-form-urlencoded;charset=UTF-8`. + type = 'application/x-www-form-urlencoded;charset=UTF-8'; + } else if (isArrayBuffer(object)) { + // BufferSource/ArrayBuffer + + // Set source to a copy of the bytes held by object. + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + // BufferSource/ArrayBufferView + + // Set source to a copy of the bytes held by object. + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`; + const prefix = `--${boundary}\r\nContent-Disposition: form-data`; + + /*! formdata-polyfill. MIT License. Jimmy Wärting */ + const escape = (str) => + str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22'); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n'); + + // Set action to this step: run the multipart/form-data + // encoding algorithm, with object’s entry list and UTF-8. + // - This ensures that the body is immutable and can't be changed afterwords + // - That the content-length is calculated in advance. + // - And that all parts are pre-encoded and ready to be sent. + + const blobParts = []; + const rn = new Uint8Array([13, 10]); // '\r\n' + length = 0; + let hasUnknownSizeValue = false; + + for (const [name, value] of object) { + if (typeof value === 'string') { + const chunk = textEncoder.encode(prefix + + `; name="${escape(normalizeLinefeeds(name))}"` + + `\r\n\r\n${normalizeLinefeeds(value)}\r\n`); + blobParts.push(chunk); + length += chunk.byteLength; + } else { + const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + + (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + + `Content-Type: ${ + value.type || 'application/octet-stream' + }\r\n\r\n`); + blobParts.push(chunk, value, rn); + if (typeof value.size === 'number') { + length += chunk.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } + } + } + + // CRLF is appended to the body to function with legacy servers and match other implementations. + // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030 + // https://github.com/form-data/form-data/issues/63 + const chunk = textEncoder.encode(`--${boundary}--\r\n`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; + } + + // Set source to object. + source = object; + + action = async function * () { + for (const part of blobParts) { + if (part.stream) { + yield * part.stream(); + } else { + yield part; + } + } + }; + + // Set type to `multipart/form-data; boundary=`, + // followed by the multipart/form-data boundary string generated + // by the multipart/form-data encoding algorithm. + type = `multipart/form-data; boundary=${boundary}`; + } else if (isBlobLike(object)) { + // Blob + + // Set source to object. + source = object; + + // Set length to object’s size. + length = object.size; + + // If object’s type attribute is not the empty byte sequence, set + // type to its value. + if (object.type) { + type = object.type; + } + } else if (typeof object[Symbol.asyncIterator] === 'function') { + // If keepalive is true, then throw a TypeError. + if (keepalive) { + throw new TypeError('keepalive') + } + + // If object is disturbed or locked, then throw a TypeError. + if (util.isDisturbed(object) || object.locked) { + throw new TypeError( + 'Response body object should not be disturbed or locked' + ) + } + + stream = + object instanceof ReadableStream ? object : ReadableStreamFrom(object); + } + + // 11. If source is a byte sequence, then set action to a + // step that returns source and length to source’s length. + if (typeof source === 'string' || util.isBuffer(source)) { + length = Buffer.byteLength(source); + } + + // 12. If action is non-null, then run these steps in in parallel: + if (action != null) { + // Run action. + let iterator; + stream = new ReadableStream({ + async start () { + iterator = action(object)[Symbol.asyncIterator](); + }, + async pull (controller) { + const { value, done } = await iterator.next(); + if (done) { + // When running action is done, close stream. + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + // Whenever one or more bytes are available and stream is not errored, + // enqueue a Uint8Array wrapping an ArrayBuffer containing the available + // bytes into stream. + if (!isErrored(stream)) { + const buffer = new Uint8Array(value); + if (buffer.byteLength) { + controller.enqueue(buffer); + } + } + } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return(); + }, + type: 'bytes' + }); + } + + // 13. Let body be a body whose stream is stream, source is source, + // and length is length. + const body = { stream, source, length }; + + // 14. Return (body, type). + return [body, type] + } + + // https://fetch.spec.whatwg.org/#bodyinit-safely-extract + function safelyExtractBody (object, keepalive = false) { + // To safely extract a body and a `Content-Type` value from + // a byte sequence or BodyInit object object, run these steps: + + // 1. If object is a ReadableStream object, then: + if (object instanceof ReadableStream) { + // Assert: object is neither disturbed nor locked. + // istanbul ignore next + assert(!util.isDisturbed(object), 'The body has already been consumed.'); + // istanbul ignore next + assert(!object.locked, 'The stream is locked.'); + } + + // 2. Return the results of extracting object. + return extractBody(object, keepalive) + } + + function cloneBody (instance, body) { + // To clone a body body, run these steps: + + // https://fetch.spec.whatwg.org/#concept-body-clone + + // 1. Let « out1, out2 » be the result of teeing body’s stream. + const [out1, out2] = body.stream.tee(); + + // 2. Set body’s stream to out1. + body.stream = out1; + + // 3. Return a body whose stream is out2 and other members are copied from body. + return { + stream: out2, + length: body.length, + source: body.source + } + } + + function throwIfAborted (state) { + if (state.aborted) { + throw new DOMException('The operation was aborted.', 'AbortError') + } + } + + function bodyMixinMethods (instance) { + const methods = { + blob () { + // The blob() method steps are to return the result of + // running consume body with this and the following step + // given a byte sequence bytes: return a Blob whose + // contents are bytes and whose type attribute is this’s + // MIME type. + return consumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + + if (mimeType === null) { + mimeType = ''; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + + // Return a Blob whose contents are bytes and type attribute + // is mimeType. + return new Blob([bytes], { type: mimeType }) + }, instance) + }, + + arrayBuffer () { + // The arrayBuffer() method steps are to return the result + // of running consume body with this and the following step + // given a byte sequence bytes: return a new ArrayBuffer + // whose contents are bytes. + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer + }, instance) + }, + + text () { + // The text() method steps are to return the result of running + // consume body with this and UTF-8 decode. + return consumeBody(this, utf8DecodeBytes, instance) + }, + + json () { + // The json() method steps are to return the result of running + // consume body with this and parse JSON from bytes. + return consumeBody(this, parseJSONFromBytes, instance) + }, + + formData () { + // The formData() method steps are to return the result of running + // consume body with this and the following step given a byte sequence bytes: + return consumeBody(this, (value) => { + // 1. Let mimeType be the result of get the MIME type with this. + const mimeType = bodyMimeType(this); + + // 2. If mimeType is non-null, then switch on mimeType’s essence and run + // the corresponding steps: + if (mimeType !== null) { + switch (mimeType.essence) { + case 'multipart/form-data': { + // 1. ... [long step] + const parsed = multipartFormDataParser(value, mimeType); + + // 2. If that fails for some reason, then throw a TypeError. + if (parsed === 'failure') { + throw new TypeError('Failed to parse body as FormData.') + } + + // 3. Return a new FormData object, appending each entry, + // resulting from the parsing operation, to its entry list. + const fd = new FormData(); + fd[kState] = parsed; + + return fd + } + case 'application/x-www-form-urlencoded': { + // 1. Let entries be the result of parsing bytes. + const entries = new URLSearchParams(value.toString()); + + // 2. If entries is failure, then throw a TypeError. + + // 3. Return a new FormData object whose entry list is entries. + const fd = new FormData(); + + for (const [name, value] of entries) { + fd.append(name, value); + } + + return fd + } + } + } + + // 3. Throw a TypeError. + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + ) + }, instance) + }, + + bytes () { + // The bytes() method steps are to return the result of running consume body + // with this and the following step given a byte sequence bytes: return the + // result of creating a Uint8Array from bytes in this’s relevant realm. + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes) + }, instance) + } + }; + + return methods + } + + function mixinBody (prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-body-consume-body + * @param {Response|Request} object + * @param {(value: unknown) => unknown} convertBytesToJSValue + * @param {Response|Request} instance + */ + async function consumeBody (object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + + // 1. If object is unusable, then return a promise rejected + // with a TypeError. + if (bodyUnusable(object)) { + throw new TypeError('Body is unusable: Body has already been read') + } + + throwIfAborted(object[kState]); + + // 2. Let promise be a new promise. + const promise = createDeferredPromise(); + + // 3. Let errorSteps given error be to reject promise with error. + const errorSteps = (error) => promise.reject(error); + + // 4. Let successSteps given a byte sequence data be to resolve + // promise with the result of running convertBytesToJSValue + // with data. If that threw an exception, then run errorSteps + // with that exception. + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); + } + }; + + // 5. If object’s body is null, then run successSteps with an + // empty byte sequence. + if (object[kState].body == null) { + successSteps(Buffer.allocUnsafe(0)); + return promise.promise + } + + // 6. Otherwise, fully read object’s body given successSteps, + // errorSteps, and object’s relevant global object. + await fullyReadBody(object[kState].body, successSteps, errorSteps); + + // 7. Return promise. + return promise.promise + } + + // https://fetch.spec.whatwg.org/#body-unusable + function bodyUnusable (object) { + const body = object[kState].body; + + // An object including the Body interface mixin is + // said to be unusable if its body is non-null and + // its body’s stream is disturbed or locked. + return body != null && (body.stream.locked || util.isDisturbed(body.stream)) + } + + /** + * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value + * @param {Uint8Array} bytes + */ + function parseJSONFromBytes (bytes) { + return JSON.parse(utf8DecodeBytes(bytes)) + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-body-mime-type + * @param {import('./response').Response|import('./request').Request} requestOrResponse + */ + function bodyMimeType (requestOrResponse) { + // 1. Let headers be null. + // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list. + // 3. Otherwise, set headers to requestOrResponse’s response’s header list. + /** @type {import('./headers').HeadersList} */ + const headers = requestOrResponse[kState].headersList; + + // 4. Let mimeType be the result of extracting a MIME type from headers. + const mimeType = extractMimeType(headers); + + // 5. If mimeType is failure, then return null. + if (mimeType === 'failure') { + return null + } + + // 6. Return mimeType. + return mimeType + } + + body = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody, + streamRegistry, + hasFinalizationRegistry, + bodyUnusable + }; + return body; +} + +var clientH1; +var hasRequiredClientH1; + +function requireClientH1 () { + if (hasRequiredClientH1) return clientH1; + hasRequiredClientH1 = 1; + + /* global WebAssembly */ + + const assert = require$$0$7; + const util = requireUtil$9(); + const { channels } = requireDiagnostics(); + const timers = requireTimers(); + const { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError + } = requireErrors$1(); + const { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext + } = requireSymbols$4(); + + const constants = requireConstants$9(); + const EMPTY_BUF = Buffer.alloc(0); + const FastBuffer = Buffer[Symbol.species]; + const addListener = util.addListener; + const removeAllListeners = util.removeAllListeners; + + let extractBody; + + async function lazyllhttp () { + const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttpWasm() : undefined; + + let mod; + try { + mod = await WebAssembly.compile(requireLlhttp_simdWasm()); + } catch (e) { + /* istanbul ignore next */ + + // We could check if the error was caused by the simd option not + // being enabled, but the occurring of this other error + // * https://github.com/emscripten-core/emscripten/issues/11495 + // got me to remove that check to avoid breaking Node 12. + mod = await WebAssembly.compile(llhttpWasmData || requireLlhttpWasm()); + } + + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ + + wasm_on_url: (p, at, len) => { + /* istanbul ignore next */ + return 0 + }, + wasm_on_status: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_begin: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageBegin() || 0 + }, + wasm_on_header_field: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_header_value: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert(currentParser.ptr === p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + }, + wasm_on_body: (p, at, len) => { + assert(currentParser.ptr === p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_complete: (p) => { + assert(currentParser.ptr === p); + return currentParser.onMessageComplete() || 0 + } + + /* eslint-enable camelcase */ + } + }) + } + + let llhttpInstance = null; + let llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); + + let currentParser = null; + let currentBufferRef = null; + let currentBufferSize = 0; + let currentBufferPtr = null; + + const USE_NATIVE_TIMER = 0; + const USE_FAST_TIMER = 1; + + // Use fast timers for headers and body to take eventual event loop + // latency into account. + const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; + const TIMEOUT_BODY = 4 | USE_FAST_TIMER; + + // Use native timers to ignore event loop latency for keep-alive + // handling. + const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; + + class Parser { + constructor (client, socket, { exports: exports$1 }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + + this.llhttp = exports$1; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ''; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + + this.bytesRead = 0; + + this.keepAlive = ''; + this.contentLength = ''; + this.connection = ''; + this.maxResponseSize = client[kMaxResponseSize]; + } + + setTimeout (delay, type) { + // If the existing timer and the new timer are of different timer type + // (fast or native) or have different delay, we need to clear the existing + // timer and set a new one. + if ( + delay !== this.timeoutValue || + (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER) + ) { + // If a timeout is already set, clear it with clearTimeout of the fast + // timer implementation, as it can clear fast and native timers. + if (this.timeout) { + timers.clearTimeout(this.timeout); + this.timeout = null; + } + + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); + } else { + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); + this.timeout.unref(); + } + } + + this.timeoutValue = delay; + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + + this.timeoutType = type; + } + + resume () { + if (this.socket.destroyed || !this.paused) { + return + } + + assert(this.ptr != null); + assert(currentParser == null); + + this.llhttp.llhttp_resume(this.ptr); + + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); // Flush parser. + this.readMore(); + } + + readMore () { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break + } + this.execute(chunk); + } + } + + execute (data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); + + const { socket, llhttp } = this; + + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); + } + + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + + // Call `execute` on the wasm parser. + // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, + // and finally the length of bytes to parse. + // The return value is an error code or `constants.ERROR.OK`. + try { + let ret; + + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + /* eslint-disable-next-line no-useless-catch */ + } catch (err) { + /* istanbul ignore next: difficult to make a test case for */ + throw err + } finally { + currentParser = null; + currentBufferRef = null; + } + + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ''; + /* istanbul ignore else: difficult to make a test case for */ + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')'; + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) + } + } catch (err) { + util.destroy(socket, err); + } + } + + destroy () { + assert(this.ptr != null); + assert(currentParser == null); + + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + + this.timeout && timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + + this.paused = false; + } + + onStatus (buf) { + this.statusText = buf.toString(); + } + + onMessageBegin () { + const { socket, client } = this; + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 + } + + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1 + } + request.onResponseStarted(); + } + + onHeaderField (buf) { + const len = this.headers.length; + + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + + this.trackHeader(buf.length); + } + + onHeaderValue (buf) { + let len = this.headers.length; + + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + + const key = this.headers[len - 2]; + if (key.length === 10) { + const headerName = util.bufferToLowerCasedHeaderName(key); + if (headerName === 'keep-alive') { + this.keepAlive += buf.toString(); + } else if (headerName === 'connection') { + this.connection += buf.toString(); + } + } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') { + this.contentLength += buf.toString(); + } + + this.trackHeader(buf.length); + } + + trackHeader (len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()); + } + } + + onUpgrade (head) { + const { upgrade, client, socket, headers, statusCode } = this; + + assert(upgrade); + assert(client[kSocket] === socket); + assert(!socket.destroyed); + assert(!this.paused); + assert((headers.length & 1) === 0); + + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(request.upgrade || request.method === 'CONNECT'); + + this.statusCode = null; + this.statusText = ''; + this.shouldKeepAlive = null; + + this.headers = []; + this.headersSize = 0; + + socket.unshift(head); + + socket[kParser].destroy(); + socket[kParser] = null; + + socket[kClient] = null; + socket[kError] = null; + + removeAllListeners(socket); + + client[kSocket] = null; + client[kHTTPContext] = null; // TODO (fix): This is hacky... + client[kQueue][client[kRunningIdx]++] = null; + client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')); + + try { + request.onUpgrade(statusCode, headers, socket); + } catch (err) { + util.destroy(socket, err); + } + + client[kResume](); + } + + onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 + } + + const request = client[kQueue][client[kRunningIdx]]; + + /* istanbul ignore next: difficult to make a test case for */ + if (!request) { + return -1 + } + + assert(!this.upgrade); + assert(this.statusCode < 200); + + if (statusCode === 100) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))); + return -1 + } + + /* this can only happen if server is misbehaving */ + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))); + return -1 + } + + assert(this.timeoutType === TIMEOUT_HEADERS); + + this.statusCode = statusCode; + this.shouldKeepAlive = ( + shouldKeepAlive || + // Override llhttp value which does not allow keepAlive for HEAD. + (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') + ); + + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null + ? request.bodyTimeout + : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + + if (request.method === 'CONNECT') { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2 + } + + if (upgrade) { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2 + } + + assert((this.headers.length & 1) === 0); + this.headers = []; + this.headersSize = 0; + + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; + + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + } + } else { + // Stop more requests from being dispatched. + socket[kReset] = true; + } + + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; + + if (request.aborted) { + return -1 + } + + if (request.method === 'HEAD') { + return 1 + } + + if (statusCode < 200) { + return 1 + } + + if (socket[kBlocking]) { + socket[kBlocking] = false; + client[kResume](); + } + + return pause ? constants.ERROR.PAUSED : 0 + } + + onBody (buf) { + const { client, socket, statusCode, maxResponseSize } = this; + + if (socket.destroyed) { + return -1 + } + + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + + assert(statusCode >= 200); + + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()); + return -1 + } + + this.bytesRead += buf.length; + + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED + } + } + + onMessageComplete () { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1 + } + + if (upgrade) { + return + } + + assert(statusCode >= 100); + assert((this.headers.length & 1) === 0); + + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + + this.statusCode = null; + this.statusText = ''; + this.bytesRead = 0; + this.contentLength = ''; + this.keepAlive = ''; + this.connection = ''; + + this.headers = []; + this.headersSize = 0; + + if (statusCode < 200) { + return + } + + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()); + return -1 + } + + request.onComplete(headers); + + client[kQueue][client[kRunningIdx]++] = null; + + if (socket[kWriting]) { + assert(client[kRunning] === 0); + // Response completed before request. + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (socket[kReset] && client[kRunning] === 0) { + // Destroy socket once all requests have completed. + // The request at the tail of the pipeline is the one + // that requested reset and no further requests should + // have been queued since then. + util.destroy(socket, new InformationalError('reset')); + return constants.ERROR.PAUSED + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + // We must wait a full event loop cycle to reuse this socket to make sure + // that non-spec compliant servers are not closing the connection even if they + // said they won't. + setImmediate(() => client[kResume]()); + } else { + client[kResume](); + } + } + } + + function onParserTimeout (parser) { + const { socket, timeoutType, client, paused } = parser.deref(); + + /* istanbul ignore else */ + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!paused, 'cannot be paused while waiting for headers'); + util.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!paused) { + util.destroy(socket, new BodyTimeoutError()); + } + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util.destroy(socket, new InformationalError('socket idle timeout')); + } + } + + async function connectH1 (client, socket) { + client[kSocket] = socket; + + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); + + addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + + const parser = this[kParser]; + + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so for as a valid response. + parser.onMessageComplete(); + return + } + + this[kError] = err; + + this[kClient][kOnError](err); + }); + addListener(socket, 'readable', function () { + const parser = this[kParser]; + + if (parser) { + parser.readMore(); + } + }); + addListener(socket, 'end', function () { + const parser = this[kParser]; + + if (parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete(); + return + } + + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); + }); + addListener(socket, 'close', function () { + const client = this[kClient]; + const parser = this[kParser]; + + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete(); + } + + this[kParser].destroy(); + this[kParser] = null; + } + + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); + + client[kSocket] = null; + client[kHTTPContext] = null; // TODO (fix): This is hacky... + + if (client.destroyed) { + assert(client[kPending] === 0); + + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + + util.errorRequest(client, request, err); + } + + client[kPendingIdx] = client[kRunningIdx]; + + assert(client[kRunning] === 0); + + client.emit('disconnect', client[kUrl], [client], err); + + client[kResume](); + }); + + let closed = false; + socket.on('close', () => { + closed = true; + }); + + return { + version: 'h1', + defaultPipelining: 1, + write (...args) { + return writeH1(client, ...args) + }, + resume () { + resumeH1(client); + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on('close', callback); + } + }, + get destroyed () { + return socket.destroyed + }, + busy (request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true + } + + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + // Non-idempotent request cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } + + if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { + // Don't dispatch an upgrade until all preceding requests have completed. + // A misbehaving server might upgrade the connection before all pipelined + // request has completed. + return true + } + + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && + (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { + // Request with stream or iterator body can error while other requests + // are inflight and indirectly error those as well. + // Ensure this doesn't happen by waiting for inflight + // to complete before dispatching. + + // Request with stream or iterator body cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return true + } + } + + return false + } + } + } + + function resumeH1 (client) { + const socket = client[kSocket]; + + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request.headersTimeout != null + ? request.headersTimeout + : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } + } + } + + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 + function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' + } + + function writeH1 (client, request) { + const { method, path, host, upgrade, blocking, reset } = request; + + let { body, headers, contentLength } = request; + + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 + + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. + + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' || + method === 'QUERY' || + method === 'PROPFIND' || + method === 'PROPPATCH' + ); + + if (util.isFormDataLike(body)) { + if (!extractBody) { + extractBody = requireBody().extractBody; + } + + const [bodyStream, contentType] = extractBody(body); + if (request.contentType == null) { + headers.push('content-type', contentType); + } + body = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && request.contentType == null && body.type) { + headers.push('content-type', body.type); + } + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0); + } + + const bodyLength = util.bodyLength(body); + + contentLength = bodyLength ?? contentLength; + + if (contentLength === null) { + contentLength = request.contentLength; + } + + if (contentLength === 0 && !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null; + } + + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false + } + + process.emitWarning(new RequestContentLengthMismatchError()); + } + + const socket = client[kSocket]; + + const abort = (err) => { + if (request.aborted || request.completed) { + return + } + + util.errorRequest(client, request, err || new RequestAbortedError()); + + util.destroy(body); + util.destroy(socket, new InformationalError('aborted')); + }; + + try { + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); + } + + if (request.aborted) { + return false + } + + if (method === 'HEAD') { + // https://github.com/mcollina/undici/issues/258 + // Close after a HEAD request to interop with misbehaving servers + // that may send a body in the response. + + socket[kReset] = true; + } + + if (upgrade || method === 'CONNECT') { + // On CONNECT or upgrade, block pipeline from dispatching further + // requests on this connection. + + socket[kReset] = true; + } + + if (reset != null) { + socket[kReset] = reset; + } + + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } + + if (blocking) { + socket[kBlocking] = true; + } + + let header = `${method} ${path} HTTP/1.1\r\n`; + + if (typeof host === 'string') { + header += `host: ${host}\r\n`; + } else { + header += client[kHostHeader]; + } + + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; + } else if (client[kPipelining] && !socket[kReset]) { + header += 'connection: keep-alive\r\n'; + } else { + header += 'connection: close\r\n'; + } + + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0]; + const val = headers[n + 1]; + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r\n`; + } + } else { + header += `${key}: ${val}\r\n`; + } + } + } + + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + + /* istanbul ignore else: assertion */ + if (!body || bodyLength === 0) { + writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBuffer(body)) { + writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload); + } else { + writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload); + } + } else if (util.isStream(body)) { + writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isIterable(body)) { + writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else { + assert(false); + } + + return true + } + + function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); + + let finished = false; + + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + + const onData = function (chunk) { + if (finished) { + return + } + + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util.destroy(this, err); + } + }; + const onDrain = function () { + if (finished) { + return + } + + if (body.resume) { + body.resume(); + } + }; + const onClose = function () { + // 'close' might be emitted *before* 'error' for + // broken streams. Wait a tick to avoid this case. + queueMicrotask(() => { + // It's only safe to remove 'error' listener after + // 'close'. + body.removeListener('error', onFinished); + }); + + if (!finished) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + } + }; + const onFinished = function (err) { + if (finished) { + return + } + + finished = true; + + assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)); + + socket + .off('drain', onDrain) + .off('error', onFinished); + + body + .removeListener('data', onData) + .removeListener('end', onFinished) + .removeListener('close', onClose); + + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } + + writer.destroy(err); + + if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; + + body + .on('data', onData) + .on('end', onFinished) + .on('error', onFinished) + .on('close', onClose); + + if (body.resume) { + body.resume(); + } + + socket + .on('drain', onDrain) + .on('error', onFinished); + + if (body.errorEmitted ?? body.errored) { + setImmediate(() => onFinished(body.errored)); + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(() => onFinished(null)); + } + + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose); + } + } + + function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); + } else { + assert(contentLength === null, 'no body must not have content length'); + socket.write(`${header}\r\n`, 'latin1'); + } + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length'); + + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + } + request.onRequestSent(); + + client[kResume](); + } catch (err) { + abort(err); + } + } + + async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length'); + + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() + } + + const buffer = Buffer.from(await body.arrayBuffer()); + + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + socket.write(buffer); + socket.uncork(); + + request.onBodySent(buffer); + request.onRequestSent(); + + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + + client[kResume](); + } catch (err) { + abort(err); + } + } + + async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); + + let callback = null; + function onDrain () { + if (callback) { + const cb = callback; + callback = null; + cb(); + } + } + + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); + + socket + .on('close', onDrain) + .on('drain', onDrain); + + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } + + if (!writer.write(chunk)) { + await waitForDrain(); + } + } + + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket + .off('close', onDrain) + .off('drain', onDrain); + } + } + + class AsyncWriter { + constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + + socket[kWriting] = true; + } + + write (chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + + if (socket[kError]) { + throw socket[kError] + } + + if (socket.destroyed) { + return false + } + + const len = Buffer.byteLength(chunk); + if (!len) { + return true + } + + // We should defer writing chunks. + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } + + process.emitWarning(new RequestContentLengthMismatchError()); + } + + socket.cork(); + + if (bytesWritten === 0) { + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1'); + } else { + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1'); + } + } + + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1'); + } + + this.bytesWritten += len; + + const ret = socket.write(chunk); + + socket.uncork(); + + request.onBodySent(chunk); + + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + } + + return ret + } + + end () { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); + + socket[kWriting] = false; + + if (socket[kError]) { + throw socket[kError] + } + + if (socket.destroyed) { + return + } + + if (bytesWritten === 0) { + if (expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD send a Content-Length in a request message when + // no Transfer-Encoding is sent and the request method defines a meaning + // for an enclosed payload body. + + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1'); + } else { + socket.write(`${header}\r\n`, 'latin1'); + } + } else if (contentLength === null) { + socket.write('\r\n0\r\n\r\n', 'latin1'); + } + + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } + } + + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + + client[kResume](); + } + + destroy (err) { + const { socket, client, abort } = this; + + socket[kWriting] = false; + + if (err) { + assert(client[kRunning] <= 1, 'pipeline should only contain this request'); + abort(err); + } + } + } + + clientH1 = connectH1; + return clientH1; +} + +var clientH2; +var hasRequiredClientH2; + +function requireClientH2 () { + if (hasRequiredClientH2) return clientH2; + hasRequiredClientH2 = 1; + + const assert = require$$0$7; + const { pipeline } = require$$0$8; + const util = requireUtil$9(); + const { + RequestContentLengthMismatchError, + RequestAbortedError, + SocketError, + InformationalError + } = requireErrors$1(); + const { + kUrl, + kReset, + kClient, + kRunning, + kPending, + kQueue, + kPendingIdx, + kRunningIdx, + kError, + kSocket, + kStrictContentLength, + kOnError, + kMaxConcurrentStreams, + kHTTP2Session, + kResume, + kSize, + kHTTPContext + } = requireSymbols$4(); + + const kOpenStreams = Symbol('open streams'); + + let extractBody; + + // Experimental + let h2ExperimentalWarned = false; + + /** @type {import('http2')} */ + let http2; + try { + http2 = require('node:http2'); + } catch { + // @ts-ignore + http2 = { constants: {} }; + } + + const { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS + } + } = http2; + + function parseH2Headers (headers) { + const result = []; + + for (const [name, value] of Object.entries(headers)) { + // h2 may concat the header value by array + // e.g. Set-Cookie + if (Array.isArray(value)) { + for (const subvalue of value) { + // we need to provide each header value of header name + // because the headers handler expect name-value pair + result.push(Buffer.from(name), Buffer.from(subvalue)); + } + } else { + result.push(Buffer.from(name), Buffer.from(value)); + } + } + + return result + } + + async function connectH2 (client, socket) { + client[kSocket] = socket; + + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning('H2 support is experimental, expect them to change at any time.', { + code: 'UNDICI-H2' + }); + } + + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + }); + + session[kOpenStreams] = 0; + session[kClient] = client; + session[kSocket] = socket; + + util.addListener(session, 'error', onHttp2SessionError); + util.addListener(session, 'frameError', onHttp2FrameError); + util.addListener(session, 'end', onHttp2SessionEnd); + util.addListener(session, 'goaway', onHTTP2GoAway); + util.addListener(session, 'close', function () { + const { [kClient]: client } = this; + const { [kSocket]: socket } = client; + + const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)); + + client[kHTTP2Session] = null; + + if (client.destroyed) { + assert(client[kPending] === 0); + + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + } + }); + + session.unref(); + + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + + util.addListener(socket, 'error', function (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + + this[kError] = err; + + this[kClient][kOnError](err); + }); + + util.addListener(socket, 'end', function () { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); + }); + + util.addListener(socket, 'close', function () { + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); + + client[kSocket] = null; + + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + } + + client[kPendingIdx] = client[kRunningIdx]; + + assert(client[kRunning] === 0); + + client.emit('disconnect', client[kUrl], [client], err); + + client[kResume](); + }); + + let closed = false; + socket.on('close', () => { + closed = true; + }); + + return { + version: 'h2', + defaultPipelining: Infinity, + write (...args) { + return writeH2(client, ...args) + }, + resume () { + resumeH2(client); + }, + destroy (err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + // Destroying the socket will trigger the session close + socket.destroy(err).on('close', callback); + } + }, + get destroyed () { + return socket.destroyed + }, + busy () { + return false + } + } + } + + function resumeH2 (client) { + const socket = client[kSocket]; + + if (socket?.destroyed === false) { + if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + socket.unref(); + client[kHTTP2Session].unref(); + } else { + socket.ref(); + client[kHTTP2Session].ref(); + } + } + } + + function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); + + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } + + function onHttp2FrameError (type, code, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } + } + + function onHttp2SessionEnd () { + const err = new SocketError('other side closed', util.getSocketInfo(this[kSocket])); + this.destroy(err); + util.destroy(this[kSocket], err); + } + + /** + * This is the root cause of #3011 + * We need to handle GOAWAY frames properly, and trigger the session close + * along with the socket right away + */ + function onHTTP2GoAway (code) { + // We cannot recover, so best to close the session and the socket + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)); + const client = this[kClient]; + + client[kSocket] = null; + client[kHTTPContext] = null; + + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + this[kHTTP2Session] = null; + } + + util.destroy(this[kSocket], err); + + // Fail head of pipeline. + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util.errorRequest(client, request, err); + client[kPendingIdx] = client[kRunningIdx]; + } + + assert(client[kRunning] === 0); + + client.emit('disconnect', client[kUrl], [client], err); + + client[kResume](); + } + + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 + function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' + } + + function writeH2 (client, request) { + const session = client[kHTTP2Session]; + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + let { body } = request; + + if (upgrade) { + util.errorRequest(client, request, new Error('Upgrade not supported for H2')); + return false + } + + const headers = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `,${val[i]}`; + } else { + headers[key] = val[i]; + } + } + } else { + headers[key] = val; + } + } + + /** @type {import('node:http2').ClientHttp2Stream} */ + let stream; + + const { hostname, port } = client[kUrl]; + + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ''}`; + headers[HTTP2_HEADER_METHOD] = method; + + const abort = (err) => { + if (request.aborted || request.completed) { + return + } + + err = err || new RequestAbortedError(); + + util.errorRequest(client, request, err); + + if (stream != null) { + util.destroy(stream, err); + } + + // We do not destroy the socket as we can continue using the session + // the stream get's destroyed and the session remains to create new streams + util.destroy(body, err); + client[kQueue][client[kRunningIdx]++] = null; + client[kResume](); + }; + + try { + // We are already connected, streams are pending. + // We can call on connect, and wait for abort + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); + } + + if (request.aborted) { + return false + } + + if (method === 'CONNECT') { + session.ref(); + // We are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream + stream = session.request(headers, { endStream: false, signal }); + + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; + }); + } + + stream.once('close', () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); + }); + + return true + } + + // https://tools.ietf.org/html/rfc7540#section-8.3 + // :path and :scheme headers must be omitted when sending CONNECT + + headers[HTTP2_HEADER_PATH] = path; + headers[HTTP2_HEADER_SCHEME] = 'https'; + + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 + + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. + + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ); + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0); + } + + let contentLength = util.bodyLength(body); + + if (util.isFormDataLike(body)) { + extractBody ??= requireBody().extractBody; + + const [bodyStream, contentType] = extractBody(body); + headers['content-type'] = contentType; + + body = bodyStream.stream; + contentLength = bodyStream.length; + } + + if (contentLength == null) { + contentLength = request.contentLength; + } + + if (contentLength === 0 || !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null; + } + + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false + } + + process.emitWarning(new RequestContentLengthMismatchError()); + } + + if (contentLength != null) { + assert(body, 'no body must not have content length'); + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } + + session.ref(); + + const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null; + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = '100-continue'; + stream = session.request(headers, { endStream: shouldEndStream, signal }); + + stream.once('continue', writeBodyH2); + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); + } + + // Increment counter as we have new streams open + ++session[kOpenStreams]; + + stream.once('response', headers => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers; + request.onResponseStarted(); + + // Due to the stream nature, it is possible we face a race condition + // where the stream has been assigned, but the request has been aborted + // the request remains in-flight and headers hasn't been received yet + // for those scenarios, best effort is to destroy the stream immediately + // as there's no value to keep it open. + if (request.aborted) { + const err = new RequestAbortedError(); + util.errorRequest(client, request, err); + util.destroy(stream, err); + return + } + + if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) { + stream.pause(); + } + + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); + } + }); + }); + + stream.once('end', () => { + // When state is null, it means we haven't consumed body and the stream still do not have + // a state. + // Present specially when using pipeline or stream + if (stream.state?.state == null || stream.state.state < 6) { + request.onComplete([]); + } + + if (session[kOpenStreams] === 0) { + // Stream is closed or half-closed-remote (6), decrement counter and cleanup + // It does not have sense to continue working with the stream as we do not + // have yet RST_STREAM support on client-side + + session.unref(); + } + + abort(new InformationalError('HTTP/2: stream half-closed (remote)')); + client[kQueue][client[kRunningIdx]++] = null; + client[kPendingIdx] = client[kRunningIdx]; + client[kResume](); + }); + + stream.once('close', () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + }); + + stream.once('error', function (err) { + abort(err); + }); + + stream.once('frameError', (type, code) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); + }); + + // stream.on('aborted', () => { + // // TODO(HTTP/2): Support aborted + // }) + + // stream.on('timeout', () => { + // // TODO(HTTP/2): Support timeout + // }) + + // stream.on('push', headers => { + // // TODO(HTTP/2): Support push + // }) + + // stream.on('trailers', headers => { + // // TODO(HTTP/2): Support trailers + // }) + + return true + + function writeBodyH2 () { + /* istanbul ignore else: assertion */ + if (!body || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util.isBuffer(body)) { + writeBuffer( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable( + abort, + stream, + body.stream(), + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else { + writeBlob( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } + } else if (util.isStream(body)) { + writeStream( + abort, + client[kSocket], + expectsPayload, + stream, + body, + client, + request, + contentLength + ); + } else if (util.isIterable(body)) { + writeIterable( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); + } else { + assert(false); + } + } + } + + function writeBuffer (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + try { + if (body != null && util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length'); + h2stream.cork(); + h2stream.write(body); + h2stream.uncork(); + h2stream.end(); + + request.onBodySent(body); + } + + if (!expectsPayload) { + socket[kReset] = true; + } + + request.onRequestSent(); + client[kResume](); + } catch (error) { + abort(error); + } + } + + function writeStream (abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); + + // For HTTP/2, is enough to pipe the stream + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(pipe, err); + abort(err); + } else { + util.removeAllListeners(pipe); + request.onRequestSent(); + + if (!expectsPayload) { + socket[kReset] = true; + } + + client[kResume](); + } + } + ); + + util.addListener(pipe, 'data', onPipeData); + + function onPipeData (chunk) { + request.onBodySent(chunk); + } + } + + async function writeBlob (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength === body.size, 'blob body must have content length'); + + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() + } + + const buffer = Buffer.from(await body.arrayBuffer()); + + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + h2stream.end(); + + request.onBodySent(buffer); + request.onRequestSent(); + + if (!expectsPayload) { + socket[kReset] = true; + } + + client[kResume](); + } catch (err) { + abort(err); + } + } + + async function writeIterable (abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); + + let callback = null; + function onDrain () { + if (callback) { + const cb = callback; + callback = null; + cb(); + } + } + + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); + + h2stream + .on('close', onDrain) + .on('drain', onDrain); + + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } + + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { + await waitForDrain(); + } + } + + h2stream.end(); + + request.onRequestSent(); + + if (!expectsPayload) { + socket[kReset] = true; + } + + client[kResume](); + } catch (err) { + abort(err); + } finally { + h2stream + .off('close', onDrain) + .off('drain', onDrain); + } + } + + clientH2 = connectH2; + return clientH2; +} + +var redirectHandler; +var hasRequiredRedirectHandler; + +function requireRedirectHandler () { + if (hasRequiredRedirectHandler) return redirectHandler; + hasRequiredRedirectHandler = 1; + + const util = requireUtil$9(); + const { kBodyUsed } = requireSymbols$4(); + const assert = require$$0$7; + const { InvalidArgumentError } = requireErrors$1(); + const EE = require$$8; + + const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + + const kBody = Symbol('body'); + + class BodyAsyncIterable { + constructor (body) { + this[kBody] = body; + this[kBodyUsed] = false; + } + + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed'); + this[kBodyUsed] = true; + yield * this[kBody]; + } + } + + class RedirectHandler { + constructor (dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } + + util.validateHandler(handler, opts.method, opts.upgrade); + + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; + this.redirectionLimitReached = false; + + if (util.isStream(this.opts.body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body + .on('data', function () { + assert(false); + }); + } + + if (typeof this.opts.body.readableDidRead !== 'boolean') { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, 'data', function () { + this[kBodyUsed] = true; + }); + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if ( + this.opts.body && + typeof this.opts.body !== 'string' && + !ArrayBuffer.isView(this.opts.body) && + util.isIterable(this.opts.body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + this.opts.body = new BodyAsyncIterable(this.opts.body); + } + } + + onConnect (abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } + + onUpgrade (statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } + + onError (error) { + this.handler.onError(error); + } + + onHeaders (statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) + ? null + : parseLocation(statusCode, headers); + + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + if (this.request) { + this.request.abort(new Error('max redirects')); + } + + this.redirectionLimitReached = true; + this.abort(new Error('max redirects')); + return + } + + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); + } + + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText) + } + + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; + + // Remove headers referring to the original URL. + // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. + // https://tools.ietf.org/html/rfc7231#section-6.4 + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + // In case of HTTP 303, always replace method to be either HEAD or GET + if (statusCode === 303 && this.opts.method !== 'HEAD') { + this.opts.method = 'GET'; + this.opts.body = null; + } + } + + onData (chunk) { + if (this.location) ; else { + return this.handler.onData(chunk) + } + } + + onComplete (trailers) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 + + TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections + and neither are useful if present. + + See comment on onData method above for more detailed information. + */ + + this.location = null; + this.abort = null; + + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } + + onBodySent (chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); + } + } + } + + function parseLocation (statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null + } + + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].length === 8 && util.headerNameToString(headers[i]) === 'location') { + return headers[i + 1] + } + } + } + + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + function shouldRemoveHeader (header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header); + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false + } + + // https://tools.ietf.org/html/rfc7231#section-6.4 + function cleanRequestHeaders (headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); + } + } + } else if (headers && typeof headers === 'object') { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); + } + } + } else { + assert(headers == null, 'headers must be an object or an array'); + } + return ret + } + + redirectHandler = RedirectHandler; + return redirectHandler; +} + +var redirectInterceptor; +var hasRequiredRedirectInterceptor; + +function requireRedirectInterceptor () { + if (hasRequiredRedirectInterceptor) return redirectInterceptor; + hasRequiredRedirectInterceptor = 1; + + const RedirectHandler = requireRedirectHandler(); + + function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept (opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts; + + if (!maxRedirections) { + return dispatch(opts, handler) + } + + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); + opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting. + return dispatch(opts, redirectHandler) + } + } + } + + redirectInterceptor = createRedirectInterceptor; + return redirectInterceptor; +} + +var client; +var hasRequiredClient; + +function requireClient () { + if (hasRequiredClient) return client; + hasRequiredClient = 1; + + const assert = require$$0$7; + const net = require$$0$9; + const http = require$$2; + const util = requireUtil$9(); + const { channels } = requireDiagnostics(); + const Request = requireRequest$1(); + const DispatcherBase = requireDispatcherBase(); + const { + InvalidArgumentError, + InformationalError, + ClientDestroyedError + } = requireErrors$1(); + const buildConnector = requireConnect(); + const { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume + } = requireSymbols$4(); + const connectH1 = requireClientH1(); + const connectH2 = requireClientH2(); + let deprecatedInterceptorWarned = false; + + const kClosedResolve = Symbol('kClosedResolve'); + + const noop = () => {}; + + function getPipelining (client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1 + } + + /** + * @type {import('../../types/client.js').default} + */ + class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor (url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2 + } = {}) { + super(); + + if (keepAlive !== undefined) { + throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') + } + + if (socketTimeout !== undefined) { + throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') + } + + if (requestTimeout !== undefined) { + throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') + } + + if (idleTimeout !== undefined) { + throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') + } + + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + } + + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError('invalid maxHeaderSize') + } + + if (socketPath != null && typeof socketPath !== 'string') { + throw new InvalidArgumentError('invalid socketPath') + } + + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError('invalid connectTimeout') + } + + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveTimeout') + } + + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveMaxTimeout') + } + + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') + } + + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') + } + + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } + + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } + + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + } + + if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError('localAddress must be valid string IP address') + } + + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError('maxResponseSize must be a positive number') + } + + if ( + autoSelectFamilyAttemptTimeout != null && + (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) + ) { + throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') + } + + // h2 + if (allowH2 != null && typeof allowH2 !== 'boolean') { + throw new InvalidArgumentError('allowH2 must be a valid boolean value') + } + + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0') + } + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }); + } + + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client; + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true; + process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', { + code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED' + }); + } + } else { + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; + } + + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming + this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; // Max peerConcurrentStreams for a Node h2 server + this[kHTTPContext] = null; + + // kQueue is built up of 3 sections separated by + // the kRunningIdx and kPendingIdx indices. + // | complete | running | pending | + // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length + // kRunningIdx points to the first running element. + // kPendingIdx points to the first pending element. + // This implements a fast queue with an amortized + // time of O(1). + + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); + } + + get pipelining () { + return this[kPipelining] + } + + set pipelining (value) { + this[kPipelining] = value; + this[kResume](true); + } + + get [kPending] () { + return this[kQueue].length - this[kPendingIdx] + } + + get [kRunning] () { + return this[kPendingIdx] - this[kRunningIdx] + } + + get [kSize] () { + return this[kQueue].length - this[kRunningIdx] + } + + get [kConnected] () { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed + } + + get [kBusy] () { + return Boolean( + this[kHTTPContext]?.busy(null) || + (this[kSize] >= (getPipelining(this) || 1)) || + this[kPending] > 0 + ) + } + + /* istanbul ignore: only used for test */ + [kConnect] (cb) { + connect(this); + this.once('connect', cb); + } + + [kDispatch] (opts, handler) { + const origin = opts.origin || this[kUrl].origin; + const request = new Request(origin, opts, handler); + + this[kQueue].push(request); + if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + // Wait a tick in case stream/iterator is ended in the same tick. + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); + } + + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + + return this[kNeedDrain] < 2 + } + + async [kClose] () { + // TODO: for H2 we need to gracefully flush the remaining enqueued + // request and close each stream. + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; + } else { + resolve(null); + } + }) + } + + async [kDestroy] (err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(this, request, err); + } + + const callback = () => { + if (this[kClosedResolve]) { + // TODO (fix): Should we error here with ClientDestroyedError? + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + + this[kResume](); + }) + } + } + + const createRedirectInterceptor = requireRedirectInterceptor(); + + function onError (client, err) { + if ( + client[kRunning] === 0 && + err.code !== 'UND_ERR_INFO' && + err.code !== 'UND_ERR_SOCKET' + ) { + // Error is not caused by running request and not a recoverable + // socket error. + + assert(client[kPendingIdx] === client[kRunningIdx]); + + const requests = client[kQueue].splice(client[kRunningIdx]); + + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + assert(client[kSize] === 0); + } + } + + /** + * @param {Client} client + * @returns + */ + async function connect (client) { + assert(!client[kConnecting]); + assert(!client[kHTTPContext]); + + let { host, hostname, protocol, port } = client[kUrl]; + + // Resolve ipv6 + if (hostname[0] === '[') { + const idx = hostname.indexOf(']'); + + assert(idx !== -1); + const ip = hostname.substring(1, idx); + + assert(net.isIP(ip)); + hostname = ip; + } + + client[kConnecting] = true; + + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }); + } + + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket) => { + if (err) { + reject(err); + } else { + resolve(socket); + } + }); + }); + + if (client.destroyed) { + util.destroy(socket.on('error', noop), new ClientDestroyedError()); + return + } + + assert(socket); + + try { + client[kHTTPContext] = socket.alpnProtocol === 'h2' + ? await connectH2(client, socket) + : await connectH1(client, socket); + } catch (err) { + socket.destroy().on('error', noop); + throw err + } + + client[kConnecting] = false; + + socket[kCounter] = 0; + socket[kMaxRequests] = client[kMaxRequests]; + socket[kClient] = client; + socket[kError] = null; + + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }); + } + client.emit('connect', client[kUrl], [client]); + } catch (err) { + if (client.destroyed) { + return + } + + client[kConnecting] = false; + + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }); + } + + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + assert(client[kRunning] === 0); + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++]; + util.errorRequest(client, request, err); + } + } else { + onError(client, err); + } + + client.emit('connectionError', client[kUrl], [client], err); + } + + client[kResume](); + } + + function emitDrain (client) { + client[kNeedDrain] = 0; + client.emit('drain', client[kUrl], [client]); + } + + function resume (client, sync) { + if (client[kResuming] === 2) { + return + } + + client[kResuming] = 2; + + _resume(client, sync); + client[kResuming] = 0; + + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]); + client[kPendingIdx] -= client[kRunningIdx]; + client[kRunningIdx] = 0; + } + } + + function _resume (client, sync) { + while (true) { + if (client.destroyed) { + assert(client[kPending] === 0); + return + } + + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve](); + client[kClosedResolve] = null; + return + } + + if (client[kHTTPContext]) { + client[kHTTPContext].resume(); + } + + if (client[kBusy]) { + client[kNeedDrain] = 2; + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1; + queueMicrotask(() => emitDrain(client)); + } else { + emitDrain(client); + } + continue + } + + if (client[kPending] === 0) { + return + } + + if (client[kRunning] >= (getPipelining(client) || 1)) { + return + } + + const request = client[kQueue][client[kPendingIdx]]; + + if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return + } + + client[kServerName] = request.servername; + client[kHTTPContext]?.destroy(new InformationalError('servername changed'), () => { + client[kHTTPContext] = null; + resume(client); + }); + } + + if (client[kConnecting]) { + return + } + + if (!client[kHTTPContext]) { + connect(client); + return + } + + if (client[kHTTPContext].destroyed) { + return + } + + if (client[kHTTPContext].busy(request)) { + return + } + + if (!request.aborted && client[kHTTPContext].write(request)) { + client[kPendingIdx]++; + } else { + client[kQueue].splice(client[kPendingIdx], 1); + } + } + } + + client = Client; + return client; +} + +/* eslint-disable */ + +var fixedQueue; +var hasRequiredFixedQueue; + +function requireFixedQueue () { + if (hasRequiredFixedQueue) return fixedQueue; + hasRequiredFixedQueue = 1; + + // Extracted from node/lib/internal/fixed_queue.js + + // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. + const kSize = 2048; + const kMask = kSize - 1; + + // The FixedQueue is implemented as a singly-linked list of fixed-size + // circular buffers. It looks something like this: + // + // head tail + // | | + // v v + // +-----------+ <-----\ +-----------+ <------\ +-----------+ + // | [null] | \----- | next | \------- | next | + // +-----------+ +-----------+ +-----------+ + // | item | <-- bottom | item | <-- bottom | [empty] | + // | item | | item | | [empty] | + // | item | | item | | [empty] | + // | item | | item | | [empty] | + // | item | | item | bottom --> | item | + // | item | | item | | item | + // | ... | | ... | | ... | + // | item | | item | | item | + // | item | | item | | item | + // | [empty] | <-- top | item | | item | + // | [empty] | | item | | item | + // | [empty] | | [empty] | <-- top top --> | [empty] | + // +-----------+ +-----------+ +-----------+ + // + // Or, if there is only one circular buffer, it looks something + // like either of these: + // + // head tail head tail + // | | | | + // v v v v + // +-----------+ +-----------+ + // | [null] | | [null] | + // +-----------+ +-----------+ + // | [empty] | | item | + // | [empty] | | item | + // | item | <-- bottom top --> | [empty] | + // | item | | [empty] | + // | [empty] | <-- top bottom --> | item | + // | [empty] | | item | + // +-----------+ +-----------+ + // + // Adding a value means moving `top` forward by one, removing means + // moving `bottom` forward by one. After reaching the end, the queue + // wraps around. + // + // When `top === bottom` the current queue is empty and when + // `top + 1 === bottom` it's full. This wastes a single space of storage + // but allows much quicker checks. + + class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; + } + + isEmpty() { + return this.top === this.bottom; + } + + isFull() { + return ((this.top + 1) & kMask) === this.bottom; + } + + push(data) { + this.list[this.top] = data; + this.top = (this.top + 1) & kMask; + } + + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = (this.bottom + 1) & kMask; + return nextItem; + } + } + + fixedQueue = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); + } + + isEmpty() { + return this.head.isEmpty(); + } + + push(data) { + if (this.head.isFull()) { + // Head is full: Creates a new queue, sets the old queue's `.next` to it, + // and sets it as the new main queue. + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } + + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + // If there is another queue, it forms the new tail. + this.tail = tail.next; + } + return next; + } + }; + return fixedQueue; +} + +var poolStats; +var hasRequiredPoolStats; + +function requirePoolStats () { + if (hasRequiredPoolStats) return poolStats; + hasRequiredPoolStats = 1; + const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$4(); + const kPool = Symbol('pool'); + + class PoolStats { + constructor (pool) { + this[kPool] = pool; + } + + get connected () { + return this[kPool][kConnected] + } + + get free () { + return this[kPool][kFree] + } + + get pending () { + return this[kPool][kPending] + } + + get queued () { + return this[kPool][kQueued] + } + + get running () { + return this[kPool][kRunning] + } + + get size () { + return this[kPool][kSize] + } + } + + poolStats = PoolStats; + return poolStats; +} + +var poolBase; +var hasRequiredPoolBase; + +function requirePoolBase () { + if (hasRequiredPoolBase) return poolBase; + hasRequiredPoolBase = 1; + + const DispatcherBase = requireDispatcherBase(); + const FixedQueue = requireFixedQueue(); + const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$4(); + const PoolStats = requirePoolStats(); + + const kClients = Symbol('clients'); + const kNeedDrain = Symbol('needDrain'); + const kQueue = Symbol('queue'); + const kClosedResolve = Symbol('closed resolve'); + const kOnDrain = Symbol('onDrain'); + const kOnConnect = Symbol('onConnect'); + const kOnDisconnect = Symbol('onDisconnect'); + const kOnConnectionError = Symbol('onConnectionError'); + const kGetDispatcher = Symbol('get dispatcher'); + const kAddClient = Symbol('add client'); + const kRemoveClient = Symbol('remove client'); + const kStats = Symbol('stats'); + + class PoolBase extends DispatcherBase { + constructor () { + super(); + + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + + const pool = this; + + this[kOnDrain] = function onDrain (origin, targets) { + const queue = pool[kQueue]; + + let needDrain = false; + + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break + } + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } + + this[kNeedDrain] = needDrain; + + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit('drain', origin, [pool, ...targets]); + } + + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise + .all(pool[kClients].map(c => c.close())) + .then(pool[kClosedResolve]); + } + }; + + this[kOnConnect] = (origin, targets) => { + pool.emit('connect', origin, [pool, ...targets]); + }; + + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit('disconnect', origin, [pool, ...targets], err); + }; + + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit('connectionError', origin, [pool, ...targets], err); + }; + + this[kStats] = new PoolStats(this); + } + + get [kBusy] () { + return this[kNeedDrain] + } + + get [kConnected] () { + return this[kClients].filter(client => client[kConnected]).length + } + + get [kFree] () { + return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length + } + + get [kPending] () { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret + } + + get [kRunning] () { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret + } + + get [kSize] () { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret + } + + get stats () { + return this[kStats] + } + + async [kClose] () { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map(c => c.close())); + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); + } + } + + async [kDestroy] (err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break + } + item.handler.onError(err); + } + + await Promise.all(this[kClients].map(c => c.destroy(err))); + } + + [kDispatch] (opts, handler) { + const dispatcher = this[kGetDispatcher](); + + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + + return !this[kNeedDrain] + } + + [kAddClient] (client) { + client + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]); + + this[kClients].push(client); + + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } + + return this + } + + [kRemoveClient] (client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + + this[kNeedDrain] = this[kClients].some(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )); + } + } + + poolBase = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; + return poolBase; +} + +var pool; +var hasRequiredPool; + +function requirePool () { + if (hasRequiredPool) return pool; + hasRequiredPool = 1; + + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = requirePoolBase(); + const Client = requireClient(); + const { + InvalidArgumentError + } = requireErrors$1(); + const util = requireUtil$9(); + const { kUrl, kInterceptors } = requireSymbols$4(); + const buildConnector = requireConnect(); + + const kOptions = Symbol('options'); + const kConnections = Symbol('connections'); + const kFactory = Symbol('factory'); + + function defaultFactory (origin, opts) { + return new Client(origin, opts) + } + + class Pool extends PoolBase { + constructor (origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); + + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError('invalid connections') + } + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }); + } + + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) + ? options.interceptors.Pool + : []; + this[kConnections] = connections || null; + this[kUrl] = util.parseOrigin(origin); + this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined; + this[kFactory] = factory; + + this.on('connectionError', (origin, targets, error) => { + // If a connection error occurs, we remove the client from the pool, + // and emit a connectionError event. They will not be re-used. + // Fixes https://github.com/nodejs/undici/issues/3895 + for (const target of targets) { + // Do not use kRemoveClient here, as it will close the client, + // but the client cannot be closed in this state. + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); + } + + [kGetDispatcher] () { + for (const client of this[kClients]) { + if (!client[kNeedDrain]) { + return client + } + } + + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher + } + } + } + + pool = Pool; + return pool; +} + +var balancedPool; +var hasRequiredBalancedPool; + +function requireBalancedPool () { + if (hasRequiredBalancedPool) return balancedPool; + hasRequiredBalancedPool = 1; + + const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = requireErrors$1(); + const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = requirePoolBase(); + const Pool = requirePool(); + const { kUrl, kInterceptors } = requireSymbols$4(); + const { parseOrigin } = requireUtil$9(); + const kFactory = Symbol('factory'); + + const kOptions = Symbol('options'); + const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor'); + const kCurrentWeight = Symbol('kCurrentWeight'); + const kIndex = Symbol('kIndex'); + const kWeight = Symbol('kWeight'); + const kMaxWeightPerServer = Symbol('kMaxWeightPerServer'); + const kErrorPenalty = Symbol('kErrorPenalty'); + + /** + * Calculate the greatest common divisor of two numbers by + * using the Euclidean algorithm. + * + * @param {number} a + * @param {number} b + * @returns {number} + */ + function getGreatestCommonDivisor (a, b) { + if (a === 0) return b + + while (b !== 0) { + const t = b; + b = a % b; + a = t; + } + return a + } + + function defaultFactory (origin, opts) { + return new Pool(origin, opts) + } + + class BalancedPool extends PoolBase { + constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); + + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; + + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; + } + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + + this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) + ? opts.interceptors.BalancedPool + : []; + this[kFactory] = factory; + + for (const upstream of upstreams) { + this.addUpstream(upstream); + } + this._updateBalancedPoolStats(); + } + + addUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + + if (this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + ))) { + return this + } + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + + this[kAddClient](pool); + pool.on('connect', () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); + }); + + pool.on('connectionError', () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + + pool.on('disconnect', (...args) => { + const err = args[2]; + if (err && err.code === 'UND_ERR_SOCKET') { + // decrease the weight of the pool. + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + } + }); + + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer]; + } + + this._updateBalancedPoolStats(); + + return this + } + + _updateBalancedPoolStats () { + let result = 0; + for (let i = 0; i < this[kClients].length; i++) { + result = getGreatestCommonDivisor(this[kClients][i][kWeight], result); + } + + this[kGreatestCommonDivisor] = result; + } + + removeUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + + const pool = this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + )); + + if (pool) { + this[kRemoveClient](pool); + } + + return this + } + + get upstreams () { + return this[kClients] + .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) + .map((p) => p[kUrl].origin) + } + + [kGetDispatcher] () { + // We validate that pools is greater than 0, + // otherwise we would have to wait until an upstream + // is added, which might never happen. + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError() + } + + const dispatcher = this[kClients].find(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )); + + if (!dispatcher) { + return + } + + const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true); + + if (allClientsBusy) { + return + } + + let counter = 0; + + let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]); + + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool = this[kClients][this[kIndex]]; + + // find pool index with the largest weight + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex]; + } + + // decrease the current weight every `this[kClients].length`. + if (this[kIndex] === 0) { + // Set the current weight to the next lower weight. + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; + } + } + if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { + return pool + } + } + + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex] + } + } + + balancedPool = BalancedPool; + return balancedPool; +} + +var agent; +var hasRequiredAgent; + +function requireAgent () { + if (hasRequiredAgent) return agent; + hasRequiredAgent = 1; + + const { InvalidArgumentError } = requireErrors$1(); + const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4(); + const DispatcherBase = requireDispatcherBase(); + const Pool = requirePool(); + const Client = requireClient(); + const util = requireUtil$9(); + const createRedirectInterceptor = requireRedirectInterceptor(); + + const kOnConnect = Symbol('onConnect'); + const kOnDisconnect = Symbol('onDisconnect'); + const kOnConnectionError = Symbol('onConnectionError'); + const kMaxRedirections = Symbol('maxRedirections'); + const kOnDrain = Symbol('onDrain'); + const kFactory = Symbol('factory'); + const kOptions = Symbol('options'); + + function defaultFactory (origin, opts) { + return opts && opts.connections === 1 + ? new Client(origin, opts) + : new Pool(origin, opts) + } + + class Agent extends DispatcherBase { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + super(); + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } + + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } + + if (connect && typeof connect !== 'function') { + connect = { ...connect }; + } + + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) + ? options.interceptors.Agent + : [createRedirectInterceptor({ maxRedirections })]; + + this[kOptions] = { ...util.deepClone(options), connect }; + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = new Map(); + + this[kOnDrain] = (origin, targets) => { + this.emit('drain', origin, [this, ...targets]); + }; + + this[kOnConnect] = (origin, targets) => { + this.emit('connect', origin, [this, ...targets]); + }; + + this[kOnDisconnect] = (origin, targets, err) => { + this.emit('disconnect', origin, [this, ...targets], err); + }; + + this[kOnConnectionError] = (origin, targets, err) => { + this.emit('connectionError', origin, [this, ...targets], err); + }; + } + + get [kRunning] () { + let ret = 0; + for (const client of this[kClients].values()) { + ret += client[kRunning]; + } + return ret + } + + [kDispatch] (opts, handler) { + let key; + if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') + } + + let dispatcher = this[kClients].get(key); + + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]) + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]); + + // This introduces a tiny memory leak, as dispatchers are never removed from the map. + // TODO(mcollina): remove te timer when the client/pool do not have any more + // active connections. + this[kClients].set(key, dispatcher); + } + + return dispatcher.dispatch(opts, handler) + } + + async [kClose] () { + const closePromises = []; + for (const client of this[kClients].values()) { + closePromises.push(client.close()); + } + this[kClients].clear(); + + await Promise.all(closePromises); + } + + async [kDestroy] (err) { + const destroyPromises = []; + for (const client of this[kClients].values()) { + destroyPromises.push(client.destroy(err)); + } + this[kClients].clear(); + + await Promise.all(destroyPromises); + } + } + + agent = Agent; + return agent; +} + +var proxyAgent; +var hasRequiredProxyAgent; + +function requireProxyAgent () { + if (hasRequiredProxyAgent) return proxyAgent; + hasRequiredProxyAgent = 1; + + const { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = requireSymbols$4(); + const { URL } = require$$1$5; + const Agent = requireAgent(); + const Pool = requirePool(); + const DispatcherBase = requireDispatcherBase(); + const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = requireErrors$1(); + const buildConnector = requireConnect(); + const Client = requireClient(); + + const kAgent = Symbol('proxy agent'); + const kClient = Symbol('proxy client'); + const kProxyHeaders = Symbol('proxy headers'); + const kRequestTls = Symbol('request tls settings'); + const kProxyTls = Symbol('proxy tls settings'); + const kConnectEndpoint = Symbol('connect endpoint function'); + const kTunnelProxy = Symbol('tunnel proxy'); + + function defaultProtocolPort (protocol) { + return protocol === 'https:' ? 443 : 80 + } + + function defaultFactory (origin, opts) { + return new Pool(origin, opts) + } + + const noop = () => {}; + + function defaultAgentFactory (origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts) + } + return new Pool(origin, opts) + } + + class Http1ProxyWrapper extends DispatcherBase { + #client + + constructor (proxyUrl, { headers = {}, connect, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError('Proxy URL is mandatory') + } + + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); + } + } + + [kDispatch] (opts, handler) { + const onHeaders = handler.onHeaders; + handler.onHeaders = function (statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === 'function') { + handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)')); + } + return + } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); + }; + + // Rewrite request as an HTTP1 Proxy request, without tunneling. + const { + origin, + path = '/', + headers = {} + } = opts; + + opts.path = origin + path; + + if (!('host' in headers) && !('Host' in headers)) { + const { host } = new URL(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; + + return this.#client[kDispatch](opts, handler) + } + + async [kClose] () { + return this.#client.close() + } + + async [kDestroy] (err) { + return this.#client.destroy(err) + } + } + + class ProxyAgent extends DispatcherBase { + constructor (opts) { + super(); + + if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) { + throw new InvalidArgumentError('Proxy uri is mandatory') + } + + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== 'function') { + throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') + } + + const { proxyTunnel = true } = opts; + + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; + + this[kProxy] = { uri: href, protocol }; + this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) + ? opts.interceptors.ProxyAgent + : []; + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; + + if (opts.auth && opts.token) { + throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') + } else if (opts.auth) { + /* @deprecated in favour of opts.token */ + this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]['proxy-authorization'] = opts.token; + } else if (username && password) { + this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`; + } + + const connect = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin, options) => { + const { protocol } = new URL(origin); + if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }) + } + return agentFactory(origin, options) + }; + this[kClient] = clientFactory(url, { connect }); + this[kAgent] = new Agent({ + ...opts, + factory, + connect: async (opts, callback) => { + let requestedPath = opts.host; + if (!opts.port) { + requestedPath += `:${defaultProtocolPort(opts.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedPath, + signal: opts.signal, + headers: { + ...this[kProxyHeaders], + host: opts.host + }, + servername: this[kProxyTls]?.servername || proxyHostname + }); + if (statusCode !== 200) { + socket.on('error', noop).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + } + if (opts.protocol !== 'https:') { + callback(null, socket); + return + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts.servername; + } + this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback); + } catch (err) { + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + // Throw a custom error to avoid loop in client.js#connect + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } + } + } + }); + } + + dispatch (opts, handler) { + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); + + if (headers && !('host' in headers) && !('Host' in headers)) { + const { host } = new URL(opts.origin); + headers.host = host; + } + + return this[kAgent].dispatch( + { + ...opts, + headers + }, + handler + ) + } + + /** + * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl (opts) { + if (typeof opts === 'string') { + return new URL(opts) + } else if (opts instanceof URL) { + return opts + } else { + return new URL(opts.uri) + } + } + + async [kClose] () { + await this[kAgent].close(); + await this[kClient].close(); + } + + async [kDestroy] () { + await this[kAgent].destroy(); + await this[kClient].destroy(); + } + } + + /** + * @param {string[] | Record} headers + * @returns {Record} + */ + function buildHeaders (headers) { + // When using undici.fetch, the headers list is stored + // as an array. + if (Array.isArray(headers)) { + /** @type {Record} */ + const headersPair = {}; + + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; + } + + return headersPair + } + + return headers + } + + /** + * @param {Record} headers + * + * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers + * Nevertheless, it was changed and to avoid a security vulnerability by end users + * this check was created. + * It should be removed in the next major version for performance reasons + */ + function throwIfProxyAuthIsSent (headers) { + const existProxyAuth = headers && Object.keys(headers) + .find((key) => key.toLowerCase() === 'proxy-authorization'); + if (existProxyAuth) { + throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') + } + } + + proxyAgent = ProxyAgent; + return proxyAgent; +} + +var envHttpProxyAgent; +var hasRequiredEnvHttpProxyAgent; + +function requireEnvHttpProxyAgent () { + if (hasRequiredEnvHttpProxyAgent) return envHttpProxyAgent; + hasRequiredEnvHttpProxyAgent = 1; + + const DispatcherBase = requireDispatcherBase(); + const { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = requireSymbols$4(); + const ProxyAgent = requireProxyAgent(); + const Agent = requireAgent(); + + const DEFAULT_PORTS = { + 'http:': 80, + 'https:': 443 + }; + + let experimentalWarned = false; + + class EnvHttpProxyAgent extends DispatcherBase { + #noProxyValue = null + #noProxyEntries = null + #opts = null + + constructor (opts = {}) { + super(); + this.#opts = opts; + + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning('EnvHttpProxyAgent is experimental, expect them to change at any time.', { + code: 'UNDICI-EHPA' + }); + } + + const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts; + + this[kNoProxyAgent] = new Agent(agentOpts); + + const HTTP_PROXY = httpProxy ?? process.env.http_proxy ?? process.env.HTTP_PROXY; + if (HTTP_PROXY) { + this[kHttpProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTP_PROXY }); + } else { + this[kHttpProxyAgent] = this[kNoProxyAgent]; + } + + const HTTPS_PROXY = httpsProxy ?? process.env.https_proxy ?? process.env.HTTPS_PROXY; + if (HTTPS_PROXY) { + this[kHttpsProxyAgent] = new ProxyAgent({ ...agentOpts, uri: HTTPS_PROXY }); + } else { + this[kHttpsProxyAgent] = this[kHttpProxyAgent]; + } + + this.#parseNoProxy(); + } + + [kDispatch] (opts, handler) { + const url = new URL(opts.origin); + const agent = this.#getProxyAgentForUrl(url); + return agent.dispatch(opts, handler) + } + + async [kClose] () { + await this[kNoProxyAgent].close(); + if (!this[kHttpProxyAgent][kClosed]) { + await this[kHttpProxyAgent].close(); + } + if (!this[kHttpsProxyAgent][kClosed]) { + await this[kHttpsProxyAgent].close(); + } + } + + async [kDestroy] (err) { + await this[kNoProxyAgent].destroy(err); + if (!this[kHttpProxyAgent][kDestroyed]) { + await this[kHttpProxyAgent].destroy(err); + } + if (!this[kHttpsProxyAgent][kDestroyed]) { + await this[kHttpsProxyAgent].destroy(err); + } + } + + #getProxyAgentForUrl (url) { + let { protocol, host: hostname, port } = url; + + // Stripping ports in this way instead of using parsedUrl.hostname to make + // sure that the brackets around IPv6 addresses are kept. + hostname = hostname.replace(/:\d*$/, '').toLowerCase(); + port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; + if (!this.#shouldProxy(hostname, port)) { + return this[kNoProxyAgent] + } + if (protocol === 'https:') { + return this[kHttpsProxyAgent] + } + return this[kHttpProxyAgent] + } + + #shouldProxy (hostname, port) { + if (this.#noProxyChanged) { + this.#parseNoProxy(); + } + + if (this.#noProxyEntries.length === 0) { + return true // Always proxy if NO_PROXY is not set or empty. + } + if (this.#noProxyValue === '*') { + return false // Never proxy if wildcard is set. + } + + for (let i = 0; i < this.#noProxyEntries.length; i++) { + const entry = this.#noProxyEntries[i]; + if (entry.port && entry.port !== port) { + continue // Skip if ports don't match. + } + if (!/^[.*]/.test(entry.hostname)) { + // No wildcards, so don't proxy only if there is not an exact match. + if (hostname === entry.hostname) { + return false + } + } else { + // Don't proxy if the hostname ends with the no_proxy host. + if (hostname.endsWith(entry.hostname.replace(/^\*/, ''))) { + return false + } + } + } + + return true + } + + #parseNoProxy () { + const noProxyValue = this.#opts.noProxy ?? this.#noProxyEnv; + const noProxySplit = noProxyValue.split(/[,\s]/); + const noProxyEntries = []; + + for (let i = 0; i < noProxySplit.length; i++) { + const entry = noProxySplit[i]; + if (!entry) { + continue + } + const parsed = entry.match(/^(.+):(\d+)$/); + noProxyEntries.push({ + hostname: (parsed ? parsed[1] : entry).toLowerCase(), + port: parsed ? Number.parseInt(parsed[2], 10) : 0 + }); + } + + this.#noProxyValue = noProxyValue; + this.#noProxyEntries = noProxyEntries; + } + + get #noProxyChanged () { + if (this.#opts.noProxy !== undefined) { + return false + } + return this.#noProxyValue !== this.#noProxyEnv + } + + get #noProxyEnv () { + return process.env.no_proxy ?? process.env.NO_PROXY ?? '' + } + } + + envHttpProxyAgent = EnvHttpProxyAgent; + return envHttpProxyAgent; +} + +var retryHandler; +var hasRequiredRetryHandler; + +function requireRetryHandler () { + if (hasRequiredRetryHandler) return retryHandler; + hasRequiredRetryHandler = 1; + const assert = require$$0$7; + + const { kRetryHandlerDefaultRetry } = requireSymbols$4(); + const { RequestRetryError } = requireErrors$1(); + const { + isDisturbed, + parseHeaders, + parseRangeHeader, + wrapRequestBody + } = requireUtil$9(); + + function calculateRetryAfterHeader (retryAfter) { + const current = Date.now(); + return new Date(retryAfter).getTime() - current + } + + class RetryHandler { + constructor (opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts; + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {}; + + this.dispatch = handlers.dispatch; + this.handler = handlers.handler; + this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }; + this.abort = null; + this.aborted = false; + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1000, // 30s, + minTimeout: minTimeout ?? 500, // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + 'ECONNRESET', + 'ECONNREFUSED', + 'ENOTFOUND', + 'ENETDOWN', + 'ENETUNREACH', + 'EHOSTDOWN', + 'EHOSTUNREACH', + 'EPIPE', + 'UND_ERR_SOCKET' + ] + }; + + this.retryCount = 0; + this.retryCountCheckpoint = 0; + this.start = 0; + this.end = null; + this.etag = null; + this.resume = null; + + // Handle possible onConnect duplication + this.handler.onConnect(reason => { + this.aborted = true; + if (this.abort) { + this.abort(reason); + } else { + this.reason = reason; + } + }); + } + + onRequestSent () { + if (this.handler.onRequestSent) { + this.handler.onRequestSent(); + } + } + + onUpgrade (statusCode, headers, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers, socket); + } + } + + onConnect (abort) { + if (this.aborted) { + abort(this.reason); + } else { + this.abort = abort; + } + } + + onBodySent (chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk) + } + + static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { + const { statusCode, code, headers } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + minTimeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + const { counter } = state; + + // Any code that is not a Undici's originated and allowed to retry + if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) { + cb(err); + return + } + + // If a set of method are provided and the current method is not in the list + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); + return + } + + // If a set of status code are provided and the current status code is not in the list + if ( + statusCode != null && + Array.isArray(statusCodes) && + !statusCodes.includes(statusCode) + ) { + cb(err); + return + } + + // If we reached the max number of retries + if (counter > maxRetries) { + cb(err); + return + } + + let retryAfterHeader = headers?.['retry-after']; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = Number.isNaN(retryAfterHeader) + ? calculateRetryAfterHeader(retryAfterHeader) + : retryAfterHeader * 1e3; // Retry-After is in seconds + } + + const retryTimeout = + retryAfterHeader > 0 + ? Math.min(retryAfterHeader, maxTimeout) + : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); + + setTimeout(() => cb(null), retryTimeout); + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = parseHeaders(rawHeaders); + + this.retryCount += 1; + + if (statusCode >= 300) { + if (this.retryOpts.statusCodes.includes(statusCode) === false) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } else { + this.abort( + new RequestRetryError('Request failed', statusCode, { + headers, + data: { + count: this.retryCount + } + }) + ); + return false + } + } + + // Checkpoint for resume from where we left it + if (this.resume != null) { + this.resume = null; + + // Only Partial Content 206 supposed to provide Content-Range, + // any other status code that partially consumed the payload + // should not be retry because it would result in downstream + // wrongly concatanete multiple responses. + if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { + this.abort( + new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false + } + + const contentRange = parseRangeHeader(headers['content-range']); + // If no content range + if (!contentRange) { + this.abort( + new RequestRetryError('Content-Range mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false + } + + // Let's start with a weak etag check + if (this.etag != null && this.etag !== headers.etag) { + this.abort( + new RequestRetryError('ETag mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) + ); + return false + } + + const { start, size, end = size - 1 } = contentRange; + + assert(this.start === start, 'content-range mismatch'); + assert(this.end == null || this.end === end, 'content-range mismatch'); + + this.resume = resume; + return true + } + + if (this.end == null) { + if (statusCode === 206) { + // First time we receive 206 + const range = parseRangeHeader(headers['content-range']); + + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + const { start, size, end = size - 1 } = range; + assert( + start != null && Number.isFinite(start), + 'content-range mismatch' + ); + assert(end != null && Number.isFinite(end), 'invalid content-length'); + + this.start = start; + this.end = end; + } + + // We make our best to checkpoint the body for further range headers + if (this.end == null) { + const contentLength = headers['content-length']; + this.end = contentLength != null ? Number(contentLength) - 1 : null; + } + + assert(Number.isFinite(this.start)); + assert( + this.end == null || Number.isFinite(this.end), + 'invalid content-length' + ); + + this.resume = resume; + this.etag = headers.etag != null ? headers.etag : null; + + // Weak etags are not useful for comparison nor cache + // for instance not safe to assume if the response is byte-per-byte + // equal + if (this.etag != null && this.etag.startsWith('W/')) { + this.etag = null; + } + + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + const err = new RequestRetryError('Request failed', statusCode, { + headers, + data: { count: this.retryCount } + }); + + this.abort(err); + + return false + } + + onData (chunk) { + this.start += chunk.length; + + return this.handler.onData(chunk) + } + + onComplete (rawTrailers) { + this.retryCount = 0; + return this.handler.onComplete(rawTrailers) + } + + onError (err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) + } + + // We reconcile in case of a mix between network errors + // and server error response + if (this.retryCount - this.retryCountCheckpoint > 0) { + // We count the difference between the last checkpoint and the current retry count + this.retryCount = + this.retryCountCheckpoint + + (this.retryCount - this.retryCountCheckpoint); + } else { + this.retryCount += 1; + } + + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ); + + function onRetry (err) { + if (err != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) + } + + if (this.start !== 0) { + const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }; + + // Weak etag check - weak etags will make comparison algorithms never match + if (this.etag != null) { + headers['if-match'] = this.etag; + } + + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + ...headers + } + }; + } + + try { + this.retryCountCheckpoint = this.retryCount; + this.dispatch(this.opts, this); + } catch (err) { + this.handler.onError(err); + } + } + } + } + + retryHandler = RetryHandler; + return retryHandler; +} + +var retryAgent; +var hasRequiredRetryAgent; + +function requireRetryAgent () { + if (hasRequiredRetryAgent) return retryAgent; + hasRequiredRetryAgent = 1; + + const Dispatcher = requireDispatcher(); + const RetryHandler = requireRetryHandler(); + + class RetryAgent extends Dispatcher { + #agent = null + #options = null + constructor (agent, options = {}) { + super(options); + this.#agent = agent; + this.#options = options; + } + + dispatch (opts, handler) { + const retry = new RetryHandler({ + ...opts, + retryOptions: this.#options + }, { + dispatch: this.#agent.dispatch.bind(this.#agent), + handler + }); + return this.#agent.dispatch(opts, retry) + } + + close () { + return this.#agent.close() + } + + destroy () { + return this.#agent.destroy() + } + } + + retryAgent = RetryAgent; + return retryAgent; +} + +var api = {}; + +var apiRequest = {exports: {}}; + +var readable; +var hasRequiredReadable; + +function requireReadable () { + if (hasRequiredReadable) return readable; + hasRequiredReadable = 1; + + const assert = require$$0$7; + const { Readable } = require$$0$8; + const { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = requireErrors$1(); + const util = requireUtil$9(); + const { ReadableStreamFrom } = requireUtil$9(); + + const kConsume = Symbol('kConsume'); + const kReading = Symbol('kReading'); + const kBody = Symbol('kBody'); + const kAbort = Symbol('kAbort'); + const kContentType = Symbol('kContentType'); + const kContentLength = Symbol('kContentLength'); + + const noop = () => {}; + + class BodyReadable extends Readable { + constructor ({ + resume, + abort, + contentType = '', + contentLength, + highWaterMark = 64 * 1024 // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }); + + this._readableState.dataEmitted = false; + + this[kAbort] = abort; + this[kConsume] = null; + this[kBody] = null; + this[kContentType] = contentType; + this[kContentLength] = contentLength; + + // Is stream being consumed through Readable API? + // This is an optimization so that we avoid checking + // for 'data' and 'readable' listeners in the hot path + // inside push(). + this[kReading] = false; + } + + destroy (err) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + + if (err) { + this[kAbort](); + } + + return super.destroy(err) + } + + _destroy (err, callback) { + // Workaround for Node "bug". If the stream is destroyed in same + // tick as it is created, then a user who is waiting for a + // promise (i.e micro tick) for installing a 'error' listener will + // never get a chance and will always encounter an unhandled exception. + if (!this[kReading]) { + setImmediate(() => { + callback(err); + }); + } else { + callback(err); + } + } + + on (ev, ...args) { + if (ev === 'data' || ev === 'readable') { + this[kReading] = true; + } + return super.on(ev, ...args) + } + + addListener (ev, ...args) { + return this.on(ev, ...args) + } + + off (ev, ...args) { + const ret = super.off(ev, ...args); + if (ev === 'data' || ev === 'readable') { + this[kReading] = ( + this.listenerCount('data') > 0 || + this.listenerCount('readable') > 0 + ); + } + return ret + } + + removeListener (ev, ...args) { + return this.off(ev, ...args) + } + + push (chunk) { + if (this[kConsume] && chunk !== null) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true + } + return super.push(chunk) + } + + // https://fetch.spec.whatwg.org/#dom-body-text + async text () { + return consume(this, 'text') + } + + // https://fetch.spec.whatwg.org/#dom-body-json + async json () { + return consume(this, 'json') + } + + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob () { + return consume(this, 'blob') + } + + // https://fetch.spec.whatwg.org/#dom-body-bytes + async bytes () { + return consume(this, 'bytes') + } + + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer () { + return consume(this, 'arrayBuffer') + } + + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData () { + // TODO: Implement. + throw new NotSupportedError() + } + + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed () { + return util.isDisturbed(this) + } + + // https://fetch.spec.whatwg.org/#dom-body-body + get body () { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + // TODO: Is this the best way to force a lock? + this[kBody].getReader(); // Ensure stream is locked. + assert(this[kBody].locked); + } + } + return this[kBody] + } + + async dump (opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024; + const signal = opts?.signal; + + if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) { + throw new InvalidArgumentError('signal must be an AbortSignal') + } + + signal?.throwIfAborted(); + + if (this._readableState.closeEmitted) { + return null + } + + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()); + } + + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal?.addEventListener('abort', onAbort); + + this + .on('close', function () { + signal?.removeEventListener('abort', onAbort); + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()); + } else { + resolve(null); + } + }) + .on('error', noop) + .on('data', function (chunk) { + limit -= chunk.length; + if (limit <= 0) { + this.destroy(); + } + }) + .resume(); + }) + } + } + + // https://streams.spec.whatwg.org/#readablestream-locked + function isLocked (self) { + // Consume is an implicit lock. + return (self[kBody] && self[kBody].locked === true) || self[kConsume] + } + + // https://fetch.spec.whatwg.org/#body-unusable + function isUnusable (self) { + return util.isDisturbed(self) || isLocked(self) + } + + async function consume (stream, type) { + assert(!stream[kConsume]); + + return new Promise((resolve, reject) => { + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream + .on('error', err => { + reject(err); + }) + .on('close', () => { + reject(new TypeError('unusable')); + }); + } else { + reject(rState.errored ?? new TypeError('unusable')); + } + } else { + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + + stream + .on('error', function (err) { + consumeFinish(this[kConsume], err); + }) + .on('close', function () { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + + consumeStart(stream[kConsume]); + }); + } + }) + } + + function consumeStart (consume) { + if (consume.body === null) { + return + } + + const { _readableState: state } = consume.stream; + + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume, state.buffer[n]); + } + } else { + for (const chunk of state.buffer) { + consumePush(consume, chunk); + } + } + + if (state.endEmitted) { + consumeEnd(this[kConsume]); + } else { + consume.stream.on('end', function () { + consumeEnd(this[kConsume]); + }); + } + + consume.stream.resume(); + + while (consume.stream.read() != null) { + // Loop + } + } + + /** + * @param {Buffer[]} chunks + * @param {number} length + */ + function chunksDecode (chunks, length) { + if (chunks.length === 0 || length === 0) { + return '' + } + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer.length; + + // Skip BOM. + const start = + bufferLength > 2 && + buffer[0] === 0xef && + buffer[1] === 0xbb && + buffer[2] === 0xbf + ? 3 + : 0; + return buffer.utf8Slice(start, bufferLength) + } + + /** + * @param {Buffer[]} chunks + * @param {number} length + * @returns {Uint8Array} + */ + function chunksConcat (chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0) + } + if (chunks.length === 1) { + // fast-path + return new Uint8Array(chunks[0]) + } + const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); + + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i]; + buffer.set(chunk, offset); + offset += chunk.length; + } + + return buffer + } + + function consumeEnd (consume) { + const { type, body, resolve, stream, length } = consume; + + try { + if (type === 'text') { + resolve(chunksDecode(body, length)); + } else if (type === 'json') { + resolve(JSON.parse(chunksDecode(body, length))); + } else if (type === 'arrayBuffer') { + resolve(chunksConcat(body, length).buffer); + } else if (type === 'blob') { + resolve(new Blob(body, { type: stream[kContentType] })); + } else if (type === 'bytes') { + resolve(chunksConcat(body, length)); + } + + consumeFinish(consume); + } catch (err) { + stream.destroy(err); + } + } + + function consumePush (consume, chunk) { + consume.length += chunk.length; + consume.body.push(chunk); + } + + function consumeFinish (consume, err) { + if (consume.body === null) { + return + } + + if (err) { + consume.reject(err); + } else { + consume.resolve(); + } + + consume.type = null; + consume.stream = null; + consume.resolve = null; + consume.reject = null; + consume.length = 0; + consume.body = null; + } + + readable = { Readable: BodyReadable, chunksDecode }; + return readable; +} + +var util$7; +var hasRequiredUtil$7; + +function requireUtil$7 () { + if (hasRequiredUtil$7) return util$7; + hasRequiredUtil$7 = 1; + const assert = require$$0$7; + const { + ResponseStatusCodeError + } = requireErrors$1(); + + const { chunksDecode } = requireReadable(); + const CHUNK_LIMIT = 128 * 1024; + + async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert(body); + + let chunks = []; + let length = 0; + + try { + for await (const chunk of body) { + chunks.push(chunk); + length += chunk.length; + if (length > CHUNK_LIMIT) { + chunks = []; + length = 0; + break + } + } + } catch { + chunks = []; + length = 0; + // Do nothing.... + } + + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`; + + if (statusCode === 204 || !contentType || !length) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))); + return + } + + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + let payload; + + try { + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)); + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length); + } + } catch { + // process in a callback to avoid throwing in the microtask queue + } finally { + Error.stackTraceLimit = stackTraceLimit; + } + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))); + } + + const isContentTypeApplicationJson = (contentType) => { + return ( + contentType.length > 15 && + contentType[11] === '/' && + contentType[0] === 'a' && + contentType[1] === 'p' && + contentType[2] === 'p' && + contentType[3] === 'l' && + contentType[4] === 'i' && + contentType[5] === 'c' && + contentType[6] === 'a' && + contentType[7] === 't' && + contentType[8] === 'i' && + contentType[9] === 'o' && + contentType[10] === 'n' && + contentType[12] === 'j' && + contentType[13] === 's' && + contentType[14] === 'o' && + contentType[15] === 'n' + ) + }; + + const isContentTypeText = (contentType) => { + return ( + contentType.length > 4 && + contentType[4] === '/' && + contentType[0] === 't' && + contentType[1] === 'e' && + contentType[2] === 'x' && + contentType[3] === 't' + ) + }; + + util$7 = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText + }; + return util$7; +} + +var hasRequiredApiRequest; + +function requireApiRequest () { + if (hasRequiredApiRequest) return apiRequest.exports; + hasRequiredApiRequest = 1; + + const assert = require$$0$7; + const { Readable } = requireReadable(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$1(); + const util = requireUtil$9(); + const { getResolveErrorBodyCallback } = requireUtil$7(); + const { AsyncResource } = require$$5$2; + + class RequestHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; + + try { + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) { + throw new InvalidArgumentError('invalid highWaterMark') + } + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_REQUEST'); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on('error', util.nop), err); + } + throw err + } + + this.method = method; + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body; + this.trailers = {}; + this.context = null; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError; + this.highWaterMark = highWaterMark; + this.signal = signal; + this.reason = null; + this.removeAbortListener = null; + + if (util.isStream(body)) { + body.on('error', (err) => { + this.onError(err); + }); + } + + if (this.signal) { + if (this.signal.aborted) { + this.reason = this.signal.reason ?? new RequestAbortedError(); + } else { + this.removeAbortListener = util.addAbortListener(this.signal, () => { + this.reason = this.signal.reason ?? new RequestAbortedError(); + if (this.res) { + util.destroy(this.res.on('error', util.nop), this.reason); + } else if (this.abort) { + this.abort(this.reason); + } + + if (this.removeAbortListener) { + this.res?.off('close', this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } + }); + } + } + } + + onConnect (abort, context) { + if (this.reason) { + abort(this.reason); + return + } + + assert(this.callback); + + this.abort = abort; + this.context = context; + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; + + const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return + } + + const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders['content-type']; + const contentLength = parsedHeaders['content-length']; + const res = new Readable({ + resume, + abort, + contentType, + contentLength: this.method !== 'HEAD' && contentLength + ? Number(contentLength) + : null, + highWaterMark + }); + + if (this.removeAbortListener) { + res.on('close', this.removeAbortListener); + } + + this.callback = null; + this.res = res; + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope(getResolveErrorBodyCallback, null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ); + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body: res, + context + }); + } + } + } + + onData (chunk) { + return this.res.push(chunk) + } + + onComplete (trailers) { + util.parseHeaders(trailers, this.trailers); + this.res.push(null); + } + + onError (err) { + const { res, callback, body, opaque } = this; + + if (callback) { + // TODO: Does this need queueMicrotask? + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + + if (res) { + this.res = null; + // Ensure all queued handlers are invoked before destroying res. + queueMicrotask(() => { + util.destroy(res, err); + }); + } + + if (body) { + this.body = null; + util.destroy(body, err); + } + + if (this.removeAbortListener) { + res?.off('close', this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; + } + } + } + + function request (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }); + }) + } + + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + + apiRequest.exports = request; + apiRequest.exports.RequestHandler = RequestHandler; + return apiRequest.exports; +} + +var abortSignal$1; +var hasRequiredAbortSignal; + +function requireAbortSignal () { + if (hasRequiredAbortSignal) return abortSignal$1; + hasRequiredAbortSignal = 1; + const { addAbortListener } = requireUtil$9(); + const { RequestAbortedError } = requireErrors$1(); + + const kListener = Symbol('kListener'); + const kSignal = Symbol('kSignal'); + + function abort (self) { + if (self.abort) { + self.abort(self[kSignal]?.reason); + } else { + self.reason = self[kSignal]?.reason ?? new RequestAbortedError(); + } + removeSignal(self); + } + + function addSignal (self, signal) { + self.reason = null; + + self[kSignal] = null; + self[kListener] = null; + + if (!signal) { + return + } + + if (signal.aborted) { + abort(self); + return + } + + self[kSignal] = signal; + self[kListener] = () => { + abort(self); + }; + + addAbortListener(self[kSignal], self[kListener]); + } + + function removeSignal (self) { + if (!self[kSignal]) { + return + } + + if ('removeEventListener' in self[kSignal]) { + self[kSignal].removeEventListener('abort', self[kListener]); + } else { + self[kSignal].removeListener('abort', self[kListener]); + } + + self[kSignal] = null; + self[kListener] = null; + } + + abortSignal$1 = { + addSignal, + removeSignal + }; + return abortSignal$1; +} + +var apiStream; +var hasRequiredApiStream; + +function requireApiStream () { + if (hasRequiredApiStream) return apiStream; + hasRequiredApiStream = 1; + + const assert = require$$0$7; + const { finished, PassThrough } = require$$0$8; + const { InvalidArgumentError, InvalidReturnValueError } = requireErrors$1(); + const util = requireUtil$9(); + const { getResolveErrorBodyCallback } = requireUtil$7(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal(); + + class StreamHandler extends AsyncResource { + constructor (opts, factory, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; + + try { + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('invalid factory') + } + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_STREAM'); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on('error', util.nop), err); + } + throw err + } + + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.trailers = null; + this.body = body; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError || false; + + if (util.isStream(body)) { + body.on('error', (err) => { + this.onError(err); + }); + } + + addSignal(this, signal); + } + + onConnect (abort, context) { + if (this.reason) { + abort(this.reason); + return + } + + assert(this.callback); + + this.abort = abort; + this.context = context; + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this; + + const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return + } + + this.factory = null; + + let res; + + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders['content-type']; + res = new PassThrough(); + + this.callback = null; + this.runInAsyncScope(getResolveErrorBodyCallback, null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ); + } else { + if (factory === null) { + return + } + + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }); + + if ( + !res || + typeof res.write !== 'function' || + typeof res.end !== 'function' || + typeof res.on !== 'function' + ) { + throw new InvalidReturnValueError('expected Writable') + } + + // TODO: Avoid finished. It registers an unnecessary amount of listeners. + finished(res, { readable: false }, (err) => { + const { callback, res, opaque, trailers, abort } = this; + + this.res = null; + if (err || !res.readable) { + util.destroy(res, err); + } + + this.callback = null; + this.runInAsyncScope(callback, null, err || null, { opaque, trailers }); + + if (err) { + abort(); + } + }); + } + + res.on('drain', resume); + + this.res = res; + + const needDrain = res.writableNeedDrain !== undefined + ? res.writableNeedDrain + : res._writableState?.needDrain; + + return needDrain !== true + } + + onData (chunk) { + const { res } = this; + + return res ? res.write(chunk) : true + } + + onComplete (trailers) { + const { res } = this; + + removeSignal(this); + + if (!res) { + return + } + + this.trailers = util.parseHeaders(trailers); + + res.end(); + } + + onError (err) { + const { res, callback, opaque, body } = this; + + removeSignal(this); + + this.factory = null; + + if (res) { + this.res = null; + util.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + + if (body) { + this.body = null; + util.destroy(body, err); + } + } + } + + function stream (opts, factory, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data) + }); + }) + } + + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)); + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + + apiStream = stream; + return apiStream; +} + +var apiPipeline; +var hasRequiredApiPipeline; + +function requireApiPipeline () { + if (hasRequiredApiPipeline) return apiPipeline; + hasRequiredApiPipeline = 1; + + const { + Readable, + Duplex, + PassThrough + } = require$$0$8; + const { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = requireErrors$1(); + const util = requireUtil$9(); + const { AsyncResource } = require$$5$2; + const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$7; + + const kResume = Symbol('resume'); + + class PipelineRequest extends Readable { + constructor () { + super({ autoDestroy: true }); + + this[kResume] = null; + } + + _read () { + const { [kResume]: resume } = this; + + if (resume) { + this[kResume] = null; + resume(); + } + } + + _destroy (err, callback) { + this._read(); + + callback(err); + } + } + + class PipelineResponse extends Readable { + constructor (resume) { + super({ autoDestroy: true }); + this[kResume] = resume; + } + + _read () { + this[kResume](); + } + + _destroy (err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + + callback(err); + } + } + + class PipelineHandler extends AsyncResource { + constructor (opts, handler) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + if (typeof handler !== 'function') { + throw new InvalidArgumentError('invalid handler') + } + + const { signal, method, opaque, onInfo, responseHeaders } = opts; + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_PIPELINE'); + + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + + this.req = new PipelineRequest().on('error', util.nop); + + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this; + + if (body?.resume) { + body.resume(); + } + }, + write: (chunk, encoding, callback) => { + const { req } = this; + + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback(); + } else { + req[kResume] = callback; + } + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this; + + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError(); + } + + if (abort && err) { + abort(); + } + + util.destroy(body, err); + util.destroy(req, err); + util.destroy(res, err); + + removeSignal(this); + + callback(err); + } + }).on('prefinish', () => { + const { req } = this; + + // Node < 15 does not call _final in same tick. + req.push(null); + }); + + this.res = null; + + addSignal(this, signal); + } + + onConnect (abort, context) { + const { ret, res } = this; + + if (this.reason) { + abort(this.reason); + return + } + + assert(!res, 'pipeline cannot be retried'); + assert(!ret.destroyed); + + this.abort = abort; + this.context = context; + } + + onHeaders (statusCode, rawHeaders, resume) { + const { opaque, handler, context } = this; + + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.onInfo({ statusCode, headers }); + } + return + } + + this.res = new PipelineResponse(resume); + + let body; + try { + this.handler = null; + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + body = this.runInAsyncScope(handler, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }); + } catch (err) { + this.res.on('error', util.nop); + throw err + } + + if (!body || typeof body.on !== 'function') { + throw new InvalidReturnValueError('expected Readable') + } + + body + .on('data', (chunk) => { + const { ret, body } = this; + + if (!ret.push(chunk) && body.pause) { + body.pause(); + } + }) + .on('error', (err) => { + const { ret } = this; + + util.destroy(ret, err); + }) + .on('end', () => { + const { ret } = this; + + ret.push(null); + }) + .on('close', () => { + const { ret } = this; + + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError()); + } + }); + + this.body = body; + } + + onData (chunk) { + const { res } = this; + return res.push(chunk) + } + + onComplete (trailers) { + const { res } = this; + res.push(null); + } + + onError (err) { + const { ret } = this; + this.handler = null; + util.destroy(ret, err); + } + } + + function pipeline (opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret + } catch (err) { + return new PassThrough().destroy(err) + } + } + + apiPipeline = pipeline; + return apiPipeline; +} + +var apiUpgrade; +var hasRequiredApiUpgrade; + +function requireApiUpgrade () { + if (hasRequiredApiUpgrade) return apiUpgrade; + hasRequiredApiUpgrade = 1; + + const { InvalidArgumentError, SocketError } = requireErrors$1(); + const { AsyncResource } = require$$5$2; + const util = requireUtil$9(); + const { addSignal, removeSignal } = requireAbortSignal(); + const assert = require$$0$7; + + class UpgradeHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + const { signal, opaque, responseHeaders } = opts; + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + super('UNDICI_UPGRADE'); + + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + + addSignal(this, signal); + } + + onConnect (abort, context) { + if (this.reason) { + abort(this.reason); + return + } + + assert(this.callback); + + this.abort = abort; + this.context = null; + } + + onHeaders () { + throw new SocketError('bad upgrade', null) + } + + onUpgrade (statusCode, rawHeaders, socket) { + assert(statusCode === 101); + + const { callback, opaque, context } = this; + + removeSignal(this); + + this.callback = null; + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }); + } + + onError (err) { + const { callback, opaque } = this; + + removeSignal(this); + + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + } + + function upgrade (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }); + }) + } + + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + this.dispatch({ + ...opts, + method: opts.method || 'GET', + upgrade: opts.protocol || 'Websocket' + }, upgradeHandler); + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + + apiUpgrade = upgrade; + return apiUpgrade; +} + +var apiConnect; +var hasRequiredApiConnect; + +function requireApiConnect () { + if (hasRequiredApiConnect) return apiConnect; + hasRequiredApiConnect = 1; + + const assert = require$$0$7; + const { AsyncResource } = require$$5$2; + const { InvalidArgumentError, SocketError } = requireErrors$1(); + const util = requireUtil$9(); + const { addSignal, removeSignal } = requireAbortSignal(); + + class ConnectHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + const { signal, opaque, responseHeaders } = opts; + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + super('UNDICI_CONNECT'); + + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.callback = callback; + this.abort = null; + + addSignal(this, signal); + } + + onConnect (abort, context) { + if (this.reason) { + abort(this.reason); + return + } + + assert(this.callback); + + this.abort = abort; + this.context = context; + } + + onHeaders () { + throw new SocketError('bad connect', null) + } + + onUpgrade (statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + + removeSignal(this); + + this.callback = null; + + let headers = rawHeaders; + // Indicates is an HTTP2Session + if (headers != null) { + headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + } + + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context + }); + } + + onError (err) { + const { callback, opaque } = this; + + removeSignal(this); + + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + } + + function connect (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }); + }) + } + + try { + const connectHandler = new ConnectHandler(opts, callback); + this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler); + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + + apiConnect = connect; + return apiConnect; +} + +var hasRequiredApi; + +function requireApi () { + if (hasRequiredApi) return api; + hasRequiredApi = 1; + + api.request = requireApiRequest(); + api.stream = requireApiStream(); + api.pipeline = requireApiPipeline(); + api.upgrade = requireApiUpgrade(); + api.connect = requireApiConnect(); + return api; +} + +var mockErrors; +var hasRequiredMockErrors; + +function requireMockErrors () { + if (hasRequiredMockErrors) return mockErrors; + hasRequiredMockErrors = 1; + + const { UndiciError } = requireErrors$1(); + + const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED'); + + /** + * The request does not match any registered mock dispatches. + */ + class MockNotMatchedError extends UndiciError { + constructor (message) { + super(message); + Error.captureStackTrace(this, MockNotMatchedError); + this.name = 'MockNotMatchedError'; + this.message = message || 'The request does not match any registered mock dispatches'; + this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'; + } + + static [Symbol.hasInstance] (instance) { + return instance && instance[kMockNotMatchedError] === true + } + + [kMockNotMatchedError] = true + } + + mockErrors = { + MockNotMatchedError + }; + return mockErrors; +} + +var mockSymbols; +var hasRequiredMockSymbols; + +function requireMockSymbols () { + if (hasRequiredMockSymbols) return mockSymbols; + hasRequiredMockSymbols = 1; + + mockSymbols = { + kAgent: Symbol('agent'), + kOptions: Symbol('options'), + kFactory: Symbol('factory'), + kDispatches: Symbol('dispatches'), + kDispatchKey: Symbol('dispatch key'), + kDefaultHeaders: Symbol('default headers'), + kDefaultTrailers: Symbol('default trailers'), + kContentLength: Symbol('content length'), + kMockAgent: Symbol('mock agent'), + kMockAgentSet: Symbol('mock agent set'), + kMockAgentGet: Symbol('mock agent get'), + kMockDispatch: Symbol('mock dispatch'), + kClose: Symbol('close'), + kOriginalClose: Symbol('original agent close'), + kOrigin: Symbol('origin'), + kIsMockActive: Symbol('is mock active'), + kNetConnect: Symbol('net connect'), + kGetNetConnect: Symbol('get net connect'), + kConnected: Symbol('connected') + }; + return mockSymbols; +} + +var mockUtils; +var hasRequiredMockUtils; + +function requireMockUtils () { + if (hasRequiredMockUtils) return mockUtils; + hasRequiredMockUtils = 1; + + const { MockNotMatchedError } = requireMockErrors(); + const { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect + } = requireMockSymbols(); + const { buildURL } = requireUtil$9(); + const { STATUS_CODES } = require$$2; + const { + types: { + isPromise + } + } = require$$0$a; + + function matchValue (match, value) { + if (typeof match === 'string') { + return match === value + } + if (match instanceof RegExp) { + return match.test(value) + } + if (typeof match === 'function') { + return match(value) === true + } + return false + } + + function lowerCaseEntries (headers) { + return Object.fromEntries( + Object.entries(headers).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue] + }) + ) + } + + /** + * @param {import('../../index').Headers|string[]|Record} headers + * @param {string} key + */ + function getHeaderByName (headers, key) { + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers[i + 1] + } + } + + return undefined + } else if (typeof headers.get === 'function') { + return headers.get(key) + } else { + return lowerCaseEntries(headers)[key.toLocaleLowerCase()] + } + } + + /** @param {string[]} headers */ + function buildHeadersFromArray (headers) { // fetch HeadersList + const clone = headers.slice(); + const entries = []; + for (let index = 0; index < clone.length; index += 2) { + entries.push([clone[index], clone[index + 1]]); + } + return Object.fromEntries(entries) + } + + function matchHeaders (mockDispatch, headers) { + if (typeof mockDispatch.headers === 'function') { + if (Array.isArray(headers)) { // fetch HeadersList + headers = buildHeadersFromArray(headers); + } + return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {}) + } + if (typeof mockDispatch.headers === 'undefined') { + return true + } + if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') { + return false + } + + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) { + const headerValue = getHeaderByName(headers, matchHeaderName); + + if (!matchValue(matchHeaderValue, headerValue)) { + return false + } + } + return true + } + + function safeUrl (path) { + if (typeof path !== 'string') { + return path + } + + const pathSegments = path.split('?'); + + if (pathSegments.length !== 2) { + return path + } + + const qp = new URLSearchParams(pathSegments.pop()); + qp.sort(); + return [...pathSegments, qp.toString()].join('?') + } + + function matchKey (mockDispatch, { path, method, body, headers }) { + const pathMatch = matchValue(mockDispatch.path, path); + const methodMatch = matchValue(mockDispatch.method, method); + const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true; + const headersMatch = matchHeaders(mockDispatch, headers); + return pathMatch && methodMatch && bodyMatch && headersMatch + } + + function getResponseData (data) { + if (Buffer.isBuffer(data)) { + return data + } else if (data instanceof Uint8Array) { + return data + } else if (data instanceof ArrayBuffer) { + return data + } else if (typeof data === 'object') { + return JSON.stringify(data) + } else { + return data.toString() + } + } + + function getMockDispatch (mockDispatches, key) { + const basePath = key.query ? buildURL(key.path, key.query) : key.path; + const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath; + + // Match path + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) + } + + // Match method + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`) + } + + // Match body + matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`) + } + + // Match headers + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)); + if (matchedMockDispatches.length === 0) { + const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers; + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`) + } + + return matchedMockDispatches[0] + } + + function addMockDispatch (mockDispatches, key, data) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; + const replyData = typeof data === 'function' ? { callback: data } : { ...data }; + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; + mockDispatches.push(newMockDispatch); + return newMockDispatch + } + + function deleteMockDispatch (mockDispatches, key) { + const index = mockDispatches.findIndex(dispatch => { + if (!dispatch.consumed) { + return false + } + return matchKey(dispatch, key) + }); + if (index !== -1) { + mockDispatches.splice(index, 1); + } + } + + function buildKey (opts) { + const { path, method, body, headers, query } = opts; + return { + path, + method, + body, + headers, + query + } + } + + function generateKeyValues (data) { + const keys = Object.keys(data); + const result = []; + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + const value = data[key]; + const name = Buffer.from(`${key}`); + if (Array.isArray(value)) { + for (let j = 0; j < value.length; ++j) { + result.push(name, Buffer.from(`${value[j]}`)); + } + } else { + result.push(name, Buffer.from(`${value}`)); + } + } + return result + } + + /** + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status + * @param {number} statusCode + */ + function getStatusText (statusCode) { + return STATUS_CODES[statusCode] || 'unknown' + } + + async function getResponse (body) { + const buffers = []; + for await (const data of body) { + buffers.push(data); + } + return Buffer.concat(buffers).toString('utf8') + } + + /** + * Mock dispatch function used to simulate undici dispatches + */ + function mockDispatch (opts, handler) { + // Get mock dispatch from built key + const key = buildKey(opts); + const mockDispatch = getMockDispatch(this[kDispatches], key); + + mockDispatch.timesInvoked++; + + // Here's where we resolve a callback if a callback is present for the dispatch data. + if (mockDispatch.data.callback) { + mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }; + } + + // Parse mockDispatch data + const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch; + const { timesInvoked, times } = mockDispatch; + + // If it's used up and not persistent, mark as consumed + mockDispatch.consumed = !persist && timesInvoked >= times; + mockDispatch.pending = timesInvoked < times; + + // If specified, trigger dispatch error + if (error !== null) { + deleteMockDispatch(this[kDispatches], key); + handler.onError(error); + return true + } + + // Handle the request with a delay if necessary + if (typeof delay === 'number' && delay > 0) { + setTimeout(() => { + handleReply(this[kDispatches]); + }, delay); + } else { + handleReply(this[kDispatches]); + } + + function handleReply (mockDispatches, _data = data) { + // fetch's HeadersList is a 1D string array + const optsHeaders = Array.isArray(opts.headers) + ? buildHeadersFromArray(opts.headers) + : opts.headers; + const body = typeof _data === 'function' + ? _data({ ...opts, headers: optsHeaders }) + : _data; + + // util.types.isPromise is likely needed for jest. + if (isPromise(body)) { + // If handleReply is asynchronous, throwing an error + // in the callback will reject the promise, rather than + // synchronously throw the error, which breaks some tests. + // Rather, we wait for the callback to resolve if it is a + // promise, and then re-run handleReply with the new body. + body.then((newData) => handleReply(mockDispatches, newData)); + return + } + + const responseData = getResponseData(body); + const responseHeaders = generateKeyValues(headers); + const responseTrailers = generateKeyValues(trailers); + + handler.onConnect?.(err => handler.onError(err), null); + handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler.onData?.(Buffer.from(responseData)); + handler.onComplete?.(responseTrailers); + deleteMockDispatch(mockDispatches, key); + } + + function resume () {} + + return true + } + + function buildMockDispatch () { + const agent = this[kMockAgent]; + const origin = this[kOrigin]; + const originalDispatch = this[kOriginalDispatch]; + + return function dispatch (opts, handler) { + if (agent.isMockActive) { + try { + mockDispatch.call(this, opts, handler); + } catch (error) { + if (error instanceof MockNotMatchedError) { + const netConnect = agent[kGetNetConnect](); + if (netConnect === false) { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`) + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler); + } else { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`) + } + } else { + throw error + } + } + } else { + originalDispatch.call(this, opts, handler); + } + } + } + + function checkNetConnect (netConnect, origin) { + const url = new URL(origin); + if (netConnect === true) { + return true + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true + } + return false + } + + function buildMockOptions (opts) { + if (opts) { + const { agent, ...mockOptions } = opts; + return mockOptions + } + } + + mockUtils = { + getResponseData, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildMockOptions, + getHeaderByName, + buildHeadersFromArray + }; + return mockUtils; +} + +var mockInterceptor = {}; + +var hasRequiredMockInterceptor; + +function requireMockInterceptor () { + if (hasRequiredMockInterceptor) return mockInterceptor; + hasRequiredMockInterceptor = 1; + + const { getResponseData, buildKey, addMockDispatch } = requireMockUtils(); + const { + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch + } = requireMockSymbols(); + const { InvalidArgumentError } = requireErrors$1(); + const { buildURL } = requireUtil$9(); + + /** + * Defines the scope API for an interceptor reply + */ + class MockScope { + constructor (mockDispatch) { + this[kMockDispatch] = mockDispatch; + } + + /** + * Delay a reply by a set amount in ms. + */ + delay (waitInMs) { + if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError('waitInMs must be a valid integer > 0') + } + + this[kMockDispatch].delay = waitInMs; + return this + } + + /** + * For a defined reply, never mark as consumed. + */ + persist () { + this[kMockDispatch].persist = true; + return this + } + + /** + * Allow one to define a reply for a set amount of matching requests. + */ + times (repeatTimes) { + if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError('repeatTimes must be a valid integer > 0') + } + + this[kMockDispatch].times = repeatTimes; + return this + } + } + + /** + * Defines an interceptor for a Mock + */ + class MockInterceptor { + constructor (opts, mockDispatches) { + if (typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object') + } + if (typeof opts.path === 'undefined') { + throw new InvalidArgumentError('opts.path must be defined') + } + if (typeof opts.method === 'undefined') { + opts.method = 'GET'; + } + // See https://github.com/nodejs/undici/issues/1245 + // As per RFC 3986, clients are not supposed to send URI + // fragments to servers when they retrieve a document, + if (typeof opts.path === 'string') { + if (opts.query) { + opts.path = buildURL(opts.path, opts.query); + } else { + // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811 + const parsedURL = new URL(opts.path, 'data://'); + opts.path = parsedURL.pathname + parsedURL.search; + } + } + if (typeof opts.method === 'string') { + opts.method = opts.method.toUpperCase(); + } + + this[kDispatchKey] = buildKey(opts); + this[kDispatches] = mockDispatches; + this[kDefaultHeaders] = {}; + this[kDefaultTrailers] = {}; + this[kContentLength] = false; + } + + createMockScopeDispatchData ({ statusCode, data, responseOptions }) { + const responseData = getResponseData(data); + const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}; + const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; + + return { statusCode, data, headers, trailers } + } + + validateReplyParameters (replyParameters) { + if (typeof replyParameters.statusCode === 'undefined') { + throw new InvalidArgumentError('statusCode must be defined') + } + if (typeof replyParameters.responseOptions !== 'object' || replyParameters.responseOptions === null) { + throw new InvalidArgumentError('responseOptions must be an object') + } + } + + /** + * Mock an undici request with a defined reply. + */ + reply (replyOptionsCallbackOrStatusCode) { + // Values of reply aren't available right now as they + // can only be available when the reply callback is invoked. + if (typeof replyOptionsCallbackOrStatusCode === 'function') { + // We'll first wrap the provided callback in another function, + // this function will properly resolve the data from the callback + // when invoked. + const wrappedDefaultsCallback = (opts) => { + // Our reply options callback contains the parameter for statusCode, data and options. + const resolvedData = replyOptionsCallbackOrStatusCode(opts); + + // Check if it is in the right format + if (typeof resolvedData !== 'object' || resolvedData === null) { + throw new InvalidArgumentError('reply options callback must return an object') + } + + const replyParameters = { data: '', responseOptions: {}, ...resolvedData }; + this.validateReplyParameters(replyParameters); + // Since the values can be obtained immediately we return them + // from this higher order function that will be resolved later. + return { + ...this.createMockScopeDispatchData(replyParameters) + } + }; + + // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); + return new MockScope(newMockDispatch) + } + + // We can have either one or three parameters, if we get here, + // we should have 1-3 parameters. So we spread the arguments of + // this function to obtain the parameters, since replyData will always + // just be the statusCode. + const replyParameters = { + statusCode: replyOptionsCallbackOrStatusCode, + data: arguments[1] === undefined ? '' : arguments[1], + responseOptions: arguments[2] === undefined ? {} : arguments[2] + }; + this.validateReplyParameters(replyParameters); + + // Send in-already provided data like usual + const dispatchData = this.createMockScopeDispatchData(replyParameters); + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); + return new MockScope(newMockDispatch) + } + + /** + * Mock an undici request with a defined error. + */ + replyWithError (error) { + if (typeof error === 'undefined') { + throw new InvalidArgumentError('error must be defined') + } + + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }); + return new MockScope(newMockDispatch) + } + + /** + * Set default reply headers on the interceptor for subsequent replies + */ + defaultReplyHeaders (headers) { + if (typeof headers === 'undefined') { + throw new InvalidArgumentError('headers must be defined') + } + + this[kDefaultHeaders] = headers; + return this + } + + /** + * Set default reply trailers on the interceptor for subsequent replies + */ + defaultReplyTrailers (trailers) { + if (typeof trailers === 'undefined') { + throw new InvalidArgumentError('trailers must be defined') + } + + this[kDefaultTrailers] = trailers; + return this + } + + /** + * Set reply content length header for replies on the interceptor + */ + replyContentLength () { + this[kContentLength] = true; + return this + } + } + + mockInterceptor.MockInterceptor = MockInterceptor; + mockInterceptor.MockScope = MockScope; + return mockInterceptor; +} + +var mockClient; +var hasRequiredMockClient; + +function requireMockClient () { + if (hasRequiredMockClient) return mockClient; + hasRequiredMockClient = 1; + + const { promisify } = require$$0$a; + const Client = requireClient(); + const { buildMockDispatch } = requireMockUtils(); + const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = requireMockSymbols(); + const { MockInterceptor } = requireMockInterceptor(); + const Symbols = requireSymbols$4(); + const { InvalidArgumentError } = requireErrors$1(); + + /** + * MockClient provides an API that extends the Client to influence the mockDispatches. + */ + class MockClient extends Client { + constructor (origin, opts) { + super(origin, opts); + + if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + + get [Symbols.kConnected] () { + return this[kConnected] + } + + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept (opts) { + return new MockInterceptor(opts, this[kDispatches]) + } + + async [kClose] () { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + } + + mockClient = MockClient; + return mockClient; +} + +var mockPool; +var hasRequiredMockPool; + +function requireMockPool () { + if (hasRequiredMockPool) return mockPool; + hasRequiredMockPool = 1; + + const { promisify } = require$$0$a; + const Pool = requirePool(); + const { buildMockDispatch } = requireMockUtils(); + const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = requireMockSymbols(); + const { MockInterceptor } = requireMockInterceptor(); + const Symbols = requireSymbols$4(); + const { InvalidArgumentError } = requireErrors$1(); + + /** + * MockPool provides an API that extends the Pool to influence the mockDispatches. + */ + class MockPool extends Pool { + constructor (origin, opts) { + super(origin, opts); + + if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + + get [Symbols.kConnected] () { + return this[kConnected] + } + + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept (opts) { + return new MockInterceptor(opts, this[kDispatches]) + } + + async [kClose] () { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + } + + mockPool = MockPool; + return mockPool; +} + +var pluralizer; +var hasRequiredPluralizer; + +function requirePluralizer () { + if (hasRequiredPluralizer) return pluralizer; + hasRequiredPluralizer = 1; + + const singulars = { + pronoun: 'it', + is: 'is', + was: 'was', + this: 'this' + }; + + const plurals = { + pronoun: 'they', + is: 'are', + was: 'were', + this: 'these' + }; + + pluralizer = class Pluralizer { + constructor (singular, plural) { + this.singular = singular; + this.plural = plural; + } + + pluralize (count) { + const one = count === 1; + const keys = one ? singulars : plurals; + const noun = one ? this.singular : this.plural; + return { ...keys, count, noun } + } + }; + return pluralizer; +} + +var pendingInterceptorsFormatter; +var hasRequiredPendingInterceptorsFormatter; + +function requirePendingInterceptorsFormatter () { + if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter; + hasRequiredPendingInterceptorsFormatter = 1; + + const { Transform } = require$$0$8; + const { Console } = require$$1$6; + + const PERSISTENT = process.versions.icu ? '✅' : 'Y '; + const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '; + + /** + * Gets the output of `console.table(…)` as a string. + */ + pendingInterceptorsFormatter = class PendingInterceptorsFormatter { + constructor ({ disableColors } = {}) { + this.transform = new Transform({ + transform (chunk, _enc, cb) { + cb(null, chunk); + } + }); + + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }); + } + + format (pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map( + ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + 'Status code': statusCode, + Persistent: persist ? PERSISTENT : NOT_PERSISTENT, + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + })); + + this.logger.table(withPrettyHeaders); + return this.transform.read().toString() + } + }; + return pendingInterceptorsFormatter; +} + +var mockAgent; +var hasRequiredMockAgent; + +function requireMockAgent () { + if (hasRequiredMockAgent) return mockAgent; + hasRequiredMockAgent = 1; + + const { kClients } = requireSymbols$4(); + const Agent = requireAgent(); + const { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory + } = requireMockSymbols(); + const MockClient = requireMockClient(); + const MockPool = requireMockPool(); + const { matchValue, buildMockOptions } = requireMockUtils(); + const { InvalidArgumentError, UndiciError } = requireErrors$1(); + const Dispatcher = requireDispatcher(); + const Pluralizer = requirePluralizer(); + const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter(); + + class MockAgent extends Dispatcher { + constructor (opts) { + super(opts); + + this[kNetConnect] = true; + this[kIsMockActive] = true; + + // Instantiate Agent and encapsulate + if ((opts?.agent && typeof opts.agent.dispatch !== 'function')) { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + const agent = opts?.agent ? opts.agent : new Agent(opts); + this[kAgent] = agent; + + this[kClients] = agent[kClients]; + this[kOptions] = buildMockOptions(opts); + } + + get (origin) { + let dispatcher = this[kMockAgentGet](origin); + + if (!dispatcher) { + dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + } + return dispatcher + } + + dispatch (opts, handler) { + // Call MockAgent.get to perform additional setup before dispatching as normal + this.get(opts.origin); + return this[kAgent].dispatch(opts, handler) + } + + async close () { + await this[kAgent].close(); + this[kClients].clear(); + } + + deactivate () { + this[kIsMockActive] = false; + } + + activate () { + this[kIsMockActive] = true; + } + + enableNetConnect (matcher) { + if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher); + } else { + this[kNetConnect] = [matcher]; + } + } else if (typeof matcher === 'undefined') { + this[kNetConnect] = true; + } else { + throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.') + } + } + + disableNetConnect () { + this[kNetConnect] = false; + } + + // This is required to bypass issues caused by using global symbols - see: + // https://github.com/nodejs/undici/issues/1447 + get isMockActive () { + return this[kIsMockActive] + } + + [kMockAgentSet] (origin, dispatcher) { + this[kClients].set(origin, dispatcher); + } + + [kFactory] (origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]); + return this[kOptions] && this[kOptions].connections === 1 + ? new MockClient(origin, mockOptions) + : new MockPool(origin, mockOptions) + } + + [kMockAgentGet] (origin) { + // First check if we can immediately find it + const client = this[kClients].get(origin); + if (client) { + return client + } + + // If the origin is not a string create a dummy parent pool and return to user + if (typeof origin !== 'string') { + const dispatcher = this[kFactory]('http://localhost:9999'); + this[kMockAgentSet](origin, dispatcher); + return dispatcher + } + + // If we match, create a pool and assign the same dispatches + for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) { + if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { + const dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; + return dispatcher + } + } + } + + [kGetNetConnect] () { + return this[kNetConnect] + } + + pendingInterceptors () { + const mockAgentClients = this[kClients]; + + return Array.from(mockAgentClients.entries()) + .flatMap(([origin, scope]) => scope[kDispatches].map(dispatch => ({ ...dispatch, origin }))) + .filter(({ pending }) => pending) + } + + assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { + const pending = this.pendingInterceptors(); + + if (pending.length === 0) { + return + } + + const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length); + + throw new UndiciError(` +${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: + +${pendingInterceptorsFormatter.format(pending)} +`.trim()) + } + } + + mockAgent = MockAgent; + return mockAgent; +} + +var global$1; +var hasRequiredGlobal; + +function requireGlobal () { + if (hasRequiredGlobal) return global$1; + hasRequiredGlobal = 1; + + // We include a version number for the Dispatcher API. In case of breaking changes, + // this version number must be increased to avoid conflicts. + const globalDispatcher = Symbol.for('undici.globalDispatcher.1'); + const { InvalidArgumentError } = requireErrors$1(); + const Agent = requireAgent(); + + if (getGlobalDispatcher() === undefined) { + setGlobalDispatcher(new Agent()); + } + + function setGlobalDispatcher (agent) { + if (!agent || typeof agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument agent must implement Agent') + } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }); + } + + function getGlobalDispatcher () { + return globalThis[globalDispatcher] + } + + global$1 = { + setGlobalDispatcher, + getGlobalDispatcher + }; + return global$1; +} + +var decoratorHandler; +var hasRequiredDecoratorHandler; + +function requireDecoratorHandler () { + if (hasRequiredDecoratorHandler) return decoratorHandler; + hasRequiredDecoratorHandler = 1; + + decoratorHandler = class DecoratorHandler { + #handler + + constructor (handler) { + if (typeof handler !== 'object' || handler === null) { + throw new TypeError('handler must be an object') + } + this.#handler = handler; + } + + onConnect (...args) { + return this.#handler.onConnect?.(...args) + } + + onError (...args) { + return this.#handler.onError?.(...args) + } + + onUpgrade (...args) { + return this.#handler.onUpgrade?.(...args) + } + + onResponseStarted (...args) { + return this.#handler.onResponseStarted?.(...args) + } + + onHeaders (...args) { + return this.#handler.onHeaders?.(...args) + } + + onData (...args) { + return this.#handler.onData?.(...args) + } + + onComplete (...args) { + return this.#handler.onComplete?.(...args) + } + + onBodySent (...args) { + return this.#handler.onBodySent?.(...args) + } + }; + return decoratorHandler; +} + +var redirect; +var hasRequiredRedirect; + +function requireRedirect () { + if (hasRequiredRedirect) return redirect; + hasRequiredRedirect = 1; + const RedirectHandler = requireRedirectHandler(); + + redirect = opts => { + const globalMaxRedirections = opts?.maxRedirections; + return dispatch => { + return function redirectInterceptor (opts, handler) { + const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts; + + if (!maxRedirections) { + return dispatch(opts, handler) + } + + const redirectHandler = new RedirectHandler( + dispatch, + maxRedirections, + opts, + handler + ); + + return dispatch(baseOpts, redirectHandler) + } + } + }; + return redirect; +} + +var retry; +var hasRequiredRetry; + +function requireRetry () { + if (hasRequiredRetry) return retry; + hasRequiredRetry = 1; + const RetryHandler = requireRetryHandler(); + + retry = globalOpts => { + return dispatch => { + return function retryInterceptor (opts, handler) { + return dispatch( + opts, + new RetryHandler( + { ...opts, retryOptions: { ...globalOpts, ...opts.retryOptions } }, + { + handler, + dispatch + } + ) + ) + } + } + }; + return retry; +} + +var dump; +var hasRequiredDump; + +function requireDump () { + if (hasRequiredDump) return dump; + hasRequiredDump = 1; + + const util = requireUtil$9(); + const { InvalidArgumentError, RequestAbortedError } = requireErrors$1(); + const DecoratorHandler = requireDecoratorHandler(); + + class DumpHandler extends DecoratorHandler { + #maxSize = 1024 * 1024 + #abort = null + #dumped = false + #aborted = false + #size = 0 + #reason = null + #handler = null + + constructor ({ maxSize }, handler) { + super(handler); + + if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { + throw new InvalidArgumentError('maxSize must be a number greater than 0') + } + + this.#maxSize = maxSize ?? this.#maxSize; + this.#handler = handler; + } + + onConnect (abort) { + this.#abort = abort; + + this.#handler.onConnect(this.#customAbort.bind(this)); + } + + #customAbort (reason) { + this.#aborted = true; + this.#reason = reason; + } + + // TODO: will require adjustment after new hooks are out + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = util.parseHeaders(rawHeaders); + const contentLength = headers['content-length']; + + if (contentLength != null && contentLength > this.#maxSize) { + throw new RequestAbortedError( + `Response size (${contentLength}) larger than maxSize (${ + this.#maxSize + })` + ) + } + + if (this.#aborted) { + return true + } + + return this.#handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + onError (err) { + if (this.#dumped) { + return + } + + err = this.#reason ?? err; + + this.#handler.onError(err); + } + + onData (chunk) { + this.#size = this.#size + chunk.length; + + if (this.#size >= this.#maxSize) { + this.#dumped = true; + + if (this.#aborted) { + this.#handler.onError(this.#reason); + } else { + this.#handler.onComplete([]); + } + } + + return true + } + + onComplete (trailers) { + if (this.#dumped) { + return + } + + if (this.#aborted) { + this.#handler.onError(this.reason); + return + } + + this.#handler.onComplete(trailers); + } + } + + function createDumpInterceptor ( + { maxSize: defaultMaxSize } = { + maxSize: 1024 * 1024 + } + ) { + return dispatch => { + return function Intercept (opts, handler) { + const { dumpMaxSize = defaultMaxSize } = + opts; + + const dumpHandler = new DumpHandler( + { maxSize: dumpMaxSize }, + handler + ); + + return dispatch(opts, dumpHandler) + } + } + } + + dump = createDumpInterceptor; + return dump; +} + +var dns; +var hasRequiredDns; + +function requireDns () { + if (hasRequiredDns) return dns; + hasRequiredDns = 1; + const { isIP } = require$$0$9; + const { lookup } = require$$1$7; + const DecoratorHandler = requireDecoratorHandler(); + const { InvalidArgumentError, InformationalError } = requireErrors$1(); + const maxInt = Math.pow(2, 31) - 1; + + class DNSInstance { + #maxTTL = 0 + #maxItems = 0 + #records = new Map() + dualStack = true + affinity = null + lookup = null + pick = null + + constructor (opts) { + this.#maxTTL = opts.maxTTL; + this.#maxItems = opts.maxItems; + this.dualStack = opts.dualStack; + this.affinity = opts.affinity; + this.lookup = opts.lookup ?? this.#defaultLookup; + this.pick = opts.pick ?? this.#defaultPick; + } + + get full () { + return this.#records.size === this.#maxItems + } + + runLookup (origin, opts, cb) { + const ips = this.#records.get(origin.hostname); + + // If full, we just return the origin + if (ips == null && this.full) { + cb(null, origin.origin); + return + } + + const newOpts = { + affinity: this.affinity, + dualStack: this.dualStack, + lookup: this.lookup, + pick: this.pick, + ...opts.dns, + maxTTL: this.#maxTTL, + maxItems: this.#maxItems + }; + + // If no IPs we lookup + if (ips == null) { + this.lookup(origin, newOpts, (err, addresses) => { + if (err || addresses == null || addresses.length === 0) { + cb(err ?? new InformationalError('No DNS entries found')); + return + } + + this.setRecords(origin, addresses); + const records = this.#records.get(origin.hostname); + + const ip = this.pick( + origin, + records, + newOpts.affinity + ); + + let port; + if (typeof ip.port === 'number') { + port = `:${ip.port}`; + } else if (origin.port !== '') { + port = `:${origin.port}`; + } else { + port = ''; + } + + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` + ); + }); + } else { + // If there's IPs we pick + const ip = this.pick( + origin, + ips, + newOpts.affinity + ); + + // If no IPs we lookup - deleting old records + if (ip == null) { + this.#records.delete(origin.hostname); + this.runLookup(origin, opts, cb); + return + } + + let port; + if (typeof ip.port === 'number') { + port = `:${ip.port}`; + } else if (origin.port !== '') { + port = `:${origin.port}`; + } else { + port = ''; + } + + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` + ); + } + } + + #defaultLookup (origin, opts, cb) { + lookup( + origin.hostname, + { + all: true, + family: this.dualStack === false ? this.affinity : 0, + order: 'ipv4first' + }, + (err, addresses) => { + if (err) { + return cb(err) + } + + const results = new Map(); + + for (const addr of addresses) { + // On linux we found duplicates, we attempt to remove them with + // the latest record + results.set(`${addr.address}:${addr.family}`, addr); + } + + cb(null, results.values()); + } + ); + } + + #defaultPick (origin, hostnameRecords, affinity) { + let ip = null; + const { records, offset } = hostnameRecords; + + let family; + if (this.dualStack) { + if (affinity == null) { + // Balance between ip families + if (offset == null || offset === maxInt) { + hostnameRecords.offset = 0; + affinity = 4; + } else { + hostnameRecords.offset++; + affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4; + } + } + + if (records[affinity] != null && records[affinity].ips.length > 0) { + family = records[affinity]; + } else { + family = records[affinity === 4 ? 6 : 4]; + } + } else { + family = records[affinity]; + } + + // If no IPs we return null + if (family == null || family.ips.length === 0) { + return ip + } + + if (family.offset == null || family.offset === maxInt) { + family.offset = 0; + } else { + family.offset++; + } + + const position = family.offset % family.ips.length; + ip = family.ips[position] ?? null; + + if (ip == null) { + return ip + } + + if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms + // We delete expired records + // It is possible that they have different TTL, so we manage them individually + family.ips.splice(position, 1); + return this.pick(origin, hostnameRecords, affinity) + } + + return ip + } + + setRecords (origin, addresses) { + const timestamp = Date.now(); + const records = { records: { 4: null, 6: null } }; + for (const record of addresses) { + record.timestamp = timestamp; + if (typeof record.ttl === 'number') { + // The record TTL is expected to be in ms + record.ttl = Math.min(record.ttl, this.#maxTTL); + } else { + record.ttl = this.#maxTTL; + } + + const familyRecords = records.records[record.family] ?? { ips: [] }; + + familyRecords.ips.push(record); + records.records[record.family] = familyRecords; + } + + this.#records.set(origin.hostname, records); + } + + getHandler (meta, opts) { + return new DNSDispatchHandler(this, meta, opts) + } + } + + class DNSDispatchHandler extends DecoratorHandler { + #state = null + #opts = null + #dispatch = null + #handler = null + #origin = null + + constructor (state, { origin, handler, dispatch }, opts) { + super(handler); + this.#origin = origin; + this.#handler = handler; + this.#opts = { ...opts }; + this.#state = state; + this.#dispatch = dispatch; + } + + onError (err) { + switch (err.code) { + case 'ETIMEDOUT': + case 'ECONNREFUSED': { + if (this.#state.dualStack) { + // We delete the record and retry + this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => { + if (err) { + return this.#handler.onError(err) + } + + const dispatchOpts = { + ...this.#opts, + origin: newOrigin + }; + + this.#dispatch(dispatchOpts, this); + }); + + // if dual-stack disabled, we error out + return + } + + this.#handler.onError(err); + return + } + case 'ENOTFOUND': + this.#state.deleteRecord(this.#origin); + // eslint-disable-next-line no-fallthrough + default: + this.#handler.onError(err); + break + } + } + } + + dns = interceptorOpts => { + if ( + interceptorOpts?.maxTTL != null && + (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0) + ) { + throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number') + } + + if ( + interceptorOpts?.maxItems != null && + (typeof interceptorOpts?.maxItems !== 'number' || + interceptorOpts?.maxItems < 1) + ) { + throw new InvalidArgumentError( + 'Invalid maxItems. Must be a positive number and greater than zero' + ) + } + + if ( + interceptorOpts?.affinity != null && + interceptorOpts?.affinity !== 4 && + interceptorOpts?.affinity !== 6 + ) { + throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6') + } + + if ( + interceptorOpts?.dualStack != null && + typeof interceptorOpts?.dualStack !== 'boolean' + ) { + throw new InvalidArgumentError('Invalid dualStack. Must be a boolean') + } + + if ( + interceptorOpts?.lookup != null && + typeof interceptorOpts?.lookup !== 'function' + ) { + throw new InvalidArgumentError('Invalid lookup. Must be a function') + } + + if ( + interceptorOpts?.pick != null && + typeof interceptorOpts?.pick !== 'function' + ) { + throw new InvalidArgumentError('Invalid pick. Must be a function') + } + + const dualStack = interceptorOpts?.dualStack ?? true; + let affinity; + if (dualStack) { + affinity = interceptorOpts?.affinity ?? null; + } else { + affinity = interceptorOpts?.affinity ?? 4; + } + + const opts = { + maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms + lookup: interceptorOpts?.lookup ?? null, + pick: interceptorOpts?.pick ?? null, + dualStack, + affinity, + maxItems: interceptorOpts?.maxItems ?? Infinity + }; + + const instance = new DNSInstance(opts); + + return dispatch => { + return function dnsInterceptor (origDispatchOpts, handler) { + const origin = + origDispatchOpts.origin.constructor === URL + ? origDispatchOpts.origin + : new URL(origDispatchOpts.origin); + + if (isIP(origin.hostname) !== 0) { + return dispatch(origDispatchOpts, handler) + } + + instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { + if (err) { + return handler.onError(err) + } + + let dispatchOpts = null; + dispatchOpts = { + ...origDispatchOpts, + servername: origin.hostname, // For SNI on TLS + origin: newOrigin, + headers: { + host: origin.hostname, + ...origDispatchOpts.headers + } + }; + + dispatch( + dispatchOpts, + instance.getHandler({ origin, dispatch, handler }, origDispatchOpts) + ); + }); + + return true + } + } + }; + return dns; +} + +var headers; +var hasRequiredHeaders; + +function requireHeaders () { + if (hasRequiredHeaders) return headers; + hasRequiredHeaders = 1; + + const { kConstruct } = requireSymbols$4(); + const { kEnumerableProperty } = requireUtil$9(); + const { + iteratorMixin, + isValidHeaderName, + isValidHeaderValue + } = requireUtil$8(); + const { webidl } = requireWebidl(); + const assert = require$$0$7; + const util = require$$0$a; + + const kHeadersMap = Symbol('headers map'); + const kHeadersSortedMap = Symbol('headers map sorted'); + + /** + * @param {number} code + */ + function isHTTPWhiteSpaceCharCode (code) { + return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020 + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize + * @param {string} potentialValue + */ + function headerValueNormalize (potentialValue) { + // To normalize a byte sequence potentialValue, remove + // any leading and trailing HTTP whitespace bytes from + // potentialValue. + let i = 0; let j = potentialValue.length; + + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i; + + return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j) + } + + function fill (headers, object) { + // To fill a Headers object headers with a given object object, run these steps: + + // 1. If object is a sequence, then for each header in object: + // Note: webidl conversion to array has already been done. + if (Array.isArray(object)) { + for (let i = 0; i < object.length; ++i) { + const header = object[i]; + // 1. If header does not contain exactly two items, then throw a TypeError. + if (header.length !== 2) { + throw webidl.errors.exception({ + header: 'Headers constructor', + message: `expected name/value pair to be length 2, found ${header.length}.` + }) + } + + // 2. Append (header’s first item, header’s second item) to headers. + appendHeader(headers, header[0], header[1]); + } + } else if (typeof object === 'object' && object !== null) { + // Note: null should throw + + // 2. Otherwise, object is a record, then for each key → value in object, + // append (key, value) to headers + const keys = Object.keys(object); + for (let i = 0; i < keys.length; ++i) { + appendHeader(headers, keys[i], object[keys[i]]); + } + } else { + throw webidl.errors.conversionFailed({ + prefix: 'Headers constructor', + argument: 'Argument 1', + types: ['sequence>', 'record'] + }) + } + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-headers-append + */ + function appendHeader (headers, name, value) { + // 1. Normalize value. + value = headerValueNormalize(value); + + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value, + type: 'header value' + }) + } + + // 3. If headers’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if headers’s guard is "request" and name is a + // forbidden header name, return. + // 5. Otherwise, if headers’s guard is "request-no-cors": + // TODO + // Note: undici does not implement forbidden header names + if (getHeadersGuard(headers) === 'immutable') { + throw new TypeError('immutable') + } + + // 6. Otherwise, if headers’s guard is "response" and name is a + // forbidden response-header name, return. + + // 7. Append (name, value) to headers’s header list. + return getHeadersList(headers).append(name, value, false) + + // 8. If headers’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from headers + } + + function compareHeaderName (a, b) { + return a[0] < b[0] ? -1 : 1 + } + + class HeadersList { + /** @type {[string, string][]|null} */ + cookies = null + + constructor (init) { + if (init instanceof HeadersList) { + this[kHeadersMap] = new Map(init[kHeadersMap]); + this[kHeadersSortedMap] = init[kHeadersSortedMap]; + this.cookies = init.cookies === null ? null : [...init.cookies]; + } else { + this[kHeadersMap] = new Map(init); + this[kHeadersSortedMap] = null; + } + } + + /** + * @see https://fetch.spec.whatwg.org/#header-list-contains + * @param {string} name + * @param {boolean} isLowerCase + */ + contains (name, isLowerCase) { + // A header list list contains a header name name if list + // contains a header whose name is a byte-case-insensitive + // match for name. + + return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase()) + } + + clear () { + this[kHeadersMap].clear(); + this[kHeadersSortedMap] = null; + this.cookies = null; + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-append + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + append (name, value, isLowerCase) { + this[kHeadersSortedMap] = null; + + // 1. If list contains name, then set name to the first such + // header’s name. + const lowercaseName = isLowerCase ? name : name.toLowerCase(); + const exists = this[kHeadersMap].get(lowercaseName); + + // 2. Append (name, value) to list. + if (exists) { + const delimiter = lowercaseName === 'cookie' ? '; ' : ', '; + this[kHeadersMap].set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }); + } else { + this[kHeadersMap].set(lowercaseName, { name, value }); + } + + if (lowercaseName === 'set-cookie') { + (this.cookies ??= []).push(value); + } + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-set + * @param {string} name + * @param {string} value + * @param {boolean} isLowerCase + */ + set (name, value, isLowerCase) { + this[kHeadersSortedMap] = null; + const lowercaseName = isLowerCase ? name : name.toLowerCase(); + + if (lowercaseName === 'set-cookie') { + this.cookies = [value]; + } + + // 1. If list contains name, then set the value of + // the first such header to value and remove the + // others. + // 2. Otherwise, append header (name, value) to list. + this[kHeadersMap].set(lowercaseName, { name, value }); + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-delete + * @param {string} name + * @param {boolean} isLowerCase + */ + delete (name, isLowerCase) { + this[kHeadersSortedMap] = null; + if (!isLowerCase) name = name.toLowerCase(); + + if (name === 'set-cookie') { + this.cookies = null; + } + + this[kHeadersMap].delete(name); + } + + /** + * @see https://fetch.spec.whatwg.org/#concept-header-list-get + * @param {string} name + * @param {boolean} isLowerCase + * @returns {string | null} + */ + get (name, isLowerCase) { + // 1. If list does not contain name, then return null. + // 2. Return the values of all headers in list whose name + // is a byte-case-insensitive match for name, + // separated from each other by 0x2C 0x20, in order. + return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null + } + + * [Symbol.iterator] () { + // use the lowercased name + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + yield [name, value]; + } + } + + get entries () { + const headers = {}; + + if (this[kHeadersMap].size !== 0) { + for (const { name, value } of this[kHeadersMap].values()) { + headers[name] = value; + } + } + + return headers + } + + rawValues () { + return this[kHeadersMap].values() + } + + get entriesList () { + const headers = []; + + if (this[kHeadersMap].size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) { + if (lowerName === 'set-cookie') { + for (const cookie of this.cookies) { + headers.push([name, cookie]); + } + } else { + headers.push([name, value]); + } + } + } + + return headers + } + + // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set + toSortedArray () { + const size = this[kHeadersMap].size; + const array = new Array(size); + // In most cases, you will use the fast-path. + // fast-path: Use binary insertion sort for small arrays. + if (size <= 32) { + if (size === 0) { + // If empty, it is an empty array. To avoid the first index assignment. + return array + } + // Improve performance by unrolling loop and avoiding double-loop. + // Double-loop-less version of the binary insertion sort. + const iterator = this[kHeadersMap][Symbol.iterator](); + const firstValue = iterator.next().value; + // set [name, value] to first index. + array[0] = [firstValue[0], firstValue[1].value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(firstValue[1].value !== null); + for ( + let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value; + i < size; + ++i + ) { + // get next value + value = iterator.next().value; + // set [name, value] to current index. + x = array[i] = [value[0], value[1].value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(x[1] !== null); + left = 0; + right = i; + // binary search + while (left < right) { + // middle index + pivot = left + ((right - left) >> 1); + // compare header name + if (array[pivot][0] <= x[0]) { + left = pivot + 1; + } else { + right = pivot; + } + } + if (i !== pivot) { + j = i; + while (j > left) { + array[j] = array[--j]; + } + array[left] = x; + } + } + /* c8 ignore next 4 */ + if (!iterator.next().done) { + // This is for debugging and will never be called. + throw new TypeError('Unreachable') + } + return array + } else { + // This case would be a rare occurrence. + // slow-path: fallback + let i = 0; + for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + array[i++] = [name, value]; + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + // 3.2.2. Assert: value is non-null. + assert(value !== null); + } + return array.sort(compareHeaderName) + } + } + } + + // https://fetch.spec.whatwg.org/#headers-class + class Headers { + #guard + #headersList + + constructor (init = undefined) { + webidl.util.markAsUncloneable(this); + + if (init === kConstruct) { + return + } + + this.#headersList = new HeadersList(); + + // The new Headers(init) constructor steps are: + + // 1. Set this’s guard to "none". + this.#guard = 'none'; + + // 2. If init is given, then fill this with init. + if (init !== undefined) { + init = webidl.converters.HeadersInit(init, 'Headers contructor', 'init'); + fill(this, init); + } + } + + // https://fetch.spec.whatwg.org/#dom-headers-append + append (name, value) { + webidl.brandCheck(this, Headers); + + webidl.argumentLengthCheck(arguments, 2, 'Headers.append'); + + const prefix = 'Headers.append'; + name = webidl.converters.ByteString(name, prefix, 'name'); + value = webidl.converters.ByteString(value, prefix, 'value'); + + return appendHeader(this, name, value) + } + + // https://fetch.spec.whatwg.org/#dom-headers-delete + delete (name) { + webidl.brandCheck(this, Headers); + + webidl.argumentLengthCheck(arguments, 1, 'Headers.delete'); + + const prefix = 'Headers.delete'; + name = webidl.converters.ByteString(name, prefix, 'name'); + + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.delete', + value: name, + type: 'header name' + }) + } + + // 2. If this’s guard is "immutable", then throw a TypeError. + // 3. Otherwise, if this’s guard is "request" and name is a + // forbidden header name, return. + // 4. Otherwise, if this’s guard is "request-no-cors", name + // is not a no-CORS-safelisted request-header name, and + // name is not a privileged no-CORS request-header name, + // return. + // 5. Otherwise, if this’s guard is "response" and name is + // a forbidden response-header name, return. + // Note: undici does not implement forbidden header names + if (this.#guard === 'immutable') { + throw new TypeError('immutable') + } + + // 6. If this’s header list does not contain name, then + // return. + if (!this.#headersList.contains(name, false)) { + return + } + + // 7. Delete name from this’s header list. + // 8. If this’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from this. + this.#headersList.delete(name, false); + } + + // https://fetch.spec.whatwg.org/#dom-headers-get + get (name) { + webidl.brandCheck(this, Headers); + + webidl.argumentLengthCheck(arguments, 1, 'Headers.get'); + + const prefix = 'Headers.get'; + name = webidl.converters.ByteString(name, prefix, 'name'); + + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix, + value: name, + type: 'header name' + }) + } + + // 2. Return the result of getting name from this’s header + // list. + return this.#headersList.get(name, false) + } + + // https://fetch.spec.whatwg.org/#dom-headers-has + has (name) { + webidl.brandCheck(this, Headers); + + webidl.argumentLengthCheck(arguments, 1, 'Headers.has'); + + const prefix = 'Headers.has'; + name = webidl.converters.ByteString(name, prefix, 'name'); + + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix, + value: name, + type: 'header name' + }) + } + + // 2. Return true if this’s header list contains name; + // otherwise false. + return this.#headersList.contains(name, false) + } + + // https://fetch.spec.whatwg.org/#dom-headers-set + set (name, value) { + webidl.brandCheck(this, Headers); + + webidl.argumentLengthCheck(arguments, 2, 'Headers.set'); + + const prefix = 'Headers.set'; + name = webidl.converters.ByteString(name, prefix, 'name'); + value = webidl.converters.ByteString(value, prefix, 'value'); + + // 1. Normalize value. + value = headerValueNormalize(value); + + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix, + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix, + value, + type: 'header value' + }) + } + + // 3. If this’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if this’s guard is "request" and name is a + // forbidden header name, return. + // 5. Otherwise, if this’s guard is "request-no-cors" and + // name/value is not a no-CORS-safelisted request-header, + // return. + // 6. Otherwise, if this’s guard is "response" and name is a + // forbidden response-header name, return. + // Note: undici does not implement forbidden header names + if (this.#guard === 'immutable') { + throw new TypeError('immutable') + } + + // 7. Set (name, value) in this’s header list. + // 8. If this’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from this + this.#headersList.set(name, value, false); + } + + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie () { + webidl.brandCheck(this, Headers); + + // 1. If this’s header list does not contain `Set-Cookie`, then return « ». + // 2. Return the values of all headers in this’s header list whose name is + // a byte-case-insensitive match for `Set-Cookie`, in order. + + const list = this.#headersList.cookies; + + if (list) { + return [...list] + } + + return [] + } + + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + get [kHeadersSortedMap] () { + if (this.#headersList[kHeadersSortedMap]) { + return this.#headersList[kHeadersSortedMap] + } + + // 1. Let headers be an empty list of headers with the key being the name + // and value the value. + const headers = []; + + // 2. Let names be the result of convert header names to a sorted-lowercase + // set with all the names of the headers in list. + const names = this.#headersList.toSortedArray(); + + const cookies = this.#headersList.cookies; + + // fast-path + if (cookies === null || cookies.length === 1) { + // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray` + return (this.#headersList[kHeadersSortedMap] = names) + } + + // 3. For each name of names: + for (let i = 0; i < names.length; ++i) { + const { 0: name, 1: value } = names[i]; + // 1. If name is `set-cookie`, then: + if (name === 'set-cookie') { + // 1. Let values be a list of all values of headers in list whose name + // is a byte-case-insensitive match for name, in order. + + // 2. For each value of values: + // 1. Append (name, value) to headers. + for (let j = 0; j < cookies.length; ++j) { + headers.push([name, cookies[j]]); + } + } else { + // 2. Otherwise: + + // 1. Let value be the result of getting name from list. + + // 2. Assert: value is non-null. + // Note: This operation was done by `HeadersList#toSortedArray`. + + // 3. Append (name, value) to headers. + headers.push([name, value]); + } + } + + // 4. Return headers. + return (this.#headersList[kHeadersSortedMap] = headers) + } + + [util.inspect.custom] (depth, options) { + options.depth ??= depth; + + return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}` + } + + static getHeadersGuard (o) { + return o.#guard + } + + static setHeadersGuard (o, guard) { + o.#guard = guard; + } + + static getHeadersList (o) { + return o.#headersList + } + + static setHeadersList (o, list) { + o.#headersList = list; + } + } + + const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers; + Reflect.deleteProperty(Headers, 'getHeadersGuard'); + Reflect.deleteProperty(Headers, 'setHeadersGuard'); + Reflect.deleteProperty(Headers, 'getHeadersList'); + Reflect.deleteProperty(Headers, 'setHeadersList'); + + iteratorMixin('Headers', Headers, kHeadersSortedMap, 0, 1); + + Object.defineProperties(Headers.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Headers', + configurable: true + }, + [util.inspect.custom]: { + enumerable: false + } + }); + + webidl.converters.HeadersInit = function (V, prefix, argument) { + if (webidl.util.Type(V) === 'Object') { + const iterator = Reflect.get(V, Symbol.iterator); + + // A work-around to ensure we send the properly-cased Headers when V is a Headers object. + // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please. + if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object + try { + return getHeadersList(V).entriesList + } catch { + // fall-through + } + } + + if (typeof iterator === 'function') { + return webidl.converters['sequence>'](V, prefix, argument, iterator.bind(V)) + } + + return webidl.converters['record'](V, prefix, argument) + } + + throw webidl.errors.conversionFailed({ + prefix: 'Headers constructor', + argument: 'Argument 1', + types: ['sequence>', 'record'] + }) + }; + + headers = { + fill, + // for test. + compareHeaderName, + Headers, + HeadersList, + getHeadersGuard, + setHeadersGuard, + setHeadersList, + getHeadersList + }; + return headers; +} + +var response$1; +var hasRequiredResponse$1; + +function requireResponse$1 () { + if (hasRequiredResponse$1) return response$1; + hasRequiredResponse$1 = 1; + + const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = requireHeaders(); + const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = requireBody(); + const util = requireUtil$9(); + const nodeUtil = require$$0$a; + const { kEnumerableProperty } = util; + const { + isValidReasonPhrase, + isCancelled, + isAborted, + isBlobLike, + serializeJavascriptValueToJSONString, + isErrorLike, + isomorphicEncode, + environmentSettingsObject: relevantRealm + } = requireUtil$8(); + const { + redirectStatusSet, + nullBodyStatus + } = requireConstants$8(); + const { kState, kHeaders } = requireSymbols$3(); + const { webidl } = requireWebidl(); + const { FormData } = requireFormdata(); + const { URLSerializer } = requireDataUrl(); + const { kConstruct } = requireSymbols$4(); + const assert = require$$0$7; + const { types } = require$$0$a; + + const textEncoder = new TextEncoder('utf-8'); + + // https://fetch.spec.whatwg.org/#response-class + class Response { + // Creates network error Response. + static error () { + // The static error() method steps are to return the result of creating a + // Response object, given a new network error, "immutable", and this’s + // relevant Realm. + const responseObject = fromInnerResponse(makeNetworkError(), 'immutable'); + + return responseObject + } + + // https://fetch.spec.whatwg.org/#dom-response-json + static json (data, init = {}) { + webidl.argumentLengthCheck(arguments, 1, 'Response.json'); + + if (init !== null) { + init = webidl.converters.ResponseInit(init); + } + + // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data. + const bytes = textEncoder.encode( + serializeJavascriptValueToJSONString(data) + ); + + // 2. Let body be the result of extracting bytes. + const body = extractBody(bytes); + + // 3. Let responseObject be the result of creating a Response object, given a new response, + // "response", and this’s relevant Realm. + const responseObject = fromInnerResponse(makeResponse({}), 'response'); + + // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). + initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }); + + // 5. Return responseObject. + return responseObject + } + + // Creates a redirect Response that redirects to url with status status. + static redirect (url, status = 302) { + webidl.argumentLengthCheck(arguments, 1, 'Response.redirect'); + + url = webidl.converters.USVString(url); + status = webidl.converters['unsigned short'](status); + + // 1. Let parsedURL be the result of parsing url with current settings + // object’s API base URL. + // 2. If parsedURL is failure, then throw a TypeError. + // TODO: base-URL? + let parsedURL; + try { + parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl); + } catch (err) { + throw new TypeError(`Failed to parse URL from ${url}`, { cause: err }) + } + + // 3. If status is not a redirect status, then throw a RangeError. + if (!redirectStatusSet.has(status)) { + throw new RangeError(`Invalid status code ${status}`) + } + + // 4. Let responseObject be the result of creating a Response object, + // given a new response, "immutable", and this’s relevant Realm. + const responseObject = fromInnerResponse(makeResponse({}), 'immutable'); + + // 5. Set responseObject’s response’s status to status. + responseObject[kState].status = status; + + // 6. Let value be parsedURL, serialized and isomorphic encoded. + const value = isomorphicEncode(URLSerializer(parsedURL)); + + // 7. Append `Location`/value to responseObject’s response’s header list. + responseObject[kState].headersList.append('location', value, true); + + // 8. Return responseObject. + return responseObject + } + + // https://fetch.spec.whatwg.org/#dom-response + constructor (body = null, init = {}) { + webidl.util.markAsUncloneable(this); + if (body === kConstruct) { + return + } + + if (body !== null) { + body = webidl.converters.BodyInit(body); + } + + init = webidl.converters.ResponseInit(init); + + // 1. Set this’s response to a new response. + this[kState] = makeResponse({}); + + // 2. Set this’s headers to a new Headers object with this’s relevant + // Realm, whose header list is this’s response’s header list and guard + // is "response". + this[kHeaders] = new Headers(kConstruct); + setHeadersGuard(this[kHeaders], 'response'); + setHeadersList(this[kHeaders], this[kState].headersList); + + // 3. Let bodyWithType be null. + let bodyWithType = null; + + // 4. If body is non-null, then set bodyWithType to the result of extracting body. + if (body != null) { + const [extractedBody, type] = extractBody(body); + bodyWithType = { body: extractedBody, type }; + } + + // 5. Perform initialize a response given this, init, and bodyWithType. + initializeResponse(this, init, bodyWithType); + } + + // Returns response’s type, e.g., "cors". + get type () { + webidl.brandCheck(this, Response); + + // The type getter steps are to return this’s response’s type. + return this[kState].type + } + + // Returns response’s URL, if it has one; otherwise the empty string. + get url () { + webidl.brandCheck(this, Response); + + const urlList = this[kState].urlList; + + // The url getter steps are to return the empty string if this’s + // response’s URL is null; otherwise this’s response’s URL, + // serialized with exclude fragment set to true. + const url = urlList[urlList.length - 1] ?? null; + + if (url === null) { + return '' + } + + return URLSerializer(url, true) + } + + // Returns whether response was obtained through a redirect. + get redirected () { + webidl.brandCheck(this, Response); + + // The redirected getter steps are to return true if this’s response’s URL + // list has more than one item; otherwise false. + return this[kState].urlList.length > 1 + } + + // Returns response’s status. + get status () { + webidl.brandCheck(this, Response); + + // The status getter steps are to return this’s response’s status. + return this[kState].status + } + + // Returns whether response’s status is an ok status. + get ok () { + webidl.brandCheck(this, Response); + + // The ok getter steps are to return true if this’s response’s status is an + // ok status; otherwise false. + return this[kState].status >= 200 && this[kState].status <= 299 + } + + // Returns response’s status message. + get statusText () { + webidl.brandCheck(this, Response); + + // The statusText getter steps are to return this’s response’s status + // message. + return this[kState].statusText + } + + // Returns response’s headers as Headers. + get headers () { + webidl.brandCheck(this, Response); + + // The headers getter steps are to return this’s headers. + return this[kHeaders] + } + + get body () { + webidl.brandCheck(this, Response); + + return this[kState].body ? this[kState].body.stream : null + } + + get bodyUsed () { + webidl.brandCheck(this, Response); + + return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + } + + // Returns a clone of response. + clone () { + webidl.brandCheck(this, Response); + + // 1. If this is unusable, then throw a TypeError. + if (bodyUnusable(this)) { + throw webidl.errors.exception({ + header: 'Response.clone', + message: 'Body has already been consumed.' + }) + } + + // 2. Let clonedResponse be the result of cloning this’s response. + const clonedResponse = cloneResponse(this[kState]); + + // Note: To re-register because of a new stream. + if (hasFinalizationRegistry && this[kState].body?.stream) { + streamRegistry.register(this, new WeakRef(this[kState].body.stream)); + } + + // 3. Return the result of creating a Response object, given + // clonedResponse, this’s headers’s guard, and this’s relevant Realm. + return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders])) + } + + [nodeUtil.inspect.custom] (depth, options) { + if (options.depth === null) { + options.depth = 2; + } + + options.colors ??= true; + + const properties = { + status: this.status, + statusText: this.statusText, + headers: this.headers, + body: this.body, + bodyUsed: this.bodyUsed, + ok: this.ok, + redirected: this.redirected, + type: this.type, + url: this.url + }; + + return `Response ${nodeUtil.formatWithOptions(options, properties)}` + } + } + + mixinBody(Response); + + Object.defineProperties(Response.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Response', + configurable: true + } + }); + + Object.defineProperties(Response, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty + }); + + // https://fetch.spec.whatwg.org/#concept-response-clone + function cloneResponse (response) { + // To clone a response response, run these steps: + + // 1. If response is a filtered response, then return a new identical + // filtered response whose internal response is a clone of response’s + // internal response. + if (response.internalResponse) { + return filterResponse( + cloneResponse(response.internalResponse), + response.type + ) + } + + // 2. Let newResponse be a copy of response, except for its body. + const newResponse = makeResponse({ ...response, body: null }); + + // 3. If response’s body is non-null, then set newResponse’s body to the + // result of cloning response’s body. + if (response.body != null) { + newResponse.body = cloneBody(newResponse, response.body); + } + + // 4. Return newResponse. + return newResponse + } + + function makeResponse (init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: 'default', + status: 200, + timingInfo: null, + cacheState: '', + statusText: '', + ...init, + headersList: init?.headersList + ? new HeadersList(init?.headersList) + : new HeadersList(), + urlList: init?.urlList ? [...init.urlList] : [] + } + } + + function makeNetworkError (reason) { + const isError = isErrorLike(reason); + return makeResponse({ + type: 'error', + status: 0, + error: isError + ? reason + : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === 'AbortError' + }) + } + + // @see https://fetch.spec.whatwg.org/#concept-network-error + function isNetworkError (response) { + return ( + // A network error is a response whose type is "error", + response.type === 'error' && + // status is 0 + response.status === 0 + ) + } + + function makeFilteredResponse (response, state) { + state = { + internalResponse: response, + ...state + }; + + return new Proxy(response, { + get (target, p) { + return p in state ? state[p] : target[p] + }, + set (target, p, value) { + assert(!(p in state)); + target[p] = value; + return true + } + }) + } + + // https://fetch.spec.whatwg.org/#concept-filtered-response + function filterResponse (response, type) { + // Set response to the following filtered response with response as its + // internal response, depending on request’s response tainting: + if (type === 'basic') { + // A basic filtered response is a filtered response whose type is "basic" + // and header list excludes any headers in internal response’s header list + // whose name is a forbidden response-header name. + + // Note: undici does not implement forbidden response-header names + return makeFilteredResponse(response, { + type: 'basic', + headersList: response.headersList + }) + } else if (type === 'cors') { + // A CORS filtered response is a filtered response whose type is "cors" + // and header list excludes any headers in internal response’s header + // list whose name is not a CORS-safelisted response-header name, given + // internal response’s CORS-exposed header-name list. + + // Note: undici does not implement CORS-safelisted response-header names + return makeFilteredResponse(response, { + type: 'cors', + headersList: response.headersList + }) + } else if (type === 'opaque') { + // An opaque filtered response is a filtered response whose type is + // "opaque", URL list is the empty list, status is 0, status message + // is the empty byte sequence, header list is empty, and body is null. + + return makeFilteredResponse(response, { + type: 'opaque', + urlList: Object.freeze([]), + status: 0, + statusText: '', + body: null + }) + } else if (type === 'opaqueredirect') { + // An opaque-redirect filtered response is a filtered response whose type + // is "opaqueredirect", status is 0, status message is the empty byte + // sequence, header list is empty, and body is null. + + return makeFilteredResponse(response, { + type: 'opaqueredirect', + status: 0, + statusText: '', + headersList: [], + body: null + }) + } else { + assert(false); + } + } + + // https://fetch.spec.whatwg.org/#appropriate-network-error + function makeAppropriateNetworkError (fetchParams, err = null) { + // 1. Assert: fetchParams is canceled. + assert(isCancelled(fetchParams)); + + // 2. Return an aborted network error if fetchParams is aborted; + // otherwise return a network error. + return isAborted(fetchParams) + ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err })) + : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err })) + } + + // https://whatpr.org/fetch/1392.html#initialize-a-response + function initializeResponse (response, init, body) { + // 1. If init["status"] is not in the range 200 to 599, inclusive, then + // throw a RangeError. + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.') + } + + // 2. If init["statusText"] does not match the reason-phrase token production, + // then throw a TypeError. + if ('statusText' in init && init.statusText != null) { + // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2: + // reason-phrase = *( HTAB / SP / VCHAR / obs-text ) + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError('Invalid statusText') + } + } + + // 3. Set response’s response’s status to init["status"]. + if ('status' in init && init.status != null) { + response[kState].status = init.status; + } + + // 4. Set response’s response’s status message to init["statusText"]. + if ('statusText' in init && init.statusText != null) { + response[kState].statusText = init.statusText; + } + + // 5. If init["headers"] exists, then fill response’s headers with init["headers"]. + if ('headers' in init && init.headers != null) { + fill(response[kHeaders], init.headers); + } + + // 6. If body was given, then: + if (body) { + // 1. If response's status is a null body status, then throw a TypeError. + if (nullBodyStatus.includes(response.status)) { + throw webidl.errors.exception({ + header: 'Response constructor', + message: `Invalid response status code ${response.status}` + }) + } + + // 2. Set response's body to body's body. + response[kState].body = body.body; + + // 3. If body's type is non-null and response's header list does not contain + // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. + if (body.type != null && !response[kState].headersList.contains('content-type', true)) { + response[kState].headersList.append('content-type', body.type, true); + } + } + } + + /** + * @see https://fetch.spec.whatwg.org/#response-create + * @param {any} innerResponse + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @returns {Response} + */ + function fromInnerResponse (innerResponse, guard) { + const response = new Response(kConstruct); + response[kState] = innerResponse; + response[kHeaders] = new Headers(kConstruct); + setHeadersList(response[kHeaders], innerResponse.headersList); + setHeadersGuard(response[kHeaders], guard); + + if (hasFinalizationRegistry && innerResponse.body?.stream) { + // If the target (response) is reclaimed, the cleanup callback may be called at some point with + // the held value provided for it (innerResponse.body.stream). The held value can be any value: + // a primitive or an object, even undefined. If the held value is an object, the registry keeps + // a strong reference to it (so it can pass it to the cleanup callback later). Reworded from + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry + streamRegistry.register(response, new WeakRef(innerResponse.body.stream)); + } + + return response + } + + webidl.converters.ReadableStream = webidl.interfaceConverter( + ReadableStream + ); + + webidl.converters.FormData = webidl.interfaceConverter( + FormData + ); + + webidl.converters.URLSearchParams = webidl.interfaceConverter( + URLSearchParams + ); + + // https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit + webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) { + if (typeof V === 'string') { + return webidl.converters.USVString(V, prefix, name) + } + + if (isBlobLike(V)) { + return webidl.converters.Blob(V, prefix, name, { strict: false }) + } + + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { + return webidl.converters.BufferSource(V, prefix, name) + } + + if (util.isFormDataLike(V)) { + return webidl.converters.FormData(V, prefix, name, { strict: false }) + } + + if (V instanceof URLSearchParams) { + return webidl.converters.URLSearchParams(V, prefix, name) + } + + return webidl.converters.DOMString(V, prefix, name) + }; + + // https://fetch.spec.whatwg.org/#bodyinit + webidl.converters.BodyInit = function (V, prefix, argument) { + if (V instanceof ReadableStream) { + return webidl.converters.ReadableStream(V, prefix, argument) + } + + // Note: the spec doesn't include async iterables, + // this is an undici extension. + if (V?.[Symbol.asyncIterator]) { + return V + } + + return webidl.converters.XMLHttpRequestBodyInit(V, prefix, argument) + }; + + webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: 'status', + converter: webidl.converters['unsigned short'], + defaultValue: () => 200 + }, + { + key: 'statusText', + converter: webidl.converters.ByteString, + defaultValue: () => '' + }, + { + key: 'headers', + converter: webidl.converters.HeadersInit + } + ]); + + response$1 = { + isNetworkError, + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response, + cloneResponse, + fromInnerResponse + }; + return response$1; +} + +var dispatcherWeakref; +var hasRequiredDispatcherWeakref; + +function requireDispatcherWeakref () { + if (hasRequiredDispatcherWeakref) return dispatcherWeakref; + hasRequiredDispatcherWeakref = 1; + + const { kConnected, kSize } = requireSymbols$4(); + + class CompatWeakRef { + constructor (value) { + this.value = value; + } + + deref () { + return this.value[kConnected] === 0 && this.value[kSize] === 0 + ? undefined + : this.value + } + } + + class CompatFinalizer { + constructor (finalizer) { + this.finalizer = finalizer; + } + + register (dispatcher, key) { + if (dispatcher.on) { + dispatcher.on('disconnect', () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key); + } + }); + } + } + + unregister (key) {} + } + + dispatcherWeakref = function () { + // FIXME: remove workaround when the Node bug is backported to v18 + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (process.env.NODE_V8_COVERAGE && process.version.startsWith('v18')) { + process._rawDebug('Using compatibility WeakRef and FinalizationRegistry'); + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + } + } + return { WeakRef, FinalizationRegistry } + }; + return dispatcherWeakref; +} + +/* globals AbortController */ + +var request$1; +var hasRequiredRequest; + +function requireRequest () { + if (hasRequiredRequest) return request$1; + hasRequiredRequest = 1; + + const { extractBody, mixinBody, cloneBody, bodyUnusable } = requireBody(); + const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = requireHeaders(); + const { FinalizationRegistry } = requireDispatcherWeakref()(); + const util = requireUtil$9(); + const nodeUtil = require$$0$a; + const { + isValidHTTPToken, + sameOrigin, + environmentSettingsObject + } = requireUtil$8(); + const { + forbiddenMethodsSet, + corsSafeListedMethodsSet, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex + } = requireConstants$8(); + const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util; + const { kHeaders, kSignal, kState, kDispatcher } = requireSymbols$3(); + const { webidl } = requireWebidl(); + const { URLSerializer } = requireDataUrl(); + const { kConstruct } = requireSymbols$4(); + const assert = require$$0$7; + const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require$$8; + + const kAbortController = Symbol('abortController'); + + const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + signal.removeEventListener('abort', abort); + }); + + const dependentControllerMap = new WeakMap(); + + function buildAbort (acRef) { + return abort + + function abort () { + const ac = acRef.deref(); + if (ac !== undefined) { + // Currently, there is a problem with FinalizationRegistry. + // https://github.com/nodejs/node/issues/49344 + // https://github.com/nodejs/node/issues/47748 + // In the case of abort, the first step is to unregister from it. + // If the controller can refer to it, it is still registered. + // It will be removed in the future. + requestFinalizer.unregister(abort); + + // Unsubscribe a listener. + // FinalizationRegistry will no longer be called, so this must be done. + this.removeEventListener('abort', abort); + + ac.abort(this.reason); + + const controllerList = dependentControllerMap.get(ac.signal); + + if (controllerList !== undefined) { + if (controllerList.size !== 0) { + for (const ref of controllerList) { + const ctrl = ref.deref(); + if (ctrl !== undefined) { + ctrl.abort(this.reason); + } + } + controllerList.clear(); + } + dependentControllerMap.delete(ac.signal); + } + } + } + } + + let patchMethodWarning = false; + + // https://fetch.spec.whatwg.org/#request-class + class Request { + // https://fetch.spec.whatwg.org/#dom-request + constructor (input, init = {}) { + webidl.util.markAsUncloneable(this); + if (input === kConstruct) { + return + } + + const prefix = 'Request constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + input = webidl.converters.RequestInfo(input, prefix, 'input'); + init = webidl.converters.RequestInit(init, prefix, 'init'); + + // 1. Let request be null. + let request = null; + + // 2. Let fallbackMode be null. + let fallbackMode = null; + + // 3. Let baseURL be this’s relevant settings object’s API base URL. + const baseUrl = environmentSettingsObject.settingsObject.baseUrl; + + // 4. Let signal be null. + let signal = null; + + // 5. If input is a string, then: + if (typeof input === 'string') { + this[kDispatcher] = init.dispatcher; + + // 1. Let parsedURL be the result of parsing input with baseURL. + // 2. If parsedURL is failure, then throw a TypeError. + let parsedURL; + try { + parsedURL = new URL(input, baseUrl); + } catch (err) { + throw new TypeError('Failed to parse URL from ' + input, { cause: err }) + } + + // 3. If parsedURL includes credentials, then throw a TypeError. + if (parsedURL.username || parsedURL.password) { + throw new TypeError( + 'Request cannot be constructed from a URL that includes credentials: ' + + input + ) + } + + // 4. Set request to a new request whose URL is parsedURL. + request = makeRequest({ urlList: [parsedURL] }); + + // 5. Set fallbackMode to "cors". + fallbackMode = 'cors'; + } else { + this[kDispatcher] = init.dispatcher || input[kDispatcher]; + + // 6. Otherwise: + + // 7. Assert: input is a Request object. + assert(input instanceof Request); + + // 8. Set request to input’s request. + request = input[kState]; + + // 9. Set signal to input’s signal. + signal = input[kSignal]; + } + + // 7. Let origin be this’s relevant settings object’s origin. + const origin = environmentSettingsObject.settingsObject.origin; + + // 8. Let window be "client". + let window = 'client'; + + // 9. If request’s window is an environment settings object and its origin + // is same origin with origin, then set window to request’s window. + if ( + request.window?.constructor?.name === 'EnvironmentSettingsObject' && + sameOrigin(request.window, origin) + ) { + window = request.window; + } + + // 10. If init["window"] exists and is non-null, then throw a TypeError. + if (init.window != null) { + throw new TypeError(`'window' option '${window}' must be null`) + } + + // 11. If init["window"] exists, then set window to "no-window". + if ('window' in init) { + window = 'no-window'; + } + + // 12. Set request to a new request with the following properties: + request = makeRequest({ + // URL request’s URL. + // undici implementation note: this is set as the first item in request's urlList in makeRequest + // method request’s method. + method: request.method, + // header list A copy of request’s header list. + // undici implementation note: headersList is cloned in makeRequest + headersList: request.headersList, + // unsafe-request flag Set. + unsafeRequest: request.unsafeRequest, + // client This’s relevant settings object. + client: environmentSettingsObject.settingsObject, + // window window. + window, + // priority request’s priority. + priority: request.priority, + // origin request’s origin. The propagation of the origin is only significant for navigation requests + // being handled by a service worker. In this scenario a request can have an origin that is different + // from the current client. + origin: request.origin, + // referrer request’s referrer. + referrer: request.referrer, + // referrer policy request’s referrer policy. + referrerPolicy: request.referrerPolicy, + // mode request’s mode. + mode: request.mode, + // credentials mode request’s credentials mode. + credentials: request.credentials, + // cache mode request’s cache mode. + cache: request.cache, + // redirect mode request’s redirect mode. + redirect: request.redirect, + // integrity metadata request’s integrity metadata. + integrity: request.integrity, + // keepalive request’s keepalive. + keepalive: request.keepalive, + // reload-navigation flag request’s reload-navigation flag. + reloadNavigation: request.reloadNavigation, + // history-navigation flag request’s history-navigation flag. + historyNavigation: request.historyNavigation, + // URL list A clone of request’s URL list. + urlList: [...request.urlList] + }); + + const initHasKey = Object.keys(init).length !== 0; + + // 13. If init is not empty, then: + if (initHasKey) { + // 1. If request’s mode is "navigate", then set it to "same-origin". + if (request.mode === 'navigate') { + request.mode = 'same-origin'; + } + + // 2. Unset request’s reload-navigation flag. + request.reloadNavigation = false; + + // 3. Unset request’s history-navigation flag. + request.historyNavigation = false; + + // 4. Set request’s origin to "client". + request.origin = 'client'; + + // 5. Set request’s referrer to "client" + request.referrer = 'client'; + + // 6. Set request’s referrer policy to the empty string. + request.referrerPolicy = ''; + + // 7. Set request’s URL to request’s current URL. + request.url = request.urlList[request.urlList.length - 1]; + + // 8. Set request’s URL list to « request’s URL ». + request.urlList = [request.url]; + } + + // 14. If init["referrer"] exists, then: + if (init.referrer !== undefined) { + // 1. Let referrer be init["referrer"]. + const referrer = init.referrer; + + // 2. If referrer is the empty string, then set request’s referrer to "no-referrer". + if (referrer === '') { + request.referrer = 'no-referrer'; + } else { + // 1. Let parsedReferrer be the result of parsing referrer with + // baseURL. + // 2. If parsedReferrer is failure, then throw a TypeError. + let parsedReferrer; + try { + parsedReferrer = new URL(referrer, baseUrl); + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }) + } + + // 3. If one of the following is true + // - parsedReferrer’s scheme is "about" and path is the string "client" + // - parsedReferrer’s origin is not same origin with origin + // then set request’s referrer to "client". + if ( + (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') || + (origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) + ) { + request.referrer = 'client'; + } else { + // 4. Otherwise, set request’s referrer to parsedReferrer. + request.referrer = parsedReferrer; + } + } + } + + // 15. If init["referrerPolicy"] exists, then set request’s referrer policy + // to it. + if (init.referrerPolicy !== undefined) { + request.referrerPolicy = init.referrerPolicy; + } + + // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise. + let mode; + if (init.mode !== undefined) { + mode = init.mode; + } else { + mode = fallbackMode; + } + + // 17. If mode is "navigate", then throw a TypeError. + if (mode === 'navigate') { + throw webidl.errors.exception({ + header: 'Request constructor', + message: 'invalid request mode navigate.' + }) + } + + // 18. If mode is non-null, set request’s mode to mode. + if (mode != null) { + request.mode = mode; + } + + // 19. If init["credentials"] exists, then set request’s credentials mode + // to it. + if (init.credentials !== undefined) { + request.credentials = init.credentials; + } + + // 18. If init["cache"] exists, then set request’s cache mode to it. + if (init.cache !== undefined) { + request.cache = init.cache; + } + + // 21. If request’s cache mode is "only-if-cached" and request’s mode is + // not "same-origin", then throw a TypeError. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + throw new TypeError( + "'only-if-cached' can be set only with 'same-origin' mode" + ) + } + + // 22. If init["redirect"] exists, then set request’s redirect mode to it. + if (init.redirect !== undefined) { + request.redirect = init.redirect; + } + + // 23. If init["integrity"] exists, then set request’s integrity metadata to it. + if (init.integrity != null) { + request.integrity = String(init.integrity); + } + + // 24. If init["keepalive"] exists, then set request’s keepalive to it. + if (init.keepalive !== undefined) { + request.keepalive = Boolean(init.keepalive); + } + + // 25. If init["method"] exists, then: + if (init.method !== undefined) { + // 1. Let method be init["method"]. + let method = init.method; + + const mayBeNormalized = normalizedMethodRecords[method]; + + if (mayBeNormalized !== undefined) { + // Note: Bypass validation DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH and these lowercase ones + request.method = mayBeNormalized; + } else { + // 2. If method is not a method or method is a forbidden method, then + // throw a TypeError. + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`) + } + + const upperCase = method.toUpperCase(); + + if (forbiddenMethodsSet.has(upperCase)) { + throw new TypeError(`'${method}' HTTP method is unsupported.`) + } + + // 3. Normalize method. + // https://fetch.spec.whatwg.org/#concept-method-normalize + // Note: must be in uppercase + method = normalizedMethodRecordsBase[upperCase] ?? method; + + // 4. Set request’s method to method. + request.method = method; + } + + if (!patchMethodWarning && request.method === 'patch') { + process.emitWarning('Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.', { + code: 'UNDICI-FETCH-patch' + }); + + patchMethodWarning = true; + } + } + + // 26. If init["signal"] exists, then set signal to it. + if (init.signal !== undefined) { + signal = init.signal; + } + + // 27. Set this’s request to request. + this[kState] = request; + + // 28. Set this’s signal to a new AbortSignal object with this’s relevant + // Realm. + // TODO: could this be simplified with AbortSignal.any + // (https://dom.spec.whatwg.org/#dom-abortsignal-any) + const ac = new AbortController(); + this[kSignal] = ac.signal; + + // 29. If signal is not null, then make this’s signal follow signal. + if (signal != null) { + if ( + !signal || + typeof signal.aborted !== 'boolean' || + typeof signal.addEventListener !== 'function' + ) { + throw new TypeError( + "Failed to construct 'Request': member signal is not of type AbortSignal." + ) + } + + if (signal.aborted) { + ac.abort(signal.reason); + } else { + // Keep a strong ref to ac while request object + // is alive. This is needed to prevent AbortController + // from being prematurely garbage collected. + // See, https://github.com/nodejs/undici/issues/1926. + this[kAbortController] = ac; + + const acRef = new WeakRef(ac); + const abort = buildAbort(acRef); + + // Third-party AbortControllers may not work with these. + // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619. + try { + // If the max amount of listeners is equal to the default, increase it + // This is only available in node >= v19.9.0 + if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners(1500, signal); + } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { + setMaxListeners(1500, signal); + } + } catch {} + + util.addAbortListener(signal, abort); + // The third argument must be a registry key to be unregistered. + // Without it, you cannot unregister. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry + // abort is used as the unregister key. (because it is unique) + requestFinalizer.register(ac, { signal, abort }, abort); + } + } + + // 30. Set this’s headers to a new Headers object with this’s relevant + // Realm, whose header list is request’s header list and guard is + // "request". + this[kHeaders] = new Headers(kConstruct); + setHeadersList(this[kHeaders], request.headersList); + setHeadersGuard(this[kHeaders], 'request'); + + // 31. If this’s request’s mode is "no-cors", then: + if (mode === 'no-cors') { + // 1. If this’s request’s method is not a CORS-safelisted method, + // then throw a TypeError. + if (!corsSafeListedMethodsSet.has(request.method)) { + throw new TypeError( + `'${request.method} is unsupported in no-cors mode.` + ) + } + + // 2. Set this’s headers’s guard to "request-no-cors". + setHeadersGuard(this[kHeaders], 'request-no-cors'); + } + + // 32. If init is not empty, then: + if (initHasKey) { + /** @type {HeadersList} */ + const headersList = getHeadersList(this[kHeaders]); + // 1. Let headers be a copy of this’s headers and its associated header + // list. + // 2. If init["headers"] exists, then set headers to init["headers"]. + const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList); + + // 3. Empty this’s headers’s header list. + headersList.clear(); + + // 4. If headers is a Headers object, then for each header in its header + // list, append header’s name/header’s value to this’s headers. + if (headers instanceof HeadersList) { + for (const { name, value } of headers.rawValues()) { + headersList.append(name, value, false); + } + // Note: Copy the `set-cookie` meta-data. + headersList.cookies = headers.cookies; + } else { + // 5. Otherwise, fill this’s headers with headers. + fillHeaders(this[kHeaders], headers); + } + } + + // 33. Let inputBody be input’s request’s body if input is a Request + // object; otherwise null. + const inputBody = input instanceof Request ? input[kState].body : null; + + // 34. If either init["body"] exists and is non-null or inputBody is + // non-null, and request’s method is `GET` or `HEAD`, then throw a + // TypeError. + if ( + (init.body != null || inputBody != null) && + (request.method === 'GET' || request.method === 'HEAD') + ) { + throw new TypeError('Request with GET/HEAD method cannot have body.') + } + + // 35. Let initBody be null. + let initBody = null; + + // 36. If init["body"] exists and is non-null, then: + if (init.body != null) { + // 1. Let Content-Type be null. + // 2. Set initBody and Content-Type to the result of extracting + // init["body"], with keepalive set to request’s keepalive. + const [extractedBody, contentType] = extractBody( + init.body, + request.keepalive + ); + initBody = extractedBody; + + // 3, If Content-Type is non-null and this’s headers’s header list does + // not contain `Content-Type`, then append `Content-Type`/Content-Type to + // this’s headers. + if (contentType && !getHeadersList(this[kHeaders]).contains('content-type', true)) { + this[kHeaders].append('content-type', contentType); + } + } + + // 37. Let inputOrInitBody be initBody if it is non-null; otherwise + // inputBody. + const inputOrInitBody = initBody ?? inputBody; + + // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is + // null, then: + if (inputOrInitBody != null && inputOrInitBody.source == null) { + // 1. If initBody is non-null and init["duplex"] does not exist, + // then throw a TypeError. + if (initBody != null && init.duplex == null) { + throw new TypeError('RequestInit: duplex option is required when sending a body.') + } + + // 2. If this’s request’s mode is neither "same-origin" nor "cors", + // then throw a TypeError. + if (request.mode !== 'same-origin' && request.mode !== 'cors') { + throw new TypeError( + 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' + ) + } + + // 3. Set this’s request’s use-CORS-preflight flag. + request.useCORSPreflightFlag = true; + } + + // 39. Let finalBody be inputOrInitBody. + let finalBody = inputOrInitBody; + + // 40. If initBody is null and inputBody is non-null, then: + if (initBody == null && inputBody != null) { + // 1. If input is unusable, then throw a TypeError. + if (bodyUnusable(input)) { + throw new TypeError( + 'Cannot construct a Request with a Request object that has already been used.' + ) + } + + // 2. Set finalBody to the result of creating a proxy for inputBody. + // https://streams.spec.whatwg.org/#readablestream-create-a-proxy + const identityTransform = new TransformStream(); + inputBody.stream.pipeThrough(identityTransform); + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + }; + } + + // 41. Set this’s request’s body to finalBody. + this[kState].body = finalBody; + } + + // Returns request’s HTTP method, which is "GET" by default. + get method () { + webidl.brandCheck(this, Request); + + // The method getter steps are to return this’s request’s method. + return this[kState].method + } + + // Returns the URL of request as a string. + get url () { + webidl.brandCheck(this, Request); + + // The url getter steps are to return this’s request’s URL, serialized. + return URLSerializer(this[kState].url) + } + + // Returns a Headers object consisting of the headers associated with request. + // Note that headers added in the network layer by the user agent will not + // be accounted for in this object, e.g., the "Host" header. + get headers () { + webidl.brandCheck(this, Request); + + // The headers getter steps are to return this’s headers. + return this[kHeaders] + } + + // Returns the kind of resource requested by request, e.g., "document" + // or "script". + get destination () { + webidl.brandCheck(this, Request); + + // The destination getter are to return this’s request’s destination. + return this[kState].destination + } + + // Returns the referrer of request. Its value can be a same-origin URL if + // explicitly set in init, the empty string to indicate no referrer, and + // "about:client" when defaulting to the global’s default. This is used + // during fetching to determine the value of the `Referer` header of the + // request being made. + get referrer () { + webidl.brandCheck(this, Request); + + // 1. If this’s request’s referrer is "no-referrer", then return the + // empty string. + if (this[kState].referrer === 'no-referrer') { + return '' + } + + // 2. If this’s request’s referrer is "client", then return + // "about:client". + if (this[kState].referrer === 'client') { + return 'about:client' + } + + // Return this’s request’s referrer, serialized. + return this[kState].referrer.toString() + } + + // Returns the referrer policy associated with request. + // This is used during fetching to compute the value of the request’s + // referrer. + get referrerPolicy () { + webidl.brandCheck(this, Request); + + // The referrerPolicy getter steps are to return this’s request’s referrer policy. + return this[kState].referrerPolicy + } + + // Returns the mode associated with request, which is a string indicating + // whether the request will use CORS, or will be restricted to same-origin + // URLs. + get mode () { + webidl.brandCheck(this, Request); + + // The mode getter steps are to return this’s request’s mode. + return this[kState].mode + } + + // Returns the credentials mode associated with request, + // which is a string indicating whether credentials will be sent with the + // request always, never, or only when sent to a same-origin URL. + get credentials () { + // The credentials getter steps are to return this’s request’s credentials mode. + return this[kState].credentials + } + + // Returns the cache mode associated with request, + // which is a string indicating how the request will + // interact with the browser’s cache when fetching. + get cache () { + webidl.brandCheck(this, Request); + + // The cache getter steps are to return this’s request’s cache mode. + return this[kState].cache + } + + // Returns the redirect mode associated with request, + // which is a string indicating how redirects for the + // request will be handled during fetching. A request + // will follow redirects by default. + get redirect () { + webidl.brandCheck(this, Request); + + // The redirect getter steps are to return this’s request’s redirect mode. + return this[kState].redirect + } + + // Returns request’s subresource integrity metadata, which is a + // cryptographic hash of the resource being fetched. Its value + // consists of multiple hashes separated by whitespace. [SRI] + get integrity () { + webidl.brandCheck(this, Request); + + // The integrity getter steps are to return this’s request’s integrity + // metadata. + return this[kState].integrity + } + + // Returns a boolean indicating whether or not request can outlive the + // global in which it was created. + get keepalive () { + webidl.brandCheck(this, Request); + + // The keepalive getter steps are to return this’s request’s keepalive. + return this[kState].keepalive + } + + // Returns a boolean indicating whether or not request is for a reload + // navigation. + get isReloadNavigation () { + webidl.brandCheck(this, Request); + + // The isReloadNavigation getter steps are to return true if this’s + // request’s reload-navigation flag is set; otherwise false. + return this[kState].reloadNavigation + } + + // Returns a boolean indicating whether or not request is for a history + // navigation (a.k.a. back-forward navigation). + get isHistoryNavigation () { + webidl.brandCheck(this, Request); + + // The isHistoryNavigation getter steps are to return true if this’s request’s + // history-navigation flag is set; otherwise false. + return this[kState].historyNavigation + } + + // Returns the signal associated with request, which is an AbortSignal + // object indicating whether or not request has been aborted, and its + // abort event handler. + get signal () { + webidl.brandCheck(this, Request); + + // The signal getter steps are to return this’s signal. + return this[kSignal] + } + + get body () { + webidl.brandCheck(this, Request); + + return this[kState].body ? this[kState].body.stream : null + } + + get bodyUsed () { + webidl.brandCheck(this, Request); + + return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + } + + get duplex () { + webidl.brandCheck(this, Request); + + return 'half' + } + + // Returns a clone of request. + clone () { + webidl.brandCheck(this, Request); + + // 1. If this is unusable, then throw a TypeError. + if (bodyUnusable(this)) { + throw new TypeError('unusable') + } + + // 2. Let clonedRequest be the result of cloning this’s request. + const clonedRequest = cloneRequest(this[kState]); + + // 3. Let clonedRequestObject be the result of creating a Request object, + // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. + // 4. Make clonedRequestObject’s signal follow this’s signal. + const ac = new AbortController(); + if (this.signal.aborted) { + ac.abort(this.signal.reason); + } else { + let list = dependentControllerMap.get(this.signal); + if (list === undefined) { + list = new Set(); + dependentControllerMap.set(this.signal, list); + } + const acRef = new WeakRef(ac); + list.add(acRef); + util.addAbortListener( + ac.signal, + buildAbort(acRef) + ); + } + + // 4. Return clonedRequestObject. + return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders])) + } + + [nodeUtil.inspect.custom] (depth, options) { + if (options.depth === null) { + options.depth = 2; + } + + options.colors ??= true; + + const properties = { + method: this.method, + url: this.url, + headers: this.headers, + destination: this.destination, + referrer: this.referrer, + referrerPolicy: this.referrerPolicy, + mode: this.mode, + credentials: this.credentials, + cache: this.cache, + redirect: this.redirect, + integrity: this.integrity, + keepalive: this.keepalive, + isReloadNavigation: this.isReloadNavigation, + isHistoryNavigation: this.isHistoryNavigation, + signal: this.signal + }; + + return `Request ${nodeUtil.formatWithOptions(options, properties)}` + } + } + + mixinBody(Request); + + // https://fetch.spec.whatwg.org/#requests + function makeRequest (init) { + return { + method: init.method ?? 'GET', + localURLsOnly: init.localURLsOnly ?? false, + unsafeRequest: init.unsafeRequest ?? false, + body: init.body ?? null, + client: init.client ?? null, + reservedClient: init.reservedClient ?? null, + replacesClientId: init.replacesClientId ?? '', + window: init.window ?? 'client', + keepalive: init.keepalive ?? false, + serviceWorkers: init.serviceWorkers ?? 'all', + initiator: init.initiator ?? '', + destination: init.destination ?? '', + priority: init.priority ?? null, + origin: init.origin ?? 'client', + policyContainer: init.policyContainer ?? 'client', + referrer: init.referrer ?? 'client', + referrerPolicy: init.referrerPolicy ?? '', + mode: init.mode ?? 'no-cors', + useCORSPreflightFlag: init.useCORSPreflightFlag ?? false, + credentials: init.credentials ?? 'same-origin', + useCredentials: init.useCredentials ?? false, + cache: init.cache ?? 'default', + redirect: init.redirect ?? 'follow', + integrity: init.integrity ?? '', + cryptoGraphicsNonceMetadata: init.cryptoGraphicsNonceMetadata ?? '', + parserMetadata: init.parserMetadata ?? '', + reloadNavigation: init.reloadNavigation ?? false, + historyNavigation: init.historyNavigation ?? false, + userActivation: init.userActivation ?? false, + taintedOrigin: init.taintedOrigin ?? false, + redirectCount: init.redirectCount ?? 0, + responseTainting: init.responseTainting ?? 'basic', + preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false, + done: init.done ?? false, + timingAllowFailed: init.timingAllowFailed ?? false, + urlList: init.urlList, + url: init.urlList[0], + headersList: init.headersList + ? new HeadersList(init.headersList) + : new HeadersList() + } + } + + // https://fetch.spec.whatwg.org/#concept-request-clone + function cloneRequest (request) { + // To clone a request request, run these steps: + + // 1. Let newRequest be a copy of request, except for its body. + const newRequest = makeRequest({ ...request, body: null }); + + // 2. If request’s body is non-null, set newRequest’s body to the + // result of cloning request’s body. + if (request.body != null) { + newRequest.body = cloneBody(newRequest, request.body); + } + + // 3. Return newRequest. + return newRequest + } + + /** + * @see https://fetch.spec.whatwg.org/#request-create + * @param {any} innerRequest + * @param {AbortSignal} signal + * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard + * @returns {Request} + */ + function fromInnerRequest (innerRequest, signal, guard) { + const request = new Request(kConstruct); + request[kState] = innerRequest; + request[kSignal] = signal; + request[kHeaders] = new Headers(kConstruct); + setHeadersList(request[kHeaders], innerRequest.headersList); + setHeadersGuard(request[kHeaders], guard); + return request + } + + Object.defineProperties(Request.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Request', + configurable: true + } + }); + + webidl.converters.Request = webidl.interfaceConverter( + Request + ); + + // https://fetch.spec.whatwg.org/#requestinfo + webidl.converters.RequestInfo = function (V, prefix, argument) { + if (typeof V === 'string') { + return webidl.converters.USVString(V, prefix, argument) + } + + if (V instanceof Request) { + return webidl.converters.Request(V, prefix, argument) + } + + return webidl.converters.USVString(V, prefix, argument) + }; + + webidl.converters.AbortSignal = webidl.interfaceConverter( + AbortSignal + ); + + // https://fetch.spec.whatwg.org/#requestinit + webidl.converters.RequestInit = webidl.dictionaryConverter([ + { + key: 'method', + converter: webidl.converters.ByteString + }, + { + key: 'headers', + converter: webidl.converters.HeadersInit + }, + { + key: 'body', + converter: webidl.nullableConverter( + webidl.converters.BodyInit + ) + }, + { + key: 'referrer', + converter: webidl.converters.USVString + }, + { + key: 'referrerPolicy', + converter: webidl.converters.DOMString, + // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy + allowedValues: referrerPolicy + }, + { + key: 'mode', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#concept-request-mode + allowedValues: requestMode + }, + { + key: 'credentials', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcredentials + allowedValues: requestCredentials + }, + { + key: 'cache', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcache + allowedValues: requestCache + }, + { + key: 'redirect', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestredirect + allowedValues: requestRedirect + }, + { + key: 'integrity', + converter: webidl.converters.DOMString + }, + { + key: 'keepalive', + converter: webidl.converters.boolean + }, + { + key: 'signal', + converter: webidl.nullableConverter( + (signal) => webidl.converters.AbortSignal( + signal, + 'RequestInit', + 'signal', + { strict: false } + ) + ) + }, + { + key: 'window', + converter: webidl.converters.any + }, + { + key: 'duplex', + converter: webidl.converters.DOMString, + allowedValues: requestDuplex + }, + { + key: 'dispatcher', // undici specific option + converter: webidl.converters.any + } + ]); + + request$1 = { Request, makeRequest, fromInnerRequest, cloneRequest }; + return request$1; +} + +var fetch_1; +var hasRequiredFetch; + +function requireFetch () { + if (hasRequiredFetch) return fetch_1; + hasRequiredFetch = 1; + + const { + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse, + fromInnerResponse + } = requireResponse$1(); + const { HeadersList } = requireHeaders(); + const { Request, cloneRequest } = requireRequest(); + const zlib = require$$3; + const { + bytesMatch, + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + createDeferredPromise, + isBlobLike, + sameOrigin, + isCancelled, + isAborted, + isErrorLike, + fullyReadBody, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme, + clampAndCoarsenConnectionTimingInfo, + simpleRangeHeaderValue, + buildContentRange, + createInflate, + extractMimeType + } = requireUtil$8(); + const { kState, kDispatcher } = requireSymbols$3(); + const assert = require$$0$7; + const { safelyExtractBody, extractBody } = requireBody(); + const { + redirectStatusSet, + nullBodyStatus, + safeMethodsSet, + requestBodyHeader, + subresourceSet + } = requireConstants$8(); + const EE = require$$8; + const { Readable, pipeline, finished } = require$$0$8; + const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = requireUtil$9(); + const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = requireDataUrl(); + const { getGlobalDispatcher } = requireGlobal(); + const { webidl } = requireWebidl(); + const { STATUS_CODES } = require$$2; + const GET_OR_HEAD = ['GET', 'HEAD']; + + const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined' + ? 'node' + : 'undici'; + + /** @type {import('buffer').resolveObjectURL} */ + let resolveObjectURL; + + class Fetch extends EE { + constructor (dispatcher) { + super(); + + this.dispatcher = dispatcher; + this.connection = null; + this.dump = false; + this.state = 'ongoing'; + } + + terminate (reason) { + if (this.state !== 'ongoing') { + return + } + + this.state = 'terminated'; + this.connection?.destroy(reason); + this.emit('terminated', reason); + } + + // https://fetch.spec.whatwg.org/#fetch-controller-abort + abort (error) { + if (this.state !== 'ongoing') { + return + } + + // 1. Set controller’s state to "aborted". + this.state = 'aborted'; + + // 2. Let fallbackError be an "AbortError" DOMException. + // 3. Set error to fallbackError if it is not given. + if (!error) { + error = new DOMException('The operation was aborted.', 'AbortError'); + } + + // 4. Let serializedError be StructuredSerialize(error). + // If that threw an exception, catch it, and let + // serializedError be StructuredSerialize(fallbackError). + + // 5. Set controller’s serialized abort reason to serializedError. + this.serializedAbortReason = error; + + this.connection?.destroy(error); + this.emit('terminated', error); + } + } + + function handleFetchDone (response) { + finalizeAndReportTiming(response, 'fetch'); + } + + // https://fetch.spec.whatwg.org/#fetch-method + function fetch (input, init = undefined) { + webidl.argumentLengthCheck(arguments, 1, 'globalThis.fetch'); + + // 1. Let p be a new promise. + let p = createDeferredPromise(); + + // 2. Let requestObject be the result of invoking the initial value of + // Request as constructor with input and init as arguments. If this throws + // an exception, reject p with it and return p. + let requestObject; + + try { + requestObject = new Request(input, init); + } catch (e) { + p.reject(e); + return p.promise + } + + // 3. Let request be requestObject’s request. + const request = requestObject[kState]; + + // 4. If requestObject’s signal’s aborted flag is set, then: + if (requestObject.signal.aborted) { + // 1. Abort the fetch() call with p, request, null, and + // requestObject’s signal’s abort reason. + abortFetch(p, request, null, requestObject.signal.reason); + + // 2. Return p. + return p.promise + } + + // 5. Let globalObject be request’s client’s global object. + const globalObject = request.client.globalObject; + + // 6. If globalObject is a ServiceWorkerGlobalScope object, then set + // request’s service-workers mode to "none". + if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') { + request.serviceWorkers = 'none'; + } + + // 7. Let responseObject be null. + let responseObject = null; + + // 8. Let relevantRealm be this’s relevant Realm. + + // 9. Let locallyAborted be false. + let locallyAborted = false; + + // 10. Let controller be null. + let controller = null; + + // 11. Add the following abort steps to requestObject’s signal: + addAbortListener( + requestObject.signal, + () => { + // 1. Set locallyAborted to true. + locallyAborted = true; + + // 2. Assert: controller is non-null. + assert(controller != null); + + // 3. Abort controller with requestObject’s signal’s abort reason. + controller.abort(requestObject.signal.reason); + + const realResponse = responseObject?.deref(); + + // 4. Abort the fetch() call with p, request, responseObject, + // and requestObject’s signal’s abort reason. + abortFetch(p, request, realResponse, requestObject.signal.reason); + } + ); + + // 12. Let handleFetchDone given response response be to finalize and + // report timing with response, globalObject, and "fetch". + // see function handleFetchDone + + // 13. Set controller to the result of calling fetch given request, + // with processResponseEndOfBody set to handleFetchDone, and processResponse + // given response being these substeps: + + const processResponse = (response) => { + // 1. If locallyAborted is true, terminate these substeps. + if (locallyAborted) { + return + } + + // 2. If response’s aborted flag is set, then: + if (response.aborted) { + // 1. Let deserializedError be the result of deserialize a serialized + // abort reason given controller’s serialized abort reason and + // relevantRealm. + + // 2. Abort the fetch() call with p, request, responseObject, and + // deserializedError. + + abortFetch(p, request, responseObject, controller.serializedAbortReason); + return + } + + // 3. If response is a network error, then reject p with a TypeError + // and terminate these substeps. + if (response.type === 'error') { + p.reject(new TypeError('fetch failed', { cause: response.error })); + return + } + + // 4. Set responseObject to the result of creating a Response object, + // given response, "immutable", and relevantRealm. + responseObject = new WeakRef(fromInnerResponse(response, 'immutable')); + + // 5. Resolve p with responseObject. + p.resolve(responseObject.deref()); + p = null; + }; + + controller = fetching({ + request, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: requestObject[kDispatcher] // undici + }); + + // 14. Return p. + return p.promise + } + + // https://fetch.spec.whatwg.org/#finalize-and-report-timing + function finalizeAndReportTiming (response, initiatorType = 'other') { + // 1. If response is an aborted network error, then return. + if (response.type === 'error' && response.aborted) { + return + } + + // 2. If response’s URL list is null or empty, then return. + if (!response.urlList?.length) { + return + } + + // 3. Let originalURL be response’s URL list[0]. + const originalURL = response.urlList[0]; + + // 4. Let timingInfo be response’s timing info. + let timingInfo = response.timingInfo; + + // 5. Let cacheState be response’s cache state. + let cacheState = response.cacheState; + + // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return. + if (!urlIsHttpHttpsScheme(originalURL)) { + return + } + + // 7. If timingInfo is null, then return. + if (timingInfo === null) { + return + } + + // 8. If response’s timing allow passed flag is not set, then: + if (!response.timingAllowPassed) { + // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }); + + // 2. Set cacheState to the empty string. + cacheState = ''; + } + + // 9. Set timingInfo’s end time to the coarsened shared current time + // given global’s relevant settings object’s cross-origin isolated + // capability. + // TODO: given global’s relevant settings object’s cross-origin isolated + // capability? + timingInfo.endTime = coarsenedSharedCurrentTime(); + + // 10. Set response’s timing info to timingInfo. + response.timingInfo = timingInfo; + + // 11. Mark resource timing for timingInfo, originalURL, initiatorType, + // global, and cacheState. + markResourceTiming( + timingInfo, + originalURL.href, + initiatorType, + globalThis, + cacheState + ); + } + + // https://w3c.github.io/resource-timing/#dfn-mark-resource-timing + const markResourceTiming = performance.markResourceTiming; + + // https://fetch.spec.whatwg.org/#abort-fetch + function abortFetch (p, request, responseObject, error) { + // 1. Reject promise with error. + if (p) { + // We might have already resolved the promise at this stage + p.reject(error); + } + + // 2. If request’s body is not null and is readable, then cancel request’s + // body with error. + if (request.body != null && isReadable(request.body?.stream)) { + request.body.stream.cancel(error).catch((err) => { + if (err.code === 'ERR_INVALID_STATE') { + // Node bug? + return + } + throw err + }); + } + + // 3. If responseObject is null, then return. + if (responseObject == null) { + return + } + + // 4. Let response be responseObject’s response. + const response = responseObject[kState]; + + // 5. If response’s body is not null and is readable, then error response’s + // body with error. + if (response.body != null && isReadable(response.body?.stream)) { + response.body.stream.cancel(error).catch((err) => { + if (err.code === 'ERR_INVALID_STATE') { + // Node bug? + return + } + throw err + }); + } + } + + // https://fetch.spec.whatwg.org/#fetching + function fetching ({ + request, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher = getGlobalDispatcher() // undici + }) { + // Ensure that the dispatcher is set accordingly + assert(dispatcher); + + // 1. Let taskDestination be null. + let taskDestination = null; + + // 2. Let crossOriginIsolatedCapability be false. + let crossOriginIsolatedCapability = false; + + // 3. If request’s client is non-null, then: + if (request.client != null) { + // 1. Set taskDestination to request’s client’s global object. + taskDestination = request.client.globalObject; + + // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin + // isolated capability. + crossOriginIsolatedCapability = + request.client.crossOriginIsolatedCapability; + } -const endpointMethodsMap = /* @__PURE__ */ new Map(); -for (const [scope, endpoints] of Object.entries(endpoints_default)) { - for (const [methodName, endpoint] of Object.entries(endpoints)) { - const [route, defaults, decorations] = endpoint; - const [method, url] = route.split(/ /); - const endpointDefaults = Object.assign( - { - method, - url - }, - defaults - ); - if (!endpointMethodsMap.has(scope)) { - endpointMethodsMap.set(scope, /* @__PURE__ */ new Map()); - } - endpointMethodsMap.get(scope).set(methodName, { - scope, - methodName, - endpointDefaults, - decorations - }); - } -} -const handler = { - has({ scope }, methodName) { - return endpointMethodsMap.get(scope).has(methodName); - }, - getOwnPropertyDescriptor(target, methodName) { - return { - value: this.get(target, methodName), - // ensures method is in the cache - configurable: true, - writable: true, - enumerable: true - }; - }, - defineProperty(target, methodName, descriptor) { - Object.defineProperty(target.cache, methodName, descriptor); - return true; - }, - deleteProperty(target, methodName) { - delete target.cache[methodName]; - return true; - }, - ownKeys({ scope }) { - return [...endpointMethodsMap.get(scope).keys()]; - }, - set(target, methodName, value) { - return target.cache[methodName] = value; - }, - get({ octokit, scope, cache }, methodName) { - if (cache[methodName]) { - return cache[methodName]; - } - const method = endpointMethodsMap.get(scope).get(methodName); - if (!method) { - return void 0; - } - const { endpointDefaults, decorations } = method; - if (decorations) { - cache[methodName] = decorate( - octokit, - scope, - methodName, - endpointDefaults, - decorations - ); - } else { - cache[methodName] = octokit.request.defaults(endpointDefaults); - } - return cache[methodName]; - } -}; -function endpointsToMethods(octokit) { - const newMethods = {}; - for (const scope of endpointMethodsMap.keys()) { - newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); - } - return newMethods; -} -function decorate(octokit, scope, methodName, defaults, decorations) { - const requestWithDefaults = octokit.request.defaults(defaults); - function withDecorations(...args) { - let options = requestWithDefaults.endpoint.merge(...args); - if (decorations.mapToData) { - options = Object.assign({}, options, { - data: options[decorations.mapToData], - [decorations.mapToData]: void 0 - }); - return requestWithDefaults(options); - } - if (decorations.renamed) { - const [newScope, newMethodName] = decorations.renamed; - octokit.log.warn( - `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()` - ); - } - if (decorations.deprecated) { - octokit.log.warn(decorations.deprecated); - } - if (decorations.renamedParameters) { - const options2 = requestWithDefaults.endpoint.merge(...args); - for (const [name, alias] of Object.entries( - decorations.renamedParameters - )) { - if (name in options2) { - octokit.log.warn( - `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead` - ); - if (!(alias in options2)) { - options2[alias] = options2[name]; - } - delete options2[name]; - } - } - return requestWithDefaults(options2); - } - return requestWithDefaults(...args); - } - return Object.assign(withDecorations, requestWithDefaults); -} + // 4. If useParallelQueue is true, then set taskDestination to the result of + // starting a new parallel queue. + // TODO -function restEndpointMethods(octokit) { - const api = endpointsToMethods(octokit); - return { - rest: api - }; -} -restEndpointMethods.VERSION = VERSION$1; -function legacyRestEndpointMethods(octokit) { - const api = endpointsToMethods(octokit); - return { - ...api, - rest: api - }; -} -legacyRestEndpointMethods.VERSION = VERSION$1; + // 5. Let timingInfo be a new fetch timing info whose start time and + // post-redirect start time are the coarsened shared current time given + // crossOriginIsolatedCapability. + const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const timingInfo = createOpaqueTimingInfo({ + startTime: currentTime + }); -var distSrc = /*#__PURE__*/Object.freeze({ - __proto__: null, - legacyRestEndpointMethods: legacyRestEndpointMethods, - restEndpointMethods: restEndpointMethods -}); + // 6. Let fetchParams be a new fetch params whose + // request is request, + // timing info is timingInfo, + // process request body chunk length is processRequestBodyChunkLength, + // process request end-of-body is processRequestEndOfBody, + // process response is processResponse, + // process response consume body is processResponseConsumeBody, + // process response end-of-body is processResponseEndOfBody, + // task destination is taskDestination, + // and cross-origin isolated capability is crossOriginIsolatedCapability. + const fetchParams = { + controller: new Fetch(dispatcher), + request, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability + }; -var require$$3 = /*@__PURE__*/getAugmentedNamespace(distSrc); + // 7. If request’s body is a byte sequence, then set request’s body to + // request’s body as a body. + // NOTE: Since fetching is only called from fetch, body should already be + // extracted. + assert(!request.body || request.body.stream); -// pkg/dist-src/version.js -var VERSION = "9.2.2"; + // 8. If request’s window is "client", then set request’s window to request’s + // client, if request’s client’s global object is a Window object; otherwise + // "no-window". + if (request.window === 'client') { + // TODO: What if request.client is null? + request.window = + request.client?.globalObject?.constructor?.name === 'Window' + ? request.client + : 'no-window'; + } -// pkg/dist-src/normalize-paginated-list-response.js -function normalizePaginatedListResponse(response) { - if (!response.data) { - return { - ...response, - data: [] - }; - } - const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); - if (!responseNeedsNormalization) - return response; - const incompleteResults = response.data.incomplete_results; - const repositorySelection = response.data.repository_selection; - const totalCount = response.data.total_count; - delete response.data.incomplete_results; - delete response.data.repository_selection; - delete response.data.total_count; - const namespaceKey = Object.keys(response.data)[0]; - const data = response.data[namespaceKey]; - response.data = data; - if (typeof incompleteResults !== "undefined") { - response.data.incomplete_results = incompleteResults; - } - if (typeof repositorySelection !== "undefined") { - response.data.repository_selection = repositorySelection; - } - response.data.total_count = totalCount; - return response; -} + // 9. If request’s origin is "client", then set request’s origin to request’s + // client’s origin. + if (request.origin === 'client') { + request.origin = request.client.origin; + } -// pkg/dist-src/iterator.js -function iterator(octokit, route, parameters) { - const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); - const requestMethod = typeof route === "function" ? route : octokit.request; - const method = options.method; - const headers = options.headers; - let url = options.url; - return { - [Symbol.asyncIterator]: () => ({ - async next() { - if (!url) - return { done: true }; - try { - const response = await requestMethod({ method, url, headers }); - const normalizedResponse = normalizePaginatedListResponse(response); - url = ((normalizedResponse.headers.link || "").match( - /<([^<>]+)>;\s*rel="next"/ - ) || [])[1]; - return { value: normalizedResponse }; - } catch (error) { - if (error.status !== 409) - throw error; - url = ""; - return { - value: { - status: 200, - headers: {}, - data: [] - } - }; - } - } - }) - }; -} + // 10. If all of the following conditions are true: + // TODO -// pkg/dist-src/paginate.js -function paginate(octokit, route, parameters, mapFn) { - if (typeof parameters === "function") { - mapFn = parameters; - parameters = void 0; - } - return gather( - octokit, - [], - iterator(octokit, route, parameters)[Symbol.asyncIterator](), - mapFn - ); -} -function gather(octokit, results, iterator2, mapFn) { - return iterator2.next().then((result) => { - if (result.done) { - return results; - } - let earlyExit = false; - function done() { - earlyExit = true; - } - results = results.concat( - mapFn ? mapFn(result.value, done) : result.value.data - ); - if (earlyExit) { - return results; - } - return gather(octokit, results, iterator2, mapFn); - }); -} + // 11. If request’s policy container is "client", then: + if (request.policyContainer === 'client') { + // 1. If request’s client is non-null, then set request’s policy + // container to a clone of request’s client’s policy container. [HTML] + if (request.client != null) { + request.policyContainer = clonePolicyContainer( + request.client.policyContainer + ); + } else { + // 2. Otherwise, set request’s policy container to a new policy + // container. + request.policyContainer = makePolicyContainer(); + } + } -// pkg/dist-src/compose-paginate.js -var composePaginateRest = Object.assign(paginate, { - iterator -}); + // 12. If request’s header list does not contain `Accept`, then: + if (!request.headersList.contains('accept', true)) { + // 1. Let value be `*/*`. + const value = '*/*'; -// pkg/dist-src/generated/paginating-endpoints.js -var paginatingEndpoints = [ - "GET /advisories", - "GET /app/hook/deliveries", - "GET /app/installation-requests", - "GET /app/installations", - "GET /assignments/{assignment_id}/accepted_assignments", - "GET /classrooms", - "GET /classrooms/{classroom_id}/assignments", - "GET /enterprises/{enterprise}/dependabot/alerts", - "GET /enterprises/{enterprise}/secret-scanning/alerts", - "GET /events", - "GET /gists", - "GET /gists/public", - "GET /gists/starred", - "GET /gists/{gist_id}/comments", - "GET /gists/{gist_id}/commits", - "GET /gists/{gist_id}/forks", - "GET /installation/repositories", - "GET /issues", - "GET /licenses", - "GET /marketplace_listing/plans", - "GET /marketplace_listing/plans/{plan_id}/accounts", - "GET /marketplace_listing/stubbed/plans", - "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", - "GET /networks/{owner}/{repo}/events", - "GET /notifications", - "GET /organizations", - "GET /orgs/{org}/actions/cache/usage-by-repository", - "GET /orgs/{org}/actions/permissions/repositories", - "GET /orgs/{org}/actions/runners", - "GET /orgs/{org}/actions/secrets", - "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", - "GET /orgs/{org}/actions/variables", - "GET /orgs/{org}/actions/variables/{name}/repositories", - "GET /orgs/{org}/blocks", - "GET /orgs/{org}/code-scanning/alerts", - "GET /orgs/{org}/codespaces", - "GET /orgs/{org}/codespaces/secrets", - "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories", - "GET /orgs/{org}/copilot/billing/seats", - "GET /orgs/{org}/dependabot/alerts", - "GET /orgs/{org}/dependabot/secrets", - "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", - "GET /orgs/{org}/events", - "GET /orgs/{org}/failed_invitations", - "GET /orgs/{org}/hooks", - "GET /orgs/{org}/hooks/{hook_id}/deliveries", - "GET /orgs/{org}/installations", - "GET /orgs/{org}/invitations", - "GET /orgs/{org}/invitations/{invitation_id}/teams", - "GET /orgs/{org}/issues", - "GET /orgs/{org}/members", - "GET /orgs/{org}/members/{username}/codespaces", - "GET /orgs/{org}/migrations", - "GET /orgs/{org}/migrations/{migration_id}/repositories", - "GET /orgs/{org}/organization-roles/{role_id}/teams", - "GET /orgs/{org}/organization-roles/{role_id}/users", - "GET /orgs/{org}/outside_collaborators", - "GET /orgs/{org}/packages", - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", - "GET /orgs/{org}/personal-access-token-requests", - "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories", - "GET /orgs/{org}/personal-access-tokens", - "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories", - "GET /orgs/{org}/projects", - "GET /orgs/{org}/properties/values", - "GET /orgs/{org}/public_members", - "GET /orgs/{org}/repos", - "GET /orgs/{org}/rulesets", - "GET /orgs/{org}/rulesets/rule-suites", - "GET /orgs/{org}/secret-scanning/alerts", - "GET /orgs/{org}/security-advisories", - "GET /orgs/{org}/teams", - "GET /orgs/{org}/teams/{team_slug}/discussions", - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", - "GET /orgs/{org}/teams/{team_slug}/invitations", - "GET /orgs/{org}/teams/{team_slug}/members", - "GET /orgs/{org}/teams/{team_slug}/projects", - "GET /orgs/{org}/teams/{team_slug}/repos", - "GET /orgs/{org}/teams/{team_slug}/teams", - "GET /projects/columns/{column_id}/cards", - "GET /projects/{project_id}/collaborators", - "GET /projects/{project_id}/columns", - "GET /repos/{owner}/{repo}/actions/artifacts", - "GET /repos/{owner}/{repo}/actions/caches", - "GET /repos/{owner}/{repo}/actions/organization-secrets", - "GET /repos/{owner}/{repo}/actions/organization-variables", - "GET /repos/{owner}/{repo}/actions/runners", - "GET /repos/{owner}/{repo}/actions/runs", - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", - "GET /repos/{owner}/{repo}/actions/secrets", - "GET /repos/{owner}/{repo}/actions/variables", - "GET /repos/{owner}/{repo}/actions/workflows", - "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", - "GET /repos/{owner}/{repo}/activity", - "GET /repos/{owner}/{repo}/assignees", - "GET /repos/{owner}/{repo}/branches", - "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", - "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", - "GET /repos/{owner}/{repo}/code-scanning/alerts", - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", - "GET /repos/{owner}/{repo}/code-scanning/analyses", - "GET /repos/{owner}/{repo}/codespaces", - "GET /repos/{owner}/{repo}/codespaces/devcontainers", - "GET /repos/{owner}/{repo}/codespaces/secrets", - "GET /repos/{owner}/{repo}/collaborators", - "GET /repos/{owner}/{repo}/comments", - "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", - "GET /repos/{owner}/{repo}/commits", - "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", - "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", - "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", - "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", - "GET /repos/{owner}/{repo}/commits/{ref}/status", - "GET /repos/{owner}/{repo}/commits/{ref}/statuses", - "GET /repos/{owner}/{repo}/contributors", - "GET /repos/{owner}/{repo}/dependabot/alerts", - "GET /repos/{owner}/{repo}/dependabot/secrets", - "GET /repos/{owner}/{repo}/deployments", - "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", - "GET /repos/{owner}/{repo}/environments", - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies", - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps", - "GET /repos/{owner}/{repo}/events", - "GET /repos/{owner}/{repo}/forks", - "GET /repos/{owner}/{repo}/hooks", - "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", - "GET /repos/{owner}/{repo}/invitations", - "GET /repos/{owner}/{repo}/issues", - "GET /repos/{owner}/{repo}/issues/comments", - "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", - "GET /repos/{owner}/{repo}/issues/events", - "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", - "GET /repos/{owner}/{repo}/issues/{issue_number}/events", - "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", - "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", - "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", - "GET /repos/{owner}/{repo}/keys", - "GET /repos/{owner}/{repo}/labels", - "GET /repos/{owner}/{repo}/milestones", - "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", - "GET /repos/{owner}/{repo}/notifications", - "GET /repos/{owner}/{repo}/pages/builds", - "GET /repos/{owner}/{repo}/projects", - "GET /repos/{owner}/{repo}/pulls", - "GET /repos/{owner}/{repo}/pulls/comments", - "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", - "GET /repos/{owner}/{repo}/releases", - "GET /repos/{owner}/{repo}/releases/{release_id}/assets", - "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", - "GET /repos/{owner}/{repo}/rules/branches/{branch}", - "GET /repos/{owner}/{repo}/rulesets", - "GET /repos/{owner}/{repo}/rulesets/rule-suites", - "GET /repos/{owner}/{repo}/secret-scanning/alerts", - "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", - "GET /repos/{owner}/{repo}/security-advisories", - "GET /repos/{owner}/{repo}/stargazers", - "GET /repos/{owner}/{repo}/subscribers", - "GET /repos/{owner}/{repo}/tags", - "GET /repos/{owner}/{repo}/teams", - "GET /repos/{owner}/{repo}/topics", - "GET /repositories", - "GET /repositories/{repository_id}/environments/{environment_name}/secrets", - "GET /repositories/{repository_id}/environments/{environment_name}/variables", - "GET /search/code", - "GET /search/commits", - "GET /search/issues", - "GET /search/labels", - "GET /search/repositories", - "GET /search/topics", - "GET /search/users", - "GET /teams/{team_id}/discussions", - "GET /teams/{team_id}/discussions/{discussion_number}/comments", - "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", - "GET /teams/{team_id}/discussions/{discussion_number}/reactions", - "GET /teams/{team_id}/invitations", - "GET /teams/{team_id}/members", - "GET /teams/{team_id}/projects", - "GET /teams/{team_id}/repos", - "GET /teams/{team_id}/teams", - "GET /user/blocks", - "GET /user/codespaces", - "GET /user/codespaces/secrets", - "GET /user/emails", - "GET /user/followers", - "GET /user/following", - "GET /user/gpg_keys", - "GET /user/installations", - "GET /user/installations/{installation_id}/repositories", - "GET /user/issues", - "GET /user/keys", - "GET /user/marketplace_purchases", - "GET /user/marketplace_purchases/stubbed", - "GET /user/memberships/orgs", - "GET /user/migrations", - "GET /user/migrations/{migration_id}/repositories", - "GET /user/orgs", - "GET /user/packages", - "GET /user/packages/{package_type}/{package_name}/versions", - "GET /user/public_emails", - "GET /user/repos", - "GET /user/repository_invitations", - "GET /user/social_accounts", - "GET /user/ssh_signing_keys", - "GET /user/starred", - "GET /user/subscriptions", - "GET /user/teams", - "GET /users", - "GET /users/{username}/events", - "GET /users/{username}/events/orgs/{org}", - "GET /users/{username}/events/public", - "GET /users/{username}/followers", - "GET /users/{username}/following", - "GET /users/{username}/gists", - "GET /users/{username}/gpg_keys", - "GET /users/{username}/keys", - "GET /users/{username}/orgs", - "GET /users/{username}/packages", - "GET /users/{username}/projects", - "GET /users/{username}/received_events", - "GET /users/{username}/received_events/public", - "GET /users/{username}/repos", - "GET /users/{username}/social_accounts", - "GET /users/{username}/ssh_signing_keys", - "GET /users/{username}/starred", - "GET /users/{username}/subscriptions" -]; + // 2. A user agent should set value to the first matching statement, if + // any, switching on request’s destination: + // "document" + // "frame" + // "iframe" + // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` + // "image" + // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5` + // "style" + // `text/css,*/*;q=0.1` + // TODO -// pkg/dist-src/paginating-endpoints.js -function isPaginatingEndpoint(arg) { - if (typeof arg === "string") { - return paginatingEndpoints.includes(arg); - } else { - return false; - } -} + // 3. Append `Accept`/value to request’s header list. + request.headersList.append('accept', value, true); + } -// pkg/dist-src/index.js -function paginateRest(octokit) { - return { - paginate: Object.assign(paginate.bind(null, octokit), { - iterator: iterator.bind(null, octokit) - }) - }; -} -paginateRest.VERSION = VERSION; + // 13. If request’s header list does not contain `Accept-Language`, then + // user agents should append `Accept-Language`/an appropriate value to + // request’s header list. + if (!request.headersList.contains('accept-language', true)) { + request.headersList.append('accept-language', '*', true); + } -var distWeb = /*#__PURE__*/Object.freeze({ - __proto__: null, - composePaginateRest: composePaginateRest, - isPaginatingEndpoint: isPaginatingEndpoint, - paginateRest: paginateRest, - paginatingEndpoints: paginatingEndpoints -}); + // 14. If request’s priority is null, then use request’s initiator and + // destination appropriately in setting request’s priority to a + // user-agent-defined object. + if (request.priority === null) ; -var require$$4 = /*@__PURE__*/getAugmentedNamespace(distWeb); + // 15. If request is a subresource request, then: + if (subresourceSet.has(request.destination)) ; -var hasRequiredUtils$4; + // 16. Run main fetch given fetchParams. + mainFetch(fetchParams) + .catch(err => { + fetchParams.controller.terminate(err); + }); -function requireUtils$4 () { - if (hasRequiredUtils$4) return utils$5; - hasRequiredUtils$4 = 1; - (function (exports$1) { - var __createBinding = (utils$5 && utils$5.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (utils$5 && utils$5.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (utils$5 && utils$5.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getOctokitOptions = exports$1.GitHub = exports$1.defaults = exports$1.context = void 0; - const Context = __importStar(requireContext()); - const Utils = __importStar(requireUtils$5()); - // octokit + plugins - const core_1 = require$$2; - const plugin_rest_endpoint_methods_1 = require$$3; - const plugin_paginate_rest_1 = require$$4; - exports$1.context = new Context.Context(); - const baseUrl = Utils.getApiBaseUrl(); - exports$1.defaults = { - baseUrl, - request: { - agent: Utils.getProxyAgent(baseUrl), - fetch: Utils.getProxyFetch(baseUrl) - } - }; - exports$1.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports$1.defaults); - /** - * Convience function to correctly format Octokit Options to pass into the constructor. - * - * @param token the repo PAT or GITHUB_TOKEN - * @param options other options to set - */ - function getOctokitOptions(token, options) { - const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller - // Auth - const auth = Utils.getAuthString(token, opts); - if (auth) { - opts.auth = auth; - } - return opts; - } - exports$1.getOctokitOptions = getOctokitOptions; - - } (utils$5)); - return utils$5; -} + // 17. Return fetchParam's controller + return fetchParams.controller + } + + // https://fetch.spec.whatwg.org/#concept-main-fetch + async function mainFetch (fetchParams, recursive = false) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request; + + // 2. Let response be null. + let response = null; + + // 3. If request’s local-URLs-only flag is set and request’s current URL is + // not local, then set response to a network error. + if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { + response = makeNetworkError('local URLs only'); + } + + // 4. Run report Content Security Policy violations for request. + // TODO + + // 5. Upgrade request to a potentially trustworthy URL, if appropriate. + tryUpgradeRequestToAPotentiallyTrustworthyURL(request); + + // 6. If should request be blocked due to a bad port, should fetching request + // be blocked as mixed content, or should request be blocked by Content + // Security Policy returns blocked, then set response to a network error. + if (requestBadPort(request) === 'blocked') { + response = makeNetworkError('bad port'); + } + // TODO: should fetching request be blocked as mixed content? + // TODO: should request be blocked by Content Security Policy? + + // 7. If request’s referrer policy is the empty string, then set request’s + // referrer policy to request’s policy container’s referrer policy. + if (request.referrerPolicy === '') { + request.referrerPolicy = request.policyContainer.referrerPolicy; + } + + // 8. If request’s referrer is not "no-referrer", then set request’s + // referrer to the result of invoking determine request’s referrer. + if (request.referrer !== 'no-referrer') { + request.referrer = determineRequestsReferrer(request); + } + + // 9. Set request’s current URL’s scheme to "https" if all of the following + // conditions are true: + // - request’s current URL’s scheme is "http" + // - request’s current URL’s host is a domain + // - Matching request’s current URL’s host per Known HSTS Host Domain Name + // Matching results in either a superdomain match with an asserted + // includeSubDomains directive or a congruent match (with or without an + // asserted includeSubDomains directive). [HSTS] + // TODO + + // 10. If recursive is false, then run the remaining steps in parallel. + // TODO + + // 11. If response is null, then set response to the result of running + // the steps corresponding to the first matching statement: + if (response === null) { + response = await (async () => { + const currentURL = requestCurrentURL(request); + + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || + // request’s current URL’s scheme is "data" + (currentURL.protocol === 'data:') || + // - request’s mode is "navigate" or "websocket" + (request.mode === 'navigate' || request.mode === 'websocket') + ) { + // 1. Set request’s response tainting to "basic". + request.responseTainting = 'basic'; + + // 2. Return the result of running scheme fetch given fetchParams. + return await schemeFetch(fetchParams) + } + + // request’s mode is "same-origin" + if (request.mode === 'same-origin') { + // 1. Return a network error. + return makeNetworkError('request mode cannot be "same-origin"') + } + + // request’s mode is "no-cors" + if (request.mode === 'no-cors') { + // 1. If request’s redirect mode is not "follow", then return a network + // error. + if (request.redirect !== 'follow') { + return makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ) + } + + // 2. Set request’s response tainting to "opaque". + request.responseTainting = 'opaque'; + + // 3. Return the result of running scheme fetch given fetchParams. + return await schemeFetch(fetchParams) + } + + // request’s current URL’s scheme is not an HTTP(S) scheme + if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + // Return a network error. + return makeNetworkError('URL scheme must be a HTTP(S) scheme') + } + + // - request’s use-CORS-preflight flag is set + // - request’s unsafe-request flag is set and either request’s method is + // not a CORS-safelisted method or CORS-unsafe request-header names with + // request’s header list is not empty + // 1. Set request’s response tainting to "cors". + // 2. Let corsWithPreflightResponse be the result of running HTTP fetch + // given fetchParams and true. + // 3. If corsWithPreflightResponse is a network error, then clear cache + // entries using request. + // 4. Return corsWithPreflightResponse. + // TODO + + // Otherwise + // 1. Set request’s response tainting to "cors". + request.responseTainting = 'cors'; + + // 2. Return the result of running HTTP fetch given fetchParams. + return await httpFetch(fetchParams) + })(); + } + + // 12. If recursive is true, then return response. + if (recursive) { + return response + } -var hasRequiredGithub; + // 13. If response is not a network error and response is not a filtered + // response, then: + if (response.status !== 0 && !response.internalResponse) { + // If request’s response tainting is "cors", then: + if (request.responseTainting === 'cors') ; -function requireGithub () { - if (hasRequiredGithub) return github; - hasRequiredGithub = 1; - var __createBinding = (github && github.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; + // Set response to the following filtered response with response as its + // internal response, depending on request’s response tainting: + if (request.responseTainting === 'basic') { + response = filterResponse(response, 'basic'); + } else if (request.responseTainting === 'cors') { + response = filterResponse(response, 'cors'); + } else if (request.responseTainting === 'opaque') { + response = filterResponse(response, 'opaque'); + } else { + assert(false); } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (github && github.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (github && github.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(github, "__esModule", { value: true }); - github.getOctokit = github.context = void 0; - const Context = __importStar(requireContext()); - const utils_1 = requireUtils$4(); - github.context = new Context.Context(); - /** - * Returns a hydrated octokit ready to use for GitHub Actions - * - * @param token the repo PAT or GITHUB_TOKEN - * @param options other options to set - */ - function getOctokit(token, options, ...additionalPlugins) { - const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); - return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options)); - } - github.getOctokit = getOctokit; - - return github; -} + } -requireGithub(); + // 14. Let internalResponse be response, if response is a network error, + // and response’s internal response otherwise. + let internalResponse = + response.status === 0 ? response : response.internalResponse; -var toolCache = {}; + // 15. If internalResponse’s URL list is empty, then set it to a clone of + // request’s URL list. + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request.urlList); + } -var core$1 = {}; + // 16. If request’s timing allow failed flag is unset, then set + // internalResponse’s timing allow passed flag. + if (!request.timingAllowFailed) { + response.timingAllowPassed = true; + } -var command$1 = {}; + // 17. If response is not a network error and any of the following returns + // blocked + // - should internalResponse to request be blocked as mixed content + // - should internalResponse to request be blocked by Content Security Policy + // - should internalResponse to request be blocked due to its MIME type + // - should internalResponse to request be blocked due to nosniff + // TODO -var utils$3 = {}; + // 18. If response’s type is "opaque", internalResponse’s status is 206, + // internalResponse’s range-requested flag is set, and request’s header + // list does not contain `Range`, then set response and internalResponse + // to a network error. + if ( + response.type === 'opaque' && + internalResponse.status === 206 && + internalResponse.rangeRequested && + !request.headers.contains('range', true) + ) { + response = internalResponse = makeNetworkError(); + } -var hasRequiredUtils$3; + // 19. If response is not a network error and either request’s method is + // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status, + // set internalResponse’s body to null and disregard any enqueuing toward + // it (if any). + if ( + response.status !== 0 && + (request.method === 'HEAD' || + request.method === 'CONNECT' || + nullBodyStatus.includes(internalResponse.status)) + ) { + internalResponse.body = null; + fetchParams.controller.dump = true; + } -function requireUtils$3 () { - if (hasRequiredUtils$3) return utils$3; - hasRequiredUtils$3 = 1; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - Object.defineProperty(utils$3, "__esModule", { value: true }); - utils$3.toCommandProperties = utils$3.toCommandValue = void 0; - /** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ - function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; - } - else if (typeof input === 'string' || input instanceof String) { - return input; - } - return JSON.stringify(input); - } - utils$3.toCommandValue = toCommandValue; - /** - * - * @param annotationProperties - * @returns The command properties to send with the actual annotation command - * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 - */ - function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; + // 20. If request’s integrity metadata is not the empty string, then: + if (request.integrity) { + // 1. Let processBodyError be this step: run fetch finale given fetchParams + // and a network error. + const processBodyError = (reason) => + fetchFinale(fetchParams, makeNetworkError(reason)); + + // 2. If request’s response tainting is "opaque", or response’s body is null, + // then run processBodyError and abort these steps. + if (request.responseTainting === 'opaque' || response.body == null) { + processBodyError(response.error); + return } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn + + // 3. Let processBody given bytes be these steps: + const processBody = (bytes) => { + // 1. If bytes do not match request’s integrity metadata, + // then run processBodyError and abort these steps. [SRI] + if (!bytesMatch(bytes, request.integrity)) { + processBodyError('integrity mismatch'); + return + } + + // 2. Set response’s body to bytes as a body. + response.body = safelyExtractBody(bytes)[0]; + + // 3. Run fetch finale given fetchParams and response. + fetchFinale(fetchParams, response); }; + + // 4. Fully read response’s body given processBody and processBodyError. + await fullyReadBody(response.body, processBody, processBodyError); + } else { + // 21. Otherwise, run fetch finale given fetchParams and response. + fetchFinale(fetchParams, response); + } } - utils$3.toCommandProperties = toCommandProperties; - - return utils$3; -} -var hasRequiredCommand$1; + // https://fetch.spec.whatwg.org/#concept-scheme-fetch + // given a fetch params fetchParams + function schemeFetch (fetchParams) { + // Note: since the connection is destroyed on redirect, which sets fetchParams to a + // cancelled state, we do not want this condition to trigger *unless* there have been + // no redirects. See https://github.com/nodejs/undici/issues/1776 + // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return Promise.resolve(makeAppropriateNetworkError(fetchParams)) + } -function requireCommand$1 () { - if (hasRequiredCommand$1) return command$1; - hasRequiredCommand$1 = 1; - var __createBinding = (command$1 && command$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (command$1 && command$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (command$1 && command$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(command$1, "__esModule", { value: true }); - command$1.issue = command$1.issueCommand = void 0; - const os = __importStar(require$$0$5); - const utils_1 = requireUtils$3(); - /** - * Commands - * - * Command Format: - * ::name key=value,key=value::message - * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value - */ - function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); - } - command$1.issueCommand = issueCommand; - function issue(name, message = '') { - issueCommand(name, {}, message); - } - command$1.issue = issue; - const CMD_STRING = '::'; - class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } - } - function escapeData(s) { - return (0, utils_1.toCommandValue)(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); - } - function escapeProperty(s) { - return (0, utils_1.toCommandValue)(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); - } - - return command$1; -} + // 2. Let request be fetchParams’s request. + const { request } = fetchParams; -var fileCommand$1 = {}; + const { protocol: scheme } = requestCurrentURL(request); -var hasRequiredFileCommand$1; + // 3. Switch on request’s current URL’s scheme and run the associated steps: + switch (scheme) { + case 'about:': { + // If request’s current URL’s path is the string "blank", then return a new response + // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) », + // and body is the empty byte sequence as a body. -function requireFileCommand$1 () { - if (hasRequiredFileCommand$1) return fileCommand$1; - hasRequiredFileCommand$1 = 1; - // For internal use, subject to change. - var __createBinding = (fileCommand$1 && fileCommand$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (fileCommand$1 && fileCommand$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (fileCommand$1 && fileCommand$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(fileCommand$1, "__esModule", { value: true }); - fileCommand$1.prepareKeyValueMessage = fileCommand$1.issueFileCommand = void 0; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - const crypto = __importStar(require$$0$6); - const fs = __importStar(fs__default); - const os = __importStar(require$$0$5); - const utils_1 = requireUtils$3(); - function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { - encoding: 'utf8' - }); - } - fileCommand$1.issueFileCommand = issueFileCommand; - function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${crypto.randomUUID()}`; - const convertedValue = (0, utils_1.toCommandValue)(value); - // These should realistically never happen, but just in case someone finds a - // way to exploit uuid generation let's not allow keys or values that contain - // the delimiter. - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); - } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); + // Otherwise, return a network error. + return Promise.resolve(makeNetworkError('about scheme is not supported')) } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; - } - fileCommand$1.prepareKeyValueMessage = prepareKeyValueMessage; - - return fileCommand$1; -} + case 'blob:': { + if (!resolveObjectURL) { + resolveObjectURL = require$$0$6.resolveObjectURL; + } -var oidcUtils$1 = {}; + // 1. Let blobURLEntry be request’s current URL’s blob URL entry. + const blobURLEntry = requestCurrentURL(request); -var lib$1 = {}; + // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56 + // Buffer.resolveObjectURL does not ignore URL queries. + if (blobURLEntry.search.length !== 0) { + return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.')) + } -var proxy$1 = {}; + const blob = resolveObjectURL(blobURLEntry.toString()); -var hasRequiredProxy$1; + // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s + // object is not a Blob object, then return a network error. + if (request.method !== 'GET' || !isBlobLike(blob)) { + return Promise.resolve(makeNetworkError('invalid method')) + } -function requireProxy$1 () { - if (hasRequiredProxy$1) return proxy$1; - hasRequiredProxy$1 = 1; - Object.defineProperty(proxy$1, "__esModule", { value: true }); - proxy$1.checkBypass = proxy$1.getProxyUrl = void 0; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - try { - return new DecodedURL(proxyVar); - } - catch (_a) { - if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://')) - return new DecodedURL(`http://${proxyVar}`); - } - } - else { - return undefined; - } - } - proxy$1.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperNoProxyItem === '*' || - upperReqHosts.some(x => x === upperNoProxyItem || - x.endsWith(`.${upperNoProxyItem}`) || - (upperNoProxyItem.startsWith('.') && - x.endsWith(`${upperNoProxyItem}`)))) { - return true; - } - } - return false; - } - proxy$1.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return (hostLower === 'localhost' || - hostLower.startsWith('127.') || - hostLower.startsWith('[::1]') || - hostLower.startsWith('[0:0:0:0:0:0:0:1]')); - } - class DecodedURL extends URL { - constructor(url, base) { - super(url, base); - this._decodedUsername = decodeURIComponent(super.username); - this._decodedPassword = decodeURIComponent(super.password); - } - get username() { - return this._decodedUsername; - } - get password() { - return this._decodedPassword; - } - } - - return proxy$1; -} + // 3. Let blob be blobURLEntry’s object. + // Note: done above -var hasRequiredLib$1; + // 4. Let response be a new response. + const response = makeResponse(); -function requireLib$1 () { - if (hasRequiredLib$1) return lib$1; - hasRequiredLib$1 = 1; - /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (lib$1 && lib$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (lib$1 && lib$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (lib$1 && lib$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (lib$1 && lib$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(lib$1, "__esModule", { value: true }); - lib$1.HttpClient = lib$1.isHttps = lib$1.HttpClientResponse = lib$1.HttpClientError = lib$1.getProxyUrl = lib$1.MediaTypes = lib$1.Headers = lib$1.HttpCodes = void 0; - const http = __importStar(require$$0$7); - const https = __importStar(require$$1$2); - const pm = __importStar(requireProxy$1()); - const tunnel = __importStar(requireTunnel()); - const undici_1 = requireUndici(); - var HttpCodes; - (function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib$1.HttpCodes = HttpCodes = {})); - var Headers; - (function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; - })(Headers || (lib$1.Headers = Headers = {})); - var MediaTypes; - (function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib$1.MediaTypes = MediaTypes = {})); - /** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; - } - lib$1.getProxyUrl = getProxyUrl; - const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); + // 5. Let fullLength be blob’s size. + const fullLength = blob.size; + + // 6. Let serializedFullLength be fullLength, serialized and isomorphic encoded. + const serializedFullLength = isomorphicEncode(`${fullLength}`); + + // 7. Let type be blob’s type. + const type = blob.type; + + // 8. If request’s header list does not contain `Range`: + // 9. Otherwise: + if (!request.headersList.contains('range', true)) { + // 1. Let bodyWithType be the result of safely extracting blob. + // Note: in the FileAPI a blob "object" is a Blob *or* a MediaSource. + // In node, this can only ever be a Blob. Therefore we can safely + // use extractBody directly. + const bodyWithType = extractBody(blob); + + // 2. Set response’s status message to `OK`. + response.statusText = 'OK'; + + // 3. Set response’s body to bodyWithType’s body. + response.body = bodyWithType[0]; + + // 4. Set response’s header list to « (`Content-Length`, serializedFullLength), (`Content-Type`, type) ». + response.headersList.set('content-length', serializedFullLength, true); + response.headersList.set('content-type', type, true); + } else { + // 1. Set response’s range-requested flag. + response.rangeRequested = true; + + // 2. Let rangeHeader be the result of getting `Range` from request’s header list. + const rangeHeader = request.headersList.get('range', true); + + // 3. Let rangeValue be the result of parsing a single range header value given rangeHeader and true. + const rangeValue = simpleRangeHeaderValue(rangeHeader, true); + + // 4. If rangeValue is failure, then return a network error. + if (rangeValue === 'failure') { + return Promise.resolve(makeNetworkError('failed to fetch the data URL')) + } + + // 5. Let (rangeStart, rangeEnd) be rangeValue. + let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; + + // 6. If rangeStart is null: + // 7. Otherwise: + if (rangeStart === null) { + // 1. Set rangeStart to fullLength − rangeEnd. + rangeStart = fullLength - rangeEnd; + + // 2. Set rangeEnd to rangeStart + rangeEnd − 1. + rangeEnd = rangeStart + rangeEnd - 1; + } else { + // 1. If rangeStart is greater than or equal to fullLength, then return a network error. + if (rangeStart >= fullLength) { + return Promise.resolve(makeNetworkError('Range start is greater than the blob\'s size.')) + } + + // 2. If rangeEnd is null or rangeEnd is greater than or equal to fullLength, then set + // rangeEnd to fullLength − 1. + if (rangeEnd === null || rangeEnd >= fullLength) { + rangeEnd = fullLength - 1; + } + } + + // 8. Let slicedBlob be the result of invoking slice blob given blob, rangeStart, + // rangeEnd + 1, and type. + const slicedBlob = blob.slice(rangeStart, rangeEnd, type); + + // 9. Let slicedBodyWithType be the result of safely extracting slicedBlob. + // Note: same reason as mentioned above as to why we use extractBody + const slicedBodyWithType = extractBody(slicedBlob); + + // 10. Set response’s body to slicedBodyWithType’s body. + response.body = slicedBodyWithType[0]; + + // 11. Let serializedSlicedLength be slicedBlob’s size, serialized and isomorphic encoded. + const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); + + // 12. Let contentRange be the result of invoking build a content range given rangeStart, + // rangeEnd, and fullLength. + const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); + + // 13. Set response’s status to 206. + response.status = 206; + + // 14. Set response’s status message to `Partial Content`. + response.statusText = 'Partial Content'; + + // 15. Set response’s header list to « (`Content-Length`, serializedSlicedLength), + // (`Content-Type`, type), (`Content-Range`, contentRange) ». + response.headersList.set('content-length', serializedSlicedLength, true); + response.headersList.set('content-type', type, true); + response.headersList.set('content-range', contentRange, true); + } + + // 10. Return response. + return Promise.resolve(response) } - } - lib$1.HttpClientError = HttpClientError; - class HttpClientResponse { - constructor(message) { - this.message = message; + case 'data:': { + // 1. Let dataURLStruct be the result of running the + // data: URL processor on request’s current URL. + const currentURL = requestCurrentURL(request); + const dataURLStruct = dataURLProcessor(currentURL); + + // 2. If dataURLStruct is failure, then return a + // network error. + if (dataURLStruct === 'failure') { + return Promise.resolve(makeNetworkError('failed to fetch the data URL')) + } + + // 3. Let mimeType be dataURLStruct’s MIME type, serialized. + const mimeType = serializeAMimeType(dataURLStruct.mimeType); + + // 4. Return a response whose status message is `OK`, + // header list is « (`Content-Type`, mimeType) », + // and body is dataURLStruct’s body as a body. + return Promise.resolve(makeResponse({ + statusText: 'OK', + headersList: [ + ['content-type', { name: 'Content-Type', value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + })) } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); + case 'file:': { + // For now, unfortunate as it is, file URLs are left as an exercise for the reader. + // When in doubt, return a network error. + return Promise.resolve(makeNetworkError('not implemented... yet...')) } - readBodyBuffer() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - this.message.on('data', (chunk) => { - chunks.push(chunk); - }); - this.message.on('end', () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); + case 'http:': + case 'https:': { + // Return the result of running HTTP fetch given fetchParams. + + return httpFetch(fetchParams) + .catch((err) => makeNetworkError(err)) } + default: { + return Promise.resolve(makeNetworkError('unknown scheme')) + } + } } - lib$1.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; + + // https://fetch.spec.whatwg.org/#finalize-response + function finalizeResponse (fetchParams, response) { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true; + + // 2, If fetchParams’s process response done is not null, then queue a fetch + // task to run fetchParams’s process response done given response, with + // fetchParams’s task destination. + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response)); + } } - lib$1.isHttps = isHttps; - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); + + // https://fetch.spec.whatwg.org/#fetch-finale + function fetchFinale (fetchParams, response) { + // 1. Let timingInfo be fetchParams’s timing info. + let timingInfo = fetchParams.timingInfo; + + // 2. If response is not a network error and fetchParams’s request’s client is a secure context, + // then set timingInfo’s server-timing headers to the result of getting, decoding, and splitting + // `Server-Timing` from response’s internal response’s header list. + // TODO + + // 3. Let processResponseEndOfBody be the following steps: + const processResponseEndOfBody = () => { + // 1. Let unsafeEndTime be the unsafe shared current time. + const unsafeEndTime = Date.now(); // ? + + // 2. If fetchParams’s request’s destination is "document", then set fetchParams’s controller’s + // full timing info to fetchParams’s timing info. + if (fetchParams.request.destination === 'document') { + fetchParams.controller.fullTimingInfo = timingInfo; } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); + + // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global: + fetchParams.controller.reportTimingSteps = () => { + // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return. + if (fetchParams.request.url.protocol !== 'https:') { + return + } + + // 2. Set timingInfo’s end time to the relative high resolution time given unsafeEndTime and global. + timingInfo.endTime = unsafeEndTime; + + // 3. Let cacheState be response’s cache state. + let cacheState = response.cacheState; + + // 4. Let bodyInfo be response’s body info. + const bodyInfo = response.bodyInfo; + + // 5. If response’s timing allow passed flag is not set, then set timingInfo to the result of creating an + // opaque timing info for timingInfo and set cacheState to the empty string. + if (!response.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo(timingInfo); + + cacheState = ''; + } + + // 6. Let responseStatus be 0. + let responseStatus = 0; + + // 7. If fetchParams’s request’s mode is not "navigate" or response’s has-cross-origin-redirects is false: + if (fetchParams.request.mode !== 'navigator' || !response.hasCrossOriginRedirects) { + // 1. Set responseStatus to response’s status. + responseStatus = response.status; + + // 2. Let mimeType be the result of extracting a MIME type from response’s header list. + const mimeType = extractMimeType(response.headersList); + + // 3. If mimeType is not failure, then set bodyInfo’s content type to the result of minimizing a supported MIME type given mimeType. + if (mimeType !== 'failure') { + bodyInfo.contentType = minimizeSupportedMimeType(mimeType); + } + } + + // 8. If fetchParams’s request’s initiator type is non-null, then mark resource timing given timingInfo, + // fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo, + // and responseStatus. + if (fetchParams.request.initiatorType != null) { + // TODO: update markresourcetiming + markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus); + } + }; + + // 4. Let processResponseEndOfBodyTask be the following steps: + const processResponseEndOfBodyTask = () => { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true; + + // 2. If fetchParams’s process response end-of-body is non-null, then run fetchParams’s process + // response end-of-body given response. + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); + } + + // 3. If fetchParams’s request’s initiator type is non-null and fetchParams’s request’s client’s + // global object is fetchParams’s task destination, then run fetchParams’s controller’s report + // timing steps given fetchParams’s request’s client’s global object. + if (fetchParams.request.initiatorType != null) { + fetchParams.controller.reportTimingSteps(); + } + }; + + // 5. Queue a fetch task to run processResponseEndOfBodyTask with fetchParams’s task destination + queueMicrotask(() => processResponseEndOfBodyTask()); + }; + + // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s + // process response given response, with fetchParams’s task destination. + if (fetchParams.processResponse != null) { + queueMicrotask(() => { + fetchParams.processResponse(response); + fetchParams.processResponse = null; + }); + } + + // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response. + const internalResponse = response.type === 'error' ? response : (response.internalResponse ?? response); + + // 6. If internalResponse’s body is null, then run processResponseEndOfBody. + // 7. Otherwise: + if (internalResponse.body == null) { + processResponseEndOfBody(); + } else { + // mcollina: all the following steps of the specs are skipped. + // The internal transform stream is not needed. + // See https://github.com/nodejs/undici/pull/3093#issuecomment-2050198541 + + // 1. Let transformStream be a new TransformStream. + // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, enqueues chunk in transformStream. + // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm + // set to processResponseEndOfBody. + // 4. Set internalResponse’s body’s stream to the result of internalResponse’s body’s stream piped through transformStream. + + finished(internalResponse.body.stream, () => { + processResponseEndOfBody(); + }); + } + } + + // https://fetch.spec.whatwg.org/#http-fetch + async function httpFetch (fetchParams) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request; + + // 2. Let response be null. + let response = null; + + // 3. Let actualResponse be null. + let actualResponse = null; + + // 4. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo; + + // 5. If request’s service-workers mode is "all", then: + if (request.serviceWorkers === 'all') ; + + // 6. If response is null, then: + if (response === null) { + // 1. If makeCORSPreflight is true and one of these conditions is true: + // TODO + + // 2. If request’s redirect mode is "follow", then set request’s + // service-workers mode to "none". + if (request.redirect === 'follow') { + request.serviceWorkers = 'none'; } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); + + // 3. Set response and actualResponse to the result of running + // HTTP-network-or-cache fetch given fetchParams. + actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); + + // 4. If request’s response tainting is "cors" and a CORS check + // for request and response returns failure, then return a network error. + if ( + request.responseTainting === 'cors' && + corsCheck(request, response) === 'failure' + ) { + return makeNetworkError('cors failure') } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); + + // 5. If the TAO check for request and response returns failure, then set + // request’s timing allow failed flag. + if (TAOCheck(request, response) === 'failure') { + request.timingAllowFailed = true; } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); + } + + // 7. If either request’s response tainting or response’s type + // is "opaque", and the cross-origin resource policy check with + // request’s origin, request’s client, request’s destination, + // and actualResponse returns blocked, then return a network error. + if ( + (request.responseTainting === 'opaque' || response.type === 'opaque') && + crossOriginResourcePolicyCheck( + request.origin, + request.client, + request.destination, + actualResponse + ) === 'blocked' + ) { + return makeNetworkError('blocked') + } + + // 8. If actualResponse’s status is a redirect status, then: + if (redirectStatusSet.has(actualResponse.status)) { + // 1. If actualResponse’s status is not 303, request’s body is not null, + // and the connection uses HTTP/2, then user agents may, and are even + // encouraged to, transmit an RST_STREAM frame. + // See, https://github.com/whatwg/fetch/issues/1288 + if (request.redirect !== 'manual') { + fetchParams.controller.connection.destroy(undefined, false); } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); + + // 2. Switch on request’s redirect mode: + if (request.redirect === 'error') { + // Set response to a network error. + response = makeNetworkError('unexpected redirect'); + } else if (request.redirect === 'manual') { + // Set response to an opaque-redirect filtered response whose internal + // response is actualResponse. + // NOTE(spec): On the web this would return an `opaqueredirect` response, + // but that doesn't make sense server side. + // See https://github.com/nodejs/undici/issues/1193. + response = actualResponse; + } else if (request.redirect === 'follow') { + // Set response to the result of running HTTP-redirect fetch given + // fetchParams and response. + response = await httpRedirectFetch(fetchParams, response); + } else { + assert(false); } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); + } + + // 9. Set response’s timing info to timingInfo. + response.timingInfo = timingInfo; + + // 10. Return response. + return response + } + + // https://fetch.spec.whatwg.org/#http-redirect-fetch + function httpRedirectFetch (fetchParams, response) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request; + + // 2. Let actualResponse be response, if response is not a filtered response, + // and response’s internal response otherwise. + const actualResponse = response.internalResponse + ? response.internalResponse + : response; + + // 3. Let locationURL be actualResponse’s location URL given request’s current + // URL’s fragment. + let locationURL; + + try { + locationURL = responseLocationURL( + actualResponse, + requestCurrentURL(request).hash + ); + + // 4. If locationURL is null, then return response. + if (locationURL == null) { + return response } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + } catch (err) { + // 5. If locationURL is failure, then return a network error. + return Promise.resolve(makeNetworkError(err)) + } + + // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network + // error. + if (!urlIsHttpHttpsScheme(locationURL)) { + return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme')) + } + + // 7. If request’s redirect count is 20, then return a network error. + if (request.redirectCount === 20) { + return Promise.resolve(makeNetworkError('redirect count exceeded')) + } + + // 8. Increase request’s redirect count by 1. + request.redirectCount += 1; + + // 9. If request’s mode is "cors", locationURL includes credentials, and + // request’s origin is not same origin with locationURL’s origin, then return + // a network error. + if ( + request.mode === 'cors' && + (locationURL.username || locationURL.password) && + !sameOrigin(request, locationURL) + ) { + return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')) + } + + // 10. If request’s response tainting is "cors" and locationURL includes + // credentials, then return a network error. + if ( + request.responseTainting === 'cors' && + (locationURL.username || locationURL.password) + ) { + return Promise.resolve(makeNetworkError( + 'URL cannot contain credentials for request mode "cors"' + )) + } + + // 11. If actualResponse’s status is not 303, request’s body is non-null, + // and request’s body’s source is null, then return a network error. + if ( + actualResponse.status !== 303 && + request.body != null && + request.body.source == null + ) { + return Promise.resolve(makeNetworkError()) + } + + // 12. If one of the following is true + // - actualResponse’s status is 301 or 302 and request’s method is `POST` + // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD` + if ( + ([301, 302].includes(actualResponse.status) && request.method === 'POST') || + (actualResponse.status === 303 && + !GET_OR_HEAD.includes(request.method)) + ) { + // then: + // 1. Set request’s method to `GET` and request’s body to null. + request.method = 'GET'; + request.body = null; + + // 2. For each headerName of request-body-header name, delete headerName from + // request’s header list. + for (const headerName of requestBodyHeader) { + request.headersList.delete(headerName); } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + } + + // 13. If request’s current URL’s origin is not same origin with locationURL’s + // origin, then for each headerName of CORS non-wildcard request-header name, + // delete headerName from request’s header list. + if (!sameOrigin(requestCurrentURL(request), locationURL)) { + // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name + request.headersList.delete('authorization', true); + + // https://fetch.spec.whatwg.org/#authentication-entries + request.headersList.delete('proxy-authorization', true); + + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. + request.headersList.delete('cookie', true); + request.headersList.delete('host', true); + } + + // 14. If request’s body is non-null, then set request’s body to the first return + // value of safely extracting request’s body’s source. + if (request.body != null) { + assert(request.body.source != null); + request.body = safelyExtractBody(request.body.source)[0]; + } + + // 15. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo; + + // 16. Set timingInfo’s redirect end time and post-redirect start time to the + // coarsened shared current time given fetchParams’s cross-origin isolated + // capability. + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = + coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + + // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s + // redirect start time to timingInfo’s start time. + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime; + } + + // 18. Append locationURL to request’s URL list. + request.urlList.push(locationURL); + + // 19. Invoke set request’s referrer policy on redirect on request and + // actualResponse. + setRequestReferrerPolicyOnRedirect(request, actualResponse); + + // 20. Return the result of running main fetch given fetchParams and true. + return mainFetch(fetchParams, true) + } + + // https://fetch.spec.whatwg.org/#http-network-or-cache-fetch + async function httpNetworkOrCacheFetch ( + fetchParams, + isAuthenticationFetch = false, + isNewConnectionFetch = false + ) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request; + + // 2. Let httpFetchParams be null. + let httpFetchParams = null; + + // 3. Let httpRequest be null. + let httpRequest = null; + + // 4. Let response be null. + let response = null; + + // 8. Run these steps, but abort when the ongoing fetch is terminated: + + // 1. If request’s window is "no-window" and request’s redirect mode is + // "error", then set httpFetchParams to fetchParams and httpRequest to + // request. + if (request.window === 'no-window' && request.redirect === 'error') { + httpFetchParams = fetchParams; + httpRequest = request; + } else { + // Otherwise: + + // 1. Set httpRequest to a clone of request. + httpRequest = cloneRequest(request); + + // 2. Set httpFetchParams to a copy of fetchParams. + httpFetchParams = { ...fetchParams }; + + // 3. Set httpFetchParams’s request to httpRequest. + httpFetchParams.request = httpRequest; + } + + // 3. Let includeCredentials be true if one of + const includeCredentials = + request.credentials === 'include' || + (request.credentials === 'same-origin' && + request.responseTainting === 'basic'); + + // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s + // body is non-null; otherwise null. + const contentLength = httpRequest.body ? httpRequest.body.length : null; + + // 5. Let contentLengthHeaderValue be null. + let contentLengthHeaderValue = null; + + // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or + // `PUT`, then set contentLengthHeaderValue to `0`. + if ( + httpRequest.body == null && + ['POST', 'PUT'].includes(httpRequest.method) + ) { + contentLengthHeaderValue = '0'; + } + + // 7. If contentLength is non-null, then set contentLengthHeaderValue to + // contentLength, serialized and isomorphic encoded. + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); + } + + // 8. If contentLengthHeaderValue is non-null, then append + // `Content-Length`/contentLengthHeaderValue to httpRequest’s header + // list. + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append('content-length', contentLengthHeaderValue, true); + } + + // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, + // contentLengthHeaderValue) to httpRequest’s header list. + + // 10. If contentLength is non-null and httpRequest’s keepalive is true, + // then: + if (contentLength != null && httpRequest.keepalive) ; + + // 11. If httpRequest’s referrer is a URL, then append + // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, + // to httpRequest’s header list. + if (httpRequest.referrer instanceof URL) { + httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true); + } + + // 12. Append a request `Origin` header for httpRequest. + appendRequestOriginHeader(httpRequest); + + // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA] + appendFetchMetadata(httpRequest); + + // 14. If httpRequest’s header list does not contain `User-Agent`, then + // user agents should append `User-Agent`/default `User-Agent` value to + // httpRequest’s header list. + if (!httpRequest.headersList.contains('user-agent', true)) { + httpRequest.headersList.append('user-agent', defaultUserAgent); + } + + // 15. If httpRequest’s cache mode is "default" and httpRequest’s header + // list contains `If-Modified-Since`, `If-None-Match`, + // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set + // httpRequest’s cache mode to "no-store". + if ( + httpRequest.cache === 'default' && + (httpRequest.headersList.contains('if-modified-since', true) || + httpRequest.headersList.contains('if-none-match', true) || + httpRequest.headersList.contains('if-unmodified-since', true) || + httpRequest.headersList.contains('if-match', true) || + httpRequest.headersList.contains('if-range', true)) + ) { + httpRequest.cache = 'no-store'; + } + + // 16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent + // no-cache cache-control header modification flag is unset, and + // httpRequest’s header list does not contain `Cache-Control`, then append + // `Cache-Control`/`max-age=0` to httpRequest’s header list. + if ( + httpRequest.cache === 'no-cache' && + !httpRequest.preventNoCacheCacheControlHeaderModification && + !httpRequest.headersList.contains('cache-control', true) + ) { + httpRequest.headersList.append('cache-control', 'max-age=0', true); + } + + // 17. If httpRequest’s cache mode is "no-store" or "reload", then: + if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { + // 1. If httpRequest’s header list does not contain `Pragma`, then append + // `Pragma`/`no-cache` to httpRequest’s header list. + if (!httpRequest.headersList.contains('pragma', true)) { + httpRequest.headersList.append('pragma', 'no-cache', true); } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + + // 2. If httpRequest’s header list does not contain `Cache-Control`, + // then append `Cache-Control`/`no-cache` to httpRequest’s header list. + if (!httpRequest.headersList.contains('cache-control', true)) { + httpRequest.headersList.append('cache-control', 'no-cache', true); } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + } + + // 18. If httpRequest’s header list contains `Range`, then append + // `Accept-Encoding`/`identity` to httpRequest’s header list. + if (httpRequest.headersList.contains('range', true)) { + httpRequest.headersList.append('accept-encoding', 'identity', true); + } + + // 19. Modify httpRequest’s header list per HTTP. Do not append a given + // header if httpRequest’s header list contains that header’s name. + // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 + if (!httpRequest.headersList.contains('accept-encoding', true)) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate', true); + } else { + httpRequest.headersList.append('accept-encoding', 'gzip, deflate', true); } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); + } + + httpRequest.headersList.delete('host', true); + + // 21. If there’s a proxy-authentication entry, use it as appropriate. + // TODO: proxy-authentication + + // 22. Set httpCache to the result of determining the HTTP cache + // partition, given httpRequest. + // TODO: cache + + // 23. If httpCache is null, then set httpRequest’s cache mode to + // "no-store". + { + httpRequest.cache = 'no-store'; + } + + // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", + // then: + if (httpRequest.cache !== 'no-store' && httpRequest.cache !== 'reload') ; + + // 9. If aborted, then return the appropriate network error for fetchParams. + // TODO + + // 10. If response is null, then: + if (response == null) { + // 1. If httpRequest’s cache mode is "only-if-cached", then return a + // network error. + if (httpRequest.cache === 'only-if-cached') { + return makeNetworkError('only if cached') } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; + + // 2. Let forwardResponse be the result of running HTTP-network fetch + // given httpFetchParams, includeCredentials, and isNewConnectionFetch. + const forwardResponse = await httpNetworkFetch( + httpFetchParams, + includeCredentials, + isNewConnectionFetch + ); + + // 3. If httpRequest’s method is unsafe and forwardResponse’s status is + // in the range 200 to 399, inclusive, invalidate appropriate stored + // responses in httpCache, as per the "Invalidation" chapter of HTTP + // Caching, and set storedResponse to null. [HTTP-CACHING] + if ( + !safeMethodsSet.has(httpRequest.method) && + forwardResponse.status >= 200 && + forwardResponse.status <= 399 + ) ; + + // 5. If response is null, then: + if (response == null) { + // 1. Set response to forwardResponse. + response = forwardResponse; + + // 2. Store httpRequest and forwardResponse in httpCache, as per the + // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING] + // TODO: cache } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); + } + + // 11. Set response’s URL list to a clone of httpRequest’s URL list. + response.urlList = [...httpRequest.urlList]; + + // 12. If httpRequest’s header list contains `Range`, then set response’s + // range-requested flag. + if (httpRequest.headersList.contains('range', true)) { + response.rangeRequested = true; + } + + // 13. Set response’s request-includes-credentials to includeCredentials. + response.requestIncludesCredentials = includeCredentials; + + // 14. If response’s status is 401, httpRequest’s response tainting is not + // "cors", includeCredentials is true, and request’s window is an environment + // settings object, then: + // TODO + + // 15. If response’s status is 407, then: + if (response.status === 407) { + // 1. If request’s window is "no-window", then return a network error. + if (request.window === 'no-window') { + return makeNetworkError() } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } + + // 2. ??? + + // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams) } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); + + // 4. Prompt the end user as appropriate in request’s window and store + // the result as a proxy-authentication entry. [HTTP-AUTH] + // TODO: Invoke some kind of callback? + + // 5. Set response to the result of running HTTP-network-or-cache fetch given + // fetchParams. + // TODO + return makeNetworkError('proxy authentication required') + } + + // 16. If all of the following are true + if ( + // response’s status is 421 + response.status === 421 && + // isNewConnectionFetch is false + !isNewConnectionFetch && + // request’s body is null, or request’s body is non-null and request’s body’s source is non-null + (request.body == null || request.body.source != null) + ) { + // then: + + // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams) } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; + + // 2. Set response to the result of running HTTP-network-or-cache + // fetch given fetchParams, isAuthenticationFetch, and true. + + // TODO (spec): The spec doesn't specify this but we need to cancel + // the active response before we can start a new one. + // https://github.com/whatwg/fetch/issues/1293 + fetchParams.controller.connection.destroy(); + + response = await httpNetworkOrCacheFetch( + fetchParams, + isAuthenticationFetch, + true + ); + } + + // 18. Return response. + return response + } + + // https://fetch.spec.whatwg.org/#http-network-fetch + async function httpNetworkFetch ( + fetchParams, + includeCredentials = false, + forceNewConnection = false + ) { + assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); + + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy (err, abort = true) { + if (!this.destroyed) { + this.destroyed = true; + if (abort) { + this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')); } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); + } } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } + }; + + // 1. Let request be fetchParams’s request. + const request = fetchParams.request; + + // 2. Let response be null. + let response = null; + + // 3. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo; + + // 5. If httpCache is null, then set request’s cache mode to "no-store". + { + request.cache = 'no-store'; + } + + // 8. Switch on request’s mode: + if (request.mode === 'websocket') ; + + // 9. Run these steps, but abort when the ongoing fetch is terminated: + + // 1. If connection is failure, then return a network error. + + // 2. Set timingInfo’s final connection timing info to the result of + // calling clamp and coarsen connection timing info with connection’s + // timing info, timingInfo’s post-redirect start time, and fetchParams’s + // cross-origin isolated capability. + + // 3. If connection is not an HTTP/2 connection, request’s body is non-null, + // and request’s body’s source is null, then append (`Transfer-Encoding`, + // `chunked`) to request’s header list. + + // 4. Set timingInfo’s final network-request start time to the coarsened + // shared current time given fetchParams’s cross-origin isolated + // capability. + + // 5. Set response to the result of making an HTTP request over connection + // using request with the following caveats: + + // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS] + // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH] + + // - If request’s body is non-null, and request’s body’s source is null, + // then the user agent may have a buffer of up to 64 kibibytes and store + // a part of request’s body in that buffer. If the user agent reads from + // request’s body beyond that buffer’s size and the user agent needs to + // resend request, then instead return a network error. + + // - Set timingInfo’s final network-response start time to the coarsened + // shared current time given fetchParams’s cross-origin isolated capability, + // immediately after the user agent’s HTTP parser receives the first byte + // of the response (e.g., frame header bytes for HTTP/2 or response status + // line for HTTP/1.x). + + // - Wait until all the headers are transmitted. + + // - Any responses whose status is in the range 100 to 199, inclusive, + // and is not 101, are to be ignored, except for the purposes of setting + // timingInfo’s final network-response start time above. + + // - If request’s header list contains `Transfer-Encoding`/`chunked` and + // response is transferred via HTTP/1.0 or older, then return a network + // error. + + // - If the HTTP request results in a TLS client certificate dialog, then: + + // 1. If request’s window is an environment settings object, make the + // dialog available in request’s window. + + // 2. Otherwise, return a network error. + + // To transmit request’s body body, run these steps: + let requestBody = null; + // 1. If body is null and fetchParams’s process request end-of-body is + // non-null, then queue a fetch task given fetchParams’s process request + // end-of-body and fetchParams’s task destination. + if (request.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()); + } else if (request.body != null) { + // 2. Otherwise, if body is non-null: + + // 1. Let processBodyChunk given bytes be these steps: + const processBodyChunk = async function * (bytes) { + // 1. If the ongoing fetch is terminated, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. Run this step in parallel: transmit bytes. + yield bytes; + + // 3. If fetchParams’s process request body is non-null, then run + // fetchParams’s process request body given bytes’s length. + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); + }; + + // 2. Let processEndOfBody be these steps: + const processEndOfBody = () => { + // 1. If fetchParams is canceled, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. If fetchParams’s process request end-of-body is non-null, + // then run fetchParams’s process request end-of-body. + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody(); + } + }; + + // 3. Let processBodyError given e be these steps: + const processBodyError = (e) => { + // 1. If fetchParams is canceled, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller. + if (e.name === 'AbortError') { + fetchParams.controller.abort(); + } else { + fetchParams.controller.terminate(e); + } + }; + + // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody, + // processBodyError, and fetchParams’s task destination. + requestBody = (async function * () { + try { + for await (const bytes of request.body.stream) { + yield * processBodyChunk(bytes); } - return info; + processEndOfBody(); + } catch (err) { + processBodyError(err); + } + })(); + } + + try { + // socket is only provided for websockets + const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); + + if (socket) { + response = makeResponse({ status, statusText, headersList, socket }); + } else { + const iterator = body[Symbol.asyncIterator](); + fetchParams.controller.next = () => iterator.next(); + + response = makeResponse({ status, statusText, headersList }); } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); + } catch (err) { + // 10. If aborted, then: + if (err.name === 'AbortError') { + // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame. + fetchParams.controller.connection.destroy(); + + // 2. Return the appropriate network error for fetchParams. + return makeAppropriateNetworkError(fetchParams, err) } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; + + return makeNetworkError(err) + } + + // 11. Let pullAlgorithm be an action that resumes the ongoing fetch + // if it is suspended. + const pullAlgorithm = async () => { + await fetchParams.controller.resume(); + }; + + // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s + // controller with reason, given reason. + const cancelAlgorithm = (reason) => { + // If the aborted fetch was already terminated, then we do not + // need to do anything. + if (!isCancelled(fetchParams)) { + fetchParams.controller.abort(reason); } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if tunneling agent isn't assigned create a new agent - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; + }; + + // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by + // the user agent. + // TODO + + // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object + // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent. + // TODO + + // 15. Let stream be a new ReadableStream. + // 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm, + // cancelAlgorithm set to cancelAlgorithm. + const stream = new ReadableStream( + { + async start (controller) { + fetchParams.controller.controller = controller; + }, + async pull (controller) { + await pullAlgorithm(); + }, + async cancel (reason) { + await cancelAlgorithm(reason); + }, + type: 'bytes' } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; - } - // if agent is already assigned use that agent. - if (proxyAgent) { - return proxyAgent; + ); + + // 17. Run these steps, but abort when the ongoing fetch is terminated: + + // 1. Set response’s body to a new body whose stream is stream. + response.body = { stream, source: null, length: null }; + + // 2. If response is not a network error and request’s cache mode is + // not "no-store", then update response in httpCache for request. + // TODO + + // 3. If includeCredentials is true and the user agent is not configured + // to block cookies for request (see section 7 of [COOKIES]), then run the + // "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on + // the value of each header whose name is a byte-case-insensitive match for + // `Set-Cookie` in response’s header list, if any, and request’s current URL. + // TODO + + // 18. If aborted, then: + // TODO + + // 19. Run these steps in parallel: + + // 1. Run these steps, but abort when fetchParams is canceled: + fetchParams.controller.onAborted = onAborted; + fetchParams.controller.on('terminated', onAborted); + fetchParams.controller.resume = async () => { + // 1. While true + while (true) { + // 1-3. See onData... + + // 4. Set bytes to the result of handling content codings given + // codings and bytes. + let bytes; + let isFailure; + try { + const { done, value } = await fetchParams.controller.next(); + + if (isAborted(fetchParams)) { + break } - const usingSsl = parsedUrl.protocol === 'https:'; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}` - }))); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); + + bytes = done ? undefined : value; + } catch (err) { + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + // zlib doesn't like empty streams. + bytes = undefined; + } else { + bytes = err; + + // err may be propagated from the result of calling readablestream.cancel, + // which might not be an error. https://github.com/nodejs/undici/issues/2009 + isFailure = true; } - return proxyAgent; + } + + if (bytes === undefined) { + // 2. Otherwise, if the bytes transmission for response’s message + // body is done normally and stream is readable, then close + // stream, finalize response for fetchParams and response, and + // abort these in-parallel steps. + readableStreamClose(fetchParams.controller.controller); + + finalizeResponse(fetchParams, response); + + return + } + + // 5. Increase timingInfo’s decoded body size by bytes’s length. + timingInfo.decodedBodySize += bytes?.byteLength ?? 0; + + // 6. If bytes is failure, then terminate fetchParams’s controller. + if (isFailure) { + fetchParams.controller.terminate(bytes); + return + } + + // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes + // into stream. + const buffer = new Uint8Array(bytes); + if (buffer.byteLength) { + fetchParams.controller.controller.enqueue(buffer); + } + + // 8. If stream is errored, then terminate the ongoing fetch. + if (isErrored(stream)) { + fetchParams.controller.terminate(); + return + } + + // 9. If stream doesn’t need more data ask the user agent to suspend + // the ongoing fetch. + if (fetchParams.controller.controller.desiredSize <= 0) { + return + } } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); + }; + + // 2. If aborted, then: + function onAborted (reason) { + // 2. If fetchParams is aborted, then: + if (isAborted(fetchParams)) { + // 1. Set response’s aborted flag. + response.aborted = true; + + // 2. If stream is readable, then error stream with the result of + // deserialize a serialized abort reason given fetchParams’s + // controller’s serialized abort reason and an + // implementation-defined realm. + if (isReadable(stream)) { + fetchParams.controller.controller.error( + fetchParams.controller.serializedAbortReason + ); + } + } else { + // 3. Otherwise, if stream is readable, error stream with a TypeError. + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError('terminated', { + cause: isErrorLike(reason) ? reason : undefined + })); + } } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } - else { - resolve(response); + + // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame. + // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so. + fetchParams.controller.connection.destroy(); + } + + // 20. Return response. + return response + + function dispatch ({ body }) { + const url = requestCurrentURL(request); + /** @type {import('../..').Agent} */ + const agent = fetchParams.controller.dispatcher; + + return new Promise((resolve, reject) => agent.dispatch( + { + path: url.pathname + url.search, + origin: url.origin, + method: request.method, + body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body, + headers: request.headersList.entries, + maxRedirections: 0, + upgrade: request.mode === 'websocket' ? 'websocket' : undefined + }, + { + body: null, + abort: null, + + onConnect (abort) { + // TODO (fix): Do we need connection here? + const { connection } = fetchParams.controller; + + // Set timingInfo’s final connection timing info to the result of calling clamp and coarsen + // connection timing info with connection’s timing info, timingInfo’s post-redirect start + // time, and fetchParams’s cross-origin isolated capability. + // TODO: implement connection timing + timingInfo.finalConnectionTimingInfo = clampAndCoarsenConnectionTimingInfo(undefined, timingInfo.postRedirectStartTime, fetchParams.crossOriginIsolatedCapability); + + if (connection.destroyed) { + abort(new DOMException('The operation was aborted.', 'AbortError')); + } else { + fetchParams.controller.on('terminated', abort); + this.abort = connection.abort = abort; + } + + // Set timingInfo’s final network-request start time to the coarsened shared current time given + // fetchParams’s cross-origin isolated capability. + timingInfo.finalNetworkRequestStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + + onResponseStarted () { + // Set timingInfo’s final network-response start time to the coarsened shared current + // time given fetchParams’s cross-origin isolated capability, immediately after the + // user agent’s HTTP parser receives the first byte of the response (e.g., frame header + // bytes for HTTP/2 or response status line for HTTP/1.x). + timingInfo.finalNetworkResponseStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + }, + + onHeaders (status, rawHeaders, resume, statusText) { + if (status < 200) { + return + } + + let location = ''; + + const headersList = new HeadersList(); + + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true); + } + location = headersList.get('location', true); + + this.body = new Readable({ read: resume }); + + const decoders = []; + + const willFollow = location && request.redirect === 'follow' && + redirectStatusSet.has(status); + + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding + if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + const contentEncoding = headersList.get('content-encoding', true); + // "All content-coding values are case-insensitive..." + /** @type {string[]} */ + const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []; + + // Limit the number of content-encodings to prevent resource exhaustion. + // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206). + const maxContentEncodings = 5; + if (codings.length > maxContentEncodings) { + reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`)); + return true + } + + for (let i = codings.length - 1; i >= 0; --i) { + const coding = codings[i].trim(); + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 + if (coding === 'x-gzip' || coding === 'gzip') { + decoders.push(zlib.createGunzip({ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === 'deflate') { + decoders.push(createInflate({ + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === 'br') { + decoders.push(zlib.createBrotliDecompress({ + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH + })); + } else { + decoders.length = 0; + break + } + } + } + + const onError = this.onError.bind(this); + + resolve({ + status, + statusText, + headersList, + body: decoders.length + ? pipeline(this.body, ...decoders, (err) => { + if (err) { + this.onError(err); } - })); - }); - } + }).on('error', onError) + : this.body.on('error', onError) + }); + + return true + }, + + onData (chunk) { + if (fetchParams.controller.dump) { + return + } + + // 1. If one or more bytes have been transmitted from response’s + // message body, then: + + // 1. Let bytes be the transmitted bytes. + const bytes = chunk; + + // 2. Let codings be the result of extracting header list values + // given `Content-Encoding` and response’s header list. + // See pullAlgorithm. + + // 3. Increase timingInfo’s encoded body size by bytes’s length. + timingInfo.encodedBodySize += bytes.byteLength; + + // 4. See pullAlgorithm... + + return this.body.push(bytes) + }, + + onComplete () { + if (this.abort) { + fetchParams.controller.off('terminated', this.abort); + } + + if (fetchParams.controller.onAborted) { + fetchParams.controller.off('terminated', fetchParams.controller.onAborted); + } + + fetchParams.controller.ended = true; + + this.body.push(null); + }, + + onError (error) { + if (this.abort) { + fetchParams.controller.off('terminated', this.abort); + } + + this.body?.destroy(error); + + fetchParams.controller.terminate(error); + + reject(error); + }, + + onUpgrade (status, rawHeaders, socket) { + if (status !== 101) { + return + } + + const headersList = new HeadersList(); + + for (let i = 0; i < rawHeaders.length; i += 2) { + headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true); + } + + resolve({ + status, + statusText: STATUS_CODES[status], + headersList, + socket + }); + + return true + } + } + )) + } } - lib$1.HttpClient = HttpClient; - const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - - return lib$1; + + fetch_1 = { + fetch, + Fetch, + fetching, + finalizeAndReportTiming + }; + return fetch_1; } -var auth$1 = {}; +var symbols$2; +var hasRequiredSymbols$2; -var hasRequiredAuth$1; +function requireSymbols$2 () { + if (hasRequiredSymbols$2) return symbols$2; + hasRequiredSymbols$2 = 1; -function requireAuth$1 () { - if (hasRequiredAuth$1) return auth$1; - hasRequiredAuth$1 = 1; - var __awaiter = (auth$1 && auth$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + symbols$2 = { + kState: Symbol('FileReader state'), + kResult: Symbol('FileReader result'), + kError: Symbol('FileReader error'), + kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'), + kEvents: Symbol('FileReader events'), + kAborted: Symbol('FileReader aborted') }; - Object.defineProperty(auth$1, "__esModule", { value: true }); - auth$1.PersonalAccessTokenCredentialHandler = auth$1.BearerCredentialHandler = auth$1.BasicCredentialHandler = void 0; - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } - } - auth$1.BasicCredentialHandler = BasicCredentialHandler; - class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Bearer ${this.token}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } + return symbols$2; +} + +var progressevent; +var hasRequiredProgressevent; + +function requireProgressevent () { + if (hasRequiredProgressevent) return progressevent; + hasRequiredProgressevent = 1; + + const { webidl } = requireWebidl(); + + const kState = Symbol('ProgressEvent state'); + + /** + * @see https://xhr.spec.whatwg.org/#progressevent + */ + class ProgressEvent extends Event { + constructor (type, eventInitDict = {}) { + type = webidl.converters.DOMString(type, 'ProgressEvent constructor', 'type'); + eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); + + super(type, eventInitDict); + + this[kState] = { + lengthComputable: eventInitDict.lengthComputable, + loaded: eventInitDict.loaded, + total: eventInitDict.total + }; + } + + get lengthComputable () { + webidl.brandCheck(this, ProgressEvent); + + return this[kState].lengthComputable + } + + get loaded () { + webidl.brandCheck(this, ProgressEvent); + + return this[kState].loaded + } + + get total () { + webidl.brandCheck(this, ProgressEvent); + + return this[kState].total + } } - auth$1.BearerCredentialHandler = BearerCredentialHandler; - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } + + webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ + { + key: 'lengthComputable', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'loaded', + converter: webidl.converters['unsigned long long'], + defaultValue: () => 0 + }, + { + key: 'total', + converter: webidl.converters['unsigned long long'], + defaultValue: () => 0 + }, + { + key: 'bubbles', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'cancelable', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'composed', + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]); + + progressevent = { + ProgressEvent + }; + return progressevent; +} + +var encoding; +var hasRequiredEncoding; + +function requireEncoding () { + if (hasRequiredEncoding) return encoding; + hasRequiredEncoding = 1; + + /** + * @see https://encoding.spec.whatwg.org/#concept-encoding-get + * @param {string|undefined} label + */ + function getEncoding (label) { + if (!label) { + return 'failure' + } + + // 1. Remove any leading and trailing ASCII whitespace from label. + // 2. If label is an ASCII case-insensitive match for any of the + // labels listed in the table below, then return the + // corresponding encoding; otherwise return failure. + switch (label.trim().toLowerCase()) { + case 'unicode-1-1-utf-8': + case 'unicode11utf8': + case 'unicode20utf8': + case 'utf-8': + case 'utf8': + case 'x-unicode20utf8': + return 'UTF-8' + case '866': + case 'cp866': + case 'csibm866': + case 'ibm866': + return 'IBM866' + case 'csisolatin2': + case 'iso-8859-2': + case 'iso-ir-101': + case 'iso8859-2': + case 'iso88592': + case 'iso_8859-2': + case 'iso_8859-2:1987': + case 'l2': + case 'latin2': + return 'ISO-8859-2' + case 'csisolatin3': + case 'iso-8859-3': + case 'iso-ir-109': + case 'iso8859-3': + case 'iso88593': + case 'iso_8859-3': + case 'iso_8859-3:1988': + case 'l3': + case 'latin3': + return 'ISO-8859-3' + case 'csisolatin4': + case 'iso-8859-4': + case 'iso-ir-110': + case 'iso8859-4': + case 'iso88594': + case 'iso_8859-4': + case 'iso_8859-4:1988': + case 'l4': + case 'latin4': + return 'ISO-8859-4' + case 'csisolatincyrillic': + case 'cyrillic': + case 'iso-8859-5': + case 'iso-ir-144': + case 'iso8859-5': + case 'iso88595': + case 'iso_8859-5': + case 'iso_8859-5:1988': + return 'ISO-8859-5' + case 'arabic': + case 'asmo-708': + case 'csiso88596e': + case 'csiso88596i': + case 'csisolatinarabic': + case 'ecma-114': + case 'iso-8859-6': + case 'iso-8859-6-e': + case 'iso-8859-6-i': + case 'iso-ir-127': + case 'iso8859-6': + case 'iso88596': + case 'iso_8859-6': + case 'iso_8859-6:1987': + return 'ISO-8859-6' + case 'csisolatingreek': + case 'ecma-118': + case 'elot_928': + case 'greek': + case 'greek8': + case 'iso-8859-7': + case 'iso-ir-126': + case 'iso8859-7': + case 'iso88597': + case 'iso_8859-7': + case 'iso_8859-7:1987': + case 'sun_eu_greek': + return 'ISO-8859-7' + case 'csiso88598e': + case 'csisolatinhebrew': + case 'hebrew': + case 'iso-8859-8': + case 'iso-8859-8-e': + case 'iso-ir-138': + case 'iso8859-8': + case 'iso88598': + case 'iso_8859-8': + case 'iso_8859-8:1988': + case 'visual': + return 'ISO-8859-8' + case 'csiso88598i': + case 'iso-8859-8-i': + case 'logical': + return 'ISO-8859-8-I' + case 'csisolatin6': + case 'iso-8859-10': + case 'iso-ir-157': + case 'iso8859-10': + case 'iso885910': + case 'l6': + case 'latin6': + return 'ISO-8859-10' + case 'iso-8859-13': + case 'iso8859-13': + case 'iso885913': + return 'ISO-8859-13' + case 'iso-8859-14': + case 'iso8859-14': + case 'iso885914': + return 'ISO-8859-14' + case 'csisolatin9': + case 'iso-8859-15': + case 'iso8859-15': + case 'iso885915': + case 'iso_8859-15': + case 'l9': + return 'ISO-8859-15' + case 'iso-8859-16': + return 'ISO-8859-16' + case 'cskoi8r': + case 'koi': + case 'koi8': + case 'koi8-r': + case 'koi8_r': + return 'KOI8-R' + case 'koi8-ru': + case 'koi8-u': + return 'KOI8-U' + case 'csmacintosh': + case 'mac': + case 'macintosh': + case 'x-mac-roman': + return 'macintosh' + case 'iso-8859-11': + case 'iso8859-11': + case 'iso885911': + case 'tis-620': + case 'windows-874': + return 'windows-874' + case 'cp1250': + case 'windows-1250': + case 'x-cp1250': + return 'windows-1250' + case 'cp1251': + case 'windows-1251': + case 'x-cp1251': + return 'windows-1251' + case 'ansi_x3.4-1968': + case 'ascii': + case 'cp1252': + case 'cp819': + case 'csisolatin1': + case 'ibm819': + case 'iso-8859-1': + case 'iso-ir-100': + case 'iso8859-1': + case 'iso88591': + case 'iso_8859-1': + case 'iso_8859-1:1987': + case 'l1': + case 'latin1': + case 'us-ascii': + case 'windows-1252': + case 'x-cp1252': + return 'windows-1252' + case 'cp1253': + case 'windows-1253': + case 'x-cp1253': + return 'windows-1253' + case 'cp1254': + case 'csisolatin5': + case 'iso-8859-9': + case 'iso-ir-148': + case 'iso8859-9': + case 'iso88599': + case 'iso_8859-9': + case 'iso_8859-9:1989': + case 'l5': + case 'latin5': + case 'windows-1254': + case 'x-cp1254': + return 'windows-1254' + case 'cp1255': + case 'windows-1255': + case 'x-cp1255': + return 'windows-1255' + case 'cp1256': + case 'windows-1256': + case 'x-cp1256': + return 'windows-1256' + case 'cp1257': + case 'windows-1257': + case 'x-cp1257': + return 'windows-1257' + case 'cp1258': + case 'windows-1258': + case 'x-cp1258': + return 'windows-1258' + case 'x-mac-cyrillic': + case 'x-mac-ukrainian': + return 'x-mac-cyrillic' + case 'chinese': + case 'csgb2312': + case 'csiso58gb231280': + case 'gb2312': + case 'gb_2312': + case 'gb_2312-80': + case 'gbk': + case 'iso-ir-58': + case 'x-gbk': + return 'GBK' + case 'gb18030': + return 'gb18030' + case 'big5': + case 'big5-hkscs': + case 'cn-big5': + case 'csbig5': + case 'x-x-big5': + return 'Big5' + case 'cseucpkdfmtjapanese': + case 'euc-jp': + case 'x-euc-jp': + return 'EUC-JP' + case 'csiso2022jp': + case 'iso-2022-jp': + return 'ISO-2022-JP' + case 'csshiftjis': + case 'ms932': + case 'ms_kanji': + case 'shift-jis': + case 'shift_jis': + case 'sjis': + case 'windows-31j': + case 'x-sjis': + return 'Shift_JIS' + case 'cseuckr': + case 'csksc56011987': + case 'euc-kr': + case 'iso-ir-149': + case 'korean': + case 'ks_c_5601-1987': + case 'ks_c_5601-1989': + case 'ksc5601': + case 'ksc_5601': + case 'windows-949': + return 'EUC-KR' + case 'csiso2022kr': + case 'hz-gb-2312': + case 'iso-2022-cn': + case 'iso-2022-cn-ext': + case 'iso-2022-kr': + case 'replacement': + return 'replacement' + case 'unicodefffe': + case 'utf-16be': + return 'UTF-16BE' + case 'csunicode': + case 'iso-10646-ucs-2': + case 'ucs-2': + case 'unicode': + case 'unicodefeff': + case 'utf-16': + case 'utf-16le': + return 'UTF-16LE' + case 'x-user-defined': + return 'x-user-defined' + default: return 'failure' + } } - auth$1.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - - return auth$1; + + encoding = { + getEncoding + }; + return encoding; } -var hasRequiredOidcUtils$1; +var util$6; +var hasRequiredUtil$6; -function requireOidcUtils$1 () { - if (hasRequiredOidcUtils$1) return oidcUtils$1; - hasRequiredOidcUtils$1 = 1; - var __awaiter = (oidcUtils$1 && oidcUtils$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); +function requireUtil$6 () { + if (hasRequiredUtil$6) return util$6; + hasRequiredUtil$6 = 1; + + const { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired + } = requireSymbols$2(); + const { ProgressEvent } = requireProgressevent(); + const { getEncoding } = requireEncoding(); + const { serializeAMimeType, parseMIMEType } = requireDataUrl(); + const { types } = require$$0$a; + const { StringDecoder } = require$$5$3; + const { btoa } = require$$0$6; + + /** @type {PropertyDescriptor} */ + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false }; - Object.defineProperty(oidcUtils$1, "__esModule", { value: true }); - oidcUtils$1.OidcClient = void 0; - const http_client_1 = requireLib$1(); - const auth_1 = requireAuth$1(); - const core_1 = requireCore$1(); - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; - if (!token) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); - } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; - if (!runtimeUrl) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); + + /** + * @see https://w3c.github.io/FileAPI/#readOperation + * @param {import('./filereader').FileReader} fr + * @param {import('buffer').Blob} blob + * @param {string} type + * @param {string?} encodingName + */ + function readOperation (fr, blob, type, encodingName) { + // 1. If fr’s state is "loading", throw an InvalidStateError + // DOMException. + if (fr[kState] === 'loading') { + throw new DOMException('Invalid state', 'InvalidStateError') + } + + // 2. Set fr’s state to "loading". + fr[kState] = 'loading'; + + // 3. Set fr’s result to null. + fr[kResult] = null; + + // 4. Set fr’s error to null. + fr[kError] = null; + + // 5. Let stream be the result of calling get stream on blob. + /** @type {import('stream/web').ReadableStream} */ + const stream = blob.stream(); + + // 6. Let reader be the result of getting a reader from stream. + const reader = stream.getReader(); + + // 7. Let bytes be an empty byte sequence. + /** @type {Uint8Array[]} */ + const bytes = []; + + // 8. Let chunkPromise be the result of reading a chunk from + // stream with reader. + let chunkPromise = reader.read(); + + // 9. Let isFirstChunk be true. + let isFirstChunk = true + + // 10. In parallel, while true: + // Note: "In parallel" just means non-blocking + // Note 2: readOperation itself cannot be async as double + // reading the body would then reject the promise, instead + // of throwing an error. + ;(async () => { + while (!fr[kAborted]) { + // 1. Wait for chunkPromise to be fulfilled or rejected. + try { + const { done, value } = await chunkPromise; + + // 2. If chunkPromise is fulfilled, and isFirstChunk is + // true, queue a task to fire a progress event called + // loadstart at fr. + if (isFirstChunk && !fr[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent('loadstart', fr); + }); } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient - .getJson(id_token_url) - .catch(error => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n - Error Message: ${error.message}`); + + // 3. Set isFirstChunk to false. + isFirstChunk = false; + + // 4. If chunkPromise is fulfilled with an object whose + // done property is false and whose value property is + // a Uint8Array object, run these steps: + if (!done && types.isUint8Array(value)) { + // 1. Let bs be the byte sequence represented by the + // Uint8Array object. + + // 2. Append bs to bytes. + bytes.push(value); + + // 3. If roughly 50ms have passed since these steps + // were last invoked, queue a task to fire a + // progress event called progress at fr. + if ( + ( + fr[kLastProgressEventFired] === undefined || + Date.now() - fr[kLastProgressEventFired] >= 50 + ) && + !fr[kAborted] + ) { + fr[kLastProgressEventFired] = Date.now(); + queueMicrotask(() => { + fireAProgressEvent('progress', fr); }); - const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; - if (!id_token) { - throw new Error('Response json body do not have ID Token field'); - } - return id_token; - }); - } - static getIDToken(audience) { - return __awaiter(this, void 0, void 0, function* () { + } + + // 4. Set chunkPromise to the result of reading a + // chunk from stream with reader. + chunkPromise = reader.read(); + } else if (done) { + // 5. Otherwise, if chunkPromise is fulfilled with an + // object whose done property is true, queue a task + // to run the following steps and abort this algorithm: + queueMicrotask(() => { + // 1. Set fr’s state to "done". + fr[kState] = 'done'; + + // 2. Let result be the result of package data given + // bytes, type, blob’s type, and encodingName. try { - // New ID Token is requested from action service - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - (0, core_1.debug)(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - (0, core_1.setSecret)(id_token); - return id_token; - } - catch (error) { - throw new Error(`Error message: ${error.message}`); - } - }); - } - } - oidcUtils$1.OidcClient = OidcClient; - - return oidcUtils$1; -} + const result = packageData(bytes, type, blob.type, encodingName); -var summary$1 = {}; + // 4. Else: -var hasRequiredSummary$1; + if (fr[kAborted]) { + return + } -function requireSummary$1 () { - if (hasRequiredSummary$1) return summary$1; - hasRequiredSummary$1 = 1; - (function (exports$1) { - var __awaiter = (summary$1 && summary$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; - const os_1 = require$$0$5; - const fs_1 = fs__default; - const { access, appendFile, writeFile } = fs_1.promises; - exports$1.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; - exports$1.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; - class Summary { - constructor() { - this._buffer = ''; - } - /** - * Finds the summary file path from the environment, rejects if env var is not found or file does not exist - * Also checks r/w permissions. - * - * @returns step summary file path - */ - filePath() { - return __awaiter(this, void 0, void 0, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports$1.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for $${exports$1.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } - catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - /** - * Wraps content in an HTML tag, adding any HTML attributes - * - * @param {string} tag HTML tag to wrap - * @param {string | null} content content within the tag - * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add - * - * @returns {string} content wrapped in HTML element - */ - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs) - .map(([key, value]) => ` ${key}="${value}"`) - .join(''); - if (!content) { - return `<${tag}${htmlAttrs}>`; - } - return `<${tag}${htmlAttrs}>${content}`; - } - /** - * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. - * - * @param {SummaryWriteOptions} [options] (optional) options for write operation - * - * @returns {Promise} summary instance - */ - write(options) { - return __awaiter(this, void 0, void 0, function* () { - const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); - return this.emptyBuffer(); - }); - } - /** - * Clears the summary buffer and wipes the summary file - * - * @returns {Summary} summary instance - */ - clear() { - return __awaiter(this, void 0, void 0, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - /** - * Returns the current summary buffer as a string - * - * @returns {string} string of summary buffer - */ - stringify() { - return this._buffer; - } - /** - * If the summary buffer is empty - * - * @returns {boolen} true if the buffer is empty - */ - isEmptyBuffer() { - return this._buffer.length === 0; - } - /** - * Resets the summary buffer without writing to summary file - * - * @returns {Summary} summary instance - */ - emptyBuffer() { - this._buffer = ''; - return this; - } - /** - * Adds raw text to the summary buffer - * - * @param {string} text content to add - * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) - * - * @returns {Summary} summary instance - */ - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; - } - /** - * Adds the operating system-specific end-of-line marker to the buffer - * - * @returns {Summary} summary instance - */ - addEOL() { - return this.addRaw(os_1.EOL); - } - /** - * Adds an HTML codeblock to the summary buffer - * - * @param {string} code content to render within fenced code block - * @param {string} lang (optional) language to syntax highlight code - * - * @returns {Summary} summary instance - */ - addCodeBlock(code, lang) { - const attrs = Object.assign({}, (lang && { lang })); - const element = this.wrap('pre', this.wrap('code', code), attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML list to the summary buffer - * - * @param {string[]} items list of items to render - * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) - * - * @returns {Summary} summary instance - */ - addList(items, ordered = false) { - const tag = ordered ? 'ol' : 'ul'; - const listItems = items.map(item => this.wrap('li', item)).join(''); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML table to the summary buffer - * - * @param {SummaryTableCell[]} rows table rows - * - * @returns {Summary} summary instance - */ - addTable(rows) { - const tableBody = rows - .map(row => { - const cells = row - .map(cell => { - if (typeof cell === 'string') { - return this.wrap('td', cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? 'th' : 'td'; - const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); - return this.wrap(tag, data, attrs); - }) - .join(''); - return this.wrap('tr', cells); - }) - .join(''); - const element = this.wrap('table', tableBody); - return this.addRaw(element).addEOL(); - } - /** - * Adds a collapsable HTML details element to the summary buffer - * - * @param {string} label text for the closed state - * @param {string} content collapsable content - * - * @returns {Summary} summary instance - */ - addDetails(label, content) { - const element = this.wrap('details', this.wrap('summary', label) + content); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML image tag to the summary buffer - * - * @param {string} src path to the image you to embed - * @param {string} alt text description of the image - * @param {SummaryImageOptions} options (optional) addition image attributes - * - * @returns {Summary} summary instance - */ - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); - const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML section heading element - * - * @param {string} text heading text - * @param {number | string} [level=1] (optional) the heading level, default: 1 - * - * @returns {Summary} summary instance - */ - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) - ? tag - : 'h1'; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML thematic break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap('hr', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML line break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap('br', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, (cite && { cite })); - const element = this.wrap('blockquote', text, attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap('a', text, { href }); - return this.addRaw(element).addEOL(); - } - } - const _summary = new Summary(); - /** - * @deprecated use `core.summary` - */ - exports$1.markdownSummary = _summary; - exports$1.summary = _summary; - - } (summary$1)); - return summary$1; -} + // 1. Set fr’s result to result. + fr[kResult] = result; + + // 2. Fire a progress event called load at the fr. + fireAProgressEvent('load', fr); + } catch (error) { + // 3. If package data threw an exception error: + + // 1. Set fr’s error to error. + fr[kError] = error; + + // 2. Fire a progress event called error at fr. + fireAProgressEvent('error', fr); + } + + // 5. If fr’s state is not "loading", fire a progress + // event called loadend at the fr. + if (fr[kState] !== 'loading') { + fireAProgressEvent('loadend', fr); + } + }); -var pathUtils$1 = {}; + break + } + } catch (error) { + if (fr[kAborted]) { + return + } -var hasRequiredPathUtils$1; + // 6. Otherwise, if chunkPromise is rejected with an + // error error, queue a task to run the following + // steps and abort this algorithm: + queueMicrotask(() => { + // 1. Set fr’s state to "done". + fr[kState] = 'done'; -function requirePathUtils$1 () { - if (hasRequiredPathUtils$1) return pathUtils$1; - hasRequiredPathUtils$1 = 1; - var __createBinding = (pathUtils$1 && pathUtils$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; + // 2. Set fr’s error to error. + fr[kError] = error; + + // 3. Fire a progress event called error at fr. + fireAProgressEvent('error', fr); + + // 4. If fr’s state is not "loading", fire a progress + // event called loadend at fr. + if (fr[kState] !== 'loading') { + fireAProgressEvent('loadend', fr); + } + }); + + break + } } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (pathUtils$1 && pathUtils$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (pathUtils$1 && pathUtils$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(pathUtils$1, "__esModule", { value: true }); - pathUtils$1.toPlatformPath = pathUtils$1.toWin32Path = pathUtils$1.toPosixPath = void 0; - const path = __importStar(require$$1__default); + })(); + } + /** - * toPosixPath converts the given path to the posix form. On Windows, \\ will be - * replaced with /. - * - * @param pth. Path to transform. - * @return string Posix path. + * @see https://w3c.github.io/FileAPI/#fire-a-progress-event + * @see https://dom.spec.whatwg.org/#concept-event-fire + * @param {string} e The name of the event + * @param {import('./filereader').FileReader} reader */ - function toPosixPath(pth) { - return pth.replace(/[\\]/g, '/'); + function fireAProgressEvent (e, reader) { + // The progress event e does not bubble. e.bubbles must be false + // The progress event e is NOT cancelable. e.cancelable must be false + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }); + + reader.dispatchEvent(event); } - pathUtils$1.toPosixPath = toPosixPath; + /** - * toWin32Path converts the given path to the win32 form. On Linux, / will be - * replaced with \\. - * - * @param pth. Path to transform. - * @return string Win32 path. + * @see https://w3c.github.io/FileAPI/#blob-package-data + * @param {Uint8Array[]} bytes + * @param {string} type + * @param {string?} mimeType + * @param {string?} encodingName */ - function toWin32Path(pth) { - return pth.replace(/[/]/g, '\\'); + function packageData (bytes, type, mimeType, encodingName) { + // 1. A Blob has an associated package data algorithm, given + // bytes, a type, a optional mimeType, and a optional + // encodingName, which switches on type and runs the + // associated steps: + + switch (type) { + case 'DataURL': { + // 1. Return bytes as a DataURL [RFC2397] subject to + // the considerations below: + // * Use mimeType as part of the Data URL if it is + // available in keeping with the Data URL + // specification [RFC2397]. + // * If mimeType is not available return a Data URL + // without a media-type. [RFC2397]. + + // https://datatracker.ietf.org/doc/html/rfc2397#section-3 + // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data + // mediatype := [ type "/" subtype ] *( ";" parameter ) + // data := *urlchar + // parameter := attribute "=" value + let dataURL = 'data:'; + + const parsed = parseMIMEType(mimeType || 'application/octet-stream'); + + if (parsed !== 'failure') { + dataURL += serializeAMimeType(parsed); + } + + dataURL += ';base64,'; + + const decoder = new StringDecoder('latin1'); + + for (const chunk of bytes) { + dataURL += btoa(decoder.write(chunk)); + } + + dataURL += btoa(decoder.end()); + + return dataURL + } + case 'Text': { + // 1. Let encoding be failure + let encoding = 'failure'; + + // 2. If the encodingName is present, set encoding to the + // result of getting an encoding from encodingName. + if (encodingName) { + encoding = getEncoding(encodingName); + } + + // 3. If encoding is failure, and mimeType is present: + if (encoding === 'failure' && mimeType) { + // 1. Let type be the result of parse a MIME type + // given mimeType. + const type = parseMIMEType(mimeType); + + // 2. If type is not failure, set encoding to the result + // of getting an encoding from type’s parameters["charset"]. + if (type !== 'failure') { + encoding = getEncoding(type.parameters.get('charset')); + } + } + + // 4. If encoding is failure, then set encoding to UTF-8. + if (encoding === 'failure') { + encoding = 'UTF-8'; + } + + // 5. Decode bytes using fallback encoding encoding, and + // return the result. + return decode(bytes, encoding) + } + case 'ArrayBuffer': { + // Return a new ArrayBuffer whose contents are bytes. + const sequence = combineByteSequences(bytes); + + return sequence.buffer + } + case 'BinaryString': { + // Return bytes as a binary string, in which every byte + // is represented by a code unit of equal value [0..255]. + let binaryString = ''; + + const decoder = new StringDecoder('latin1'); + + for (const chunk of bytes) { + binaryString += decoder.write(chunk); + } + + binaryString += decoder.end(); + + return binaryString + } + } } - pathUtils$1.toWin32Path = toWin32Path; + /** - * toPlatformPath converts the given path to a platform-specific path. It does - * this by replacing instances of / and \ with the platform-specific path - * separator. - * - * @param pth The path to platformize. - * @return string The platform-specific path. + * @see https://encoding.spec.whatwg.org/#decode + * @param {Uint8Array[]} ioQueue + * @param {string} encoding */ - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); + function decode (ioQueue, encoding) { + const bytes = combineByteSequences(ioQueue); + + // 1. Let BOMEncoding be the result of BOM sniffing ioQueue. + const BOMEncoding = BOMSniffing(bytes); + + let slice = 0; + + // 2. If BOMEncoding is non-null: + if (BOMEncoding !== null) { + // 1. Set encoding to BOMEncoding. + encoding = BOMEncoding; + + // 2. Read three bytes from ioQueue, if BOMEncoding is + // UTF-8; otherwise read two bytes. + // (Do nothing with those bytes.) + slice = BOMEncoding === 'UTF-8' ? 3 : 2; + } + + // 3. Process a queue with an instance of encoding’s + // decoder, ioQueue, output, and "replacement". + + // 4. Return output. + + const sliced = bytes.slice(slice); + return new TextDecoder(encoding).decode(sliced) } - pathUtils$1.toPlatformPath = toPlatformPath; - - return pathUtils$1; + + /** + * @see https://encoding.spec.whatwg.org/#bom-sniff + * @param {Uint8Array} ioQueue + */ + function BOMSniffing (ioQueue) { + // 1. Let BOM be the result of peeking 3 bytes from ioQueue, + // converted to a byte sequence. + const [a, b, c] = ioQueue; + + // 2. For each of the rows in the table below, starting with + // the first one and going down, if BOM starts with the + // bytes given in the first column, then return the + // encoding given in the cell in the second column of that + // row. Otherwise, return null. + if (a === 0xEF && b === 0xBB && c === 0xBF) { + return 'UTF-8' + } else if (a === 0xFE && b === 0xFF) { + return 'UTF-16BE' + } else if (a === 0xFF && b === 0xFE) { + return 'UTF-16LE' + } + + return null + } + + /** + * @param {Uint8Array[]} sequences + */ + function combineByteSequences (sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength + }, 0); + + let offset = 0; + + return sequences.reduce((a, b) => { + a.set(b, offset); + offset += b.byteLength; + return a + }, new Uint8Array(size)) + } + + util$6 = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + }; + return util$6; } -var platform$1 = {}; +var filereader; +var hasRequiredFilereader; + +function requireFilereader () { + if (hasRequiredFilereader) return filereader; + hasRequiredFilereader = 1; + + const { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + } = requireUtil$6(); + const { + kState, + kError, + kResult, + kEvents, + kAborted + } = requireSymbols$2(); + const { webidl } = requireWebidl(); + const { kEnumerableProperty } = requireUtil$9(); + + class FileReader extends EventTarget { + constructor () { + super(); + + this[kState] = 'empty'; + this[kResult] = null; + this[kError] = null; + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null + }; + } + + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer + * @param {import('buffer').Blob} blob + */ + readAsArrayBuffer (blob) { + webidl.brandCheck(this, FileReader); + + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsArrayBuffer'); + + blob = webidl.converters.Blob(blob, { strict: false }); + + // The readAsArrayBuffer(blob) method, when invoked, + // must initiate a read operation for blob with ArrayBuffer. + readOperation(this, blob, 'ArrayBuffer'); + } + + /** + * @see https://w3c.github.io/FileAPI/#readAsBinaryString + * @param {import('buffer').Blob} blob + */ + readAsBinaryString (blob) { + webidl.brandCheck(this, FileReader); + + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsBinaryString'); + + blob = webidl.converters.Blob(blob, { strict: false }); + + // The readAsBinaryString(blob) method, when invoked, + // must initiate a read operation for blob with BinaryString. + readOperation(this, blob, 'BinaryString'); + } + + /** + * @see https://w3c.github.io/FileAPI/#readAsDataText + * @param {import('buffer').Blob} blob + * @param {string?} encoding + */ + readAsText (blob, encoding = undefined) { + webidl.brandCheck(this, FileReader); + + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsText'); + + blob = webidl.converters.Blob(blob, { strict: false }); + + if (encoding !== undefined) { + encoding = webidl.converters.DOMString(encoding, 'FileReader.readAsText', 'encoding'); + } + + // The readAsText(blob, encoding) method, when invoked, + // must initiate a read operation for blob with Text and encoding. + readOperation(this, blob, 'Text', encoding); + } + + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL + * @param {import('buffer').Blob} blob + */ + readAsDataURL (blob) { + webidl.brandCheck(this, FileReader); + + webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsDataURL'); + + blob = webidl.converters.Blob(blob, { strict: false }); + + // The readAsDataURL(blob) method, when invoked, must + // initiate a read operation for blob with DataURL. + readOperation(this, blob, 'DataURL'); + } + + /** + * @see https://w3c.github.io/FileAPI/#dfn-abort + */ + abort () { + // 1. If this's state is "empty" or if this's state is + // "done" set this's result to null and terminate + // this algorithm. + if (this[kState] === 'empty' || this[kState] === 'done') { + this[kResult] = null; + return + } + + // 2. If this's state is "loading" set this's state to + // "done" and set this's result to null. + if (this[kState] === 'loading') { + this[kState] = 'done'; + this[kResult] = null; + } + + // 3. If there are any tasks from this on the file reading + // task source in an affiliated task queue, then remove + // those tasks from that task queue. + this[kAborted] = true; + + // 4. Terminate the algorithm for the read method being processed. + // TODO + + // 5. Fire a progress event called abort at this. + fireAProgressEvent('abort', this); + + // 6. If this's state is not "loading", fire a progress + // event called loadend at this. + if (this[kState] !== 'loading') { + fireAProgressEvent('loadend', this); + } + } + + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate + */ + get readyState () { + webidl.brandCheck(this, FileReader); + + switch (this[kState]) { + case 'empty': return this.EMPTY + case 'loading': return this.LOADING + case 'done': return this.DONE + } + } + + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-result + */ + get result () { + webidl.brandCheck(this, FileReader); + + // The result attribute’s getter, when invoked, must return + // this's result. + return this[kResult] + } + + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-error + */ + get error () { + webidl.brandCheck(this, FileReader); + + // The error attribute’s getter, when invoked, must return + // this's error. + return this[kError] + } + + get onloadend () { + webidl.brandCheck(this, FileReader); + + return this[kEvents].loadend + } + + set onloadend (fn) { + webidl.brandCheck(this, FileReader); + + if (this[kEvents].loadend) { + this.removeEventListener('loadend', this[kEvents].loadend); + } + + if (typeof fn === 'function') { + this[kEvents].loadend = fn; + this.addEventListener('loadend', fn); + } else { + this[kEvents].loadend = null; + } + } + + get onerror () { + webidl.brandCheck(this, FileReader); + + return this[kEvents].error + } + + set onerror (fn) { + webidl.brandCheck(this, FileReader); + + if (this[kEvents].error) { + this.removeEventListener('error', this[kEvents].error); + } + + if (typeof fn === 'function') { + this[kEvents].error = fn; + this.addEventListener('error', fn); + } else { + this[kEvents].error = null; + } + } + + get onloadstart () { + webidl.brandCheck(this, FileReader); + + return this[kEvents].loadstart + } + + set onloadstart (fn) { + webidl.brandCheck(this, FileReader); + + if (this[kEvents].loadstart) { + this.removeEventListener('loadstart', this[kEvents].loadstart); + } + + if (typeof fn === 'function') { + this[kEvents].loadstart = fn; + this.addEventListener('loadstart', fn); + } else { + this[kEvents].loadstart = null; + } + } + + get onprogress () { + webidl.brandCheck(this, FileReader); + + return this[kEvents].progress + } + + set onprogress (fn) { + webidl.brandCheck(this, FileReader); + + if (this[kEvents].progress) { + this.removeEventListener('progress', this[kEvents].progress); + } + + if (typeof fn === 'function') { + this[kEvents].progress = fn; + this.addEventListener('progress', fn); + } else { + this[kEvents].progress = null; + } + } -var exec$2 = {}; + get onload () { + webidl.brandCheck(this, FileReader); -var toolrunner$1 = {}; + return this[kEvents].load + } -var io$1 = {}; + set onload (fn) { + webidl.brandCheck(this, FileReader); -var ioUtil$1 = {}; + if (this[kEvents].load) { + this.removeEventListener('load', this[kEvents].load); + } -var hasRequiredIoUtil$1; + if (typeof fn === 'function') { + this[kEvents].load = fn; + this.addEventListener('load', fn); + } else { + this[kEvents].load = null; + } + } -function requireIoUtil$1 () { - if (hasRequiredIoUtil$1) return ioUtil$1; - hasRequiredIoUtil$1 = 1; - (function (exports$1) { - var __createBinding = (ioUtil$1 && ioUtil$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (ioUtil$1 && ioUtil$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (ioUtil$1 && ioUtil$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (ioUtil$1 && ioUtil$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getCmdPath = exports$1.tryGetExecutablePath = exports$1.isRooted = exports$1.isDirectory = exports$1.exists = exports$1.READONLY = exports$1.UV_FS_O_EXLOCK = exports$1.IS_WINDOWS = exports$1.unlink = exports$1.symlink = exports$1.stat = exports$1.rmdir = exports$1.rm = exports$1.rename = exports$1.readlink = exports$1.readdir = exports$1.open = exports$1.mkdir = exports$1.lstat = exports$1.copyFile = exports$1.chmod = void 0; - const fs = __importStar(fs__default); - const path = __importStar(require$$1__default); - _a = fs.promises - // export const {open} = 'fs' - , exports$1.chmod = _a.chmod, exports$1.copyFile = _a.copyFile, exports$1.lstat = _a.lstat, exports$1.mkdir = _a.mkdir, exports$1.open = _a.open, exports$1.readdir = _a.readdir, exports$1.readlink = _a.readlink, exports$1.rename = _a.rename, exports$1.rm = _a.rm, exports$1.rmdir = _a.rmdir, exports$1.stat = _a.stat, exports$1.symlink = _a.symlink, exports$1.unlink = _a.unlink; - // export const {open} = 'fs' - exports$1.IS_WINDOWS = process.platform === 'win32'; - // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 - exports$1.UV_FS_O_EXLOCK = 0x10000000; - exports$1.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - try { - yield exports$1.stat(fsPath); - } - catch (err) { - if (err.code === 'ENOENT') { - return false; - } - throw err; - } - return true; - }); - } - exports$1.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports$1.stat(fsPath) : yield exports$1.lstat(fsPath); - return stats.isDirectory(); - }); - } - exports$1.isDirectory = isDirectory; - /** - * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: - * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). - */ - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports$1.IS_WINDOWS) { - return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello - ); // e.g. C: or C:\hello - } - return p.startsWith('/'); - } - exports$1.isRooted = isRooted; - /** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = undefined; - try { - // test file exists - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // on Windows, test for valid extension - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - // try each extension - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // preserve the case of the actual file (since an extension was appended) - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports$1.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } - catch (err) { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ''; - }); - } - exports$1.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ''; - if (exports$1.IS_WINDOWS) { - // convert slashes on Windows - p = p.replace(/\//g, '\\'); - // remove redundant slashes - return p.replace(/\\\\+/g, '\\'); - } - // remove redundant slashes - return p.replace(/\/\/+/g, '/'); - } - // on Mac/Linux, test the execute bit - // R W X R W X R W X - // 256 128 64 32 16 8 4 2 1 - function isUnixExecutable(stats) { - return ((stats.mode & 1) > 0 || - ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || - ((stats.mode & 64) > 0 && stats.uid === process.getuid())); - } - // Get the path of cmd.exe in windows - function getCmdPath() { - var _a; - return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; - } - exports$1.getCmdPath = getCmdPath; - - } (ioUtil$1)); - return ioUtil$1; -} + get onabort () { + webidl.brandCheck(this, FileReader); -var hasRequiredIo$1; + return this[kEvents].abort + } -function requireIo$1 () { - if (hasRequiredIo$1) return io$1; - hasRequiredIo$1 = 1; - var __createBinding = (io$1 && io$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (io$1 && io$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (io$1 && io$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (io$1 && io$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(io$1, "__esModule", { value: true }); - io$1.findInPath = io$1.which = io$1.mkdirP = io$1.rmRF = io$1.mv = io$1.cp = void 0; - const assert_1 = require$$0$8; - const path = __importStar(require$$1__default); - const ioUtil = __importStar(requireIoUtil$1()); - /** - * Copies a file or folder. - * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ - function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; - // Dest is an existing file, but not forcing - if (destStat && destStat.isFile() && !force) { - return; - } - // If dest is an existing directory, should copy inside. - const newDest = destStat && destStat.isDirectory() && copySourceDirectory - ? path.join(dest, path.basename(source)) - : dest; - if (!(yield ioUtil.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } - else { - yield cpDirRecursive(source, newDest, 0, force); - } - } - else { - if (path.relative(source, newDest) === '') { - // a file cannot be copied to itself - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); - } - io$1.cp = cp; - /** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See MoveOptions. - */ - function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - if (yield ioUtil.exists(dest)) { - let destExists = true; - if (yield ioUtil.isDirectory(dest)) { - // If dest is directory copy src into dest - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } - else { - throw new Error('Destination already exists'); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil.rename(source, dest); - }); - } - io$1.mv = mv; - /** - * Remove a path recursively with force - * - * @param inputPath path to remove - */ - function rmRF(inputPath) { - return __awaiter(this, void 0, void 0, function* () { - if (ioUtil.IS_WINDOWS) { - // Check for invalid characters - // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - // note if path does not exist, error is silent - yield ioUtil.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } - catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); - } - io$1.rmRF = rmRF; - /** - * Make a directory. Creates the full path with folders in between - * Will throw if it fails - * - * @param fsPath path to create - * @returns Promise - */ - function mkdirP(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, 'a path argument must be provided'); - yield ioUtil.mkdir(fsPath, { recursive: true }); - }); - } - io$1.mkdirP = mkdirP; - /** - * Returns path of a tool had the tool actually been invoked. Resolves via paths. - * If you check and the tool does not exist, it will throw. - * - * @param tool name of the tool - * @param check whether to check if tool exists - * @returns Promise path to tool - */ - function which(tool, check) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // recursive when check=true - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } - else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; - } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; - } - return ''; - }); - } - io$1.which = which; - /** - * Returns a list of all occurrences of the given tool on the system path. - * - * @returns Promise the paths of the tool - */ - function findInPath(tool) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // build the list of extensions to try - const extensions = []; - if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) { - for (const extension of process.env['PATHEXT'].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - // if it's rooted, return it if exists. otherwise return empty. - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - // if any path separators, return empty - if (tool.includes(path.sep)) { - return []; - } - // build the list of directories - // - // Note, technically "where" checks the current directory on Windows. From a toolkit perspective, - // it feels like we should not do this. Checking the current directory seems like more of a use - // case of a shell, and the which() function exposed by the toolkit should strive for consistency - // across platforms. - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - // find all matches - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } - } - return matches; - }); - } - io$1.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null - ? true - : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; - } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, void 0, void 0, function* () { - // Ensure there is not a run away recursive copy - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil.lstat(srcFile); - if (srcFileStat.isDirectory()) { - // Recurse - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } - else { - yield copyFile(srcFile, destFile, force); - } - } - // Change the mode for the newly created directory - yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); - }); - } - // Buffered file copy - function copyFile(srcFile, destFile, force) { - return __awaiter(this, void 0, void 0, function* () { - if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { - // unlink/re-link it - try { - yield ioUtil.lstat(destFile); - yield ioUtil.unlink(destFile); - } - catch (e) { - // Try to override file permission - if (e.code === 'EPERM') { - yield ioUtil.chmod(destFile, '0666'); - yield ioUtil.unlink(destFile); - } - // other errors = it doesn't exist, no work to do - } - // Copy over symlink - const symlinkFull = yield ioUtil.readlink(srcFile); - yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); - } - else if (!(yield ioUtil.exists(destFile)) || force) { - yield ioUtil.copyFile(srcFile, destFile); - } - }); + set onabort (fn) { + webidl.brandCheck(this, FileReader); + + if (this[kEvents].abort) { + this.removeEventListener('abort', this[kEvents].abort); + } + + if (typeof fn === 'function') { + this[kEvents].abort = fn; + this.addEventListener('abort', fn); + } else { + this[kEvents].abort = null; + } + } } - - return io$1; -} -var hasRequiredToolrunner$1; + // https://w3c.github.io/FileAPI/#dom-filereader-empty + FileReader.EMPTY = FileReader.prototype.EMPTY = 0; + // https://w3c.github.io/FileAPI/#dom-filereader-loading + FileReader.LOADING = FileReader.prototype.LOADING = 1; + // https://w3c.github.io/FileAPI/#dom-filereader-done + FileReader.DONE = FileReader.prototype.DONE = 2; + + Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'FileReader', + writable: false, + enumerable: false, + configurable: true + } + }); -function requireToolrunner$1 () { - if (hasRequiredToolrunner$1) return toolrunner$1; - hasRequiredToolrunner$1 = 1; - var __createBinding = (toolrunner$1 && toolrunner$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (toolrunner$1 && toolrunner$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; + Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors }); - var __importStar = (toolrunner$1 && toolrunner$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; + + filereader = { + FileReader }; - var __awaiter = (toolrunner$1 && toolrunner$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + return filereader; +} + +var symbols$1; +var hasRequiredSymbols$1; + +function requireSymbols$1 () { + if (hasRequiredSymbols$1) return symbols$1; + hasRequiredSymbols$1 = 1; + + symbols$1 = { + kConstruct: requireSymbols$4().kConstruct }; - Object.defineProperty(toolrunner$1, "__esModule", { value: true }); - toolrunner$1.argStringToArray = toolrunner$1.ToolRunner = void 0; - const os = __importStar(require$$0$5); - const events = __importStar(require$$1$3); - const child = __importStar(require$$2$2); - const path = __importStar(require$$1__default); - const io = __importStar(requireIo$1()); - const ioUtil = __importStar(requireIoUtil$1()); - const timers_1 = require$$6; - /* eslint-disable @typescript-eslint/unbound-method */ - const IS_WINDOWS = process.platform === 'win32'; - /* - * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. + return symbols$1; +} + +var util$5; +var hasRequiredUtil$5; + +function requireUtil$5 () { + if (hasRequiredUtil$5) return util$5; + hasRequiredUtil$5 = 1; + + const assert = require$$0$7; + const { URLSerializer } = requireDataUrl(); + const { isValidHeaderName } = requireUtil$8(); + + /** + * @see https://url.spec.whatwg.org/#concept-url-equals + * @param {URL} A + * @param {URL} B + * @param {boolean | undefined} excludeFragment + * @returns {boolean} */ - class ToolRunner extends events.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; - } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } - } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool - if (IS_WINDOWS) { - // Windows + cmd file - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows + verbatim - else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows (regular) - else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; - } - } - } - else { - // OSX/Linux - this can likely be improved with some form of quoting. - // creating processes on Unix is fundamentally different than Windows. - // on Unix, execvp() takes an arg array. - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - return cmd; - } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - // the rest of the string ... - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); - } - return s; - } - catch (err) { - // streaming lines to console is best effort. Don't fail a build. - this._debug(`error processing line. Failed with error ${err}`); - return ''; - } - } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env['COMSPEC'] || 'cmd.exe'; - } - } - return this.toolPath; - } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += ' '; - argline += options.windowsVerbatimArguments - ? a - : this._windowsQuoteCmdArg(a); - } - argline += '"'; - return [argline]; - } - } - return this.args; + function urlEquals (A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment); + + const serializedB = URLSerializer(B, excludeFragment); + + return serializedA === serializedB + } + + /** + * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 + * @param {string} header + */ + function getFieldValues (header) { + assert(header !== null); + + const values = []; + + for (let value of header.split(',')) { + value = value.trim(); + + if (isValidHeaderName(value)) { + values.push(value); } - _endsWith(str, end) { - return str.endsWith(end); + } + + return values + } + + util$5 = { + urlEquals, + getFieldValues + }; + return util$5; +} + +var cache$3; +var hasRequiredCache$3; + +function requireCache$3 () { + if (hasRequiredCache$3) return cache$3; + hasRequiredCache$3 = 1; + + const { kConstruct } = requireSymbols$1(); + const { urlEquals, getFieldValues } = requireUtil$5(); + const { kEnumerableProperty, isDisturbed } = requireUtil$9(); + const { webidl } = requireWebidl(); + const { Response, cloneResponse, fromInnerResponse } = requireResponse$1(); + const { Request, fromInnerRequest } = requireRequest(); + const { kState } = requireSymbols$3(); + const { fetching } = requireFetch(); + const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = requireUtil$8(); + const assert = require$$0$7; + + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation + * @typedef {Object} CacheBatchOperation + * @property {'delete' | 'put'} type + * @property {any} request + * @property {any} response + * @property {import('../../types/cache').CacheQueryOptions} options + */ + + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list + * @typedef {[any, any][]} requestResponseList + */ + + class Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList + + constructor () { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return (this._endsWith(upperToolPath, '.CMD') || - this._endsWith(upperToolPath, '.BAT')); + + webidl.util.markAsUncloneable(this); + this.#relevantRequestResponseList = arguments[1]; + } + + async match (request, options = {}) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.match'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); + + const p = this.#internalMatchAll(request, options, 1); + + if (p.length === 0) { + return } - _windowsQuoteCmdArg(arg) { - // for .exe, apply the normal quoting rules that libuv applies - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - // otherwise apply quoting rules specific to the cmd.exe command line parser. - // the libuv rules are generic and are not designed specifically for cmd.exe - // command line parser. - // - // for a detailed description of the cmd.exe command line parser, refer to - // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 - // need quotes for empty arg - if (!arg) { - return '""'; - } - // determine whether the arg needs to be quoted - const cmdSpecialChars = [ - ' ', - '\t', - '&', - '(', - ')', - '[', - ']', - '{', - '}', - '^', - '=', - ';', - '!', - "'", - '+', - ',', - '`', - '~', - '|', - '<', - '>', - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some(x => x === char)) { - needsQuotes = true; - break; - } - } - // short-circuit if quotes not needed - if (!needsQuotes) { - return arg; - } - // the following quoting rules are very similar to the rules that by libuv applies. - // - // 1) wrap the string in quotes - // - // 2) double-up quotes - i.e. " => "" - // - // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately - // doesn't work well with a cmd.exe command line. - // - // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. - // for example, the command line: - // foo.exe "myarg:""my val""" - // is parsed by a .NET console app into an arg array: - // [ "myarg:\"my val\"" ] - // which is the same end result when applying libuv quoting rules. although the actual - // command line from libuv quoting rules would look like: - // foo.exe "myarg:\"my val\"" - // - // 3) double-up slashes that precede a quote, - // e.g. hello \world => "hello \world" - // hello\"world => "hello\\""world" - // hello\\"world => "hello\\\\""world" - // hello world\ => "hello world\\" - // - // technically this is not required for a cmd.exe command line, or the batch argument parser. - // the reasons for including this as a .cmd quoting rule are: - // - // a) this is optimized for the scenario where the argument is passed from the .cmd file to an - // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. - // - // b) it's what we've been doing previously (by deferring to node default behavior) and we - // haven't heard any complaints about that aspect. - // - // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be - // escaped when used on the command line directly - even though within a .cmd file % can be escaped - // by using %%. - // - // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts - // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. - // - // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would - // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the - // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args - // to an external program. - // - // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. - // % can be escaped within a .cmd file. - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; // double the slash - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; // double the quote - } - else { - quoteHit = false; - } - } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); + + return p[0] + } + + async matchAll (request = undefined, options = {}) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.matchAll'; + if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); + + return this.#internalMatchAll(request, options) + } + + async add (request) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.add'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + + // 1. + const requests = [request]; + + // 2. + const responseArrayPromise = this.addAll(requests); + + // 3. + return await responseArrayPromise + } + + async addAll (requests) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.addAll'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + // 1. + const responsePromises = []; + + // 2. + const requestList = []; + + // 3. + for (let request of requests) { + if (request === undefined) { + throw webidl.errors.conversionFailed({ + prefix, + argument: 'Argument 1', + types: ['undefined is not allowed'] + }) + } + + request = webidl.converters.RequestInfo(request); + + if (typeof request === 'string') { + continue + } + + // 3.1 + const r = request[kState]; + + // 3.2 + if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { + throw webidl.errors.exception({ + header: prefix, + message: 'Expected http/s scheme when method is not GET.' + }) + } } - _uvQuoteCmdArg(arg) { - // Tool runner wraps child_process.spawn() and needs to apply the same quoting as - // Node in certain cases where the undocumented spawn option windowsVerbatimArguments - // is used. - // - // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, - // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), - // pasting copyright notice from Node within this function: - // - // Copyright Joyent, Inc. and other Node contributors. All rights reserved. - // - // Permission is hereby granted, free of charge, to any person obtaining a copy - // of this software and associated documentation files (the "Software"), to - // deal in the Software without restriction, including without limitation the - // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - // sell copies of the Software, and to permit persons to whom the Software is - // furnished to do so, subject to the following conditions: - // - // The above copyright notice and this permission notice shall be included in - // all copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - // IN THE SOFTWARE. - if (!arg) { - // Need double quotation for empty argument - return '""'; - } - if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { - // No quotation needed - return arg; - } - if (!arg.includes('"') && !arg.includes('\\')) { - // No embedded double quotes or backslashes, so I can just wrap - // quote marks around the whole thing. - return `"${arg}"`; - } - // Expected input/output: - // input : hello"world - // output: "hello\"world" - // input : hello""world - // output: "hello\"\"world" - // input : hello\world - // output: hello\world - // input : hello\\world - // output: hello\\world - // input : hello\"world - // output: "hello\\\"world" - // input : hello\\"world - // output: "hello\\\\\"world" - // input : hello world\ - // output: "hello world\\" - note the comment in libuv actually reads "hello world\" - // but it appears the comment is wrong, it should be "hello world\\" - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '\\'; - } - else { - quoteHit = false; + + // 4. + /** @type {ReturnType[]} */ + const fetchControllers = []; + + // 5. + for (const request of requests) { + // 5.1 + const r = new Request(request)[kState]; + + // 5.2 + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: prefix, + message: 'Expected http/s scheme.' + }) + } + + // 5.4 + r.initiator = 'fetch'; + r.destination = 'subresource'; + + // 5.5 + requestList.push(r); + + // 5.6 + const responsePromise = createDeferredPromise(); + + // 5.7 + fetchControllers.push(fetching({ + request: r, + processResponse (response) { + // 1. + if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Received an invalid status code or the request failed.' + })); + } else if (response.headersList.contains('vary')) { // 2. + // 2.1 + const fieldValues = getFieldValues(response.headersList.get('vary')); + + // 2.2 + for (const fieldValue of fieldValues) { + // 2.2.1 + if (fieldValue === '*') { + responsePromise.reject(webidl.errors.exception({ + header: 'Cache.addAll', + message: 'invalid vary field value' + })); + + for (const controller of fetchControllers) { + controller.abort(); + } + + return + } } + } + }, + processResponseEndOfBody (response) { + // 1. + if (response.aborted) { + responsePromise.reject(new DOMException('aborted', 'AbortError')); + return + } + + // 2. + responsePromise.resolve(response); } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); + })); + + // 5.8 + responsePromises.push(responsePromise.promise); } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 10000 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; + + // 6. + const p = Promise.all(responsePromises); + + // 7. + const responses = await p; + + // 7.1 + const operations = []; + + // 7.2 + let index = 0; + + // 7.3 + for (const response of responses) { + // 7.3.1 + /** @type {CacheBatchOperation} */ + const operation = { + type: 'put', // 7.3.2 + request: requestList[index], // 7.3.3 + response // 7.3.4 + }; + + operations.push(operation); // 7.3.5 + + index++; // 7.3.6 } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result['windowsVerbatimArguments'] = - options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; + + // 7.5 + const cacheJobPromise = createDeferredPromise(); + + // 7.6.1 + let errorData = null; + + // 7.6.2 + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + + // 7.6.3 + queueMicrotask(() => { + // 7.6.3.1 + if (errorData === null) { + cacheJobPromise.resolve(undefined); + } else { + // 7.6.3.2 + cacheJobPromise.reject(errorData); + } + }); + + // 7.7 + return cacheJobPromise.promise + } + + async put (request, response) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.put'; + webidl.argumentLengthCheck(arguments, 2, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + response = webidl.converters.Response(response, prefix, 'response'); + + // 1. + let innerRequest = null; + + // 2. + if (request instanceof Request) { + innerRequest = request[kState]; + } else { // 3. + innerRequest = new Request(request)[kState]; + } + + // 4. + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { + throw webidl.errors.exception({ + header: prefix, + message: 'Expected an http/s scheme when method is not GET' + }) + } + + // 5. + const innerResponse = response[kState]; + + // 6. + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: prefix, + message: 'Got 206 status' + }) + } + + // 7. + if (innerResponse.headersList.contains('vary')) { + // 7.1. + const fieldValues = getFieldValues(innerResponse.headersList.get('vary')); + + // 7.2. + for (const fieldValue of fieldValues) { + // 7.2.1 + if (fieldValue === '*') { + throw webidl.errors.exception({ + header: prefix, + message: 'Got * vary field value' + }) } - return result; + } + } + + // 8. + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: prefix, + message: 'Response body is locked or disturbed' + }) + } + + // 9. + const clonedResponse = cloneResponse(innerResponse); + + // 10. + const bodyReadPromise = createDeferredPromise(); + + // 11. + if (innerResponse.body != null) { + // 11.1 + const stream = innerResponse.body.stream; + + // 11.2 + const reader = stream.getReader(); + + // 11.3 + readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); + } else { + bodyReadPromise.resolve(undefined); + } + + // 12. + /** @type {CacheBatchOperation[]} */ + const operations = []; + + // 13. + /** @type {CacheBatchOperation} */ + const operation = { + type: 'put', // 14. + request: innerRequest, // 15. + response: clonedResponse // 16. + }; + + // 17. + operations.push(operation); + + // 19. + const bytes = await bodyReadPromise.promise; + + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes; + } + + // 19.1 + const cacheJobPromise = createDeferredPromise(); + + // 19.2.1 + let errorData = null; + + // 19.2.2 + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; } + + // 19.2.3 + queueMicrotask(() => { + // 19.2.3.1 + if (errorData === null) { + cacheJobPromise.resolve(); + } else { // 19.2.3.2 + cacheJobPromise.reject(errorData); + } + }); + + return cacheJobPromise.promise + } + + async delete (request, options = {}) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); + /** - * Exec a tool. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param tool path to tool to exec - * @param options optional exec options. See ExecOptions - * @returns number + * @type {Request} */ - exec() { - return __awaiter(this, void 0, void 0, function* () { - // root the tool path if it is unrooted and contains relative pathing - if (!ioUtil.isRooted(this.toolPath) && - (this.toolPath.includes('/') || - (IS_WINDOWS && this.toolPath.includes('\\')))) { - // prefer options.cwd if it is specified, however options.cwd may also need to be rooted - this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); - } - // if the tool is only a file name, then resolve it from the PATH - // otherwise verify it exists (add extension on Windows if necessary) - this.toolPath = yield io.which(this.toolPath, true); - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - this._debug(`exec tool: ${this.toolPath}`); - this._debug('arguments:'); - for (const arg of this.args) { - this._debug(` ${arg}`); - } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); - } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on('debug', (message) => { - this._debug(message); - }); - if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) { - return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); - } - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - let stdbuffer = ''; - if (cp.stdout) { - cp.stdout.on('data', (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); - } - }); - }); - } - let errbuffer = ''; - if (cp.stderr) { - cp.stderr.on('data', (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && - optionsNonNull.errStream && - optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr - ? optionsNonNull.errStream - : optionsNonNull.outStream; - s.write(data); - } - errbuffer = this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on('error', (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on('exit', (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on('close', (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on('done', (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit('stdline', stdbuffer); - } - if (errbuffer.length > 0) { - this.emit('errline', errbuffer); - } - cp.removeAllListeners(); - if (error) { - reject(error); - } - else { - resolve(exitCode); - } - }); - if (this.options.input) { - if (!cp.stdin) { - throw new Error('child process missing stdin'); - } - cp.stdin.end(this.options.input); - } - })); - }); + let r = null; + + if (request instanceof Request) { + r = request[kState]; + + if (r.method !== 'GET' && !options.ignoreMethod) { + return false + } + } else { + assert(typeof request === 'string'); + + r = new Request(request)[kState]; } - } - toolrunner$1.ToolRunner = ToolRunner; - /** - * Convert an arg string to an array of args. Handles escaping - * - * @param argString string of arguments - * @returns string[] array of arguments - */ - function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ''; - function append(c) { - // we only escape double quotes. - if (escaped && c !== '"') { - arg += '\\'; + + /** @type {CacheBatchOperation[]} */ + const operations = []; + + /** @type {CacheBatchOperation} */ + const operation = { + type: 'delete', + request: r, + options + }; + + operations.push(operation); + + const cacheJobPromise = createDeferredPromise(); + + let errorData = null; + let requestResponses; + + try { + requestResponses = this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length); + } else { + cacheJobPromise.reject(errorData); + } + }); + + return cacheJobPromise.promise + } + + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../types/cache').CacheQueryOptions} options + * @returns {Promise} + */ + async keys (request = undefined, options = {}) { + webidl.brandCheck(this, Cache); + + const prefix = 'Cache.keys'; + + if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request'); + options = webidl.converters.CacheQueryOptions(options, prefix, 'options'); + + // 1. + let r = null; + + // 2. + if (request !== undefined) { + // 2.1 + if (request instanceof Request) { + // 2.1.1 + r = request[kState]; + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] } - arg += c; - escaped = false; + } else if (typeof request === 'string') { // 2.2 + r = new Request(request)[kState]; + } } - for (let i = 0; i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } - else { - append(c); - } - continue; + + // 4. + const promise = createDeferredPromise(); + + // 5. + // 5.1 + const requests = []; + + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + // 5.2.1.1 + requests.push(requestResponse[0]); + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options); + + // 5.3.2 + for (const requestResponse of requestResponses) { + // 5.3.2.1 + requests.push(requestResponse[0]); + } + } + + // 5.4 + queueMicrotask(() => { + // 5.4.1 + const requestList = []; + + // 5.4.2 + for (const request of requests) { + const requestObject = fromInnerRequest( + request, + new AbortController().signal, + 'immutable' + ); + // 5.4.2.1 + requestList.push(requestObject); + } + + // 5.4.3 + promise.resolve(Object.freeze(requestList)); + }); + + return promise.promise + } + + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations (operations) { + // 1. + const cache = this.#relevantRequestResponseList; + + // 2. + const backupCache = [...cache]; + + // 3. + const addedItems = []; + + // 4.1 + const resultList = []; + + try { + // 4.2 + for (const operation of operations) { + // 4.2.1 + if (operation.type !== 'delete' && operation.type !== 'put') { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'operation type does not match "delete" or "put"' + }) } - if (c === '\\' && escaped) { - append(c); - continue; + + // 4.2.2 + if (operation.type === 'delete' && operation.response != null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'delete operation should not have an associated response' + }) } - if (c === '\\' && inQuotes) { - escaped = true; - continue; + + // 4.2.3 + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException('???', 'InvalidStateError') } - if (c === ' ' && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ''; - } - continue; + + // 4.2.4 + let requestResponses; + + // 4.2.5 + if (operation.type === 'delete') { + // 4.2.5.1 + requestResponses = this.#queryCache(operation.request, operation.options); + + // TODO: the spec is wrong, this is needed to pass WPTs + if (requestResponses.length === 0) { + return [] + } + + // 4.2.5.2 + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse); + assert(idx !== -1); + + // 4.2.5.2.1 + cache.splice(idx, 1); + } + } else if (operation.type === 'put') { // 4.2.6 + // 4.2.6.1 + if (operation.response == null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'put operation should have an associated response' + }) + } + + // 4.2.6.2 + const r = operation.request; + + // 4.2.6.3 + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'expected http or https scheme' + }) + } + + // 4.2.6.4 + if (r.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'not get method' + }) + } + + // 4.2.6.5 + if (operation.options != null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'options must not be defined' + }) + } + + // 4.2.6.6 + requestResponses = this.#queryCache(operation.request); + + // 4.2.6.7 + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse); + assert(idx !== -1); + + // 4.2.6.7.1 + cache.splice(idx, 1); + } + + // 4.2.6.8 + cache.push([operation.request, operation.response]); + + // 4.2.6.10 + addedItems.push([operation.request, operation.response]); } - append(c); + + // 4.2.7 + resultList.push([operation.request, operation.response]); + } + + // 4.3 + return resultList + } catch (e) { // 5. + // 5.1 + this.#relevantRequestResponseList.length = 0; + + // 5.2 + this.#relevantRequestResponseList = backupCache; + + // 5.3 + throw e } - if (arg.length > 0) { - args.push(arg.trim()); + } + + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache (requestQuery, options, targetStorage) { + /** @type {requestResponseList} */ + const resultList = []; + + const storage = targetStorage ?? this.#relevantRequestResponseList; + + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse; + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse); + } } - return args; - } - toolrunner$1.argStringToArray = argStringToArray; - class ExecState extends events.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; // tracks whether the process has exited and stdio is closed - this.processError = ''; - this.processExitCode = 0; - this.processExited = false; // tracks whether the process has exited - this.processStderr = false; // tracks whether stderr was written to - this.delay = 10000; // 10 seconds - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error('toolPath must not be empty'); - } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; - } + + return resultList + } + + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem (requestQuery, request, response = null, options) { + // if (options?.ignoreMethod === false && request.method === 'GET') { + // return false + // } + + const queryURL = new URL(requestQuery.url); + + const cachedURL = new URL(request.url); + + if (options?.ignoreSearch) { + cachedURL.search = ''; + + queryURL.search = ''; } - CheckComplete() { - if (this.done) { - return; - } - if (this.processClosed) { - this._setResult(); - } - else if (this.processExited) { - this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); - } + + if (!urlEquals(queryURL, cachedURL, true)) { + return false } - _debug(message) { - this.emit('debug', message); + + if ( + response == null || + options?.ignoreVary || + !response.headersList.contains('vary') + ) { + return true } - _setResult() { - // determine whether there is an error - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); - } - else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); - } - else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); - } - } - // clear the timeout - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.done = true; - this.emit('done', error, this.processExitCode); + + const fieldValues = getFieldValues(response.headersList.get('vary')); + + for (const fieldValue of fieldValues) { + if (fieldValue === '*') { + return false + } + + const requestValue = request.headersList.get(fieldValue); + const queryValue = requestQuery.headersList.get(fieldValue); + + // If one has the header and the other doesn't, or one has + // a different value than the other, return false + if (requestValue !== queryValue) { + return false + } } - static HandleTimeout(state) { - if (state.done) { - return; - } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / - 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); + + return true + } + + #internalMatchAll (request, options, maxResponses = Infinity) { + // 1. + let r = null; + + // 2. + if (request !== undefined) { + if (request instanceof Request) { + // 2.1.1 + r = request[kState]; + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] } - state._setResult(); + } else if (typeof request === 'string') { + // 2.2.1 + r = new Request(request)[kState]; + } } - } - - return toolrunner$1; -} -var hasRequiredExec$1; + // 5. + // 5.1 + const responses = []; -function requireExec$1 () { - if (hasRequiredExec$1) return exec$2; - hasRequiredExec$1 = 1; - var __createBinding = (exec$2 && exec$2.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (exec$2 && exec$2.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options); + + // 5.3.2 + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + + // 5.4 + // We don't implement CORs so we don't need to loop over the responses, yay! + + // 5.5.1 + const responseList = []; + + // 5.5.2 + for (const response of responses) { + // 5.5.2.1 + const responseObject = fromInnerResponse(response, 'immutable'); + + responseList.push(responseObject.clone()); + + if (responseList.length >= maxResponses) { + break + } + } + + // 6. + return Object.freeze(responseList) + } + } + + Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: 'Cache', + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty }); - var __importStar = (exec$2 && exec$2.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (exec$2 && exec$2.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + + const cacheQueryOptionConverters = [ + { + key: 'ignoreSearch', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'ignoreMethod', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'ignoreVary', + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]; + + webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); + + webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: 'cacheName', + converter: webidl.converters.DOMString + } + ]); + + webidl.converters.Response = webidl.interfaceConverter(Response); + + webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.RequestInfo + ); + + cache$3 = { + Cache }; - Object.defineProperty(exec$2, "__esModule", { value: true }); - exec$2.getExecOutput = exec$2.exec = void 0; - const string_decoder_1 = require$$0$d; - const tr = __importStar(requireToolrunner$1()); - /** - * Exec a command. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param commandLine command to execute (can include additional args). Must be correctly escaped. - * @param args optional arguments for tool. Escaping is handled by the lib. - * @param options optional exec options. See ExecOptions - * @returns Promise exit code - */ - function exec(commandLine, args, options) { - return __awaiter(this, void 0, void 0, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); - } - // Path to tool to execute should be first arg - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); - } - exec$2.exec = exec; - /** - * Exec a command and get the output. - * Output will be streamed to the live console. - * Returns promise with the exit code and collected stdout and stderr - * - * @param commandLine command to execute (can include additional args). Must be correctly escaped. - * @param args optional arguments for tool. Escaping is handled by the lib. - * @param options optional exec options. See ExecOptions - * @returns Promise exit code, stdout, and stderr - */ - function getExecOutput(commandLine, args, options) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - let stdout = ''; - let stderr = ''; - //Using string decoder covers the case where a mult-byte character is split - const stdoutDecoder = new string_decoder_1.StringDecoder('utf8'); - const stderrDecoder = new string_decoder_1.StringDecoder('utf8'); - const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout; - const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr; - const stdErrListener = (data) => { - stderr += stderrDecoder.write(data); - if (originalStdErrListener) { - originalStdErrListener(data); - } - }; - const stdOutListener = (data) => { - stdout += stdoutDecoder.write(data); - if (originalStdoutListener) { - originalStdoutListener(data); - } - }; - const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); - //flush any remaining characters - stdout += stdoutDecoder.end(); - stderr += stderrDecoder.end(); - return { - exitCode, - stdout, - stderr - }; - }); - } - exec$2.getExecOutput = getExecOutput; - - return exec$2; + return cache$3; } -var hasRequiredPlatform$1; +var cachestorage; +var hasRequiredCachestorage; + +function requireCachestorage () { + if (hasRequiredCachestorage) return cachestorage; + hasRequiredCachestorage = 1; + + const { kConstruct } = requireSymbols$1(); + const { Cache } = requireCache$3(); + const { webidl } = requireWebidl(); + const { kEnumerableProperty } = requireUtil$9(); + + class CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map __awaiter(void 0, void 0, void 0, function* () { - const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { - silent: true - }); - const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, { - silent: true - }); - return { - name: name.trim(), - version: version.trim() - }; - }); - const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - var _a, _b, _c, _d; - const { stdout } = yield exec.getExecOutput('sw_vers', undefined, { - silent: true - }); - const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : ''; - const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : ''; - return { - name, - version - }; - }); - const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], { - silent: true - }); - const [name, version] = stdout.trim().split('\n'); - return { - name, - version - }; - }); - exports$1.platform = os_1.default.platform(); - exports$1.arch = os_1.default.arch(); - exports$1.isWindows = exports$1.platform === 'win32'; - exports$1.isMacOS = exports$1.platform === 'darwin'; - exports$1.isLinux = exports$1.platform === 'linux'; - function getDetails() { - return __awaiter(this, void 0, void 0, function* () { - return Object.assign(Object.assign({}, (yield (exports$1.isWindows - ? getWindowsInfo() - : exports$1.isMacOS - ? getMacOsInfo() - : getLinuxInfo()))), { platform: exports$1.platform, - arch: exports$1.arch, - isWindows: exports$1.isWindows, - isMacOS: exports$1.isMacOS, - isLinux: exports$1.isLinux }); - }); - } - exports$1.getDetails = getDetails; - - } (platform$1)); - return platform$1; -} + // 2.2.1.2 + const response = await cache.match(request, options); -var hasRequiredCore$1; + if (response !== undefined) { + return response + } + } + } + } -function requireCore$1 () { - if (hasRequiredCore$1) return core$1; - hasRequiredCore$1 = 1; - (function (exports$1) { - var __createBinding = (core$1 && core$1.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (core$1 && core$1.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (core$1 && core$1.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (core$1 && core$1.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.platform = exports$1.toPlatformPath = exports$1.toWin32Path = exports$1.toPosixPath = exports$1.markdownSummary = exports$1.summary = exports$1.getIDToken = exports$1.getState = exports$1.saveState = exports$1.group = exports$1.endGroup = exports$1.startGroup = exports$1.info = exports$1.notice = exports$1.warning = exports$1.error = exports$1.debug = exports$1.isDebug = exports$1.setFailed = exports$1.setCommandEcho = exports$1.setOutput = exports$1.getBooleanInput = exports$1.getMultilineInput = exports$1.getInput = exports$1.addPath = exports$1.setSecret = exports$1.exportVariable = exports$1.ExitCode = void 0; - const command_1 = requireCommand$1(); - const file_command_1 = requireFileCommand$1(); - const utils_1 = requireUtils$3(); - const os = __importStar(require$$0$5); - const path = __importStar(require$$1__default); - const oidc_utils_1 = requireOidcUtils$1(); - /** - * The code to exit an action - */ - var ExitCode; - (function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; - })(ExitCode || (exports$1.ExitCode = ExitCode = {})); - //----------------------------------------------------------------------- - // Variables - //----------------------------------------------------------------------- - /** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function exportVariable(name, val) { - const convertedVal = (0, utils_1.toCommandValue)(val); - process.env[name] = convertedVal; - const filePath = process.env['GITHUB_ENV'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val)); - } - (0, command_1.issueCommand)('set-env', { name }, convertedVal); - } - exports$1.exportVariable = exportVariable; - /** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ - function setSecret(secret) { - (0, command_1.issueCommand)('add-mask', {}, secret); - } - exports$1.setSecret = setSecret; - /** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ - function addPath(inputPath) { - const filePath = process.env['GITHUB_PATH'] || ''; - if (filePath) { - (0, file_command_1.issueFileCommand)('PATH', inputPath); - } - else { - (0, command_1.issueCommand)('add-path', {}, inputPath); - } - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; - } - exports$1.addPath = addPath; - /** - * Gets the value of an input. - * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. - * Returns an empty string if the value is not defined. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); - } - exports$1.getInput = getInput; - /** - * Gets the values of an multiline input. Each value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string[] - * - */ - function getMultilineInput(name, options) { - const inputs = getInput(name, options) - .split('\n') - .filter(x => x !== ''); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map(input => input.trim()); - } - exports$1.getMultilineInput = getMultilineInput; - /** - * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. - * Support boolean input list: `true | True | TRUE | false | False | FALSE` . - * The return value is also in boolean type. - * ref: https://yaml.org/spec/1.2/spec.html#id2804923 - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns boolean - */ - function getBooleanInput(name, options) { - const trueValue = ['true', 'True', 'TRUE']; - const falseValue = ['false', 'False', 'FALSE']; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + - `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports$1.getBooleanInput = getBooleanInput; - /** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function setOutput(name, value) { - const filePath = process.env['GITHUB_OUTPUT'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - process.stdout.write(os.EOL); - (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value)); - } - exports$1.setOutput = setOutput; - /** - * Enables or disables the echoing of commands into stdout for the rest of the step. - * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. - * - */ - function setCommandEcho(enabled) { - (0, command_1.issue)('echo', enabled ? 'on' : 'off'); - } - exports$1.setCommandEcho = setCommandEcho; - //----------------------------------------------------------------------- - // Results - //----------------------------------------------------------------------- - /** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); - } - exports$1.setFailed = setFailed; - //----------------------------------------------------------------------- - // Logging Commands - //----------------------------------------------------------------------- - /** - * Gets whether Actions Step Debug is on or not - */ - function isDebug() { - return process.env['RUNNER_DEBUG'] === '1'; - } - exports$1.isDebug = isDebug; - /** - * Writes debug message to user log - * @param message debug message - */ - function debug(message) { - (0, command_1.issueCommand)('debug', {}, message); - } - exports$1.debug = debug; - /** - * Adds an error issue - * @param message error issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function error(message, properties = {}) { - (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.error = error; - /** - * Adds a warning issue - * @param message warning issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function warning(message, properties = {}) { - (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.warning = warning; - /** - * Adds a notice issue - * @param message notice issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function notice(message, properties = {}) { - (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.notice = notice; - /** - * Writes info to log with console.log. - * @param message info message - */ - function info(message) { - process.stdout.write(message + os.EOL); - } - exports$1.info = info; - /** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ - function startGroup(name) { - (0, command_1.issue)('group', name); - } - exports$1.startGroup = startGroup; - /** - * End an output group. - */ - function endGroup() { - (0, command_1.issue)('endgroup'); - } - exports$1.endGroup = endGroup; - /** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ - function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); - } - exports$1.group = group; - //----------------------------------------------------------------------- - // Wrapper action state - //----------------------------------------------------------------------- - /** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function saveState(name, value) { - const filePath = process.env['GITHUB_STATE'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value)); - } - exports$1.saveState = saveState; - /** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ - function getState(name) { - return process.env[`STATE_${name}`] || ''; - } - exports$1.getState = getState; - function getIDToken(aud) { - return __awaiter(this, void 0, void 0, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); - } - exports$1.getIDToken = getIDToken; - /** - * Summary exports - */ - var summary_1 = requireSummary$1(); - Object.defineProperty(exports$1, "summary", { enumerable: true, get: function () { return summary_1.summary; } }); - /** - * @deprecated use core.summary - */ - var summary_2 = requireSummary$1(); - Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } }); - /** - * Path exports - */ - var path_utils_1 = requirePathUtils$1(); - Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } }); - Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } }); - Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }); - /** - * Platform utilities exports - */ - exports$1.platform = __importStar(requirePlatform$1()); - - } (core$1)); - return core$1; + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-has + * @param {string} cacheName + * @returns {Promise} + */ + async has (cacheName) { + webidl.brandCheck(this, CacheStorage); + + const prefix = 'CacheStorage.has'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); + + // 2.1.1 + // 2.2 + return this.#caches.has(cacheName) + } + + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open (cacheName) { + webidl.brandCheck(this, CacheStorage); + + const prefix = 'CacheStorage.open'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); + + // 2.1 + if (this.#caches.has(cacheName)) { + // await caches.open('v1') !== await caches.open('v1') + + // 2.1.1 + const cache = this.#caches.get(cacheName); + + // 2.1.1.1 + return new Cache(kConstruct, cache) + } + + // 2.2 + const cache = []; + + // 2.3 + this.#caches.set(cacheName, cache); + + // 2.4 + return new Cache(kConstruct, cache) + } + + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete (cacheName) { + webidl.brandCheck(this, CacheStorage); + + const prefix = 'CacheStorage.delete'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + cacheName = webidl.converters.DOMString(cacheName, prefix, 'cacheName'); + + return this.#caches.delete(cacheName) + } + + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {Promise} + */ + async keys () { + webidl.brandCheck(this, CacheStorage); + + // 2.1 + const keys = this.#caches.keys(); + + // 2.2 + return [...keys] + } + } + + Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: 'CacheStorage', + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + + cachestorage = { + CacheStorage + }; + return cachestorage; } -var manifest$1 = {exports: {}}; +var constants$7; +var hasRequiredConstants$7; -var semver$1 = {exports: {}}; +function requireConstants$7 () { + if (hasRequiredConstants$7) return constants$7; + hasRequiredConstants$7 = 1; -var hasRequiredSemver$1; + // https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size + const maxAttributeValueSize = 1024; -function requireSemver$1 () { - if (hasRequiredSemver$1) return semver$1.exports; - hasRequiredSemver$1 = 1; - (function (module, exports$1) { - exports$1 = module.exports = SemVer; + // https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size + const maxNameValuePairSize = 4096; - var debug; - /* istanbul ignore next */ - if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0); - args.unshift('SEMVER'); - console.log.apply(console, args); - }; - } else { - debug = function () {}; - } + constants$7 = { + maxAttributeValueSize, + maxNameValuePairSize + }; + return constants$7; +} - // Note: this is the semver.org version of the spec that it implements - // Not necessarily the package version of this code. - exports$1.SEMVER_SPEC_VERSION = '2.0.0'; +var util$4; +var hasRequiredUtil$4; - var MAX_LENGTH = 256; - var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991; +function requireUtil$4 () { + if (hasRequiredUtil$4) return util$4; + hasRequiredUtil$4 = 1; - // Max safe segment length for coercion. - var MAX_SAFE_COMPONENT_LENGTH = 16; + /** + * @param {string} value + * @returns {boolean} + */ + function isCTLExcludingHtab (value) { + for (let i = 0; i < value.length; ++i) { + const code = value.charCodeAt(i); - var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6; + if ( + (code >= 0x00 && code <= 0x08) || + (code >= 0x0A && code <= 0x1F) || + code === 0x7F + ) { + return true + } + } + return false + } - // The actual regexps go on exports.re - var re = exports$1.re = []; - var safeRe = exports$1.safeRe = []; - var src = exports$1.src = []; - var t = exports$1.tokens = {}; - var R = 0; + /** + CHAR = + token = 1* + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + * @param {string} name + */ + function validateCookieName (name) { + for (let i = 0; i < name.length; ++i) { + const code = name.charCodeAt(i); - function tok (n) { - t[n] = R++; - } + if ( + code < 0x21 || // exclude CTLs (0-31), SP and HT + code > 0x7E || // exclude non-ascii and DEL + code === 0x22 || // " + code === 0x28 || // ( + code === 0x29 || // ) + code === 0x3C || // < + code === 0x3E || // > + code === 0x40 || // @ + code === 0x2C || // , + code === 0x3B || // ; + code === 0x3A || // : + code === 0x5C || // \ + code === 0x2F || // / + code === 0x5B || // [ + code === 0x5D || // ] + code === 0x3F || // ? + code === 0x3D || // = + code === 0x7B || // { + code === 0x7D // } + ) { + throw new Error('Invalid cookie name') + } + } + } - var LETTERDASHNUMBER = '[a-zA-Z0-9-]'; + /** + cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) + cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + ; US-ASCII characters excluding CTLs, + ; whitespace DQUOTE, comma, semicolon, + ; and backslash + * @param {string} value + */ + function validateCookieValue (value) { + let len = value.length; + let i = 0; - // Replace some greedy regex tokens to prevent regex dos issues. These regex are - // used internally via the safeRe object since all inputs in this library get - // normalized first to trim and collapse all extra whitespace. The original - // regexes are exported for userland consumption and lower level usage. A - // future breaking change could export the safer regex only with a note that - // all input should have extra whitespace removed. - var safeRegexReplacements = [ - ['\\s', 1], - ['\\d', MAX_LENGTH], - [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], - ]; + // if the value is wrapped in DQUOTE + if (value[0] === '"') { + if (len === 1 || value[len - 1] !== '"') { + throw new Error('Invalid cookie value') + } + --len; + ++i; + } - function makeSafeRe (value) { - for (var i = 0; i < safeRegexReplacements.length; i++) { - var token = safeRegexReplacements[i][0]; - var max = safeRegexReplacements[i][1]; - value = value - .split(token + '*').join(token + '{0,' + max + '}') - .split(token + '+').join(token + '{1,' + max + '}'); - } - return value - } + while (i < len) { + const code = value.charCodeAt(i++); - // The following Regular Expressions can be used for tokenizing, - // validating, and parsing SemVer version strings. + if ( + code < 0x21 || // exclude CTLs (0-31) + code > 0x7E || // non-ascii and DEL (127) + code === 0x22 || // " + code === 0x2C || // , + code === 0x3B || // ; + code === 0x5C // \ + ) { + throw new Error('Invalid cookie value') + } + } + } - // ## Numeric Identifier - // A single `0`, or a non-zero digit followed by zero or more digits. + /** + * path-value = + * @param {string} path + */ + function validateCookiePath (path) { + for (let i = 0; i < path.length; ++i) { + const code = path.charCodeAt(i); - tok('NUMERICIDENTIFIER'); - src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'; - tok('NUMERICIDENTIFIERLOOSE'); - src[t.NUMERICIDENTIFIERLOOSE] = '\\d+'; + if ( + code < 0x20 || // exclude CTLs (0-31) + code === 0x7F || // DEL + code === 0x3B // ; + ) { + throw new Error('Invalid cookie path') + } + } + } - // ## Non-numeric Identifier - // Zero or more digits, followed by a letter or hyphen, and then zero or - // more letters, digits, or hyphens. + /** + * I have no idea why these values aren't allowed to be honest, + * but Deno tests these. - Khafra + * @param {string} domain + */ + function validateCookieDomain (domain) { + if ( + domain.startsWith('-') || + domain.endsWith('.') || + domain.endsWith('-') + ) { + throw new Error('Invalid cookie domain') + } + } - tok('NONNUMERICIDENTIFIER'); - src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*'; + const IMFDays = [ + 'Sun', 'Mon', 'Tue', 'Wed', + 'Thu', 'Fri', 'Sat' + ]; - // ## Main Version - // Three dot-separated numeric identifiers. + const IMFMonths = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ]; - tok('MAINVERSION'); - src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + - '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + - '(' + src[t.NUMERICIDENTIFIER] + ')'; + const IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0')); - tok('MAINVERSIONLOOSE'); - src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'; + /** + * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 + * @param {number|Date} date + IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT + ; fixed length/zone/capitalization subset of the format + ; see Section 3.3 of [RFC5322] - // ## Pre-release Version Identifier - // A numeric identifier, or a non-numeric identifier. + day-name = %x4D.6F.6E ; "Mon", case-sensitive + / %x54.75.65 ; "Tue", case-sensitive + / %x57.65.64 ; "Wed", case-sensitive + / %x54.68.75 ; "Thu", case-sensitive + / %x46.72.69 ; "Fri", case-sensitive + / %x53.61.74 ; "Sat", case-sensitive + / %x53.75.6E ; "Sun", case-sensitive + date1 = day SP month SP year + ; e.g., 02 Jun 1982 + + day = 2DIGIT + month = %x4A.61.6E ; "Jan", case-sensitive + / %x46.65.62 ; "Feb", case-sensitive + / %x4D.61.72 ; "Mar", case-sensitive + / %x41.70.72 ; "Apr", case-sensitive + / %x4D.61.79 ; "May", case-sensitive + / %x4A.75.6E ; "Jun", case-sensitive + / %x4A.75.6C ; "Jul", case-sensitive + / %x41.75.67 ; "Aug", case-sensitive + / %x53.65.70 ; "Sep", case-sensitive + / %x4F.63.74 ; "Oct", case-sensitive + / %x4E.6F.76 ; "Nov", case-sensitive + / %x44.65.63 ; "Dec", case-sensitive + year = 4DIGIT + + GMT = %x47.4D.54 ; "GMT", case-sensitive + + time-of-day = hour ":" minute ":" second + ; 00:00:00 - 23:59:60 (leap second) + + hour = 2DIGIT + minute = 2DIGIT + second = 2DIGIT + */ + function toIMFDate (date) { + if (typeof date === 'number') { + date = new Date(date); + } + + return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT` + } + + /** + max-age-av = "Max-Age=" non-zero-digit *DIGIT + ; In practice, both expires-av and max-age-av + ; are limited to dates representable by the + ; user agent. + * @param {number} maxAge + */ + function validateCookieMaxAge (maxAge) { + if (maxAge < 0) { + throw new Error('Invalid cookie max-age') + } + } + + /** + * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1 + * @param {import('./index').Cookie} cookie + */ + function stringify (cookie) { + if (cookie.name.length === 0) { + return null + } + + validateCookieName(cookie.name); + validateCookieValue(cookie.value); + + const out = [`${cookie.name}=${cookie.value}`]; + + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1 + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2 + if (cookie.name.startsWith('__Secure-')) { + cookie.secure = true; + } + + if (cookie.name.startsWith('__Host-')) { + cookie.secure = true; + cookie.domain = null; + cookie.path = '/'; + } + + if (cookie.secure) { + out.push('Secure'); + } + + if (cookie.httpOnly) { + out.push('HttpOnly'); + } + + if (typeof cookie.maxAge === 'number') { + validateCookieMaxAge(cookie.maxAge); + out.push(`Max-Age=${cookie.maxAge}`); + } + + if (cookie.domain) { + validateCookieDomain(cookie.domain); + out.push(`Domain=${cookie.domain}`); + } + + if (cookie.path) { + validateCookiePath(cookie.path); + out.push(`Path=${cookie.path}`); + } + + if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') { + out.push(`Expires=${toIMFDate(cookie.expires)}`); + } + + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`); + } + + for (const part of cookie.unparsed) { + if (!part.includes('=')) { + throw new Error('Invalid unparsed') + } + + const [key, ...value] = part.split('='); + + out.push(`${key.trim()}=${value.join('=')}`); + } + + return out.join('; ') + } + + util$4 = { + isCTLExcludingHtab, + validateCookieName, + validateCookiePath, + validateCookieValue, + toIMFDate, + stringify + }; + return util$4; +} + +var parse$1; +var hasRequiredParse; + +function requireParse () { + if (hasRequiredParse) return parse$1; + hasRequiredParse = 1; + + const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$7(); + const { isCTLExcludingHtab } = requireUtil$4(); + const { collectASequenceOfCodePointsFast } = requireDataUrl(); + const assert = require$$0$7; + + /** + * @description Parses the field-value attributes of a set-cookie header string. + * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 + * @param {string} header + * @returns if the header is invalid, null will be returned + */ + function parseSetCookie (header) { + // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F + // character (CTL characters excluding HTAB): Abort these steps and + // ignore the set-cookie-string entirely. + if (isCTLExcludingHtab(header)) { + return null + } + + let nameValuePair = ''; + let unparsedAttributes = ''; + let name = ''; + let value = ''; + + // 2. If the set-cookie-string contains a %x3B (";") character: + if (header.includes(';')) { + // 1. The name-value-pair string consists of the characters up to, + // but not including, the first %x3B (";"), and the unparsed- + // attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question). + const position = { position: 0 }; + + nameValuePair = collectASequenceOfCodePointsFast(';', header, position); + unparsedAttributes = header.slice(position.position); + } else { + // Otherwise: + + // 1. The name-value-pair string consists of all the characters + // contained in the set-cookie-string, and the unparsed- + // attributes is the empty string. + nameValuePair = header; + } + + // 3. If the name-value-pair string lacks a %x3D ("=") character, then + // the name string is empty, and the value string is the value of + // name-value-pair. + if (!nameValuePair.includes('=')) { + value = nameValuePair; + } else { + // Otherwise, the name string consists of the characters up to, but + // not including, the first %x3D ("=") character, and the (possibly + // empty) value string consists of the characters after the first + // %x3D ("=") character. + const position = { position: 0 }; + name = collectASequenceOfCodePointsFast( + '=', + nameValuePair, + position + ); + value = nameValuePair.slice(position.position + 1); + } + + // 4. Remove any leading or trailing WSP characters from the name + // string and the value string. + name = name.trim(); + value = value.trim(); + + // 5. If the sum of the lengths of the name string and the value string + // is more than 4096 octets, abort these steps and ignore the set- + // cookie-string entirely. + if (name.length + value.length > maxNameValuePairSize) { + return null + } + + // 6. The cookie-name is the name string, and the cookie-value is the + // value string. + return { + name, value, ...parseUnparsedAttributes(unparsedAttributes) + } + } + + /** + * Parses the remaining attributes of a set-cookie header + * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 + * @param {string} unparsedAttributes + * @param {[Object.]={}} cookieAttributeList + */ + function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) { + // 1. If the unparsed-attributes string is empty, skip the rest of + // these steps. + if (unparsedAttributes.length === 0) { + return cookieAttributeList + } + + // 2. Discard the first character of the unparsed-attributes (which + // will be a %x3B (";") character). + assert(unparsedAttributes[0] === ';'); + unparsedAttributes = unparsedAttributes.slice(1); + + let cookieAv = ''; + + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + if (unparsedAttributes.includes(';')) { + // 1. Consume the characters of the unparsed-attributes up to, but + // not including, the first %x3B (";") character. + cookieAv = collectASequenceOfCodePointsFast( + ';', + unparsedAttributes, + { position: 0 } + ); + unparsedAttributes = unparsedAttributes.slice(cookieAv.length); + } else { + // Otherwise: + + // 1. Consume the remainder of the unparsed-attributes. + cookieAv = unparsedAttributes; + unparsedAttributes = ''; + } + + // Let the cookie-av string be the characters consumed in this step. + + let attributeName = ''; + let attributeValue = ''; + + // 4. If the cookie-av string contains a %x3D ("=") character: + if (cookieAv.includes('=')) { + // 1. The (possibly empty) attribute-name string consists of the + // characters up to, but not including, the first %x3D ("=") + // character, and the (possibly empty) attribute-value string + // consists of the characters after the first %x3D ("=") + // character. + const position = { position: 0 }; + + attributeName = collectASequenceOfCodePointsFast( + '=', + cookieAv, + position + ); + attributeValue = cookieAv.slice(position.position + 1); + } else { + // Otherwise: + + // 1. The attribute-name string consists of the entire cookie-av + // string, and the attribute-value string is empty. + attributeName = cookieAv; + } + + // 5. Remove any leading or trailing WSP characters from the attribute- + // name string and the attribute-value string. + attributeName = attributeName.trim(); + attributeValue = attributeValue.trim(); + + // 6. If the attribute-value is longer than 1024 octets, ignore the + // cookie-av string and return to Step 1 of this algorithm. + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } + + // 7. Process the attribute-name and attribute-value according to the + // requirements in the following subsections. (Notice that + // attributes with unrecognized attribute-names are ignored.) + const attributeNameLowercase = attributeName.toLowerCase(); + + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1 + // If the attribute-name case-insensitively matches the string + // "Expires", the user agent MUST process the cookie-av as follows. + if (attributeNameLowercase === 'expires') { + // 1. Let the expiry-time be the result of parsing the attribute-value + // as cookie-date (see Section 5.1.1). + const expiryTime = new Date(attributeValue); + + // 2. If the attribute-value failed to parse as a cookie date, ignore + // the cookie-av. + + cookieAttributeList.expires = expiryTime; + } else if (attributeNameLowercase === 'max-age') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2 + // If the attribute-name case-insensitively matches the string "Max- + // Age", the user agent MUST process the cookie-av as follows. - tok('PRERELEASEIDENTIFIER'); - src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] + - '|' + src[t.NONNUMERICIDENTIFIER] + ')'; + // 1. If the first character of the attribute-value is not a DIGIT or a + // "-" character, ignore the cookie-av. + const charCode = attributeValue.charCodeAt(0); - tok('PRERELEASEIDENTIFIERLOOSE'); - src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] + - '|' + src[t.NONNUMERICIDENTIFIER] + ')'; + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } - // ## Pre-release Version - // Hyphen, followed by one or more dot-separated pre-release version - // identifiers. + // 2. If the remainder of attribute-value contains a non-DIGIT + // character, ignore the cookie-av. + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } - tok('PRERELEASE'); - src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] + - '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'; + // 3. Let delta-seconds be the attribute-value converted to an integer. + const deltaSeconds = Number(attributeValue); - tok('PRERELEASELOOSE'); - src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'; + // 4. Let cookie-age-limit be the maximum age of the cookie (which + // SHOULD be 400 days or less, see Section 4.1.2.2). - // ## Build Metadata Identifier - // Any combination of digits, letters, or hyphens. + // 5. Set delta-seconds to the smaller of its present value and cookie- + // age-limit. + // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs) - tok('BUILDIDENTIFIER'); - src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+'; + // 6. If delta-seconds is less than or equal to zero (0), let expiry- + // time be the earliest representable date and time. Otherwise, let + // the expiry-time be the current date and time plus delta-seconds + // seconds. + // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds - // ## Build Metadata - // Plus sign, followed by one or more period-separated build metadata - // identifiers. + // 7. Append an attribute to the cookie-attribute-list with an + // attribute-name of Max-Age and an attribute-value of expiry-time. + cookieAttributeList.maxAge = deltaSeconds; + } else if (attributeNameLowercase === 'domain') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3 + // If the attribute-name case-insensitively matches the string "Domain", + // the user agent MUST process the cookie-av as follows. - tok('BUILD'); - src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] + - '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'; + // 1. Let cookie-domain be the attribute-value. + let cookieDomain = attributeValue; - // ## Full Version String - // A main version, followed optionally by a pre-release version and - // build metadata. + // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be + // cookie-domain without its leading %x2E ("."). + if (cookieDomain[0] === '.') { + cookieDomain = cookieDomain.slice(1); + } - // Note that the only major, minor, patch, and pre-release sections of - // the version string are capturing groups. The build metadata is not a - // capturing group, because it should not ever be used in version - // comparison. + // 3. Convert the cookie-domain to lower case. + cookieDomain = cookieDomain.toLowerCase(); - tok('FULL'); - tok('FULLPLAIN'); - src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] + - src[t.PRERELEASE] + '?' + - src[t.BUILD] + '?'; + // 4. Append an attribute to the cookie-attribute-list with an + // attribute-name of Domain and an attribute-value of cookie-domain. + cookieAttributeList.domain = cookieDomain; + } else if (attributeNameLowercase === 'path') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4 + // If the attribute-name case-insensitively matches the string "Path", + // the user agent MUST process the cookie-av as follows. - src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'; + // 1. If the attribute-value is empty or if the first character of the + // attribute-value is not %x2F ("/"): + let cookiePath = ''; + if (attributeValue.length === 0 || attributeValue[0] !== '/') { + // 1. Let cookie-path be the default-path. + cookiePath = '/'; + } else { + // Otherwise: - // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. - // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty - // common in the npm registry. - tok('LOOSEPLAIN'); - src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] + - src[t.PRERELEASELOOSE] + '?' + - src[t.BUILD] + '?'; + // 1. Let cookie-path be the attribute-value. + cookiePath = attributeValue; + } - tok('LOOSE'); - src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'; + // 2. Append an attribute to the cookie-attribute-list with an + // attribute-name of Path and an attribute-value of cookie-path. + cookieAttributeList.path = cookiePath; + } else if (attributeNameLowercase === 'secure') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5 + // If the attribute-name case-insensitively matches the string "Secure", + // the user agent MUST append an attribute to the cookie-attribute-list + // with an attribute-name of Secure and an empty attribute-value. - tok('GTLT'); - src[t.GTLT] = '((?:<|>)?=?)'; + cookieAttributeList.secure = true; + } else if (attributeNameLowercase === 'httponly') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6 + // If the attribute-name case-insensitively matches the string + // "HttpOnly", the user agent MUST append an attribute to the cookie- + // attribute-list with an attribute-name of HttpOnly and an empty + // attribute-value. - // Something like "2.*" or "1.2.x". - // Note that "x.x" is a valid xRange identifer, meaning "any version" - // Only the first item is strictly required. - tok('XRANGEIDENTIFIERLOOSE'); - src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; - tok('XRANGEIDENTIFIER'); - src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'; + cookieAttributeList.httpOnly = true; + } else if (attributeNameLowercase === 'samesite') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7 + // If the attribute-name case-insensitively matches the string + // "SameSite", the user agent MUST process the cookie-av as follows: - tok('XRANGEPLAIN'); - src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + - '(?:' + src[t.PRERELEASE] + ')?' + - src[t.BUILD] + '?' + - ')?)?'; + // 1. Let enforcement be "Default". + let enforcement = 'Default'; - tok('XRANGEPLAINLOOSE'); - src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[t.PRERELEASELOOSE] + ')?' + - src[t.BUILD] + '?' + - ')?)?'; + const attributeValueLowercase = attributeValue.toLowerCase(); + // 2. If cookie-av's attribute-value is a case-insensitive match for + // "None", set enforcement to "None". + if (attributeValueLowercase.includes('none')) { + enforcement = 'None'; + } - tok('XRANGE'); - src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'; - tok('XRANGELOOSE'); - src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'; + // 3. If cookie-av's attribute-value is a case-insensitive match for + // "Strict", set enforcement to "Strict". + if (attributeValueLowercase.includes('strict')) { + enforcement = 'Strict'; + } - // Coercion. - // Extract anything that could conceivably be a part of a valid semver - tok('COERCE'); - src[t.COERCE] = '(^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])'; - tok('COERCERTL'); - re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g'); - safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g'); + // 4. If cookie-av's attribute-value is a case-insensitive match for + // "Lax", set enforcement to "Lax". + if (attributeValueLowercase.includes('lax')) { + enforcement = 'Lax'; + } - // Tilde ranges. - // Meaning is "reasonably at or greater than" - tok('LONETILDE'); - src[t.LONETILDE] = '(?:~>?)'; + // 5. Append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of + // enforcement. + cookieAttributeList.sameSite = enforcement; + } else { + cookieAttributeList.unparsed ??= []; - tok('TILDETRIM'); - src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'; - re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g'); - safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g'); - var tildeTrimReplace = '$1~'; + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); + } - tok('TILDE'); - src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'; - tok('TILDELOOSE'); - src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'; + // 8. Return to Step 1 of this algorithm. + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } - // Caret ranges. - // Meaning is "at least and backwards compatible with" - tok('LONECARET'); - src[t.LONECARET] = '(?:\\^)'; + parse$1 = { + parseSetCookie, + parseUnparsedAttributes + }; + return parse$1; +} - tok('CARETTRIM'); - src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'; - re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g'); - safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g'); - var caretTrimReplace = '$1^'; +var cookies; +var hasRequiredCookies; - tok('CARET'); - src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'; - tok('CARETLOOSE'); - src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'; +function requireCookies () { + if (hasRequiredCookies) return cookies; + hasRequiredCookies = 1; - // A simple gt/lt/eq thing, or just "" to indicate "any version" - tok('COMPARATORLOOSE'); - src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'; - tok('COMPARATOR'); - src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'; + const { parseSetCookie } = requireParse(); + const { stringify } = requireUtil$4(); + const { webidl } = requireWebidl(); + const { Headers } = requireHeaders(); - // An expression to strip any whitespace between the gtlt and the thing - // it modifies, so that `> 1.2.3` ==> `>1.2.3` - tok('COMPARATORTRIM'); - src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] + - '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'; + /** + * @typedef {Object} Cookie + * @property {string} name + * @property {string} value + * @property {Date|number|undefined} expires + * @property {number|undefined} maxAge + * @property {string|undefined} domain + * @property {string|undefined} path + * @property {boolean|undefined} secure + * @property {boolean|undefined} httpOnly + * @property {'Strict'|'Lax'|'None'} sameSite + * @property {string[]} unparsed + */ - // this one has to use the /g flag - re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g'); - safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g'); - var comparatorTrimReplace = '$1$2$3'; + /** + * @param {Headers} headers + * @returns {Record} + */ + function getCookies (headers) { + webidl.argumentLengthCheck(arguments, 1, 'getCookies'); - // Something like `1.2.3 - 1.2.4` - // Note that these all use the loose form, because they'll be - // checked against either the strict or loose comparator form - // later. - tok('HYPHENRANGE'); - src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[t.XRANGEPLAIN] + ')' + - '\\s*$'; + webidl.brandCheck(headers, Headers, { strict: false }); - tok('HYPHENRANGELOOSE'); - src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[t.XRANGEPLAINLOOSE] + ')' + - '\\s*$'; + const cookie = headers.get('cookie'); + const out = {}; - // Star ranges basically just allow anything at all. - tok('STAR'); - src[t.STAR] = '(<|>)?=?\\s*\\*'; + if (!cookie) { + return out + } - // Compile to actual regexp objects. - // All are flag-free, unless they were created above with a flag. - for (var i = 0; i < R; i++) { - debug(i, src[i]); - if (!re[i]) { - re[i] = new RegExp(src[i]); + for (const piece of cookie.split(';')) { + const [name, ...value] = piece.split('='); - // Replace all greedy whitespace to prevent regex dos issues. These regex are - // used internally via the safeRe object since all inputs in this library get - // normalized first to trim and collapse all extra whitespace. The original - // regexes are exported for userland consumption and lower level usage. A - // future breaking change could export the safer regex only with a note that - // all input should have extra whitespace removed. - safeRe[i] = new RegExp(makeSafeRe(src[i])); - } - } + out[name.trim()] = value.join('='); + } - exports$1.parse = parse; - function parse (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - }; - } + return out + } - if (version instanceof SemVer) { - return version - } + /** + * @param {Headers} headers + * @param {string} name + * @param {{ path?: string, domain?: string }|undefined} attributes + * @returns {void} + */ + function deleteCookie (headers, name, attributes) { + webidl.brandCheck(headers, Headers, { strict: false }); - if (typeof version !== 'string') { - return null - } + const prefix = 'deleteCookie'; + webidl.argumentLengthCheck(arguments, 2, prefix); - if (version.length > MAX_LENGTH) { - return null - } + name = webidl.converters.DOMString(name, prefix, 'name'); + attributes = webidl.converters.DeleteCookieAttributes(attributes); - var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]; - if (!r.test(version)) { - return null - } + // Matches behavior of + // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 + setCookie(headers, { + name, + value: '', + expires: new Date(0), + ...attributes + }); + } - try { - return new SemVer(version, options) - } catch (er) { - return null - } - } + /** + * @param {Headers} headers + * @returns {Cookie[]} + */ + function getSetCookies (headers) { + webidl.argumentLengthCheck(arguments, 1, 'getSetCookies'); - exports$1.valid = valid; - function valid (version, options) { - var v = parse(version, options); - return v ? v.version : null - } + webidl.brandCheck(headers, Headers, { strict: false }); - exports$1.clean = clean; - function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options); - return s ? s.version : null - } + const cookies = headers.getSetCookie(); - exports$1.SemVer = SemVer; + if (!cookies) { + return [] + } - function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - }; - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version; - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } + return cookies.map((pair) => parseSetCookie(pair)) + } - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - } + /** + * @param {Headers} headers + * @param {Cookie} cookie + * @returns {void} + */ + function setCookie (headers, cookie) { + webidl.argumentLengthCheck(arguments, 2, 'setCookie'); - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } + webidl.brandCheck(headers, Headers, { strict: false }); - debug('SemVer', version, options); - this.options = options; - this.loose = !!options.loose; + cookie = webidl.converters.Cookie(cookie); - var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]); + const str = stringify(cookie); - if (!m) { - throw new TypeError('Invalid Version: ' + version) - } + if (str) { + headers.append('Set-Cookie', str); + } + } - this.raw = version; + webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'path', + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'domain', + defaultValue: () => null + } + ]); - // these are actually numbers - this.major = +m[1]; - this.minor = +m[2]; - this.patch = +m[3]; + webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: 'name' + }, + { + converter: webidl.converters.DOMString, + key: 'value' + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === 'number') { + return webidl.converters['unsigned long long'](value) + } - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } + return new Date(value) + }), + key: 'expires', + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters['long long']), + key: 'maxAge', + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'domain', + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'path', + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: 'secure', + defaultValue: () => null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: 'httpOnly', + defaultValue: () => null + }, + { + converter: webidl.converters.USVString, + key: 'sameSite', + allowedValues: ['Strict', 'Lax', 'None'] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: 'unparsed', + defaultValue: () => new Array(0) + } + ]); - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } + cookies = { + getCookies, + deleteCookie, + getSetCookies, + setCookie + }; + return cookies; +} - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } +var events; +var hasRequiredEvents; - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = []; - } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id; - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }); - } +function requireEvents () { + if (hasRequiredEvents) return events; + hasRequiredEvents = 1; - this.build = m[5] ? m[5].split('.') : []; - this.format(); - } + const { webidl } = requireWebidl(); + const { kEnumerableProperty } = requireUtil$9(); + const { kConstruct } = requireSymbols$4(); + const { MessagePort } = require$$1$4; - SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch; - if (this.prerelease.length) { - this.version += '-' + this.prerelease.join('.'); - } - return this.version - }; + /** + * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent + */ + class MessageEvent extends Event { + #eventInit - SemVer.prototype.toString = function () { - return this.version - }; + constructor (type, eventInitDict = {}) { + if (type === kConstruct) { + super(arguments[1], arguments[2]); + webidl.util.markAsUncloneable(this); + return + } - SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other); - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options); - } + const prefix = 'MessageEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - return this.compareMain(other) || this.comparePre(other) - }; + type = webidl.converters.DOMString(type, prefix, 'type'); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict, prefix, 'eventInitDict'); - SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options); - } + super(type, eventInitDict); - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - }; + this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); + } - SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options); - } + get data () { + webidl.brandCheck(this, MessageEvent); - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } + return this.#eventInit.data + } - var i = 0; - do { - var a = this.prerelease[i]; - var b = other.prerelease[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - }; + get origin () { + webidl.brandCheck(this, MessageEvent); - SemVer.prototype.compareBuild = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options); - } + return this.#eventInit.origin + } - var i = 0; - do { - var a = this.build[i]; - var b = other.build[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) - }; + get lastEventId () { + webidl.brandCheck(this, MessageEvent); - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0; - this.patch = 0; - this.minor = 0; - this.major++; - this.inc('pre', identifier); - break - case 'preminor': - this.prerelease.length = 0; - this.patch = 0; - this.minor++; - this.inc('pre', identifier); - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0; - this.inc('patch', identifier); - this.inc('pre', identifier); - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier); - } - this.inc('pre', identifier); - break + return this.#eventInit.lastEventId + } - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++; - } - this.minor = 0; - this.patch = 0; - this.prerelease = []; - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++; - } - this.patch = 0; - this.prerelease = []; - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++; - } - this.prerelease = []; - break - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0]; - } else { - var i = this.prerelease.length; - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++; - i = -2; - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0); - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0]; - } - } else { - this.prerelease = [identifier, 0]; - } - } - break + get source () { + webidl.brandCheck(this, MessageEvent); - default: - throw new Error('invalid increment argument: ' + release) - } - this.format(); - this.raw = this.version; - return this - }; + return this.#eventInit.source + } - exports$1.inc = inc; - function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose; - loose = undefined; - } + get ports () { + webidl.brandCheck(this, MessageEvent); - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } - } + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports); + } - exports$1.diff = diff; - function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1); - var v2 = parse(version2); - var prefix = ''; - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre'; - var defaultResult = 'prerelease'; - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } - } + return this.#eventInit.ports + } - exports$1.compareIdentifiers = compareIdentifiers; + initMessageEvent ( + type, + bubbles = false, + cancelable = false, + data = null, + origin = '', + lastEventId = '', + source = null, + ports = [] + ) { + webidl.brandCheck(this, MessageEvent); - var numeric = /^[0-9]+$/; - function compareIdentifiers (a, b) { - var anum = numeric.test(a); - var bnum = numeric.test(b); + webidl.argumentLengthCheck(arguments, 1, 'MessageEvent.initMessageEvent'); - if (anum && bnum) { - a = +a; - b = +b; - } + return new MessageEvent(type, { + bubbles, cancelable, data, origin, lastEventId, source, ports + }) + } - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 - } + static createFastMessageEvent (type, init) { + const messageEvent = new MessageEvent(kConstruct, type, init); + messageEvent.#eventInit = init; + messageEvent.#eventInit.data ??= null; + messageEvent.#eventInit.origin ??= ''; + messageEvent.#eventInit.lastEventId ??= ''; + messageEvent.#eventInit.source ??= null; + messageEvent.#eventInit.ports ??= []; + return messageEvent + } + } - exports$1.rcompareIdentifiers = rcompareIdentifiers; - function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) - } + const { createFastMessageEvent } = MessageEvent; + delete MessageEvent.createFastMessageEvent; - exports$1.major = major; - function major (a, loose) { - return new SemVer(a, loose).major - } + /** + * @see https://websockets.spec.whatwg.org/#the-closeevent-interface + */ + class CloseEvent extends Event { + #eventInit - exports$1.minor = minor; - function minor (a, loose) { - return new SemVer(a, loose).minor - } + constructor (type, eventInitDict = {}) { + const prefix = 'CloseEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - exports$1.patch = patch; - function patch (a, loose) { - return new SemVer(a, loose).patch - } + type = webidl.converters.DOMString(type, prefix, 'type'); + eventInitDict = webidl.converters.CloseEventInit(eventInitDict); - exports$1.compare = compare; - function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) - } + super(type, eventInitDict); - exports$1.compareLoose = compareLoose; - function compareLoose (a, b) { - return compare(a, b, true) - } + this.#eventInit = eventInitDict; + webidl.util.markAsUncloneable(this); + } - exports$1.compareBuild = compareBuild; - function compareBuild (a, b, loose) { - var versionA = new SemVer(a, loose); - var versionB = new SemVer(b, loose); - return versionA.compare(versionB) || versionA.compareBuild(versionB) - } + get wasClean () { + webidl.brandCheck(this, CloseEvent); - exports$1.rcompare = rcompare; - function rcompare (a, b, loose) { - return compare(b, a, loose) - } + return this.#eventInit.wasClean + } - exports$1.sort = sort; - function sort (list, loose) { - return list.sort(function (a, b) { - return exports$1.compareBuild(a, b, loose) - }) - } + get code () { + webidl.brandCheck(this, CloseEvent); - exports$1.rsort = rsort; - function rsort (list, loose) { - return list.sort(function (a, b) { - return exports$1.compareBuild(b, a, loose) - }) - } + return this.#eventInit.code + } - exports$1.gt = gt; - function gt (a, b, loose) { - return compare(a, b, loose) > 0 - } + get reason () { + webidl.brandCheck(this, CloseEvent); - exports$1.lt = lt; - function lt (a, b, loose) { - return compare(a, b, loose) < 0 - } + return this.#eventInit.reason + } + } - exports$1.eq = eq; - function eq (a, b, loose) { - return compare(a, b, loose) === 0 - } + // https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface + class ErrorEvent extends Event { + #eventInit - exports$1.neq = neq; - function neq (a, b, loose) { - return compare(a, b, loose) !== 0 - } + constructor (type, eventInitDict) { + const prefix = 'ErrorEvent constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); - exports$1.gte = gte; - function gte (a, b, loose) { - return compare(a, b, loose) >= 0 - } + super(type, eventInitDict); + webidl.util.markAsUncloneable(this); - exports$1.lte = lte; - function lte (a, b, loose) { - return compare(a, b, loose) <= 0 - } + type = webidl.converters.DOMString(type, prefix, 'type'); + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); - exports$1.cmp = cmp; - function cmp (a, op, b, loose) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version; - if (typeof b === 'object') - b = b.version; - return a === b + this.#eventInit = eventInitDict; + } - case '!==': - if (typeof a === 'object') - a = a.version; - if (typeof b === 'object') - b = b.version; - return a !== b + get message () { + webidl.brandCheck(this, ErrorEvent); - case '': - case '=': - case '==': - return eq(a, b, loose) + return this.#eventInit.message + } - case '!=': - return neq(a, b, loose) + get filename () { + webidl.brandCheck(this, ErrorEvent); - case '>': - return gt(a, b, loose) + return this.#eventInit.filename + } - case '>=': - return gte(a, b, loose) + get lineno () { + webidl.brandCheck(this, ErrorEvent); - case '<': - return lt(a, b, loose) + return this.#eventInit.lineno + } - case '<=': - return lte(a, b, loose) + get colno () { + webidl.brandCheck(this, ErrorEvent); - default: - throw new TypeError('Invalid operator: ' + op) - } - } + return this.#eventInit.colno + } - exports$1.Comparator = Comparator; - function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - }; - } + get error () { + webidl.brandCheck(this, ErrorEvent); - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value; - } - } + return this.#eventInit.error + } + } - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } + Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: 'MessageEvent', + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty + }); - comp = comp.trim().split(/\s+/).join(' '); - debug('comparator', comp, options); - this.options = options; - this.loose = !!options.loose; - this.parse(comp); + Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: 'CloseEvent', + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty + }); - if (this.semver === ANY) { - this.value = ''; - } else { - this.value = this.operator + this.semver.version; - } + Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: 'ErrorEvent', + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty + }); - debug('comp', this); - } + webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); - var ANY = {}; - Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]; - var m = comp.match(r); + webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.MessagePort + ); - if (!m) { - throw new TypeError('Invalid comparator: ' + comp) - } + const eventInit = [ + { + key: 'bubbles', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'cancelable', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'composed', + converter: webidl.converters.boolean, + defaultValue: () => false + } + ]; - this.operator = m[1] !== undefined ? m[1] : ''; - if (this.operator === '=') { - this.operator = ''; - } + webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'data', + converter: webidl.converters.any, + defaultValue: () => null + }, + { + key: 'origin', + converter: webidl.converters.USVString, + defaultValue: () => '' + }, + { + key: 'lastEventId', + converter: webidl.converters.DOMString, + defaultValue: () => '' + }, + { + key: 'source', + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: () => null + }, + { + key: 'ports', + converter: webidl.converters['sequence'], + defaultValue: () => new Array(0) + } + ]); - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY; - } else { - this.semver = new SemVer(m[2], this.options.loose); - } - }; + webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'wasClean', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'code', + converter: webidl.converters['unsigned short'], + defaultValue: () => 0 + }, + { + key: 'reason', + converter: webidl.converters.USVString, + defaultValue: () => '' + } + ]); - Comparator.prototype.toString = function () { - return this.value - }; + webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'message', + converter: webidl.converters.DOMString, + defaultValue: () => '' + }, + { + key: 'filename', + converter: webidl.converters.USVString, + defaultValue: () => '' + }, + { + key: 'lineno', + converter: webidl.converters['unsigned long'], + defaultValue: () => 0 + }, + { + key: 'colno', + converter: webidl.converters['unsigned long'], + defaultValue: () => 0 + }, + { + key: 'error', + converter: webidl.converters.any + } + ]); - Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose); + events = { + MessageEvent, + CloseEvent, + ErrorEvent, + createFastMessageEvent + }; + return events; +} - if (this.semver === ANY || version === ANY) { - return true - } +var constants$6; +var hasRequiredConstants$6; - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options); - } catch (er) { - return false - } - } +function requireConstants$6 () { + if (hasRequiredConstants$6) return constants$6; + hasRequiredConstants$6 = 1; - return cmp(version, this.operator, this.semver, this.options) - }; + // This is a Globally Unique Identifier unique used + // to validate that the endpoint accepts websocket + // connections. + // See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 + const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; - Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } + /** @type {PropertyDescriptor} */ + const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - }; - } + const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; - var rangeTmp; + const sentCloseFrameState = { + NOT_SENT: 0, + PROCESSING: 1, + SENT: 2 + }; - if (this.operator === '') { - if (this.value === '') { - return true - } - rangeTmp = new Range(comp.value, options); - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - rangeTmp = new Range(this.value, options); - return satisfies(comp.semver, rangeTmp, options) - } + const opcodes = { + CONTINUATION: 0x0, + TEXT: 0x1, + BINARY: 0x2, + CLOSE: 0x8, + PING: 0x9, + PONG: 0xA + }; - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>'); - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<'); - var sameSemVer = this.semver.version === comp.semver.version; - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<='); - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')); - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')); + const maxUnsigned16Bit = 2 ** 16 - 1; // 65535 - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan - }; + const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; - exports$1.Range = Range; - function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - }; - } + const emptyBuffer = Buffer.allocUnsafe(0); - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } - } + const sendHints = { + string: 1, + typedArray: 2, + arrayBuffer: 3, + blob: 4 + }; - if (range instanceof Comparator) { - return new Range(range.value, options) - } + constants$6 = { + uid, + sentCloseFrameState, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer, + sendHints + }; + return constants$6; +} - if (!(this instanceof Range)) { - return new Range(range, options) - } +var symbols; +var hasRequiredSymbols; - this.options = options; - this.loose = !!options.loose; - this.includePrerelease = !!options.includePrerelease; +function requireSymbols () { + if (hasRequiredSymbols) return symbols; + hasRequiredSymbols = 1; - // First reduce all whitespace as much as possible so we do not have to rely - // on potentially slow regexes like \s*. This is then stored and used for - // future error messages as well. - this.raw = range - .trim() - .split(/\s+/) - .join(' '); + symbols = { + kWebSocketURL: Symbol('url'), + kReadyState: Symbol('ready state'), + kController: Symbol('controller'), + kResponse: Symbol('response'), + kBinaryType: Symbol('binary type'), + kSentClose: Symbol('sent close'), + kReceivedClose: Symbol('received close'), + kByteParser: Symbol('byte parser') + }; + return symbols; +} - // First, split based on boolean or || - this.set = this.raw.split('||').map(function (range) { - return this.parseRange(range.trim()) - }, this).filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length - }); +var util$3; +var hasRequiredUtil$3; - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + this.raw) - } +function requireUtil$3 () { + if (hasRequiredUtil$3) return util$3; + hasRequiredUtil$3 = 1; - this.format(); - } + const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = requireSymbols(); + const { states, opcodes } = requireConstants$6(); + const { ErrorEvent, createFastMessageEvent } = requireEvents(); + const { isUtf8 } = require$$0$6; + const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = requireDataUrl(); - Range.prototype.format = function () { - this.range = this.set.map(function (comps) { - return comps.join(' ').trim() - }).join('||').trim(); - return this.range - }; + /* globals Blob */ - Range.prototype.toString = function () { - return this.range - }; + /** + * @param {import('./websocket').WebSocket} ws + * @returns {boolean} + */ + function isConnecting (ws) { + // If the WebSocket connection is not yet established, and the connection + // is not yet closed, then the WebSocket connection is in the CONNECTING state. + return ws[kReadyState] === states.CONNECTING + } - Range.prototype.parseRange = function (range) { - var loose = this.options.loose; - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE]; - range = range.replace(hr, hyphenReplace); - debug('hyphen replace', range); - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace); - debug('comparator trim', range, safeRe[t.COMPARATORTRIM]); + /** + * @param {import('./websocket').WebSocket} ws + * @returns {boolean} + */ + function isEstablished (ws) { + // If the server's response is validated as provided for above, it is + // said that _The WebSocket Connection is Established_ and that the + // WebSocket Connection is in the OPEN state. + return ws[kReadyState] === states.OPEN + } - // `~ 1.2.3` => `~1.2.3` - range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace); + /** + * @param {import('./websocket').WebSocket} ws + * @returns {boolean} + */ + function isClosing (ws) { + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + return ws[kReadyState] === states.CLOSING + } - // `^ 1.2.3` => `^1.2.3` - range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace); + /** + * @param {import('./websocket').WebSocket} ws + * @returns {boolean} + */ + function isClosed (ws) { + return ws[kReadyState] === states.CLOSED + } - // normalize spaces - range = range.split(/\s+/).join(' '); + /** + * @see https://dom.spec.whatwg.org/#concept-event-fire + * @param {string} e + * @param {EventTarget} target + * @param {(...args: ConstructorParameters) => Event} eventFactory + * @param {EventInit | undefined} eventInitDict + */ + function fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { + // 1. If eventConstructor is not given, then let eventConstructor be Event. - // At this point, the range is completely trimmed and - // ready to be split into comparators. + // 2. Let event be the result of creating an event given eventConstructor, + // in the relevant realm of target. + // 3. Initialize event’s type attribute to e. + const event = eventFactory(e, eventInitDict); - var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]; - var set = range.split(' ').map(function (comp) { - return parseComparator(comp, this.options) - }, this).join(' ').split(/\s+/); - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe) - }); - } - set = set.map(function (comp) { - return new Comparator(comp, this.options) - }, this); + // 4. Initialize any other IDL attributes of event as described in the + // invocation of this algorithm. - return set - }; + // 5. Return the result of dispatching event at target, with legacy target + // override flag set if set. + target.dispatchEvent(event); + } - Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @param {import('./websocket').WebSocket} ws + * @param {number} type Opcode + * @param {Buffer} data application data + */ + function websocketMessageReceived (ws, type, data) { + // 1. If ready state is not OPEN (1), then return. + if (ws[kReadyState] !== states.OPEN) { + return + } - return this.set.some(function (thisComparators) { - return ( - isSatisfiable(thisComparators, options) && - range.set.some(function (rangeComparators) { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every(function (thisComparator) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - }; + // 2. Let dataForEvent be determined by switching on type and binary type: + let dataForEvent; - // take a set of comparators and determine whether there - // exists a version which can satisfy it - function isSatisfiable (comparators, options) { - var result = true; - var remainingComparators = comparators.slice(); - var testComparator = remainingComparators.pop(); + if (type === opcodes.TEXT) { + // -> type indicates that the data is Text + // a new DOMString containing data + try { + dataForEvent = utf8Decode(data); + } catch { + failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.'); + return + } + } else if (type === opcodes.BINARY) { + if (ws[kBinaryType] === 'blob') { + // -> type indicates that the data is Binary and binary type is "blob" + // a new Blob object, created in the relevant Realm of the WebSocket + // object, that represents data as its raw data + dataForEvent = new Blob([data]); + } else { + // -> type indicates that the data is Binary and binary type is "arraybuffer" + // a new ArrayBuffer object, created in the relevant Realm of the + // WebSocket object, whose contents are data + dataForEvent = toArrayBuffer(data); + } + } - while (result && remainingComparators.length) { - result = remainingComparators.every(function (otherComparator) { - return testComparator.intersects(otherComparator, options) - }); + // 3. Fire an event named message at the WebSocket object, using MessageEvent, + // with the origin attribute initialized to the serialization of the WebSocket + // object’s url's origin, and the data attribute initialized to dataForEvent. + fireEvent('message', ws, createFastMessageEvent, { + origin: ws[kWebSocketURL].origin, + data: dataForEvent + }); + } - testComparator = remainingComparators.pop(); - } + function toArrayBuffer (buffer) { + if (buffer.byteLength === buffer.buffer.byteLength) { + return buffer.buffer + } + return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) + } - return result - } + /** + * @see https://datatracker.ietf.org/doc/html/rfc6455 + * @see https://datatracker.ietf.org/doc/html/rfc2616 + * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407 + * @param {string} protocol + */ + function isValidSubprotocol (protocol) { + // If present, this value indicates one + // or more comma-separated subprotocol the client wishes to speak, + // ordered by preference. The elements that comprise this value + // MUST be non-empty strings with characters in the range U+0021 to + // U+007E not including separator characters as defined in + // [RFC2616] and MUST all be unique strings. + if (protocol.length === 0) { + return false + } - // Mostly just for testing and legacy API reasons - exports$1.toComparators = toComparators; - function toComparators (range, options) { - return new Range(range, options).set.map(function (comp) { - return comp.map(function (c) { - return c.value - }).join(' ').trim().split(' ') - }) - } + for (let i = 0; i < protocol.length; ++i) { + const code = protocol.charCodeAt(i); - // comprised of xranges, tildes, stars, and gtlt's at this point. - // already replaced the hyphen ranges - // turn into a set of JUST comparators. - function parseComparator (comp, options) { - debug('comp', comp, options); - comp = replaceCarets(comp, options); - debug('caret', comp); - comp = replaceTildes(comp, options); - debug('tildes', comp); - comp = replaceXRanges(comp, options); - debug('xrange', comp); - comp = replaceStars(comp, options); - debug('stars', comp); - return comp - } + if ( + code < 0x21 || // CTL, contains SP (0x20) and HT (0x09) + code > 0x7E || + code === 0x22 || // " + code === 0x28 || // ( + code === 0x29 || // ) + code === 0x2C || // , + code === 0x2F || // / + code === 0x3A || // : + code === 0x3B || // ; + code === 0x3C || // < + code === 0x3D || // = + code === 0x3E || // > + code === 0x3F || // ? + code === 0x40 || // @ + code === 0x5B || // [ + code === 0x5C || // \ + code === 0x5D || // ] + code === 0x7B || // { + code === 0x7D // } + ) { + return false + } + } - function isX (id) { - return !id || id.toLowerCase() === 'x' || id === '*' - } + return true + } - // ~, ~> --> * (any, kinda silly) - // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 - // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 - // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 - // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 - // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 - function replaceTildes (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') - } + /** + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4 + * @param {number} code + */ + function isValidStatusCode (code) { + if (code >= 1000 && code < 1015) { + return ( + code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006 // "MUST NOT be set as a status code" + ) + } - function replaceTilde (comp, options) { - var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE]; - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr); - var ret; + return code >= 3000 && code <= 4999 + } - if (isX(M)) { - ret = ''; - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - } else if (pr) { - debug('replaceTilde pr', pr); - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0'; - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0'; - } + /** + * @param {import('./websocket').WebSocket} ws + * @param {string|undefined} reason + */ + function failWebsocketConnection (ws, reason) { + const { [kController]: controller, [kResponse]: response } = ws; - debug('tilde return', ret); - return ret - }) - } + controller.abort(); - // ^ --> * (any, kinda silly) - // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 - // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 - // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 - // ^1.2.3 --> >=1.2.3 <2.0.0 - // ^1.2.0 --> >=1.2.0 <2.0.0 - function replaceCarets (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') - } + if (response?.socket && !response.socket.destroyed) { + response.socket.destroy(); + } - function replaceCaret (comp, options) { - debug('caret', comp, options); - var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET]; - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr); - var ret; + if (reason) { + // TODO: process.nextTick + fireEvent('error', ws, (type, init) => new ErrorEvent(type, init), { + error: new Error(reason), + message: reason + }); + } + } - if (isX(M)) { - ret = ''; - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; - } - } else if (pr) { - debug('replaceCaret pr', pr); - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1); - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0'; - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0'; - } - } else { - debug('no pr'); - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1); - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0'; - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0'; - } - } + /** + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5 + * @param {number} opcode + */ + function isControlFrame (opcode) { + return ( + opcode === opcodes.CLOSE || + opcode === opcodes.PING || + opcode === opcodes.PONG + ) + } - debug('caret return', ret); - return ret - }) - } + function isContinuationFrame (opcode) { + return opcode === opcodes.CONTINUATION + } - function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options); - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') - } + function isTextBinaryFrame (opcode) { + return opcode === opcodes.TEXT || opcode === opcodes.BINARY + } - function replaceXRange (comp, options) { - comp = comp.trim(); - var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE]; - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr); - var xM = isX(M); - var xm = xM || isX(m); - var xp = xm || isX(p); - var anyX = xp; + function isValidOpcode (opcode) { + return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode) + } - if (gtlt === '=' && anyX) { - gtlt = ''; - } + /** + * Parses a Sec-WebSocket-Extensions header value. + * @param {string} extensions + * @returns {Map} + */ + // TODO(@Uzlopak, @KhafraDev): make compliant https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 + function parseExtensions (extensions) { + const position = { position: 0 }; + const extensionList = new Map(); - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : ''; + while (position.position < extensions.length) { + const pair = collectASequenceOfCodePointsFast(';', extensions, position); + const [name, value = ''] = pair.split('='); - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0'; - } else { - // nothing is forbidden - ret = '*'; - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0; - } - p = 0; + extensionList.set( + removeHTTPWhitespace(name, true, false), + removeHTTPWhitespace(value, false, true) + ); - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>='; - if (xm) { - M = +M + 1; - m = 0; - p = 0; - } else { - m = +m + 1; - p = 0; - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<'; - if (xm) { - M = +M + 1; - } else { - m = +m + 1; - } - } + position.position++; + } - ret = gtlt + M + '.' + m + '.' + p + pr; - } else if (xm) { - ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr; - } else if (xp) { - ret = '>=' + M + '.' + m + '.0' + pr + - ' <' + M + '.' + (+m + 1) + '.0' + pr; - } + return extensionList + } - debug('xRange return', ret); + /** + * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2 + * @description "client-max-window-bits = 1*DIGIT" + * @param {string} value + */ + function isValidClientWindowBits (value) { + for (let i = 0; i < value.length; i++) { + const byte = value.charCodeAt(i); - return ret - }) - } + if (byte < 0x30 || byte > 0x39) { + return false + } + } - // Because * is AND-ed with everything else in the comparator, - // and '' means "any version", just remove the *s entirely. - function replaceStars (comp, options) { - debug('replaceStars', comp, options); - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(safeRe[t.STAR], '') - } + return true + } - // This function is passed to string.replace(re[t.HYPHENRANGE]) - // M, m, patch, prerelease, build - // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 - // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do - // 1.2 - 3.4 => >=1.2.0 <3.5.0 - function hyphenReplace ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - if (isX(fM)) { - from = ''; - } else if (isX(fm)) { - from = '>=' + fM + '.0.0'; - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0'; - } else { - from = '>=' + from; - } + // https://nodejs.org/api/intl.html#detecting-internationalization-support + const hasIntl = typeof process.versions.icu === 'string'; + const fatalDecoder = hasIntl ? new TextDecoder('utf-8', { fatal: true }) : undefined; - if (isX(tM)) { - to = ''; - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0'; - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.0'; - } else if (tpr) { - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; - } else { - to = '<=' + to; - } + /** + * Converts a Buffer to utf-8, even on platforms without icu. + * @param {Buffer} buffer + */ + const utf8Decode = hasIntl + ? fatalDecoder.decode.bind(fatalDecoder) + : function (buffer) { + if (isUtf8(buffer)) { + return buffer.toString('utf-8') + } + throw new TypeError('Invalid utf-8 received.') + }; - return (from + ' ' + to).trim() - } + util$3 = { + isConnecting, + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isContinuationFrame, + isTextBinaryFrame, + isValidOpcode, + parseExtensions, + isValidClientWindowBits + }; + return util$3; +} - // if ANY of the sets match ALL of its comparators, then pass - Range.prototype.test = function (version) { - if (!version) { - return false - } +var frame; +var hasRequiredFrame; - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options); - } catch (er) { - return false - } - } +function requireFrame () { + if (hasRequiredFrame) return frame; + hasRequiredFrame = 1; - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - }; + const { maxUnsigned16Bit } = requireConstants$6(); - function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } + const BUFFER_SIZE = 16386; - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver); - if (set[i].semver === ANY) { - continue - } + /** @type {import('crypto')} */ + let crypto; + let buffer = null; + let bufIdx = BUFFER_SIZE; - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver; - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } + try { + crypto = require('node:crypto'); + /* c8 ignore next 3 */ + } catch { + crypto = { + // not full compatibility, but minimum. + randomFillSync: function randomFillSync (buffer, _offset, _size) { + for (let i = 0; i < buffer.length; ++i) { + buffer[i] = Math.random() * 255 | 0; + } + return buffer + } + }; + } - // Version has a -pre, but it's not one of the ones we like. - return false - } + function generateMask () { + if (bufIdx === BUFFER_SIZE) { + bufIdx = 0; + crypto.randomFillSync((buffer ??= Buffer.allocUnsafe(BUFFER_SIZE)), 0, BUFFER_SIZE); + } + return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]] + } - return true - } + class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor (data) { + this.frameData = data; + } - exports$1.satisfies = satisfies; - function satisfies (version, range, options) { - try { - range = new Range(range, options); - } catch (er) { - return false - } - return range.test(version) - } + createFrame (opcode) { + const frameData = this.frameData; + const maskKey = generateMask(); + const bodyLength = frameData?.byteLength ?? 0; - exports$1.maxSatisfying = maxSatisfying; - function maxSatisfying (versions, range, options) { - var max = null; - var maxSV = null; - try { - var rangeObj = new Range(range, options); - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v; - maxSV = new SemVer(max, options); - } - } - }); - return max - } + /** @type {number} */ + let payloadLength = bodyLength; // 0-125 + let offset = 6; - exports$1.minSatisfying = minSatisfying; - function minSatisfying (versions, range, options) { - var min = null; - var minSV = null; - try { - var rangeObj = new Range(range, options); - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v; - minSV = new SemVer(min, options); - } - } - }); - return min - } + if (bodyLength > maxUnsigned16Bit) { + offset += 8; // payload length is next 8 bytes + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; // payload length is next 2 bytes + payloadLength = 126; + } - exports$1.minVersion = minVersion; - function minVersion (range, loose) { - range = new Range(range, loose); + const buffer = Buffer.allocUnsafe(bodyLength + offset); - var minver = new SemVer('0.0.0'); - if (range.test(minver)) { - return minver - } + // Clear first 2 bytes, everything else is overwritten + buffer[0] = buffer[1] = 0; + buffer[0] |= 0x80; // FIN + buffer[0] = (buffer[0] & 0xF0) + opcode; // opcode - minver = new SemVer('0.0.0-0'); - if (range.test(minver)) { - return minver - } + /*! ws. MIT License. Einar Otto Stangvik */ + buffer[offset - 4] = maskKey[0]; + buffer[offset - 3] = maskKey[1]; + buffer[offset - 2] = maskKey[2]; + buffer[offset - 1] = maskKey[3]; - minver = null; - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i]; + buffer[1] = payloadLength; - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version); - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++; - } else { - compver.prerelease.push(0); - } - compver.raw = compver.format(); - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver; - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) - } - }); - } + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + // Clear extended payload length + buffer[2] = buffer[3] = 0; + buffer.writeUIntBE(bodyLength, 4, 6); + } - if (minver && range.test(minver)) { - return minver - } + buffer[1] |= 0x80; // MASK - return null - } + // mask body + for (let i = 0; i < bodyLength; ++i) { + buffer[offset + i] = frameData[i] ^ maskKey[i & 3]; + } - exports$1.validRange = validRange; - function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null - } - } + return buffer + } + } - // Determine if version is less than all the versions possible in the range - exports$1.ltr = ltr; - function ltr (version, range, options) { - return outside(version, range, '<', options) - } + frame = { + WebsocketFrameSend + }; + return frame; +} - // Determine if version is greater than all the versions possible in the range. - exports$1.gtr = gtr; - function gtr (version, range, options) { - return outside(version, range, '>', options) - } +var connection; +var hasRequiredConnection; - exports$1.outside = outside; - function outside (version, range, hilo, options) { - version = new SemVer(version, options); - range = new Range(range, options); +function requireConnection () { + if (hasRequiredConnection) return connection; + hasRequiredConnection = 1; - var gtfn, ltefn, ltfn, comp, ecomp; - switch (hilo) { - case '>': - gtfn = gt; - ltefn = lte; - ltfn = lt; - comp = '>'; - ecomp = '>='; - break - case '<': - gtfn = lt; - ltefn = gte; - ltfn = gt; - comp = '<'; - ecomp = '<='; - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') - } + const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = requireConstants$6(); + const { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose, + kResponse + } = requireSymbols(); + const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = requireUtil$3(); + const { channels } = requireDiagnostics(); + const { CloseEvent } = requireEvents(); + const { makeRequest } = requireRequest(); + const { fetching } = requireFetch(); + const { Headers, getHeadersList } = requireHeaders(); + const { getDecodeSplit } = requireUtil$8(); + const { WebsocketFrameSend } = requireFrame(); - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false - } + /** @type {import('crypto')} */ + let crypto; + try { + crypto = require('node:crypto'); + /* c8 ignore next 3 */ + } catch { - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. + } - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i]; + /** + * @see https://websockets.spec.whatwg.org/#concept-websocket-establish + * @param {URL} url + * @param {string|string[]} protocols + * @param {import('./websocket').WebSocket} ws + * @param {(response: any, extensions: string[] | undefined) => void} onEstablish + * @param {Partial} options + */ + function establishWebSocketConnection (url, protocols, client, ws, onEstablish, options) { + // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s + // scheme is "ws", and to "https" otherwise. + const requestURL = url; - var high = null; - var low = null; + requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'; - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0'); - } - high = high || comparator; - low = low || comparator; - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator; - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator; - } - }); + // 2. Let request be a new request, whose URL is requestURL, client is client, + // service-workers mode is "none", referrer is "no-referrer", mode is + // "websocket", credentials mode is "include", cache mode is "no-store" , + // and redirect mode is "error". + const request = makeRequest({ + urlList: [requestURL], + client, + serviceWorkers: 'none', + referrer: 'no-referrer', + mode: 'websocket', + credentials: 'include', + cache: 'no-store', + redirect: 'error' + }); - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false - } + // Note: undici extension, allow setting custom headers. + if (options.headers) { + const headersList = getHeadersList(new Headers(options.headers)); - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false - } - } - return true - } + request.headersList = headersList; + } - exports$1.prerelease = prerelease; - function prerelease (version, options) { - var parsed = parse(version, options); - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null - } + // 3. Append (`Upgrade`, `websocket`) to request’s header list. + // 4. Append (`Connection`, `Upgrade`) to request’s header list. + // Note: both of these are handled by undici currently. + // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397 - exports$1.intersects = intersects; - function intersects (r1, r2, options) { - r1 = new Range(r1, options); - r2 = new Range(r2, options); - return r1.intersects(r2) - } + // 5. Let keyValue be a nonce consisting of a randomly selected + // 16-byte value that has been forgiving-base64-encoded and + // isomorphic encoded. + const keyValue = crypto.randomBytes(16).toString('base64'); - exports$1.coerce = coerce; - function coerce (version, options) { - if (version instanceof SemVer) { - return version - } + // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s + // header list. + request.headersList.append('sec-websocket-key', keyValue); - if (typeof version === 'number') { - version = String(version); - } + // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s + // header list. + request.headersList.append('sec-websocket-version', '13'); - if (typeof version !== 'string') { - return null - } + // 8. For each protocol in protocols, combine + // (`Sec-WebSocket-Protocol`, protocol) in request’s header + // list. + for (const protocol of protocols) { + request.headersList.append('sec-websocket-protocol', protocol); + } - options = options || {}; + // 9. Let permessageDeflate be a user-agent defined + // "permessage-deflate" extension header value. + // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673 + const permessageDeflate = 'permessage-deflate; client_max_window_bits'; - var match = null; - if (!options.rtl) { - match = version.match(safeRe[t.COERCE]); - } else { - // Find the right-most coercible string that does not share - // a terminus with a more left-ward coercible string. - // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' - // - // Walk through the string checking with a /g regexp - // Manually set the index so as to pick up overlapping matches. - // Stop when we get a match that ends at the string end, since no - // coercible string can be more right-ward without the same terminus. - var next; - while ((next = safeRe[t.COERCERTL].exec(version)) && - (!match || match.index + match[0].length !== version.length) - ) { - if (!match || - next.index + next[0].length !== match.index + match[0].length) { - match = next; - } - safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length; - } - // leave it in a clean state - safeRe[t.COERCERTL].lastIndex = -1; - } + // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to + // request’s header list. + request.headersList.append('sec-websocket-extensions', permessageDeflate); - if (match === null) { - return null - } + // 11. Fetch request with useParallelQueue set to true, and + // processResponse given response being these steps: + const controller = fetching({ + request, + useParallelQueue: true, + dispatcher: options.dispatcher, + processResponse (response) { + // 1. If response is a network error or its status is not 101, + // fail the WebSocket connection. + if (response.type === 'error' || response.status !== 101) { + failWebsocketConnection(ws, 'Received network error or non-101 status code.'); + return + } - return parse(match[2] + - '.' + (match[3] || '0') + - '.' + (match[4] || '0'), options) - } - } (semver$1, semver$1.exports)); - return semver$1.exports; -} + // 2. If protocols is not the empty list and extracting header + // list values given `Sec-WebSocket-Protocol` and response’s + // header list results in null, failure, or the empty byte + // sequence, then fail the WebSocket connection. + if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) { + failWebsocketConnection(ws, 'Server did not respond with sent protocols.'); + return + } -var manifest = manifest$1.exports; + // 3. Follow the requirements stated step 2 to step 6, inclusive, + // of the last set of steps in section 4.1 of The WebSocket + // Protocol to validate response. This either results in fail + // the WebSocket connection or the WebSocket connection is + // established. -var hasRequiredManifest; + // 2. If the response lacks an |Upgrade| header field or the |Upgrade| + // header field contains a value that is not an ASCII case- + // insensitive match for the value "websocket", the client MUST + // _Fail the WebSocket Connection_. + if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') { + failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); + return + } -function requireManifest () { - if (hasRequiredManifest) return manifest$1.exports; - hasRequiredManifest = 1; - (function (module, exports$1) { - var __createBinding = (manifest && manifest.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (manifest && manifest.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (manifest && manifest.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (manifest && manifest.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1._readLinuxVersionFile = exports$1._getOsVersion = exports$1._findMatch = void 0; - const semver = __importStar(requireSemver$1()); - const core_1 = requireCore$1(); - // needs to be require for core node modules to be mocked - /* eslint @typescript-eslint/no-require-imports: 0 */ - const os = require$$0$5; - const cp = require$$2$2; - const fs = fs__default; - function _findMatch(versionSpec, stable, candidates, archFilter) { - return __awaiter(this, void 0, void 0, function* () { - const platFilter = os.platform(); - let result; - let match; - let file; - for (const candidate of candidates) { - const version = candidate.version; - (0, core_1.debug)(`check ${version} satisfies ${versionSpec}`); - if (semver.satisfies(version, versionSpec) && - (!stable || candidate.stable === stable)) { - file = candidate.files.find(item => { - (0, core_1.debug)(`${item.arch}===${archFilter} && ${item.platform}===${platFilter}`); - let chk = item.arch === archFilter && item.platform === platFilter; - if (chk && item.platform_version) { - const osVersion = module.exports._getOsVersion(); - if (osVersion === item.platform_version) { - chk = true; - } - else { - chk = semver.satisfies(osVersion, item.platform_version); - } - } - return chk; - }); - if (file) { - (0, core_1.debug)(`matched ${candidate.version}`); - match = candidate; - break; - } - } - } - if (match && file) { - // clone since we're mutating the file list to be only the file that matches - result = Object.assign({}, match); - result.files = [file]; - } - return result; - }); - } - exports$1._findMatch = _findMatch; - function _getOsVersion() { - // TODO: add windows and other linux, arm variants - // right now filtering on version is only an ubuntu and macos scenario for tools we build for hosted (python) - const plat = os.platform(); - let version = ''; - if (plat === 'darwin') { - version = cp.execSync('sw_vers -productVersion').toString(); - } - else if (plat === 'linux') { - // lsb_release process not in some containers, readfile - // Run cat /etc/lsb-release - // DISTRIB_ID=Ubuntu - // DISTRIB_RELEASE=18.04 - // DISTRIB_CODENAME=bionic - // DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS" - const lsbContents = module.exports._readLinuxVersionFile(); - if (lsbContents) { - const lines = lsbContents.split('\n'); - for (const line of lines) { - const parts = line.split('='); - if (parts.length === 2 && - (parts[0].trim() === 'VERSION_ID' || - parts[0].trim() === 'DISTRIB_RELEASE')) { - version = parts[1].trim().replace(/^"/, '').replace(/"$/, ''); - break; - } - } - } - } - return version; - } - exports$1._getOsVersion = _getOsVersion; - function _readLinuxVersionFile() { - const lsbReleaseFile = '/etc/lsb-release'; - const osReleaseFile = '/etc/os-release'; - let contents = ''; - if (fs.existsSync(lsbReleaseFile)) { - contents = fs.readFileSync(lsbReleaseFile).toString(); - } - else if (fs.existsSync(osReleaseFile)) { - contents = fs.readFileSync(osReleaseFile).toString(); - } - return contents; - } - exports$1._readLinuxVersionFile = _readLinuxVersionFile; - - } (manifest$1, manifest$1.exports)); - return manifest$1.exports; -} + // 3. If the response lacks a |Connection| header field or the + // |Connection| header field doesn't contain a token that is an + // ASCII case-insensitive match for the value "Upgrade", the client + // MUST _Fail the WebSocket Connection_. + if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') { + failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); + return + } -var retryHelper = {}; + // 4. If the response lacks a |Sec-WebSocket-Accept| header field or + // the |Sec-WebSocket-Accept| contains a value other than the + // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket- + // Key| (as a string, not base64-decoded) with the string "258EAFA5- + // E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and + // trailing whitespace, the client MUST _Fail the WebSocket + // Connection_. + const secWSAccept = response.headersList.get('Sec-WebSocket-Accept'); + const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64'); + if (secWSAccept !== digest) { + failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.'); + return + } -var hasRequiredRetryHelper; + // 5. If the response includes a |Sec-WebSocket-Extensions| header + // field and this header field indicates the use of an extension + // that was not present in the client's handshake (the server has + // indicated an extension not requested by the client), the client + // MUST _Fail the WebSocket Connection_. (The parsing of this + // header field to determine which extensions are requested is + // discussed in Section 9.1.) + const secExtension = response.headersList.get('Sec-WebSocket-Extensions'); + let extensions; -function requireRetryHelper () { - if (hasRequiredRetryHelper) return retryHelper; - hasRequiredRetryHelper = 1; - var __createBinding = (retryHelper && retryHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (retryHelper && retryHelper.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (retryHelper && retryHelper.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (retryHelper && retryHelper.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(retryHelper, "__esModule", { value: true }); - retryHelper.RetryHelper = void 0; - const core = __importStar(requireCore$1()); - /** - * Internal class for retries - */ - class RetryHelper { - constructor(maxAttempts, minSeconds, maxSeconds) { - if (maxAttempts < 1) { - throw new Error('max attempts should be greater than or equal to 1'); + if (secExtension !== null) { + extensions = parseExtensions(secExtension); + + if (!extensions.has('permessage-deflate')) { + failWebsocketConnection(ws, 'Sec-WebSocket-Extensions header does not match.'); + return } - this.maxAttempts = maxAttempts; - this.minSeconds = Math.floor(minSeconds); - this.maxSeconds = Math.floor(maxSeconds); - if (this.minSeconds > this.maxSeconds) { - throw new Error('min seconds should be less than or equal to max seconds'); + } + + // 6. If the response includes a |Sec-WebSocket-Protocol| header field + // and this header field indicates the use of a subprotocol that was + // not present in the client's handshake (the server has indicated a + // subprotocol not requested by the client), the client MUST _Fail + // the WebSocket Connection_. + const secProtocol = response.headersList.get('Sec-WebSocket-Protocol'); + + if (secProtocol !== null) { + const requestProtocols = getDecodeSplit('sec-websocket-protocol', request.headersList); + + // The client can request that the server use a specific subprotocol by + // including the |Sec-WebSocket-Protocol| field in its handshake. If it + // is specified, the server needs to include the same field and one of + // the selected subprotocol values in its response for the connection to + // be established. + if (!requestProtocols.includes(secProtocol)) { + failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.'); + return } - } - execute(action, isRetryable) { - return __awaiter(this, void 0, void 0, function* () { - let attempt = 1; - while (attempt < this.maxAttempts) { - // Try - try { - return yield action(); - } - catch (err) { - if (isRetryable && !isRetryable(err)) { - throw err; - } - core.info(err.message); - } - // Sleep - const seconds = this.getSleepAmount(); - core.info(`Waiting ${seconds} seconds before trying again`); - yield this.sleep(seconds); - attempt++; - } - // Last attempt - return yield action(); - }); - } - getSleepAmount() { - return (Math.floor(Math.random() * (this.maxSeconds - this.minSeconds + 1)) + - this.minSeconds); - } - sleep(seconds) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise(resolve => setTimeout(resolve, seconds * 1000)); - }); - } - } - retryHelper.RetryHelper = RetryHelper; - - return retryHelper; -} + } -var hasRequiredToolCache; + response.socket.on('data', onSocketData); + response.socket.on('close', onSocketClose); + response.socket.on('error', onSocketError); -function requireToolCache () { - if (hasRequiredToolCache) return toolCache; - hasRequiredToolCache = 1; - var __createBinding = (toolCache && toolCache.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (toolCache && toolCache.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (toolCache && toolCache.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (toolCache && toolCache.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(toolCache, "__esModule", { value: true }); - toolCache.evaluateVersions = toolCache.isExplicitVersion = toolCache.findFromManifest = toolCache.getManifestFromRepo = toolCache.findAllVersions = toolCache.find = toolCache.cacheFile = toolCache.cacheDir = toolCache.extractZip = toolCache.extractXar = toolCache.extractTar = toolCache.extract7z = toolCache.downloadTool = toolCache.HTTPError = void 0; - const core = __importStar(requireCore$1()); - const io = __importStar(requireIo$1()); - const crypto = __importStar(require$$0$6); - const fs = __importStar(fs__default); - const mm = __importStar(requireManifest()); - const os = __importStar(require$$0$5); - const path = __importStar(require$$1__default); - const httpm = __importStar(requireLib$1()); - const semver = __importStar(requireSemver$1()); - const stream = __importStar(require$$0__default$1); - const util = __importStar(require$$0__default); - const assert_1 = require$$0$8; - const exec_1 = requireExec$1(); - const retry_helper_1 = requireRetryHelper(); - class HTTPError extends Error { - constructor(httpStatusCode) { - super(`Unexpected HTTP response: ${httpStatusCode}`); - this.httpStatusCode = httpStatusCode; - Object.setPrototypeOf(this, new.target.prototype); + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response.socket.address(), + protocol: secProtocol, + extensions: secExtension + }); + } + + onEstablish(response, extensions); } + }); + + return controller } - toolCache.HTTPError = HTTPError; - const IS_WINDOWS = process.platform === 'win32'; - const IS_MAC = process.platform === 'darwin'; - const userAgent = 'actions/tool-cache'; + + function closeWebSocketConnection (ws, code, reason, reasonByteLength) { + if (isClosing(ws) || isClosed(ws)) ; else if (!isEstablished(ws)) { + // If the WebSocket connection is not yet established + // Fail the WebSocket connection and set this's ready state + // to CLOSING (2). + failWebsocketConnection(ws, 'Connection was closed before it was established.'); + ws[kReadyState] = states.CLOSING; + } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) { + // If the WebSocket closing handshake has not yet been started + // Start the WebSocket closing handshake and set this's ready + // state to CLOSING (2). + // - If neither code nor reason is present, the WebSocket Close + // message must not have a body. + // - If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + // - If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + + ws[kSentClose] = sentCloseFrameState.PROCESSING; + + const frame = new WebsocketFrameSend(); + + // If neither code nor reason is present, the WebSocket Close + // message must not have a body. + + // If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + if (code !== undefined && reason === undefined) { + frame.frameData = Buffer.allocUnsafe(2); + frame.frameData.writeUInt16BE(code, 0); + } else if (code !== undefined && reason !== undefined) { + // If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame.frameData.writeUInt16BE(code, 0); + // the body MAY contain UTF-8-encoded data with value /reason/ + frame.frameData.write(reason, 2, 'utf-8'); + } else { + frame.frameData = emptyBuffer; + } + + /** @type {import('stream').Duplex} */ + const socket = ws[kResponse].socket; + + socket.write(frame.createFrame(opcodes.CLOSE)); + + ws[kSentClose] = sentCloseFrameState.SENT; + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + ws[kReadyState] = states.CLOSING; + } else { + // Otherwise + // Set this's ready state to CLOSING (2). + ws[kReadyState] = states.CLOSING; + } + } + /** - * Download a tool from an url and stream it into a file - * - * @param url url of tool to download - * @param dest path to download tool - * @param auth authorization header - * @param headers other headers - * @returns path to downloaded tool + * @param {Buffer} chunk */ - function downloadTool(url, dest, auth, headers) { - return __awaiter(this, void 0, void 0, function* () { - dest = dest || path.join(_getTempDirectory(), crypto.randomUUID()); - yield io.mkdirP(path.dirname(dest)); - core.debug(`Downloading ${url}`); - core.debug(`Destination ${dest}`); - const maxAttempts = 3; - const minSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MIN_SECONDS', 10); - const maxSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MAX_SECONDS', 20); - const retryHelper = new retry_helper_1.RetryHelper(maxAttempts, minSeconds, maxSeconds); - return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () { - return yield downloadToolAttempt(url, dest || '', auth, headers); - }), (err) => { - if (err instanceof HTTPError && err.httpStatusCode) { - // Don't retry anything less than 500, except 408 Request Timeout and 429 Too Many Requests - if (err.httpStatusCode < 500 && - err.httpStatusCode !== 408 && - err.httpStatusCode !== 429) { - return false; - } - } - // Otherwise retry - return true; - }); + function onSocketData (chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause(); + } + } + + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + */ + function onSocketClose () { + const { ws } = this; + const { [kResponse]: response } = ws; + + response.socket.off('data', onSocketData); + response.socket.off('close', onSocketClose); + response.socket.off('error', onSocketError); + + // If the TCP connection was closed after the + // WebSocket closing handshake was completed, the WebSocket connection + // is said to have been closed _cleanly_. + const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose]; + + let code = 1005; + let reason = ''; + + const result = ws[kByteParser].closingInfo; + + if (result && !result.error) { + code = result.code ?? 1005; + reason = result.reason; + } else if (!ws[kReceivedClose]) { + // If _The WebSocket + // Connection is Closed_ and no Close control frame was received by the + // endpoint (such as could occur if the underlying transport connection + // is lost), _The WebSocket Connection Close Code_ is considered to be + // 1006. + code = 1006; + } + + // 1. Change the ready state to CLOSED (3). + ws[kReadyState] = states.CLOSED; + + // 2. If the user agent was required to fail the WebSocket + // connection, or if the WebSocket connection was closed + // after being flagged as full, fire an event named error + // at the WebSocket object. + // TODO + + // 3. Fire an event named close at the WebSocket object, + // using CloseEvent, with the wasClean attribute + // initialized to true if the connection closed cleanly + // and false otherwise, the code attribute initialized to + // the WebSocket connection close code, and the reason + // attribute initialized to the result of applying UTF-8 + // decode without BOM to the WebSocket connection close + // reason. + // TODO: process.nextTick + fireEvent('close', ws, (type, init) => new CloseEvent(type, init), { + wasClean, code, reason + }); + + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws, + code, + reason }); + } } - toolCache.downloadTool = downloadTool; - function downloadToolAttempt(url, dest, auth, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (fs.existsSync(dest)) { - throw new Error(`Destination file path ${dest} already exists`); - } - // Get the response headers - const http = new httpm.HttpClient(userAgent, [], { - allowRetries: false - }); - if (auth) { - core.debug('set auth'); - if (headers === undefined) { - headers = {}; - } - headers.authorization = auth; - } - const response = yield http.get(url, headers); - if (response.message.statusCode !== 200) { - const err = new HTTPError(response.message.statusCode); - core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); - throw err; - } - // Download the response body - const pipeline = util.promisify(stream.pipeline); - const responseMessageFactory = _getGlobal('TEST_DOWNLOAD_TOOL_RESPONSE_MESSAGE_FACTORY', () => response.message); - const readStream = responseMessageFactory(); - let succeeded = false; - try { - yield pipeline(readStream, fs.createWriteStream(dest)); - core.debug('download complete'); - succeeded = true; - return dest; - } - finally { - // Error, delete dest before retry - if (!succeeded) { - core.debug('download failed'); - try { - yield io.rmRF(dest); - } - catch (err) { - core.debug(`Failed to delete '${dest}'. ${err.message}`); - } - } + + function onSocketError (error) { + const { ws } = this; + + ws[kReadyState] = states.CLOSING; + + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error); + } + + this.destroy(); + } + + connection = { + establishWebSocketConnection, + closeWebSocketConnection + }; + return connection; +} + +var permessageDeflate; +var hasRequiredPermessageDeflate; + +function requirePermessageDeflate () { + if (hasRequiredPermessageDeflate) return permessageDeflate; + hasRequiredPermessageDeflate = 1; + + const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$3; + const { isValidClientWindowBits } = requireUtil$3(); + + const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]); + const kBuffer = Symbol('kBuffer'); + const kLength = Symbol('kLength'); + + class PerMessageDeflate { + /** @type {import('node:zlib').InflateRaw} */ + #inflate + + #options = {} + + constructor (extensions) { + this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover'); + this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits'); + } + + decompress (chunk, fin, callback) { + // An endpoint uses the following algorithm to decompress a message. + // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the + // payload of the message. + // 2. Decompress the resulting data using DEFLATE. + + if (!this.#inflate) { + let windowBits = Z_DEFAULT_WINDOWBITS; + + if (this.#options.serverMaxWindowBits) { // empty values default to Z_DEFAULT_WINDOWBITS + if (!isValidClientWindowBits(this.#options.serverMaxWindowBits)) { + callback(new Error('Invalid server_max_window_bits')); + return } + + windowBits = Number.parseInt(this.#options.serverMaxWindowBits); + } + + this.#inflate = createInflateRaw({ windowBits }); + this.#inflate[kBuffer] = []; + this.#inflate[kLength] = 0; + + this.#inflate.on('data', (data) => { + this.#inflate[kBuffer].push(data); + this.#inflate[kLength] += data.length; + }); + + this.#inflate.on('error', (err) => { + this.#inflate = null; + callback(err); + }); + } + + this.#inflate.write(chunk); + if (fin) { + this.#inflate.write(tail); + } + + this.#inflate.flush(() => { + const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]); + + this.#inflate[kBuffer].length = 0; + this.#inflate[kLength] = 0; + + callback(null, full); }); + } } - /** - * Extract a .7z file - * - * @param file path to the .7z file - * @param dest destination directory. Optional. - * @param _7zPath path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this - * problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will - * gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is - * bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line - * interface, it is smaller than the full command line interface, and it does support long paths. At the - * time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website. - * Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path - * to 7zr.exe can be pass to this function. - * @returns path to the destination directory - */ - function extract7z(file, dest, _7zPath) { - return __awaiter(this, void 0, void 0, function* () { - (0, assert_1.ok)(IS_WINDOWS, 'extract7z() not supported on current OS'); - (0, assert_1.ok)(file, 'parameter "file" is required'); - dest = yield _createExtractFolder(dest); - const originalCwd = process.cwd(); - process.chdir(dest); - if (_7zPath) { - try { - const logLevel = core.isDebug() ? '-bb1' : '-bb0'; - const args = [ - 'x', - logLevel, - '-bd', - '-sccUTF-8', - file - ]; - const options = { - silent: true - }; - yield (0, exec_1.exec)(`"${_7zPath}"`, args, options); - } - finally { - process.chdir(originalCwd); - } + + permessageDeflate = { PerMessageDeflate }; + return permessageDeflate; +} + +var receiver; +var hasRequiredReceiver; + +function requireReceiver () { + if (hasRequiredReceiver) return receiver; + hasRequiredReceiver = 1; + + const { Writable } = require$$0$8; + const assert = require$$0$7; + const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = requireConstants$6(); + const { kReadyState, kSentClose, kResponse, kReceivedClose } = requireSymbols(); + const { channels } = requireDiagnostics(); + const { + isValidStatusCode, + isValidOpcode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isTextBinaryFrame, + isContinuationFrame + } = requireUtil$3(); + const { WebsocketFrameSend } = requireFrame(); + const { closeWebSocketConnection } = requireConnection(); + const { PerMessageDeflate } = requirePermessageDeflate(); + + // This code was influenced by ws released under the MIT license. + // Copyright (c) 2011 Einar Otto Stangvik + // Copyright (c) 2013 Arnout Kazemier and contributors + // Copyright (c) 2016 Luigi Pinca and contributors + + class ByteParser extends Writable { + #buffers = [] + #byteOffset = 0 + #loop = false + + #state = parserStates.INFO + + #info = {} + #fragments = [] + + /** @type {Map} */ + #extensions + + constructor (ws, extensions) { + super(); + + this.ws = ws; + this.#extensions = extensions == null ? new Map() : extensions; + + if (this.#extensions.has('permessage-deflate')) { + this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions)); + } + } + + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write (chunk, _, callback) { + this.#buffers.push(chunk); + this.#byteOffset += chunk.length; + this.#loop = true; + + this.run(callback); + } + + /** + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. + */ + run (callback) { + while (this.#loop) { + if (this.#state === parserStates.INFO) { + // If there aren't enough bytes to parse the payload length, etc. + if (this.#byteOffset < 2) { + return callback() } - else { - const escapedScript = path - .join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1') - .replace(/'/g, "''") - .replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines - const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); - const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); - const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`; - const args = [ - '-NoLogo', - '-Sta', - '-NoProfile', - '-NonInteractive', - '-ExecutionPolicy', - 'Unrestricted', - '-Command', - command - ]; - const options = { - silent: true - }; - try { - const powershellPath = yield io.which('powershell', true); - yield (0, exec_1.exec)(`"${powershellPath}"`, args, options); - } - finally { - process.chdir(originalCwd); - } + + const buffer = this.consume(2); + const fin = (buffer[0] & 0x80) !== 0; + const opcode = buffer[0] & 0x0F; + const masked = (buffer[1] & 0x80) === 0x80; + + const fragmented = !fin && opcode !== opcodes.CONTINUATION; + const payloadLength = buffer[1] & 0x7F; + + const rsv1 = buffer[0] & 0x40; + const rsv2 = buffer[0] & 0x20; + const rsv3 = buffer[0] & 0x10; + + if (!isValidOpcode(opcode)) { + failWebsocketConnection(this.ws, 'Invalid opcode received'); + return callback() } - return dest; - }); - } - toolCache.extract7z = extract7z; - /** - * Extract a compressed tar archive - * - * @param file path to the tar - * @param dest destination directory. Optional. - * @param flags flags for the tar command to use for extraction. Defaults to 'xz' (extracting gzipped tars). Optional. - * @returns path to the destination directory - */ - function extractTar(file, dest, flags = 'xz') { - return __awaiter(this, void 0, void 0, function* () { - if (!file) { - throw new Error("parameter 'file' is required"); + + if (masked) { + failWebsocketConnection(this.ws, 'Frame cannot be masked'); + return callback() } - // Create dest - dest = yield _createExtractFolder(dest); - // Determine whether GNU tar - core.debug('Checking tar --version'); - let versionOutput = ''; - yield (0, exec_1.exec)('tar --version', [], { - ignoreReturnCode: true, - silent: true, - listeners: { - stdout: (data) => (versionOutput += data.toString()), - stderr: (data) => (versionOutput += data.toString()) - } - }); - core.debug(versionOutput.trim()); - const isGnuTar = versionOutput.toUpperCase().includes('GNU TAR'); - // Initialize args - let args; - if (flags instanceof Array) { - args = flags; + + // MUST be 0 unless an extension is negotiated that defines meanings + // for non-zero values. If a nonzero value is received and none of + // the negotiated extensions defines the meaning of such a nonzero + // value, the receiving endpoint MUST _Fail the WebSocket + // Connection_. + // This document allocates the RSV1 bit of the WebSocket header for + // PMCEs and calls the bit the "Per-Message Compressed" bit. On a + // WebSocket connection where a PMCE is in use, this bit indicates + // whether a message is compressed or not. + if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) { + failWebsocketConnection(this.ws, 'Expected RSV1 to be clear.'); + return } - else { - args = [flags]; + + if (rsv2 !== 0 || rsv3 !== 0) { + failWebsocketConnection(this.ws, 'RSV1, RSV2, RSV3 must be clear'); + return } - if (core.isDebug() && !flags.includes('v')) { - args.push('-v'); + + if (fragmented && !isTextBinaryFrame(opcode)) { + // Only text and binary frames can be fragmented + failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.'); + return } - let destArg = dest; - let fileArg = file; - if (IS_WINDOWS && isGnuTar) { - args.push('--force-local'); - destArg = dest.replace(/\\/g, '/'); - // Technically only the dest needs to have `/` but for aesthetic consistency - // convert slashes in the file arg too. - fileArg = file.replace(/\\/g, '/'); + + // If we are already parsing a text/binary frame and do not receive either + // a continuation frame or close frame, fail the connection. + if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { + failWebsocketConnection(this.ws, 'Expected continuation frame'); + return } - if (isGnuTar) { - // Suppress warnings when using GNU tar to extract archives created by BSD tar - args.push('--warning=no-unknown-keyword'); - args.push('--overwrite'); + + if (this.#info.fragmented && fragmented) { + // A fragmented frame can't be fragmented itself + failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.'); + return } - args.push('-C', destArg, '-f', fileArg); - yield (0, exec_1.exec)(`tar`, args); - return dest; - }); - } - toolCache.extractTar = extractTar; - /** - * Extract a xar compatible archive - * - * @param file path to the archive - * @param dest destination directory. Optional. - * @param flags flags for the xar. Optional. - * @returns path to the destination directory - */ - function extractXar(file, dest, flags = []) { - return __awaiter(this, void 0, void 0, function* () { - (0, assert_1.ok)(IS_MAC, 'extractXar() not supported on current OS'); - (0, assert_1.ok)(file, 'parameter "file" is required'); - dest = yield _createExtractFolder(dest); - let args; - if (flags instanceof Array) { - args = flags; + + // "All control frames MUST have a payload length of 125 bytes or less + // and MUST NOT be fragmented." + if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { + failWebsocketConnection(this.ws, 'Control frame either too large or fragmented'); + return } - else { - args = [flags]; + + if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { + failWebsocketConnection(this.ws, 'Unexpected continuation frame'); + return } - args.push('-x', '-C', dest, '-f', file); - if (core.isDebug()) { - args.push('-v'); + + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; } - const xarPath = yield io.which('xar', true); - yield (0, exec_1.exec)(`"${xarPath}"`, _unique(args)); - return dest; - }); - } - toolCache.extractXar = extractXar; - /** - * Extract a zip - * - * @param file path to the zip - * @param dest destination directory. Optional. - * @returns path to the destination directory - */ - function extractZip(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - if (!file) { - throw new Error("parameter 'file' is required"); + + if (isTextBinaryFrame(opcode)) { + this.#info.binaryType = opcode; + this.#info.compressed = rsv1 !== 0; } - dest = yield _createExtractFolder(dest); - if (IS_WINDOWS) { - yield extractZipWin(file, dest); + + this.#info.opcode = opcode; + this.#info.masked = masked; + this.#info.fin = fin; + this.#info.fragmented = fragmented; + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback() } - else { - yield extractZipNix(file, dest); + + const buffer = this.consume(2); + + this.#info.payloadLength = buffer.readUInt16BE(0); + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback() } - return dest; - }); - } - toolCache.extractZip = extractZip; - function extractZipWin(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - // build the powershell command - const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines - const escapedDest = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); - const pwshPath = yield io.which('pwsh', false); - //To match the file overwrite behavior on nix systems, we use the overwrite = true flag for ExtractToDirectory - //and the -Force flag for Expand-Archive as a fallback - if (pwshPath) { - //attempt to use pwsh with ExtractToDirectory, if this fails attempt Expand-Archive - const pwshCommand = [ - `$ErrorActionPreference = 'Stop' ;`, - `try { Add-Type -AssemblyName System.IO.Compression.ZipFile } catch { } ;`, - `try { [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}', $true) }`, - `catch { if (($_.Exception.GetType().FullName -eq 'System.Management.Automation.MethodException') -or ($_.Exception.GetType().FullName -eq 'System.Management.Automation.RuntimeException') ){ Expand-Archive -LiteralPath '${escapedFile}' -DestinationPath '${escapedDest}' -Force } else { throw $_ } } ;` - ].join(' '); - const args = [ - '-NoLogo', - '-NoProfile', - '-NonInteractive', - '-ExecutionPolicy', - 'Unrestricted', - '-Command', - pwshCommand - ]; - core.debug(`Using pwsh at path: ${pwshPath}`); - yield (0, exec_1.exec)(`"${pwshPath}"`, args); + + const buffer = this.consume(8); + const upper = buffer.readUInt32BE(0); + + // 2^31 is the maximum bytes an arraybuffer can contain + // on 32-bit systems. Although, on 64-bit systems, this is + // 2^53-1 bytes. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length + // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275 + // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.'); + return } - else { - const powershellCommand = [ - `$ErrorActionPreference = 'Stop' ;`, - `try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ;`, - `if ((Get-Command -Name Expand-Archive -Module Microsoft.PowerShell.Archive -ErrorAction Ignore)) { Expand-Archive -LiteralPath '${escapedFile}' -DestinationPath '${escapedDest}' -Force }`, - `else {[System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}', $true) }` - ].join(' '); - const args = [ - '-NoLogo', - '-Sta', - '-NoProfile', - '-NonInteractive', - '-ExecutionPolicy', - 'Unrestricted', - '-Command', - powershellCommand - ]; - const powershellPath = yield io.which('powershell', true); - core.debug(`Using powershell at path: ${powershellPath}`); - yield (0, exec_1.exec)(`"${powershellPath}"`, args); + + const lower = buffer.readUInt32BE(4); + + this.#info.payloadLength = (upper << 8) + lower; + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + return callback() } - }); - } - function extractZipNix(file, dest) { - return __awaiter(this, void 0, void 0, function* () { - const unzipPath = yield io.which('unzip', true); - const args = [file]; - if (!core.isDebug()) { - args.unshift('-q'); + + const body = this.consume(this.#info.payloadLength); + + if (isControlFrame(this.#info.opcode)) { + this.#loop = this.parseControlFrame(body); + this.#state = parserStates.INFO; + } else { + if (!this.#info.compressed) { + this.#fragments.push(body); + + // If the frame is not fragmented, a message has been received. + // If the frame is fragmented, it will terminate with a fin bit set + // and an opcode of 0 (continuation), therefore we handle that when + // parsing continuation frames, not here. + if (!this.#info.fragmented && this.#info.fin) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage); + this.#fragments.length = 0; + } + + this.#state = parserStates.INFO; + } else { + this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => { + if (error) { + closeWebSocketConnection(this.ws, 1007, error.message, error.message.length); + return + } + + this.#fragments.push(data); + + if (!this.#info.fin) { + this.#state = parserStates.INFO; + this.#loop = true; + this.run(callback); + return + } + + websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)); + + this.#loop = true; + this.#state = parserStates.INFO; + this.#fragments.length = 0; + this.run(callback); + }); + + this.#loop = false; + break + } } - args.unshift('-o'); //overwrite with -o, otherwise a prompt is shown which freezes the run - yield (0, exec_1.exec)(`"${unzipPath}"`, args, { cwd: dest }); - }); - } - /** - * Caches a directory and installs it into the tool cacheDir - * - * @param sourceDir the directory to cache into tools - * @param tool tool name - * @param version version of the tool. semver format - * @param arch architecture of the tool. Optional. Defaults to machine architecture - */ - function cacheDir(sourceDir, tool, version, arch) { - return __awaiter(this, void 0, void 0, function* () { - version = semver.clean(version) || version; - arch = arch || os.arch(); - core.debug(`Caching tool ${tool} ${version} ${arch}`); - core.debug(`source dir: ${sourceDir}`); - if (!fs.statSync(sourceDir).isDirectory()) { - throw new Error('sourceDir is not a directory'); + } + } + } + + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer} + */ + consume (n) { + if (n > this.#byteOffset) { + throw new Error('Called consume() before buffers satiated.') + } else if (n === 0) { + return emptyBuffer + } + + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length; + return this.#buffers.shift() + } + + const buffer = Buffer.allocUnsafe(n); + let offset = 0; + + while (offset !== n) { + const next = this.#buffers[0]; + const { length } = next; + + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset); + break + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset); + this.#buffers[0] = next.subarray(n - offset); + break + } else { + buffer.set(this.#buffers.shift(), offset); + offset += next.length; + } + } + + this.#byteOffset -= n; + + return buffer + } + + parseCloseBody (data) { + assert(data.length !== 1); + + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 + /** @type {number|undefined} */ + let code; + + if (data.length >= 2) { + // _The WebSocket Connection Close Code_ is + // defined as the status code (Section 7.4) contained in the first Close + // control frame received by the application + code = data.readUInt16BE(0); + } + + if (code !== undefined && !isValidStatusCode(code)) { + return { code: 1002, reason: 'Invalid status code', error: true } + } + + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6 + /** @type {Buffer} */ + let reason = data.subarray(2); + + // Remove BOM + if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) { + reason = reason.subarray(3); + } + + try { + reason = utf8Decode(reason); + } catch { + return { code: 1007, reason: 'Invalid UTF-8', error: true } + } + + return { code, reason, error: false } + } + + /** + * Parses control frames. + * @param {Buffer} body + */ + parseControlFrame (body) { + const { opcode, payloadLength } = this.#info; + + if (opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.'); + return false + } + + this.#info.closeInfo = this.parseCloseBody(body); + + if (this.#info.closeInfo.error) { + const { code, reason } = this.#info.closeInfo; + + closeWebSocketConnection(this.ws, code, reason, reason.length); + failWebsocketConnection(this.ws, reason); + return false + } + + if (this.ws[kSentClose] !== sentCloseFrameState.SENT) { + // If an endpoint receives a Close frame and did not previously send a + // Close frame, the endpoint MUST send a Close frame in response. (When + // sending a Close frame in response, the endpoint typically echos the + // status code it received.) + let body = emptyBuffer; + if (this.#info.closeInfo.code) { + body = Buffer.allocUnsafe(2); + body.writeUInt16BE(this.#info.closeInfo.code, 0); } - // Create the tool dir - const destPath = yield _createToolPath(tool, version, arch); - // copy each child item. do not move. move can fail on Windows - // due to anti-virus software having an open handle on a file. - for (const itemName of fs.readdirSync(sourceDir)) { - const s = path.join(sourceDir, itemName); - yield io.cp(s, destPath, { recursive: true }); + const closeFrame = new WebsocketFrameSend(body); + + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = sentCloseFrameState.SENT; + } + } + ); + } + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + + return false + } else if (opcode === opcodes.PING) { + // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in + // response, unless it already received a Close frame. + // A Pong frame sent in response to a Ping frame must have identical + // "Application data" + + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body); + + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); + + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }); } - // write .complete - _completeToolPath(tool, version, arch); - return destPath; - }); + } + } else if (opcode === opcodes.PONG) { + // A Pong frame MAY be sent unsolicited. This serves as a + // unidirectional heartbeat. A response to an unsolicited Pong frame is + // not expected. + + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }); + } + } + + return true + } + + get closingInfo () { + return this.#info.closeInfo + } } - toolCache.cacheDir = cacheDir; + + receiver = { + ByteParser + }; + return receiver; +} + +var sender; +var hasRequiredSender; + +function requireSender () { + if (hasRequiredSender) return sender; + hasRequiredSender = 1; + + const { WebsocketFrameSend } = requireFrame(); + const { opcodes, sendHints } = requireConstants$6(); + const FixedQueue = requireFixedQueue(); + + /** @type {typeof Uint8Array} */ + const FastBuffer = Buffer[Symbol.species]; + /** - * Caches a downloaded file (GUID) and installs it - * into the tool cache with a given targetName - * - * @param sourceFile the file to cache into tools. Typically a result of downloadTool which is a guid. - * @param targetFile the name of the file name in the tools directory - * @param tool tool name - * @param version version of the tool. semver format - * @param arch architecture of the tool. Optional. Defaults to machine architecture + * @typedef {object} SendQueueNode + * @property {Promise | null} promise + * @property {((...args: any[]) => any)} callback + * @property {Buffer | null} frame */ - function cacheFile(sourceFile, targetFile, tool, version, arch) { - return __awaiter(this, void 0, void 0, function* () { - version = semver.clean(version) || version; - arch = arch || os.arch(); - core.debug(`Caching tool ${tool} ${version} ${arch}`); - core.debug(`source file: ${sourceFile}`); - if (!fs.statSync(sourceFile).isFile()) { - throw new Error('sourceFile is not a file'); - } - // create the tool dir - const destFolder = yield _createToolPath(tool, version, arch); - // copy instead of move. move can fail on Windows due to - // anti-virus software having an open handle on a file. - const destPath = path.join(destFolder, targetFile); - core.debug(`destination file ${destPath}`); - yield io.cp(sourceFile, destPath); - // write .complete - _completeToolPath(tool, version, arch); - return destFolder; - }); + + class SendQueue { + /** + * @type {FixedQueue} + */ + #queue = new FixedQueue() + + /** + * @type {boolean} + */ + #running = false + + /** @type {import('node:net').Socket} */ + #socket + + constructor (socket) { + this.#socket = socket; + } + + add (item, cb, hint) { + if (hint !== sendHints.blob) { + const frame = createFrame(item, hint); + if (!this.#running) { + // fast-path + this.#socket.write(frame, cb); + } else { + /** @type {SendQueueNode} */ + const node = { + promise: null, + callback: cb, + frame + }; + this.#queue.push(node); + } + return + } + + /** @type {SendQueueNode} */ + const node = { + promise: item.arrayBuffer().then((ab) => { + node.promise = null; + node.frame = createFrame(ab, hint); + }), + callback: cb, + frame: null + }; + + this.#queue.push(node); + + if (!this.#running) { + this.#run(); + } + } + + async #run () { + this.#running = true; + const queue = this.#queue; + while (!queue.isEmpty()) { + const node = queue.shift(); + // wait pending promise + if (node.promise !== null) { + await node.promise; + } + // write + this.#socket.write(node.frame, node.callback); + // cleanup + node.callback = node.frame = null; + } + this.#running = false; + } } - toolCache.cacheFile = cacheFile; - /** - * Finds the path to a tool version in the local installed tool cache - * - * @param toolName name of the tool - * @param versionSpec version of the tool - * @param arch optional arch. defaults to arch of computer - */ - function find(toolName, versionSpec, arch) { - if (!toolName) { - throw new Error('toolName parameter is required'); + + function createFrame (data, hint) { + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY) + } + + function toBuffer (data, hint) { + switch (hint) { + case sendHints.string: + return Buffer.from(data) + case sendHints.arrayBuffer: + case sendHints.blob: + return new FastBuffer(data) + case sendHints.typedArray: + return new FastBuffer(data.buffer, data.byteOffset, data.byteLength) + } + } + + sender = { SendQueue }; + return sender; +} + +var websocket; +var hasRequiredWebsocket; + +function requireWebsocket () { + if (hasRequiredWebsocket) return websocket; + hasRequiredWebsocket = 1; + + const { webidl } = requireWebidl(); + const { URLSerializer } = requireDataUrl(); + const { environmentSettingsObject } = requireUtil$8(); + const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = requireConstants$6(); + const { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser + } = requireSymbols(); + const { + isConnecting, + isEstablished, + isClosing, + isValidSubprotocol, + fireEvent + } = requireUtil$3(); + const { establishWebSocketConnection, closeWebSocketConnection } = requireConnection(); + const { ByteParser } = requireReceiver(); + const { kEnumerableProperty, isBlobLike } = requireUtil$9(); + const { getGlobalDispatcher } = requireGlobal(); + const { types } = require$$0$a; + const { ErrorEvent, CloseEvent } = requireEvents(); + const { SendQueue } = requireSender(); + + // https://websockets.spec.whatwg.org/#interface-definition + class WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + } + + #bufferedAmount = 0 + #protocol = '' + #extensions = '' + + /** @type {SendQueue} */ + #sendQueue + + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor (url, protocols = []) { + super(); + + webidl.util.markAsUncloneable(this); + + const prefix = 'WebSocket constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options'); + + url = webidl.converters.USVString(url, prefix, 'url'); + protocols = options.protocols; + + // 1. Let baseURL be this's relevant settings object's API base URL. + const baseURL = environmentSettingsObject.settingsObject.baseUrl; + + // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. + let urlRecord; + + try { + urlRecord = new URL(url, baseURL); + } catch (e) { + // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException. + throw new DOMException(e, 'SyntaxError') } - if (!versionSpec) { - throw new Error('versionSpec parameter is required'); + + // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws". + if (urlRecord.protocol === 'http:') { + urlRecord.protocol = 'ws:'; + } else if (urlRecord.protocol === 'https:') { + // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss". + urlRecord.protocol = 'wss:'; + } + + // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException. + if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') { + throw new DOMException( + `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, + 'SyntaxError' + ) + } + + // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError" + // DOMException. + if (urlRecord.hash || urlRecord.href.endsWith('#')) { + throw new DOMException('Got fragment', 'SyntaxError') + } + + // 8. If protocols is a string, set protocols to a sequence consisting + // of just that string. + if (typeof protocols === 'string') { + protocols = [protocols]; + } + + // 9. If any of the values in protocols occur more than once or otherwise + // fail to match the requirements for elements that comprise the value + // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket + // protocol, then throw a "SyntaxError" DOMException. + if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } + + if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } + + // 10. Set this's url to urlRecord. + this[kWebSocketURL] = new URL(urlRecord.href); + + // 11. Let client be this's relevant settings object. + const client = environmentSettingsObject.settingsObject; + + // 12. Run this step in parallel: + + // 1. Establish a WebSocket connection given urlRecord, protocols, + // and client. + this[kController] = establishWebSocketConnection( + urlRecord, + protocols, + client, + this, + (response, extensions) => this.#onConnectionEstablished(response, extensions), + options + ); + + // Each WebSocket object has an associated ready state, which is a + // number representing the state of the connection. Initially it must + // be CONNECTING (0). + this[kReadyState] = WebSocket.CONNECTING; + + this[kSentClose] = sentCloseFrameState.NOT_SENT; + + // The extensions attribute must initially return the empty string. + + // The protocol attribute must initially return the empty string. + + // Each WebSocket object has an associated binary type, which is a + // BinaryType. Initially it must be "blob". + this[kBinaryType] = 'blob'; + } + + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close (code = undefined, reason = undefined) { + webidl.brandCheck(this, WebSocket); + + const prefix = 'WebSocket.close'; + + if (code !== undefined) { + code = webidl.converters['unsigned short'](code, prefix, 'code', { clamp: true }); + } + + if (reason !== undefined) { + reason = webidl.converters.USVString(reason, prefix, 'reason'); + } + + // 1. If code is present, but is neither an integer equal to 1000 nor an + // integer in the range 3000 to 4999, inclusive, throw an + // "InvalidAccessError" DOMException. + if (code !== undefined) { + if (code !== 1000 && (code < 3000 || code > 4999)) { + throw new DOMException('invalid code', 'InvalidAccessError') + } + } + + let reasonByteLength = 0; + + // 2. If reason is present, then run these substeps: + if (reason !== undefined) { + // 1. Let reasonBytes be the result of encoding reason. + // 2. If reasonBytes is longer than 123 bytes, then throw a + // "SyntaxError" DOMException. + reasonByteLength = Buffer.byteLength(reason); + + if (reasonByteLength > 123) { + throw new DOMException( + `Reason must be less than 123 bytes; received ${reasonByteLength}`, + 'SyntaxError' + ) + } + } + + // 3. Run the first matching steps from the following list: + closeWebSocketConnection(this, code, reason, reasonByteLength); + } + + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send (data) { + webidl.brandCheck(this, WebSocket); + + const prefix = 'WebSocket.send'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + data = webidl.converters.WebSocketSendData(data, prefix, 'data'); + + // 1. If this's ready state is CONNECTING, then throw an + // "InvalidStateError" DOMException. + if (isConnecting(this)) { + throw new DOMException('Sent before connected.', 'InvalidStateError') + } + + // 2. Run the appropriate set of steps from the following list: + // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1 + // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 + + if (!isEstablished(this) || isClosing(this)) { + return + } + + // If data is a string + if (typeof data === 'string') { + // If the WebSocket connection is established and the WebSocket + // closing handshake has not yet started, then the user agent + // must send a WebSocket Message comprised of the data argument + // using a text frame opcode; if the data cannot be sent, e.g. + // because it would need to be buffered but the buffer is full, + // the user agent must flag the WebSocket as full and then close + // the WebSocket connection. Any invocation of this method with a + // string argument that does not throw an exception must increase + // the bufferedAmount attribute by the number of bytes needed to + // express the argument as UTF-8. + + const length = Buffer.byteLength(data); + + this.#bufferedAmount += length; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= length; + }, sendHints.string); + } else if (types.isArrayBuffer(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need + // to be buffered but the buffer is full, the user agent must flag + // the WebSocket as full and then close the WebSocket connection. + // The data to be sent is the data stored in the buffer described + // by the ArrayBuffer object. Any invocation of this method with an + // ArrayBuffer argument that does not throw an exception must + // increase the bufferedAmount attribute by the length of the + // ArrayBuffer in bytes. + + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.arrayBuffer); + } else if (ArrayBuffer.isView(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need to + // be buffered but the buffer is full, the user agent must flag the + // WebSocket as full and then close the WebSocket connection. The + // data to be sent is the data stored in the section of the buffer + // described by the ArrayBuffer object that data references. Any + // invocation of this method with this kind of argument that does + // not throw an exception must increase the bufferedAmount attribute + // by the length of data’s buffer in bytes. + + this.#bufferedAmount += data.byteLength; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.byteLength; + }, sendHints.typedArray); + } else if (isBlobLike(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need to + // be buffered but the buffer is full, the user agent must flag the + // WebSocket as full and then close the WebSocket connection. The data + // to be sent is the raw data represented by the Blob object. Any + // invocation of this method with a Blob argument that does not throw + // an exception must increase the bufferedAmount attribute by the size + // of the Blob object’s raw data, in bytes. + + this.#bufferedAmount += data.size; + this.#sendQueue.add(data, () => { + this.#bufferedAmount -= data.size; + }, sendHints.blob); } - arch = arch || os.arch(); - // attempt to resolve an explicit version - if (!isExplicitVersion(versionSpec)) { - const localVersions = findAllVersions(toolName, arch); - const match = evaluateVersions(localVersions, versionSpec); - versionSpec = match; + } + + get readyState () { + webidl.brandCheck(this, WebSocket); + + // The readyState getter steps are to return this's ready state. + return this[kReadyState] + } + + get bufferedAmount () { + webidl.brandCheck(this, WebSocket); + + return this.#bufferedAmount + } + + get url () { + webidl.brandCheck(this, WebSocket); + + // The url getter steps are to return this's url, serialized. + return URLSerializer(this[kWebSocketURL]) + } + + get extensions () { + webidl.brandCheck(this, WebSocket); + + return this.#extensions + } + + get protocol () { + webidl.brandCheck(this, WebSocket); + + return this.#protocol + } + + get onopen () { + webidl.brandCheck(this, WebSocket); + + return this.#events.open + } + + set onopen (fn) { + webidl.brandCheck(this, WebSocket); + + if (this.#events.open) { + this.removeEventListener('open', this.#events.open); } - // check for the explicit version in the cache - let toolPath = ''; - if (versionSpec) { - versionSpec = semver.clean(versionSpec) || ''; - const cachePath = path.join(_getCacheDirectory(), toolName, versionSpec, arch); - core.debug(`checking cache: ${cachePath}`); - if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) { - core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`); - toolPath = cachePath; - } - else { - core.debug('not found'); - } + + if (typeof fn === 'function') { + this.#events.open = fn; + this.addEventListener('open', fn); + } else { + this.#events.open = null; } - return toolPath; - } - toolCache.find = find; - /** - * Finds the paths to all versions of a tool that are installed in the local tool cache - * - * @param toolName name of the tool - * @param arch optional arch. defaults to arch of computer - */ - function findAllVersions(toolName, arch) { - const versions = []; - arch = arch || os.arch(); - const toolPath = path.join(_getCacheDirectory(), toolName); - if (fs.existsSync(toolPath)) { - const children = fs.readdirSync(toolPath); - for (const child of children) { - if (isExplicitVersion(child)) { - const fullPath = path.join(toolPath, child, arch || ''); - if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) { - versions.push(child); - } - } - } + } + + get onerror () { + webidl.brandCheck(this, WebSocket); + + return this.#events.error + } + + set onerror (fn) { + webidl.brandCheck(this, WebSocket); + + if (this.#events.error) { + this.removeEventListener('error', this.#events.error); } - return versions; - } - toolCache.findAllVersions = findAllVersions; - function getManifestFromRepo(owner, repo, auth, branch = 'master') { - return __awaiter(this, void 0, void 0, function* () { - let releases = []; - const treeUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/${branch}`; - const http = new httpm.HttpClient('tool-cache'); - const headers = {}; - if (auth) { - core.debug('set auth'); - headers.authorization = auth; - } - const response = yield http.getJson(treeUrl, headers); - if (!response.result) { - return releases; - } - let manifestUrl = ''; - for (const item of response.result.tree) { - if (item.path === 'versions-manifest.json') { - manifestUrl = item.url; - break; - } - } - headers['accept'] = 'application/vnd.github.VERSION.raw'; - let versionsRaw = yield (yield http.get(manifestUrl, headers)).readBody(); - if (versionsRaw) { - // shouldn't be needed but protects against invalid json saved with BOM - versionsRaw = versionsRaw.replace(/^\uFEFF/, ''); - try { - releases = JSON.parse(versionsRaw); - } - catch (_a) { - core.debug('Invalid json'); - } - } - return releases; - }); - } - toolCache.getManifestFromRepo = getManifestFromRepo; - function findFromManifest(versionSpec, stable, manifest, archFilter = os.arch()) { - return __awaiter(this, void 0, void 0, function* () { - // wrap the internal impl - const match = yield mm._findMatch(versionSpec, stable, manifest, archFilter); - return match; - }); - } - toolCache.findFromManifest = findFromManifest; - function _createExtractFolder(dest) { - return __awaiter(this, void 0, void 0, function* () { - if (!dest) { - // create a temp dir - dest = path.join(_getTempDirectory(), crypto.randomUUID()); - } - yield io.mkdirP(dest); - return dest; - }); - } - function _createToolPath(tool, version, arch) { - return __awaiter(this, void 0, void 0, function* () { - const folderPath = path.join(_getCacheDirectory(), tool, semver.clean(version) || version, arch || ''); - core.debug(`destination ${folderPath}`); - const markerPath = `${folderPath}.complete`; - yield io.rmRF(folderPath); - yield io.rmRF(markerPath); - yield io.mkdirP(folderPath); - return folderPath; - }); - } - function _completeToolPath(tool, version, arch) { - const folderPath = path.join(_getCacheDirectory(), tool, semver.clean(version) || version, arch || ''); - const markerPath = `${folderPath}.complete`; - fs.writeFileSync(markerPath, ''); - core.debug('finished caching tool'); - } - /** - * Check if version string is explicit - * - * @param versionSpec version string to check - */ - function isExplicitVersion(versionSpec) { - const c = semver.clean(versionSpec) || ''; - core.debug(`isExplicit: ${c}`); - const valid = semver.valid(c) != null; - core.debug(`explicit? ${valid}`); - return valid; - } - toolCache.isExplicitVersion = isExplicitVersion; - /** - * Get the highest satisfiying semantic version in `versions` which satisfies `versionSpec` - * - * @param versions array of versions to evaluate - * @param versionSpec semantic version spec to satisfy - */ - function evaluateVersions(versions, versionSpec) { - let version = ''; - core.debug(`evaluating ${versions.length} versions`); - versions = versions.sort((a, b) => { - if (semver.gt(a, b)) { - return 1; - } - return -1; - }); - for (let i = versions.length - 1; i >= 0; i--) { - const potential = versions[i]; - const satisfied = semver.satisfies(potential, versionSpec); - if (satisfied) { - version = potential; - break; - } + + if (typeof fn === 'function') { + this.#events.error = fn; + this.addEventListener('error', fn); + } else { + this.#events.error = null; } - if (version) { - core.debug(`matched: ${version}`); + } + + get onclose () { + webidl.brandCheck(this, WebSocket); + + return this.#events.close + } + + set onclose (fn) { + webidl.brandCheck(this, WebSocket); + + if (this.#events.close) { + this.removeEventListener('close', this.#events.close); } - else { - core.debug('match not found'); + + if (typeof fn === 'function') { + this.#events.close = fn; + this.addEventListener('close', fn); + } else { + this.#events.close = null; } - return version; - } - toolCache.evaluateVersions = evaluateVersions; - /** - * Gets RUNNER_TOOL_CACHE - */ - function _getCacheDirectory() { - const cacheDirectory = process.env['RUNNER_TOOL_CACHE'] || ''; - (0, assert_1.ok)(cacheDirectory, 'Expected RUNNER_TOOL_CACHE to be defined'); - return cacheDirectory; - } - /** - * Gets RUNNER_TEMP - */ - function _getTempDirectory() { - const tempDirectory = process.env['RUNNER_TEMP'] || ''; - (0, assert_1.ok)(tempDirectory, 'Expected RUNNER_TEMP to be defined'); - return tempDirectory; - } - /** - * Gets a global variable - */ - function _getGlobal(key, defaultValue) { - /* eslint-disable @typescript-eslint/no-explicit-any */ - const value = commonjsGlobal[key]; - /* eslint-enable @typescript-eslint/no-explicit-any */ - return value !== undefined ? value : defaultValue; - } - /** - * Returns an array of unique values. - * @param values Values to make unique. - */ - function _unique(values) { - return Array.from(new Set(values)); - } - - return toolCache; -} + } -var toolCacheExports = requireToolCache(); + get onmessage () { + webidl.brandCheck(this, WebSocket); -var execExports = requireExec$2(); + return this.#events.message + } -var utilsExports = requireUtils$4(); + set onmessage (fn) { + webidl.brandCheck(this, WebSocket); -async function exec$1(commandLine, args, options) { - const exitCode = await execExports.exec(commandLine, args, options); - if (exitCode !== 0) { - throw new Error(`'${[commandLine].concat(args || []).join(' ')}' exited with a non-zero code: ${exitCode}`); - } -} -async function getLatestRelease(repo) { - const octokit = getOctokit(); - return (await octokit.request('GET /repos/{owner}/{repo}/releases/latest', { - owner: GRAALVM_GH_USER, - repo - })).data; /** missing digest property */ -} -async function getContents(repo, path) { - const octokit = getOctokit(); - return (await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', { - owner: GRAALVM_GH_USER, - repo, - path - })).data; -} -async function getTaggedRelease(owner, repo, tag) { - const octokit = getOctokit(); - return (await octokit.request('GET /repos/{owner}/{repo}/releases/tags/{tag}', { - owner, - repo, - tag - })).data; /** missing digest property */ -} -async function getMatchingTags(owner, repo, tagPrefix) { - const octokit = getOctokit(); - return (await octokit.request('GET /repos/{owner}/{repo}/git/matching-refs/tags/{tagPrefix}', { - owner, - repo, - tagPrefix - })).data; -} -async function downloadAndExtractJDK(downloadUrl) { - return findJavaHomeInSubfolder(await extract(await toolCacheExports.downloadTool(downloadUrl))); -} -async function downloadExtractAndCacheJDK(downloader, toolName, version) { - const semVersion = toSemVer(version); - let toolPath = toolCacheExports.find(toolName, semVersion); - if (toolPath) { - coreExports.info(`Found ${toolName} ${version} in tool-cache @ ${toolPath}`); - } - else { - const extractDir = await extract(await downloader()); - coreExports.info(`Adding ${toolName} ${version} to tool-cache ...`); - toolPath = await toolCacheExports.cacheDir(extractDir, toolName, semVersion); - } - return findJavaHomeInSubfolder(toolPath); -} -/** - * This copy of tc.downloadTool() preserves the file extension in the dest. - * The file extension is required on Windows runners without .NET to extract zip files correctly. - * See #195 and https://github.com/actions/toolkit/blob/6b63a2bfc339a753a113d2266323a4d52d84dee0/packages/tool-cache/src/tool-cache.ts#L44 - */ -async function downloadFile(downloadUrl) { - const dest = join(_getTempDirectory(), crypto.randomUUID(), extname(downloadUrl)); - return toolCacheExports.downloadTool(downloadUrl, dest); -} -function _getTempDirectory() { - const tempDirectory = process.env['RUNNER_TEMP'] || ''; - ok(tempDirectory, 'Expected RUNNER_TEMP to be defined'); - return tempDirectory; -} -function calculateSHA256(filePath) { - const hashSum = createHash('sha256'); - hashSum.update(readFileSync(filePath)); - return hashSum.digest('hex'); -} -async function extract(downloadPath) { - if (GRAALVM_FILE_EXTENSION === '.tar.gz') { - return await toolCacheExports.extractTar(downloadPath); - } - else if (GRAALVM_FILE_EXTENSION === '.zip') { - return await toolCacheExports.extractZip(downloadPath); - } - else { - throw new Error(`Unexpected filetype downloaded: ${GRAALVM_FILE_EXTENSION}`); - } -} -function findJavaHomeInSubfolder(searchPath) { - const baseContents = readdirSync(searchPath); - if (baseContents.length === 1) { - return join(searchPath, baseContents[0], JDK_HOME_SUFFIX); - } - else { - throw new Error(`Unexpected amount of directory items found: ${baseContents.length}`); - } -} -function toSemVer(version) { - const parts = version.split('.'); - if (parts.length === 4) { - /** - * Turn legacy GraalVM version numbers (e.g., `22.0.0.2`) into valid - * semver.org versions (e.g., `22.0.0-2`). - */ - return `${parts[0]}.${parts[1]}.${parts.slice(2).join('-')}`; - } - const versionParts = version.split('-', 2); - const suffix = versionParts.length === 2 ? '-' + versionParts[1] : ''; - const validVersion = semverExports.valid(semverExports.coerce(versionParts[0]) + suffix); - if (!validVersion) { - throw new Error(`Unable to convert '${version}' to semantic version. ${ERROR_HINT}`); - } - return validVersion; -} -function isPREvent() { - return process.env[ENV_GITHUB_EVENT_NAME] === EVENT_NAME_PULL_REQUEST; -} -function getOctokit() { - /* Set up GitHub instance manually because @actions/github does not allow unauthenticated access */ - const GitHubWithPlugins = utilsExports.GitHub.plugin(); - const token = coreExports.getInput(INPUT_GITHUB_TOKEN); - if (token) { - return new GitHubWithPlugins({ auth: `token ${token}` }); - } - else { - return new GitHubWithPlugins(); /* unauthenticated */ - } -} -function tmpfile(fileName) { - return join(tmpdir(), fileName); -} -function setNativeImageOption(javaVersionOrDev, optionValue) { - const coercedJavaVersionOrDev = semverExports.coerce(javaVersionOrDev); - if ((coercedJavaVersionOrDev && semverExports.gte(coercedJavaVersionOrDev, '22.0.0')) || - javaVersionOrDev === VERSION_DEV || - javaVersionOrDev.endsWith('-ea')) { - /* NATIVE_IMAGE_OPTIONS was introduced in GraalVM for JDK 22 (so were EA builds). */ - let newOptionValue = optionValue; - const existingOptions = process.env[NATIVE_IMAGE_OPTIONS_ENV]; - if (existingOptions) { - newOptionValue = `${existingOptions} ${newOptionValue}`; - } - coreExports.exportVariable(NATIVE_IMAGE_OPTIONS_ENV, newOptionValue); - } - else { - const optionsFile = getNativeImageOptionsFile(); - if (fs.existsSync(optionsFile)) { - fs.appendFileSync(optionsFile, ` ${optionValue}`); - } - else { - fs.writeFileSync(optionsFile, `NativeImageArgs = ${optionValue}`); - } - } -} -const NATIVE_IMAGE_CONFIG_FILE = tmpfile('native-image-options.properties'); -const NATIVE_IMAGE_CONFIG_FILE_ENV = 'NATIVE_IMAGE_CONFIG_FILE'; -function getNativeImageOptionsFile() { - let optionsFile = process.env[NATIVE_IMAGE_CONFIG_FILE_ENV]; - if (optionsFile === undefined) { - optionsFile = NATIVE_IMAGE_CONFIG_FILE; - coreExports.exportVariable(NATIVE_IMAGE_CONFIG_FILE_ENV, optionsFile); - } - return optionsFile; -} + if (this.#events.message) { + this.removeEventListener('message', this.#events.message); + } + + if (typeof fn === 'function') { + this.#events.message = fn; + this.addEventListener('message', fn); + } else { + this.#events.message = null; + } + } -var libExports = requireLib$3(); + get binaryType () { + webidl.brandCheck(this, WebSocket); -var ioExports = requireIo$2(); + return this[kBinaryType] + } -var retryHelperExports = requireRetryHelper(); + set binaryType (type) { + webidl.brandCheck(this, WebSocket); -const byteToHex = []; -for (let i = 0; i < 256; ++i) { - byteToHex.push((i + 0x100).toString(16).slice(1)); -} -function unsafeStringify(arr, offset = 0) { - return (byteToHex[arr[offset + 0]] + - byteToHex[arr[offset + 1]] + - byteToHex[arr[offset + 2]] + - byteToHex[arr[offset + 3]] + - '-' + - byteToHex[arr[offset + 4]] + - byteToHex[arr[offset + 5]] + - '-' + - byteToHex[arr[offset + 6]] + - byteToHex[arr[offset + 7]] + - '-' + - byteToHex[arr[offset + 8]] + - byteToHex[arr[offset + 9]] + - '-' + - byteToHex[arr[offset + 10]] + - byteToHex[arr[offset + 11]] + - byteToHex[arr[offset + 12]] + - byteToHex[arr[offset + 13]] + - byteToHex[arr[offset + 14]] + - byteToHex[arr[offset + 15]]).toLowerCase(); -} + if (type !== 'blob' && type !== 'arraybuffer') { + this[kBinaryType] = 'blob'; + } else { + this[kBinaryType] = type; + } + } -let getRandomValues; -const rnds8 = new Uint8Array(16); -function rng() { - if (!getRandomValues) { - if (typeof crypto === 'undefined' || !crypto.getRandomValues) { - throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); - } - getRandomValues = crypto.getRandomValues.bind(crypto); - } - return getRandomValues(rnds8); -} + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + */ + #onConnectionEstablished (response, parsedExtensions) { + // processResponse is called when the "response’s header list has been received and initialized." + // once this happens, the connection is open + this[kResponse] = response; -const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto); -var native = { randomUUID }; + const parser = new ByteParser(this, parsedExtensions); + parser.on('drain', onParserDrain); + parser.on('error', onParserError.bind(this)); -function _v4(options, buf, offset) { - options = options || {}; - const rnds = options.random ?? options.rng?.() ?? rng(); - if (rnds.length < 16) { - throw new Error('Random bytes length must be >= 16'); - } - rnds[6] = (rnds[6] & 0x0f) | 0x40; - rnds[8] = (rnds[8] & 0x3f) | 0x80; - return unsafeStringify(rnds); -} -function v4(options, buf, offset) { - if (native.randomUUID && true && !options) { - return native.randomUUID(); - } - return _v4(options); -} + response.socket.ws = this; + this[kByteParser] = parser; -async function downloadGraalVM(gdsToken, javaVersion) { - const userAgent = `GraalVMGitHubAction/${ACTION_VERSION} (arch:${GRAALVM_ARCH}; os:${GRAALVM_PLATFORM}; java:${javaVersion})`; - const baseArtifact = await fetchArtifact(userAgent, 'isBase:True', javaVersion); - return downloadArtifact(gdsToken, userAgent, baseArtifact); -} -async function downloadGraalVMEELegacy(gdsToken, version, javaVersion) { - const userAgent = `GraalVMGitHubAction/${ACTION_VERSION} (arch:${GRAALVM_ARCH}; os:${GRAALVM_PLATFORM}; java:${javaVersion})`; - const baseArtifact = await fetchArtifactEE(userAgent, 'isBase:True', version, javaVersion); - return downloadArtifact(gdsToken, userAgent, baseArtifact); -} -async function fetchArtifact(userAgent, metadata, javaVersion) { - const http = new libExports.HttpClient(userAgent); - let filter; - if (javaVersion.includes('.')) { - filter = `metadata=version:${javaVersion}`; - } - else { - filter = `sortBy=timeCreated&sortOrder=DESC&limit=1`; // latest and only one item - } - let majorJavaVersion; - if (semverExports.valid(javaVersion)) { - majorJavaVersion = semverExports.major(javaVersion); - } - else { - majorJavaVersion = javaVersion; - } - const catalogOS = IS_MACOS ? 'macos' : GRAALVM_PLATFORM; - const requestUrl = `${GDS_BASE}/artifacts?productId=${GDS_GRAALVM_PRODUCT_ID}&displayName=Oracle%20GraalVM&${filter}&metadata=java:jdk${majorJavaVersion}&metadata=os:${catalogOS}&metadata=arch:${GRAALVM_ARCH}&metadata=${metadata}&status=PUBLISHED&responseFields=id&responseFields=checksum`; - coreExports.debug(`Requesting ${requestUrl}`); - const response = await http.get(requestUrl, { accept: 'application/json' }); - if (response.message.statusCode !== 200) { - throw new Error(`Unable to find GraalVM for JDK ${javaVersion}. Are you sure java-version: '${javaVersion}' is correct?`); - } - const artifactResponse = JSON.parse(await response.readBody()); - if (artifactResponse.items.length !== 1) { - throw new Error(artifactResponse.items.length > 1 - ? `Found more than one GDS artifact. ${ERROR_HINT}` - : `Unable to find GDS artifact. Are you sure java-version: '${javaVersion}' is correct?`); - } - return artifactResponse.items[0]; -} -async function fetchArtifactEE(userAgent, metadata, version, javaVersion) { - const http = new libExports.HttpClient(userAgent); - let filter; - if (version === VERSION_LATEST) { - filter = `sortBy=displayName&sortOrder=DESC&limit=1`; // latest and only one item - } - else { - filter = `metadata=version:${version}`; - } - const catalogOS = IS_MACOS ? 'macos' : GRAALVM_PLATFORM; - const requestUrl = `${GDS_BASE}/artifacts?productId=${GDS_GRAALVM_PRODUCT_ID}&${filter}&metadata=java:jdk${javaVersion}&metadata=os:${catalogOS}&metadata=arch:${GRAALVM_ARCH}&metadata=${metadata}&status=PUBLISHED&responseFields=id&responseFields=checksum`; - coreExports.debug(`Requesting ${requestUrl}`); - const response = await http.get(requestUrl, { accept: 'application/json' }); - if (response.message.statusCode !== 200) { - throw new Error(`Unable to find JDK${javaVersion}-based GraalVM EE ${version}`); - } - const artifactResponse = JSON.parse(await response.readBody()); - if (artifactResponse.items.length !== 1) { - throw new Error(artifactResponse.items.length > 1 - ? `Found more than one GDS artifact. ${ERROR_HINT}` - : `Unable to find GDS artifact. Are you sure version: '${version}' is correct?`); - } - return artifactResponse.items[0]; -} -async function downloadArtifact(gdsToken, userAgent, artifact) { - let downloadPath; - try { - downloadPath = await downloadTool(`${GDS_BASE}/artifacts/${artifact.id}/content`, userAgent, { - accept: 'application/x-yaml', - 'x-download-token': gdsToken - }); - } - catch (err) { - if (err instanceof HTTPError && err.httpStatusCode) { - if (err.httpStatusCode === 401) { - throw new Error(`The provided "gds-token" was rejected (reason: "${err.gdsError.message}", opc-request-id: ${err.headers['opc-request-id']})`); - } - } - throw err; - } - const sha256 = calculateSHA256(downloadPath); - if (sha256.toLowerCase() !== artifact.checksum.toLowerCase()) { - throw new Error(`Checksum does not match (expected: "${artifact.checksum}", got: "${sha256}")`); - } - return downloadPath; -} -/** - * Simplified fork of tool-cache's downloadTool [1] with the ability to set a custom user agent. - * [1] https://github.com/actions/toolkit/blob/2f164000dcd42fb08287824a3bc3030dbed33687/packages/tool-cache/src/tool-cache.ts - */ -class HTTPError extends Error { - httpStatusCode; - gdsError; - headers; - constructor(httpStatusCode, gdsError, headers) { - super(`Unexpected HTTP response: ${httpStatusCode}`); - this.httpStatusCode = httpStatusCode; - this.gdsError = gdsError; - this.headers = headers; - Object.setPrototypeOf(this, new.target.prototype); - } -} -async function downloadTool(url, userAgent, headers) { - const dest = require$$1$1.join(getTempDirectory(), v4()); - await ioExports.mkdirP(require$$1$1.dirname(dest)); - coreExports.debug(`Downloading ${url}`); - coreExports.debug(`Destination ${dest}`); - const maxAttempts = 3; - const minSeconds = 10; - const maxSeconds = 20; - const retryHelper = new retryHelperExports.RetryHelper(maxAttempts, minSeconds, maxSeconds); - return await retryHelper.execute(async () => { - return await downloadToolAttempt(url, userAgent, dest || '', headers); - }, (err) => { - if (err instanceof HTTPError && err.httpStatusCode) { - // Don't retry anything less than 500, except 408 Request Timeout and 429 Too Many Requests - if (err.httpStatusCode < 500 && err.httpStatusCode !== 408 && err.httpStatusCode !== 429) { - return false; - } - } - // Otherwise retry - return true; - }); -} -async function downloadToolAttempt(url, userAgent, dest, headers) { - if (fs.existsSync(dest)) { - throw new Error(`Destination file path ${dest} already exists`); - } - // Get the response headers - const http = new libExports.HttpClient(userAgent, [], { - allowRetries: false - }); - const response = await http.get(url, headers); - if (response.message.statusCode !== 200) { - const errorResponse = JSON.parse(await response.readBody()); - const err = new HTTPError(response.message.statusCode, errorResponse, response.message.headers); - coreExports.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); - throw err; - } - // Download the response body - const pipeline = require$$0$3.promisify(require$$0$4.pipeline); - let succeeded = false; - try { - await pipeline(response.message, fs.createWriteStream(dest)); - coreExports.debug('Download complete'); - succeeded = true; - return dest; - } - finally { - // Error, delete dest before retry - if (!succeeded) { - coreExports.debug('Download failed'); - try { - await ioExports.rmRF(dest); - } - catch (err) { - coreExports.debug(`Failed to delete '${dest}'. ${err}`); - } - } - } -} -function getTempDirectory() { - const tempDirectory = process.env['RUNNER_TEMP'] || ''; - ok(tempDirectory, 'Expected RUNNER_TEMP to be defined'); - return tempDirectory; -} + this.#sendQueue = new SendQueue(response.socket); -const GRAALVM_DL_BASE = 'https://download.oracle.com/graalvm'; -const GRAALVM_CE_DL_BASE = `https://github.com/graalvm/${GRAALVM_RELEASES_REPO}/releases/download`; -const ORACLE_GRAALVM_REPO_EA_BUILDS = 'oracle-graalvm-ea-builds'; -const ORACLE_GRAALVM_REPO_EA_BUILDS_LATEST_SYMBOL = 'latest-ea'; -const GRAALVM_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'; -const GRAALVM_JDK_TAG_PREFIX = 'jdk-'; -const GRAALVM_TAG_PREFIX = 'vm-'; -// Support for GraalVM for JDK 17 and later -async function setUpGraalVMJDK(javaVersionOrDev, gdsToken) { - if (javaVersionOrDev === VERSION_DEV) { - return setUpGraalVMJDKDevBuild(); - } - const isTokenProvided = gdsToken.length > 0; - let javaVersion = javaVersionOrDev; - const toolName = determineToolName$2(javaVersion, false); - if (javaVersionOrDev === '17' && !isTokenProvided) { - coreExports.warning('This build uses the last update of Oracle GraalVM for JDK 17 under the GFTC. More details: https://github.com/marketplace/actions/github-action-for-graalvm#notes-on-oracle-graalvm-for-jdk-17'); - return setUpGraalVMJDK('17.0.12', gdsToken); - } - if (IS_MACOS && JDK_ARCH === 'x64') { - if (javaVersionOrDev === '25') { - coreExports.warning('This build uses Oracle GraalVM for JDK 25.0.1, the last available JDK 25 build for macOS Intel.'); - return setUpGraalVMJDK('25.0.1', gdsToken); - } - else if (javaVersionOrDev === '21') { - coreExports.warning('This build uses Oracle GraalVM for JDK 21.0.9, the last available JDK 21 build for macOS Intel.'); - return setUpGraalVMJDK('21.0.9', gdsToken); - } - else if (javaVersionOrDev === '17') { - coreExports.warning('This build uses Oracle GraalVM for JDK 17.0.17, the last available JDK 17 build for macOS Intel.'); - return setUpGraalVMJDK('17.0.17', gdsToken); - } - } - if (isTokenProvided) { - // Download from GDS - const downloader = async () => downloadGraalVM(gdsToken, javaVersion); - return downloadExtractAndCacheJDK(downloader, toolName, javaVersion); - } - // Download from oracle.com - let downloadName = toolName; - let downloadUrl; - if (javaVersion.endsWith('-ea')) { - downloadUrl = await findLatestEABuildDownloadUrl(javaVersion); - const filename = basename$1(downloadUrl); - const resolvedVersion = semverExports.valid(semverExports.coerce(filename)); - if (!resolvedVersion) { - throw new Error(`Unable to determine resolved version based on '${filename}'. ${ERROR_REQUEST}`); - } - javaVersion = resolvedVersion; - } - else if (javaVersion.includes('.')) { - if (semverExports.valid(javaVersion)) { - const majorJavaVersion = semverExports.major(javaVersion); - const minorJavaVersion = semverExports.minor(javaVersion); - const patchJavaVersion = semverExports.patch(javaVersion); - const isGARelease = minorJavaVersion === 0 && patchJavaVersion === 0; - if (isGARelease) { - // For GA versions of JDKs, /archive/ does not use minor and patch version (see https://www.oracle.com/java/technologies/jdk-script-friendly-urls/) - downloadName = determineToolName$2(majorJavaVersion.toString(), false); - } - downloadUrl = `${GRAALVM_DL_BASE}/${majorJavaVersion}/archive/${downloadName}${GRAALVM_FILE_EXTENSION}`; - } - else { - throw new Error(`java-version set to '${javaVersion}'. Please make sure the java-version is set correctly. ${ERROR_HINT}`); - } - } - else { - downloadUrl = `${GRAALVM_DL_BASE}/${javaVersion}/latest/${downloadName}${GRAALVM_FILE_EXTENSION}`; - } - const downloader = async () => downloadGraalVMJDK(downloadUrl, javaVersion); - return downloadExtractAndCacheJDK(downloader, toolName, javaVersion); -} -async function findLatestEABuildDownloadUrl(javaEaVersion) { - const filePath = `versions/${javaEaVersion}.json`; - let response; - try { - response = await getContents(ORACLE_GRAALVM_REPO_EA_BUILDS, filePath); - } - catch (error) { - throw new Error(`Unable to resolve download URL for '${javaEaVersion}' (reason: ${error}). Please make sure the java-version is set correctly. ${ERROR_HINT}`); - } - if (Array.isArray(response) || response.type !== 'file' || !response.content) { - throw new Error(`Unexpected response when resolving download URL for '${javaEaVersion}'. ${ERROR_REQUEST}`); - } - const versionData = JSON.parse(Buffer.from(response.content, 'base64').toString('utf-8')); - let latestVersion; - if (javaEaVersion === ORACLE_GRAALVM_REPO_EA_BUILDS_LATEST_SYMBOL) { - latestVersion = versionData; - } - else { - latestVersion = versionData.find((v) => v.latest); - if (!latestVersion) { - throw new Error(`Unable to find latest version for '${javaEaVersion}'. ${ERROR_REQUEST}`); - } - } - const file = latestVersion.files.find((f) => f.arch === JDK_ARCH && f.platform === GRAALVM_PLATFORM); - if (!file || !file.filename.startsWith('graalvm-jdk-')) { - throw new Error(`Unable to find file metadata for '${javaEaVersion}'. ${ERROR_REQUEST}`); - } - return `${latestVersion.download_base_url}${file.filename}`; -} -async function setUpGraalVMJDKCE(javaVersionOrDev) { - if (javaVersionOrDev === VERSION_DEV) { - return setUpGraalVMJDKDevBuild(); - } - if (IS_MACOS && JDK_ARCH === 'x64' && javaVersionOrDev === '25') { - coreExports.warning('This build uses GraalVM CE for JDK 25.0.1, the last available JDK 25 build for macOS Intel.'); - return setUpGraalVMJDKCE('25.0.1'); - } - let javaVersion = javaVersionOrDev; - if (!javaVersion.includes('.')) { - javaVersion = await findLatestGraalVMJDKCEJavaVersion(javaVersion); - } - if (javaVersion.split('.').length != 3) { - throw new Error(`java-version set to '${javaVersionOrDev}', which was resolved to '${javaVersion}'. Please make sure the java-version is set correctly. ${ERROR_HINT}`); - } - const toolName = determineToolName$2(javaVersion, true); - const downloadUrl = `${GRAALVM_CE_DL_BASE}/jdk-${javaVersion}/${toolName}${GRAALVM_FILE_EXTENSION}`; - const downloader = async () => downloadGraalVMJDK(downloadUrl, javaVersion); - return downloadExtractAndCacheJDK(downloader, toolName, javaVersion); -} -async function findLatestGraalVMJDKCEJavaVersion(majorJavaVersion) { - const matchingRefs = await getMatchingTags(GRAALVM_GH_USER, GRAALVM_RELEASES_REPO, `${GRAALVM_JDK_TAG_PREFIX}${majorJavaVersion}`); - const lowestNonExistingVersion = '0.0.1'; - let highestVersion = lowestNonExistingVersion; - const versionNumberStartIndex = `refs/tags/${GRAALVM_JDK_TAG_PREFIX}`.length; - for (const matchingRef of matchingRefs) { - const currentVersion = matchingRef.ref.substring(versionNumberStartIndex); - if (semverExports.valid(currentVersion) && semverExports.gt(currentVersion, highestVersion)) { - highestVersion = currentVersion; - } - } - if (highestVersion === lowestNonExistingVersion) { - throw new Error(`Unable to find the latest Java version for '${majorJavaVersion}'. Please make sure the java-version is set correctly. ${ERROR_HINT}`); - } - return highestVersion; -} -function determineToolName$2(javaVersion, isCommunity) { - return `graalvm${isCommunity ? '-community' : ''}-jdk-${javaVersion}_${JDK_PLATFORM}-${JDK_ARCH}_bin`; -} -async function downloadGraalVMJDK(downloadUrl, javaVersion) { - try { - return await downloadFile(downloadUrl); - } - catch (error) { - if (error instanceof Error && error.message.includes('404')) { - // Not Found - throw new Error(`Failed to download ${basename$1(downloadUrl)}. Are you sure java-version: '${javaVersion}' is correct?`); - } - throw new Error(`Failed to download ${basename$1(downloadUrl)} (error: ${error}).`); - } -} -// Support for GraalVM dev builds -async function setUpGraalVMJDKDevBuild() { - const latestDevBuild = await getLatestRelease(GRAALVM_REPO_DEV_BUILDS); - const resolvedJavaVersion = findHighestJavaVersion(latestDevBuild, VERSION_DEV); - const downloadUrl = findDownloadUrl(latestDevBuild, resolvedJavaVersion); - return downloadAndExtractJDK(downloadUrl); -} -function findHighestJavaVersion(release, version) { - const graalVMIdentifierPattern = determineGraalVMLegacyIdentifier(false, version, '(\\d+)'); - const expectedFileNameRegExp = new RegExp(`^${graalVMIdentifierPattern}${GRAALVM_FILE_EXTENSION.replace(/\./g, '\\.')}$`); - let highestJavaVersion = 0; - for (const asset of release.assets) { - const matches = asset.name.match(expectedFileNameRegExp); - if (matches) { - const javaVersion = +matches[1]; - if (javaVersion > highestJavaVersion) { - highestJavaVersion = javaVersion; - } - } - } - if (highestJavaVersion > 0) { - return String(highestJavaVersion); - } - else { - return undefined; - } -} -// Support for GraalVM 22.X releases and earlier -async function setUpGraalVMLatest_22_X(gdsToken, javaVersion) { - const lockedVersion = javaVersion === '19' ? '22.3.1' : '22.3.3'; - if (gdsToken.length > 0) { - return setUpGraalVMRelease(gdsToken, lockedVersion, javaVersion); - } - const latestRelease = await getTaggedRelease(GRAALVM_GH_USER, GRAALVM_RELEASES_REPO, GRAALVM_TAG_PREFIX + lockedVersion); - const version = findGraalVMVersion(latestRelease); - return setUpGraalVMRelease(gdsToken, version, javaVersion); -} -function findGraalVMVersion(release) { - const tag_name = release.tag_name; - if (!tag_name.startsWith(GRAALVM_TAG_PREFIX)) { - throw new Error(`Could not find latest GraalVM release: ${tag_name}`); - } - return tag_name.substring(GRAALVM_TAG_PREFIX.length, tag_name.length); -} -async function setUpGraalVMRelease(gdsToken, version, javaVersion) { - const isEE = gdsToken.length > 0; - const toolName = determineLegacyToolName(isEE, version, javaVersion); - let downloader; - if (isEE) { - downloader = async () => downloadGraalVMEELegacy(gdsToken, version, javaVersion); - } - else { - downloader = async () => downloadGraalVMCELegacy(version, javaVersion); - } - return downloadExtractAndCacheJDK(downloader, toolName, version); -} -function findDownloadUrl(release, javaVersion) { - const graalVMIdentifier = javaVersion - ? determineGraalVMLegacyIdentifier(false, VERSION_DEV, javaVersion) - : determineGraalVMIdentifier(false, VERSION_DEV); - const expectedFileName = `${graalVMIdentifier}${GRAALVM_FILE_EXTENSION}`; - for (const asset of release.assets) { - if (asset.name === expectedFileName) { - return asset.browser_download_url; - } - } - throw new Error(`Could not find GraalVM dev build for Java ${javaVersion}. It may no longer be available, so please consider upgrading the Java version. ${ERROR_HINT}`); -} -function determineGraalVMIdentifier(isEE, version) { - const infix = 'community' ; - return `graalvm-${infix}-${version}-${GRAALVM_PLATFORM}-${GRAALVM_ARCH}`; -} -function determineGraalVMLegacyIdentifier(isEE, version, javaVersion) { - return `${determineLegacyToolName(isEE, version, javaVersion)}-${GRAALVM_ARCH}-${version}`; -} -function determineLegacyToolName(isEE, version, javaVersion) { - const infix = isEE ? 'ee' : version === VERSION_DEV ? 'community' : 'ce'; - return `graalvm-${infix}-java${javaVersion}-${GRAALVM_PLATFORM}`; -} -async function downloadGraalVMCELegacy(version, javaVersion) { - const graalVMIdentifier = determineGraalVMLegacyIdentifier(false, version, javaVersion); - const downloadUrl = `${GRAALVM_CE_DL_BASE}/${GRAALVM_TAG_PREFIX}${version}/${graalVMIdentifier}${GRAALVM_FILE_EXTENSION}`; - try { - return await downloadFile(downloadUrl); - } - catch (error) { - if (error instanceof Error && error.message.includes('404')) { - // Not Found - throw new Error(`Failed to download ${graalVMIdentifier}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?`); - } - throw new Error(`Failed to download ${graalVMIdentifier} (error: ${error}).`); - } -} + // 1. Change the ready state to OPEN (1). + this[kReadyState] = states.OPEN; -var cache$2 = {}; + // 2. Change the extensions attribute’s value to the extensions in use, if + // it is not the null value. + // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 + const extensions = response.headersList.get('sec-websocket-extensions'); -var cacheUtils = {}; + if (extensions !== null) { + this.#extensions = extensions; + } + + // 3. Change the protocol attribute’s value to the subprotocol in use, if + // it is not the null value. + // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9 + const protocol = response.headersList.get('sec-websocket-protocol'); + + if (protocol !== null) { + this.#protocol = protocol; + } + + // 4. Fire an event named open at the WebSocket object. + fireEvent('open', this); + } + } + + // https://websockets.spec.whatwg.org/#dom-websocket-connecting + WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; + // https://websockets.spec.whatwg.org/#dom-websocket-open + WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; + // https://websockets.spec.whatwg.org/#dom-websocket-closing + WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; + // https://websockets.spec.whatwg.org/#dom-websocket-closed + WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; + + Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'WebSocket', + writable: false, + enumerable: false, + configurable: true + } + }); + + Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors + }); -var glob = {}; + webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.DOMString + ); -var internalGlobber = {}; + webidl.converters['DOMString or sequence'] = function (V, prefix, argument) { + if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { + return webidl.converters['sequence'](V) + } -var core = {}; + return webidl.converters.DOMString(V, prefix, argument) + }; -var command = {}; + // This implements the proposal made in https://github.com/whatwg/websockets/issues/42 + webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: 'protocols', + converter: webidl.converters['DOMString or sequence'], + defaultValue: () => new Array(0) + }, + { + key: 'dispatcher', + converter: webidl.converters.any, + defaultValue: () => getGlobalDispatcher() + }, + { + key: 'headers', + converter: webidl.nullableConverter(webidl.converters.HeadersInit) + } + ]); -var utils$2 = {}; + webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) { + if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V) + } -var hasRequiredUtils$2; + return { protocols: webidl.converters['DOMString or sequence'](V) } + }; -function requireUtils$2 () { - if (hasRequiredUtils$2) return utils$2; - hasRequiredUtils$2 = 1; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - Object.defineProperty(utils$2, "__esModule", { value: true }); - utils$2.toCommandProperties = utils$2.toCommandValue = void 0; - /** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ - function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; + webidl.converters.WebSocketSendData = function (V) { + if (webidl.util.Type(V) === 'Object') { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) } - else if (typeof input === 'string' || input instanceof String) { - return input; + + if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { + return webidl.converters.BufferSource(V) } - return JSON.stringify(input); + } + + return webidl.converters.USVString(V) + }; + + function onParserDrain () { + this.ws[kResponse].socket.resume(); } - utils$2.toCommandValue = toCommandValue; - /** - * - * @param annotationProperties - * @returns The command properties to send with the actual annotation command - * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 - */ - function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; - } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn - }; + + function onParserError (err) { + let message; + let code; + + if (err instanceof CloseEvent) { + message = err.reason; + code = err.code; + } else { + message = err.message; + } + + fireEvent('error', this, () => new ErrorEvent('error', { error: err, message })); + + closeWebSocketConnection(this, code); } - utils$2.toCommandProperties = toCommandProperties; - - return utils$2; + + websocket = { + WebSocket + }; + return websocket; } -var hasRequiredCommand; +var util$2; +var hasRequiredUtil$2; + +function requireUtil$2 () { + if (hasRequiredUtil$2) return util$2; + hasRequiredUtil$2 = 1; -function requireCommand () { - if (hasRequiredCommand) return command; - hasRequiredCommand = 1; - var __createBinding = (command && command.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (command && command.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (command && command.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(command, "__esModule", { value: true }); - command.issue = command.issueCommand = void 0; - const os = __importStar(require$$0$5); - const utils_1 = requireUtils$2(); /** - * Commands - * - * Command Format: - * ::name key=value,key=value::message - * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value + * Checks if the given value is a valid LastEventId. + * @param {string} value + * @returns {boolean} */ - function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); - } - command.issueCommand = issueCommand; - function issue(name, message = '') { - issueCommand(name, {}, message); - } - command.issue = issue; - const CMD_STRING = '::'; - class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } + function isValidLastEventId (value) { + // LastEventId should not contain U+0000 NULL + return value.indexOf('\u0000') === -1 } - function escapeData(s) { - return (0, utils_1.toCommandValue)(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); + + /** + * Checks if the given value is a base 10 digit. + * @param {string} value + * @returns {boolean} + */ + function isASCIINumber (value) { + if (value.length === 0) return false + for (let i = 0; i < value.length; i++) { + if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false + } + return true } - function escapeProperty(s) { - return (0, utils_1.toCommandValue)(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); + + // https://github.com/nodejs/undici/issues/2664 + function delay (ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms).unref(); + }) } - - return command; + + util$2 = { + isValidLastEventId, + isASCIINumber, + delay + }; + return util$2; } -var fileCommand = {}; +var eventsourceStream; +var hasRequiredEventsourceStream; -var hasRequiredFileCommand; +function requireEventsourceStream () { + if (hasRequiredEventsourceStream) return eventsourceStream; + hasRequiredEventsourceStream = 1; + const { Transform } = require$$0$8; + const { isASCIINumber, isValidLastEventId } = requireUtil$2(); -function requireFileCommand () { - if (hasRequiredFileCommand) return fileCommand; - hasRequiredFileCommand = 1; - // For internal use, subject to change. - var __createBinding = (fileCommand && fileCommand.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (fileCommand && fileCommand.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (fileCommand && fileCommand.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(fileCommand, "__esModule", { value: true }); - fileCommand.prepareKeyValueMessage = fileCommand.issueFileCommand = void 0; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - const crypto = __importStar(require$$0$6); - const fs = __importStar(fs__default); - const os = __importStar(require$$0$5); - const utils_1 = requireUtils$2(); - function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { - encoding: 'utf8' - }); - } - fileCommand.issueFileCommand = issueFileCommand; - function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${crypto.randomUUID()}`; - const convertedValue = (0, utils_1.toCommandValue)(value); - // These should realistically never happen, but just in case someone finds a - // way to exploit uuid generation let's not allow keys or values that contain - // the delimiter. - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); - } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); - } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; - } - fileCommand.prepareKeyValueMessage = prepareKeyValueMessage; - - return fileCommand; -} + /** + * @type {number[]} BOM + */ + const BOM = [0xEF, 0xBB, 0xBF]; + /** + * @type {10} LF + */ + const LF = 0x0A; + /** + * @type {13} CR + */ + const CR = 0x0D; + /** + * @type {58} COLON + */ + const COLON = 0x3A; + /** + * @type {32} SPACE + */ + const SPACE = 0x20; -var oidcUtils = {}; + /** + * @typedef {object} EventSourceStreamEvent + * @type {object} + * @property {string} [event] The event type. + * @property {string} [data] The data of the message. + * @property {string} [id] A unique ID for the event. + * @property {string} [retry] The reconnection time, in milliseconds. + */ -var lib = {}; + /** + * @typedef eventSourceSettings + * @type {object} + * @property {string} lastEventId The last event ID received from the server. + * @property {string} origin The origin of the event source. + * @property {number} reconnectionTime The reconnection time, in milliseconds. + */ -var proxy = {}; + class EventSourceStream extends Transform { + /** + * @type {eventSourceSettings} + */ + state = null -var hasRequiredProxy; + /** + * Leading byte-order-mark check. + * @type {boolean} + */ + checkBOM = true -function requireProxy () { - if (hasRequiredProxy) return proxy; - hasRequiredProxy = 1; - Object.defineProperty(proxy, "__esModule", { value: true }); - proxy.checkBypass = proxy.getProxyUrl = void 0; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - try { - return new DecodedURL(proxyVar); - } - catch (_a) { - if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://')) - return new DecodedURL(`http://${proxyVar}`); - } - } - else { - return undefined; - } - } - proxy.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperNoProxyItem === '*' || - upperReqHosts.some(x => x === upperNoProxyItem || - x.endsWith(`.${upperNoProxyItem}`) || - (upperNoProxyItem.startsWith('.') && - x.endsWith(`${upperNoProxyItem}`)))) { - return true; - } - } - return false; - } - proxy.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return (hostLower === 'localhost' || - hostLower.startsWith('127.') || - hostLower.startsWith('[::1]') || - hostLower.startsWith('[0:0:0:0:0:0:0:1]')); - } - class DecodedURL extends URL { - constructor(url, base) { - super(url, base); - this._decodedUsername = decodeURIComponent(super.username); - this._decodedPassword = decodeURIComponent(super.password); - } - get username() { - return this._decodedUsername; - } - get password() { - return this._decodedPassword; - } - } - - return proxy; -} + /** + * @type {boolean} + */ + crlfCheck = false -var hasRequiredLib; + /** + * @type {boolean} + */ + eventEndCheck = false -function requireLib () { - if (hasRequiredLib) return lib; - hasRequiredLib = 1; - /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (lib && lib.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (lib && lib.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (lib && lib.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (lib && lib.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(lib, "__esModule", { value: true }); - lib.HttpClient = lib.isHttps = lib.HttpClientResponse = lib.HttpClientError = lib.getProxyUrl = lib.MediaTypes = lib.Headers = lib.HttpCodes = void 0; - const http = __importStar(require$$0$7); - const https = __importStar(require$$1$2); - const pm = __importStar(requireProxy()); - const tunnel = __importStar(requireTunnel()); - const undici_1 = requireUndici(); - var HttpCodes; - (function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (lib.HttpCodes = HttpCodes = {})); - var Headers; - (function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; - })(Headers || (lib.Headers = Headers = {})); - var MediaTypes; - (function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (lib.MediaTypes = MediaTypes = {})); - /** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; - } - lib.getProxyUrl = getProxyUrl; - const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); + /** + * @type {Buffer} + */ + buffer = null + + pos = 0 + + event = { + data: undefined, + event: undefined, + id: undefined, + retry: undefined + } + + /** + * @param {object} options + * @param {eventSourceSettings} options.eventSourceSettings + * @param {Function} [options.push] + */ + constructor (options = {}) { + // Enable object mode as EventSourceStream emits objects of shape + // EventSourceStreamEvent + options.readableObjectMode = true; + + super(options); + + this.state = options.eventSourceSettings || {}; + if (options.push) { + this.push = options.push; } - } - lib.HttpClientError = HttpClientError; - class HttpClientResponse { - constructor(message) { - this.message = message; + } + + /** + * @param {Buffer} chunk + * @param {string} _encoding + * @param {Function} callback + * @returns {void} + */ + _transform (chunk, _encoding, callback) { + if (chunk.length === 0) { + callback(); + return } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); + + // Cache the chunk in the buffer, as the data might not be complete while + // processing it + // TODO: Investigate if there is a more performant way to handle + // incoming chunks + // see: https://github.com/nodejs/undici/issues/2630 + if (this.buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.buffer = chunk; } - readBodyBuffer() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - this.message.on('data', (chunk) => { - chunks.push(chunk); - }); - this.message.on('end', () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); + + // Strip leading byte-order-mark if we opened the stream and started + // the processing of the incoming data + if (this.checkBOM) { + switch (this.buffer.length) { + case 1: + // Check if the first byte is the same as the first byte of the BOM + if (this.buffer[0] === BOM[0]) { + // If it is, we need to wait for more data + callback(); + return + } + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + + // The buffer only contains one byte so we need to wait for more data + callback(); + return + case 2: + // Check if the first two bytes are the same as the first two bytes + // of the BOM + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] + ) { + // If it is, we need to wait for more data, because the third byte + // is needed to determine if it is the BOM or not + callback(); + return + } + + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + break + case 3: + // Check if the first three bytes are the same as the first three + // bytes of the BOM + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] && + this.buffer[2] === BOM[2] + ) { + // If it is, we can drop the buffered data, as it is only the BOM + this.buffer = Buffer.alloc(0); + // Set the checkBOM flag to false as we don't need to check for the + // BOM anymore + this.checkBOM = false; + + // Await more data + callback(); + return + } + // If it is not the BOM, we can start processing the data + this.checkBOM = false; + break + default: + // The buffer is longer than 3 bytes, so we can drop the BOM if it is + // present + if ( + this.buffer[0] === BOM[0] && + this.buffer[1] === BOM[1] && + this.buffer[2] === BOM[2] + ) { + // Remove the BOM from the buffer + this.buffer = this.buffer.subarray(3); + } + + // Set the checkBOM flag to false as we don't need to check for the + this.checkBOM = false; + break + } } - } - lib.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; - } - lib.isHttps = isHttps; - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } + + while (this.pos < this.buffer.length) { + // If the previous line ended with an end-of-line, we need to check + // if the next character is also an end-of-line. + if (this.eventEndCheck) { + // If the the current character is an end-of-line, then the event + // is finished and we can process it + + // If the previous line ended with a carriage return, we need to + // check if the current character is a line feed and remove it + // from the buffer. + if (this.crlfCheck) { + // If the current character is a line feed, we can remove it + // from the buffer and reset the crlfCheck flag + if (this.buffer[this.pos] === LF) { + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + this.crlfCheck = false; + + // It is possible that the line feed is not the end of the + // event. We need to check if the next character is an + // end-of-line character to determine if the event is + // finished. We simply continue the loop to check the next + // character. + + // As we removed the line feed from the buffer and set the + // crlfCheck flag to false, we basically don't make any + // distinction between a line feed and a carriage return. + continue + } + this.crlfCheck = false; + } + + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + // If the current character is a carriage return, we need to + // set the crlfCheck flag to true, as we need to check if the + // next character is a line feed so we can remove it from the + // buffer + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + + this.buffer = this.buffer.subarray(this.pos + 1); + this.pos = 0; + if ( + this.event.data !== undefined || this.event.event || this.event.id || this.event.retry) { + this.processEvent(this.event); + } + this.clearEvent(); + continue } + // If the current character is not an end-of-line, then the event + // is not finished and we have to reset the eventEndCheck flag + this.eventEndCheck = false; + continue + } + + // If the current character is an end-of-line, we can process the + // line + if (this.buffer[this.pos] === LF || this.buffer[this.pos] === CR) { + // If the current character is a carriage return, we need to + // set the crlfCheck flag to true, as we need to check if the + // next character is a line feed + if (this.buffer[this.pos] === CR) { + this.crlfCheck = true; + } + + // In any case, we can process the line as we reached an + // end-of-line character + this.parseLine(this.buffer.subarray(0, this.pos), this.event); + + // Remove the processed line from the buffer + this.buffer = this.buffer.subarray(this.pos + 1); + // Reset the position as we removed the processed line from the buffer + this.pos = 0; + // A line was processed and this could be the end of the event. We need + // to check if the next line is empty to determine if the event is + // finished. + this.eventEndCheck = true; + continue + } + + this.pos++; } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); + + callback(); + } + + /** + * @param {Buffer} line + * @param {EventStreamEvent} event + */ + parseLine (line, event) { + // If the line is empty (a blank line) + // Dispatch the event, as defined below. + // This will be handled in the _transform method + if (line.length === 0) { + return } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); + + // If the line starts with a U+003A COLON character (:) + // Ignore the line. + const colonPosition = line.indexOf(COLON); + if (colonPosition === 0) { + return } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); + + let field = ''; + let value = ''; + + // If the line contains a U+003A COLON character (:) + if (colonPosition !== -1) { + // Collect the characters on the line before the first U+003A COLON + // character (:), and let field be that string. + // TODO: Investigate if there is a more performant way to extract the + // field + // see: https://github.com/nodejs/undici/issues/2630 + field = line.subarray(0, colonPosition).toString('utf8'); + + // Collect the characters on the line after the first U+003A COLON + // character (:), and let value be that string. + // If value starts with a U+0020 SPACE character, remove it from value. + let valueStart = colonPosition + 1; + if (line[valueStart] === SPACE) { + ++valueStart; + } + // TODO: Investigate if there is a more performant way to extract the + // value + // see: https://github.com/nodejs/undici/issues/2630 + value = line.subarray(valueStart).toString('utf8'); + + // Otherwise, the string is not empty but does not contain a U+003A COLON + // character (:) + } else { + // Process the field using the steps described below, using the whole + // line as the field name, and the empty string as the field value. + field = line.toString('utf8'); + value = ''; + } + + // Modify the event with the field name and value. The value is also + // decoded as UTF-8 + switch (field) { + case 'data': + if (event[field] === undefined) { + event[field] = value; + } else { + event[field] += `\n${value}`; + } + break + case 'retry': + if (isASCIINumber(value)) { + event[field] = value; + } + break + case 'id': + if (isValidLastEventId(value)) { + event[field] = value; + } + break + case 'event': + if (value.length > 0) { + event[field] = value; + } + break } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); + } + + /** + * @param {EventSourceStreamEvent} event + */ + processEvent (event) { + if (event.retry && isASCIINumber(event.retry)) { + this.state.reconnectionTime = parseInt(event.retry, 10); } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); + + if (event.id && isValidLastEventId(event.id)) { + this.state.lastEventId = event.id; } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); + + // only dispatch event, when data is provided + if (event.data !== undefined) { + this.push({ + type: event.event || 'message', + options: { + data: event.data, + lastEventId: this.state.lastEventId, + origin: this.state.origin + } + }); } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); + } + + clearEvent () { + this.event = { + data: undefined, + event: undefined, + id: undefined, + retry: undefined + }; + } + } + + eventsourceStream = { + EventSourceStream + }; + return eventsourceStream; +} + +var eventsource; +var hasRequiredEventsource; + +function requireEventsource () { + if (hasRequiredEventsource) return eventsource; + hasRequiredEventsource = 1; + + const { pipeline } = require$$0$8; + const { fetching } = requireFetch(); + const { makeRequest } = requireRequest(); + const { webidl } = requireWebidl(); + const { EventSourceStream } = requireEventsourceStream(); + const { parseMIMEType } = requireDataUrl(); + const { createFastMessageEvent } = requireEvents(); + const { isNetworkError } = requireResponse$1(); + const { delay } = requireUtil$2(); + const { kEnumerableProperty } = requireUtil$9(); + const { environmentSettingsObject } = requireUtil$8(); + + let experimentalWarned = false; + + /** + * A reconnection time, in milliseconds. This must initially be an implementation-defined value, + * probably in the region of a few seconds. + * + * In Comparison: + * - Chrome uses 3000ms. + * - Deno uses 5000ms. + * + * @type {3000} + */ + const defaultReconnectionTime = 3000; + + /** + * The readyState attribute represents the state of the connection. + * @enum + * @readonly + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev + */ + + /** + * The connection has not yet been established, or it was closed and the user + * agent is reconnecting. + * @type {0} + */ + const CONNECTING = 0; + + /** + * The user agent has an open connection and is dispatching events as it + * receives them. + * @type {1} + */ + const OPEN = 1; + + /** + * The connection is not open, and the user agent is not trying to reconnect. + * @type {2} + */ + const CLOSED = 2; + + /** + * Requests for the element will have their mode set to "cors" and their credentials mode set to "same-origin". + * @type {'anonymous'} + */ + const ANONYMOUS = 'anonymous'; + + /** + * Requests for the element will have their mode set to "cors" and their credentials mode set to "include". + * @type {'use-credentials'} + */ + const USE_CREDENTIALS = 'use-credentials'; + + /** + * The EventSource interface is used to receive server-sent events. It + * connects to a server over HTTP and receives events in text/event-stream + * format without closing the connection. + * @extends {EventTarget} + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events + * @api public + */ + class EventSource extends EventTarget { + #events = { + open: null, + error: null, + message: null + } + + #url = null + #withCredentials = false + + #readyState = CONNECTING + + #request = null + #controller = null + + #dispatcher + + /** + * @type {import('./eventsource-stream').eventSourceSettings} + */ + #state + + /** + * Creates a new EventSource object. + * @param {string} url + * @param {EventSourceInit} [eventSourceInitDict] + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface + */ + constructor (url, eventSourceInitDict = {}) { + // 1. Let ev be a new EventSource object. + super(); + + webidl.util.markAsUncloneable(this); + + const prefix = 'EventSource constructor'; + webidl.argumentLengthCheck(arguments, 1, prefix); + + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning('EventSource is experimental, expect them to change at any time.', { + code: 'UNDICI-ES' + }); } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); + + url = webidl.converters.USVString(url, prefix, 'url'); + eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict'); + + this.#dispatcher = eventSourceInitDict.dispatcher; + this.#state = { + lastEventId: '', + reconnectionTime: defaultReconnectionTime + }; + + // 2. Let settings be ev's relevant settings object. + // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object + const settings = environmentSettingsObject; + + let urlRecord; + + try { + // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings. + urlRecord = new URL(url, settings.settingsObject.baseUrl); + this.#state.origin = urlRecord.origin; + } catch (e) { + // 4. If urlRecord is failure, then throw a "SyntaxError" DOMException. + throw new DOMException(e, 'SyntaxError') } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + + // 5. Set ev's url to urlRecord. + this.#url = urlRecord.href; + + // 6. Let corsAttributeState be Anonymous. + let corsAttributeState = ANONYMOUS; + + // 7. If the value of eventSourceInitDict's withCredentials member is true, + // then set corsAttributeState to Use Credentials and set ev's + // withCredentials attribute to true. + if (eventSourceInitDict.withCredentials) { + corsAttributeState = USE_CREDENTIALS; + this.#withCredentials = true; } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); + + // 8. Let request be the result of creating a potential-CORS request given + // urlRecord, the empty string, and corsAttributeState. + const initRequest = { + redirect: 'follow', + keepalive: true, + // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes + mode: 'cors', + credentials: corsAttributeState === 'anonymous' + ? 'same-origin' + : 'omit', + referrer: 'no-referrer' + }; + + // 9. Set request's client to settings. + initRequest.client = environmentSettingsObject.settingsObject; + + // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list. + initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]; + + // 11. Set request's cache mode to "no-store". + initRequest.cache = 'no-store'; + + // 12. Set request's initiator type to "other". + initRequest.initiator = 'other'; + + initRequest.urlList = [new URL(this.#url)]; + + // 13. Set ev's request to request. + this.#request = makeRequest(initRequest); + + this.#connect(); + } + + /** + * Returns the state of this EventSource object's connection. It can have the + * values described below. + * @returns {0|1|2} + * @readonly + */ + get readyState () { + return this.#readyState + } + + /** + * Returns the URL providing the event stream. + * @readonly + * @returns {string} + */ + get url () { + return this.#url + } + + /** + * Returns a boolean indicating whether the EventSource object was + * instantiated with CORS credentials set (true), or not (false, the default). + */ + get withCredentials () { + return this.#withCredentials + } + + #connect () { + if (this.#readyState === CLOSED) return + + this.#readyState = CONNECTING; + + const fetchParams = { + request: this.#request, + dispatcher: this.#dispatcher + }; + + // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection. + const processEventSourceEndOfBody = (response) => { + if (isNetworkError(response)) { + this.dispatchEvent(new Event('error')); + this.close(); + } + + this.#reconnect(); + }; + + // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody... + fetchParams.processResponseEndOfBody = processEventSourceEndOfBody; + + // and processResponse set to the following steps given response res: + fetchParams.processResponse = (response) => { + // 1. If res is an aborted network error, then fail the connection. + + if (isNetworkError(response)) { + // 1. When a user agent is to fail the connection, the user agent + // must queue a task which, if the readyState attribute is set to a + // value other than CLOSED, sets the readyState attribute to CLOSED + // and fires an event named error at the EventSource object. Once the + // user agent has failed the connection, it does not attempt to + // reconnect. + if (response.aborted) { + this.close(); + this.dispatchEvent(new Event('error')); + return + // 2. Otherwise, if res is a network error, then reestablish the + // connection, unless the user agent knows that to be futile, in + // which case the user agent may fail the connection. + } else { + this.#reconnect(); + return + } + } + + // 3. Otherwise, if res's status is not 200, or if res's `Content-Type` + // is not `text/event-stream`, then fail the connection. + const contentType = response.headersList.get('content-type', true); + const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'; + const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'; + if ( + response.status !== 200 || + contentTypeValid === false + ) { + this.close(); + this.dispatchEvent(new Event('error')); + return + } + + // 4. Otherwise, announce the connection and interpret res's body + // line by line. + + // When a user agent is to announce the connection, the user agent + // must queue a task which, if the readyState attribute is set to a + // value other than CLOSED, sets the readyState attribute to OPEN + // and fires an event named open at the EventSource object. + // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + this.#readyState = OPEN; + this.dispatchEvent(new Event('open')); + + // If redirected to a different origin, set the origin to the new origin. + this.#state.origin = response.urlList[response.urlList.length - 1].origin; + + const eventSourceStream = new EventSourceStream({ + eventSourceSettings: this.#state, + push: (event) => { + this.dispatchEvent(createFastMessageEvent( + event.type, + event.options + )); + } + }); + + pipeline(response.body.stream, + eventSourceStream, + (error) => { + if ( + error?.aborted === false + ) { + this.close(); + this.dispatchEvent(new Event('error')); + } }); + }; + + this.#controller = fetching(fetchParams); + } + + /** + * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model + * @returns {Promise} + */ + async #reconnect () { + // When a user agent is to reestablish the connection, the user agent must + // run the following steps. These steps are run in parallel, not as part of + // a task. (The tasks that it queues, of course, are run like normal tasks + // and not themselves in parallel.) + + // 1. Queue a task to run the following steps: + + // 1. If the readyState attribute is set to CLOSED, abort the task. + if (this.#readyState === CLOSED) return + + // 2. Set the readyState attribute to CONNECTING. + this.#readyState = CONNECTING; + + // 3. Fire an event named error at the EventSource object. + this.dispatchEvent(new Event('error')); + + // 2. Wait a delay equal to the reconnection time of the event source. + await delay(this.#state.reconnectionTime); + + // 5. Queue a task to run the following steps: + + // 1. If the EventSource object's readyState attribute is not set to + // CONNECTING, then return. + if (this.#readyState !== CONNECTING) return + + // 2. Let request be the EventSource object's request. + // 3. If the EventSource object's last event ID string is not the empty + // string, then: + // 1. Let lastEventIDValue be the EventSource object's last event ID + // string, encoded as UTF-8. + // 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header + // list. + if (this.#state.lastEventId.length) { + this.#request.headersList.set('last-event-id', this.#state.lastEventId, true); } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + + // 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section. + this.#connect(); + } + + /** + * Closes the connection, if any, and sets the readyState attribute to + * CLOSED. + */ + close () { + webidl.brandCheck(this, EventSource); + + if (this.#readyState === CLOSED) return + this.#readyState = CLOSED; + this.#controller.abort(); + this.#request = null; + } + + get onopen () { + return this.#events.open + } + + set onopen (fn) { + if (this.#events.open) { + this.removeEventListener('open', this.#events.open); } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); + + if (typeof fn === 'function') { + this.#events.open = fn; + this.addEventListener('open', fn); + } else { + this.#events.open = null; } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); + } + + get onmessage () { + return this.#events.message + } + + set onmessage (fn) { + if (this.#events.message) { + this.removeEventListener('message', this.#events.message); } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; + + if (typeof fn === 'function') { + this.#events.message = fn; + this.addEventListener('message', fn); + } else { + this.#events.message = null; } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); + } + + get onerror () { + return this.#events.error + } + + set onerror (fn) { + if (this.#events.error) { + this.removeEventListener('error', this.#events.error); } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } + + if (typeof fn === 'function') { + this.#events.error = fn; + this.addEventListener('error', fn); + } else { + this.#events.error = null; } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); + } + } + + const constantsPropertyDescriptors = { + CONNECTING: { + __proto__: null, + configurable: false, + enumerable: true, + value: CONNECTING, + writable: false + }, + OPEN: { + __proto__: null, + configurable: false, + enumerable: true, + value: OPEN, + writable: false + }, + CLOSED: { + __proto__: null, + configurable: false, + enumerable: true, + value: CLOSED, + writable: false + } + }; + + Object.defineProperties(EventSource, constantsPropertyDescriptors); + Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors); + + Object.defineProperties(EventSource.prototype, { + close: kEnumerableProperty, + onerror: kEnumerableProperty, + onmessage: kEnumerableProperty, + onopen: kEnumerableProperty, + readyState: kEnumerableProperty, + url: kEnumerableProperty, + withCredentials: kEnumerableProperty + }); + + webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([ + { + key: 'withCredentials', + converter: webidl.converters.boolean, + defaultValue: () => false + }, + { + key: 'dispatcher', // undici only + converter: webidl.converters.any + } + ]); + + eventsource = { + EventSource, + defaultReconnectionTime + }; + return eventsource; +} + +var hasRequiredUndici; + +function requireUndici () { + if (hasRequiredUndici) return undici; + hasRequiredUndici = 1; + + const Client = requireClient(); + const Dispatcher = requireDispatcher(); + const Pool = requirePool(); + const BalancedPool = requireBalancedPool(); + const Agent = requireAgent(); + const ProxyAgent = requireProxyAgent(); + const EnvHttpProxyAgent = requireEnvHttpProxyAgent(); + const RetryAgent = requireRetryAgent(); + const errors = requireErrors$1(); + const util = requireUtil$9(); + const { InvalidArgumentError } = errors; + const api = requireApi(); + const buildConnector = requireConnect(); + const MockClient = requireMockClient(); + const MockAgent = requireMockAgent(); + const MockPool = requireMockPool(); + const mockErrors = requireMockErrors(); + const RetryHandler = requireRetryHandler(); + const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal(); + const DecoratorHandler = requireDecoratorHandler(); + const RedirectHandler = requireRedirectHandler(); + const createRedirectInterceptor = requireRedirectInterceptor(); + + Object.assign(Dispatcher.prototype, api); + + undici.Dispatcher = Dispatcher; + undici.Client = Client; + undici.Pool = Pool; + undici.BalancedPool = BalancedPool; + undici.Agent = Agent; + undici.ProxyAgent = ProxyAgent; + undici.EnvHttpProxyAgent = EnvHttpProxyAgent; + undici.RetryAgent = RetryAgent; + undici.RetryHandler = RetryHandler; + + undici.DecoratorHandler = DecoratorHandler; + undici.RedirectHandler = RedirectHandler; + undici.createRedirectInterceptor = createRedirectInterceptor; + undici.interceptors = { + redirect: requireRedirect(), + retry: requireRetry(), + dump: requireDump(), + dns: requireDns() + }; + + undici.buildConnector = buildConnector; + undici.errors = errors; + undici.util = { + parseHeaders: util.parseHeaders, + headerNameToString: util.headerNameToString + }; + + function makeDispatcher (fn) { + return (url, opts, handler) => { + if (typeof opts === 'function') { + handler = opts; + opts = null; } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; - } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); + + if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) { + throw new InvalidArgumentError('invalid url') } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; + + if (opts != null && typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); + + if (opts && opts.path != null) { + if (typeof opts.path !== 'string') { + throw new InvalidArgumentError('invalid opts.path') + } + + let path = opts.path; + if (!opts.path.startsWith('/')) { + path = `/${path}`; + } + + url = new URL(util.parseOrigin(url).origin + path); + } else { + if (!opts) { + opts = typeof url === 'object' ? url : {}; + } + + url = util.parseURL(url); } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; + + const { agent, dispatcher = getGlobalDispatcher() } = opts; + + if (agent) { + throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?') } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if tunneling agent isn't assigned create a new agent - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; + + return fn.call(dispatcher, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? 'PUT' : 'GET') + }, handler) + } + } + + undici.setGlobalDispatcher = setGlobalDispatcher; + undici.getGlobalDispatcher = getGlobalDispatcher; + + const fetchImpl = requireFetch().fetch; + undici.fetch = async function fetch (init, options = undefined) { + try { + return await fetchImpl(init, options) + } catch (err) { + if (err && typeof err === 'object') { + Error.captureStackTrace(err); + } + + throw err + } + }; + undici.Headers = requireHeaders().Headers; + undici.Response = requireResponse$1().Response; + undici.Request = requireRequest().Request; + undici.FormData = requireFormdata().FormData; + undici.File = globalThis.File ?? require$$0$6.File; + undici.FileReader = requireFilereader().FileReader; + + const { setGlobalOrigin, getGlobalOrigin } = requireGlobal$1(); + + undici.setGlobalOrigin = setGlobalOrigin; + undici.getGlobalOrigin = getGlobalOrigin; + + const { CacheStorage } = requireCachestorage(); + const { kConstruct } = requireSymbols$1(); + + // Cache & CacheStorage are tightly coupled with fetch. Even if it may run + // in an older version of Node, it doesn't have any use without fetch. + undici.caches = new CacheStorage(kConstruct); + + const { deleteCookie, getCookies, getSetCookies, setCookie } = requireCookies(); + + undici.deleteCookie = deleteCookie; + undici.getCookies = getCookies; + undici.getSetCookies = getSetCookies; + undici.setCookie = setCookie; + + const { parseMIMEType, serializeAMimeType } = requireDataUrl(); + + undici.parseMIMEType = parseMIMEType; + undici.serializeAMimeType = serializeAMimeType; + + const { CloseEvent, ErrorEvent, MessageEvent } = requireEvents(); + undici.WebSocket = requireWebsocket().WebSocket; + undici.CloseEvent = CloseEvent; + undici.ErrorEvent = ErrorEvent; + undici.MessageEvent = MessageEvent; + + undici.request = makeDispatcher(api.request); + undici.stream = makeDispatcher(api.stream); + undici.pipeline = makeDispatcher(api.pipeline); + undici.connect = makeDispatcher(api.connect); + undici.upgrade = makeDispatcher(api.upgrade); + + undici.MockClient = MockClient; + undici.MockPool = MockPool; + undici.MockAgent = MockAgent; + undici.mockErrors = mockErrors; + + const { EventSource } = requireEventsource(); + + undici.EventSource = EventSource; + return undici; +} + +var undiciExports = requireUndici(); + +var __awaiter$6 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +function getProxyAgent(destinationUrl) { + const hc = new libExports.HttpClient(); + return hc.getAgent(destinationUrl); +} +function getProxyAgentDispatcher(destinationUrl) { + const hc = new libExports.HttpClient(); + return hc.getAgentDispatcher(destinationUrl); +} +function getProxyFetch(destinationUrl) { + const httpDispatcher = getProxyAgentDispatcher(destinationUrl); + const proxyFetch = (url, opts) => __awaiter$6(this, void 0, void 0, function* () { + return undiciExports.fetch(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher })); + }); + return proxyFetch; +} +function getApiBaseUrl() { + return process.env['GITHUB_API_URL'] || 'https://api.github.com'; +} + +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + + if (typeof process === "object" && process.version !== undefined) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${ + process.arch + })`; + } + + return ""; +} + +// @ts-check + +function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + + if (!options) { + options = {}; + } + + if (Array.isArray(name)) { + return name.reverse().reduce((callback, name) => { + return register.bind(null, state, name, callback, options); + }, method)(); + } + + return Promise.resolve().then(() => { + if (!state.registry[name]) { + return method(options); + } + + return state.registry[name].reduce((method, registered) => { + return registered.hook.bind(null, method, options); + }, method)(); + }); +} + +// @ts-check + +function addHook(state, kind, name, hook) { + const orig = hook; + if (!state.registry[name]) { + state.registry[name] = []; + } + + if (kind === "before") { + hook = (method, options) => { + return Promise.resolve() + .then(orig.bind(null, options)) + .then(method.bind(null, options)); + }; + } + + if (kind === "after") { + hook = (method, options) => { + let result; + return Promise.resolve() + .then(method.bind(null, options)) + .then((result_) => { + result = result_; + return orig(result, options); + }) + .then(() => { + return result; + }); + }; + } + + if (kind === "error") { + hook = (method, options) => { + return Promise.resolve() + .then(method.bind(null, options)) + .catch((error) => { + return orig(error, options); + }); + }; + } + + state.registry[name].push({ + hook: hook, + orig: orig, + }); +} + +// @ts-check + +function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + + const index = state.registry[name] + .map((registered) => { + return registered.orig; + }) + .indexOf(method); + + if (index === -1) { + return; + } + + state.registry[name].splice(index, 1); +} + +// @ts-check + + +// bind with array of arguments: https://stackoverflow.com/a/21792913 +const bind = Function.bind; +const bindable = bind.bind(bind); + +function bindApi(hook, state, name) { + const removeHookRef = bindable(removeHook, null).apply( + null, + [state] + ); + hook.api = { remove: removeHookRef }; + hook.remove = removeHookRef; + ["before", "error", "after", "wrap"].forEach((kind) => { + const args = [state, kind]; + hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args); + }); +} + +function Collection() { + const state = { + registry: {}, + }; + + const hook = register.bind(null, state); + bindApi(hook, state); + + return hook; +} + +var Hook = { Collection }; + +// pkg/dist-src/defaults.js + +// pkg/dist-src/version.js +var VERSION$5 = "0.0.0-development"; + +// pkg/dist-src/defaults.js +var userAgent$3 = `octokit-endpoint.js/${VERSION$5} ${getUserAgent()}`; +var DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent$3 + }, + mediaType: { + format: "" + } +}; + +// pkg/dist-src/util/lowercase-keys.js +function lowercaseKeys(object) { + if (!object) { + return {}; + } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} + +// pkg/dist-src/util/is-plain-object.js +function isPlainObject$1(value) { + if (typeof value !== "object" || value === null) return false; + if (Object.prototype.toString.call(value) !== "[object Object]") return false; + const proto = Object.getPrototypeOf(value); + if (proto === null) return true; + const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; + return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value); +} + +// pkg/dist-src/util/merge-deep.js +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach((key) => { + if (isPlainObject$1(options[key])) { + if (!(key in defaults)) Object.assign(result, { [key]: options[key] }); + else result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { [key]: options[key] }); + } + }); + return result; +} + +// pkg/dist-src/util/remove-undefined-properties.js +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === void 0) { + delete obj[key]; + } + } + return obj; +} + +// pkg/dist-src/merge.js +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { method, url } : { url: method }, options); + } else { + options = Object.assign({}, route); + } + options.headers = lowercaseKeys(options.headers); + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); + if (options.url === "/graphql") { + if (defaults && defaults.mediaType.previews?.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter( + (preview) => !mergedOptions.mediaType.previews.includes(preview) + ).concat(mergedOptions.mediaType.previews); + } + mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, "")); + } + return mergedOptions; +} + +// pkg/dist-src/util/add-query-parameters.js +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + if (names.length === 0) { + return url; + } + return url + separator + names.map((name) => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); +} + +// pkg/dist-src/util/extract-url-variable-names.js +var urlVariableRegex = /\{[^{}}]+\}/g; +function removeNonChars(variableName) { + return variableName.replace(/(?:^\W+)|(?:(? a.concat(b), []); +} + +// pkg/dist-src/util/omit.js +function omit(object, keysToOmit) { + const result = { __proto__: null }; + for (const key of Object.keys(object)) { + if (keysToOmit.indexOf(key) === -1) { + result[key] = object[key]; + } + } + return result; +} + +// pkg/dist-src/util/url-template.js +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + return part; + }).join(""); +} +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} +function isDefined(value) { + return value !== void 0 && value !== null; +} +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} +function getValues(context, operator, key, modifier) { + var value = context[key], result = []; + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + result.push( + encodeValue(operator, value, isKeyOperator(operator) ? key : "") + ); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + result.push( + encodeValue(operator, value2, isKeyOperator(operator) ? key : "") + ); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + tmp.push(encodeValue(operator, value2)); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + return result; +} +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + template = template.replace( + /\{([^\{\}]+)\}|([^\{\}]+)/g, + function(_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + expression.split(/,/g).forEach(function(variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + if (operator && operator !== "+") { + var separator = ","; + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + } + ); + if (template === "/") { + return template; + } else { + return template.replace(/\/$/, ""); + } +} + +// pkg/dist-src/parse.js +function parse(options) { + let method = options.method.toUpperCase(); + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, [ + "method", + "baseUrl", + "url", + "headers", + "request", + "mediaType" + ]); + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + if (!isBinaryRequest) { + if (options.mediaType.format) { + headers.accept = headers.accept.split(/,/).map( + (format) => format.replace( + /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, + `application/vnd$1$2.${options.mediaType.format}` + ) + ).join(","); + } + if (url.endsWith("/graphql")) { + if (options.mediaType.previews?.length) { + const previewsFromAcceptHeader = headers.accept.match(/(? { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } + } + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } + } + } + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } + return Object.assign( + { method, url, headers }, + typeof body !== "undefined" ? { body } : null, + options.request ? { request: options.request } : null + ); +} + +// pkg/dist-src/endpoint-with-defaults.js +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} + +// pkg/dist-src/with-defaults.js +function withDefaults$2(oldDefaults, newDefaults) { + const DEFAULTS2 = merge(oldDefaults, newDefaults); + const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); + return Object.assign(endpoint2, { + DEFAULTS: DEFAULTS2, + defaults: withDefaults$2.bind(null, DEFAULTS2), + merge: merge.bind(null, DEFAULTS2), + parse + }); +} + +// pkg/dist-src/index.js +var endpoint = withDefaults$2(null, DEFAULTS); + +var fastContentTypeParse = {}; + +var hasRequiredFastContentTypeParse; + +function requireFastContentTypeParse () { + if (hasRequiredFastContentTypeParse) return fastContentTypeParse; + hasRequiredFastContentTypeParse = 1; + + const NullObject = function NullObject () { }; + NullObject.prototype = Object.create(null); + + /** + * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 + * + * parameter = token "=" ( token / quoted-string ) + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + * / DIGIT / ALPHA + * ; any VCHAR, except delimiters + * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE + * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text + * obs-text = %x80-FF + * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + */ + const paramRE = /; *([!#$%&'*+.^\w`|~-]+)=("(?:[\v\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\v\u0020-\u00ff])*"|[!#$%&'*+.^\w`|~-]+) */gu; + + /** + * RegExp to match quoted-pair in RFC 7230 sec 3.2.6 + * + * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + * obs-text = %x80-FF + */ + const quotedPairRE = /\\([\v\u0020-\u00ff])/gu; + + /** + * RegExp to match type in RFC 7231 sec 3.1.1.1 + * + * media-type = type "/" subtype + * type = token + * subtype = token + */ + const mediaTypeRE = /^[!#$%&'*+.^\w|~-]+\/[!#$%&'*+.^\w|~-]+$/u; + + // default ContentType to prevent repeated object creation + const defaultContentType = { type: '', parameters: new NullObject() }; + Object.freeze(defaultContentType.parameters); + Object.freeze(defaultContentType); + + /** + * Parse media type to object. + * + * @param {string|object} header + * @return {Object} + * @public + */ + + function parse (header) { + if (typeof header !== 'string') { + throw new TypeError('argument header is required and must be a string') + } + + let index = header.indexOf(';'); + const type = index !== -1 + ? header.slice(0, index).trim() + : header.trim(); + + if (mediaTypeRE.test(type) === false) { + throw new TypeError('invalid media type') + } + + const result = { + type: type.toLowerCase(), + parameters: new NullObject() + }; + + // parse parameters + if (index === -1) { + return result + } + + let key; + let match; + let value; + + paramRE.lastIndex = index; + + while ((match = paramRE.exec(header))) { + if (match.index !== index) { + throw new TypeError('invalid parameter format') } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; - } - // if agent is already assigned use that agent. - if (proxyAgent) { - return proxyAgent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}` - }))); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); - } - return proxyAgent; + + index += match[0].length; + key = match[1].toLowerCase(); + value = match[2]; + + if (value[0] === '"') { + // remove quotes and escapes + value = value + .slice(1, value.length - 1); + + quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1')); } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); + + result.parameters[key] = value; + } + + if (index !== header.length) { + throw new TypeError('invalid parameter format') + } + + return result + } + + function safeParse (header) { + if (typeof header !== 'string') { + return defaultContentType + } + + let index = header.indexOf(';'); + const type = index !== -1 + ? header.slice(0, index).trim() + : header.trim(); + + if (mediaTypeRE.test(type) === false) { + return defaultContentType + } + + const result = { + type: type.toLowerCase(), + parameters: new NullObject() + }; + + // parse parameters + if (index === -1) { + return result + } + + let key; + let match; + let value; + + paramRE.lastIndex = index; + + while ((match = paramRE.exec(header))) { + if (match.index !== index) { + return defaultContentType } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } - else { - resolve(response); - } - })); - }); + + index += match[0].length; + key = match[1].toLowerCase(); + value = match[2]; + + if (value[0] === '"') { + // remove quotes and escapes + value = value + .slice(1, value.length - 1); + + quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1')); } + + result.parameters[key] = value; + } + + if (index !== header.length) { + return defaultContentType + } + + return result } - lib.HttpClient = HttpClient; - const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - - return lib; + + fastContentTypeParse.default = { parse, safeParse }; + fastContentTypeParse.parse = parse; + fastContentTypeParse.safeParse = safeParse; + fastContentTypeParse.defaultContentType = defaultContentType; + return fastContentTypeParse; +} + +var fastContentTypeParseExports = requireFastContentTypeParse(); + +class RequestError extends Error { + name; + /** + * http status code + */ + status; + /** + * Request options that lead to the error. + */ + request; + /** + * Response object if a response was received + */ + response; + constructor(message, statusCode, options) { + super(message, { cause: options.cause }); + this.name = "HttpError"; + this.status = Number.parseInt(statusCode); + if (Number.isNaN(this.status)) { + this.status = 0; + } + /* v8 ignore else -- @preserve -- Bug with vitest coverage where it sees an else branch that doesn't exist */ + if ("response" in options) { + this.response = options.response; + } + const requestCopy = Object.assign({}, options.request); + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace( + /(? ""; +async function fetchWrapper(requestOptions) { + const fetch = requestOptions.request?.fetch || globalThis.fetch; + if (!fetch) { + throw new Error( + "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing" + ); + } + const log = requestOptions.request?.log || console; + const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false; + const body = isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body) ? JSON.stringify(requestOptions.body) : requestOptions.body; + const requestHeaders = Object.fromEntries( + Object.entries(requestOptions.headers).map(([name, value]) => [ + name, + String(value) + ]) + ); + let fetchResponse; + try { + fetchResponse = await fetch(requestOptions.url, { + method: requestOptions.method, + body, + redirect: requestOptions.request?.redirect, + headers: requestHeaders, + signal: requestOptions.request?.signal, + // duplex must be set if request.body is ReadableStream or Async Iterables. + // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex. + ...requestOptions.body && { duplex: "half" } + }); + } catch (error) { + let message = "Unknown Error"; + if (error instanceof Error) { + if (error.name === "AbortError") { + error.status = 500; + throw error; + } + message = error.message; + if (error.name === "TypeError" && "cause" in error) { + if (error.cause instanceof Error) { + message = error.cause.message; + } else if (typeof error.cause === "string") { + message = error.cause; + } + } + } + const requestError = new RequestError(message, 500, { + request: requestOptions + }); + requestError.cause = error; + throw requestError; + } + const status = fetchResponse.status; + const url = fetchResponse.url; + const responseHeaders = {}; + for (const [key, value] of fetchResponse.headers) { + responseHeaders[key] = value; + } + const octokitResponse = { + url, + status, + headers: responseHeaders, + data: "" + }; + if ("deprecation" in responseHeaders) { + const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn( + `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` + ); + } + if (status === 204 || status === 205) { + return octokitResponse; + } + if (requestOptions.method === "HEAD") { + if (status < 400) { + return octokitResponse; + } + throw new RequestError(fetchResponse.statusText, status, { + response: octokitResponse, + request: requestOptions + }); + } + if (status === 304) { + octokitResponse.data = await getResponseData(fetchResponse); + throw new RequestError("Not modified", status, { + response: octokitResponse, + request: requestOptions + }); + } + if (status >= 400) { + octokitResponse.data = await getResponseData(fetchResponse); + throw new RequestError(toErrorMessage(octokitResponse.data), status, { + response: octokitResponse, + request: requestOptions + }); + } + octokitResponse.data = parseSuccessResponseBody ? await getResponseData(fetchResponse) : fetchResponse.body; + return octokitResponse; +} +async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + if (!contentType) { + return response.text().catch(noop$1); + } + const mimetype = fastContentTypeParseExports.safeParse(contentType); + if (isJSONResponse(mimetype)) { + let text = ""; + try { + text = await response.text(); + return JSON.parse(text); + } catch (err) { + return text; + } + } else if (mimetype.type.startsWith("text/") || mimetype.parameters.charset?.toLowerCase() === "utf-8") { + return response.text().catch(noop$1); + } else { + return response.arrayBuffer().catch( + /* v8 ignore next -- @preserve */ + () => new ArrayBuffer(0) + ); + } +} +function isJSONResponse(mimetype) { + return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; +} +function toErrorMessage(data) { + if (typeof data === "string") { + return data; + } + if (data instanceof ArrayBuffer) { + return "Unknown error"; + } + if ("message" in data) { + const suffix = "documentation_url" in data ? ` - ${data.documentation_url}` : ""; + return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` : `${data.message}${suffix}`; + } + return `Unknown error: ${JSON.stringify(data)}`; +} + +// pkg/dist-src/with-defaults.js +function withDefaults$1(oldEndpoint, newDefaults) { + const endpoint2 = oldEndpoint.defaults(newDefaults); + const newApi = function(route, parameters) { + const endpointOptions = endpoint2.merge(route, parameters); + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint2.parse(endpointOptions)); + } + const request2 = (route2, parameters2) => { + return fetchWrapper( + endpoint2.parse(endpoint2.merge(route2, parameters2)) + ); + }; + Object.assign(request2, { + endpoint: endpoint2, + defaults: withDefaults$1.bind(null, endpoint2) + }); + return endpointOptions.request.hook(request2, endpointOptions); + }; + return Object.assign(newApi, { + endpoint: endpoint2, + defaults: withDefaults$1.bind(null, endpoint2) + }); +} + +// pkg/dist-src/index.js +var request = withDefaults$1(endpoint, defaults_default); +/* v8 ignore next -- @preserve */ +/* v8 ignore else -- @preserve */ + +// pkg/dist-src/index.js + +// pkg/dist-src/version.js +var VERSION$3 = "0.0.0-development"; + +// pkg/dist-src/error.js +function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors: +` + data.errors.map((e) => ` - ${e.message}`).join("\n"); +} +var GraphqlResponseError = class extends Error { + constructor(request2, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request2; + this.headers = headers; + this.response = response; + this.errors = response.errors; + this.data = response.data; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + name = "GraphqlResponseError"; + errors; + data; +}; + +// pkg/dist-src/graphql.js +var NON_VARIABLE_OPTIONS = [ + "method", + "baseUrl", + "url", + "headers", + "request", + "query", + "mediaType", + "operationName" +]; +var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request2, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject( + new Error(`[@octokit/graphql] "query" cannot be used as variable name`) + ); + } + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; + return Promise.reject( + new Error( + `[@octokit/graphql] "${key}" cannot be used as variable name` + ) + ); + } + } + const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; + const requestOptions = Object.keys( + parsedOptions + ).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + if (!result.variables) { + result.variables = {}; + } + result.variables[key] = parsedOptions[key]; + return result; + }, {}); + const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + return request2(requestOptions).then((response) => { + if (response.data.errors) { + const headers = {}; + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + throw new GraphqlResponseError( + requestOptions, + headers, + response.data + ); + } + return response.data.data; + }); +} + +// pkg/dist-src/with-defaults.js +function withDefaults(request2, newDefaults) { + const newRequest = request2.defaults(newDefaults); + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: newRequest.endpoint + }); +} + +// pkg/dist-src/index.js +withDefaults(request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION$3} ${getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); +} + +// pkg/dist-src/is-jwt.js +var b64url = "(?:[a-zA-Z0-9_-]+)"; +var sep = "\\."; +var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`); +var isJWT = jwtRE.test.bind(jwtRE); + +// pkg/dist-src/auth.js +async function auth(token) { + const isApp = isJWT(token); + const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_"); + const isUserToServer = token.startsWith("ghu_"); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token, + tokenType + }; +} + +// pkg/dist-src/with-authorization-prefix.js +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + return `token ${token}`; +} + +// pkg/dist-src/hook.js +async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge( + route, + parameters + ); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); +} + +// pkg/dist-src/index.js +var createTokenAuth = function createTokenAuth2(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + if (typeof token !== "string") { + throw new Error( + "[@octokit/auth-token] Token passed to createTokenAuth is not a string" + ); + } + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; + +const VERSION$2 = "7.0.6"; + +const noop = () => { +}; +const consoleWarn = console.warn.bind(console); +const consoleError = console.error.bind(console); +function createLogger(logger = {}) { + if (typeof logger.debug !== "function") { + logger.debug = noop; + } + if (typeof logger.info !== "function") { + logger.info = noop; + } + if (typeof logger.warn !== "function") { + logger.warn = consoleWarn; + } + if (typeof logger.error !== "function") { + logger.error = consoleError; + } + return logger; +} +const userAgentTrail = `octokit-core.js/${VERSION$2} ${getUserAgent()}`; +class Octokit { + static VERSION = VERSION$2; + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + super( + Object.assign( + {}, + defaults, + options, + options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null + ) + ); + } + }; + return OctokitWithDefaults; + } + static plugins = []; + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ + static plugin(...newPlugins) { + const currentPlugins = this.plugins; + const NewOctokit = class extends this { + static plugins = currentPlugins.concat( + newPlugins.filter((plugin) => !currentPlugins.includes(plugin)) + ); + }; + return NewOctokit; + } + constructor(options = {}) { + const hook = new Hook.Collection(); + const requestDefaults = { + baseUrl: request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; + requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail; + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + this.request = request.defaults(requestDefaults); + this.graphql = withCustomRequest(this.request).defaults(requestDefaults); + this.log = createLogger(options.log); + this.hook = hook; + if (!options.authStrategy) { + if (!options.auth) { + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + const auth = createTokenAuth(options.auth); + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { authStrategy, ...otherOptions } = options; + const auth = authStrategy( + Object.assign( + { + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, + options.auth + ) + ); + hook.wrap("request", auth.hook); + this.auth = auth; + } + const classConstructor = this.constructor; + for (let i = 0; i < classConstructor.plugins.length; ++i) { + Object.assign(this, classConstructor.plugins[i](this, options)); + } + } + // assigned during constructor + request; + graphql; + log; + hook; + // TODO: type `octokit.auth` based on passed options.authStrategy + auth; +} + +const VERSION$1 = "17.0.0"; + +const Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: [ + "POST /orgs/{org}/actions/runners/{runner_id}/labels" + ], + addCustomLabelsToSelfHostedRunnerForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + addRepoAccessToSelfHostedRunnerGroupInOrg: [ + "PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}" + ], + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" + ], + addSelectedRepoToOrgVariable: [ + "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" + ], + approveWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve" + ], + cancelWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel" + ], + createEnvironmentVariable: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/variables" + ], + createHostedRunnerForOrg: ["POST /orgs/{org}/actions/hosted-runners"], + createOrUpdateEnvironmentSecret: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" + ], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: [ + "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}" + ], + createOrgVariable: ["POST /orgs/{org}/actions/variables"], + createRegistrationTokenForOrg: [ + "POST /orgs/{org}/actions/runners/registration-token" + ], + createRegistrationTokenForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/registration-token" + ], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/remove-token" + ], + createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"], + createWorkflowDispatch: [ + "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches" + ], + deleteActionsCacheById: [ + "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}" + ], + deleteActionsCacheByKey: [ + "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}" + ], + deleteArtifact: [ + "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}" + ], + deleteCustomImageFromOrg: [ + "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}" + ], + deleteCustomImageVersionFromOrg: [ + "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}" + ], + deleteEnvironmentSecret: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" + ], + deleteEnvironmentVariable: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" + ], + deleteHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}" + ], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"], + deleteRepoSecret: [ + "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}" + ], + deleteRepoVariable: [ + "DELETE /repos/{owner}/{repo}/actions/variables/{name}" + ], + deleteSelfHostedRunnerFromOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}" + ], + deleteSelfHostedRunnerFromRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}" + ], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: [ + "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs" + ], + disableSelectedRepositoryGithubActionsOrganization: [ + "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}" + ], + disableWorkflow: [ + "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable" + ], + downloadArtifact: [ + "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}" + ], + downloadJobLogsForWorkflowRun: [ + "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs" + ], + downloadWorkflowRunAttemptLogs: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs" + ], + downloadWorkflowRunLogs: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs" + ], + enableSelectedRepositoryGithubActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}" + ], + enableWorkflow: [ + "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable" + ], + forceCancelWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel" + ], + generateRunnerJitconfigForOrg: [ + "POST /orgs/{org}/actions/runners/generate-jitconfig" + ], + generateRunnerJitconfigForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig" + ], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: [ + "GET /orgs/{org}/actions/cache/usage-by-repository" + ], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: [ + "GET /orgs/{org}/actions/permissions/selected-actions" + ], + getAllowedActionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" + ], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomImageForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}" + ], + getCustomImageVersionForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}" + ], + getCustomOidcSubClaimForRepo: [ + "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], + getEnvironmentPublicKey: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key" + ], + getEnvironmentSecret: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" + ], + getEnvironmentVariable: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" + ], + getGithubActionsDefaultWorkflowPermissionsOrganization: [ + "GET /orgs/{org}/actions/permissions/workflow" + ], + getGithubActionsDefaultWorkflowPermissionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/workflow" + ], + getGithubActionsPermissionsOrganization: [ + "GET /orgs/{org}/actions/permissions" + ], + getGithubActionsPermissionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions" + ], + getHostedRunnerForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}" + ], + getHostedRunnersGithubOwnedImagesForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/github-owned" + ], + getHostedRunnersLimitsForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/limits" + ], + getHostedRunnersMachineSpecsForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/machine-sizes" + ], + getHostedRunnersPartnerImagesForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/partner" + ], + getHostedRunnersPlatformsForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/platforms" + ], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"], + getPendingDeploymentsForRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" + ], + getRepoPermissions: [ + "GET /repos/{owner}/{repo}/actions/permissions", + {}, + { renamed: ["actions", "getGithubActionsPermissionsRepository"] } + ], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"], + getReviewsForRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals" + ], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/{runner_id}" + ], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/access" + ], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}" + ], + getWorkflowRunUsage: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing" + ], + getWorkflowUsage: [ + "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing" + ], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listCustomImageVersionsForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions" + ], + listCustomImagesForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom" + ], + listEnvironmentSecrets: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets" + ], + listEnvironmentVariables: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/variables" + ], + listGithubHostedRunnersInGroupForOrg: [ + "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners" + ], + listHostedRunnersForOrg: ["GET /orgs/{org}/actions/hosted-runners"], + listJobsForWorkflowRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs" + ], + listJobsForWorkflowRunAttempt: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs" + ], + listLabelsForSelfHostedRunnerForOrg: [ + "GET /orgs/{org}/actions/runners/{runner_id}/labels" + ], + listLabelsForSelfHostedRunnerForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listOrgVariables: ["GET /orgs/{org}/actions/variables"], + listRepoOrganizationSecrets: [ + "GET /repos/{owner}/{repo}/actions/organization-secrets" + ], + listRepoOrganizationVariables: [ + "GET /repos/{owner}/{repo}/actions/organization-variables" + ], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/downloads" + ], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/actions/secrets/{secret_name}/repositories" + ], + listSelectedReposForOrgVariable: [ + "GET /orgs/{org}/actions/variables/{name}/repositories" + ], + listSelectedRepositoriesEnabledGithubActionsOrganization: [ + "GET /orgs/{org}/actions/permissions/repositories" + ], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts" + ], + listWorkflowRuns: [ + "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs" + ], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun" + ], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs" + ], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}/labels" + ], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + removeCustomLabelFromSelfHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}" + ], + removeCustomLabelFromSelfHostedRunnerForRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" + ], + removeSelectedRepoFromOrgVariable: [ + "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" + ], + reviewCustomGatesForRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule" + ], + reviewPendingDeploymentsForRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" + ], + setAllowedActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/selected-actions" + ], + setAllowedActionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions" + ], + setCustomLabelsForSelfHostedRunnerForOrg: [ + "PUT /orgs/{org}/actions/runners/{runner_id}/labels" + ], + setCustomLabelsForSelfHostedRunnerForRepo: [ + "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + setCustomOidcSubClaimForRepo: [ + "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], + setGithubActionsDefaultWorkflowPermissionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/workflow" + ], + setGithubActionsDefaultWorkflowPermissionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/workflow" + ], + setGithubActionsPermissionsOrganization: [ + "PUT /orgs/{org}/actions/permissions" + ], + setGithubActionsPermissionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions" + ], + setSelectedReposForOrgSecret: [ + "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories" + ], + setSelectedReposForOrgVariable: [ + "PUT /orgs/{org}/actions/variables/{name}/repositories" + ], + setSelectedRepositoriesEnabledGithubActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/repositories" + ], + setWorkflowAccessToRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/access" + ], + updateEnvironmentVariable: [ + "PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" + ], + updateHostedRunnerForOrg: [ + "PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}" + ], + updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"], + updateRepoVariable: [ + "PATCH /repos/{owner}/{repo}/actions/variables/{name}" + ] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: [ + "DELETE /notifications/threads/{thread_id}/subscription" + ], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: [ + "GET /notifications/threads/{thread_id}/subscription" + ], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: [ + "GET /users/{username}/events/orgs/{org}" + ], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: [ + "GET /users/{username}/received_events/public" + ], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/notifications" + ], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: [ + "PUT /notifications/threads/{thread_id}/subscription" + ], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: [ + "PUT /user/installations/{installation_id}/repositories/{repository_id}", + {}, + { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] } + ], + addRepoToInstallationForAuthenticatedUser: [ + "PUT /user/installations/{installation_id}/repositories/{repository_id}" + ], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: [ + "POST /app/installations/{installation_id}/access_tokens" + ], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: [ + "GET /marketplace_listing/accounts/{account_id}" + ], + getSubscriptionPlanForAccountStubbed: [ + "GET /marketplace_listing/stubbed/accounts/{account_id}" + ], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: [ + "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts" + ], + listInstallationReposForAuthenticatedUser: [ + "GET /user/installations/{installation_id}/repositories" + ], + listInstallationRequestsForAuthenticatedApp: [ + "GET /app/installation-requests" + ], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: [ + "GET /user/marketplace_purchases/stubbed" + ], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: [ + "POST /app/hook/deliveries/{delivery_id}/attempts" + ], + removeRepoFromInstallation: [ + "DELETE /user/installations/{installation_id}/repositories/{repository_id}", + {}, + { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] } + ], + removeRepoFromInstallationForAuthenticatedUser: [ + "DELETE /user/installations/{installation_id}/repositories/{repository_id}" + ], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: [ + "DELETE /app/installations/{installation_id}/suspended" + ], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: [ + "GET /users/{username}/settings/billing/actions" + ], + getGithubBillingPremiumRequestUsageReportOrg: [ + "GET /organizations/{org}/settings/billing/premium_request/usage" + ], + getGithubBillingPremiumRequestUsageReportUser: [ + "GET /users/{username}/settings/billing/premium_request/usage" + ], + getGithubBillingUsageReportOrg: [ + "GET /organizations/{org}/settings/billing/usage" + ], + getGithubBillingUsageReportUser: [ + "GET /users/{username}/settings/billing/usage" + ], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: [ + "GET /users/{username}/settings/billing/packages" + ], + getSharedStorageBillingOrg: [ + "GET /orgs/{org}/settings/billing/shared-storage" + ], + getSharedStorageBillingUser: [ + "GET /users/{username}/settings/billing/shared-storage" + ] + }, + campaigns: { + createCampaign: ["POST /orgs/{org}/campaigns"], + deleteCampaign: ["DELETE /orgs/{org}/campaigns/{campaign_number}"], + getCampaignSummary: ["GET /orgs/{org}/campaigns/{campaign_number}"], + listOrgCampaigns: ["GET /orgs/{org}/campaigns"], + updateCampaign: ["PATCH /orgs/{org}/campaigns/{campaign_number}"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: [ + "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations" + ], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: [ + "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs" + ], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: [ + "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest" + ], + rerequestSuite: [ + "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest" + ], + setSuitesPreferences: [ + "PATCH /repos/{owner}/{repo}/check-suites/preferences" + ], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + commitAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits" + ], + createAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix" + ], + createVariantAnalysis: [ + "POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses" + ], + deleteAnalysis: [ + "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" + ], + deleteCodeqlDatabase: [ + "DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" + ], + getAlert: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", + {}, + { renamedParameters: { alert_id: "alert_number" } } + ], + getAnalysis: [ + "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}" + ], + getAutofix: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix" + ], + getCodeqlDatabase: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" + ], + getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + getVariantAnalysis: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}" + ], + getVariantAnalysisRepoTask: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}" + ], + listAlertInstances: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances" + ], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", + {}, + { renamed: ["codeScanning", "listAlertInstances"] } + ], + listCodeqlDatabases: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/databases" + ], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: [ + "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}" + ], + updateDefaultSetup: [ + "PATCH /repos/{owner}/{repo}/code-scanning/default-setup" + ], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codeSecurity: { + attachConfiguration: [ + "POST /orgs/{org}/code-security/configurations/{configuration_id}/attach" + ], + attachEnterpriseConfiguration: [ + "POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach" + ], + createConfiguration: ["POST /orgs/{org}/code-security/configurations"], + createConfigurationForEnterprise: [ + "POST /enterprises/{enterprise}/code-security/configurations" + ], + deleteConfiguration: [ + "DELETE /orgs/{org}/code-security/configurations/{configuration_id}" + ], + deleteConfigurationForEnterprise: [ + "DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + detachConfiguration: [ + "DELETE /orgs/{org}/code-security/configurations/detach" + ], + getConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}" + ], + getConfigurationForRepository: [ + "GET /repos/{owner}/{repo}/code-security-configuration" + ], + getConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations" + ], + getConfigurationsForOrg: ["GET /orgs/{org}/code-security/configurations"], + getDefaultConfigurations: [ + "GET /orgs/{org}/code-security/configurations/defaults" + ], + getDefaultConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/defaults" + ], + getRepositoriesForConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories" + ], + getRepositoriesForEnterpriseConfiguration: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories" + ], + getSingleConfigurationForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + setConfigurationAsDefault: [ + "PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults" + ], + setConfigurationAsDefaultForEnterprise: [ + "PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults" + ], + updateConfiguration: [ + "PATCH /orgs/{org}/code-security/configurations/{configuration_id}" + ], + updateEnterpriseConfiguration: [ + "PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + checkPermissionsForDevcontainer: [ + "GET /repos/{owner}/{repo}/codespaces/permissions_check" + ], + codespaceMachinesForAuthenticatedUser: [ + "GET /user/codespaces/{codespace_name}/machines" + ], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}" + ], + createOrUpdateRepoSecret: [ + "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" + ], + createOrUpdateSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}" + ], + createWithPrForAuthenticatedUser: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces" + ], + createWithRepoForAuthenticatedUser: [ + "POST /repos/{owner}/{repo}/codespaces" + ], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: [ + "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}" + ], + deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"], + deleteRepoSecret: [ + "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" + ], + deleteSecretForAuthenticatedUser: [ + "DELETE /user/codespaces/secrets/{secret_name}" + ], + exportForAuthenticatedUser: [ + "POST /user/codespaces/{codespace_name}/exports" + ], + getCodespacesForUserInOrg: [ + "GET /orgs/{org}/members/{username}/codespaces" + ], + getExportDetailsForAuthenticatedUser: [ + "GET /user/codespaces/{codespace_name}/exports/{export_id}" + ], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"], + getPublicKeyForAuthenticatedUser: [ + "GET /user/codespaces/secrets/public-key" + ], + getRepoPublicKey: [ + "GET /repos/{owner}/{repo}/codespaces/secrets/public-key" + ], + getRepoSecret: [ + "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" + ], + getSecretForAuthenticatedUser: [ + "GET /user/codespaces/secrets/{secret_name}" + ], + listDevcontainersInRepositoryForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/devcontainers" + ], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: [ + "GET /orgs/{org}/codespaces", + {}, + { renamedParameters: { org_id: "org" } } + ], + listInRepositoryForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces" + ], + listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: [ + "GET /user/codespaces/secrets/{secret_name}/repositories" + ], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories" + ], + preFlightWithRepoForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/new" + ], + publishForAuthenticatedUser: [ + "POST /user/codespaces/{codespace_name}/publish" + ], + removeRepositoryForSecretForAuthenticatedUser: [ + "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + repoMachinesForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/machines" + ], + setRepositoriesForSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}/repositories" + ], + setSelectedReposForOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories" + ], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: [ + "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop" + ], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + copilot: { + addCopilotSeatsForTeams: [ + "POST /orgs/{org}/copilot/billing/selected_teams" + ], + addCopilotSeatsForUsers: [ + "POST /orgs/{org}/copilot/billing/selected_users" + ], + cancelCopilotSeatAssignmentForTeams: [ + "DELETE /orgs/{org}/copilot/billing/selected_teams" + ], + cancelCopilotSeatAssignmentForUsers: [ + "DELETE /orgs/{org}/copilot/billing/selected_users" + ], + copilotMetricsForOrganization: ["GET /orgs/{org}/copilot/metrics"], + copilotMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/metrics"], + getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], + getCopilotSeatDetailsForUser: [ + "GET /orgs/{org}/members/{username}/copilot" + ], + listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] + }, + credentials: { revoke: ["POST /credentials/revoke"] }, + dependabot: { + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" + ], + createOrUpdateOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}" + ], + createOrUpdateRepoSecret: [ + "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" + ], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: [ + "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" + ], + getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: [ + "GET /repos/{owner}/{repo}/dependabot/secrets/public-key" + ], + getRepoSecret: [ + "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" + ], + listAlertsForEnterprise: [ + "GET /enterprises/{enterprise}/dependabot/alerts" + ], + listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" + ], + repositoryAccessForOrg: [ + "GET /organizations/{org}/dependabot/repository-access" + ], + setRepositoryAccessDefaultLevel: [ + "PUT /organizations/{org}/dependabot/repository-access/default-level" + ], + setSelectedReposForOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories" + ], + updateAlert: [ + "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}" + ], + updateRepositoryAccessForOrg: [ + "PATCH /organizations/{org}/dependabot/repository-access" + ] + }, + dependencyGraph: { + createRepositorySnapshot: [ + "POST /repos/{owner}/{repo}/dependency-graph/snapshots" + ], + diffRange: [ + "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}" + ], + exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"] + }, + emojis: { get: ["GET /emojis"] }, + enterpriseTeamMemberships: { + add: [ + "PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}" + ], + bulkAdd: [ + "POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add" + ], + bulkRemove: [ + "POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove" + ], + get: [ + "GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}" + ], + list: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships"], + remove: [ + "DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}" + ] + }, + enterpriseTeamOrganizations: { + add: [ + "PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}" + ], + bulkAdd: [ + "POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add" + ], + bulkRemove: [ + "POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove" + ], + delete: [ + "DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}" + ], + getAssignment: [ + "GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}" + ], + getAssignments: [ + "GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations" + ] + }, + enterpriseTeams: { + create: ["POST /enterprises/{enterprise}/teams"], + delete: ["DELETE /enterprises/{enterprise}/teams/{team_slug}"], + get: ["GET /enterprises/{enterprise}/teams/{team_slug}"], + list: ["GET /enterprises/{enterprise}/teams"], + update: ["PATCH /enterprises/{enterprise}/teams/{team_slug}"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + hostedCompute: { + createNetworkConfigurationForOrg: [ + "POST /orgs/{org}/settings/network-configurations" + ], + deleteNetworkConfigurationFromOrg: [ + "DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}" + ], + getNetworkConfigurationForOrg: [ + "GET /orgs/{org}/settings/network-configurations/{network_configuration_id}" + ], + getNetworkSettingsForOrg: [ + "GET /orgs/{org}/settings/network-settings/{network_settings_id}" + ], + listNetworkConfigurationsForOrg: [ + "GET /orgs/{org}/settings/network-configurations" + ], + updateNetworkConfigurationForOrg: [ + "PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}" + ] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: [ + "GET /user/interaction-limits", + {}, + { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] } + ], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: [ + "DELETE /repos/{owner}/{repo}/interaction-limits" + ], + removeRestrictionsForYourPublicRepos: [ + "DELETE /user/interaction-limits", + {}, + { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] } + ], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: [ + "PUT /user/interaction-limits", + {}, + { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] } + ] + }, + issues: { + addAssignees: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees" + ], + addBlockedByDependency: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by" + ], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + addSubIssue: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues" + ], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + checkUserCanBeAssignedToIssue: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" + ], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/comments" + ], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: [ + "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}" + ], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: [ + "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}" + ], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + getParent: ["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listDependenciesBlockedBy: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by" + ], + listDependenciesBlocking: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking" + ], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline" + ], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: [ + "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels" + ], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/labels" + ], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + listSubIssues: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues" + ], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels" + ], + removeAssignees: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees" + ], + removeDependencyBlockedBy: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}" + ], + removeLabel: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}" + ], + removeSubIssue: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue" + ], + reprioritizeSubIssue: [ + "PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority" + ], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: [ + "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}" + ] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: [ + "POST /markdown/raw", + { headers: { "content-type": "text/plain; charset=utf-8" } } + ] + }, + meta: { + get: ["GET /meta"], + getAllVersions: ["GET /versions"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + deleteArchiveForAuthenticatedUser: [ + "DELETE /user/migrations/{migration_id}/archive" + ], + deleteArchiveForOrg: [ + "DELETE /orgs/{org}/migrations/{migration_id}/archive" + ], + downloadArchiveForOrg: [ + "GET /orgs/{org}/migrations/{migration_id}/archive" + ], + getArchiveForAuthenticatedUser: [ + "GET /user/migrations/{migration_id}/archive" + ], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: [ + "GET /user/migrations/{migration_id}/repositories" + ], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: [ + "GET /user/migrations/{migration_id}/repositories", + {}, + { renamed: ["migrations", "listReposForAuthenticatedUser"] } + ], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + unlockRepoForAuthenticatedUser: [ + "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock" + ], + unlockRepoForOrg: [ + "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock" + ] + }, + oidc: { + getOidcCustomSubTemplateForOrg: [ + "GET /orgs/{org}/actions/oidc/customization/sub" + ], + updateOidcCustomSubTemplateForOrg: [ + "PUT /orgs/{org}/actions/oidc/customization/sub" + ] + }, + orgs: { + addSecurityManagerTeam: [ + "PUT /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: "octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team" + } + ], + assignTeamToOrgRole: [ + "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + assignUserToOrgRole: [ + "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: [ + "PUT /orgs/{org}/outside_collaborators/{username}" + ], + createArtifactStorageRecord: [ + "POST /orgs/{org}/artifacts/metadata/storage-record" + ], + createInvitation: ["POST /orgs/{org}/invitations"], + createIssueType: ["POST /orgs/{org}/issue-types"], + createWebhook: ["POST /orgs/{org}/hooks"], + customPropertiesForOrgsCreateOrUpdateOrganizationValues: [ + "PATCH /organizations/{org}/org-properties/values" + ], + customPropertiesForOrgsGetOrganizationValues: [ + "GET /organizations/{org}/org-properties/values" + ], + customPropertiesForReposCreateOrUpdateOrganizationDefinition: [ + "PUT /orgs/{org}/properties/schema/{custom_property_name}" + ], + customPropertiesForReposCreateOrUpdateOrganizationDefinitions: [ + "PATCH /orgs/{org}/properties/schema" + ], + customPropertiesForReposCreateOrUpdateOrganizationValues: [ + "PATCH /orgs/{org}/properties/values" + ], + customPropertiesForReposDeleteOrganizationDefinition: [ + "DELETE /orgs/{org}/properties/schema/{custom_property_name}" + ], + customPropertiesForReposGetOrganizationDefinition: [ + "GET /orgs/{org}/properties/schema/{custom_property_name}" + ], + customPropertiesForReposGetOrganizationDefinitions: [ + "GET /orgs/{org}/properties/schema" + ], + customPropertiesForReposGetOrganizationValues: [ + "GET /orgs/{org}/properties/values" + ], + delete: ["DELETE /orgs/{org}"], + deleteAttestationsBulk: ["POST /orgs/{org}/attestations/delete-request"], + deleteAttestationsById: [ + "DELETE /orgs/{org}/attestations/{attestation_id}" + ], + deleteAttestationsBySubjectDigest: [ + "DELETE /orgs/{org}/attestations/digest/{subject_digest}" + ], + deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + disableSelectedRepositoryImmutableReleasesOrganization: [ + "DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}" + ], + enableSelectedRepositoryImmutableReleasesOrganization: [ + "PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}" + ], + get: ["GET /orgs/{org}"], + getImmutableReleasesSettings: [ + "GET /orgs/{org}/settings/immutable-releases" + ], + getImmutableReleasesSettingsRepositories: [ + "GET /orgs/{org}/settings/immutable-releases/repositories" + ], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], + getOrgRulesetHistory: ["GET /orgs/{org}/rulesets/{ruleset_id}/history"], + getOrgRulesetVersion: [ + "GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}" + ], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: [ + "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}" + ], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listArtifactStorageRecords: [ + "GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records" + ], + listAttestationRepositories: ["GET /orgs/{org}/attestations/repositories"], + listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"], + listAttestationsBulk: [ + "POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}" + ], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listIssueTypes: ["GET /orgs/{org}/issue-types"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPatGrantRepositories: [ + "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" + ], + listPatGrantRequestRepositories: [ + "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories" + ], + listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"], + listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listSecurityManagerTeams: [ + "GET /orgs/{org}/security-managers", + {}, + { + deprecated: "octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams" + } + ], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: [ + "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" + ], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: [ + "DELETE /orgs/{org}/outside_collaborators/{username}" + ], + removePublicMembershipForAuthenticatedUser: [ + "DELETE /orgs/{org}/public_members/{username}" + ], + removeSecurityManagerTeam: [ + "DELETE /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: "octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team" + } + ], + reviewPatGrantRequest: [ + "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}" + ], + reviewPatGrantRequestsInBulk: [ + "POST /orgs/{org}/personal-access-token-requests" + ], + revokeAllOrgRolesTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" + ], + revokeAllOrgRolesUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}" + ], + revokeOrgRoleTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + revokeOrgRoleUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], + setImmutableReleasesSettings: [ + "PUT /orgs/{org}/settings/immutable-releases" + ], + setImmutableReleasesSettingsRepositories: [ + "PUT /orgs/{org}/settings/immutable-releases/repositories" + ], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: [ + "PUT /orgs/{org}/public_members/{username}" + ], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateIssueType: ["PUT /orgs/{org}/issue-types/{issue_type_id}"], + updateMembershipForAuthenticatedUser: [ + "PATCH /user/memberships/orgs/{org}" + ], + updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"], + updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: [ + "DELETE /user/packages/{package_type}/{package_name}" + ], + deletePackageForOrg: [ + "DELETE /orgs/{org}/packages/{package_type}/{package_name}" + ], + deletePackageForUser: [ + "DELETE /users/{username}/packages/{package_type}/{package_name}" + ], + deletePackageVersionForAuthenticatedUser: [ + "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + deletePackageVersionForOrg: [ + "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + deletePackageVersionForUser: [ + "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getAllPackageVersionsForAPackageOwnedByAnOrg: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", + {}, + { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] } + ], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions", + {}, + { + renamed: [ + "packages", + "getAllPackageVersionsForPackageOwnedByAuthenticatedUser" + ] + } + ], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions" + ], + getAllPackageVersionsForPackageOwnedByOrg: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions" + ], + getAllPackageVersionsForPackageOwnedByUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}/versions" + ], + getPackageForAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}" + ], + getPackageForOrganization: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}" + ], + getPackageForUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}" + ], + getPackageVersionForAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getPackageVersionForOrganization: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getPackageVersionForUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + listDockerMigrationConflictingPackagesForAuthenticatedUser: [ + "GET /user/docker/conflicts" + ], + listDockerMigrationConflictingPackagesForOrganization: [ + "GET /orgs/{org}/docker/conflicts" + ], + listDockerMigrationConflictingPackagesForUser: [ + "GET /users/{username}/docker/conflicts" + ], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: [ + "POST /user/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageForOrg: [ + "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageForUser: [ + "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageVersionForAuthenticatedUser: [ + "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ], + restorePackageVersionForOrg: [ + "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ], + restorePackageVersionForUser: [ + "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ] + }, + privateRegistries: { + createOrgPrivateRegistry: ["POST /orgs/{org}/private-registries"], + deleteOrgPrivateRegistry: [ + "DELETE /orgs/{org}/private-registries/{secret_name}" + ], + getOrgPrivateRegistry: ["GET /orgs/{org}/private-registries/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/private-registries/public-key"], + listOrgPrivateRegistries: ["GET /orgs/{org}/private-registries"], + updateOrgPrivateRegistry: [ + "PATCH /orgs/{org}/private-registries/{secret_name}" + ] + }, + projects: { + addItemForOrg: ["POST /orgs/{org}/projectsV2/{project_number}/items"], + addItemForUser: [ + "POST /users/{username}/projectsV2/{project_number}/items" + ], + deleteItemForOrg: [ + "DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}" + ], + deleteItemForUser: [ + "DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}" + ], + getFieldForOrg: [ + "GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}" + ], + getFieldForUser: [ + "GET /users/{username}/projectsV2/{project_number}/fields/{field_id}" + ], + getForOrg: ["GET /orgs/{org}/projectsV2/{project_number}"], + getForUser: ["GET /users/{username}/projectsV2/{project_number}"], + getOrgItem: ["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], + getUserItem: [ + "GET /users/{username}/projectsV2/{project_number}/items/{item_id}" + ], + listFieldsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields"], + listFieldsForUser: [ + "GET /users/{username}/projectsV2/{project_number}/fields" + ], + listForOrg: ["GET /orgs/{org}/projectsV2"], + listForUser: ["GET /users/{username}/projectsV2"], + listItemsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/items"], + listItemsForUser: [ + "GET /users/{username}/projectsV2/{project_number}/items" + ], + updateItemForOrg: [ + "PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}" + ], + updateItemForUser: [ + "PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}" + ] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies" + ], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments" + ], + deletePendingReview: [ + "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" + ], + deleteReviewComment: [ + "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}" + ], + dismissReview: [ + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals" + ], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" + ], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments" + ], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + listReviewComments: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments" + ], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: [ + "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + requestReviewers: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + submitReview: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events" + ], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: [ + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch" + ], + updateReview: [ + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" + ], + updateReviewComment: [ + "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}" + ] + }, + rateLimit: { get: ["GET /rate_limit"] }, + reactions: { + createForCommitComment: [ + "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions" + ], + createForIssue: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions" + ], + createForIssueComment: [ + "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions" + ], + createForPullRequestReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" + ], + createForRelease: [ + "POST /repos/{owner}/{repo}/releases/{release_id}/reactions" + ], + createForTeamDiscussionCommentInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" + ], + createForTeamDiscussionInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" + ], + deleteForCommitComment: [ + "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForIssue: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}" + ], + deleteForIssueComment: [ + "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForPullRequestComment: [ + "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForRelease: [ + "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}" + ], + deleteForTeamDiscussion: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}" + ], + deleteForTeamDiscussionComment: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}" + ], + listForCommitComment: [ + "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions" + ], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: [ + "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions" + ], + listForPullRequestReviewComment: [ + "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" + ], + listForRelease: [ + "GET /repos/{owner}/{repo}/releases/{release_id}/reactions" + ], + listForTeamDiscussionCommentInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" + ], + listForTeamDiscussionInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" + ] + }, + repos: { + acceptInvitation: [ + "PATCH /user/repository_invitations/{invitation_id}", + {}, + { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] } + ], + acceptInvitationForAuthenticatedUser: [ + "PATCH /user/repository_invitations/{invitation_id}" + ], + addAppAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + addTeamAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + addUserAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], + checkAutomatedSecurityFixes: [ + "GET /repos/{owner}/{repo}/automated-security-fixes" + ], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkImmutableReleases: ["GET /repos/{owner}/{repo}/immutable-releases"], + checkPrivateVulnerabilityReporting: [ + "GET /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + checkVulnerabilityAlerts: [ + "GET /repos/{owner}/{repo}/vulnerability-alerts" + ], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: [ + "GET /repos/{owner}/{repo}/compare/{basehead}" + ], + createAttestation: ["POST /repos/{owner}/{repo}/attestations"], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: [ + "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments" + ], + createCommitSignatureProtection: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentBranchPolicy: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" + ], + createDeploymentProtectionRule: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" + ], + createDeploymentStatus: [ + "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses" + ], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}" + ], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createOrgRuleset: ["POST /orgs/{org}/rulesets"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], + createUsingTemplate: [ + "POST /repos/{template_owner}/{template_repo}/generate" + ], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + customPropertiesForReposCreateOrUpdateRepositoryValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], + customPropertiesForReposGetRepositoryValues: [ + "GET /repos/{owner}/{repo}/properties/values" + ], + declineInvitation: [ + "DELETE /user/repository_invitations/{invitation_id}", + {}, + { renamed: ["repos", "declineInvitationForAuthenticatedUser"] } + ], + declineInvitationForAuthenticatedUser: [ + "DELETE /user/repository_invitations/{invitation_id}" + ], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" + ], + deleteAdminBranchProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + deleteAnEnvironment: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}" + ], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection" + ], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: [ + "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}" + ], + deleteDeploymentBranchPolicy: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: [ + "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}" + ], + deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: [ + "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}" + ], + deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: [ + "DELETE /repos/{owner}/{repo}/automated-security-fixes" + ], + disableDeploymentProtectionRule: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" + ], + disableImmutableReleases: [ + "DELETE /repos/{owner}/{repo}/immutable-releases" + ], + disablePrivateVulnerabilityReporting: [ + "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + disableVulnerabilityAlerts: [ + "DELETE /repos/{owner}/{repo}/vulnerability-alerts" + ], + downloadArchive: [ + "GET /repos/{owner}/{repo}/zipball/{ref}", + {}, + { renamed: ["repos", "downloadZipballArchive"] } + ], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: [ + "PUT /repos/{owner}/{repo}/automated-security-fixes" + ], + enableImmutableReleases: ["PUT /repos/{owner}/{repo}/immutable-releases"], + enablePrivateVulnerabilityReporting: [ + "PUT /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + enableVulnerabilityAlerts: [ + "PUT /repos/{owner}/{repo}/vulnerability-alerts" + ], + generateReleaseNotes: [ + "POST /repos/{owner}/{repo}/releases/generate-notes" + ], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" + ], + getAdminBranchProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + getAllDeploymentProtectionRules: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" + ], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts" + ], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps" + ], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection" + ], + getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: [ + "GET /repos/{owner}/{repo}/collaborators/{username}/permission" + ], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getCustomDeploymentProtectionRule: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" + ], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentBranchPolicy: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + getDeploymentStatus: [ + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}" + ], + getEnvironment: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}" + ], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"], + getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"], + getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"], + getOrgRulesets: ["GET /orgs/{org}/rulesets"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: [ + "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" + ], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getRepoRuleSuite: [ + "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}" + ], + getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], + getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + getRepoRulesetHistory: [ + "GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history" + ], + getRepoRulesetVersion: [ + "GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}" + ], + getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], + getStatusChecksProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + getTeamsWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams" + ], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users" + ], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: [ + "GET /repos/{owner}/{repo}/hooks/{hook_id}/config" + ], + getWebhookDelivery: [ + "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}" + ], + listActivities: ["GET /repos/{owner}/{repo}/activity"], + listAttestations: [ + "GET /repos/{owner}/{repo}/attestations/{subject_digest}" + ], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head" + ], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments" + ], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: [ + "GET /repos/{owner}/{repo}/commits/{ref}/statuses" + ], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listCustomDeploymentRuleIntegrations: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps" + ], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentBranchPolicies: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" + ], + listDeploymentStatuses: [ + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses" + ], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls" + ], + listReleaseAssets: [ + "GET /repos/{owner}/{repo}/releases/{release_id}/assets" + ], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: [ + "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries" + ], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: [ + "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" + ], + removeAppAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + removeCollaborator: [ + "DELETE /repos/{owner}/{repo}/collaborators/{username}" + ], + removeStatusCheckContexts: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + removeStatusCheckProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + removeTeamAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + removeUserAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + setAppAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + setStatusCheckContexts: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + setTeamAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + setUserAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection" + ], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateDeploymentBranchPolicy: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: [ + "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}" + ], + updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"], + updatePullRequestReviewProtection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: [ + "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}" + ], + updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + updateStatusCheckPotection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", + {}, + { renamed: ["repos", "updateStatusCheckProtection"] } + ], + updateStatusCheckProtection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: [ + "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config" + ], + uploadReleaseAsset: [ + "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", + { baseUrl: "https://uploads.github.com" } + ] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + createPushProtectionBypass: [ + "POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses" + ], + getAlert: [ + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" + ], + getScanHistory: ["GET /repos/{owner}/{repo}/secret-scanning/scan-history"], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: [ + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations" + ], + listOrgPatternConfigs: [ + "GET /orgs/{org}/secret-scanning/pattern-configurations" + ], + updateAlert: [ + "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" + ], + updateOrgPatternConfigs: [ + "PATCH /orgs/{org}/secret-scanning/pattern-configurations" + ] + }, + securityAdvisories: { + createFork: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" + ], + createPrivateVulnerabilityReport: [ + "POST /repos/{owner}/{repo}/security-advisories/reports" + ], + createRepositoryAdvisory: [ + "POST /repos/{owner}/{repo}/security-advisories" + ], + createRepositoryAdvisoryCveRequest: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve" + ], + getGlobalAdvisory: ["GET /advisories/{ghsa_id}"], + getRepositoryAdvisory: [ + "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}" + ], + listGlobalAdvisories: ["GET /advisories"], + listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"], + listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"], + updateRepositoryAdvisory: [ + "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}" + ] + }, + teams: { + addOrUpdateMembershipForUserInOrg: [ + "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}" + ], + addOrUpdateRepoPermissionsInOrg: [ + "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" + ], + checkPermissionsForRepoInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" + ], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" + ], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + deleteDiscussionInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" + ], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + getDiscussionInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" + ], + getMembershipForUserInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/memberships/{username}" + ], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" + ], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/invitations" + ], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}" + ], + removeRepoInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" + ], + updateDiscussionCommentInOrg: [ + "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + updateDiscussionInOrg: [ + "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" + ], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: [ + "POST /user/emails", + {}, + { renamed: ["users", "addEmailForAuthenticatedUser"] } + ], + addEmailForAuthenticatedUser: ["POST /user/emails"], + addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: [ + "POST /user/gpg_keys", + {}, + { renamed: ["users", "createGpgKeyForAuthenticatedUser"] } + ], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: [ + "POST /user/keys", + {}, + { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] } + ], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"], + deleteAttestationsBulk: [ + "POST /users/{username}/attestations/delete-request" + ], + deleteAttestationsById: [ + "DELETE /users/{username}/attestations/{attestation_id}" + ], + deleteAttestationsBySubjectDigest: [ + "DELETE /users/{username}/attestations/digest/{subject_digest}" + ], + deleteEmailForAuthenticated: [ + "DELETE /user/emails", + {}, + { renamed: ["users", "deleteEmailForAuthenticatedUser"] } + ], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: [ + "DELETE /user/gpg_keys/{gpg_key_id}", + {}, + { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] } + ], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: [ + "DELETE /user/keys/{key_id}", + {}, + { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] } + ], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"], + deleteSshSigningKeyForAuthenticatedUser: [ + "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}" + ], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getById: ["GET /user/{account_id}"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: [ + "GET /user/gpg_keys/{gpg_key_id}", + {}, + { renamed: ["users", "getGpgKeyForAuthenticatedUser"] } + ], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: [ + "GET /user/keys/{key_id}", + {}, + { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] } + ], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + getSshSigningKeyForAuthenticatedUser: [ + "GET /user/ssh_signing_keys/{ssh_signing_key_id}" + ], + list: ["GET /users"], + listAttestations: ["GET /users/{username}/attestations/{subject_digest}"], + listAttestationsBulk: [ + "POST /users/{username}/attestations/bulk-list{?per_page,before,after}" + ], + listBlockedByAuthenticated: [ + "GET /user/blocks", + {}, + { renamed: ["users", "listBlockedByAuthenticatedUser"] } + ], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: [ + "GET /user/emails", + {}, + { renamed: ["users", "listEmailsForAuthenticatedUser"] } + ], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: [ + "GET /user/following", + {}, + { renamed: ["users", "listFollowedByAuthenticatedUser"] } + ], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: [ + "GET /user/gpg_keys", + {}, + { renamed: ["users", "listGpgKeysForAuthenticatedUser"] } + ], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: [ + "GET /user/public_emails", + {}, + { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] } + ], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: [ + "GET /user/keys", + {}, + { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] } + ], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"], + listSocialAccountsForUser: ["GET /users/{username}/social_accounts"], + listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"], + listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"], + setPrimaryEmailVisibilityForAuthenticated: [ + "PATCH /user/email/visibility", + {}, + { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] } + ], + setPrimaryEmailVisibilityForAuthenticatedUser: [ + "PATCH /user/email/visibility" + ], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; +var endpoints_default = Endpoints; + +const endpointMethodsMap = /* @__PURE__ */ new Map(); +for (const [scope, endpoints] of Object.entries(endpoints_default)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign( + { + method, + url + }, + defaults + ); + if (!endpointMethodsMap.has(scope)) { + endpointMethodsMap.set(scope, /* @__PURE__ */ new Map()); + } + endpointMethodsMap.get(scope).set(methodName, { + scope, + methodName, + endpointDefaults, + decorations + }); + } +} +const handler = { + has({ scope }, methodName) { + return endpointMethodsMap.get(scope).has(methodName); + }, + getOwnPropertyDescriptor(target, methodName) { + return { + value: this.get(target, methodName), + // ensures method is in the cache + configurable: true, + writable: true, + enumerable: true + }; + }, + defineProperty(target, methodName, descriptor) { + Object.defineProperty(target.cache, methodName, descriptor); + return true; + }, + deleteProperty(target, methodName) { + delete target.cache[methodName]; + return true; + }, + ownKeys({ scope }) { + return [...endpointMethodsMap.get(scope).keys()]; + }, + set(target, methodName, value) { + return target.cache[methodName] = value; + }, + get({ octokit, scope, cache }, methodName) { + if (cache[methodName]) { + return cache[methodName]; + } + const method = endpointMethodsMap.get(scope).get(methodName); + if (!method) { + return void 0; + } + const { endpointDefaults, decorations } = method; + if (decorations) { + cache[methodName] = decorate( + octokit, + scope, + methodName, + endpointDefaults, + decorations + ); + } else { + cache[methodName] = octokit.request.defaults(endpointDefaults); + } + return cache[methodName]; + } +}; +function endpointsToMethods(octokit) { + const newMethods = {}; + for (const scope of endpointMethodsMap.keys()) { + newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); + } + return newMethods; +} +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + function withDecorations(...args) { + let options = requestWithDefaults.endpoint.merge(...args); + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: void 0 + }); + return requestWithDefaults(options); + } + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn( + `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()` + ); + } + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + if (decorations.renamedParameters) { + const options2 = requestWithDefaults.endpoint.merge(...args); + for (const [name, alias] of Object.entries( + decorations.renamedParameters + )) { + if (name in options2) { + octokit.log.warn( + `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead` + ); + if (!(alias in options2)) { + options2[alias] = options2[name]; + } + delete options2[name]; + } + } + return requestWithDefaults(options2); + } + return requestWithDefaults(...args); + } + return Object.assign(withDecorations, requestWithDefaults); +} + +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION$1; + +// pkg/dist-src/version.js +var VERSION = "0.0.0-development"; + +// pkg/dist-src/normalize-paginated-list-response.js +function normalizePaginatedListResponse(response) { + if (!response.data) { + return { + ...response, + data: [] + }; + } + const responseNeedsNormalization = ("total_count" in response.data || "total_commits" in response.data) && !("url" in response.data); + if (!responseNeedsNormalization) return response; + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + const totalCommits = response.data.total_commits; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + delete response.data.total_commits; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + response.data.total_count = totalCount; + response.data.total_commits = totalCommits; + return response; +} + +// pkg/dist-src/iterator.js +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { done: true }; + try { + const response = await requestMethod({ method, url, headers }); + const normalizedResponse = normalizePaginatedListResponse(response); + url = ((normalizedResponse.headers.link || "").match( + /<([^<>]+)>;\s*rel="next"/ + ) || [])[1]; + if (!url && "total_commits" in normalizedResponse.data) { + const parsedUrl = new URL(normalizedResponse.url); + const params = parsedUrl.searchParams; + const page = parseInt(params.get("page") || "1", 10); + const per_page = parseInt(params.get("per_page") || "250", 10); + if (page * per_page < normalizedResponse.data.total_commits) { + params.set("page", String(page + 1)); + url = parsedUrl.toString(); + } + } + return { value: normalizedResponse }; + } catch (error) { + if (error.status !== 409) throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + }) + }; +} + +// pkg/dist-src/paginate.js +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = void 0; + } + return gather( + octokit, + [], + iterator(octokit, route, parameters)[Symbol.asyncIterator](), + mapFn + ); +} +function gather(octokit, results, iterator2, mapFn) { + return iterator2.next().then((result) => { + if (result.done) { + return results; + } + let earlyExit = false; + function done() { + earlyExit = true; + } + results = results.concat( + mapFn ? mapFn(result.value, done) : result.value.data + ); + if (earlyExit) { + return results; + } + return gather(octokit, results, iterator2, mapFn); + }); +} + +// pkg/dist-src/compose-paginate.js +Object.assign(paginate, { + iterator +}); + +// pkg/dist-src/index.js +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; } +paginateRest.VERSION = VERSION; + +new Context(); +const baseUrl = getApiBaseUrl(); +const defaults = { + baseUrl, + request: { + agent: getProxyAgent(baseUrl), + fetch: getProxyFetch(baseUrl) + } +}; +const GitHub = Octokit.plugin(restEndpointMethods, paginateRest).defaults(defaults); + +new Context(); + +var toolCache = {}; + +var manifest$1 = {exports: {}}; + +var semver$1 = {exports: {}}; + +var hasRequiredSemver$1; + +function requireSemver$1 () { + if (hasRequiredSemver$1) return semver$1.exports; + hasRequiredSemver$1 = 1; + (function (module, exports$1) { + exports$1 = module.exports = SemVer; + + var debug; + /* istanbul ignore next */ + if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0); + args.unshift('SEMVER'); + console.log.apply(console, args); + }; + } else { + debug = function () {}; + } + + // Note: this is the semver.org version of the spec that it implements + // Not necessarily the package version of this code. + exports$1.SEMVER_SPEC_VERSION = '2.0.0'; + + var MAX_LENGTH = 256; + var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991; + + // Max safe segment length for coercion. + var MAX_SAFE_COMPONENT_LENGTH = 16; + + var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6; + + // The actual regexps go on exports.re + var re = exports$1.re = []; + var safeRe = exports$1.safeRe = []; + var src = exports$1.src = []; + var t = exports$1.tokens = {}; + var R = 0; + + function tok (n) { + t[n] = R++; + } + + var LETTERDASHNUMBER = '[a-zA-Z0-9-]'; + + // Replace some greedy regex tokens to prevent regex dos issues. These regex are + // used internally via the safeRe object since all inputs in this library get + // normalized first to trim and collapse all extra whitespace. The original + // regexes are exported for userland consumption and lower level usage. A + // future breaking change could export the safer regex only with a note that + // all input should have extra whitespace removed. + var safeRegexReplacements = [ + ['\\s', 1], + ['\\d', MAX_LENGTH], + [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], + ]; + + function makeSafeRe (value) { + for (var i = 0; i < safeRegexReplacements.length; i++) { + var token = safeRegexReplacements[i][0]; + var max = safeRegexReplacements[i][1]; + value = value + .split(token + '*').join(token + '{0,' + max + '}') + .split(token + '+').join(token + '{1,' + max + '}'); + } + return value + } + + // The following Regular Expressions can be used for tokenizing, + // validating, and parsing SemVer version strings. + + // ## Numeric Identifier + // A single `0`, or a non-zero digit followed by zero or more digits. + + tok('NUMERICIDENTIFIER'); + src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'; + tok('NUMERICIDENTIFIERLOOSE'); + src[t.NUMERICIDENTIFIERLOOSE] = '\\d+'; + + // ## Non-numeric Identifier + // Zero or more digits, followed by a letter or hyphen, and then zero or + // more letters, digits, or hyphens. + + tok('NONNUMERICIDENTIFIER'); + src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*'; + + // ## Main Version + // Three dot-separated numeric identifiers. + + tok('MAINVERSION'); + src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + + '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + + '(' + src[t.NUMERICIDENTIFIER] + ')'; + + tok('MAINVERSIONLOOSE'); + src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'; + + // ## Pre-release Version Identifier + // A numeric identifier, or a non-numeric identifier. + + tok('PRERELEASEIDENTIFIER'); + src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] + + '|' + src[t.NONNUMERICIDENTIFIER] + ')'; + + tok('PRERELEASEIDENTIFIERLOOSE'); + src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] + + '|' + src[t.NONNUMERICIDENTIFIER] + ')'; + + // ## Pre-release Version + // Hyphen, followed by one or more dot-separated pre-release version + // identifiers. + + tok('PRERELEASE'); + src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] + + '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'; + + tok('PRERELEASELOOSE'); + src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'; + + // ## Build Metadata Identifier + // Any combination of digits, letters, or hyphens. + + tok('BUILDIDENTIFIER'); + src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+'; + + // ## Build Metadata + // Plus sign, followed by one or more period-separated build metadata + // identifiers. + + tok('BUILD'); + src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] + + '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'; + + // ## Full Version String + // A main version, followed optionally by a pre-release version and + // build metadata. + + // Note that the only major, minor, patch, and pre-release sections of + // the version string are capturing groups. The build metadata is not a + // capturing group, because it should not ever be used in version + // comparison. + + tok('FULL'); + tok('FULLPLAIN'); + src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] + + src[t.PRERELEASE] + '?' + + src[t.BUILD] + '?'; + + src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'; + + // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. + // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty + // common in the npm registry. + tok('LOOSEPLAIN'); + src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] + + src[t.PRERELEASELOOSE] + '?' + + src[t.BUILD] + '?'; + + tok('LOOSE'); + src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'; + + tok('GTLT'); + src[t.GTLT] = '((?:<|>)?=?)'; + + // Something like "2.*" or "1.2.x". + // Note that "x.x" is a valid xRange identifer, meaning "any version" + // Only the first item is strictly required. + tok('XRANGEIDENTIFIERLOOSE'); + src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; + tok('XRANGEIDENTIFIER'); + src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'; + + tok('XRANGEPLAIN'); + src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + + '(?:' + src[t.PRERELEASE] + ')?' + + src[t.BUILD] + '?' + + ')?)?'; + + tok('XRANGEPLAINLOOSE'); + src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[t.PRERELEASELOOSE] + ')?' + + src[t.BUILD] + '?' + + ')?)?'; + + tok('XRANGE'); + src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'; + tok('XRANGELOOSE'); + src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'; + + // Coercion. + // Extract anything that could conceivably be a part of a valid semver + tok('COERCE'); + src[t.COERCE] = '(^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])'; + tok('COERCERTL'); + re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g'); + safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g'); + + // Tilde ranges. + // Meaning is "reasonably at or greater than" + tok('LONETILDE'); + src[t.LONETILDE] = '(?:~>?)'; + + tok('TILDETRIM'); + src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'; + re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g'); + safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g'); + var tildeTrimReplace = '$1~'; + + tok('TILDE'); + src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'; + tok('TILDELOOSE'); + src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'; + + // Caret ranges. + // Meaning is "at least and backwards compatible with" + tok('LONECARET'); + src[t.LONECARET] = '(?:\\^)'; + + tok('CARETTRIM'); + src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'; + re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g'); + safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g'); + var caretTrimReplace = '$1^'; + + tok('CARET'); + src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'; + tok('CARETLOOSE'); + src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'; + + // A simple gt/lt/eq thing, or just "" to indicate "any version" + tok('COMPARATORLOOSE'); + src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'; + tok('COMPARATOR'); + src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'; + + // An expression to strip any whitespace between the gtlt and the thing + // it modifies, so that `> 1.2.3` ==> `>1.2.3` + tok('COMPARATORTRIM'); + src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] + + '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'; + + // this one has to use the /g flag + re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g'); + safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g'); + var comparatorTrimReplace = '$1$2$3'; + + // Something like `1.2.3 - 1.2.4` + // Note that these all use the loose form, because they'll be + // checked against either the strict or loose comparator form + // later. + tok('HYPHENRANGE'); + src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[t.XRANGEPLAIN] + ')' + + '\\s*$'; + + tok('HYPHENRANGELOOSE'); + src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[t.XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + + // Star ranges basically just allow anything at all. + tok('STAR'); + src[t.STAR] = '(<|>)?=?\\s*\\*'; + + // Compile to actual regexp objects. + // All are flag-free, unless they were created above with a flag. + for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) { + re[i] = new RegExp(src[i]); + + // Replace all greedy whitespace to prevent regex dos issues. These regex are + // used internally via the safeRe object since all inputs in this library get + // normalized first to trim and collapse all extra whitespace. The original + // regexes are exported for userland consumption and lower level usage. A + // future breaking change could export the safer regex only with a note that + // all input should have extra whitespace removed. + safeRe[i] = new RegExp(makeSafeRe(src[i])); + } + } + + exports$1.parse = parse; + function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + }; + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]; + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } + } + + exports$1.valid = valid; + function valid (version, options) { + var v = parse(version, options); + return v ? v.version : null + } + + exports$1.clean = clean; + function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options); + return s ? s.version : null + } + + exports$1.SemVer = SemVer; + + function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + }; + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version; + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options); + this.options = options; + this.loose = !!options.loose; + + var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]); + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = []; + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id; + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }); + } + + this.build = m[5] ? m[5].split('.') : []; + this.format(); + } + + SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.'); + } + return this.version + }; + + SemVer.prototype.toString = function () { + return this.version + }; + + SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other); + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options); + } + + return this.compareMain(other) || this.comparePre(other) + }; + + SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options); + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) + }; + + SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options); + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + }; + + SemVer.prototype.compareBuild = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options); + } + + var i = 0; + do { + var a = this.build[i]; + var b = other.build[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + }; + + // preminor will bump the version up to the next minor release, and immediately + // down to pre-release. premajor and prepatch work the same way. + SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; + this.inc('pre', identifier); + break + case 'preminor': + this.prerelease.length = 0; + this.patch = 0; + this.minor++; + this.inc('pre', identifier); + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch', identifier); + this.inc('pre', identifier); + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier); + } + this.inc('pre', identifier); + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++; + } + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++; + } + this.patch = 0; + this.prerelease = []; + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++; + } + this.prerelease = []; + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0]; + } else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0); + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0]; + } + } else { + this.prerelease = [identifier, 0]; + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format(); + this.raw = this.version; + return this + }; + + exports$1.inc = inc; + function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose; + loose = undefined; + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } + } + + exports$1.diff = diff; + function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1); + var v2 = parse(version2); + var prefix = ''; + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre'; + var defaultResult = 'prerelease'; + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } + } + + exports$1.compareIdentifiers = compareIdentifiers; + + var numeric = /^[0-9]+$/; + function compareIdentifiers (a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 + } + + exports$1.rcompareIdentifiers = rcompareIdentifiers; + function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) + } + + exports$1.major = major; + function major (a, loose) { + return new SemVer(a, loose).major + } + + exports$1.minor = minor; + function minor (a, loose) { + return new SemVer(a, loose).minor + } + + exports$1.patch = patch; + function patch (a, loose) { + return new SemVer(a, loose).patch + } + + exports$1.compare = compare; + function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) + } + + exports$1.compareLoose = compareLoose; + function compareLoose (a, b) { + return compare(a, b, true) + } + + exports$1.compareBuild = compareBuild; + function compareBuild (a, b, loose) { + var versionA = new SemVer(a, loose); + var versionB = new SemVer(b, loose); + return versionA.compare(versionB) || versionA.compareBuild(versionB) + } + + exports$1.rcompare = rcompare; + function rcompare (a, b, loose) { + return compare(b, a, loose) + } + + exports$1.sort = sort; + function sort (list, loose) { + return list.sort(function (a, b) { + return exports$1.compareBuild(a, b, loose) + }) + } + + exports$1.rsort = rsort; + function rsort (list, loose) { + return list.sort(function (a, b) { + return exports$1.compareBuild(b, a, loose) + }) + } + + exports$1.gt = gt; + function gt (a, b, loose) { + return compare(a, b, loose) > 0 + } + + exports$1.lt = lt; + function lt (a, b, loose) { + return compare(a, b, loose) < 0 + } + + exports$1.eq = eq; + function eq (a, b, loose) { + return compare(a, b, loose) === 0 + } + + exports$1.neq = neq; + function neq (a, b, loose) { + return compare(a, b, loose) !== 0 + } + + exports$1.gte = gte; + function gte (a, b, loose) { + return compare(a, b, loose) >= 0 + } + + exports$1.lte = lte; + function lte (a, b, loose) { + return compare(a, b, loose) <= 0 + } + + exports$1.cmp = cmp; + function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version; + if (typeof b === 'object') + b = b.version; + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version; + if (typeof b === 'object') + b = b.version; + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } + } + + exports$1.Comparator = Comparator; + function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + }; + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value; + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + comp = comp.trim().split(/\s+/).join(' '); + debug('comparator', comp, options); + this.options = options; + this.loose = !!options.loose; + this.parse(comp); + + if (this.semver === ANY) { + this.value = ''; + } else { + this.value = this.operator + this.semver.version; + } + + debug('comp', this); + } + + var ANY = {}; + Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]; + var m = comp.match(r); + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] !== undefined ? m[1] : ''; + if (this.operator === '=') { + this.operator = ''; + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY; + } else { + this.semver = new SemVer(m[2], this.options.loose); + } + }; + + Comparator.prototype.toString = function () { + return this.value + }; + + Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose); + + if (this.semver === ANY || version === ANY) { + return true + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options); + } catch (er) { + return false + } + } + + return cmp(version, this.operator, this.semver, this.options) + }; + + Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + }; + } + + var rangeTmp; + + if (this.operator === '') { + if (this.value === '') { + return true + } + rangeTmp = new Range(comp.value, options); + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + if (comp.value === '') { + return true + } + rangeTmp = new Range(this.value, options); + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>'); + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<'); + var sameSemVer = this.semver.version === comp.semver.version; + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<='); + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')); + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')); + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan + }; + + exports$1.Range = Range; + function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + }; + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options; + this.loose = !!options.loose; + this.includePrerelease = !!options.includePrerelease; + + // First reduce all whitespace as much as possible so we do not have to rely + // on potentially slow regexes like \s*. This is then stored and used for + // future error messages as well. + this.raw = range + .trim() + .split(/\s+/) + .join(' '); + + // First, split based on boolean or || + this.set = this.raw.split('||').map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + this.raw) + } + + this.format(); + } + + Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim(); + return this.range + }; + + Range.prototype.toString = function () { + return this.range + }; + + Range.prototype.parseRange = function (range) { + var loose = this.options.loose; + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, safeRe[t.COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]; + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/); + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }); + } + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this); + + return set + }; + + Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some(function (thisComparators) { + return ( + isSatisfiable(thisComparators, options) && + range.set.some(function (rangeComparators) { + return ( + isSatisfiable(rangeComparators, options) && + thisComparators.every(function (thisComparator) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + ) + }) + ) + }) + }; + + // take a set of comparators and determine whether there + // exists a version which can satisfy it + function isSatisfiable (comparators, options) { + var result = true; + var remainingComparators = comparators.slice(); + var testComparator = remainingComparators.pop(); + + while (result && remainingComparators.length) { + result = remainingComparators.every(function (otherComparator) { + return testComparator.intersects(otherComparator, options) + }); + + testComparator = remainingComparators.pop(); + } + + return result + } + + // Mostly just for testing and legacy API reasons + exports$1.toComparators = toComparators; + function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) + } + + // comprised of xranges, tildes, stars, and gtlt's at this point. + // already replaced the hyphen ranges + // turn into a set of JUST comparators. + function parseComparator (comp, options) { + debug('comp', comp, options); + comp = replaceCarets(comp, options); + debug('caret', comp); + comp = replaceTildes(comp, options); + debug('tildes', comp); + comp = replaceXRanges(comp, options); + debug('xrange', comp); + comp = replaceStars(comp, options); + debug('stars', comp); + return comp + } + + function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' + } + + // ~, ~> --> * (any, kinda silly) + // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 + // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 + // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 + // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 + // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 + function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') + } + + function replaceTilde (comp, options) { + var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE]; + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) { + ret = ''; + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } else if (pr) { + debug('replaceTilde pr', pr); + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } -var auth = {}; + debug('tilde return', ret); + return ret + }) + } -var hasRequiredAuth; + // ^ --> * (any, kinda silly) + // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 + // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 + // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 + // ^1.2.3 --> >=1.2.3 <2.0.0 + // ^1.2.0 --> >=1.2.0 <2.0.0 + function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') + } -function requireAuth () { - if (hasRequiredAuth) return auth; - hasRequiredAuth = 1; - var __awaiter = (auth && auth.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(auth, "__esModule", { value: true }); - auth.PersonalAccessTokenCredentialHandler = auth.BearerCredentialHandler = auth.BasicCredentialHandler = void 0; - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } - } - auth.BasicCredentialHandler = BasicCredentialHandler; - class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Bearer ${this.token}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } - } - auth.BearerCredentialHandler = BearerCredentialHandler; - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } - } - auth.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - - return auth; -} + function replaceCaret (comp, options) { + debug('caret', comp, options); + var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET]; + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; -var hasRequiredOidcUtils; + if (isX(M)) { + ret = ''; + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; + } + } else if (pr) { + debug('replaceCaret pr', pr); + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1); + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0'; + } + } else { + debug('no pr'); + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; + } + } -function requireOidcUtils () { - if (hasRequiredOidcUtils) return oidcUtils; - hasRequiredOidcUtils = 1; - var __awaiter = (oidcUtils && oidcUtils.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(oidcUtils, "__esModule", { value: true }); - oidcUtils.OidcClient = void 0; - const http_client_1 = requireLib(); - const auth_1 = requireAuth(); - const core_1 = requireCore(); - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; - if (!token) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); - } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; - if (!runtimeUrl) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); - } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient - .getJson(id_token_url) - .catch(error => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n - Error Message: ${error.message}`); - }); - const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; - if (!id_token) { - throw new Error('Response json body do not have ID Token field'); - } - return id_token; - }); - } - static getIDToken(audience) { - return __awaiter(this, void 0, void 0, function* () { - try { - // New ID Token is requested from action service - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - (0, core_1.debug)(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - (0, core_1.setSecret)(id_token); - return id_token; - } - catch (error) { - throw new Error(`Error message: ${error.message}`); - } - }); - } - } - oidcUtils.OidcClient = OidcClient; - - return oidcUtils; -} + debug('caret return', ret); + return ret + }) + } -var summary = {}; + function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options); + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') + } -var hasRequiredSummary; + function replaceXRange (comp, options) { + comp = comp.trim(); + var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE]; + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; -function requireSummary () { - if (hasRequiredSummary) return summary; - hasRequiredSummary = 1; - (function (exports$1) { - var __awaiter = (summary && summary.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.summary = exports$1.markdownSummary = exports$1.SUMMARY_DOCS_URL = exports$1.SUMMARY_ENV_VAR = void 0; - const os_1 = require$$0$5; - const fs_1 = fs__default; - const { access, appendFile, writeFile } = fs_1.promises; - exports$1.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; - exports$1.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; - class Summary { - constructor() { - this._buffer = ''; - } - /** - * Finds the summary file path from the environment, rejects if env var is not found or file does not exist - * Also checks r/w permissions. - * - * @returns step summary file path - */ - filePath() { - return __awaiter(this, void 0, void 0, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports$1.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for $${exports$1.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } - catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); + if (gtlt === '=' && anyX) { + gtlt = ''; } - /** - * Wraps content in an HTML tag, adding any HTML attributes - * - * @param {string} tag HTML tag to wrap - * @param {string | null} content content within the tag - * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add - * - * @returns {string} content wrapped in HTML element - */ - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs) - .map(([key, value]) => ` ${key}="${value}"`) - .join(''); - if (!content) { - return `<${tag}${htmlAttrs}>`; + + // if we're including prereleases in the match, then we need + // to fix this to -0, the lowest possible prerelease value + pr = options.includePrerelease ? '-0' : ''; + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0-0'; + } else { + // nothing is forbidden + ret = '*'; + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0; + } + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>='; + if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else { + m = +m + 1; + p = 0; } - return `<${tag}${htmlAttrs}>${content}`; - } - /** - * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. - * - * @param {SummaryWriteOptions} [options] (optional) options for write operation - * - * @returns {Promise} summary instance - */ - write(options) { - return __awaiter(this, void 0, void 0, function* () { - const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); - return this.emptyBuffer(); - }); - } - /** - * Clears the summary buffer and wipes the summary file - * - * @returns {Summary} summary instance - */ - clear() { - return __awaiter(this, void 0, void 0, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - /** - * Returns the current summary buffer as a string - * - * @returns {string} string of summary buffer - */ - stringify() { - return this._buffer; - } - /** - * If the summary buffer is empty - * - * @returns {boolen} true if the buffer is empty - */ - isEmptyBuffer() { - return this._buffer.length === 0; - } - /** - * Resets the summary buffer without writing to summary file - * - * @returns {Summary} summary instance - */ - emptyBuffer() { - this._buffer = ''; - return this; - } - /** - * Adds raw text to the summary buffer - * - * @param {string} text content to add - * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) - * - * @returns {Summary} summary instance - */ - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; - } - /** - * Adds the operating system-specific end-of-line marker to the buffer - * - * @returns {Summary} summary instance - */ - addEOL() { - return this.addRaw(os_1.EOL); - } - /** - * Adds an HTML codeblock to the summary buffer - * - * @param {string} code content to render within fenced code block - * @param {string} lang (optional) language to syntax highlight code - * - * @returns {Summary} summary instance - */ - addCodeBlock(code, lang) { - const attrs = Object.assign({}, (lang && { lang })); - const element = this.wrap('pre', this.wrap('code', code), attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML list to the summary buffer - * - * @param {string[]} items list of items to render - * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) - * - * @returns {Summary} summary instance - */ - addList(items, ordered = false) { - const tag = ordered ? 'ol' : 'ul'; - const listItems = items.map(item => this.wrap('li', item)).join(''); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<'; + if (xm) { + M = +M + 1; + } else { + m = +m + 1; + } + } + + ret = gtlt + M + '.' + m + '.' + p + pr; + } else if (xm) { + ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + pr; } - /** - * Adds an HTML table to the summary buffer - * - * @param {SummaryTableCell[]} rows table rows - * - * @returns {Summary} summary instance - */ - addTable(rows) { - const tableBody = rows - .map(row => { - const cells = row - .map(cell => { - if (typeof cell === 'string') { - return this.wrap('td', cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? 'th' : 'td'; - const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); - return this.wrap(tag, data, attrs); - }) - .join(''); - return this.wrap('tr', cells); - }) - .join(''); - const element = this.wrap('table', tableBody); - return this.addRaw(element).addEOL(); + + debug('xRange return', ret); + + return ret + }) + } + + // Because * is AND-ed with everything else in the comparator, + // and '' means "any version", just remove the *s entirely. + function replaceStars (comp, options) { + debug('replaceStars', comp, options); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(safeRe[t.STAR], '') + } + + // This function is passed to string.replace(re[t.HYPHENRANGE]) + // M, m, patch, prerelease, build + // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 + // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do + // 1.2 - 3.4 => >=1.2.0 <3.5.0 + function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = ''; + } else if (isX(fm)) { + from = '>=' + fM + '.0.0'; + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0'; + } else { + from = '>=' + from; + } + + if (isX(tM)) { + to = ''; + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0'; + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0'; + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + } else { + to = '<=' + to; + } + + return (from + ' ' + to).trim() + } + + // if ANY of the sets match ALL of its comparators, then pass + Range.prototype.test = function (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options); + } catch (er) { + return false } - /** - * Adds a collapsable HTML details element to the summary buffer - * - * @param {string} label text for the closed state - * @param {string} content collapsable content - * - * @returns {Summary} summary instance - */ - addDetails(label, content) { - const element = this.wrap('details', this.wrap('summary', label) + content); - return this.addRaw(element).addEOL(); + } + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true } - /** - * Adds an HTML image tag to the summary buffer - * - * @param {string} src path to the image you to embed - * @param {string} alt text description of the image - * @param {SummaryImageOptions} options (optional) addition image attributes - * - * @returns {Summary} summary instance - */ - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); - const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); + } + return false + }; + + function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false } - /** - * Adds an HTML section heading element - * - * @param {string} text heading text - * @param {number | string} [level=1] (optional) the heading level, default: 1 - * - * @returns {Summary} summary instance - */ - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) - ? tag - : 'h1'; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } } - /** - * Adds an HTML thematic break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap('hr', null); - return this.addRaw(element).addEOL(); + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true + } + + exports$1.satisfies = satisfies; + function satisfies (version, range, options) { + try { + range = new Range(range, options); + } catch (er) { + return false + } + return range.test(version) + } + + exports$1.maxSatisfying = maxSatisfying; + function maxSatisfying (versions, range, options) { + var max = null; + var maxSV = null; + try { + var rangeObj = new Range(range, options); + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v; + maxSV = new SemVer(max, options); + } } - /** - * Adds an HTML line break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap('br', null); - return this.addRaw(element).addEOL(); + }); + return max + } + + exports$1.minSatisfying = minSatisfying; + function minSatisfying (versions, range, options) { + var min = null; + var minSV = null; + try { + var rangeObj = new Range(range, options); + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v; + minSV = new SemVer(min, options); + } } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, (cite && { cite })); - const element = this.wrap('blockquote', text, attrs); - return this.addRaw(element).addEOL(); + }); + return min + } + + exports$1.minVersion = minVersion; + function minVersion (range, loose) { + range = new Range(range, loose); + + var minver = new SemVer('0.0.0'); + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0'); + if (range.test(minver)) { + return minver + } + + minver = null; + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version); + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++; + } else { + compver.prerelease.push(0); + } + compver.raw = compver.format(); + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver; + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }); + } + + if (minver && range.test(minver)) { + return minver + } + + return null + } + + exports$1.validRange = validRange; + function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } + } + + // Determine if version is less than all the versions possible in the range + exports$1.ltr = ltr; + function ltr (version, range, options) { + return outside(version, range, '<', options) + } + + // Determine if version is greater than all the versions possible in the range. + exports$1.gtr = gtr; + function gtr (version, range, options) { + return outside(version, range, '>', options) + } + + exports$1.outside = outside; + function outside (version, range, hilo, options) { + version = new SemVer(version, options); + range = new Range(range, options); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0'); + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap('a', text, { href }); - return this.addRaw(element).addEOL(); + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false } + } + return true } - const _summary = new Summary(); - /** - * @deprecated use `core.summary` - */ - exports$1.markdownSummary = _summary; - exports$1.summary = _summary; - - } (summary)); - return summary; -} -var pathUtils = {}; + exports$1.prerelease = prerelease; + function prerelease (version, options) { + var parsed = parse(version, options); + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null + } -var hasRequiredPathUtils; + exports$1.intersects = intersects; + function intersects (r1, r2, options) { + r1 = new Range(r1, options); + r2 = new Range(r2, options); + return r1.intersects(r2) + } -function requirePathUtils () { - if (hasRequiredPathUtils) return pathUtils; - hasRequiredPathUtils = 1; - var __createBinding = (pathUtils && pathUtils.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (pathUtils && pathUtils.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (pathUtils && pathUtils.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(pathUtils, "__esModule", { value: true }); - pathUtils.toPlatformPath = pathUtils.toWin32Path = pathUtils.toPosixPath = void 0; - const path = __importStar(require$$1__default); - /** - * toPosixPath converts the given path to the posix form. On Windows, \\ will be - * replaced with /. - * - * @param pth. Path to transform. - * @return string Posix path. - */ - function toPosixPath(pth) { - return pth.replace(/[\\]/g, '/'); - } - pathUtils.toPosixPath = toPosixPath; - /** - * toWin32Path converts the given path to the win32 form. On Linux, / will be - * replaced with \\. - * - * @param pth. Path to transform. - * @return string Win32 path. - */ - function toWin32Path(pth) { - return pth.replace(/[/]/g, '\\'); - } - pathUtils.toWin32Path = toWin32Path; - /** - * toPlatformPath converts the given path to a platform-specific path. It does - * this by replacing instances of / and \ with the platform-specific path - * separator. - * - * @param pth The path to platformize. - * @return string The platform-specific path. - */ - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - pathUtils.toPlatformPath = toPlatformPath; - - return pathUtils; -} + exports$1.coerce = coerce; + function coerce (version, options) { + if (version instanceof SemVer) { + return version + } -var platform = {}; + if (typeof version === 'number') { + version = String(version); + } -var exec = {}; + if (typeof version !== 'string') { + return null + } -var toolrunner = {}; + options = options || {}; -var io = {}; + var match = null; + if (!options.rtl) { + match = version.match(safeRe[t.COERCE]); + } else { + // Find the right-most coercible string that does not share + // a terminus with a more left-ward coercible string. + // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' + // + // Walk through the string checking with a /g regexp + // Manually set the index so as to pick up overlapping matches. + // Stop when we get a match that ends at the string end, since no + // coercible string can be more right-ward without the same terminus. + var next; + while ((next = safeRe[t.COERCERTL].exec(version)) && + (!match || match.index + match[0].length !== version.length) + ) { + if (!match || + next.index + next[0].length !== match.index + match[0].length) { + match = next; + } + safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length; + } + // leave it in a clean state + safeRe[t.COERCERTL].lastIndex = -1; + } -var ioUtil = {}; + if (match === null) { + return null + } -var hasRequiredIoUtil; + return parse(match[2] + + '.' + (match[3] || '0') + + '.' + (match[4] || '0'), options) + } + } (semver$1, semver$1.exports)); + return semver$1.exports; +} -function requireIoUtil () { - if (hasRequiredIoUtil) return ioUtil; - hasRequiredIoUtil = 1; - (function (exports$1) { - var __createBinding = (ioUtil && ioUtil.__createBinding) || (Object.create ? (function(o, m, k, k2) { +var manifest = manifest$1.exports; + +var hasRequiredManifest; + +function requireManifest () { + if (hasRequiredManifest) return manifest$1.exports; + hasRequiredManifest = 1; + (function (module, exports$1) { + var __createBinding = (manifest && manifest.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (ioUtil && ioUtil.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (manifest && manifest.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; - }); - var __importStar = (ioUtil && ioUtil.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (ioUtil && ioUtil.__awaiter) || function (thisArg, _arguments, P, generator) { + }); + var __importStar = (manifest && manifest.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = (manifest && manifest.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -43084,189 +66808,146 @@ function requireIoUtil () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - var _a; Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getCmdPath = exports$1.tryGetExecutablePath = exports$1.isRooted = exports$1.isDirectory = exports$1.exists = exports$1.READONLY = exports$1.UV_FS_O_EXLOCK = exports$1.IS_WINDOWS = exports$1.unlink = exports$1.symlink = exports$1.stat = exports$1.rmdir = exports$1.rm = exports$1.rename = exports$1.readlink = exports$1.readdir = exports$1.open = exports$1.mkdir = exports$1.lstat = exports$1.copyFile = exports$1.chmod = void 0; - const fs = __importStar(fs__default); - const path = __importStar(require$$1__default); - _a = fs.promises - // export const {open} = 'fs' - , exports$1.chmod = _a.chmod, exports$1.copyFile = _a.copyFile, exports$1.lstat = _a.lstat, exports$1.mkdir = _a.mkdir, exports$1.open = _a.open, exports$1.readdir = _a.readdir, exports$1.readlink = _a.readlink, exports$1.rename = _a.rename, exports$1.rm = _a.rm, exports$1.rmdir = _a.rmdir, exports$1.stat = _a.stat, exports$1.symlink = _a.symlink, exports$1.unlink = _a.unlink; - // export const {open} = 'fs' - exports$1.IS_WINDOWS = process.platform === 'win32'; - // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 - exports$1.UV_FS_O_EXLOCK = 0x10000000; - exports$1.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { + exports$1._findMatch = _findMatch; + exports$1._getOsVersion = _getOsVersion; + exports$1._readLinuxVersionFile = _readLinuxVersionFile; + const semver = __importStar(requireSemver$1()); + const core_1 = requireCore(); + // needs to be require for core node modules to be mocked + /* eslint @typescript-eslint/no-require-imports: 0 */ + const os$1 = os; + const cp = require$$2$2; + const fs = fs__default; + function _findMatch(versionSpec, stable, candidates, archFilter) { return __awaiter(this, void 0, void 0, function* () { - try { - yield exports$1.stat(fsPath); - } - catch (err) { - if (err.code === 'ENOENT') { - return false; + const platFilter = os$1.platform(); + let result; + let match; + let file; + for (const candidate of candidates) { + const version = candidate.version; + (0, core_1.debug)(`check ${version} satisfies ${versionSpec}`); + if (semver.satisfies(version, versionSpec) && + (!stable || candidate.stable === stable)) { + file = candidate.files.find(item => { + (0, core_1.debug)(`${item.arch}===${archFilter} && ${item.platform}===${platFilter}`); + let chk = item.arch === archFilter && item.platform === platFilter; + if (chk && item.platform_version) { + const osVersion = module.exports._getOsVersion(); + if (osVersion === item.platform_version) { + chk = true; + } + else { + chk = semver.satisfies(osVersion, item.platform_version); + } + } + return chk; + }); + if (file) { + (0, core_1.debug)(`matched ${candidate.version}`); + match = candidate; + break; + } } - throw err; } - return true; - }); - } - exports$1.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports$1.stat(fsPath) : yield exports$1.lstat(fsPath); - return stats.isDirectory(); + if (match && file) { + // clone since we're mutating the file list to be only the file that matches + result = Object.assign({}, match); + result.files = [file]; + } + return result; }); } - exports$1.isDirectory = isDirectory; - /** - * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: - * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). - */ - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports$1.IS_WINDOWS) { - return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello - ); // e.g. C: or C:\hello + function _getOsVersion() { + // TODO: add windows and other linux, arm variants + // right now filtering on version is only an ubuntu and macos scenario for tools we build for hosted (python) + const plat = os$1.platform(); + let version = ''; + if (plat === 'darwin') { + version = cp.execSync('sw_vers -productVersion').toString(); } - return p.startsWith('/'); - } - exports$1.isRooted = isRooted; - /** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = undefined; - try { - // test file exists - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // on Windows, test for valid extension - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - // try each extension - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports$1.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports$1.IS_WINDOWS) { - // preserve the case of the actual file (since an extension was appended) - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports$1.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } - catch (err) { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } + else if (plat === 'linux') { + // lsb_release process not in some containers, readfile + // Run cat /etc/lsb-release + // DISTRIB_ID=Ubuntu + // DISTRIB_RELEASE=18.04 + // DISTRIB_CODENAME=bionic + // DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS" + const lsbContents = module.exports._readLinuxVersionFile(); + if (lsbContents) { + const lines = lsbContents.split('\n'); + for (const line of lines) { + const parts = line.split('='); + if (parts.length === 2 && + (parts[0].trim() === 'VERSION_ID' || + parts[0].trim() === 'DISTRIB_RELEASE')) { + version = parts[1].trim().replace(/^"/, '').replace(/"$/, ''); + break; } } } - return ''; - }); - } - exports$1.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ''; - if (exports$1.IS_WINDOWS) { - // convert slashes on Windows - p = p.replace(/\//g, '\\'); - // remove redundant slashes - return p.replace(/\\\\+/g, '\\'); } - // remove redundant slashes - return p.replace(/\/\/+/g, '/'); - } - // on Mac/Linux, test the execute bit - // R W X R W X R W X - // 256 128 64 32 16 8 4 2 1 - function isUnixExecutable(stats) { - return ((stats.mode & 1) > 0 || - ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || - ((stats.mode & 64) > 0 && stats.uid === process.getuid())); + return version; } - // Get the path of cmd.exe in windows - function getCmdPath() { - var _a; - return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; + function _readLinuxVersionFile() { + const lsbReleaseFile = '/etc/lsb-release'; + const osReleaseFile = '/etc/os-release'; + let contents = ''; + if (fs.existsSync(lsbReleaseFile)) { + contents = fs.readFileSync(lsbReleaseFile).toString(); + } + else if (fs.existsSync(osReleaseFile)) { + contents = fs.readFileSync(osReleaseFile).toString(); + } + return contents; } - exports$1.getCmdPath = getCmdPath; - } (ioUtil)); - return ioUtil; + } (manifest$1, manifest$1.exports)); + return manifest$1.exports; } -var hasRequiredIo; +var retryHelper = {}; -function requireIo () { - if (hasRequiredIo) return io; - hasRequiredIo = 1; - var __createBinding = (io && io.__createBinding) || (Object.create ? (function(o, m, k, k2) { +var hasRequiredRetryHelper; + +function requireRetryHelper () { + if (hasRequiredRetryHelper) return retryHelper; + hasRequiredRetryHelper = 1; + var __createBinding = (retryHelper && retryHelper.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (io && io.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (retryHelper && retryHelper.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (io && io.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (io && io.__awaiter) || function (thisArg, _arguments, P, generator) { + var __importStar = (retryHelper && retryHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = (retryHelper && retryHelper.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -43275,304 +66956,102 @@ function requireIo () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(io, "__esModule", { value: true }); - io.findInPath = io.which = io.mkdirP = io.rmRF = io.mv = io.cp = void 0; - const assert_1 = require$$0$8; - const path = __importStar(require$$1__default); - const ioUtil = __importStar(requireIoUtil()); - /** - * Copies a file or folder. - * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ - function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; - // Dest is an existing file, but not forcing - if (destStat && destStat.isFile() && !force) { - return; - } - // If dest is an existing directory, should copy inside. - const newDest = destStat && destStat.isDirectory() && copySourceDirectory - ? path.join(dest, path.basename(source)) - : dest; - if (!(yield ioUtil.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } - else { - yield cpDirRecursive(source, newDest, 0, force); - } - } - else { - if (path.relative(source, newDest) === '') { - // a file cannot be copied to itself - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); - } - io.cp = cp; - /** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See MoveOptions. - */ - function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - if (yield ioUtil.exists(dest)) { - let destExists = true; - if (yield ioUtil.isDirectory(dest)) { - // If dest is directory copy src into dest - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } - else { - throw new Error('Destination already exists'); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil.rename(source, dest); - }); - } - io.mv = mv; - /** - * Remove a path recursively with force - * - * @param inputPath path to remove - */ - function rmRF(inputPath) { - return __awaiter(this, void 0, void 0, function* () { - if (ioUtil.IS_WINDOWS) { - // Check for invalid characters - // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - // note if path does not exist, error is silent - yield ioUtil.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } - catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); - } - io.rmRF = rmRF; - /** - * Make a directory. Creates the full path with folders in between - * Will throw if it fails - * - * @param fsPath path to create - * @returns Promise - */ - function mkdirP(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, 'a path argument must be provided'); - yield ioUtil.mkdir(fsPath, { recursive: true }); - }); - } - io.mkdirP = mkdirP; - /** - * Returns path of a tool had the tool actually been invoked. Resolves via paths. - * If you check and the tool does not exist, it will throw. - * - * @param tool name of the tool - * @param check whether to check if tool exists - * @returns Promise path to tool - */ - function which(tool, check) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // recursive when check=true - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } - else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; - } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; - } - return ''; - }); - } - io.which = which; + Object.defineProperty(retryHelper, "__esModule", { value: true }); + retryHelper.RetryHelper = void 0; + const core = __importStar(requireCore()); /** - * Returns a list of all occurrences of the given tool on the system path. - * - * @returns Promise the paths of the tool + * Internal class for retries */ - function findInPath(tool) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // build the list of extensions to try - const extensions = []; - if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) { - for (const extension of process.env['PATHEXT'].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - // if it's rooted, return it if exists. otherwise return empty. - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - // if any path separators, return empty - if (tool.includes(path.sep)) { - return []; - } - // build the list of directories - // - // Note, technically "where" checks the current directory on Windows. From a toolkit perspective, - // it feels like we should not do this. Checking the current directory seems like more of a use - // case of a shell, and the which() function exposed by the toolkit should strive for consistency - // across platforms. - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - // find all matches - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } + class RetryHelper { + constructor(maxAttempts, minSeconds, maxSeconds) { + if (maxAttempts < 1) { + throw new Error('max attempts should be greater than or equal to 1'); } - return matches; - }); - } - io.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null - ? true - : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; - } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, void 0, void 0, function* () { - // Ensure there is not a run away recursive copy - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil.lstat(srcFile); - if (srcFileStat.isDirectory()) { - // Recurse - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } - else { - yield copyFile(srcFile, destFile, force); - } + this.maxAttempts = maxAttempts; + this.minSeconds = Math.floor(minSeconds); + this.maxSeconds = Math.floor(maxSeconds); + if (this.minSeconds > this.maxSeconds) { + throw new Error('min seconds should be less than or equal to max seconds'); } - // Change the mode for the newly created directory - yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); - }); - } - // Buffered file copy - function copyFile(srcFile, destFile, force) { - return __awaiter(this, void 0, void 0, function* () { - if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { - // unlink/re-link it - try { - yield ioUtil.lstat(destFile); - yield ioUtil.unlink(destFile); - } - catch (e) { - // Try to override file permission - if (e.code === 'EPERM') { - yield ioUtil.chmod(destFile, '0666'); - yield ioUtil.unlink(destFile); + } + execute(action, isRetryable) { + return __awaiter(this, void 0, void 0, function* () { + let attempt = 1; + while (attempt < this.maxAttempts) { + // Try + try { + return yield action(); } - // other errors = it doesn't exist, no work to do + catch (err) { + if (isRetryable && !isRetryable(err)) { + throw err; + } + core.info(err.message); + } + // Sleep + const seconds = this.getSleepAmount(); + core.info(`Waiting ${seconds} seconds before trying again`); + yield this.sleep(seconds); + attempt++; } - // Copy over symlink - const symlinkFull = yield ioUtil.readlink(srcFile); - yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); - } - else if (!(yield ioUtil.exists(destFile)) || force) { - yield ioUtil.copyFile(srcFile, destFile); - } - }); + // Last attempt + return yield action(); + }); + } + getSleepAmount() { + return (Math.floor(Math.random() * (this.maxSeconds - this.minSeconds + 1)) + + this.minSeconds); + } + sleep(seconds) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise(resolve => setTimeout(resolve, seconds * 1000)); + }); + } } + retryHelper.RetryHelper = RetryHelper; - return io; + return retryHelper; } -var hasRequiredToolrunner; +var hasRequiredToolCache; -function requireToolrunner () { - if (hasRequiredToolrunner) return toolrunner; - hasRequiredToolrunner = 1; - var __createBinding = (toolrunner && toolrunner.__createBinding) || (Object.create ? (function(o, m, k, k2) { +function requireToolCache () { + if (hasRequiredToolCache) return toolCache; + hasRequiredToolCache = 1; + var __createBinding = (toolCache && toolCache.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); - var __setModuleDefault = (toolrunner && toolrunner.__setModuleDefault) || (Object.create ? (function(o, v) { + var __setModuleDefault = (toolCache && toolCache.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); - var __importStar = (toolrunner && toolrunner.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (toolrunner && toolrunner.__awaiter) || function (thisArg, _arguments, P, generator) { + var __importStar = (toolCache && toolCache.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); + var __awaiter = (toolCache && toolCache.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -43581,1164 +67060,1291 @@ function requireToolrunner () { step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; - Object.defineProperty(toolrunner, "__esModule", { value: true }); - toolrunner.argStringToArray = toolrunner.ToolRunner = void 0; - const os = __importStar(require$$0$5); - const events = __importStar(require$$1$3); - const child = __importStar(require$$2$2); - const path = __importStar(require$$1__default); + Object.defineProperty(toolCache, "__esModule", { value: true }); + toolCache.HTTPError = void 0; + toolCache.downloadTool = downloadTool; + toolCache.extract7z = extract7z; + toolCache.extractTar = extractTar; + toolCache.extractXar = extractXar; + toolCache.extractZip = extractZip; + toolCache.cacheDir = cacheDir; + toolCache.cacheFile = cacheFile; + toolCache.find = find; + toolCache.findAllVersions = findAllVersions; + toolCache.getManifestFromRepo = getManifestFromRepo; + toolCache.findFromManifest = findFromManifest; + toolCache.isExplicitVersion = isExplicitVersion; + toolCache.evaluateVersions = evaluateVersions; + const core = __importStar(requireCore()); const io = __importStar(requireIo()); - const ioUtil = __importStar(requireIoUtil()); - const timers_1 = require$$6; - /* eslint-disable @typescript-eslint/unbound-method */ + const crypto = __importStar(require$$0$3); + const fs = __importStar(fs__default); + const mm = __importStar(requireManifest()); + const os$1 = __importStar(os); + const path = __importStar(require$$1__default); + const httpm = __importStar(requireLib()); + const semver = __importStar(requireSemver$1()); + const stream = __importStar(require$$9__default); + const util = __importStar(require$$6__default); + const assert_1 = require$$2$1; + const exec_1 = requireExec(); + const retry_helper_1 = requireRetryHelper(); + class HTTPError extends Error { + constructor(httpStatusCode) { + super(`Unexpected HTTP response: ${httpStatusCode}`); + this.httpStatusCode = httpStatusCode; + Object.setPrototypeOf(this, new.target.prototype); + } + } + toolCache.HTTPError = HTTPError; const IS_WINDOWS = process.platform === 'win32'; - /* - * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. + const IS_MAC = process.platform === 'darwin'; + const userAgent = 'actions/tool-cache'; + /** + * Download a tool from an url and stream it into a file + * + * @param url url of tool to download + * @param dest path to download tool + * @param auth authorization header + * @param headers other headers + * @returns path to downloaded tool */ - class ToolRunner extends events.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; - } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } - } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool - if (IS_WINDOWS) { - // Windows + cmd file - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows + verbatim - else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } - // Windows (regular) - else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; + function downloadTool(url, dest, auth, headers) { + return __awaiter(this, void 0, void 0, function* () { + dest = dest || path.join(_getTempDirectory(), crypto.randomUUID()); + yield io.mkdirP(path.dirname(dest)); + core.debug(`Downloading ${url}`); + core.debug(`Destination ${dest}`); + const maxAttempts = 3; + const minSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MIN_SECONDS', 10); + const maxSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MAX_SECONDS', 20); + const retryHelper = new retry_helper_1.RetryHelper(maxAttempts, minSeconds, maxSeconds); + return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () { + return yield downloadToolAttempt(url, dest || '', auth, headers); + }), (err) => { + if (err instanceof HTTPError && err.httpStatusCode) { + // Don't retry anything less than 500, except 408 Request Timeout and 429 Too Many Requests + if (err.httpStatusCode < 500 && + err.httpStatusCode !== 408 && + err.httpStatusCode !== 429) { + return false; } } + // Otherwise retry + return true; + }); + }); + } + function downloadToolAttempt(url, dest, auth, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (fs.existsSync(dest)) { + throw new Error(`Destination file path ${dest} already exists`); } - else { - // OSX/Linux - this can likely be improved with some form of quoting. - // creating processes on Unix is fundamentally different than Windows. - // on Unix, execvp() takes an arg array. - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - return cmd; - } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - // the rest of the string ... - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); + // Get the response headers + const http = new httpm.HttpClient(userAgent, [], { + allowRetries: false + }); + if (auth) { + core.debug('set auth'); + if (headers === undefined) { + headers = {}; } - return s; + headers.authorization = auth; } - catch (err) { - // streaming lines to console is best effort. Don't fail a build. - this._debug(`error processing line. Failed with error ${err}`); - return ''; + const response = yield http.get(url, headers); + if (response.message.statusCode !== 200) { + const err = new HTTPError(response.message.statusCode); + core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); + throw err; } - } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env['COMSPEC'] || 'cmd.exe'; - } + // Download the response body + const pipeline = util.promisify(stream.pipeline); + const responseMessageFactory = _getGlobal('TEST_DOWNLOAD_TOOL_RESPONSE_MESSAGE_FACTORY', () => response.message); + const readStream = responseMessageFactory(); + let succeeded = false; + try { + yield pipeline(readStream, fs.createWriteStream(dest)); + core.debug('download complete'); + succeeded = true; + return dest; } - return this.toolPath; - } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += ' '; - argline += options.windowsVerbatimArguments - ? a - : this._windowsQuoteCmdArg(a); + finally { + // Error, delete dest before retry + if (!succeeded) { + core.debug('download failed'); + try { + yield io.rmRF(dest); + } + catch (err) { + core.debug(`Failed to delete '${dest}'. ${err.message}`); } - argline += '"'; - return [argline]; - } - } - return this.args; - } - _endsWith(str, end) { - return str.endsWith(end); - } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return (this._endsWith(upperToolPath, '.CMD') || - this._endsWith(upperToolPath, '.BAT')); - } - _windowsQuoteCmdArg(arg) { - // for .exe, apply the normal quoting rules that libuv applies - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - // otherwise apply quoting rules specific to the cmd.exe command line parser. - // the libuv rules are generic and are not designed specifically for cmd.exe - // command line parser. - // - // for a detailed description of the cmd.exe command line parser, refer to - // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 - // need quotes for empty arg - if (!arg) { - return '""'; - } - // determine whether the arg needs to be quoted - const cmdSpecialChars = [ - ' ', - '\t', - '&', - '(', - ')', - '[', - ']', - '{', - '}', - '^', - '=', - ';', - '!', - "'", - '+', - ',', - '`', - '~', - '|', - '<', - '>', - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some(x => x === char)) { - needsQuotes = true; - break; - } - } - // short-circuit if quotes not needed - if (!needsQuotes) { - return arg; - } - // the following quoting rules are very similar to the rules that by libuv applies. - // - // 1) wrap the string in quotes - // - // 2) double-up quotes - i.e. " => "" - // - // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately - // doesn't work well with a cmd.exe command line. - // - // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. - // for example, the command line: - // foo.exe "myarg:""my val""" - // is parsed by a .NET console app into an arg array: - // [ "myarg:\"my val\"" ] - // which is the same end result when applying libuv quoting rules. although the actual - // command line from libuv quoting rules would look like: - // foo.exe "myarg:\"my val\"" - // - // 3) double-up slashes that precede a quote, - // e.g. hello \world => "hello \world" - // hello\"world => "hello\\""world" - // hello\\"world => "hello\\\\""world" - // hello world\ => "hello world\\" - // - // technically this is not required for a cmd.exe command line, or the batch argument parser. - // the reasons for including this as a .cmd quoting rule are: - // - // a) this is optimized for the scenario where the argument is passed from the .cmd file to an - // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. - // - // b) it's what we've been doing previously (by deferring to node default behavior) and we - // haven't heard any complaints about that aspect. - // - // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be - // escaped when used on the command line directly - even though within a .cmd file % can be escaped - // by using %%. - // - // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts - // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. - // - // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would - // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the - // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args - // to an external program. - // - // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. - // % can be escaped within a .cmd file. - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; // double the slash - } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; // double the quote - } - else { - quoteHit = false; } } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); - } - _uvQuoteCmdArg(arg) { - // Tool runner wraps child_process.spawn() and needs to apply the same quoting as - // Node in certain cases where the undocumented spawn option windowsVerbatimArguments - // is used. - // - // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, - // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), - // pasting copyright notice from Node within this function: - // - // Copyright Joyent, Inc. and other Node contributors. All rights reserved. - // - // Permission is hereby granted, free of charge, to any person obtaining a copy - // of this software and associated documentation files (the "Software"), to - // deal in the Software without restriction, including without limitation the - // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - // sell copies of the Software, and to permit persons to whom the Software is - // furnished to do so, subject to the following conditions: - // - // The above copyright notice and this permission notice shall be included in - // all copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - // IN THE SOFTWARE. - if (!arg) { - // Need double quotation for empty argument - return '""'; - } - if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { - // No quotation needed - return arg; - } - if (!arg.includes('"') && !arg.includes('\\')) { - // No embedded double quotes or backslashes, so I can just wrap - // quote marks around the whole thing. - return `"${arg}"`; - } - // Expected input/output: - // input : hello"world - // output: "hello\"world" - // input : hello""world - // output: "hello\"\"world" - // input : hello\world - // output: hello\world - // input : hello\\world - // output: hello\\world - // input : hello\"world - // output: "hello\\\"world" - // input : hello\\"world - // output: "hello\\\\\"world" - // input : hello world\ - // output: "hello world\\" - note the comment in libuv actually reads "hello world\" - // but it appears the comment is wrong, it should be "hello world\\" - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length; i > 0; i--) { - // walk the string in reverse - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === '\\') { - reverse += '\\'; + }); + } + /** + * Extract a .7z file + * + * @param file path to the .7z file + * @param dest destination directory. Optional. + * @param _7zPath path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this + * problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will + * gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is + * bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line + * interface, it is smaller than the full command line interface, and it does support long paths. At the + * time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website. + * Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path + * to 7zr.exe can be pass to this function. + * @returns path to the destination directory + */ + function extract7z(file, dest, _7zPath) { + return __awaiter(this, void 0, void 0, function* () { + (0, assert_1.ok)(IS_WINDOWS, 'extract7z() not supported on current OS'); + (0, assert_1.ok)(file, 'parameter "file" is required'); + dest = yield _createExtractFolder(dest); + const originalCwd = process.cwd(); + process.chdir(dest); + if (_7zPath) { + try { + const logLevel = core.isDebug() ? '-bb1' : '-bb0'; + const args = [ + 'x', // eXtract files with full paths + logLevel, // -bb[0-3] : set output log level + '-bd', // disable progress indicator + '-sccUTF-8', // set charset for for console input/output + file + ]; + const options = { + silent: true + }; + yield (0, exec_1.exec)(`"${_7zPath}"`, args, options); } - else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '\\'; + finally { + process.chdir(originalCwd); } - else { - quoteHit = false; + } + else { + const escapedScript = path + .join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1') + .replace(/'/g, "''") + .replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines + const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); + const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); + const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`; + const args = [ + '-NoLogo', + '-Sta', + '-NoProfile', + '-NonInteractive', + '-ExecutionPolicy', + 'Unrestricted', + '-Command', + command + ]; + const options = { + silent: true + }; + try { + const powershellPath = yield io.which('powershell', true); + yield (0, exec_1.exec)(`"${powershellPath}"`, args, options); + } + finally { + process.chdir(originalCwd); } } - reverse += '"'; - return reverse - .split('') - .reverse() - .join(''); - } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 10000 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; - } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result['windowsVerbatimArguments'] = - options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; + return dest; + }); + } + /** + * Extract a compressed tar archive + * + * @param file path to the tar + * @param dest destination directory. Optional. + * @param flags flags for the tar command to use for extraction. Defaults to 'xz' (extracting gzipped tars). Optional. + * @returns path to the destination directory + */ + function extractTar(file_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (file, dest, flags = 'xz') { + if (!file) { + throw new Error("parameter 'file' is required"); } - return result; - } - /** - * Exec a tool. - * Output will be streamed to the live console. - * Returns promise with return code - * - * @param tool path to tool to exec - * @param options optional exec options. See ExecOptions - * @returns number - */ - exec() { - return __awaiter(this, void 0, void 0, function* () { - // root the tool path if it is unrooted and contains relative pathing - if (!ioUtil.isRooted(this.toolPath) && - (this.toolPath.includes('/') || - (IS_WINDOWS && this.toolPath.includes('\\')))) { - // prefer options.cwd if it is specified, however options.cwd may also need to be rooted - this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); + // Create dest + dest = yield _createExtractFolder(dest); + // Determine whether GNU tar + core.debug('Checking tar --version'); + let versionOutput = ''; + yield (0, exec_1.exec)('tar --version', [], { + ignoreReturnCode: true, + silent: true, + listeners: { + stdout: (data) => (versionOutput += data.toString()), + stderr: (data) => (versionOutput += data.toString()) } - // if the tool is only a file name, then resolve it from the PATH - // otherwise verify it exists (add extension on Windows if necessary) - this.toolPath = yield io.which(this.toolPath, true); - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - this._debug(`exec tool: ${this.toolPath}`); - this._debug('arguments:'); - for (const arg of this.args) { - this._debug(` ${arg}`); - } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); - } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on('debug', (message) => { - this._debug(message); - }); - if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) { - return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); - } - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - let stdbuffer = ''; - if (cp.stdout) { - cp.stdout.on('data', (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); - } - }); - }); - } - let errbuffer = ''; - if (cp.stderr) { - cp.stderr.on('data', (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && - optionsNonNull.errStream && - optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr - ? optionsNonNull.errStream - : optionsNonNull.outStream; - s.write(data); - } - errbuffer = this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on('error', (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on('exit', (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on('close', (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on('done', (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit('stdline', stdbuffer); - } - if (errbuffer.length > 0) { - this.emit('errline', errbuffer); - } - cp.removeAllListeners(); - if (error) { - reject(error); - } - else { - resolve(exitCode); - } - }); - if (this.options.input) { - if (!cp.stdin) { - throw new Error('child process missing stdin'); - } - cp.stdin.end(this.options.input); - } - })); }); - } + core.debug(versionOutput.trim()); + const isGnuTar = versionOutput.toUpperCase().includes('GNU TAR'); + // Initialize args + let args; + if (flags instanceof Array) { + args = flags; + } + else { + args = [flags]; + } + if (core.isDebug() && !flags.includes('v')) { + args.push('-v'); + } + let destArg = dest; + let fileArg = file; + if (IS_WINDOWS && isGnuTar) { + args.push('--force-local'); + destArg = dest.replace(/\\/g, '/'); + // Technically only the dest needs to have `/` but for aesthetic consistency + // convert slashes in the file arg too. + fileArg = file.replace(/\\/g, '/'); + } + if (isGnuTar) { + // Suppress warnings when using GNU tar to extract archives created by BSD tar + args.push('--warning=no-unknown-keyword'); + args.push('--overwrite'); + } + args.push('-C', destArg, '-f', fileArg); + yield (0, exec_1.exec)(`tar`, args); + return dest; + }); } - toolrunner.ToolRunner = ToolRunner; /** - * Convert an arg string to an array of args. Handles escaping + * Extract a xar compatible archive * - * @param argString string of arguments - * @returns string[] array of arguments + * @param file path to the archive + * @param dest destination directory. Optional. + * @param flags flags for the xar. Optional. + * @returns path to the destination directory */ - function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ''; - function append(c) { - // we only escape double quotes. - if (escaped && c !== '"') { - arg += '\\'; + function extractXar(file_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (file, dest, flags = []) { + (0, assert_1.ok)(IS_MAC, 'extractXar() not supported on current OS'); + (0, assert_1.ok)(file, 'parameter "file" is required'); + dest = yield _createExtractFolder(dest); + let args; + if (flags instanceof Array) { + args = flags; } - arg += c; - escaped = false; - } - for (let i = 0; i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } - else { - append(c); - } - continue; + else { + args = [flags]; } - if (c === '\\' && escaped) { - append(c); - continue; + args.push('-x', '-C', dest, '-f', file); + if (core.isDebug()) { + args.push('-v'); } - if (c === '\\' && inQuotes) { - escaped = true; - continue; + const xarPath = yield io.which('xar', true); + yield (0, exec_1.exec)(`"${xarPath}"`, _unique(args)); + return dest; + }); + } + /** + * Extract a zip + * + * @param file path to the zip + * @param dest destination directory. Optional. + * @returns path to the destination directory + */ + function extractZip(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + if (!file) { + throw new Error("parameter 'file' is required"); } - if (c === ' ' && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ''; - } - continue; + dest = yield _createExtractFolder(dest); + if (IS_WINDOWS) { + yield extractZipWin(file, dest); } - append(c); + else { + yield extractZipNix(file, dest); + } + return dest; + }); + } + function extractZipWin(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + // build the powershell command + const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines + const escapedDest = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); + const pwshPath = yield io.which('pwsh', false); + //To match the file overwrite behavior on nix systems, we use the overwrite = true flag for ExtractToDirectory + //and the -Force flag for Expand-Archive as a fallback + if (pwshPath) { + //attempt to use pwsh with ExtractToDirectory, if this fails attempt Expand-Archive + const pwshCommand = [ + `$ErrorActionPreference = 'Stop' ;`, + `try { Add-Type -AssemblyName System.IO.Compression.ZipFile } catch { } ;`, + `try { [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}', $true) }`, + `catch { if (($_.Exception.GetType().FullName -eq 'System.Management.Automation.MethodException') -or ($_.Exception.GetType().FullName -eq 'System.Management.Automation.RuntimeException') ){ Expand-Archive -LiteralPath '${escapedFile}' -DestinationPath '${escapedDest}' -Force } else { throw $_ } } ;` + ].join(' '); + const args = [ + '-NoLogo', + '-NoProfile', + '-NonInteractive', + '-ExecutionPolicy', + 'Unrestricted', + '-Command', + pwshCommand + ]; + core.debug(`Using pwsh at path: ${pwshPath}`); + yield (0, exec_1.exec)(`"${pwshPath}"`, args); + } + else { + const powershellCommand = [ + `$ErrorActionPreference = 'Stop' ;`, + `try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ;`, + `if ((Get-Command -Name Expand-Archive -Module Microsoft.PowerShell.Archive -ErrorAction Ignore)) { Expand-Archive -LiteralPath '${escapedFile}' -DestinationPath '${escapedDest}' -Force }`, + `else {[System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}', $true) }` + ].join(' '); + const args = [ + '-NoLogo', + '-Sta', + '-NoProfile', + '-NonInteractive', + '-ExecutionPolicy', + 'Unrestricted', + '-Command', + powershellCommand + ]; + const powershellPath = yield io.which('powershell', true); + core.debug(`Using powershell at path: ${powershellPath}`); + yield (0, exec_1.exec)(`"${powershellPath}"`, args); + } + }); + } + function extractZipNix(file, dest) { + return __awaiter(this, void 0, void 0, function* () { + const unzipPath = yield io.which('unzip', true); + const args = [file]; + if (!core.isDebug()) { + args.unshift('-q'); + } + args.unshift('-o'); //overwrite with -o, otherwise a prompt is shown which freezes the run + yield (0, exec_1.exec)(`"${unzipPath}"`, args, { cwd: dest }); + }); + } + /** + * Caches a directory and installs it into the tool cacheDir + * + * @param sourceDir the directory to cache into tools + * @param tool tool name + * @param version version of the tool. semver format + * @param arch architecture of the tool. Optional. Defaults to machine architecture + */ + function cacheDir(sourceDir, tool, version, arch) { + return __awaiter(this, void 0, void 0, function* () { + version = semver.clean(version) || version; + arch = arch || os$1.arch(); + core.debug(`Caching tool ${tool} ${version} ${arch}`); + core.debug(`source dir: ${sourceDir}`); + if (!fs.statSync(sourceDir).isDirectory()) { + throw new Error('sourceDir is not a directory'); + } + // Create the tool dir + const destPath = yield _createToolPath(tool, version, arch); + // copy each child item. do not move. move can fail on Windows + // due to anti-virus software having an open handle on a file. + for (const itemName of fs.readdirSync(sourceDir)) { + const s = path.join(sourceDir, itemName); + yield io.cp(s, destPath, { recursive: true }); + } + // write .complete + _completeToolPath(tool, version, arch); + return destPath; + }); + } + /** + * Caches a downloaded file (GUID) and installs it + * into the tool cache with a given targetName + * + * @param sourceFile the file to cache into tools. Typically a result of downloadTool which is a guid. + * @param targetFile the name of the file name in the tools directory + * @param tool tool name + * @param version version of the tool. semver format + * @param arch architecture of the tool. Optional. Defaults to machine architecture + */ + function cacheFile(sourceFile, targetFile, tool, version, arch) { + return __awaiter(this, void 0, void 0, function* () { + version = semver.clean(version) || version; + arch = arch || os$1.arch(); + core.debug(`Caching tool ${tool} ${version} ${arch}`); + core.debug(`source file: ${sourceFile}`); + if (!fs.statSync(sourceFile).isFile()) { + throw new Error('sourceFile is not a file'); + } + // create the tool dir + const destFolder = yield _createToolPath(tool, version, arch); + // copy instead of move. move can fail on Windows due to + // anti-virus software having an open handle on a file. + const destPath = path.join(destFolder, targetFile); + core.debug(`destination file ${destPath}`); + yield io.cp(sourceFile, destPath); + // write .complete + _completeToolPath(tool, version, arch); + return destFolder; + }); + } + /** + * Finds the path to a tool version in the local installed tool cache + * + * @param toolName name of the tool + * @param versionSpec version of the tool + * @param arch optional arch. defaults to arch of computer + */ + function find(toolName, versionSpec, arch) { + if (!toolName) { + throw new Error('toolName parameter is required'); } - if (arg.length > 0) { - args.push(arg.trim()); + if (!versionSpec) { + throw new Error('versionSpec parameter is required'); } - return args; - } - toolrunner.argStringToArray = argStringToArray; - class ExecState extends events.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; // tracks whether the process has exited and stdio is closed - this.processError = ''; - this.processExitCode = 0; - this.processExited = false; // tracks whether the process has exited - this.processStderr = false; // tracks whether stderr was written to - this.delay = 10000; // 10 seconds - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error('toolPath must not be empty'); + arch = arch || os$1.arch(); + // attempt to resolve an explicit version + if (!isExplicitVersion(versionSpec)) { + const localVersions = findAllVersions(toolName, arch); + const match = evaluateVersions(localVersions, versionSpec); + versionSpec = match; + } + // check for the explicit version in the cache + let toolPath = ''; + if (versionSpec) { + versionSpec = semver.clean(versionSpec) || ''; + const cachePath = path.join(_getCacheDirectory(), toolName, versionSpec, arch); + core.debug(`checking cache: ${cachePath}`); + if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) { + core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`); + toolPath = cachePath; } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; + else { + core.debug('not found'); } } - CheckComplete() { - if (this.done) { - return; + return toolPath; + } + /** + * Finds the paths to all versions of a tool that are installed in the local tool cache + * + * @param toolName name of the tool + * @param arch optional arch. defaults to arch of computer + */ + function findAllVersions(toolName, arch) { + const versions = []; + arch = arch || os$1.arch(); + const toolPath = path.join(_getCacheDirectory(), toolName); + if (fs.existsSync(toolPath)) { + const children = fs.readdirSync(toolPath); + for (const child of children) { + if (isExplicitVersion(child)) { + const fullPath = path.join(toolPath, child, arch || ''); + if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) { + versions.push(child); + } + } } - if (this.processClosed) { - this._setResult(); + } + return versions; + } + function getManifestFromRepo(owner_1, repo_1, auth_1) { + return __awaiter(this, arguments, void 0, function* (owner, repo, auth, branch = 'master') { + let releases = []; + const treeUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/${branch}`; + const http = new httpm.HttpClient('tool-cache'); + const headers = {}; + if (auth) { + core.debug('set auth'); + headers.authorization = auth; } - else if (this.processExited) { - this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); + const response = yield http.getJson(treeUrl, headers); + if (!response.result) { + return releases; } - } - _debug(message) { - this.emit('debug', message); - } - _setResult() { - // determine whether there is an error - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); + let manifestUrl = ''; + for (const item of response.result.tree) { + if (item.path === 'versions-manifest.json') { + manifestUrl = item.url; + break; } - else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); + } + headers['accept'] = 'application/vnd.github.VERSION.raw'; + let versionsRaw = yield (yield http.get(manifestUrl, headers)).readBody(); + if (versionsRaw) { + // shouldn't be needed but protects against invalid json saved with BOM + versionsRaw = versionsRaw.replace(/^\uFEFF/, ''); + try { + releases = JSON.parse(versionsRaw); } - else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); + catch (_a) { + core.debug('Invalid json'); } } - // clear the timeout - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.done = true; - this.emit('done', error, this.processExitCode); - } - static HandleTimeout(state) { - if (state.done) { - return; - } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / - 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); + return releases; + }); + } + function findFromManifest(versionSpec_1, stable_1, manifest_1) { + return __awaiter(this, arguments, void 0, function* (versionSpec, stable, manifest, archFilter = os$1.arch()) { + // wrap the internal impl + const match = yield mm._findMatch(versionSpec, stable, manifest, archFilter); + return match; + }); + } + function _createExtractFolder(dest) { + return __awaiter(this, void 0, void 0, function* () { + if (!dest) { + // create a temp dir + dest = path.join(_getTempDirectory(), crypto.randomUUID()); } - state._setResult(); - } + yield io.mkdirP(dest); + return dest; + }); } - - return toolrunner; -} - -var hasRequiredExec; - -function requireExec () { - if (hasRequiredExec) return exec; - hasRequiredExec = 1; - var __createBinding = (exec && exec.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (exec && exec.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (exec && exec.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (exec && exec.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); + function _createToolPath(tool, version, arch) { + return __awaiter(this, void 0, void 0, function* () { + const folderPath = path.join(_getCacheDirectory(), tool, semver.clean(version) || version, arch || ''); + core.debug(`destination ${folderPath}`); + const markerPath = `${folderPath}.complete`; + yield io.rmRF(folderPath); + yield io.rmRF(markerPath); + yield io.mkdirP(folderPath); + return folderPath; }); - }; - Object.defineProperty(exec, "__esModule", { value: true }); - exec.getExecOutput = exec.exec = void 0; - const string_decoder_1 = require$$0$d; - const tr = __importStar(requireToolrunner()); + } + function _completeToolPath(tool, version, arch) { + const folderPath = path.join(_getCacheDirectory(), tool, semver.clean(version) || version, arch || ''); + const markerPath = `${folderPath}.complete`; + fs.writeFileSync(markerPath, ''); + core.debug('finished caching tool'); + } /** - * Exec a command. - * Output will be streamed to the live console. - * Returns promise with return code + * Check if version string is explicit * - * @param commandLine command to execute (can include additional args). Must be correctly escaped. - * @param args optional arguments for tool. Escaping is handled by the lib. - * @param options optional exec options. See ExecOptions - * @returns Promise exit code + * @param versionSpec version string to check */ - function exec$1(commandLine, args, options) { - return __awaiter(this, void 0, void 0, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); - } - // Path to tool to execute should be first arg - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); + function isExplicitVersion(versionSpec) { + const c = semver.clean(versionSpec) || ''; + core.debug(`isExplicit: ${c}`); + const valid = semver.valid(c) != null; + core.debug(`explicit? ${valid}`); + return valid; } - exec.exec = exec$1; /** - * Exec a command and get the output. - * Output will be streamed to the live console. - * Returns promise with the exit code and collected stdout and stderr + * Get the highest satisfiying semantic version in `versions` which satisfies `versionSpec` * - * @param commandLine command to execute (can include additional args). Must be correctly escaped. - * @param args optional arguments for tool. Escaping is handled by the lib. - * @param options optional exec options. See ExecOptions - * @returns Promise exit code, stdout, and stderr + * @param versions array of versions to evaluate + * @param versionSpec semantic version spec to satisfy */ - function getExecOutput(commandLine, args, options) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - let stdout = ''; - let stderr = ''; - //Using string decoder covers the case where a mult-byte character is split - const stdoutDecoder = new string_decoder_1.StringDecoder('utf8'); - const stderrDecoder = new string_decoder_1.StringDecoder('utf8'); - const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout; - const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr; - const stdErrListener = (data) => { - stderr += stderrDecoder.write(data); - if (originalStdErrListener) { - originalStdErrListener(data); - } - }; - const stdOutListener = (data) => { - stdout += stdoutDecoder.write(data); - if (originalStdoutListener) { - originalStdoutListener(data); - } - }; - const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec$1(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); - //flush any remaining characters - stdout += stdoutDecoder.end(); - stderr += stderrDecoder.end(); - return { - exitCode, - stdout, - stderr - }; + function evaluateVersions(versions, versionSpec) { + let version = ''; + core.debug(`evaluating ${versions.length} versions`); + versions = versions.sort((a, b) => { + if (semver.gt(a, b)) { + return 1; + } + return -1; }); + for (let i = versions.length - 1; i >= 0; i--) { + const potential = versions[i]; + const satisfied = semver.satisfies(potential, versionSpec); + if (satisfied) { + version = potential; + break; + } + } + if (version) { + core.debug(`matched: ${version}`); + } + else { + core.debug('match not found'); + } + return version; + } + /** + * Gets RUNNER_TOOL_CACHE + */ + function _getCacheDirectory() { + const cacheDirectory = process.env['RUNNER_TOOL_CACHE'] || ''; + (0, assert_1.ok)(cacheDirectory, 'Expected RUNNER_TOOL_CACHE to be defined'); + return cacheDirectory; + } + /** + * Gets RUNNER_TEMP + */ + function _getTempDirectory() { + const tempDirectory = process.env['RUNNER_TEMP'] || ''; + (0, assert_1.ok)(tempDirectory, 'Expected RUNNER_TEMP to be defined'); + return tempDirectory; + } + /** + * Gets a global variable + */ + function _getGlobal(key, defaultValue) { + /* eslint-disable @typescript-eslint/no-explicit-any */ + const value = commonjsGlobal[key]; + /* eslint-enable @typescript-eslint/no-explicit-any */ + return value !== undefined ? value : defaultValue; + } + /** + * Returns an array of unique values. + * @param values Values to make unique. + */ + function _unique(values) { + return Array.from(new Set(values)); } - exec.getExecOutput = getExecOutput; - return exec; + return toolCache; } -var hasRequiredPlatform; +var toolCacheExports = requireToolCache(); -function requirePlatform () { - if (hasRequiredPlatform) return platform; - hasRequiredPlatform = 1; - (function (exports$1) { - var __createBinding = (platform && platform.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (platform && platform.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (platform && platform.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (platform && platform.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __importDefault = (platform && platform.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.getDetails = exports$1.isLinux = exports$1.isMacOS = exports$1.isWindows = exports$1.arch = exports$1.platform = void 0; - const os_1 = __importDefault(require$$0$5); - const exec = __importStar(requireExec()); - const getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { - silent: true - }); - const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, { - silent: true - }); - return { - name: name.trim(), - version: version.trim() - }; - }); - const getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () { - var _a, _b, _c, _d; - const { stdout } = yield exec.getExecOutput('sw_vers', undefined, { - silent: true - }); - const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : ''; - const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : ''; - return { - name, - version - }; - }); - const getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () { - const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], { - silent: true - }); - const [name, version] = stdout.trim().split('\n'); - return { - name, - version - }; - }); - exports$1.platform = os_1.default.platform(); - exports$1.arch = os_1.default.arch(); - exports$1.isWindows = exports$1.platform === 'win32'; - exports$1.isMacOS = exports$1.platform === 'darwin'; - exports$1.isLinux = exports$1.platform === 'linux'; - function getDetails() { - return __awaiter(this, void 0, void 0, function* () { - return Object.assign(Object.assign({}, (yield (exports$1.isWindows - ? getWindowsInfo() - : exports$1.isMacOS - ? getMacOsInfo() - : getLinuxInfo()))), { platform: exports$1.platform, - arch: exports$1.arch, - isWindows: exports$1.isWindows, - isMacOS: exports$1.isMacOS, - isLinux: exports$1.isLinux }); - }); - } - exports$1.getDetails = getDetails; - - } (platform)); - return platform; +var execExports = requireExec(); + +async function exec(commandLine, args, options) { + const exitCode = await execExports.exec(commandLine, args, options); + if (exitCode !== 0) { + throw new Error(`'${[commandLine].concat(args || []).join(' ')}' exited with a non-zero code: ${exitCode}`); + } +} +async function getLatestRelease(repo) { + const octokit = getOctokit(); + return (await octokit.request('GET /repos/{owner}/{repo}/releases/latest', { + owner: GRAALVM_GH_USER, + repo + })).data; /** missing digest property */ +} +async function getContents(repo, path) { + const octokit = getOctokit(); + return (await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', { + owner: GRAALVM_GH_USER, + repo, + path + })).data; +} +async function getTaggedRelease(owner, repo, tag) { + const octokit = getOctokit(); + return (await octokit.request('GET /repos/{owner}/{repo}/releases/tags/{tag}', { + owner, + repo, + tag + })).data; /** missing digest property */ +} +async function getMatchingTags(owner, repo, tagPrefix) { + const octokit = getOctokit(); + return (await octokit.request('GET /repos/{owner}/{repo}/git/matching-refs/tags/{tagPrefix}', { + owner, + repo, + tagPrefix + })).data; +} +async function downloadAndExtractJDK(downloadUrl) { + return findJavaHomeInSubfolder(await extract(await toolCacheExports.downloadTool(downloadUrl))); +} +async function downloadExtractAndCacheJDK(downloader, toolName, version) { + const semVersion = toSemVer(version); + let toolPath = toolCacheExports.find(toolName, semVersion); + if (toolPath) { + coreExports.info(`Found ${toolName} ${version} in tool-cache @ ${toolPath}`); + } + else { + const extractDir = await extract(await downloader()); + coreExports.info(`Adding ${toolName} ${version} to tool-cache ...`); + toolPath = await toolCacheExports.cacheDir(extractDir, toolName, semVersion); + } + return findJavaHomeInSubfolder(toolPath); +} +/** + * This copy of tc.downloadTool() preserves the file extension in the dest. + * The file extension is required on Windows runners without .NET to extract zip files correctly. + * See #195 and https://github.com/actions/toolkit/blob/6b63a2bfc339a753a113d2266323a4d52d84dee0/packages/tool-cache/src/tool-cache.ts#L44 + */ +async function downloadFile(downloadUrl) { + const dest = join(_getTempDirectory(), crypto.randomUUID(), extname(downloadUrl)); + return toolCacheExports.downloadTool(downloadUrl, dest); +} +function _getTempDirectory() { + const tempDirectory = process.env['RUNNER_TEMP'] || ''; + ok(tempDirectory, 'Expected RUNNER_TEMP to be defined'); + return tempDirectory; +} +function calculateSHA256(filePath) { + const hashSum = createHash('sha256'); + hashSum.update(readFileSync(filePath)); + return hashSum.digest('hex'); +} +async function extract(downloadPath) { + if (GRAALVM_FILE_EXTENSION === '.tar.gz') { + return await toolCacheExports.extractTar(downloadPath); + } + else if (GRAALVM_FILE_EXTENSION === '.zip') { + return await toolCacheExports.extractZip(downloadPath); + } + else { + throw new Error(`Unexpected filetype downloaded: ${GRAALVM_FILE_EXTENSION}`); + } +} +function findJavaHomeInSubfolder(searchPath) { + const baseContents = readdirSync(searchPath); + if (baseContents.length === 1) { + return join(searchPath, baseContents[0], JDK_HOME_SUFFIX); + } + else { + throw new Error(`Unexpected amount of directory items found: ${baseContents.length}`); + } +} +function toSemVer(version) { + const parts = version.split('.'); + if (parts.length === 4) { + /** + * Turn legacy GraalVM version numbers (e.g., `22.0.0.2`) into valid + * semver.org versions (e.g., `22.0.0-2`). + */ + return `${parts[0]}.${parts[1]}.${parts.slice(2).join('-')}`; + } + const versionParts = version.split('-', 2); + const suffix = versionParts.length === 2 ? '-' + versionParts[1] : ''; + const validVersion = semverExports.valid(semverExports.coerce(versionParts[0]) + suffix); + if (!validVersion) { + throw new Error(`Unable to convert '${version}' to semantic version. ${ERROR_HINT}`); + } + return validVersion; +} +function isPREvent() { + return process.env[ENV_GITHUB_EVENT_NAME] === EVENT_NAME_PULL_REQUEST; +} +function getOctokit() { + /* Set up GitHub instance manually because @actions/github does not allow unauthenticated access */ + const GitHubWithPlugins = GitHub.plugin(); + const token = coreExports.getInput(INPUT_GITHUB_TOKEN); + if (token) { + return new GitHubWithPlugins({ auth: `token ${token}` }); + } + else { + return new GitHubWithPlugins(); /* unauthenticated */ + } +} +function tmpfile(fileName) { + return join(tmpdir(), fileName); +} +function setNativeImageOption(javaVersionOrDev, optionValue) { + const coercedJavaVersionOrDev = semverExports.coerce(javaVersionOrDev); + if ((coercedJavaVersionOrDev && semverExports.gte(coercedJavaVersionOrDev, '22.0.0')) || + javaVersionOrDev === VERSION_DEV || + javaVersionOrDev.endsWith('-ea')) { + /* NATIVE_IMAGE_OPTIONS was introduced in GraalVM for JDK 22 (so were EA builds). */ + let newOptionValue = optionValue; + const existingOptions = process.env[NATIVE_IMAGE_OPTIONS_ENV]; + if (existingOptions) { + newOptionValue = `${existingOptions} ${newOptionValue}`; + } + coreExports.exportVariable(NATIVE_IMAGE_OPTIONS_ENV, newOptionValue); + } + else { + const optionsFile = getNativeImageOptionsFile(); + if (fs.existsSync(optionsFile)) { + fs.appendFileSync(optionsFile, ` ${optionValue}`); + } + else { + fs.writeFileSync(optionsFile, `NativeImageArgs = ${optionValue}`); + } + } +} +const NATIVE_IMAGE_CONFIG_FILE = tmpfile('native-image-options.properties'); +const NATIVE_IMAGE_CONFIG_FILE_ENV = 'NATIVE_IMAGE_CONFIG_FILE'; +function getNativeImageOptionsFile() { + let optionsFile = process.env[NATIVE_IMAGE_CONFIG_FILE_ENV]; + if (optionsFile === undefined) { + optionsFile = NATIVE_IMAGE_CONFIG_FILE; + coreExports.exportVariable(NATIVE_IMAGE_CONFIG_FILE_ENV, optionsFile); + } + return optionsFile; +} + +var ioExports = requireIo(); + +var retryHelperExports = requireRetryHelper(); + +const byteToHex = []; +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).slice(1)); +} +function unsafeStringify(arr, offset = 0) { + return (byteToHex[arr[offset + 0]] + + byteToHex[arr[offset + 1]] + + byteToHex[arr[offset + 2]] + + byteToHex[arr[offset + 3]] + + '-' + + byteToHex[arr[offset + 4]] + + byteToHex[arr[offset + 5]] + + '-' + + byteToHex[arr[offset + 6]] + + byteToHex[arr[offset + 7]] + + '-' + + byteToHex[arr[offset + 8]] + + byteToHex[arr[offset + 9]] + + '-' + + byteToHex[arr[offset + 10]] + + byteToHex[arr[offset + 11]] + + byteToHex[arr[offset + 12]] + + byteToHex[arr[offset + 13]] + + byteToHex[arr[offset + 14]] + + byteToHex[arr[offset + 15]]).toLowerCase(); } -var hasRequiredCore; +let getRandomValues; +const rnds8 = new Uint8Array(16); +function rng() { + if (!getRandomValues) { + if (typeof crypto === 'undefined' || !crypto.getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + getRandomValues = crypto.getRandomValues.bind(crypto); + } + return getRandomValues(rnds8); +} -function requireCore () { - if (hasRequiredCore) return core; - hasRequiredCore = 1; - (function (exports$1) { - var __createBinding = (core && core.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); - }) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (core && core.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function(o, v) { - o["default"] = v; - }); - var __importStar = (core && core.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (core && core.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports$1, "__esModule", { value: true }); - exports$1.platform = exports$1.toPlatformPath = exports$1.toWin32Path = exports$1.toPosixPath = exports$1.markdownSummary = exports$1.summary = exports$1.getIDToken = exports$1.getState = exports$1.saveState = exports$1.group = exports$1.endGroup = exports$1.startGroup = exports$1.info = exports$1.notice = exports$1.warning = exports$1.error = exports$1.debug = exports$1.isDebug = exports$1.setFailed = exports$1.setCommandEcho = exports$1.setOutput = exports$1.getBooleanInput = exports$1.getMultilineInput = exports$1.getInput = exports$1.addPath = exports$1.setSecret = exports$1.exportVariable = exports$1.ExitCode = void 0; - const command_1 = requireCommand(); - const file_command_1 = requireFileCommand(); - const utils_1 = requireUtils$2(); - const os = __importStar(require$$0$5); - const path = __importStar(require$$1__default); - const oidc_utils_1 = requireOidcUtils(); - /** - * The code to exit an action - */ - var ExitCode; - (function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; - })(ExitCode || (exports$1.ExitCode = ExitCode = {})); - //----------------------------------------------------------------------- - // Variables - //----------------------------------------------------------------------- - /** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function exportVariable(name, val) { - const convertedVal = (0, utils_1.toCommandValue)(val); - process.env[name] = convertedVal; - const filePath = process.env['GITHUB_ENV'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val)); - } - (0, command_1.issueCommand)('set-env', { name }, convertedVal); - } - exports$1.exportVariable = exportVariable; - /** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ - function setSecret(secret) { - (0, command_1.issueCommand)('add-mask', {}, secret); - } - exports$1.setSecret = setSecret; - /** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ - function addPath(inputPath) { - const filePath = process.env['GITHUB_PATH'] || ''; - if (filePath) { - (0, file_command_1.issueFileCommand)('PATH', inputPath); - } - else { - (0, command_1.issueCommand)('add-path', {}, inputPath); - } - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; - } - exports$1.addPath = addPath; - /** - * Gets the value of an input. - * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. - * Returns an empty string if the value is not defined. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); - } - exports$1.getInput = getInput; - /** - * Gets the values of an multiline input. Each value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string[] - * - */ - function getMultilineInput(name, options) { - const inputs = getInput(name, options) - .split('\n') - .filter(x => x !== ''); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map(input => input.trim()); - } - exports$1.getMultilineInput = getMultilineInput; - /** - * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. - * Support boolean input list: `true | True | TRUE | false | False | FALSE` . - * The return value is also in boolean type. - * ref: https://yaml.org/spec/1.2/spec.html#id2804923 - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns boolean - */ - function getBooleanInput(name, options) { - const trueValue = ['true', 'True', 'TRUE']; - const falseValue = ['false', 'False', 'FALSE']; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + - `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports$1.getBooleanInput = getBooleanInput; - /** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function setOutput(name, value) { - const filePath = process.env['GITHUB_OUTPUT'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - process.stdout.write(os.EOL); - (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value)); - } - exports$1.setOutput = setOutput; - /** - * Enables or disables the echoing of commands into stdout for the rest of the step. - * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. - * - */ - function setCommandEcho(enabled) { - (0, command_1.issue)('echo', enabled ? 'on' : 'off'); - } - exports$1.setCommandEcho = setCommandEcho; - //----------------------------------------------------------------------- - // Results - //----------------------------------------------------------------------- - /** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); - } - exports$1.setFailed = setFailed; - //----------------------------------------------------------------------- - // Logging Commands - //----------------------------------------------------------------------- - /** - * Gets whether Actions Step Debug is on or not - */ - function isDebug() { - return process.env['RUNNER_DEBUG'] === '1'; - } - exports$1.isDebug = isDebug; - /** - * Writes debug message to user log - * @param message debug message - */ - function debug(message) { - (0, command_1.issueCommand)('debug', {}, message); - } - exports$1.debug = debug; - /** - * Adds an error issue - * @param message error issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function error(message, properties = {}) { - (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.error = error; - /** - * Adds a warning issue - * @param message warning issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function warning(message, properties = {}) { - (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.warning = warning; - /** - * Adds a notice issue - * @param message notice issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function notice(message, properties = {}) { - (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports$1.notice = notice; - /** - * Writes info to log with console.log. - * @param message info message - */ - function info(message) { - process.stdout.write(message + os.EOL); - } - exports$1.info = info; - /** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ - function startGroup(name) { - (0, command_1.issue)('group', name); - } - exports$1.startGroup = startGroup; - /** - * End an output group. - */ - function endGroup() { - (0, command_1.issue)('endgroup'); - } - exports$1.endGroup = endGroup; - /** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ - function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); - } - exports$1.group = group; - //----------------------------------------------------------------------- - // Wrapper action state - //----------------------------------------------------------------------- - /** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function saveState(name, value) { - const filePath = process.env['GITHUB_STATE'] || ''; - if (filePath) { - return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value)); - } - exports$1.saveState = saveState; - /** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ - function getState(name) { - return process.env[`STATE_${name}`] || ''; - } - exports$1.getState = getState; - function getIDToken(aud) { - return __awaiter(this, void 0, void 0, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); - } - exports$1.getIDToken = getIDToken; - /** - * Summary exports - */ - var summary_1 = requireSummary(); - Object.defineProperty(exports$1, "summary", { enumerable: true, get: function () { return summary_1.summary; } }); - /** - * @deprecated use core.summary - */ - var summary_2 = requireSummary(); - Object.defineProperty(exports$1, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } }); - /** - * Path exports - */ - var path_utils_1 = requirePathUtils(); - Object.defineProperty(exports$1, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } }); - Object.defineProperty(exports$1, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } }); - Object.defineProperty(exports$1, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } }); - /** - * Platform utilities exports - */ - exports$1.platform = __importStar(requirePlatform()); - - } (core)); - return core; +const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto); +var native = { randomUUID }; + +function _v4(options, buf, offset) { + options = options || {}; + const rnds = options.random ?? options.rng?.() ?? rng(); + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + return unsafeStringify(rnds); +} +function v4(options, buf, offset) { + if (native.randomUUID && true && !options) { + return native.randomUUID(); + } + return _v4(options); +} + +async function downloadGraalVM(gdsToken, javaVersion) { + const userAgent = `GraalVMGitHubAction/${ACTION_VERSION} (arch:${GRAALVM_ARCH}; os:${GRAALVM_PLATFORM}; java:${javaVersion})`; + const baseArtifact = await fetchArtifact(userAgent, 'isBase:True', javaVersion); + return downloadArtifact(gdsToken, userAgent, baseArtifact); +} +async function downloadGraalVMEELegacy(gdsToken, version, javaVersion) { + const userAgent = `GraalVMGitHubAction/${ACTION_VERSION} (arch:${GRAALVM_ARCH}; os:${GRAALVM_PLATFORM}; java:${javaVersion})`; + const baseArtifact = await fetchArtifactEE(userAgent, 'isBase:True', version, javaVersion); + return downloadArtifact(gdsToken, userAgent, baseArtifact); +} +async function fetchArtifact(userAgent, metadata, javaVersion) { + const http = new libExports.HttpClient(userAgent); + let filter; + if (javaVersion.includes('.')) { + filter = `metadata=version:${javaVersion}`; + } + else { + filter = `sortBy=timeCreated&sortOrder=DESC&limit=1`; // latest and only one item + } + let majorJavaVersion; + if (semverExports.valid(javaVersion)) { + majorJavaVersion = semverExports.major(javaVersion); + } + else { + majorJavaVersion = javaVersion; + } + const catalogOS = IS_MACOS ? 'macos' : GRAALVM_PLATFORM; + const requestUrl = `${GDS_BASE}/artifacts?productId=${GDS_GRAALVM_PRODUCT_ID}&displayName=Oracle%20GraalVM&${filter}&metadata=java:jdk${majorJavaVersion}&metadata=os:${catalogOS}&metadata=arch:${GRAALVM_ARCH}&metadata=${metadata}&status=PUBLISHED&responseFields=id&responseFields=checksum`; + coreExports.debug(`Requesting ${requestUrl}`); + const response = await http.get(requestUrl, { accept: 'application/json' }); + if (response.message.statusCode !== 200) { + throw new Error(`Unable to find GraalVM for JDK ${javaVersion}. Are you sure java-version: '${javaVersion}' is correct?`); + } + const artifactResponse = JSON.parse(await response.readBody()); + if (artifactResponse.items.length !== 1) { + throw new Error(artifactResponse.items.length > 1 + ? `Found more than one GDS artifact. ${ERROR_HINT}` + : `Unable to find GDS artifact. Are you sure java-version: '${javaVersion}' is correct?`); + } + return artifactResponse.items[0]; +} +async function fetchArtifactEE(userAgent, metadata, version, javaVersion) { + const http = new libExports.HttpClient(userAgent); + let filter; + if (version === VERSION_LATEST) { + filter = `sortBy=displayName&sortOrder=DESC&limit=1`; // latest and only one item + } + else { + filter = `metadata=version:${version}`; + } + const catalogOS = IS_MACOS ? 'macos' : GRAALVM_PLATFORM; + const requestUrl = `${GDS_BASE}/artifacts?productId=${GDS_GRAALVM_PRODUCT_ID}&${filter}&metadata=java:jdk${javaVersion}&metadata=os:${catalogOS}&metadata=arch:${GRAALVM_ARCH}&metadata=${metadata}&status=PUBLISHED&responseFields=id&responseFields=checksum`; + coreExports.debug(`Requesting ${requestUrl}`); + const response = await http.get(requestUrl, { accept: 'application/json' }); + if (response.message.statusCode !== 200) { + throw new Error(`Unable to find JDK${javaVersion}-based GraalVM EE ${version}`); + } + const artifactResponse = JSON.parse(await response.readBody()); + if (artifactResponse.items.length !== 1) { + throw new Error(artifactResponse.items.length > 1 + ? `Found more than one GDS artifact. ${ERROR_HINT}` + : `Unable to find GDS artifact. Are you sure version: '${version}' is correct?`); + } + return artifactResponse.items[0]; +} +async function downloadArtifact(gdsToken, userAgent, artifact) { + let downloadPath; + try { + downloadPath = await downloadTool(`${GDS_BASE}/artifacts/${artifact.id}/content`, userAgent, { + accept: 'application/x-yaml', + 'x-download-token': gdsToken + }); + } + catch (err) { + if (err instanceof HTTPError && err.httpStatusCode) { + if (err.httpStatusCode === 401) { + throw new Error(`The provided "gds-token" was rejected (reason: "${err.gdsError.message}", opc-request-id: ${err.headers['opc-request-id']})`); + } + } + throw err; + } + const sha256 = calculateSHA256(downloadPath); + if (sha256.toLowerCase() !== artifact.checksum.toLowerCase()) { + throw new Error(`Checksum does not match (expected: "${artifact.checksum}", got: "${sha256}")`); + } + return downloadPath; +} +/** + * Simplified fork of tool-cache's downloadTool [1] with the ability to set a custom user agent. + * [1] https://github.com/actions/toolkit/blob/2f164000dcd42fb08287824a3bc3030dbed33687/packages/tool-cache/src/tool-cache.ts + */ +class HTTPError extends Error { + httpStatusCode; + gdsError; + headers; + constructor(httpStatusCode, gdsError, headers) { + super(`Unexpected HTTP response: ${httpStatusCode}`); + this.httpStatusCode = httpStatusCode; + this.gdsError = gdsError; + this.headers = headers; + Object.setPrototypeOf(this, new.target.prototype); + } +} +async function downloadTool(url, userAgent, headers) { + const dest = require$$1$1.join(getTempDirectory(), v4()); + await ioExports.mkdirP(require$$1$1.dirname(dest)); + coreExports.debug(`Downloading ${url}`); + coreExports.debug(`Destination ${dest}`); + const maxAttempts = 3; + const minSeconds = 10; + const maxSeconds = 20; + const retryHelper = new retryHelperExports.RetryHelper(maxAttempts, minSeconds, maxSeconds); + return await retryHelper.execute(async () => { + return await downloadToolAttempt(url, userAgent, dest || '', headers); + }, (err) => { + if (err instanceof HTTPError && err.httpStatusCode) { + // Don't retry anything less than 500, except 408 Request Timeout and 429 Too Many Requests + if (err.httpStatusCode < 500 && err.httpStatusCode !== 408 && err.httpStatusCode !== 429) { + return false; + } + } + // Otherwise retry + return true; + }); +} +async function downloadToolAttempt(url, userAgent, dest, headers) { + if (fs.existsSync(dest)) { + throw new Error(`Destination file path ${dest} already exists`); + } + // Get the response headers + const http = new libExports.HttpClient(userAgent, [], { + allowRetries: false + }); + const response = await http.get(url, headers); + if (response.message.statusCode !== 200) { + const errorResponse = JSON.parse(await response.readBody()); + const err = new HTTPError(response.message.statusCode, errorResponse, response.message.headers); + coreExports.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); + throw err; + } + // Download the response body + const pipeline = require$$6.promisify(require$$9.pipeline); + let succeeded = false; + try { + await pipeline(response.message, fs.createWriteStream(dest)); + coreExports.debug('Download complete'); + succeeded = true; + return dest; + } + finally { + // Error, delete dest before retry + if (!succeeded) { + coreExports.debug('Download failed'); + try { + await ioExports.rmRF(dest); + } + catch (err) { + coreExports.debug(`Failed to delete '${dest}'. ${err}`); + } + } + } +} +function getTempDirectory() { + const tempDirectory = process.env['RUNNER_TEMP'] || ''; + ok(tempDirectory, 'Expected RUNNER_TEMP to be defined'); + return tempDirectory; +} + +const GRAALVM_DL_BASE = 'https://download.oracle.com/graalvm'; +const GRAALVM_CE_DL_BASE = `https://github.com/graalvm/${GRAALVM_RELEASES_REPO}/releases/download`; +const ORACLE_GRAALVM_REPO_EA_BUILDS = 'oracle-graalvm-ea-builds'; +const ORACLE_GRAALVM_REPO_EA_BUILDS_LATEST_SYMBOL = 'latest-ea'; +const GRAALVM_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'; +const GRAALVM_JDK_TAG_PREFIX = 'jdk-'; +const GRAALVM_TAG_PREFIX = 'vm-'; +// Support for GraalVM for JDK 17 and later +async function setUpGraalVMJDK(javaVersionOrDev, gdsToken) { + if (javaVersionOrDev === VERSION_DEV) { + return setUpGraalVMJDKDevBuild(); + } + const isTokenProvided = gdsToken.length > 0; + let javaVersion = javaVersionOrDev; + const toolName = determineToolName$2(javaVersion, false); + if (javaVersionOrDev === '17' && !isTokenProvided) { + coreExports.warning('This build uses the last update of Oracle GraalVM for JDK 17 under the GFTC. More details: https://github.com/marketplace/actions/github-action-for-graalvm#notes-on-oracle-graalvm-for-jdk-17'); + return setUpGraalVMJDK('17.0.12', gdsToken); + } + if (IS_MACOS && JDK_ARCH === 'x64') { + if (javaVersionOrDev === '25') { + coreExports.warning('This build uses Oracle GraalVM for JDK 25.0.1, the last available JDK 25 build for macOS Intel.'); + return setUpGraalVMJDK('25.0.1', gdsToken); + } + else if (javaVersionOrDev === '21') { + coreExports.warning('This build uses Oracle GraalVM for JDK 21.0.9, the last available JDK 21 build for macOS Intel.'); + return setUpGraalVMJDK('21.0.9', gdsToken); + } + else if (javaVersionOrDev === '17') { + coreExports.warning('This build uses Oracle GraalVM for JDK 17.0.17, the last available JDK 17 build for macOS Intel.'); + return setUpGraalVMJDK('17.0.17', gdsToken); + } + } + if (isTokenProvided) { + // Download from GDS + const downloader = async () => downloadGraalVM(gdsToken, javaVersion); + return downloadExtractAndCacheJDK(downloader, toolName, javaVersion); + } + // Download from oracle.com + let downloadName = toolName; + let downloadUrl; + if (javaVersion.endsWith('-ea')) { + downloadUrl = await findLatestEABuildDownloadUrl(javaVersion); + const filename = basename(downloadUrl); + const resolvedVersion = semverExports.valid(semverExports.coerce(filename)); + if (!resolvedVersion) { + throw new Error(`Unable to determine resolved version based on '${filename}'. ${ERROR_REQUEST}`); + } + javaVersion = resolvedVersion; + } + else if (javaVersion.includes('.')) { + if (semverExports.valid(javaVersion)) { + const majorJavaVersion = semverExports.major(javaVersion); + const minorJavaVersion = semverExports.minor(javaVersion); + const patchJavaVersion = semverExports.patch(javaVersion); + const isGARelease = minorJavaVersion === 0 && patchJavaVersion === 0; + if (isGARelease) { + // For GA versions of JDKs, /archive/ does not use minor and patch version (see https://www.oracle.com/java/technologies/jdk-script-friendly-urls/) + downloadName = determineToolName$2(majorJavaVersion.toString(), false); + } + downloadUrl = `${GRAALVM_DL_BASE}/${majorJavaVersion}/archive/${downloadName}${GRAALVM_FILE_EXTENSION}`; + } + else { + throw new Error(`java-version set to '${javaVersion}'. Please make sure the java-version is set correctly. ${ERROR_HINT}`); + } + } + else { + downloadUrl = `${GRAALVM_DL_BASE}/${javaVersion}/latest/${downloadName}${GRAALVM_FILE_EXTENSION}`; + } + const downloader = async () => downloadGraalVMJDK(downloadUrl, javaVersion); + return downloadExtractAndCacheJDK(downloader, toolName, javaVersion); +} +async function findLatestEABuildDownloadUrl(javaEaVersion) { + const filePath = `versions/${javaEaVersion}.json`; + let response; + try { + response = await getContents(ORACLE_GRAALVM_REPO_EA_BUILDS, filePath); + } + catch (error) { + throw new Error(`Unable to resolve download URL for '${javaEaVersion}' (reason: ${error}). Please make sure the java-version is set correctly. ${ERROR_HINT}`); + } + if (Array.isArray(response) || response.type !== 'file' || !response.content) { + throw new Error(`Unexpected response when resolving download URL for '${javaEaVersion}'. ${ERROR_REQUEST}`); + } + const versionData = JSON.parse(Buffer.from(response.content, 'base64').toString('utf-8')); + let latestVersion; + if (javaEaVersion === ORACLE_GRAALVM_REPO_EA_BUILDS_LATEST_SYMBOL) { + latestVersion = versionData; + } + else { + latestVersion = versionData.find((v) => v.latest); + if (!latestVersion) { + throw new Error(`Unable to find latest version for '${javaEaVersion}'. ${ERROR_REQUEST}`); + } + } + const file = latestVersion.files.find((f) => f.arch === JDK_ARCH && f.platform === GRAALVM_PLATFORM); + if (!file || !file.filename.startsWith('graalvm-jdk-')) { + throw new Error(`Unable to find file metadata for '${javaEaVersion}'. ${ERROR_REQUEST}`); + } + return `${latestVersion.download_base_url}${file.filename}`; +} +async function setUpGraalVMJDKCE(javaVersionOrDev) { + if (javaVersionOrDev === VERSION_DEV) { + return setUpGraalVMJDKDevBuild(); + } + if (IS_MACOS && JDK_ARCH === 'x64' && javaVersionOrDev === '25') { + coreExports.warning('This build uses GraalVM CE for JDK 25.0.1, the last available JDK 25 build for macOS Intel.'); + return setUpGraalVMJDKCE('25.0.1'); + } + let javaVersion = javaVersionOrDev; + if (!javaVersion.includes('.')) { + javaVersion = await findLatestGraalVMJDKCEJavaVersion(javaVersion); + } + if (javaVersion.split('.').length != 3) { + throw new Error(`java-version set to '${javaVersionOrDev}', which was resolved to '${javaVersion}'. Please make sure the java-version is set correctly. ${ERROR_HINT}`); + } + const toolName = determineToolName$2(javaVersion, true); + const downloadUrl = `${GRAALVM_CE_DL_BASE}/jdk-${javaVersion}/${toolName}${GRAALVM_FILE_EXTENSION}`; + const downloader = async () => downloadGraalVMJDK(downloadUrl, javaVersion); + return downloadExtractAndCacheJDK(downloader, toolName, javaVersion); +} +async function findLatestGraalVMJDKCEJavaVersion(majorJavaVersion) { + const matchingRefs = await getMatchingTags(GRAALVM_GH_USER, GRAALVM_RELEASES_REPO, `${GRAALVM_JDK_TAG_PREFIX}${majorJavaVersion}`); + const lowestNonExistingVersion = '0.0.1'; + let highestVersion = lowestNonExistingVersion; + const versionNumberStartIndex = `refs/tags/${GRAALVM_JDK_TAG_PREFIX}`.length; + for (const matchingRef of matchingRefs) { + const currentVersion = matchingRef.ref.substring(versionNumberStartIndex); + if (semverExports.valid(currentVersion) && semverExports.gt(currentVersion, highestVersion)) { + highestVersion = currentVersion; + } + } + if (highestVersion === lowestNonExistingVersion) { + throw new Error(`Unable to find the latest Java version for '${majorJavaVersion}'. Please make sure the java-version is set correctly. ${ERROR_HINT}`); + } + return highestVersion; +} +function determineToolName$2(javaVersion, isCommunity) { + return `graalvm${isCommunity ? '-community' : ''}-jdk-${javaVersion}_${JDK_PLATFORM}-${JDK_ARCH}_bin`; +} +async function downloadGraalVMJDK(downloadUrl, javaVersion) { + try { + return await downloadFile(downloadUrl); + } + catch (error) { + if (error instanceof Error && error.message.includes('404')) { + // Not Found + throw new Error(`Failed to download ${basename(downloadUrl)}. Are you sure java-version: '${javaVersion}' is correct?`); + } + throw new Error(`Failed to download ${basename(downloadUrl)} (error: ${error}).`); + } +} +// Support for GraalVM dev builds +async function setUpGraalVMJDKDevBuild() { + const latestDevBuild = await getLatestRelease(GRAALVM_REPO_DEV_BUILDS); + const resolvedJavaVersion = findHighestJavaVersion(latestDevBuild, VERSION_DEV); + const downloadUrl = findDownloadUrl(latestDevBuild, resolvedJavaVersion); + return downloadAndExtractJDK(downloadUrl); +} +function findHighestJavaVersion(release, version) { + const graalVMIdentifierPattern = determineGraalVMLegacyIdentifier(false, version, '(\\d+)'); + const expectedFileNameRegExp = new RegExp(`^${graalVMIdentifierPattern}${GRAALVM_FILE_EXTENSION.replace(/\./g, '\\.')}$`); + let highestJavaVersion = 0; + for (const asset of release.assets) { + const matches = asset.name.match(expectedFileNameRegExp); + if (matches) { + const javaVersion = +matches[1]; + if (javaVersion > highestJavaVersion) { + highestJavaVersion = javaVersion; + } + } + } + if (highestJavaVersion > 0) { + return String(highestJavaVersion); + } + else { + return undefined; + } +} +// Support for GraalVM 22.X releases and earlier +async function setUpGraalVMLatest_22_X(gdsToken, javaVersion) { + const lockedVersion = javaVersion === '19' ? '22.3.1' : '22.3.3'; + if (gdsToken.length > 0) { + return setUpGraalVMRelease(gdsToken, lockedVersion, javaVersion); + } + const latestRelease = await getTaggedRelease(GRAALVM_GH_USER, GRAALVM_RELEASES_REPO, GRAALVM_TAG_PREFIX + lockedVersion); + const version = findGraalVMVersion(latestRelease); + return setUpGraalVMRelease(gdsToken, version, javaVersion); +} +function findGraalVMVersion(release) { + const tag_name = release.tag_name; + if (!tag_name.startsWith(GRAALVM_TAG_PREFIX)) { + throw new Error(`Could not find latest GraalVM release: ${tag_name}`); + } + return tag_name.substring(GRAALVM_TAG_PREFIX.length, tag_name.length); +} +async function setUpGraalVMRelease(gdsToken, version, javaVersion) { + const isEE = gdsToken.length > 0; + const toolName = determineLegacyToolName(isEE, version, javaVersion); + let downloader; + if (isEE) { + downloader = async () => downloadGraalVMEELegacy(gdsToken, version, javaVersion); + } + else { + downloader = async () => downloadGraalVMCELegacy(version, javaVersion); + } + return downloadExtractAndCacheJDK(downloader, toolName, version); +} +function findDownloadUrl(release, javaVersion) { + const graalVMIdentifier = javaVersion + ? determineGraalVMLegacyIdentifier(false, VERSION_DEV, javaVersion) + : determineGraalVMIdentifier(false, VERSION_DEV); + const expectedFileName = `${graalVMIdentifier}${GRAALVM_FILE_EXTENSION}`; + for (const asset of release.assets) { + if (asset.name === expectedFileName) { + return asset.browser_download_url; + } + } + throw new Error(`Could not find GraalVM dev build for Java ${javaVersion}. It may no longer be available, so please consider upgrading the Java version. ${ERROR_HINT}`); +} +function determineGraalVMIdentifier(isEE, version) { + const infix = 'community' ; + return `graalvm-${infix}-${version}-${GRAALVM_PLATFORM}-${GRAALVM_ARCH}`; +} +function determineGraalVMLegacyIdentifier(isEE, version, javaVersion) { + return `${determineLegacyToolName(isEE, version, javaVersion)}-${GRAALVM_ARCH}-${version}`; +} +function determineLegacyToolName(isEE, version, javaVersion) { + const infix = isEE ? 'ee' : version === VERSION_DEV ? 'community' : 'ce'; + return `graalvm-${infix}-java${javaVersion}-${GRAALVM_PLATFORM}`; +} +async function downloadGraalVMCELegacy(version, javaVersion) { + const graalVMIdentifier = determineGraalVMLegacyIdentifier(false, version, javaVersion); + const downloadUrl = `${GRAALVM_CE_DL_BASE}/${GRAALVM_TAG_PREFIX}${version}/${graalVMIdentifier}${GRAALVM_FILE_EXTENSION}`; + try { + return await downloadFile(downloadUrl); + } + catch (error) { + if (error instanceof Error && error.message.includes('404')) { + // Not Found + throw new Error(`Failed to download ${graalVMIdentifier}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?`); + } + throw new Error(`Failed to download ${graalVMIdentifier} (error: ${error}).`); + } } +var cache$2 = {}; + +var cacheUtils = {}; + +var glob = {}; + +var internalGlobber = {}; + var internalGlobOptionsHelper = {}; var hasRequiredInternalGlobOptionsHelper; @@ -44762,15 +68368,25 @@ function requireInternalGlobOptionsHelper () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalGlobOptionsHelper && internalGlobOptionsHelper.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalGlobOptionsHelper && internalGlobOptionsHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(internalGlobOptionsHelper, "__esModule", { value: true }); - internalGlobOptionsHelper.getOptions = void 0; + internalGlobOptionsHelper.getOptions = getOptions; const core = __importStar(requireCore()); /** * Returns a copy with defaults filled in. @@ -44807,7 +68423,6 @@ function requireInternalGlobOptionsHelper () { } return result; } - internalGlobOptionsHelper.getOptions = getOptions; return internalGlobOptionsHelper; } @@ -44837,20 +68452,35 @@ function requireInternalPathHelper () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalPathHelper && internalPathHelper.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalPathHelper && internalPathHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __importDefault = (internalPathHelper && internalPathHelper.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(internalPathHelper, "__esModule", { value: true }); - internalPathHelper.safeTrimTrailingSeparator = internalPathHelper.normalizeSeparators = internalPathHelper.hasRoot = internalPathHelper.hasAbsoluteRoot = internalPathHelper.ensureAbsoluteRoot = internalPathHelper.dirname = void 0; + internalPathHelper.dirname = dirname; + internalPathHelper.ensureAbsoluteRoot = ensureAbsoluteRoot; + internalPathHelper.hasAbsoluteRoot = hasAbsoluteRoot; + internalPathHelper.hasRoot = hasRoot; + internalPathHelper.normalizeSeparators = normalizeSeparators; + internalPathHelper.safeTrimTrailingSeparator = safeTrimTrailingSeparator; const path = __importStar(require$$1__default); - const assert_1 = __importDefault(require$$0$8); + const assert_1 = __importDefault(require$$2$1); const IS_WINDOWS = process.platform === 'win32'; /** * Similar to path.dirname except normalizes the path separators and slightly better handling for Windows UNC paths. @@ -44884,7 +68514,6 @@ function requireInternalPathHelper () { } return result; } - internalPathHelper.dirname = dirname; /** * Roots the path if not already rooted. On Windows, relative roots like `\` * or `C:` are expanded based on the current working directory. @@ -44939,7 +68568,6 @@ function requireInternalPathHelper () { } return root + itemPath; } - internalPathHelper.ensureAbsoluteRoot = ensureAbsoluteRoot; /** * On Linux/macOS, true if path starts with `/`. On Windows, true for paths like: * `\\hello\share` and `C:\hello` (and using alternate separator). @@ -44956,7 +68584,6 @@ function requireInternalPathHelper () { // E.g. /hello return itemPath.startsWith('/'); } - internalPathHelper.hasAbsoluteRoot = hasAbsoluteRoot; /** * On Linux/macOS, true if path starts with `/`. On Windows, true for paths like: * `\`, `\hello`, `\\hello\share`, `C:`, and `C:\hello` (and using alternate separator). @@ -44974,7 +68601,6 @@ function requireInternalPathHelper () { // E.g. /hello return itemPath.startsWith('/'); } - internalPathHelper.hasRoot = hasRoot; /** * Removes redundant slashes and converts `/` to `\` on Windows */ @@ -44991,7 +68617,6 @@ function requireInternalPathHelper () { // Remove redundant slashes return p.replace(/\/\/+/g, '/'); } - internalPathHelper.normalizeSeparators = normalizeSeparators; /** * Normalizes the path separators and trims the trailing separator (when safe). * For example, `/foo/ => /foo` but `/ => /` @@ -45018,7 +68643,6 @@ function requireInternalPathHelper () { // Otherwise trim trailing slash return p.substr(0, p.length - 1); } - internalPathHelper.safeTrimTrailingSeparator = safeTrimTrailingSeparator; return internalPathHelper; } @@ -45071,15 +68695,27 @@ function requireInternalPatternHelper () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalPatternHelper && internalPatternHelper.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalPatternHelper && internalPatternHelper.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(internalPatternHelper, "__esModule", { value: true }); - internalPatternHelper.partialMatch = internalPatternHelper.match = internalPatternHelper.getSearchPaths = void 0; + internalPatternHelper.getSearchPaths = getSearchPaths; + internalPatternHelper.match = match; + internalPatternHelper.partialMatch = partialMatch; const pathHelper = __importStar(requireInternalPathHelper()); const internal_match_kind_1 = requireInternalMatchKind(); const IS_WINDOWS = process.platform === 'win32'; @@ -45127,7 +68763,6 @@ function requireInternalPatternHelper () { } return result; } - internalPatternHelper.getSearchPaths = getSearchPaths; /** * Matches the patterns against the path */ @@ -45143,14 +68778,12 @@ function requireInternalPatternHelper () { } return result; } - internalPatternHelper.match = match; /** * Checks whether to descend further into the directory */ function partialMatch(patterns, itemPath) { return patterns.some(x => !x.negate && x.partialMatch(itemPath)); } - internalPatternHelper.partialMatch = partialMatch; return internalPatternHelper; } @@ -47328,13 +70961,23 @@ function requireInternalPath () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalPath && internalPath.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalPath && internalPath.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __importDefault = (internalPath && internalPath.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; @@ -47342,7 +70985,7 @@ function requireInternalPath () { internalPath.Path = void 0; const path = __importStar(require$$1__default); const pathHelper = __importStar(requireInternalPathHelper()); - const assert_1 = __importDefault(require$$0$8); + const assert_1 = __importDefault(require$$2$1); const IS_WINDOWS = process.platform === 'win32'; /** * Helper class for parsing paths into segments @@ -47452,22 +71095,32 @@ function requireInternalPattern () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalPattern && internalPattern.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalPattern && internalPattern.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __importDefault = (internalPattern && internalPattern.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(internalPattern, "__esModule", { value: true }); internalPattern.Pattern = void 0; - const os = __importStar(require$$0$5); + const os$1 = __importStar(os); const path = __importStar(require$$1__default); const pathHelper = __importStar(requireInternalPathHelper()); - const assert_1 = __importDefault(require$$0$8); + const assert_1 = __importDefault(require$$2$1); const minimatch_1 = requireCommonjs$f(); const internal_match_kind_1 = requireInternalMatchKind(); const internal_path_1 = requireInternalPath(); @@ -47598,7 +71251,7 @@ function requireInternalPattern () { } // Replace leading `~` segment else if (pattern === '~' || pattern.startsWith(`~${path.sep}`)) { - homedir = homedir || os.homedir(); + homedir = homedir || os$1.homedir(); (0, assert_1.default)(homedir, 'Unable to determine HOME directory'); (0, assert_1.default)(pathHelper.hasAbsoluteRoot(homedir), `Expected HOME directory to be a rooted path. Actual '${homedir}'`); pattern = Pattern.globEscape(homedir) + pattern.substr(1); @@ -47738,13 +71391,23 @@ function requireInternalGlobber () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalGlobber && internalGlobber.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalGlobber && internalGlobber.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = (internalGlobber && internalGlobber.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -47765,8 +71428,9 @@ function requireInternalGlobber () { var __asyncGenerator = (internalGlobber && internalGlobber.__asyncGenerator) || function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } + function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } @@ -47795,8 +71459,8 @@ function requireInternalGlobber () { return this.searchPaths.slice(); } glob() { - var _a, e_1, _b, _c; return __awaiter(this, void 0, void 0, function* () { + var _a, e_1, _b, _c; const result = []; try { for (var _d = true, _e = __asyncValues(this.globGenerator()), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) { @@ -47992,13 +71656,23 @@ function requireInternalHashFiles () { }) : function(o, v) { o["default"] = v; }); - var __importStar = (internalHashFiles && internalHashFiles.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; + var __importStar = (internalHashFiles && internalHashFiles.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = (internalHashFiles && internalHashFiles.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -48016,22 +71690,22 @@ function requireInternalHashFiles () { function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; Object.defineProperty(internalHashFiles, "__esModule", { value: true }); - internalHashFiles.hashFiles = void 0; - const crypto = __importStar(require$$0$6); + internalHashFiles.hashFiles = hashFiles; + const crypto = __importStar(require$$0$3); const core = __importStar(requireCore()); const fs = __importStar(fs__default); - const stream = __importStar(require$$0__default$1); - const util = __importStar(require$$0__default); + const stream = __importStar(require$$9__default); + const util = __importStar(require$$6__default); const path = __importStar(require$$1__default); - function hashFiles(globber, currentWorkspace, verbose = false) { - var _a, e_1, _b, _c; - var _d; - return __awaiter(this, void 0, void 0, function* () { + function hashFiles(globber_1, currentWorkspace_1) { + return __awaiter(this, arguments, void 0, function* (globber, currentWorkspace, verbose = false) { + var _a, e_1, _b, _c; + var _d; const writeDelegate = verbose ? core.info : core.debug; let hasMatch = false; const githubWorkspace = currentWorkspace ? currentWorkspace - : (_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd(); + : ((_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd()); const result = crypto.createHash('sha256'); let count = 0; try { @@ -48076,7 +71750,6 @@ function requireInternalHashFiles () { } }); } - internalHashFiles.hashFiles = hashFiles; return internalHashFiles; } @@ -48096,7 +71769,8 @@ function requireGlob () { }); }; Object.defineProperty(glob, "__esModule", { value: true }); - glob.hashFiles = glob.create = void 0; + glob.create = create; + glob.hashFiles = hashFiles; const internal_globber_1 = requireInternalGlobber(); const internal_hash_files_1 = requireInternalHashFiles(); /** @@ -48110,7 +71784,6 @@ function requireGlob () { return yield internal_globber_1.DefaultGlobber.create(patterns, options); }); } - glob.create = create; /** * Computes the sha256 hash of a glob * @@ -48119,8 +71792,8 @@ function requireGlob () { * @param options Glob options * @param verbose Enables verbose logging */ - function hashFiles(patterns, currentWorkspace = '', options, verbose = false) { - return __awaiter(this, void 0, void 0, function* () { + function hashFiles(patterns_1) { + return __awaiter(this, arguments, void 0, function* (patterns, currentWorkspace = '', options, verbose = false) { let followSymbolicLinks = true; if (options && typeof options.followSymbolicLinks === 'boolean') { followSymbolicLinks = options.followSymbolicLinks; @@ -48129,7 +71802,6 @@ function requireGlob () { return (0, internal_hash_files_1.hashFiles)(globber, currentWorkspace, verbose); }); } - glob.hashFiles = hashFiles; return glob; } @@ -49900,15 +73572,15 @@ function requireCacheUtils () { cacheUtils.assertDefined = assertDefined; cacheUtils.getCacheVersion = getCacheVersion; cacheUtils.getRuntimeToken = getRuntimeToken; - const core = __importStar(requireCore$2()); - const exec = __importStar(requireExec$2()); + const core = __importStar(requireCore()); + const exec = __importStar(requireExec()); const glob = __importStar(requireGlob()); - const io = __importStar(requireIo$2()); - const crypto = __importStar(require$$0$6); + const io = __importStar(requireIo()); + const crypto = __importStar(require$$0$3); const fs = __importStar(fs__default); const path = __importStar(require$$1__default); const semver = __importStar(requireSemver()); - const util = __importStar(require$$0__default); + const util = __importStar(require$$6__default); const constants_1 = requireConstants$5(); const versionSalt = '1.0'; // From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23 @@ -50583,8 +74255,8 @@ function requireLog$5 () { Object.defineProperty(log$5, "__esModule", { value: true }); log$5.log = log; const tslib_1 = require$$0$2; - const node_os_1 = require$$1$7; - const node_util_1 = tslib_1.__importDefault(require$$1$5); + const node_os_1 = require$$1$8; + const node_util_1 = tslib_1.__importDefault(require$$0$a); const node_process_1 = tslib_1.__importDefault(require$$2$3); function log(message, ...args) { node_process_1.default.stderr.write(`${node_util_1.default.format(message, ...args)}${node_os_1.EOL}`); @@ -51487,7 +75159,7 @@ function requireInspect () { // Licensed under the MIT License. Object.defineProperty(inspect, "__esModule", { value: true }); inspect.custom = void 0; - const node_util_1 = require$$1$5; + const node_util_1 = require$$0$a; inspect.custom = node_util_1.inspect.custom; return inspect; @@ -51828,10 +75500,10 @@ function requireNodeHttpClient () { nodeHttpClient.getBodyLength = getBodyLength; nodeHttpClient.createNodeHttpClient = createNodeHttpClient; const tslib_1 = require$$0$2; - const node_http_1 = tslib_1.__importDefault(require$$1$8); + const node_http_1 = tslib_1.__importDefault(require$$2); const node_https_1 = tslib_1.__importDefault(require$$2$4); - const node_zlib_1 = tslib_1.__importDefault(require$$3$2); - const node_stream_1 = require$$0$b; + const node_zlib_1 = tslib_1.__importDefault(require$$3); + const node_stream_1 = require$$0$8; const AbortError_js_1 = requireAbortError$3(); const httpHeaders_js_1 = requireHttpHeaders$1(); const restError_js_1 = requireRestError$2(); @@ -52334,7 +76006,7 @@ function requireUserAgentPlatform$1 () { userAgentPlatform$1.getHeaderName = getHeaderName; userAgentPlatform$1.setPlatformSpecificData = setPlatformSpecificData; const tslib_1 = require$$0$2; - const node_os_1 = tslib_1.__importDefault(require$$1$7); + const node_os_1 = tslib_1.__importDefault(require$$1$8); const node_process_1 = tslib_1.__importDefault(require$$2$3); /** * @internal @@ -53906,7 +77578,7 @@ var hasRequiredSupportsColor; function requireSupportsColor () { if (hasRequiredSupportsColor) return supportsColor_1; hasRequiredSupportsColor = 1; - const os = require$$0$5; + const os$1 = os; const tty = require$$1$9; const hasFlag = requireHasFlag(); @@ -53976,7 +77648,7 @@ function requireSupportsColor () { if (process.platform === 'win32') { // Windows 10 build 10586 is the first Windows release that supports 256 colors. // Windows 10 build 14931 is the first release that supports 16m/TrueColor. - const osRelease = os.release().split('.'); + const osRelease = os$1.release().split('.'); if ( Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586 @@ -54054,7 +77726,7 @@ function requireNode () { hasRequiredNode = 1; (function (module, exports$1) { const tty = require$$1$9; - const util = require$$0__default; + const util = require$$6__default; /** * This is the Node.js implementation of `debug()`. @@ -54368,7 +78040,7 @@ function requireHelpers () { }; Object.defineProperty(helpers, "__esModule", { value: true }); helpers.req = helpers.json = helpers.toBuffer = void 0; - const http = __importStar(require$$0$7); + const http = __importStar(require$$0$4); const https = __importStar(require$$1$2); async function toBuffer(stream) { let length = 0; @@ -54445,8 +78117,8 @@ function requireDist$2 () { }; Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.Agent = void 0; - const net = __importStar(require$$0$9); - const http = __importStar(require$$0$7); + const net = __importStar(require$$0$c); + const http = __importStar(require$$0$4); const https_1 = require$$1$2; __exportStar(requireHelpers(), exports$1); const INTERNAL = Symbol('AgentBaseInternalState'); @@ -54741,12 +78413,12 @@ function requireDist$1 () { }; Object.defineProperty(dist$2, "__esModule", { value: true }); dist$2.HttpsProxyAgent = void 0; - const net = __importStar(require$$0$9); - const tls = __importStar(require$$1$4); - const assert_1 = __importDefault(require$$0$8); + const net = __importStar(require$$0$c); + const tls = __importStar(require$$1$3); + const assert_1 = __importDefault(require$$2$1); const debug_1 = __importDefault(requireSrc$1()); const agent_base_1 = requireDist$2(); - const url_1 = require$$5$1; + const url_1 = require$$5$4; const parse_proxy_response_1 = requireParseProxyResponse(); const debug = (0, debug_1.default)('https-proxy-agent'); const setServernameFromNonIpHost = (options) => { @@ -54930,12 +78602,12 @@ function requireDist () { }; Object.defineProperty(dist, "__esModule", { value: true }); dist.HttpProxyAgent = void 0; - const net = __importStar(require$$0$9); - const tls = __importStar(require$$1$4); + const net = __importStar(require$$0$c); + const tls = __importStar(require$$1$3); const debug_1 = __importDefault(requireSrc$1()); - const events_1 = require$$1$3; + const events_1 = require$$0$5; const agent_base_1 = requireDist$2(); - const url_1 = require$$5$1; + const url_1 = require$$5$4; const debug = (0, debug_1.default)('http-proxy-agent'); /** * The `HttpProxyAgent` implements an HTTP Agent subclass that connects @@ -55384,7 +79056,7 @@ function requireConcat () { // Licensed under the MIT License. Object.defineProperty(concat, "__esModule", { value: true }); concat.concat = concat$1; - const stream_1 = require$$0__default$1; + const stream_1 = require$$9__default; const typeGuards_js_1 = requireTypeGuards$1(); async function* streamAsyncIterator() { const reader = this.getReader(); @@ -57085,7 +80757,7 @@ function requireUserAgentPlatform () { userAgentPlatform.getHeaderName = getHeaderName; userAgentPlatform.setPlatformSpecificData = setPlatformSpecificData; const tslib_1 = require$$0$2; - const node_os_1 = tslib_1.__importDefault(require$$1$7); + const node_os_1 = tslib_1.__importDefault(require$$1$8); const node_process_1 = tslib_1.__importDefault(require$$2$3); /** * @internal @@ -57232,7 +80904,7 @@ function requireSha256 () { Object.defineProperty(sha256, "__esModule", { value: true }); sha256.computeSha256Hmac = computeSha256Hmac; sha256.computeSha256Hash = computeSha256Hash; - const node_crypto_1 = require$$0$f; + const node_crypto_1 = require$$0$d; /** * Generates a SHA-256 HMAC signature. * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash. @@ -64939,7 +88611,7 @@ function requireStorageSharedKeyCredential$1 () { // Licensed under the MIT License. Object.defineProperty(StorageSharedKeyCredential$1, "__esModule", { value: true }); StorageSharedKeyCredential$1.StorageSharedKeyCredential = void 0; - const node_crypto_1 = require$$0$f; + const node_crypto_1 = require$$0$d; const StorageSharedKeyCredentialPolicy_js_1 = requireStorageSharedKeyCredentialPolicy$1(); const Credential_js_1 = requireCredential$1(); /** @@ -65074,7 +88746,7 @@ function requireBuffersStream () { // Licensed under the MIT License. Object.defineProperty(BuffersStream, "__esModule", { value: true }); BuffersStream.BuffersStream = void 0; - const node_stream_1 = require$$0$b; + const node_stream_1 = require$$0$8; /** * This class generates a readable stream from the data in an array of buffers. */ @@ -65184,7 +88856,7 @@ function requirePooledBuffer () { PooledBuffer.PooledBuffer = void 0; const tslib_1 = require$$0$2; const BuffersStream_js_1 = requireBuffersStream(); - const node_buffer_1 = tslib_1.__importDefault(require$$2$5); + const node_buffer_1 = tslib_1.__importDefault(require$$0$6); /** * maxBufferLength is max size of each buffer in the pooled buffers. */ @@ -65289,7 +88961,7 @@ function requireBufferScheduler () { // Licensed under the MIT License. Object.defineProperty(BufferScheduler, "__esModule", { value: true }); BufferScheduler.BufferScheduler = void 0; - const events_1 = require$$1$3; + const events_1 = require$$0$5; const PooledBuffer_js_1 = requirePooledBuffer(); /** * This class accepts a Node.js Readable stream as input, and keeps reading data @@ -66794,7 +90466,7 @@ function requireStorageSharedKeyCredential () { // Licensed under the MIT License. Object.defineProperty(StorageSharedKeyCredential, "__esModule", { value: true }); StorageSharedKeyCredential.StorageSharedKeyCredential = void 0; - const node_crypto_1 = require$$0$f; + const node_crypto_1 = require$$0$d; const StorageSharedKeyCredentialPolicy_js_1 = requireStorageSharedKeyCredentialPolicy(); const Credential_js_1 = requireCredential(); /** @@ -67509,7 +91181,7 @@ function requireStorageSharedKeyCredentialPolicyV2$1 () { Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.storageSharedKeyCredentialPolicyName = void 0; exports$1.storageSharedKeyCredentialPolicy = storageSharedKeyCredentialPolicy; - const node_crypto_1 = require$$0$f; + const node_crypto_1 = require$$0$d; const constants_js_1 = requireConstants$1(); const utils_common_js_1 = requireUtils_common$1(); const SharedKeyComparator_js_1 = requireSharedKeyComparator(); @@ -67968,7 +91640,7 @@ function requireStorageSharedKeyCredentialPolicyV2 () { Object.defineProperty(exports$1, "__esModule", { value: true }); exports$1.storageSharedKeyCredentialPolicyName = void 0; exports$1.storageSharedKeyCredentialPolicy = storageSharedKeyCredentialPolicy; - const node_crypto_1 = require$$0$f; + const node_crypto_1 = require$$0$d; const constants_js_1 = requireConstants$2(); const utils_common_js_1 = requireUtils_common$2(); const SharedKeyComparator_js_1 = requireSharedKeyComparator$1(); @@ -82826,7 +106498,7 @@ function requireUserDelegationKeyCredential () { // Licensed under the MIT License. Object.defineProperty(UserDelegationKeyCredential, "__esModule", { value: true }); UserDelegationKeyCredential.UserDelegationKeyCredential = void 0; - const node_crypto_1 = require$$0$f; + const node_crypto_1 = require$$0$d; /** * ONLY AVAILABLE IN NODE.JS RUNTIME. * @@ -84167,7 +107839,7 @@ function requireRetriableReadableStream () { Object.defineProperty(RetriableReadableStream, "__esModule", { value: true }); RetriableReadableStream.RetriableReadableStream = void 0; const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4(); - const node_stream_1 = require$$0$b; + const node_stream_1 = require$$0$8; /** * ONLY AVAILABLE IN NODE.JS RUNTIME. * @@ -85321,7 +108993,7 @@ function requireAvroReadableFromStream () { AvroReadableFromStream.AvroReadableFromStream = void 0; const AvroReadable_js_1 = requireAvroReadable(); const abort_controller_1 = /*@__PURE__*/ requireCommonjs$4(); - const buffer_1 = require$$7; + const buffer_1 = require$$2$5; const ABORT_ERROR = new abort_controller_1.AbortError("Reading from the avro stream was aborted."); let AvroReadableFromStream$1 = class AvroReadableFromStream extends AvroReadable_js_1.AvroReadable { _position; @@ -85437,7 +109109,7 @@ function requireBlobQuickQueryStream () { // Licensed under the MIT License. Object.defineProperty(BlobQuickQueryStream, "__esModule", { value: true }); BlobQuickQueryStream.BlobQuickQueryStream = void 0; - const node_stream_1 = require$$0$b; + const node_stream_1 = require$$0$8; const index_js_1 = requireInternalAvro(); /** * ONLY AVAILABLE IN NODE.JS RUNTIME. @@ -87689,7 +111361,7 @@ function requireBatch () { Batch.Batch = void 0; // In browser, during webpack or browserify bundling, this module will be replaced by 'events' // https://github.com/Gozala/events - const events_1 = require$$1$3; + const events_1 = require$$0$5; /** * States for Batch. */ @@ -87836,7 +111508,7 @@ function requireUtils () { utils.readStreamToLocalFile = readStreamToLocalFile; const tslib_1 = require$$0$2; const node_fs_1 = tslib_1.__importDefault(require$$1$a); - const node_util_1 = tslib_1.__importDefault(require$$1$5); + const node_util_1 = tslib_1.__importDefault(require$$0$a); const constants_js_1 = requireConstants$2(); /** * Reads a readable stream into buffer. Fill the buffer from offset to end. @@ -94206,7 +117878,7 @@ function requireErrors () { if (hasRequiredErrors) return errors; hasRequiredErrors = 1; Object.defineProperty(errors, "__esModule", { value: true }); - errors.UsageError = errors.NetworkError = errors.GHESNotSupportedError = errors.CacheNotFoundError = errors.InvalidResponseError = errors.FilesNotFoundError = void 0; + errors.RateLimitError = errors.UsageError = errors.NetworkError = errors.GHESNotSupportedError = errors.CacheNotFoundError = errors.InvalidResponseError = errors.FilesNotFoundError = void 0; class FilesNotFoundError extends Error { constructor(files = []) { let message = 'No files were found to upload'; @@ -94273,6 +117945,13 @@ function requireErrors () { return false; return msg.includes('insufficient usage'); }; + class RateLimitError extends Error { + constructor(message) { + super(message); + this.name = 'RateLimitError'; + } + } + errors.RateLimitError = RateLimitError; return errors; } @@ -94327,7 +118006,7 @@ function requireUploadUtils () { Object.defineProperty(uploadUtils, "__esModule", { value: true }); uploadUtils.UploadProgress = void 0; uploadUtils.uploadCacheArchiveSDK = uploadCacheArchiveSDK; - const core = __importStar(requireCore$2()); + const core = __importStar(requireCore()); const storage_blob_1 = /*@__PURE__*/ requireCommonjs(); const errors_1 = requireErrors(); /** @@ -94519,8 +118198,8 @@ function requireRequestUtils () { requestUtils.retry = retry; requestUtils.retryTypedResponse = retryTypedResponse; requestUtils.retryHttpClientResponse = retryHttpClientResponse; - const core = __importStar(requireCore$2()); - const http_client_1 = requireLib$3(); + const core = __importStar(requireCore()); + const http_client_1 = requireLib(); const constants_1 = requireConstants$5(); function isSuccessStatusCode(statusCode) { if (!statusCode) { @@ -94921,13 +118600,13 @@ function requireDownloadUtils () { downloadUtils.downloadCacheHttpClient = downloadCacheHttpClient; downloadUtils.downloadCacheHttpClientConcurrent = downloadCacheHttpClientConcurrent; downloadUtils.downloadCacheStorageSDK = downloadCacheStorageSDK; - const core = __importStar(requireCore$2()); - const http_client_1 = requireLib$3(); + const core = __importStar(requireCore()); + const http_client_1 = requireLib(); const storage_blob_1 = /*@__PURE__*/ requireCommonjs(); - const buffer = __importStar(require$$7); + const buffer = __importStar(require$$2$5); const fs = __importStar(fs__default); - const stream = __importStar(require$$0__default$1); - const util = __importStar(require$$0__default); + const stream = __importStar(require$$9__default); + const util = __importStar(require$$6__default); const utils = __importStar(requireCacheUtils()); const constants_1 = requireConstants$5(); const requestUtils_1 = requireRequestUtils(); @@ -95307,7 +118986,7 @@ function requireOptions () { Object.defineProperty(options, "__esModule", { value: true }); options.getUploadOptions = getUploadOptions; options.getDownloadOptions = getDownloadOptions; - const core = __importStar(requireCore$2()); + const core = __importStar(requireCore()); /** * Returns a copy of the upload options with defaults filled in. * @@ -95446,7 +119125,7 @@ function requireConfig () { var userAgent = {}; -var version = "5.0.1"; +var version = "5.0.5"; var require$$0$1 = { version: version}; @@ -95521,11 +119200,11 @@ function requireCacheHttpClient () { cacheHttpClient.downloadCache = downloadCache; cacheHttpClient.reserveCache = reserveCache; cacheHttpClient.saveCache = saveCache; - const core = __importStar(requireCore$2()); - const http_client_1 = requireLib$3(); - const auth_1 = requireAuth$2(); + const core = __importStar(requireCore()); + const http_client_1 = requireLib(); + const auth_1 = requireAuth(); const fs = __importStar(fs__default); - const url_1 = require$$5$1; + const url_1 = require$$5$4; const utils = __importStar(requireCacheUtils()); const uploadUtils_1 = requireUploadUtils(); const downloadUtils_1 = requireDownloadUtils(); @@ -100720,7 +124399,7 @@ function requireUtil () { Object.defineProperty(util, "__esModule", { value: true }); util.maskSigUrl = maskSigUrl; util.maskSecretUrls = maskSecretUrls; - const core_1 = requireCore$2(); + const core_1 = requireCore(); /** * Masks the `sig` parameter in a URL and sets it as a secret. * @@ -100808,13 +124487,13 @@ function requireCacheTwirpClient () { }; Object.defineProperty(cacheTwirpClient, "__esModule", { value: true }); cacheTwirpClient.internalCacheTwirpClient = internalCacheTwirpClient; - const core_1 = requireCore$2(); + const core_1 = requireCore(); const user_agent_1 = requireUserAgent(); const errors_1 = requireErrors(); const config_1 = requireConfig(); const cacheUtils_1 = requireCacheUtils(); - const auth_1 = requireAuth$2(); - const http_client_1 = requireLib$3(); + const auth_1 = requireAuth(); + const http_client_1 = requireLib(); const cache_twirp_client_1 = requireCache_twirpClient(); const util_1 = requireUtil(); /** @@ -100889,6 +124568,18 @@ function requireCacheTwirpClient () { } errorMessage = `${errorMessage}: ${body.msg}`; } + // Handle rate limiting - don't retry, just warn and exit + // For more info, see https://docs.github.com/en/actions/reference/limits + if (statusCode === http_client_1.HttpCodes.TooManyRequests) { + const retryAfterHeader = response.message.headers['retry-after']; + if (retryAfterHeader) { + const parsedSeconds = parseInt(retryAfterHeader, 10); + if (!isNaN(parsedSeconds) && parsedSeconds > 0) { + (0, core_1.warning)(`You've hit a rate limit, your rate limit will reset in ${parsedSeconds} seconds`); + } + } + throw new errors_1.RateLimitError(`Rate limited: ${errorMessage}`); + } } catch (error) { if (error instanceof SyntaxError) { @@ -100897,6 +124588,9 @@ function requireCacheTwirpClient () { if (error instanceof errors_1.UsageError) { throw error; } + if (error instanceof errors_1.RateLimitError) { + throw error; + } if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) { throw new errors_1.NetworkError(error === null || error === void 0 ? void 0 : error.code); } @@ -100929,8 +124623,7 @@ function requireCacheTwirpClient () { http_client_1.HttpCodes.BadGateway, http_client_1.HttpCodes.GatewayTimeout, http_client_1.HttpCodes.InternalServerError, - http_client_1.HttpCodes.ServiceUnavailable, - http_client_1.HttpCodes.TooManyRequests + http_client_1.HttpCodes.ServiceUnavailable ]; return retryableStatusCodes.includes(statusCode); } @@ -101013,8 +124706,8 @@ function requireTar () { tar.listTar = listTar; tar.extractTar = extractTar; tar.createTar = createTar; - const exec_1 = requireExec$2(); - const io = __importStar(requireIo$2()); + const exec_1 = requireExec(); + const io = __importStar(requireIo()); const fs_1 = fs__default; const path = __importStar(require$$1__default); const utils = __importStar(requireCacheUtils()); @@ -101300,14 +124993,14 @@ function requireCache () { cache$2.isFeatureAvailable = isFeatureAvailable; cache$2.restoreCache = restoreCache; cache$2.saveCache = saveCache; - const core = __importStar(requireCore$2()); + const core = __importStar(requireCore()); const path = __importStar(require$$1__default); const utils = __importStar(requireCacheUtils()); const cacheHttpClient = __importStar(requireCacheHttpClient()); const cacheTwirpClient = __importStar(requireCacheTwirpClient()); const config_1 = requireConfig(); const tar_1 = requireTar(); - const http_client_1 = requireLib$3(); + const http_client_1 = requireLib(); class ValidationError extends Error { constructor(message) { super(message); @@ -101821,36 +125514,36 @@ const CACHE_KEY_PREFIX = 'setup-graalvm'; const supportedPackageManager = [ { id: 'maven', - path: [join(require$$0$5.homedir(), '.m2', 'repository')], + path: [join(os.homedir(), '.m2', 'repository')], // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven pattern: ['**/pom.xml'] }, { id: 'gradle', - path: [join(require$$0$5.homedir(), '.gradle', 'caches'), join(require$$0$5.homedir(), '.gradle', 'wrapper')], + path: [join(os.homedir(), '.gradle', 'caches'), join(os.homedir(), '.gradle', 'wrapper')], // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle pattern: ['**/*.gradle*', '**/gradle-wrapper.properties', 'buildSrc/**/Versions.kt', 'buildSrc/**/Dependencies.kt'] }, { id: 'sbt', path: [ - join(require$$0$5.homedir(), '.ivy2', 'cache'), - join(require$$0$5.homedir(), '.sbt'), + join(os.homedir(), '.ivy2', 'cache'), + join(os.homedir(), '.sbt'), getCoursierCachePath(), // Some files should not be cached to avoid resolution problems. // In particular the resolution of snapshots (ideological gap between maven/ivy). - `!${join(require$$0$5.homedir(), '.sbt', '*.lock')}`, - `!${join(require$$0$5.homedir(), '**', 'ivydata-*.properties')}` + `!${join(os.homedir(), '.sbt', '*.lock')}`, + `!${join(os.homedir(), '**', 'ivydata-*.properties')}` ], pattern: ['**/*.sbt', '**/project/build.properties', '**/project/**.{scala,sbt}'] } ]; function getCoursierCachePath() { - if (require$$0$5.type() === 'Linux') - return join(require$$0$5.homedir(), '.cache', 'coursier'); - if (require$$0$5.type() === 'Darwin') - return join(require$$0$5.homedir(), 'Library', 'Caches', 'Coursier'); - return join(require$$0$5.homedir(), 'AppData', 'Local', 'Coursier', 'Cache'); + if (os.type() === 'Linux') + return join(os.homedir(), '.cache', 'coursier'); + if (os.type() === 'Darwin') + return join(os.homedir(), 'Library', 'Caches', 'Coursier'); + return join(os.homedir(), 'AppData', 'Local', 'Coursier', 'Cache'); } function findPackageManager(id) { const packageManager = supportedPackageManager.find((pm) => pm.id === id); @@ -101913,7 +125606,7 @@ async function setUpDependencies(components) { const depCommand = platformDeps.get(component); if (depCommand) { coreExports.startGroup(`Installing dependencies for ${component}...`); - await exec$1(depCommand); + await exec(depCommand); coreExports.endGroup(); } } @@ -101961,7 +125654,7 @@ async function setUpGUComponents(javaVersion, graalVMVersion, graalVMHome, compo } } async function installGUComponents(gdsToken, graalVMHome, components) { - await exec$1('gu', BASE_FLAGS.concat(components), { + await exec('gu', BASE_FLAGS.concat(components), { env: { ...process.env, GRAAL_EE_DOWNLOAD_TOKEN: gdsToken @@ -101972,7 +125665,7 @@ async function installGUComponents(gdsToken, graalVMHome, components) { for (const component of components) { const postInstallHook = platformHooks.get(component); if (postInstallHook) { - await exec$1(`"${join(graalVMHome, postInstallHook)}"`); + await exec(`"${join(graalVMHome, postInstallHook)}"`); } } } @@ -102057,9 +125750,9 @@ async function downloadMandrelJDK(version, javaVersion) { catch (error) { if (error instanceof Error && error.message.includes('404')) { // Not Found - throw new Error(`Failed to download ${basename$1(downloadUrl)}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?`); + throw new Error(`Failed to download ${basename(downloadUrl)}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?`); } - throw new Error(`Failed to download ${basename$1(downloadUrl)} (error: ${error}).`); + throw new Error(`Failed to download ${basename(downloadUrl)} (error: ${error}).`); } } function determineMandrelIdentifier(version, javaVersion) { @@ -102418,7 +126111,7 @@ async function run() { } setUpNativeImageBuildReports(isGraalVMforJDK17OrLater, javaVersion, graalVMVersion); setUpSBOMSupport(javaVersion, distribution); - coreExports.startGroup(`Successfully set up '${basename$1(graalVMHome)}'`); + coreExports.startGroup(`Successfully set up '${basename(graalVMHome)}'`); await execExports.exec(join(graalVMHome, 'bin', `java${EXECUTABLE_SUFFIX}`), [ javaVersion.startsWith('8') ? '-version' : '--version' ]);